Các thanh ghi giới thiệu trong phần này là các thanh ghi cần thiết để sử dụng trong chếđộ interval timer.
4.3.1. Timer start register (TSTR)
Đây là thanh ghi 8 bit, dùng để tắt/mở bộ đếm của timer cho mỗi kênh. Nếu giá trị của bit tương ứng là 1 thì bộđếm của kênh tương ứng sẽ bắt đầu đếm từ giá trị hiện hành chứa trong TCNT. Nếu giá trị bit tương ứng là 0 thì bộđếm sẽ dừng lại.
Hình 4.1: Thanh ghi TSTR
4.3.2. Timer counter (TCNT)
Đây là thanh ghi 16 bit, được đếm lên tùy theo các thiết lập trong thanh ghi timer control (TCR)
4.3.3. Timer general register (TGR)
TGR là thanh ghi 16 bit được sử dụng bởi TCNT và đối tượng so trùng (compare match) của nó. Kênh 0 và kênh 3 mỗi kênh có 4 thanh ghi TGRA, TGRB, TGRC, TGRD. Các kênh 1, 2, 4, 5, mỗi kênh có 2 thanh ghi TGRA, TGRB.
Hình 4.3 Thanh ghi TGR
4.3.4. Timer control register (TCR)
Đây là thanh ghi 8 bit dùng để chọn xung clock cho TCNT, chọn cạnh khi sử dụng clock ngoài, chọn nguồn xóa bộđếm.
Hình 4.4: Thanh ghi TCR
4.3.5. Timer status register
Đây là thanh ghi 8 bit cho biết trạng thái của mỗi kênh
Hình 4.5: TSR cho kênh 0, 3
4.3.6. Timer interrupt enable register (TIER)
Đây là thanh ghi 8 bit đùng để cho phép hoặc cấm interrupt gây ra bởi TGF trong thanh ghi TSR.
Hình 4.7: TIER cho kênh 0, 3
Hình 4.8: TIER cho kênh 1, 2, 4, 5
Yêu cầu ngắt quãng từ TPU được điều khiển bởi cờ TSR và bit cho phép ngắt quãng trong thanh ghi TIER. Để kết thúc ngắt quãng thì một trong 2 bit trên phải có giá trị 0. Thông thường khi xảy ra ngắt quãng thì cờ TSR sẽđược xóa để cho phép lần ngắt quãng kế tiếp xảy ra.
4.3.7. Timer I/O control register (TIOR)
Thanh ghi này dùng để lựa chọn chức năng của TGR.
Có 4 thanh ghi TGR cho kênh 0 và kênh 3, do đó có 2 thanh ghi TIOR (H và L), tổng cộng 16 bit cho mỗi kênh 0 hoặc 3.
Hình 4.9: Thanh ghi TIOR 4.4. Cách sử dụng interval timer
Chương trình ví dụ sau đây sử dụng kênh 0 của TPU0 làm bộ định thời với yêu cầu như sau:
• Chu kỳ của bộđịnh thời là 10ms • Chếđộđiều khiển ngắt quãng 0 • CPU clock là 24MHz
Với yêu cầu trên, ta dễ dàng hiện thực bằng bộđịnh thời TPU bằng cách sử dụng một giá trị so trùng để xóa bộđếm. Các thiết lập cho TPU như sau:
• Sử dụng TGRA làm chu kỳđếm (10ms) • Xóa TCNT bằng cách so trùng với TGRA • Tạo ra ngắt quãng khi sốđếm trùng với TGRA
4.5. Cách sử dụng TPU làm bộ phát xung clock
Chương trình ví dụ sau đây sử dụng kênh 1 của TPU để làm bộ phát xung, duty cyle 50%, với các yêu cầu sau:
• Tần số xung 100kHz • Không tạo ra ngắt quãng • CPU clock là 24 MHz
Để có thể tạo ra xung như yêu cầu, ta cần phải chọn một giá trị so trùng để xóa bộ đếm, đồng thời thiết lập ngõ xuất phát tín hiệu thay đổi liên tục (toggle output). Các thiết lập TPU như sau đây:
• Thiết lập TGRB với chu kỳ 5 µs • Xóa TCNT sau khi so sánh với TGRB
• Thiết lập ngõ xuất phát tín hiệu thay đổi (toggle) khi có so trùng xảy ra Trạng thái hoạt động của TPU được biểu diễn bởi hình vẽ sau đây
4.6. Bài tập
4.6.1. Bài 1
Thiết lập cho kênh 0 của TPU0 trở thành một bộđịnh thời với chu kỳ 100ms, sử dụng yêu cầu ngắt quãng để tăng một biến đếm và hiển thị 4 bit thấp của biến đếm này bằng các LED0-3 trên board mạch chính.
4.6.2. Bài 2
Thiết lập cho kênh 0 của TPU0 trở thành bộđịnh thời với chu kỳ 0.5ms, sử dụng yêu cầu ngắt quãng để thay đổi mức tín hiệu trên chân P3.0 liên tục. Chân P3.0 được kết nối với một buzzer.
Bài 5: Khảo sát kỹ thuật quét LED
5.1 Nội dung
- Khảo sát kỹ thuật quét LED, hiển thị nội dung trên ma trận LED. - Hiển thịảnh trên ma trận LED
5.2 Khảo sát kỹ thuật quét LED
5.2.1 Giới thiệu
Hiển thị hình ảnh ra một ma trận LED một lúc là rất khó. Thứ nhất, nó đòi hỏi có một dòng điện đủ mạnh. Thứ hai, nó cần số chân điều khiển quá lớn. Để giải quyết vấn đề này, người ta sử dụng kỹ thuật quét LED, tức chỉ hiển thị một dòng (hoặc một cột) của ma trận LED trong cùng một thời điểm. Lợi dụng sự lưu ảnh của mắt thường, khi hiển thị nhanh lần lượt các dòng (hay cột) của ma trận, ta sẽ tạo được hình ảnh một ma trận LED hoàn chỉnh. Tốc độ đủ nhanh để mắt người có thể thấy bình thường là 50Hz, tức quét hết tất cả các dòng của ma trận LED trong 20ms.
5.2.2 Cách thức quét LED
Trong phần này, chúng ta sử dụng một ma trận LED 8x8 làm ví dụ, và sẽ quét LED theo dòng.
Dữ liệu trong bộ nhớ về hình ảnh 8x8 của ma trận LED được lưu trữ trong 8 byte, mỗi byte tương ứng với một dòng. Ta lần lượt xuất 8 byte đó ra 8 dòng với thời gian hiển thị mỗi dòng là 20ms/8 = 2.5ms. PI 0 1 2 3 4 5 6 7 PH PD 0 1 2 3 4 5 6 7
PI PH PD LED DO LED XANH Tại mỗi điểm là: Ở đây tại một điểm có 2 đèn (xanh, đỏ). Như vậy tổng cộng ta có 64 đèn mỗi màu. Để điều khiển 128 đèn (cả xanh và đỏ) trong khi chúng ta chỉ có 24 đường dữ liệu (3 cổng). Vì vậy mà cần thiết phải sử dụng kỹ thuật quét LED.
Ta dùng port I để chọn hàng cần hiển thị, Port D đểđiều khiển LED xanh, và Port H đểđiều khiển LED đỏ. Quá trình quét LED sẽđược hiện thực như sau:
1. Xuất 0000 0001 ra port PI. Đưa dữ liệu của cột 0 ra port PD và PH, để điều khiển các LED trên cột 0
2. Xuất 0000 0010 ra port PI. Tiếp tục đưa dữ liệu của cột 1 ra Port PD và PH, để điều khiển LED trên cột 1.
3. Tương tự như thế cho các cột 2, 3, 4, 5, 6, 7 4. Quay lại bước 1, và quá trình lặp vô tận
Ởđây nên sử dụng một buffer cho quá trình quét ma trận LED này. Việc thay đổi nội dung hiển thị chỉ cần thay đổi trên buffer. Còn hoạt động quét LED chỉ việc lấy dữ liệu từ buffer và quét lên ma trận LED.
5.3 Hiển thị ảnh trên ma trận LED
Chương trình ví dụ sẽ xuất ra ma trận LED số 0. PI: là cổng chọn hàng cho ma trận LED
PD: điều khiển LED đỏ PH: điều khiển LED xanh
5.4 Bài tập
5.4.1 Bài tập 1
Dùng ma trận LED trên để hiển thị các số từ 0 đến 3, cứ 1 giây số hiển thị sẽ tăng 1 đơn vị (3 quay về 0). Cho biết
Port I: Chọn hàng cho ma trận LED.
Port D: Chọn LED đỏ cho cột của ma trận LED. Port H: Chọn LED xanh cho cột của ma trận LED.
5.4.2 Bài tập 2
Hiển thị các chữ A, B, C, D, E, F lên Ma trận LED theo 2 màu khác nhau
5.4.3 Bài tập 3
Sử dụng ý tưởng trên để quét LED 7 đoạn: xuất ra các giá trị từ 0 đến 7 trên 8 LED 7. Cho biết:
Port3: là port chọn LED PortK: là port dữ liệu
5.4.4 Bài tập 4
Sử dụng 3 LED 7 đầu tiên thực hiện đếm BCD (mô phỏng hoạt động đếm vòng từ 0 đến 999)
Bài 6: Khảo sát kỹ thuật quét phím, chống rung phím nhấn
6.1. Nội dung
Phần hướng dẫn này sẽ giải thích các vấn đề sau đây: • Vì sao phải quét phím
• Kỹ thuật quét phím
• Kỹ thuật chống rung phím nhấn
6.2. Khảo sát kỹ thuật quét phím
6.2.1. Giới thiệu
Sử dụng một cổng (8 bit) để tiến hành kiểm tra ma trận phím (4x4 phím) có được nhận hay không.
Do số cổng của vi điều khiển thường không nhiều, trong khi vi điều khiển lại thực hiện nhiều nhiệm vụ khác nhau. Chính vì lẽ đó mà các cổng của vi điều khiển phải thật sự tối ưu. Sử dụng kỹ thuật quét phím để kiểm tra trạng thái của ma trận phím là một trong những kỹ thuật sử dụng cổng hiệu quả nhất.
6.2.2. Cách thức quét phím
Ý tưởng chính ở đây là: kiểm tra lần lượt từng hàng thử xem có phím nào trên hàng đó được nhấn hay không, và công việc này được xoay vòng và lặp lại vô tận.
P0 P1 P2 P3 P4
P5
P6
P7
Đầu tiên xuất giá trị 1 ra 7 chân của cổng P được giữở mức điện thế cao nhờ các điện trở kéo lên. Một mức 0 ra chân còn lại thì khi nhấn một phím, phím đó sẽ nối hàng với cột và nếu hàng hoặc cột nối phím nhấn đó có mức là 0 thì nó sẽ làm cho chân còn lại cũng có điện áp mức 0. Và nếu ta biết được hàng và cột của phím thì ta có thể biết được chính xác vị trí phím được nhấn.
Đểđọc cả ma trận phím ta thực hiện lần lượt các thao tác sau: 1. Xóa cổng bằng cách nạp giá trị 1111 1111 vào cổng P
2. Đưa dữ liệu 0111 vào các bit P0 đến P3 của cổng P. Để kiểm tra các phím trên cột đầu tiên (P0).
3. Đọc các chân từ P4 đến P7 vào. Nếu không có phím nào được nhấn trên cột đó thì giá trị đọc vào sẽ là 1111. Ngược lại nếu có bất kỳ phím nào được nhấn trên cột đó thì giá trị tương ứng sẽđọc vào sẽ có giá trị là 0. 4. Tiếp tục đưa giá trị 1011 vào các chân P0 đến P3 của P. Để kiểm tra các
phím trên cột thứ hai (P1). Sau đó sẽ đọc vào bốn bit P4 đến P7. Và tương tự như trên ta xác định được vị trí của phím được nhấn trên cột này (nếu có).
5. Tương tự ta lần lượt đưa các giá trị 1101 và 1110 ra các chân P0 đến P3 và đọc vào các giá trị của P4 đến P7 để xác định vị trí của các phím được nhấn nếu có.
6. Chu trình này được lặp đi lặp lại vô hạn bằng cách quay về lại bước đầu tiên
6.3. Khảo sát kỹ thuật chống rung phím
6.3.1. Hiện tượng rung phím
Với kỹ thuật quét phím ta có thể xác định được các phím được nhấn. Tuy nhiên nếu chỉ sử dụng kỹ thuật quét phím thôi thì khi nhấn một phím nào đó ta có thể nhận được nhiều hơn một tín hiệu báo phím được nhấn. Các tín hiệu đó có thể là của cùng một phím nhưng được báo nhiều lần hoặc là của các phím lân cận phím đó. Hiện tượng này gọi là rung phím và nhiễu. Làm thế nào để khắc phục vấn đề này? Một vấn đề khác là điều gì sẽ xảy ra khi ta giữ một phím trong trường hợp này ta nên hiểu là chỉ có một tín hiệu phím nhấn hay vô số tín hiệu phím nhấn? hay thời gian nhấn phím là bao lâu?.Để giải quyết vấn đề này ta sử dụng kỹ thuật chống rung phím.:
6.3.2. Kỹ thuật chống rung phím
Có 2 kỹ thuật chống rung phím là kỹ thuật chống rung bằng phần mềm và kỹ thuật chống rung bằng phần cứng. Trong bài thí nghiệm này ta chỉ khảo sát kỹ thuật chống rung bằng phần mềm. Ý tưởng chính ở đây là sau một khoảng thời gian đủ nhỏ ta đọc dữ liệu vào nhiều ô nhớ. Bằng cách so sánh đối chiếu các thanh ghi này để biết dữ liệu đọc vào đúng hay sai.
Cụ thể là ởđây ta sử dụng các ô nhớ:
- Để chống rung phím ta sử dụng các thanh ghi: Pre2, Pre1, Current.
- Ta sử dụng thanh ghi KeyEffective để lưu các phím hiệu dụng (nhận đúng)
- Old_KeyEffective và HoldKey để kiểm tra các phím được nhấn lần đầu tiên và các phím được giữ.
Giải thuật thực hiện là: đưa giá trị đọc được vào thanh ghi current, hai thanh ghi Pre2 và Pre1 chứa giá trị được đọc vào ở hai lần trước đó. Sau đó đối chiếu giá trị của ba thanh ghi này, nếu có sự khác biệt thì vẫn đọc tiếp. Ngược lại nếu ba thanh ghi này có cùng giá trị (giống nhau), thì giá trị trên current sẽ được chuyển sang giá trị hiệu dụng (đưa vào thanh ghi KeyEffective) giá trị này được xem là giá trị đúng (đã qua xử lý chống rung). Thanh ghi Old_KeyEffective giữ giá trị hiệu dụng ở lần kế trước đó nhờ có thanh ghi này mà việc xác định phím nào được nhấn đầu tiên và phím nào được giữ khá dễ dàng. So sánh giá trị trong thanh ghi KeyEffective và Old_KeyEffective nếu có phím nào có sự chuyển dịch từ 1 xuống 0 nghĩa là lần đầu tiên được nhấn (tích cực mức 0), ngược lại nếu 0 và 0 nghĩa là phím được giữ các trường hợp còn lại (1 và 1, 0 và 1) nghĩa là phím không được nhấn.
Current Pre1 Pre2 PORT
Current = Pre1 = Pre2 KeyEffective
KeyEffective Old_KeyEffective
KeyEff Old Ghi chú 0 1 first time HoldKey 0 0 hold key 1 0 no button 1 1 no button
Hàm xử lý việc giữ phím:
Cài đặt timer cho việc quét phím:
Hàm đáp ứng ngắt quãng timer:
6.4. Bài tập
6.4.1. Bài tập 1
Thực hiện việc quét phím trên ma trận 4x4. Chương trình nhận 1 phím bất kỳ, thực hiện việc đếm vòng (tăng lên 1 khi có 1 phím được nhấn), hiển thị lên 4 LED trên board thí nghiệm. Cho biết:
- Port J được dùng để quét phím
- Các LED 1, 2, 3, 4 tương ứng với các bit PI.0, PI.1, PI.2, và PI.3
6.4.2. Bài tập 2
Tạo hiệu ứng lighriver trên 8 LED của board mở rộng. Chương trình nhận vào 4 phím: - Phím thứ nhất làm đổi chiều lighriver. - Phím thứ 2 làm dừng lighriver. - Phím thứ 3 làm tắt tất cả các đèn. - Phím thứ 4 làm reset lại hiệu ứng lighriver 6.4.3. Bài tập 3
Thực hiện việc quét ma trận phím (4x4). Xuất giá trị quét được và số lần nhấn phím ra LED 7 đoạn.
- Sử dụng port J của vi điều khiển H8SX/1582 để quét phím - Sử dụng kỹ thuật quét phím và chống rung phím nhấn trên. - Sử dụng timer 0, kênh 0 để lập trình quét phím
- Port P2 và P3 là các cổng xuất cho LED 7. P2 xuất dữ liệu, P3 chọn LED
6.4.4. Bài tập 4
Quét phím và xuất số thứ tự của phím ra ma trận LED (sinh viên tự quyết định số thứ tự của phím, cũng như từ mã của ma trận LED cần xuất ra ma trận LED). Cho biết:
- Port I: chọn cột cho ma trận LED - Port D: điều khiển LED đỏ
Bài 7: Khảo sát bộ truyền nhận nối tiếp SCI của H8SX/1582
7.1 Nội dung
Phần hướng dẫn này sẽ giải thích các vấn đề sau đây:
• Khảo sát bộ truyền nhận nối tiếp của vi điều khiển H8SX/1582 • Giới thiệu kỹ thuật giao tiếp nối tiếp giữa 2 thiết bị
• Sử dụng bộ SCI của H8SX/1582 viết và thực thi chương trình truyền nhận dữ liệu trên Starter Kit và máy tính.
7.2 Tổng quan về bộ truyền nhận dữ liệu nối tiếp SCI
Có 2 loại chức năng giao tiếp - Giao tiếp bất đồng bộ
- Giao tiếp đồng bộ xung clock
SCI của H8SX/1582 có 2 kênh giao tiếp đồng bộ nối tiếp hoạt động độc lập (kênh 3 và 4). Các kênh này có thể hoạt động được cả 2 chếđộ đồng bộ và bất đồng bộ. Tuy nhiên trong bài thực hành này chỉ hiện thực giao tiếp bất đồng bộ.
7.3 Các thanh ghi của bộ truyền nhận dữ liệu nối tiếp SCI SCI
7.3.1 Thanh ghi chếđộ tuần tự (SMR)
Thanh ghi SMR được sử dụng để thiết lập định dạng truyền dữ liệu và lựa chọn nguồn clock sinh tốc độ baud, một vài bit còn lại của SMR được sử dụng cho các chức năng khác trong chếđộ bình thường và chếđộ giao diện smart card.
Khi bit SMIF trong thanh ghi SCMR bằng 0
Khi bit SMIF trong thanh ghi SCMR bằng 1
Chức năng bit trong chế độ giao diện smart card (khi bit SMIF trong SCMR = 0): Bit Tên