Giáo trình Vi điều khiển - Lâm Quang Chuyên

Thanh ghi ACSR - Bit 7 – ACD Analog Comparator Disable: khi bit này bằng 1 thì bộ so sánh không hoạt động, khi bit này bằng 0 thì được phép hoạt động. Bit này được bật lên 1 ở bất kỳ thời điểm nào điều này giúp cho vi điều khiển tiết kiệm được điện áp tiêu thụ trong hoạt động Idle. - Bit 6 – ACBG Analog Comparator Bandgap Select: Khi bit này bằng 1 điện áp tham chiếu (1.15v – 1.35v) sẽ được kết nối với chân dương của bộ so sánh, khi bằng 0 thì chân AIN0 được kết nối với bộ so sánh. - Bit 5 – ACO Analog Comparator Ouput: ngõ ra của bộ so sánh. - Bit 4 – ACI Analog Comparator Interrupt Flag: cờ ngắt của bộ so sánh phụ thuộc vào 2 bit ACIS1 và ACIS0. Cờ ngắt trong hoạt động so sánh được thực hiện khi bit ACIE và bit I trong thanh ghi SREG được cài đặc lên 1. Ở chế độ ngắt cờ này tự động xóa về 0, ngược lại cờ này được xóa khi viết mức logic 1 vào nó. - Bit 3 – ACIE Analog Comparator Interrupt Enable: Bit này cho phép ngắt khi = 1. - Bit 2 – ACIC Analog Comparator Input Capture Enable: khi bit này = 1 nó cho phép đọc giá trị trong counter của bộ timer/counter1. - Bit 1,0 – ACIS1, ACIS0: Analog Comparator Interrupt Mode Select

pdf70 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 21/02/2024 | Lượt xem: 35 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Vi điều khiển - Lâm Quang Chuyên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
raction Trừ a = b – c; 2.3 * Multiplication Nhân a = b*c; 2.4 / Division Chia lấy thương a = b/c; 2.5 % Modulus Chia lấy số dư a = b%c; 2.6 ++ Increment Tăng 1 đơn vị a++; 2.7 -- Decrement Giảm 1 đơn vị b--; 3.0 Hoạt động gán 3.1 = Assignment x = 5; Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 10/115 - Biên soạn: Lâm Quang Chuyên 3.2 += Assign and Sum x += 5; 3.3 -= Assign and Subtract x -= 5; 4.0 Hoạt động kiểm tra logic 4.1 && Logic AND if((x>5)&&(x<10)) 4.2 || Logic OR if((x==5)||(x==6)) 5.0 Hoạt động xử lý các bit 5.1 & AND AND a = b&0x0f 5.2 | OR OR a = b|0x80 5.3 ^ Exclusive OR EXOR a = b^167 5.4 << Shift left Dịch trái a = b<<4 5.5 >> Shift right Dịch phải a = b>>3 5.6 ~ Complement Đảo a = ~b Bảng 1.3 Các hàm logic 1.3.4. Cấu trúc của một chương trình trên Codevision Hình vẽ bên dưới trình bày cấu trúc hoàn chỉnh 1 chương trình được viết bằng ngôn ngữ Codevision, trong chương trình có thể có nhiều chèn file, định nghĩa biến, khai báo biến, chương trình con nhưng chỉ có duy nhất 1 chương trình chính, việc viết chương trình con phải theo nguyên tắc, chương trình nào gọi chương trình kia thì phải viết sau chương trình đó, tuy nhiên trật tự trên cũng có thể thay đổi, sinh viết có thể tham khảo một số chương trình viết mẫu trong phần thực hành để biết rõ thêm. Hình 1.11 Cấu trúc một chương trình trong Codevision Chèn file #included Định nghĩa biến #defined const 100 Khai báo biến unsigned char temp1, temp2; Chương trình con void submain() { } Chương trình chính void main (void) { } Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 11/115 - Biên soạn: Lâm Quang Chuyên 1.3.5. Các từ khóa trong chương trình Codevision Bảng bên dưới là liệt kê tất cả các từ khóa được sử dụng trong quá trình lập trình trên Codevision, tuy nhiên có một số từ khóa cũng rất ít sử dụng khi viết các chương trình đơn giản. asm Default For Short Union Auto Do Goto Signed Unsigned Break Double If Sizeof Void Case Else Int Static Volatite Char Enum Long Struct while Const Extern Register Switch continue float return Typedef Bảng 1.4 Các từ khóa trong codevision 1.3.6. Câu lệnh và lưu đồ giải thuật: Hình 1.12 Lưu đồ giải thuật lệnh while Hình 1.13 Lưu đồ giải thuật lệnh while not Hình 1.14 Lưu đồ giải thuật lệnh do while While(condition) { Thực hiện trong khi condition đúng }; While(!condition) { Thực hiện khi condition sai }; do { Thực hiện khi condition còn đúng }while(condition); While(condition); Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 12/115 - Biên soạn: Lâm Quang Chuyên Hình 1.15 Lưu đồ giải thuật lệnh if Hình 1.16 Lưu đồ giải thuật lệnh if else Hình 1.17 Lưu đồ giải thuật lệnh switch case 1.3.7. Cấu trúc lưu đồ giải thuật 1.3.7.1. Các kí hiệu Bên dưới là bảng kí hiệu dùng để viết lưu đồ giải thuật cho 1 chương trình, việc sử dụng lưu đồ giải thuật giúp việc viết chương trình ít bị lỗi khi viết các chương trình dài, lớn. Việc vẽ lưu đồ giải thuật trước khi viết chương trình đòi hỏi phải thực hiện nhiều để hình thành được kỹ năng này. Stt Kí hiệu Mô tả 1 Kí hiệu bắt đầu và kết thúc (begin, end) 2 Yêu cầu thực hiện Cộng, trừ, nhân, chia, gán, dịch trái, phải BEGIN if(condition) { Nếu condition đúng thì thực hiện }; if(condition) { Nếu condition đúng thì thực hiện }else { Nếu condition sai thì thực hiện }; switch(bien) { Case bien: thực hiện; break; Case bien: thực hiện; break; Case bien: thực hiện; break; Default: thực hiện; break; }; Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 13/115 - Biên soạn: Lâm Quang Chuyên 3 Gọi chương trình con 4 Lệnh gán Bằng (=) 5 Lệnh nhiều lựa chọn switch case 6 Lệnh kiểm tra đúng sai if then Bảng 1.5 Các kí hiệu dùng cho lưu đồ giải thuật 1.3.7.2. Bài tập ví dụ: Ví dụ 1: Viết chương trình đếm sản phẩm, khi mất điện thì số sản phẩm đã đếm được sẽ không bị mất. Hình 1.18 Lưu đồ giải thuật đếm sản phẩm BEGIN KT SP TĂNG LÊN 1 LƯU VÀO EEPROM =100 END SENSOR SẼ KIỂM TRA SẢN PHẨM ĐI QUA, NẾU KHÔNG CÓ SẼ KIỂM TRA TIẾP, NẾU CÓ VĐK SẼ THỰC HIỆN LỆNH KẾ TIẾP TĂNG BIẾN ĐẾM LÊN 1 ĐƠN VỊ LƯU GIÁ TRỊ CỦA BIẾN ĐẾM VÀO EEPROM KIỂM TRA ĐỦ 100 SẢN PHẨM CHƯA, NẾU CHƯA QUAY LẠI KIỂM TRA SẢN PHẨM TIẾP, NẾU ĐỦ KẾT THÚC CHƯƠNG TRÌNH Đúng Đúng Sai Sai ĐỌC EEPROM ĐỌC GIÁ TRỊ CỦA BIẾN ĐẾM TỪ EEPROM Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 14/115 - Biên soạn: Lâm Quang Chuyên Qua ví dụ trên, sau khi viết xong chương trình bằng ngôn ngữ C, toàn bộ chương trình trên sẽ được được biên dịch để kiểm tra lỗi, và sau đó chuyển thành file hex, một phần mềm nạp sẽ nạp file hex vào trong bộ nhớ chương trình Flash Memory của vi điều khiển cụ thể là atmega16, biến counter sẽ được lưu trong bộ nhớ RAM, khi mất điện nội dung trong biến counter = 0; nhưng giá trị của biến đếm counter đã được lưu trong EEPROM có địa chỉ là 0x00 không bị mất dữ liệu. Ví dụ 2: Viết chương trình cộng số nguyên dương từ 1 đến x Hình 1.19 Lưu đồ cộng từ 1 đến x 1.4. CÂU HỎI ÔN TẬP HẾT CHƯƠNG: 1. Hãy xác định ngõ ra cho các mạch logic sau đây: Hình 1 Hình 2 BEGIN t++ y = y + t END CHO CÁC BIẾN t, y BẰNG 0 KIỂM TRA BIẾN t = X HAY CHƯA Đúng Sai t = 0 y = 0 TĂNG GIÁ TRỊ t LÊN 1 ĐƠN VỊ BIẾN y = y + t t == Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 15/115 - Biên soạn: Lâm Quang Chuyên Hình 3 2. Hãy cho biết nếu x = 5 thì các mệnh đề sau là đúng hay sai: a. ((x19)) b. ((x2)) 3. Hãy xây dựng cổng logic theo công thức sau: 4. Khi biến x = 0xA5, và y = 70 sau khi thực hiện các lệnh sau thì x hoặc z có giá trị là bao nhiêu: 1. x |= 0x06; 2. x >> 3; 3. x &= 0x06; 4. x = y<<2; 5. x = y^0x5C; 6. z = x^0x5C; 7. x += 4; 8. z = ~x; 9. z = x % y; 10. z = x && y; 11. z = x^y; 12. z = x&y; 13. x |= y; 14. z = x%0b1100; 5. Chân 34 là chân nào của VĐK, PORTB.4 là chân số mấy? 6. Chân T0, T1 của VĐK là chân số mấy? 7. Chân ADC4 là chân số mấy? 8. Hãy cho biết ý nghĩa của các từ khóa static, goto, float, const. 9. Chân PD7 là chân số mấy, chân số 3 của VDK tên gì? 10. Hãy cho biết atmega16 khác atmeg16L như thế nào? 11. Hãy viết lưu đồ giải thuật tìm USCLL và BSCNN của 2 số nguyên dương Chương 1 Giới thiệu Bài giảng vi điều khiển Atmega16 - 16/115 - Biên soạn: Lâm Quang Chuyên 12. Hãy viết chương trình cộng từ 1 đến n (n là số nguyên dương) bằng lệnh for, while, if 13. Hãy cho biết chân Reset của Atmega16 là chân số mấy, tác động ở mức nào, giải thích và vẽ sơ đồ nguyên lý của chân Reset. 14. Hãy trình bày các phát biểu sau a. Nếu x > 9 thì y = 18 ngược lại y = 0; b. Hãy thực hiện lệnh x +=3 10 lần; c. Hãy thực hiện lệnh y = 2*t trong khi y nhỏ hơn 100 d. Trong trường hợp 1. X = 3 thì y = 2 2. X = 4 thì y = 8 3. X = 5 thì y = 6 4. X = 6 thì y = 12 5. X = 7 thì y = 1 6. Nếu không bằng với các giá trị trên thì y = 0 15. Giá trị nhỏ nhất và lớn nhất được chứa trong thanh ghi 8 và 16 bit là bao nhiêu? 16. Viết lưu đồ giải thuật sắp xếp chuỗi số theo thứ tự tăng dần. Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -17/115- Biên soạn: Lâm Quang Chuyên Chương 2 GIAO TIẾP VÀO RA (I/O INPUT/OUTPUT) Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -18/115- Biên soạn: Lâm Quang Chuyên 2.1. GIỚI THIỆU Trong chương này sẽ trình bày về khai báo hoạt động vào ra dùng để điều khiển hay kiểm tra trạng thái của thiết bị bên ngoài, điều khiển led đơn, led 7 đoạn kiểm tra nút nhấn đơn, nút nhấn ma trận. Vi điều khiển atmega16 có 32 chân vào ra bao gồm 4 port (PORTA, PORTB, PORTC, PORTD) cho phép vi điều khiển xuất hoặc nhận dữ liệu, xuất dữ liệu được gọi là điều khiển, nhận dữ liệu được gọi là kiểm tra, các chân này phải được xác định là vào hay ra trước trao đổi dữ liệu, việc xác định vào ra phụ thuộc vào 3 thanh ghi sau: DDRx.n, PORTx.n, PINx.n (x tên của port như A, B, C, D; n tên của chân như 0,1 7). 2.2. CÁC THANH GHI LIÊN QUAN 2.2.1. Thanh ghi DDRxn: Có chức năng chọn hướng vào ra của vi điều khiển, khi DDRxn = 1 chân này có chức năng là ngõ ra (xuất dữ liệu), khi DDRxn = 0 chân này có chức năng là ngõ vào (nhận dữ liệu). Hình 2.1 Khai báo vào ra của PORTB 2.2.2. Thanh ghi PORTxn:  Khi chân này đang là ngõ vào và PORTxn = 1 thì chân này có điện trở kéo lên, khi không sử dụng điện trở kéo lên thì PORTxn = 0.  Khi chân này đang là ngõ ra và PORTxn = 1 thì chân này xuất ra mức logic cao, khi PORTxn = 0 thì xuất ra mức logic thấp. 2.2.3. Thanh ghi PINxn: 7 6 5 4 3 2 1 0 in in out in in out out out 0 0 1 0 0 1 1 1DDRB PORTB KHAI BÁO HOẠT ĐỘNG VÀO RA TRÊN CỔNG B Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -19/115- Biên soạn: Lâm Quang Chuyên Có chức khi nó là ngõ vào (nhận dữ liệu), khi PINxn = 1 thì tín hiệu vào trên chân đó sẽ là mức cao, khi PINxn = 0 thì tín hiệu vào là mức thấp. 2.2.4 Bài tập ví dụ: Ví dụ 1: Hãy khai báo chân 2, 3, 5 là ngõ vào, các chân còn lại của PORT này là ngõ ra. Giải: Chân 2, 3, 5 là các chân PB1, PB2 và PB4 trên PORTB và có mức logic tương ứng trên thanh ghi DDRB sẽ là 0, chương trình được viết như sau: DDRB = 0b10010111; Ví dụ 2: Hãy khai báo PORTC là ngõ vào, các chân 22, 24, 25 có điện trở kéo lên, và hãy cho biết các chân này có điện áp là bao nhiêu volt. Giải: Khai báo PORTC là ngõ vào ta viết như sau: DDRC = 0b00000000; Các chân 22, 24, 25 là các chân PC0, PC2, PC3 có điện trở kéo lên nên thanh ghi PORTC trên các bit tương ứng sẽ có mức logic 1, chương trình được viết như sau: PORTC = 0b10110000; Ví dụ 3: Viết chương trình để bit 2 và bit 6 của PORTC bằng 1 các bit còn lại giữ nguyên trạng thái ban đầu. Hình 2.2 Chân 33 có điện trở kéo lên PORTA.0 Khi PORTA.0 = 1; điện áp tại chân này sẽ là 5 volt. PORTA.0 Khi PORTA.0 = 0; điện áp tại chân này sẽ nối mass. Hình 2.3 Chân 33 có được nối mass 33 33 Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -20/115- Biên soạn: Lâm Quang Chuyên Ví dụ 4: Viết chương trình để bit thứ 3 và thứ 6 của PORTD = 0, các bit còn lại giữ nguyên trạng thái ban đầu. Ví dụ 5: Viết chương trình để bit 1,4 của PORTC = 0, và bit thứ 3,5 của PORTC = 1; Ví dụ 6: PORTD |= 0xAD có nghĩa là gì? Ví dụ 7: VCT khai báo PORTA có các bit thứ 3,4,7 là ngõ vào các ngõ còn lại là ngõ ra. Trong đó bit thứ 4,7 có điện trở kéo lên Cách 1: PORTB.2 = 1; PORTB.6 = 1; Cách 2: PORTB |= 0b01000100; Cách 1: PORTD.4 = 0; PORTD.7 = 0; Cách 2: PORTD &= 0b10110111; Cách 1: PORTC.1 = 0; PORTC.4 = 0; PORTC.3 = 1; PORTC.5 = 1; Cách 2: PORTC &= 0b11101101; PORTC |= 0b00101000; PORTD |= 0b10101101; Bit thứ 1,4,6 của PORTD bằng 1, các bit khác giữ nguyên trạng thái ban đầu. DDRA = 0b01100111; ngõ vào 3,4,7; ngõ ra 0,1,2,5,6 PORTA.7 = 1; PORTA.4 = 1; Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -21/115- Biên soạn: Lâm Quang Chuyên 2.3. CÁC CHỨC NĂNG KHÁC CỦA CÁC PORT Ngoài chức năng I/O một số chân còn có các chức năng khác như: 2.3.1. Chức năng khác của PORTA PortA còn là ngõ vào của tín hiệu ADC (biến đổi tín hiệu tương tự sang số), 8 chân của PORTA tương đương với 8 kênh biến đổi ADC từ ADC0 đến ADC7, điện áp biến đổi từ 0 – 5v tùy thuộc vào điện áp tham chiếu (xem thêm phần biến đổi ADC). Lưu ý: Tại mỗi thời điểm VĐK chỉ biến đổi 1 tín hiệu ADC. Stt Tên chân Chức năng khác 1 ADC7 ADC7 (ngõ vào ADC kênh 7) 2 ADC6 ADC6 (ngõ vào ADC kênh 6) 3 ADC5 ADC5 (ngõ vào ADC kênh 5) 4 ADC4 ADC4 (ngõ vào ADC kênh 4) 5 ADC3 ADC3 (ngõ vào ADC kênh 3) 6 ADC2 ADC2 (ngõ vào ADC kênh 2) 7 ADC1 ADC1 (ngõ vào ADC kênh 1) 8 ADC0 ADC0 (ngõ vào ADC kênh 0) Bảng 2.1 Chức năng khác của PORTA 2.3.2 Chức năng khác trên PORTB Tên Chức năng Mô tả PB7 SCK Các chân này dùng trong giao tiếp SPI, ngoài ra còn dùng đề nạp chương trình cho VĐK PB6 MISO PB5 MOSI PB4 SS PB3 OC0/AIN1 OC0 chân điều xung trong hoạt động timer/counter AIN1 kết hợp với AIN0 dùng để kích hoạt hoạt động ADC, hoạt dùng so sánh điện áp trong hoạt động AC PB2 INT2/AIN0 INT2: Chân ngắt ngoài 2 AIN0 kết hợp với AIN1 dùng để kích hoạt hoạt động ADC, hoạt dùng so sánh điện áp trong hoạt động AC PB1 T1 Chân ngõ vào dùng đếm xung trong hoạt động timer/counter1 PB0 XCK/T0 Chân ngõ vào dùng đếm xung trong hoạt động timer/counter0 Bảng 2.2 Chức năng khác của PORTB Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -22/115- Biên soạn: Lâm Quang Chuyên 2.3.3 Chức năng khác trên PORTC: Tên Chức năng Mô tả PC7 TOSC2 Khi bit AS2 trong thanh ghi ASSR được bậc lên 1, bộ dao động sẽ được nối với chân này, lúc này chân PC7,6 không có chức năng như hoạt động IO PC6 TOSC1 PC5 TDI Khi giao tiếp theo mode JTAG chân này là ngõ vào nối tiếp được dịch chuyển vào thanh ghi lệnh hoặc thanh ghi điều khiển. lúc này chân PC5 không có chức năng như hoạt động IO PC4 TDO Khi giao tiếp theo mode JTAG chân này là ngõ ra nối tiếp được dịch chuyển ra từ thanh ghi lệnh hoặc thanh ghi điều khiển. lúc này chân PC4 không có chức năng như hoạt động IO PC3 TMS Hai chân này dùng trong hoạt động JTAG PC2 TCK PC1 SDA Dùng trong giao tiếp I2C, chân SDA dùng để trao đổi dữ liệu, chân SCL dùng làm xung clock để đồng bộ hóa tín hiệu. PC0 SCL Bảng 2.3 Chức năng khác của PORTC 2.3.4 Chức năng khác trên PORTD: Stt Tên Chức năng Chức năng khác 1 PD7 OC2 Dùng điều xung trong hoạt động PWM của timer 2 2 PD6 ICP1 Dùng để chụp hình dữ liệu timer/counter1 3 PD5 OC1A Dùng điều xung trong hoạt động timer/couter1 kênh A 4 PD4 OC1B Dùng điều xung trong hoạt động timer/couter1 kênh B 5 PD3 INT1 Ngắt ngoài 1 6 PD2 INT0 Ngắt ngoài 0 7 PD1 TxD Dùng truyền nhận dữ liệu nối tiếp đồng bộ và không đồng bộ 8 PD0 RxD Bảng 2.4 Chức năng khác của PORTD 2.3.5 Bài tập ví dụ Ví dụ 1: Hãy cho biết chân có chức năng giao tiếp nối tiếp đồng bộ và bất đồng bộ trên chân nào của Port nào? Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -23/115- Biên soạn: Lâm Quang Chuyên Giải: Chân RxD, TxD trên chân 14, 15 tương ứng thuộc PORTD của vi điều khiển. Ví dụ 2: Vi điều khiển atmega16 có mấy ngắt ngoài, kể tên các chân đó. Giải: Vi điều khiển atmega16 có 3 ngắt ngoài: INT0, INT1, INT2 tương ứng trên các chân 16, 17, 3. 2.4. XUẤT NHẬP DỮ LIỆU TRÊN CÁC PORT 2.4.1 Xuất dữ liệu trên các chân của PORT Để xuất mức điện áp ra các chân (điều khiển ngõ ra) ta thực hiện theo bảng sau: Stt Mô tả Cách 1 Cách 2 1 Xuất mức 1 ra PORTB.0 PORTB.0 = 1; PORTB |= 0x01; 2 Xuất mức 0 ra PORTC.3 PORTC.3 = 0; PORTC &= 0xfb; Bảng 2.5 Các phương pháp xuất dữ liệu (điều khiển) ra các chân 2.4.2 Xuất dữ liệu ra PORT Để xuất dữ liệu ra trên PORT (điều khiển PORT) ta thực hiện như sau: Stt Mô tả Cách 1 Cách 2 1 Xuất dữ liệu 197 ra PORTD PORTD = 197; PORTD = 0xC5; 2 Xuất dữ liệu 207 ra PORTA PORTA = 207; PORTA = 0b11001111; 3 Xuất dữ liệu trung gian ra PORTB PORTB = biendem; Bảng 2.6 Các phương pháp xuất dữ liệu (điều khiển) trên các PORT 2.4.3 Kiểm tra các chân trên PORT  Kiểm tra chân PINA.5 có bằng 1 hay không: Cách 1: if(PINA.5 == 1) Cách 2: if(PINA.5) Cách 3: if((PINA &= 0x20) == 0x20)  Kiểm tra chân PINC.2 có bằng 0 hay không: Cách 1: if(PINC.2 == 0) Cách 2: if(((PINC &= 0x04) ==0) Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -24/115- Biên soạn: Lâm Quang Chuyên  Hãy thực hiện công việc trong khi PINB.2 bằng 1 Cách 1: while(PINB.2 == 1) Cách 2: while(PINB.2)  Hãy thực hiện công việc trong khi PIND.3 bằng 0 Cách 1: while(PIND.3 == 0) Cách 2: while(!PIND.3) Lưu ý:  PIN dùng để nhận/ kiểm tra dữ liệu.  PORT dùng để xuất dữ liệu, điều khiển. 2.4.4 Đọc dữ liệu từ PORT Temp1 = PINA Temp2 = PINC 2.4.5 Kiểm tra toàn PORT 2.4.6 Bài tập ví dụ Ví dụ 1: Hãy viết thêm 2 cách khác nhau thể hiện câu lệnh sau: if((PINC &= 0x10) == 0x10) Giải: if(PINC.4 == 1) if(PINC.4) Ví dụ 2: Hãy giải thích lệnh DDRD = 214 có nghĩa là gì? Giải: 214 = 0b11010110; có nghĩa là khai báo các chân 22, 25, 27 là ngõ vào các chân còn lại của Port này là ngõ ra. Ví dụ 3: Viết chương trình khi chân 1 (PINB.0) = 1, thì PORTA = 0x00; khi PINB = 0 thì PORTA = 0xff; switch (PINB){ case 0b11001001: TH1; break; case 0b10101100: TH2; break; case 0b10110101: TH3; break; }; Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -25/115- Biên soạn: Lâm Quang Chuyên Ví dụ 4: Viết chương trình kiểm tra mức logic trên chân 1, 2 và 3 (PINB.0, PINB.1, PINB.2) của vi điều khiển và xuất ra trên PORTA và PORTC theo yêu cầu sau: NGÕ VÀO NGÕ RA Stt PINB.0 PINB.1 PINB.2 PORTA PORTC 1 0 0 0 0x00 0x00 2 0 0 1 0x00 0x03 3 0 1 0 0x00 0x06 4 0 1 1 0x00 0xc0 5 1 0 0 0x01 0x80 6 1 0 1 0x03 0xa4 7 1 1 0 0x06 0x7D 8 1 1 1 0xC0 0xb3 Giải: Dựa vào yêu cầu của đề bài, ta nhận thấy rằng các chân PINB.0.1.2 được cài đặc là ngõ vào, và các chân trên PORTA và PORTC sẽ là ngõ ra, chương trình được viết như sau: #include void main (void) { PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0xFF; PORTD = 0x00; DDRC = 0xFF; while (1) { If (PINB.0 == 0) {PORTA = 0x00;} else {PORTA = 0xff;} } } Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -26/115- Biên soạn: Lâm Quang Chuyên 2.5 LED ĐƠN VÀ LED 7 ĐOẠN 2.5.1 Led đơn Để điều khiển led đơn sáng ta chỉ cần xuất tín hiệu ra như hình vẽ sau: Hình 2.4 Điều khiển led đơn trực tiếp #include void main (void) { PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0xFF; PORTD = 0x00; DDRC = 0xFF; while (1) { // Place your code here switch (PINB & 0b00000111) { case 0x00: PORTA = 0x00; break; case 0x01: PORTA = 0x03; break; case 0x02: PORTA = 0x06; break; case 0x03: PORTA = 0x0C; break; case 0x04: PORTA = 0x18; break; case 0x05: PORTA = 0x30; break; case 0x06: PORTA = 0x60; break; case 0x07: PORTA = 0xC0; break; }; } } PORTA NGÕ RA PORTB NGÕ VÀO PORTC NGÕ RA PORTD NGÕ RA PA.2 PB.0 Led sáng: PORTA.2 = 1; Led tắt: PORTA.2 = 0; Led sáng: PORTB.0 = 0; Led tắt: PORTB.0 = 1; Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -27/115- Biên soạn: Lâm Quang Chuyên Hình 2.5 Điều khiển led đơn có nguồn cung cấp 2.5.2 Led 7 đoạn Có 2 loại led 7 đoạn: Anot chung và Katot chung, để điều khiển led 7 đoạn được dễ dàng ta cần phải tìm ra mã led 7 đoạn, có 4 loại bảng mã led 7 đoạn đó là: 1. Mã led 7 đoạn Anot chung với MSB nối chân a 2. Mã led 7 đoạn Anot chung với LSB nối chân a 3. Mã led 7 đoạn Katot chung với MSB nối chân a 4. Mã led 7 đoạn Katot chung với LSB nối chân a PA.2 PB.0 Led sáng: PORTA.2 = 1; Led tắt: PORTA.2 = 0; Led sáng: PORTB.0 = 0; Led tắt: PORTB.0 = 1; a b c d e f g dp Hình 2.6 Anot chung a b c d e f g dp Hình 2.7 Katot chung PA.0 PA.1 PA.2 PA.3 PA.4 PA.5 PA.6 PA.7 a b c d e f g dp PA.0 PA.1 PA.2 PA.3 PA.4 PA.5 PA.6 PA.7 dp g f e d c b a Hình 2.8 Kiểu mắc Anot chung với LSB nối chân a Hình 2.9 Kiểu mắc Anot chung với MSB nối chân a Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -28/115- Biên soạn: Lâm Quang Chuyên 2.5.3 Led ma trận Hiện nay trên thị trường có rất nhiều loại led ma trận:  Số điểm led trên ma trận : Ma trận 5x7 (5 hàng 7 cột), Ma trận 8x8.  Kích thước : Ma trận loại nhỏ, vừa, lớn  Màu: Ma trận 1, màu 2 màu. Trong phần trình bày này ta sẽ khảo sát ma trận 8x8x2 : 8 hàng, 8 cột và 2 màu Hình 2.12 Sơ đồ chân Led ma trận 8x8x2 (8 hàng, 8 cột, 2 màu) Để điều khiển Led ma trận ta sử dụng phương pháp quét như led 7 đoạn. 2.5.4 Bài tập ví dụ Ví dụ 1: Tìm mã led 7 đoạn Anot chung với MSB nối chân a Giải: Với kiểu mắc như hình 2.8 led sáng khi mức 0 và tắt khi mức 1 PA.0 PA.1 PA.2 PA.3 PA.4 PA.5 PA.6 PA.7 a b c d e f g dp PA.0 PA.1 PA.2 PA.3 PA.4 PA.5 PA.6 PA.7 dp g f e d c b a Hình 2.10 Kiểu mắc Katot chung với LSB nối chân a Hình 2.11 Kiểu mắc Katot chung với MSB nối chân a Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -29/115- Biên soạn: Lâm Quang Chuyên Stt Mã số a b c d e f g dp Dạng số Hex 1 Mã số 0 0 0 0 0 0 0 1 1 0x03 2 Mã số 1 1 0 0 1 1 1 1 1 0x9f 3 Mã số 2 0 0 1 0 0 1 0 1 0x25 4 Mã số 3 0 0 0 0 1 1 0 1 0x0d 5 Mã số 4 1 0 0 1 1 0 0 1 0x99 6 Mã số 5 0 1 0 0 1 0 0 1 0x49 7 Mã số 6 0 1 0 0 0 0 0 1 0x41 8 Mã số 7 0 0 0 1 1 1 1 1 0x1f 9 Mã số 8 0 0 0 0 0 0 0 1 0x01 10 Mã số 9 0 0 0 0 1 0 0 1 0x09 Ví dụ 2: Tìm mã led 7 đoạn Katot chung với LSB nối chân a Giải: Với kiểu mắc như hình 2.10 led sáng khi mức 1 và tắt khi mức 0 Stt Mã số a b c d e f g dp Dạng số Hex 1 Mã số 0 1 1 1 1 1 1 0 0 0xfc 2 Mã số 1 0 1 1 0 0 0 0 0 0x60 3 Mã số 2 1 1 0 1 1 0 1 0 0xda 4 Mã số 3 1 1 1 1 0 0 1 0 0xf2 5 Mã số 4 0 1 1 0 0 1 1 0 0x66 6 Mã số 5 1 0 1 1 0 1 1 0 0xb6 7 Mã số 6 1 0 1 1 1 1 1 0 0xbe 8 Mã số 7 1 1 1 0 0 0 0 0 0xe0 9 Mã số 8 1 1 1 1 1 1 1 0 0xfe 10 Mã số 9 1 1 1 1 0 1 1 0 0xf6 2.6 CÂU HỎI ÔN TẬP HẾT CHƯƠNG 2.1 Hãy viết chương trình tạo khóa số (8 bit) trên PORTD với mã số là 0xE7 và 1 nút xác nhận trên chân PORTA.3, khi nhấn đúng mã thì chân trên chân PORTA.2 = 1, ngược lại thì bằng 0, nếu quá 3 lần bấm sai thì chuông báo trên chân PORTA.6 (đổ chuông khi PORTA.6 = 1). 2.2: Ví dụ 2: VCT khi nhấn nút trên chân 3, thì PORTA = 0x00; nhấn tiếp thì PORTA = 0xff (nút nhấn trên chân 1 là thường mở). 2.3: VCT 1 led sáng xoay vòng trên PORT C. 2.4: Viết chương trình giải mã phím ma trận (4x4) 2.5: Viết chương trình led sáng dồn 8 led 2.6: Viết chương trình led 7 đoạn sáng bằng phương pháp thông thường Chương 2 Hoạt động vào ra Bài giảng vi điều khiển Atmega16 -30/115- Biên soạn: Lâm Quang Chuyên 2.7: Viết chương trình 3 led 7 đoạn sáng bằng phương pháp quét 2.8 Viết chương trình led sáng từ 0 đến 9 rồi lặp lại theo mã led 2.9 Viết chương trình led sáng từ 0 đến 9 rồi lặp lại theo biến mãn 2.10 Viết chương trình led sáng từ 0 đến 9 rồi lặp lại theo biến mãn và biến đếm 2.11 Viết chương trình led sáng từ 0 đến F theo theo mã led 2.12 Viết chương trình led sáng từ 0 đến F rồi lặp lại theo biến mãn 2.13 Viết chương trình led sáng từ 0 đến F rồi lặp lại theo biến mãn và biến đếm 2.14 Tìm mã led 7 đoạn anot chung theo MSB trước 2.15 Tìm mã led 7 đoạn anot chung theo LSB trước 2.16 Tìm mã led 7 đoạn Kanot chung theo MSB trước 2.17 Tìm mã led 7 đoạn Kanot chung theo LSB trước 2.18 Viết chương trình 2 led 7 đoạn sáng từ 00 đến 99 theo phương pháp quét led Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -31/115- Biên soạn: Lâm Quang Chuyên Chương 3 HOẠT ĐỘNG NGẮT Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -32/115- Biên soạn: Lâm Quang Chuyên 3.1. GIỚI THIỆU VỀ HOẠT ĐỘNG NGẮT Ngắt là hoạt động xảy ra ở bất kì thời điểm nào của chương trình khi chương trình chính đang hoạt động, hoạt động ngắt xảy ra khi bắt đầu 1 sự kiện hoặc kết thúc một sự kiện nào đó, ví dụ: ngắt ngoài, ngắt timer/counter, ADC hoạt động ngắt thường được sử dụng để thu thập dữ liệu, hoạt động ngắt xảy ra khi cờ ngắt được bật lên 1. Ví dụ về ứng dụng của ngắt: Khi viết chương trình đếm sản phẩm, phần cứng của chúng ta bao gồm 2 phần: Phần cảm biến phát hiện sản phẩm, phần xử lý hiển thị số lượng sản phẩm lên màn hình. Đối với 1 chương trình thông thường thì bộ xử lý luôn luôn thực hiện 2 chương trình: Kiểm tra có sản phẩm hay không và hiển thị kết quả. Nhưng nếu ta sử dụng chương trình ngắt thì bộ xử lý chỉ cần thực hiện chương trình hiển thị và không cần quan tâm đến chương trình kiểm tra sản phẩm, khi có 1 sản phẩm đi qua thì cảm biến sẽ nhận được và đưa tín hiệu về bộ xử lý, lúc này bộ xử lý mới nhảy tới chương trình kiểm tra xử lý dữ liệu và sau khi thực hiện xong thì bộ xử lý sẽ quay về chương trình chính của mình là hiển thị, và công việc sẽ lập lại như thế nếu có sản phẩm đi qua. Hình 3.1 Chương trình chính, chương trình con và chương trình ngắt 3.2. CÁC LOẠI NGẮT Atmega16 có tổng cộng 21 ngắt như bảng bên dưới Begin End Chương trình chính Chương trình chính sẽ nhảy tới chương trình ngắt tại bất kì thời điểm nào không biết trước khi có sự kiện ngắt xảy ra. Chương trình chính sẽ nhảy tới chương trình con tại thời điểm được lập trình trước bởi người lập trình. Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -33/115- Biên soạn: Lâm Quang Chuyên Stt Nguồn ngắt Sự kiện ngắt 1 Reset Reset khi khởi động 2 INT0 Ngắt ngoài 0 3 INT1 Ngắt ngoài 1 4 TIMER2 COMP Ngắt khi so sánh bằng Timer/Counter2 xảy ra 5 TIMER2 OVF Ngắt khi xuất hiện cờ tràn Timer/Counter2. 6 TIMER1 CAPT Ngắt khi đọc giá trị thanh ghi TCNT1 7 TIMER1 COMPA Ngắt khi so sánh bằng Timer1A 8 TIMER1 COMPB Ngắt khi so sánh bằng Timer1B 9 TIMER1 OVF Ngắt khi xuất hiệnS cờ tràn Timer/Counter1 10 TIMER0 OVF Ngắt khi xuất hiện cờ tràn Timer/Counter0 11 SPI, STC Ngắt khi hoạt động SPI hoàn tất 12 USART, RXC Ngắt khi nhận dữ liệu hoàn tất 13 USART, UDRE Ngắt khi thanh ghi dữ liệu UDRE được gởi đi 14 USART, TXC Ngắt khi truyền dữ liệu hoàn tất 15 ADC Ngắt khi biến đổi ADC hoàn thành 16 EE_RDY Ngắt khi bộ nhớ EEPROM sẵn sàng lưu dữ liệu 17 ANA_COMP Ngắt khi hoạt động so sánh hoàn tất 18 TWI Ngắt khi giao tiếp TWI (I2C) 19 INT2 Ngắt ngoài INT2 20 TIMER0 COMP Ngắt khi so sánh bằng của Timer/Couter0 21 SPM_RDY Ngắt khi bộ nhớ chương trình sẵn sàng Bảng 3.1 Các nguồn ngắt của atmega16 3.2.1 NGẮT NGOÀI Ngắt ngoài là ngắt do tác nhân từ bên ngoài tác động, các tác nhân ngắt ngoài bao gồm: ngắt cạnh lên, cạnh xuống, mức thấp, cạnh lên xuống, vi điều khiển atmega16 có 3 ngắt ngoài trên chân INT0, INT1, INT2 lần lượt trên các chân 16, 17, 3. Hình 3.2 Dạng xung trên nút nhấn Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -34/115- Biên soạn: Lâm Quang Chuyên Ứng dụng của ngắt ngoài dùng đếm sản phẩm, đo độ rộng xung, giải mã encoder 3.2.2 NGẮT TIMER Ngắt do bộ timer bên trong vi điều khiển thực hiện, các tác nhân ngắt timer bao gồm: ngắt tràn và ngắt bằng, ngắt khi đọc giá trị thanh ghi TCNTn (capture) Ngắt tràn: Khi giá trị lưu trữ vượt quá giá trị của thanh ghi TCNTn Ngắt bằng: Khi giá trị thanh ghi OCRn bằng với giá trị đặt của thanh ghi TCNTn, các mode ảnh hưởng đến hoạt động ngắt tràn: mode độ Normal, mode Fast PWM, mode PWM phase correct. Ứng dụng của ngắt timer dùng để điều khiển đồng hồ, đo độ rộng xung, hiển thị quét led 3.2.3 NGẮT ADC, SPI, TWI, AC Hoạt động ngắt ADC, SPI, TWI (I2C), AC xảy ra khi các hoạt động này hoàn thành 3.2.4 BÀI TẬP VÍ DỤ Ví dụ 1: Sử dụng ngắt ngoài để đếm sản phẩm Hình 3.3 Sơ đồ nguyên lý mạch đếm sản phẩm sử dụng ngắt ngoài Chương trình được viết như sau: Sử dụng ngắt INT0, tác động cạnh xuống. #include #include unsigned char index, donvi, chuc; Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -35/115- Biên soạn: Lâm Quang Chuyên unsigned char flash MaledAnot[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { index++; if(index>99) index = 0; } void hienthi() { PORTB = 0xfe; PORTA = MaledAnot[donvi]; delay_ms(2); PORTB = 0xfd; PORTA = MaledAnot[chuc]; delay_ms(2); } void giaima() { donvi = index%10; chuc = index/10; } void main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0x00; DDRB=0xFF; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // External Interrupt(s) initialization GICR|=0x40; MCUCR=0x02; MCUCSR=0x00; GIFR=0x40; // Global enable interrupts #asm("sei") while (1) { // Place your code here giaima(); hienthi(); } } Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -36/115- Biên soạn: Lâm Quang Chuyên Ví dụ 2: Sử dụng ngắt timer để hiển thị số đếm từ 00 đến 99 và lặp lại Sơ đồ nguyên lý tương tự như hình 3.3 Chương trình được viết như sau: Sử dụng ngắt tràn timer/counter0, bộ chia 1024, mode Normal #include #include unsigned char index, donvi, chuc; unsigned char flash MaledAnot[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { index++; if(index>99) index = 0; } void hienthi() { PORTB = 0xfe; PORTA = MaledAnot[donvi]; delay_ms(2); PORTB = 0xfd; PORTA = MaledAnot[chuc]; delay_ms(2); } void giaima() { donvi = index%10; chuc = index/10; } void main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0x00; DDRB=0xFF; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 0,977 kHz // Mode: Normal top=0xFF TCCR0=0x05; TCNT0=0x00; OCR0=0x00; Chương 3 Hoạt động ngắt Bài giảng vi điều khiển Atmega16 -37/115- Biên soạn: Lâm Quang Chuyên TIMSK=0x01; ACSR=0x80; // Global enable interrupts #asm("sei") while (1) { // Place your code here giaima(); hienthi(); } } 3.3. CÂU HỎI ÔN TẬP HẾT CHƯƠNG 1. Viết chương trình đếm lên và đếm xuống sử dụng 2 ngắt của vi điều khiển? 2. Viết chương trình đếm tự động từ 00 đến 99, khi nhấn nút trên chân 16 thì vi điều khiển dừng đếm, khi nhấn tiếp thì vi điều khiển chạy tiếp tục 3. Viết chương trình hiển thị số ngẫu nhiên từ 00 đến 99 4. Viết chương trình đo thời gian nhấn và nhã phím Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 38/115- Biên soạn: Lâm Quang Chuyên Chương 4 HOẠT ĐỘNG TIMER/COUNTER Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 39/115- Biên soạn: Lâm Quang Chuyên 4.1 GIỚI THIỆU: Bộ timer/counter hoạt động dựa trên nguyên tắc sau: bộ timer/counter (bộ đếm) nhận xung clock và đếm số lượng xung này, vi điều khiển nhận biết được số lượng xung này có bằng với giá trị cho trước hay không hoặc đã đạt tới giá trị TOP (0xFF) hoặc BOTTOM (0x00), dựa vào sự nhận biết này mà ta có các cách cư xử khác nhau cho phù hợp với từng ứng dụng của mình. Ứng dụng của bộ timer/counter: Dùng đếm sự kiện, định thời, tạo tần số, hoặc được sử dụng trong ứng dụng điều chế độ rộng xung PWM (điều khiển tốc độ động cơ, mạch ổn áp) Atmega16 có 3 bộ timer/counter: 2 bộ 8 bit (timer0, timer2) và 1 bộ 16 bit (timer1). Hình 4.1 Sơ đồ khối của bộ timer/ Counter Qua hình vẽ trên ta nhận thấy khối Control Logic nhận tín hiệu xung clock (clkTn) từ chân Tn hoặc từ bộ chia (prescaler), việc lựa chọn này tùy thuộc vào thanh ghi TCCR. Nếu clkTn là Tn thì bộ timer/counter sẽ thành bộ counter (đếm sự kiện), vi điều khiển sẽ nhận tín hiệu từ chân T0 (chân 1), T1 (chân 2). Nếu clkTn là prescaler thì bộ timer/counter sẽ thành bộ timer (định thời), tùy theo việc cài đặt bộ chia mà tín hiệu clkTn có các tần số khác nhau. Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 40/115- Biên soạn: Lâm Quang Chuyên Khối Control Logic xuất tín hiệu qua thanh ghi TCNTn bao gồm tín hiệu đếm (count), tín hiệu clear (xóa thanh ghi TCNTn về 0), và tín hiệu đếm lên/xuống (direction), nếu giá trị trong bộ counter và OCRn bằng nhau thì nó sẽ báo trên chân OCn, hoặc phát sinh ra tín hiệu ngắt. Tần số tín hiệu phát ra bên trong của vi điều khiển cấp cho bộ chia (prescaler) được gọi là chu kì máy (CKM) và được tính như sau: (4.1) Với fosc là tần số thạch anh được gắn vào chân 12 và 13 của vi điều khiển Các mode hoạt động của bộ timer/counter, có 4 chế độ làm việc tùy thuộc vào thanh ghi TCCR đó là:  Chế độ bình thường (normal), thường được sử dụng trong hoạt động tạo hàm delay, ngắt timer định kỳ.  Chế độ điều xung, 2 chu kỳ đếm lên và xuống (PWM, phase correct) dùng để điều khiển tốc độ động cơ, DAC.  Chế độ xóa bộ counter (CTC, Clear Timer on Compare Match Mode) dùng để tạo tần số.  Chế độ điều xung 1 chu kỳ đếm lên (Fast PWM) dùng để điều khiển tốc độ động cơ, DAC. 4.2 CÁC THANH GHI LIÊN QUAN (TCCR, TCNT, OCR, TIMSK, TIFR) 4.2.1 THANH GHI TCCRn Thanh ghi điều khiển TCCR dùng để xác định các Mode làm việc của bộ timer/counter, kiểu hoạt động ngõ ra chân OCn và bộ chia của bộ phát xung. Hình 4.2 Thanh ghi TCCR0 Bit7 – FOC0: bit này chỉ có tác dụng trong hoạt động không sử dụng điều xung PWM, và bit này nên được viết 0 khi sử dụng trong hoạt động PWM. Khi bit này được viết lên mức 1 một hoạt động so sánh bằng sẽ xảy ra theo cài đặc của 2 bit COM00 và COM01. = 1 Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 41/115- Biên soạn: Lâm Quang Chuyên Hoạt động này không phát sinh ra ngắt và không xóa giá trị thanh ghi OCR0 trong hoạt động CTC. Hoạt động này thích hợp trong việc tạo tần số với duty cycle thay đổi. Bit6 – WGM00: bit này kết hợp với bit 3 sẽ qui định các chế độ hoạt động của bộ timer (Normal, CTC, Fast PWM, phase correct PWM). Mode WGM01 Bit 3 WGM00 Bit 6 Chế độ hoạt động Giá trị cực đại Thời điểm cập nhật OCR0 Thời điểm cờ tràn bậc lên 1 0 0 0 Normal 255 Ngay tức thời 255 1 0 1 PWM, Phase correct 255 255 0 2 1 0 CTC OCR0 Ngay tức thời OCR0 3 1 1 Fast PWM 255 255 255 Bảng 4.1 Các mode làm việc của bộ timer/counter0 Bit5 – COM01: Bit này kết hợp với bit 4 để điều khiển chân OC0, lưu ý phải khai báo chân OC0 là ngõ ra trước khi sử dụng, tùy thuộc vào các mode hoạt động khác nhau mà ta có bảng kết nối chân OC0 khác nhau. Bit4 – COM00: xem bit 5 Bit3 – WGM01: xem bit 6 Bit2.1.0 – CS02.01.00: 3 bit này dùng để xác định nguồn tạo xung đưa vào bộ counter. Hình 4.3 Bộ chia và bộ chọn kênh cho hoạt động timer/counter (2) Thời gian để timer/counter tràn là 255 xung cho timer/counter0,2 (8bit) và 65535 xung cho timer/counter1 (16 bit) 1 xung = bộ chia * CKM Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 42/115- Biên soạn: Lâm Quang Chuyên Stt CS02 CS01 CS00 Description (mô tả) 1 0 0 0 Timer/counter không hoạt động 2 0 0 1 clkI/O (không chia tần số, bộ chia = 1) 3 0 1 0 clkI/O/8 (bộ chia = 8) 4 0 1 1 clkI/O/64 (bộ chia = 64) 5 1 0 0 clkI/O/256 (bộ chia = 256) 6 1 0 1 clkI/O/1024 (bộ chia = 1024) 7 1 1 0 Nhận xung ngoài từ chân T0, tác động cạnh xuống 8 1 1 1 Nhận xung ngoài từ chân T0, tác động cạnh lên Bảng 4.2 Chọn nguồn xung cho bộ timer/counter Chú ý: Dựa vào hình vẽ 4.3 và bảng 4.2 trên ta nhận thấy rằng khi sử dụng bộ timer/counter là bộ đếm thì bộ chia luôn bằng 1. Xem bài tập ví dụ 1. 4.2.2 Thanh ghi TCNT: Lưu giá trị đang đếm ta cũng có thể gọi đây là bộ counter. 4.2.3 Thanh ghi OCR: Lưu trữ giá trị mong muốn (giá trị đặt) 4.2.4 Thanh ghi TIMSK Bit 7 6 5 4 3 2 1 0 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 4.4 Thanh ghi TIMSK Bit7 – 2: không sử dụng Bit1 – OCIE0: bit này kết hợp với bit I trong thanh ghi trạng thái (status register) để cho phép hoạt động ngắt khi giá trị trong thanh ghi TCNT0 và OCR0 bằng nhau. Bit0 – TOIE0: bit này kết hợp với bit I trong thanh ghi trạng thái (status register) để cho phép hoạt động ngắt khi hiện tượng tràn xảy ra. 4.2.5 Thanh ghi TIFR Bit 7 6 5 4 3 2 1 0 OCF2 TOV2 ICF1 OCIF1A OCIF1B TOV1 OCF0 TOV0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 4.5 Thanh ghi TIFR Bit7 – 2: không sử dụng Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 43/115- Biên soạn: Lâm Quang Chuyên Bit1 – OCF0: (Cờ ngắt OCF0) cờ ngắt xảy ra khi bộ counter bằng với giá trị cài đặc trong OCR0, cờ này sẽ được tự động xóa bởi phần cứng khi sử dụng ngắt và xóa bởi phần mềm khi viết logic cao vào cờ này. Bit0 – TOV0: (cờ tràn TOV0) cờ tràn sẽ ở mức cao khi bộ counter tràn (từ MAX về BOTTOM) và được tự động xóa bởi phẩn cứng khi sử dụng ngắt và xóa bởi phần mềm khi viết logic cao vào cờ này. 4.3 CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA TIMER/COUNTER 4.3.1 CHẾ ĐỘ BÌNH THƯỜNG (NORMAL) Đây là chế độ hoạt động đơn giản nhất, bộ counter sẽ đếm từ BOTTOM (0x00) tới MAX (0xFF) và lặp lại từ BOTTOM. Cờ tràn TOV0 sẽ tự động bật lên 1 khi bộ counter đếm từ 255 về 0, muốn xóa cờ tràn này ta phải viết logic 1 vào nó, khi sử dụng ngắt thì cờ tràn sẽ tự động xóa về 0, thời gian đếm phụ thuộc vào bộ chia (prescaler) được cài đặt bởi thanh ghi TCCR0, có thể bằng 1, 8, 64, 256 hoặc 1024. Hình 4.6 Giản đồ thời gian trong hoạt động NORMAL Bài tập ví dụ: Viết chương trình định thời thời gian là 10 giây, tần số thạch anh là 2Mhz. Hình 4.7 Sơ đồ nguyên lý của mạch định thời Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 44/115- Biên soạn: Lâm Quang Chuyên Bài giải: Chu kì máy: = = . = 0.5 Vậy số CKM để chạy trong 10 giây là: ∗ . = 2 ∗ 10CKM Vậy ta phải chọn bộ chia là 1024 để có được số xung tối thiểu, Số xung tối thiểu = ∗ = 19531. Vậy ta cần 19531 xung để có được bộ định thời 10 giây. Nếu sử dụng bộ định thời 8 bit (timer0/timer2) thì ta có: = 76 Vậy cờ tràn TOV0 sẽ có 76 lần bật lên 1. Vậy ta chọn biến đếm là unsigned char. Chương trình được viết như sau #include unsigned char index; bit key; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here index++; PORTD++; if(index == 76) { PORTC.0 = 1; PORTD = 0; index = 0; key = 1; } } void main(void) { PORTA=0x00; DDRA=0x00; //PORTA là ngõ vào PORTB=0x00; DDRB=0x00; //PORTB là ngõ vào PORTC=0x00; DDRC=0xFF; //PORTC là ngõ ra PORTD=0x00; DDRD=0xff; //PORTD là ngõ ra TIMSK=0x01; //Cho phép ngắt tràn Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 45/115- Biên soạn: Lâm Quang Chuyên ACSR=0x80; //Không sử dụng mode so sánh // Global enable interrupts #asm("sei") while (1) { // Place your code here TCCR0 = 0; while(PINA.0); TCCR0 = 0x05; //chế độ là normal, bộ chia 1024 PORTC.0 = 0; while(!PINA.0); //chờ nhã phím } } 4.3.2. Chế độ CTC: (xóa khi so sánh bằng) bộ timer/counter sẽ đếm lên, khi giá trị trong thanh ghi counter (TCNT0) bằng với thanh ghi OCR0 (đã cài đặc trước) thì bộ counter sẽ bị xóa về 0 và tiếp tục đếm lên, cờ ngắt OCF0 nếu có sẽ xảy ra khi bộ counter đạt giá trị Max (bằng với OCR0). Hình 4.8 Giản đồ thời gian trong hoạt động CTC Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức năng Ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode này được mô tả trong bảng sau: COM01 COM00 Description (Mô tả) 0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O 0 1 Chân OC0 đảo trạng thái khi TCNT0 = OCR0 (toggle) Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 46/115- Biên soạn: Lâm Quang Chuyên 1 0 Chân OC0 = 0 khi bằng 1 1 Chân OC1 = 1 khi bằng Bảng 4.3 Ngõ ra OC0 trong hoạt động CTC Tần số trên chân OC0 được tính bởi công thức sau: (3) Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024). Xem bài tập ví dụ 2 4.3.3 Chế độ PWM PHASE CORRECT Chu kỳ hoạt động của bộ counter là hoạt động kép nghĩa là bộ counter sẽ đếm từ BOTTOM (0x00) đến MAX (0xFF) sau đó đếm từ MAX về BOTTOM và quá trình này lặp lại bất chấp bộ counter lớn hơn, nhỏ hơn hay bằng với OCR0. Đối với hoạt động ngõ ra không đảo: khi bộ counter (thanh ghi TCNT0) bằng với thanh ghi OCR0 thì OC0 sẽ được xóa về 0, nếu bộ counter đang đếm lên, khi bộ counter đếm xuống thì OC0 sẽ bằng 1. Đối với hoạt động đảo thì OC0 sẽ hoạt động ngược lại. Hình 4.9 Giản đồ thời gian trong hoạt động PWM – PHASE CORRECT Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức năng ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode này được mô tả trong bảng 4.1. = _/ 2. . (1 + 0) Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 47/115- Biên soạn: Lâm Quang Chuyên COM01 COM00 Description (Mô tả) 0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O 0 1 Không sử dụng 1 0 OC0 = 0 khi TCNT0 = OC0 trong khi đếm lên OC0 = 1 khi TCNT0 = OC0 trong khi đếm xuống 1 1 OC0 = 1 khi TCNT0 = OC0 trong khi đếm lên OC0 = 0 khi TCNT0 = OC0 trong khi đếm xuống Bảng 4.4 Ngõ ra OC0 trong hoạt động PWM – PHASE CORRECT Tần số trên chân OC0 được tính bởi công thức sau: (4) Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024). Bài tập ví dụ: cho biết thanh ghi OCR0 = 145 và thanh ghi TCCR0 = 0x01100010 4.3.4 Chế độ Fast PWM Chu kỳ hoạt động của bộ counter sẽ là hoạt động đơn, nghĩa là bộ counter sẽ đếm từ BOTTOM đến MAX sau đó reset về BOTTOM và đếm lên tiếp, quá trình này lặp lại bất chấp bộ counter lớn hơn, nhỏ hơn hay bằng với OCR0. Ở chế độ không đảo OC0 sẽ bị xóa về 0 khi bộ counter trùng với OCR0, và bằng 1 khi bộ counter bằng BOTTOM. Ở chế độ đảo thì ngược lại. = _/ ∗ 510 Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 48/115- Biên soạn: Lâm Quang Chuyên Hình 4.10 Giản đồ thời gian cho hoạt động FAST PWM Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức năng ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode này được mô tả trong table 40. COM01 COM00 Mô tả (Description) 0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O 0 1 Không sử dụng 1 0 OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0 OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0 1 1 OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0 OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0 Bảng 4.5 Ngõ ra oc0 trong hoạt động FAST PWM Tần số trên chân OC0 được tính bởi công thức sau: (5) Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024). = _/ ∗ 256 Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 49/115- Biên soạn: Lâm Quang Chuyên 4.4 Bài tập ví dụ Ví dụ 1: Trong chế độ Normal, tần số thạch anh là 1 Mhz, sử dụng bộ chia là 64, hỏi trong 1 giây timer tràn bao nhiêu lần. Giải: Dựa vào hình vẽ 4.3 ta nhận thấy rằng, 1 xung ngõ ra của bộ chia bằng 64 chu kì máy (CKM). Ta có 1CKM = 1/fosc = 1 (us) 1 xung = 64 CKM = 64us Thời gian tràn là 255 xung = 255.64 = 16.320 us Vậy số lần tràn trong 1 giây là: 61 lần Ví dụ 2: Viết chương trình tạo tần số 5Khz trên chân PB.3, thạch anh 4Mhz Giải: Vì yêu cầu mạch thiết kế tần số nên ta chọn mode CTC, OC0 ngõ ra dạng toggle. Mode CTC: WGM01 = 1; WGM00 = 0 (xem bảng 4.1) Ngõ ra dạng toggle: COM00 = 1; COM01 = 0. (xem bảng 4.3) Hình 4.11 Dạng xung cho tần số 5Khz Chu kì máy = = 1 Để thực hiện 100us ta phải mất 100CKM < 255 nên ta chọn bộ chia = 1 Vậy Thanh ghi TCCR0 = 0b00011001 = 0x19; Thanh ghi OCR0 = 100; Ví dụ 3: Hãy xác định thanh ghi TCCR2, biết rằng vi điều khiển sử dụng bộ chia 64, chế độ hoạt động Fast PWM, ngõ ra OC2 = 0 khi bằng. Giải: Sử dụng bộ chia 64 nên: CS02, CS01, CS00: 011 (xem bảng 4.2) Chế độ hoạt động Fast PWM: WGM01,00 = 11 (xem bảng 4.1) Ngõ ra OC2 = 0 khi bằng: COM00,01 = 01 (xem bảng 4.5) Chương 4 Hoạt động timer/ counter Bài giảng vi điều khiển Atmega16 - 50/115- Biên soạn: Lâm Quang Chuyên 4.4 CÂU HỎI ÔN TẬP HẾT CHƯƠNG Câu 1: Hãy nêu các thời điểm xảy ra hoạt động ngắt (ngắt bằng và ngắt tràn) trong hoạt động Timer/Counter. Câu 2: Vi điều khiển có bao nhiêu chân điều xung, kể tên các chân đó. Câu 3: Khi sử dụng đếm sự kiện tín hiệu vào phải ở chân nào? Câu 4: Hãy cho biết sự khác nhau và giống nhau giữa 2 mode Fast PWM và Phase correct PWM. Câu 5: Hãy viết chương trình tạo tần số 20 Khz trên chân OC0 (PB3) với duty cycle là 50%, tần số thạch anh là 2Mhz. Câu 6: Viết chương trình tạo bộ định thời chính xác 10 giây, tần số thạch anh là 1Mhz (gợi ý: sử dụng chế độ CTC) Câu 7: Hãy viết chương trình tạo tần số 8 Khz trên chân OC0 (PB3) với duty cycle là 75%. Câu 8: Hãy viết chương trình đếm sản phẩm trên chân T0 sử dụng chức năng timer/counter (tác động cạnh lên), khi đếm đến 100 sản phẩm thì sẽ xuất tín hiệu trên chân PORTD.7 = 1 trong khoảng 5 giây, sau đó lặp lại từ đầu. Câu 9: Hãy viết chương trình điều khiển động cơ từ tốc độ thấp nhất đến cao nhất, từ cao nhất đến thấp nhất rồi lặp lại. Câu 10: Hãy viết chương trình đo tốc độ động cơ. Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16 - 51/115- Biên soạn: Lâm Quang Chuyên Chương 5 BỘ SO SÁNH TÍN HIỆU TƯƠNG TỰ (ANALOG COMPARATOR) Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16 - 52/115- Biên soạn: Lâm Quang Chuyên 5.1 GIỚI THIỆU Là bộ so sánh mức điện áp trên chân AIN0 với mức điện áp trên chân AIN1, khi điện áp trên chân AIN0 lớn hơn chân AIN1 thì bit ngõ ra ACO (Analog Comparator Ouput) trong thanh ghi ACSR bằng 1. Kết quả so sánh này cũng có thể kích hoạt chức năng đọc giá trị đếm của counter trong bộ timer/counter1, và nó cũng có thể kích hoạt hoạt động ngắt. 5.2 CÁC THANH GHI LIÊN QUAN  Thanh ghi SFIOR kết hợp với thanh ghi ADCSRA dùng để chọn chân thay thế cho chân AIN1  Thanh ghi ACSR : Thanh ghi điều khiển hoạt động so sánh Hình 5.1 Sơ đồ khối hoạt động của bộ so sánh Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16 - 53/115- Biên soạn: Lâm Quang Chuyên V.2.1 THANH GHI SFIOR Bit 7 6 5 4 3 2 1 0 ADTS2 ADTS1 ADTS0 ADHSM ACME PUD PSR2 PSR10 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 5.2 Thanh ghi SFIOR Bit ACME Analog Comparator Multiplexer Enable, cho phép chọn ngõ vào thay cho chân AIN1, dựa vào sơ đồ trên ta nhận thấy rằng khi bit ADEN = 0 (ADC bị ngưng hoạt động) và bit ACME = 1, thì việc chọn ngõ vào thay cho chân AIN1 phụ thuộc vào 3 bit MUX2..0 của thanh ghi ADMUX. 5.2.2 Thanh ghi ADCSRA Bit 7 6 5 4 3 2 1 0 ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 5.3 Thanh ghi ADCSRA Bit ADEN kết hợp với bit ACME để chọn các chân thay thế cho AIN1 ACME ADEN MUX2.0 Ngõ vào chân có điện áp âm 0 x xxx AIN1 1 1 xxx AIN1 1 0 000 ADC0 1 0 001 ADC1 1 0 010 ADC2 1 0 011 ADC3 1 0 100 ADC4 1 0 101 ADC5 1 0 110 ADC6 1 0 111 ADC7 Bảng 5.1 Chọn chân điện áp ngõ vào Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16 - 54/115- Biên soạn: Lâm Quang Chuyên 5.2.3 Thanh ghi ACSR Bit 7 6 5 4 3 2 1 0 ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0 Read/ Write RW RW R RW RW RW RW RW Giá trị ban đầu 0 0 N/A 0 0 0 0 0 Hình 5.4 Thanh ghi ACSR  Bit 7 – ACD Analog Comparator Disable: khi bit này bằng 1 thì bộ so sánh không hoạt động, khi bit này bằng 0 thì được phép hoạt động. Bit này được bật lên 1 ở bất kỳ thời điểm nào điều này giúp cho vi điều khiển tiết kiệm được điện áp tiêu thụ trong hoạt động Idle.  Bit 6 – ACBG Analog Comparator Bandgap Select: Khi bit này bằng 1 điện áp tham chiếu (1.15v – 1.35v) sẽ được kết nối với chân dương của bộ so sánh, khi bằng 0 thì chân AIN0 được kết nối với bộ so sánh.  Bit 5 – ACO Analog Comparator Ouput: ngõ ra của bộ so sánh.  Bit 4 – ACI Analog Comparator Interrupt Flag: cờ ngắt của bộ so sánh phụ thuộc vào 2 bit ACIS1 và ACIS0. Cờ ngắt trong hoạt động so sánh được thực hiện khi bit ACIE và bit I trong thanh ghi SREG được cài đặc lên 1. Ở chế độ ngắt cờ này tự động xóa về 0, ngược lại cờ này được xóa khi viết mức logic 1 vào nó.  Bit 3 – ACIE Analog Comparator Interrupt Enable: Bit này cho phép ngắt khi = 1.  Bit 2 – ACIC Analog Comparator Input Capture Enable: khi bit này = 1 nó cho phép đọc giá trị trong counter của bộ timer/counter1.  Bit 1,0 – ACIS1, ACIS0: Analog Comparator Interrupt Mode Select ACIS1 ACIS0 Các dạng ngắt 0 0 Ngắt khi có sự thay đổi ngõ ra 0 1 Không sử dụng 1 0 Ngắt xảy ra tại cạnh xuống 1 1 Ngắt xảy ra tại cạnh lên Bảng 5.2 Cài đặt ngắt trong hoạt động AC Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16 - 55/115- Biên soạn: Lâm Quang Chuyên 5.2.4 Bài tập ví dụ Viết chương trình khi điện áp trên chân PB2 lớn hơn chân PB3 thì PORD.0 = 1, ngược lại thì =0; Hình 5.5 Bài tập ví dụ 1 Chương trình mô phỏng /***************************************************** Project : Hoạt động AC Date : 15/02/2014 Author : LÂM QUANG CHUYÊN *****************************************************/ #include // Analog Comparator interrupt service routine interrupt [ANA_COMP] void ana_comp_isr(void) { PORTD.0 = ~PORTD.0; } void main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xFF; Chương 5 Bộ so sánh tương tự Bài giảng vi điều khiển Atmega16 - 56/115- Biên soạn: Lâm Quang Chuyên // Analog Comparator initialization // Analog Comparator: On // Interrupt on Output Toggle ACSR=0x08; SFIOR=0x00; // Global enable interrupts #asm("sei") while (1) { // Place your code here } } 5.3 CÂU HỎI ÔN TẬP HẾT CHƯƠNG 1. Hãy phân tích hình vẽ 5.1 2. Hãy cài đặc chương trình để có ngõ AIN1 là chân ADC5 3. Hãy viết chương trình khi điện áp chân PB.2 lớn hơn điện áp trên chân PA.2 thì đèn trên chân PD.0 sáng, ngược lại đèn tắt.

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_vi_dieu_khien_lam_quang_chuyen.pdf
  • pdfgiao_trinh_vi_dieu_khienp2_753 (1)_2441628.pdf