Bài giảng Vi điều khiển Atmega16 (Phần 2)

Chân Q0-Q7 tín hiệu ngõ ra dạng song song Chân R Dùng reset thanh ghi dịch, tác động mức thấp Chân OE (Output Enable) chân này có mức logic thấp sẽ cho dữ liệu xuất ra ngoài, khi mức logic cao nó sẽ không cho phép xuất dữ liệu ra bên ngoài. Chân STR (Store) chân này có tác dụng như chân clock dùng chốt dữ liệu ra bên ngoài sau khi đã dịch xong 8 bit dữ liệu. Chân CLK (clock) tạo xung nhịp dịch dữ liệu nối tiếp từ chân Sin vào các flip – flop D, tác động cạnh lên. Chân Sout: Ngõ ra dạng nối tiếp cho IC dịch kế tiếp, được nối với chân Sin của IC kế. Chân NC (No Connection) không sử dụng

pdf56 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 27/02/2024 | Lượt xem: 30 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Vi điều khiển Atmega16 (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
0x9C và ADCL = 0b00--.----.=0x00 Ví dụ 2: Viết chương trình khi nhấn nút SW trên chân 16 (INT0 – PB2) thì vi điều khiển sẽ biến đổi tín hiệu ADC từ chân PA5 sau đó hiển thị kết quả trên PORTD cho byte cao (bit9.8) và PORTC cho byte thấp (bit7..0) Giải: Các bước thực hiện:  Xác định tác nhân kích hoạt ADC.  Xác định điện áp tham chiếu.  Xác định dữ liệu được lưu trong thanh ghi ADCL, ADCH.  Xác định tần suất lấy mẫu.  Xác định chân cần biến đổi ADC.  Xác định xem có ngắt hay không. Tác nhân kích hoạt ADC: Ngắt ngoài 0 INT0 vậy ADTS2.0 = 010 và ADATE = 1 Điện áp tham chiếu: = ( − ). . 512 Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16 -66/115- Biên soạn: Lâm Quang Chuyên Ta chọn Vref = 2.56v (internal reference) nên REFS1.0 = 11 Xác định dữ liệu trong thanh ghi Vì PORTB = bit9.8 và PORTC = bit7.00 nên bit ADLAR = 0 Tần suất lấy mẫu: Trong đề bài không đề cập đến tần suất biến đổi ADC nên ta chọn tùy ý, ở đây ta chọn là thời gian nhanh nhất là fadc = fck / 2, vậy ADPS2.0 = 000 Chân cần biến đổi ADC: PA5 nên MUX4..0: 00101 Xác định ngắt: Có sử dụng ngắt nến ADIE = 1 Dựa vào phân tích trên ta có các thanh ghi có nội dung như sau: ADMUX, ADCH, ADCL, ADCSRA, SFIOR. ADMUX = 0b1100.0101 ADSRA = 0b1011.1000 bit ADSC = 1 được điều khiển bởi ngắt ngoài 0 để kích hoạt biến đổi ADC. SFIOR = 0b0101.0000 Ví dụ 3: Tính thời gian biến đổi ADC cho lần đầu và lần thứ 2, biết tần số thạch anh là 4 Mhz, sử dụng bộ chia 32. Giải: Tính tần số CK = = 4ℎ Sử dụng bộ chia 32 nên = = 125ℎ Lần biến đổi ADC đầu tiên mất 25 ADCCLK nên thời gian biến đổi là: = 25 ∗ = 200 Lần biến đổi ADC đầu tiên mất 25 ADCCLK nên thời gian biến đổi là: = 12.5 ∗ = 100 6.4 CÂU HỎI ÔN TẬP HẾT CHƯƠNG Câu 1: Atmega có mấy chân biến đổi được ADC, các chân nhận tín hiệu biến đổi ADC trên Port nào, số chân? Câu 2: Atmega16 có mấy nguồn điện áp tham chiếu, hãy nêu sự khác nhau giữa việc chọn điện áp tham chiếu. Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16 -67/115- Biên soạn: Lâm Quang Chuyên Câu 3: Hãy nêu ý nghĩa của bộ prescaler trong hoạt động ADC. Câu 4: Tần suất lấy mẫu lớn nhất và nhỏ nhất hoạt động ADC là bao nhiêu biết fclk = 2Mhz. Câu 5: Hoạt động ngắt xảy ra ở thời điểm nào trong hoạt động ADC. Câu 6: Độ phân giải là gì, hãy cho ví vụ minh họa. Câu 7: Bit nào cho phép và không cho phép hoạt động ADC. Câu 8: Bit nào nhận biết hoạt động ADC đã hoàn tất, hoặc đang thực hiện. Câu 9: Hãy trình bài một ứng dụng trên thực tế có liên quan đến hoạt động ADC. Câu 10: Khi điện áp ngõ vào cần biến đổi là 1,36v, điện áp tham chiếu là 2.56v, độ phân giải 8 bit, hỏi giá trị sau khi biến đổi bằng bao nhiêu? Câu 11: Khi giá trị sau khi biến đổi có giá trị là 672, điện áp tham chiếu là 4,5v, độ phân giải 10 bit, hỏi giá trị điện áp ngõ vào là bao nhiêu? Câu 12: Sau khi biến đổi ADC giá trị thu được là: 0x2d5, hỏi ADCH, ADCL có giá bị là bao nhiêu, khi ADLAR = 0 và = 1. Câu 13: Điện áp tham chiếu trên chân AREF = 3v, Điện áp trên chân 36 là 2v. a. Hỏi giá trị lưu trong thanh ghi ADCH và ADCL là bao nhiêu (xét 2 trường hợp ADLAR = 0 và = 1). b. Giá trị thanh ghi ADMUX bằng bao nhiêu? Câu 14: Xác định các thanh ghi trong hoạt động ADC: a. Nguồn kích hoạt ADC (INT0). b. Điện áp tham chiếu (3v). c. 8 bit cao, 2 bit thấp. d. Tần suất lấy mẫu (chia 64) e. Chân cần biến đổi ADC.6. f. Không sử dụng ngắt. Câu 15: Xác định các thanh ghi trong hoạt động ADC: a. Nguồn kích hoạt ADC (Khi điện áp chân 3 lớn hơn chân 4). b. Điện áp tham chiếu (5v). Chương 6 Biến đổi tương tự sang số Bài giảng vi điều khiển Atmega16 -68/115- Biên soạn: Lâm Quang Chuyên c. 2 bit cao, 8 bit thấp. d. Tần suất lấy mẫu (chia 32) e. Chân cần biến đổi 35. f. Không sử dụng ngắt. g. Nếu giá trị trên thanh ghi ADCH = 0x03 và ADCL = 0b11001101 thì điện áp trên chân 35 là bao nhiêu? Câu 16: Viết chương trình khi nhấn nút SW trên chân 16 (INT0 – PB2) thì vi điều khiển sẽ biến đổi tín hiệu ADC từ chân PA5 hiển thị kết quả trên PORTD cho byte cao (bit9.8) và PORTC cho byte thấp (bit7..0). Điện áp tham chiếu VREF. Bộ prescaler = 16. Câu 17: Viết chương trình khi điện áp trên chân 3 lớn hơn chân 4 thì biến đổi ADC tín hiệu giữa 2 chân 39, 40 (39 điện áp dương, 40 điện áp âm) độ lợi 200x, điện áp tham chiếu AVCC, hiển thị kết quả trên PORTD cho byte cao (bit9..2) và PORTC cho byte thấp (bit1.0). Bộ prescaler = 128. Câu 18: Viết chương trình điều khiển tốc độ động cơ thông qua biến trở trên chân PORTA.0, khi biến trở có giá trị nhỏ nhất thì động cơ quay thấp nhất (ngừng quay), khi biến trở có giá trị cao nhất thì động cơ quay nhanh nhất. Câu 18: Viết chương trình điều khiển tốc độ động cơ thông qua biến trở trên chân PORTA.0, khi biến trở có giá trị nhỏ nhất thì động cơ quay thấp nhất (ngừng quay), khi biến trở có giá trị cao nhất thì động cơ quay nhanh nhất. Câu 19: Tính thời gian biến đổi ADC biết tần số thạch anh là 5Mhz, biết thanh ghi ADCSRA = 0bxxxx.x101. Câu 20: Hãy cho biết thời gian biến đổi nhanh nhất và chậm nhất của hoạt động ADC biết tần số thạch anh là 8 Mhz. Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -71/115- Biên soạn: Lâm Quang Chuyên Chương 7 TRUYỀN NHẬN DỮ LIỆU ĐỒNG BỘ VÀ BẤT ĐỒNG BỘ (THE UNIVERSAL SYNCHRONOUS AND ASYNCHRONOUS SERIAL RECEIVER AND TRANSMITTER USART) Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -72/115- Biên soạn: Lâm Quang Chuyên 7.1 GIỚI THIỆU Đây là bộ truyền nhận dữ liệu nối tiếp đồng bộ và không đồng bộ, biên độ thay đổi từ -12v đến 12v thích hợp trong môi trường công nghiệp, có nhiều tín hiệu nhiễu, việc truyền nhận dữ liệu được thực hiện trên 2 chân của vi điều khiển RxD và TxD. 7.1.1 Hoạt động đồng bộ Dữ liệu truyền đi sẽ được đồng bộ với xung clock, là hoạt động có sự phối hợp giữa chân XCK và RxD/TxD, trong hoạt động đồng bộ không đòi hỏi phải có cài đặt thông số (bắt tay) giữa 2 thiết bị, thời điểm nhận và thay đổi dữ liệu phụ thuộc vào bit UCPOL của thanh ghi UCSRC. 7.1.2 Hoạt động bất đồng bộ Là hoạt động chỉ phụ thuộc vào chân RxD/ TxD kết hợp với thời gian (tốc độ baud) mà không phụ thuộc vào chân CLK, một khung dữ liệu của hoạt động bất đồng bộ bao gồm: xung start bit, số bit dữ liệu (5,6,7,8,9 tùy mục đích sử dụng), 1 hoặc 2 stop bit, trong hoạt động bất đồng bộ đòi hỏi phải cài đặc thông số giữa 2 thiết bị phải giống nhau, cụ thể các thông số sau: Số lượng stop bit (1,2) Tốc độ baud (1200, 2400, 9600,) Kiểm tra chẵn lẻ (parity bit) Số bit được truyền đi trong 1 khung (5, 6, 7, 8, 9) Hình 7.1 Khung dữ liệu giao tiếp nối tiếp Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -73/115- Biên soạn: Lâm Quang Chuyên 7.1.3 Đặc tính giao tiếp USART  Hoạt động truyền nhận song công  Đồng bộ và không đồng bộ  Tốc độ truyền nhanh  Hỗ trợ các khung 5,6,7,8 hoặc 9 bit dữ liệu, 1 hoặc 2 stop bit (bất đồng bộ)  Giao tiếp nhiều vi điều khiển theo nghi thức Master, Slaver 7.2 CÁC THANH GHI LIÊN QUAN UDR (read), UDR (write), UCSRA, UCSRB, UCSRC, UBRRH, UBRRL. 7.2.1 Thanh ghi UDR Là thanh ghi đệm dùng để truyền UDR (write) và nhận UDR (read) dữ liệu nó có cùng địa chỉ, việc viết dữ liệu vào thanh ghi đệm chỉ thực hiện được khi cờ UDRE trong thanh ghi UCSRA bằng 1. Bit 7 6 5 4 3 2 1 0 RXB[7:0] TXB[7:0] Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 7.2 Thanh ghi UDR 7.2.2 Thanh ghi UCSRA Bit 7 6 5 4 3 2 1 0 RXC TXC UDRE FE DOR PE U2X MPCM Read/ Write R RW R R R R RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 7.3 Thanh ghi UCSRA Bit 7 – RXC USART (USART Receive Complele) khi RXC = 1 thì dữ liệu trong thanh ghi UDR (read) chưa đọc, và khi RXC = 1 thì dữ liệu trong thanh ghi này đã được đọc, khi đó thanh ghi UDR (read) được xem là thanh ghi trống. Bit 6 – TXC (USART Transmit Complete) dùng thông báo cho hoạt động truyền dữ liệu đã hoàn tất, khi TXC = 1 thì toàn bộ dữ liệu trong thanh ghi dịch (shift register) đã được dịch chuyển ra ngoài và không còn dữ liệu trong thanh ghi UDR (write). Bit này tự động xóa về 0 khi thực thi hoạt động ngắt, hoặc ghi giá trị 1 vào bit này, bit này có thể kích hoạt hoạt động ngắt. Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -74/115- Biên soạn: Lâm Quang Chuyên Bit 5 – UDRE (USART Data Register Empty) bit này dùng để báo cho biết thanh ghi UDR (write) có sẵn sàng nhận dữ liệu mới hay không. Nếu bit này = 1 thì bộ đệm trống, thanh ghi UDR (write) sẵn sàng nhận dữ liệu. Bit này có thể kích hoạt hoạt động ngắt khi thanh ghi đệm trống. Bit này = 1 sau hoạt động reset. Bit 4 – FE (Frame Error) khi FE = 1 sẽ thông báo lỗi trong hoạt động nhận dữ liệu, bit này phải được viết = 0 khi trong thanh ghi UCSRA. Bit 3 – DOR (Data OverRun) DOR = 1 nếu xảy ra quá trình tràn dữ liệu, bit này phải được viết = 0 khi trong thanh ghi UCSRA. Bit 2 – PE (Parity Error) PE = 1 khi có lỗi về Parity xảy ra, bit này phải được viết = 0 khi trong thanh ghi UCSRA. Bit 1 – U2X (Double the USART Transmittion Speed) bit này chỉ có tác dụng trong hoạt động bất đồng bộ, và bit này được viết = 0 trong hoạt động đồng bộ. Khi bit này bằng 1 sẽ giảm tốc độ baud xuống ½. Bit 0 – MPCM (Multi-processor Communication Mode) bit này cho phép hoạt động đa vi điều khiển, khi bit này = 1 tất cả các dữ liệu khi nhận không chứa đựng thông tin về địa chỉ sẽ bị bỏ qua (không nhận), xem phần giao tiếp đa vi điều khiển. 7.2.3 Thanh ghi UCSRB Bit 7 6 5 4 3 2 1 0 RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 7.4 Thanh ghi UCSRB Bit 7 – RXCIE (RX Complete Interrupt Enable) bit này = 1 cho phép ngắt trên cờ ngắt RXC. Khi muốn thực hiện hoạt động ngắt khi nhận dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit RXCIE trong thanh ghi UCSRB. Hoạt động xảy ra khi bit RXC = 1. Bit 6 – TXCIE (TX Complete Interrupt Enable) bit này = 1 cho phép ngắt trên cờ ngắt TXC. Hoạt động ngắt xảy ra khi bit RXC = 1. Khi muốn thực hiện hoạt động ngắt khi truyền dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit TXCIE trong thanh ghi UCSRB. Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -75/115- Biên soạn: Lâm Quang Chuyên Bit 5 – UDRIE (USART Data Register Empty Interrupt Enable) bit này = 1 cho phép ngắt trên cờ UDRE. Hoạt động xảy ra khi bit UDRE = 1. Khi muốn thực hiện hoạt động ngắt khi truyền dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit UDRIE trong thanh ghi UCSRB. Bit 4 – RXEN (Receiver Enable) bit này = 1 sẽ cho phép nhận dữ liệu. Bit 3 – TXEN (Transmitter Enable) bit này = 1 sẽ cho phép truyền dữ liệu. Bit 2 – UCSZ2 (Character size) bit này kết hợp với 2 bit UCSZ1.0 để xác độ dài dữ liệu để nhận và truyền dữ liệu. Bit 1 – RXB8 (Receive Data Bit 8) đây chính là bit thứ 9 trong hoạt động nhận 9 bit dữ liệu, bit này phải đọc được trước khi đọc 8 bit thấp trong thanh ghi UDR (read). Bit 0 – TXB8 (Transmitte Data Bit 8) đây là bit thứ 9 trong hoạt động truyền dữ liệu, bit này phải được ghi trước ghi ghi 8 bit thấp trong thanh ghi UDR (write). 7.2.4 Thanh ghi UCSRC (USART Control and Status Register C). Bit 7 6 5 4 3 2 1 0 URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 1 0 0 0 0 1 1 0 Hình 7.5 Thanh ghi UCSRC Bit 7 – URSEL (Register Select) dùng để chọn thanh ghi UBRRH hoặc thanh ghi UCSRC, khi bit này bằng 0 thì thanh ghi UBRRH được chọn, khi bit này bằng 1 thì thanh ghi UCSRC được chọn. Bit 6 – UMSEL (USART Mode Select) dùng để chọn hoạt động đồng bộ/ không đồng bộ. UMSEL Chế độ 0 Asynchronous Operation (hoạt động bất đồng bộ) 1 Asynchronous Operation (hoạt động đồng bộ) Bảng 7.1 Chế độ làm việc giao tiếp nối tiếp Bit 5.4 – UPM1.0 (Parity Mode) 2 bit này dùng để xác định hoạt động parity trong quá trình nhận và truyền dữ liệu. Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -76/115- Biên soạn: Lâm Quang Chuyên UPM1 UPM0 Parity Mode 0 0 (Disabled) Không sử dụng 0 1 (Reserved) Không sử dụng 1 0 Cho phép kiểm tra chẵn (even parity) 1 1 Cho phép kiểm tra lẽ (odd parity) Bảng 7.2 Cài đặc bit Parity Bit 3 – USBS (Stop Bit Select) dùng để chọn số stop bit trong hoạt động truyền dữ liệu, trong hoạt động nhận sẽ bỏ qua hoạt động này. USBS Stop Bit(s) 0 1 bit 1 2 bit Bảng 7.3 Cài đặc bit USBS Bit 2.1 – UCSZ1.0 chọn kích thước dữ liệu Stt UCSZ2 UCSZ1 UCSZ0 Kích thước bit 1 0 0 0 5 bit 2 0 0 1 6 bit 3 0 1 0 7 bit 4 0 1 1 8 bit 5 1 0 0 Không sử dụng 6 1 0 1 Không sử dụng 7 1 1 0 Không sử dụng 8 1 1 1 9 bit Bảng 7.4 Cài đặc số bit dữ liệu Bit 0 – UCPOL (Clock Polarity) bit này chỉ được sử dụng trong hoạt động đồng bộ, bit này phải được viết = 0 trong hoạt đồng bất đồng bộ. UCPOL Truyền dữ liệu (ngõ ra, chân TxD) Nhận dữ liệu mẫu (ngõ vào, chân RxD) 0 Cạnh lên xung XCK Cạnh xuống xung XCK 1 Cạnh xuống xung XCK Cạnh lên xung XCK Bảng 7.5 Cài đặc bit UCPOL Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -77/115- Biên soạn: Lâm Quang Chuyên Hình 7.6 Dữ liệu sẽ được thay đổi tại cạnh lên và lấy mẫu tại cạnh xuống Hình 7.7 Dữ liệu sẽ được thay đổi tại cạnh xuống và lấy mẫu tại cạnh lên. 7.2.5 Thanh ghi UBRRL và UBRRH Hình 7.8 Thanh ghi UBRRL và UBRRH Thanh ghi UBRRH có cùng địa chỉ với thanh ghi UCSRC Bit 7 – URSEL (Register Select) dùng để chọn thanh ghi UBRRH hoặc thanh ghi UCSRC, khi bit này bằng 0 thì thanh ghi UBRRH được chọn, khi bit này bằng 1 thì thanh ghi UCSRC được chọn. Tất cả các bit còn lại được sử dụng để chọn tốc độ baud trong hoạt động truyền/ nhận dữ liệu, việc lựa chọn tốc độ baud phải đồng bộ với nhau và sai số trên 0.5% sẽ cho kết quả truyền không chính xác. Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -78/115- Biên soạn: Lâm Quang Chuyên Bảng 7.6 Chọn tốc độ baud ở các tần số từ 1Mhz đến 2Mhz Bảng 7.7 Chọn tốc độ baud ở các tần số từ 3Mhz đến 7Mhz Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -79/115- Biên soạn: Lâm Quang Chuyên Bảng 7.8 Chọn tốc độ baud ở các tần số từ 8Mhz đến 14Mhz Bảng 7.9 Chọn tốc độ baud ở các tần số 16Mhz đến 20Mhz 7.3 CÁC BƯỚC THỰC HIỆN CÀI ĐẶC Khi truyền/ nhận dữ liệu nối tiếp bất đồng bộ ta phải thực hiện các công việc sau: 1. Cài đặc tốc độ baud 2. Cài đặc số stop bit (1 hoặc 2) Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -80/115- Biên soạn: Lâm Quang Chuyên 3. Số bit truyền nhận dữ liệu 4. Có kiểm tra chẵn lẻ hay không 5. Xác định vi điều khiền nhận/ truyền hoặc vừa nhận vừa truyền dữ liệu. 6. Xác định xem có ngắt hay không 7.3.1 Quá trình nhận dữ liệu 1. Kiểm tra cờ RX trong thanh ghi UCSRA (mục đích là để nhận biết VĐK đã nhận được dữ liệu hay chưa):  Nếu = 0 thì dữ liệu trong thanh ghi UDR (read) là trống (đã được đọc hay chưa nhận được dữ liệu kế tiếp), vì thế VĐK sẽ chờ cho đến khi bit này = 1.  Nếu = 1 thì dữ liệu trong thanh ghi UDR (read) đã có dữ liệu (có nghĩa là VĐK đã hoàn tất thủ tục nhận dữ liệu), lúc này ta có thể đọc dữ liệu từ thanh ghi UDR, sau khi đọc xong, bit này sẽ tự động = 0. 2. Kiểm tra quá trình nhận dữ liệu có lỗi hay không, có 3 vấn đề cần kiểm tra đó là:  Parity Error (PE bit – 2 trong thanh ghi UCSRA).  Data OverRun (DOR bit – 3 trong thanh ghi UCSRA).  Frame Error (FE bit – 4 trong thanh ghi UCSRA). 3. Sau đó, VĐK sẽ nhận dữ liệu từ thanh ghi UDR (read). Kết thúc quá trình nhận dữ liệu. 7.3.2 Quá trình truyền dữ liệu: 1. Kiểm tra bit UDRE xem thanh ghi UDR (write) đã sẵn sàng nhận dữ liệu hay chưa.  Nếu UDRE = 1 thì thanh ghi UDR (write) đang trống (đã truyền dữ liệu) và sẵn sàng nhận dữ liệu để truyền đi.  Nếu UDRE = 0 thì thanh ghi UDR (write) đang bận truyền dữ liệu và không nhận dữ liệu mới. 2. Viết dữ liệu vào thanh ghi UDR. Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -81/115- Biên soạn: Lâm Quang Chuyên 7.3.3 Các thời điểm xảy ra ngắt trong hoạt động USART  Khi hoạt động nhận hoàn thành bit cho phép ngắt RXCIE  Khi hoạt động truyền hoàn thành, bit cho phép ngắt TXCIE  Khi thanh ghi dữ liệu UDR trống, bit cho phép ngắt UDRIE 7.4 BÀI TẬP VÍ DỤ 1. Bit nào, trong thanh ghi nào qui định việc cài đặt hoạt động đồng bộ và bất đồng bộ. 2. Hãy cho biết thời điểm xảy ra hoạt động ngắt. 3. Bit nào cho biết trạng thái truyền/ nhận dữ liệu đã hoàn thành. 4. Tốc độ baud có ảnh hưởng tới quá trình đồng bộ, bất đồng bộ hay ảnh hưởng cả hai. 5. Thanh ghi nào nhận dữ liệu và thanh ghi nào truyền dữ liệu 6. Khi cài đặc giao tiếp nối tiếp không đồng bộ giữa 2 thiết bị phải cùng các thông số nào? 7. Khi truyền dữ liệu đồng bộ với IC 74HC74 thì ta phải chọn bit UCPOL bằng bao nhiêu, tại sao? Giao tiếp giữa 2 vi điều khiển theo nghi thức giao tiếp nối tiếp CHƯƠNG TRÌNH TRUYỀN DỮ LIỆU /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Professional Date : 11/25/2011 Author : LÂM QUANG CHUYÊN Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 1.000000 MHz *****************************************************/ #include #ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2 Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -82/115- Biên soạn: Lâm Quang Chuyên #endif #ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC #define RXC 7 #endif #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // Write a character to the USART Transmitter #ifndef _DEBUG_TERMINAL_IO_ #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while ((UCSRA & DATA_REGISTER_EMPTY)==0); UDR=c; } #pragma used- #endif #include // Declare your global variables here void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; MCUCR=0x00; MCUCSR=0x00; Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -83/115- Biên soạn: Lâm Quang Chuyên TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 2 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 19200 UCSRA=0x00; UCSRB=0x08; UCSRC=0x8E; UBRRH=0x00; UBRRL=0x02; ACSR=0x80; SFIOR=0x00; ADCSRA=0x00; SPCR=0x00; TWCR=0x00; while (1) { // Place your code here while(PINB.7); putchar(PINA); } } CHƯƠNG TRÌNH TRUYỀN DỮ LIỆU /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Professional Date : 11/25/2011 Author : NeVaDa Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 1.000000 MHz *****************************************************/ #include #ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2 #endif Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -84/115- Biên soạn: Lâm Quang Chuyên #ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC #define RXC 7 #endif #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // Get a character from the USART Receiver #ifndef _DEBUG_TERMINAL_IO_ #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char status,data; while (1) { while (((status=UCSRA) & RX_COMPLETE)==0); data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) return data; } } #pragma used- #endif // Standard Input/Output functions #include // Declare your global variables here void main(void) { // Declare your local variables here PORTA=0x00; DDRA=0xff; PORTB=0x00; DDRB=0x00; Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -85/115- Biên soạn: Lâm Quang Chuyên PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 2 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud Rate: 19200 UCSRA=0x00; UCSRB=0x10; UCSRC=0x8E; UBRRH=0x00; UBRRL=0x02; ACSR=0x80; SFIOR=0x00; ADCSRA=0x00; SPCR=0x00; TWCR=0x00; while (1) { // Place your code here PORTA = getchar(); } } Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -86/115- Biên soạn: Lâm Quang Chuyên Hình 7.9 Mạch giao tiếp giữa 2 vi điểu khiển theo kiểu nói tiếp Chương 7 Truyền nhận dữ liệu nối tiếp Bài giảng vi điều khiển Atmega16 -87/115- Biên soạn: Lâm Quang Chuyên 7.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG 1. Hãy cài đặc tốc độ baud là 9600, 8bit, no parity, 2 stop bit, fosc = 1Mhz. 2. Hãy cài đặc tốc độ baud là 19200, 5bit, parity chẵn, 1 stop bit, fosc = 3.6864 Mhz. 3. Tốc độ baud 250k, 9 bit, parity lẻ, 1 stop bit, fosc = 4 Mhz. 4. Hãy cho biết chức năng của từng thanh ghi liên quan trong hoạt động USART. 5. Viết chương trình truyền dữ liệu từ PORTB của VĐK1 sang PORTA của VĐK2, với nghi thức truyền như sau: tốc độ baud 4800, 8 bit, 2 stop bit, parity chẵn, fosc = 1 Mhz. 6. Hãy cho so sánh giữa 2 bit TXC và UDRE. 7. Hãy cho biết tốc độ truyền chậm nhất và nhanh nhất của VĐK. 8. Vẽ dạng sóng ngõ ra trên 2 chân RxD và TxD trong chế độ đồng bộ, khi truyền dữ liệu có nội dung sau: 101100011 9. Viết chương trình truyền và nhận dữ liệu từ 2 VĐK như sau: Hình 7.10 Bài tập ví dụ giao tiếp nối tiếp Khi nhấn nút SW1 thì VĐK1 sẽ truyền dữ liệu từ PORTB sang PORTC của VDK2. Khi nhấn nút SW2 thì VĐK2 sẽ truyền dữ liệu từ PORTB sang PORTC của VDK1. Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 88/115- Biên soạn: Lâm Quang Chuyên Chương 8 GIAO TIẾP THIẾT BỊ NGOẠI VI THEO NGHI THỨC SPI (SPI SERIAL PERIPHERAL INTERFACE) Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 89/115- Biên soạn: Lâm Quang Chuyên 8.1 GIỚI THIỆU 8.1.1 Giới thiệu chung Hoạt động SPI dùng để trao đổi dữ liệu đồng bộ theo dạng nối tiếp giữa AVR với thiết bị ngoại vi hoặc giữa các AVR với nhau. Một số đặc tính của việc truyền nối tiếp như sau:  Truyền đồng bộ song công 4 dây (SCK, MOSI, MISO, SS)  Hoạt động theo dạng Master và Slaver  Truyền dữ liệu bit thấp (LSB) trước, hoặc bit cao (MSB) trước  7 tốc độ truyền dữ liệu khác nhau  Phát sinh ngắt khi quá trình truyền dữ liệu hoàn tất  Tăng gấp đôi tốc độ truyền dữ liệu  Master và Slaver có thể hoán đổi chức năng với nhau Hình 8.1 Sơ đồ giao tiếp giữa Master và Sl ave 8.1.2 Chức năng các chân trong hoạt động SPI 8.1.2.1 Chân SCK Chân này tạo xung clock để tạo xung nhịp truyền dữ liệu giữa Master và Slaver, xung nhịp được tạo ra bởi Master. MOSI MISO SCK SS1 SS2 SS3 SS3 MOSI MISO SCK SS2 MOSI MISO SCK SS1 MOSI MISO SCK MASTER SLAVER 3 SLAVER 2 SLAVER 1 Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 90/115- Biên soạn: Lâm Quang Chuyên 8.1.2.2 Chân SS (Slaver select) Khi sử dụng SPI ở vị trí Slave thì chân SS phải được khai báo là ngõ vào, khi chân SS ở mức thấp thì thiết bị ở trạng thái hoạt động (sẵn sàng nhận dữ liệu), khi chân SS ở mức cao thì tất cả các thiết bị ngưng hoạt động, khi chân SS ở mức thấp thì các chân SPI sẽ bị reset ngay lập tức. Khi sử dụng SPI ở vị trí là Master thì người sử dụng có thể điều khiển hướng của chân SS, khi chân này được khai báo là ngõ ra và sẽ điều khiển chân SS của Slave. Khi chân này được khai báo là ngõ vào nó phải được kéo lên mức cao để đảm bảo hoạt động cho Master, nếu chân này bị kéo xuống mức thấp bởi tác nhân bên ngoài trong khi chân SS được khai báo là ngõ vào thì nó sẽ hiểu là đã bị Master khác đã chiếm đường truyền trên bus, để tránh điều này hệ thống SPI phải thực hiện một số thủ tục sau: 1. Bit MSTR trong thanh ghi SPCR phải được xóa và nó trở thành Slave lúc này chân MOSI và SCK phải là ngõ vào. 2. Cờ trong thanh ghi SPIR trong thanh ghi SPSR được bật lên 1, và nếu hoạt động ngắt được cho phép 8.1.2.3 Chân MOSI (Master Input / Slave Output) nếu là Master thì đây là đường Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves được nối trực tiếp với nhau. 8.1.2.4 Chân MISO (MOSI – Master Output / Slave Input) nếu là Master thì đây là đường Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves được nối trực tiếp với nhau. 8.2 CÁC THANH GHI LIÊN QUAN: SPCR, SPSR, SPDR 8.2.1 Thanh ghi SPCR Bit 7 6 5 4 3 2 1 0 SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 8.2 Thanh ghi SPCR Bit 7 – SPIE (SPI Interrupt Enable): Cho phép ngắt nếu bit SPIF trong thanh ghi SPSR = 1, và bit I cho phép ngắt toàn cục trong thanh ghi SREG =1. Bit 6 – SPE (SPI Enable): Cho phép hoạt động SPI khi bit này = 1. Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 91/115- Biên soạn: Lâm Quang Chuyên Bit 5 – DORD (Data Order): Xác định thứ tự truyền dữ liệu, nếu DORD = 1, thì dữ liệu sẽ được truyền byte thấp trước, khi DORD = 0 thì ngược lại. Bit 4 – MSTR (Master/Slaver Select): khi MSTR = 1 thì VĐK hoạt động như là Master, khi MSTR = 0 thi VĐK là Slave. Ngoài ra khi VĐK là Master thì khi chân SS là ngõ vào và được kéo xuống thấp thì bit MSTR sẽ bằng 0 (trở thành Slave) và bit SPIR trong thanh ghi SPSR lên 1. Nếu muốn VĐK là Master thì phải ghi bit MSTR lên 1. Bit 3.2 – CPOL, CPHA (Clock parity, Clock phase) dùng để xác định các chế độ làm việc của SPI. Bit 1.0 – SPR1.0 (Clock Rate Select 1 và 0) dùng để chọn tốc độ truyền dữ liệu. SPI2X SPR1 SPR0 Tần số SCK 0 0 0 fosc/4 0 0 1 fosc/16 0 1 0 fosc/64 0 1 1 fosc/128 1 0 0 fosc/2 1 0 1 fosc/8 1 1 0 fosc/32 1 1 1 fosc/64 Bảng 8.1 Mối quan hệ giữa chân sck và tần số dao động 8.2.2 Thanh ghi SPSR Bit 7 6 5 4 3 2 1 0 SPIF WCOL - - - - - SPI2X SPSR Read/ Write R R R R R R R RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 8.3 Thanh ghi SPSR Bit 7 – SPIF (SPI Interrupt Flag): Cờ ngắt trong hoạt động SPI, khi hoàn tất việc trao đổi dữ liệu thì bit SPIF sẽ bằng 1, thông báo hoạt động ngắt bắt đầu. Ngoài ra bit SPIF cũng lên 1 khi chân SS trong mode Master được kéo xuống thấp. Bit 6 – WCOL (Write COLlision Flag): Bit WCOL =1 khi thanh ghi dữ liệu SPI (SPDR) đang nhận dữ liệu. Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 92/115- Biên soạn: Lâm Quang Chuyên 8.2.3 Thanh ghi SPDR Bit 7 6 5 4 3 2 1 0 MSB LSB SPDR Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu x x x x x x x x Không xác định Hình 8.4 Thanh ghi SPDR Đây là thanh ghi truyền nhận dữ liệu, viết dữ liệu vào thanh ghi này dùng truyền dữ liệu, đọc dữ liệu khi ở chế độ nhận. 8.3 CÁC CHẾ ĐỘ LÀM VIỆC CỦA SPI Thời điểm lấy mẫu Thời điểm đỗi dữ liệu Giá trị ban đầu Chế độ SPI CPOL = 0, CPHA = 0 Cạnh lên Cạnh xuống Mức thấp 0 CPOL = 0, CPHA = 1 Cạnh xuống Cạnh lên Mức thấp 1 CPOL = 1, CPHA = 0 Cạnh xuống Cạnh lên Mức cao 2 CPOL = 1, CPHA = 1 Cạnh lên Cạnh xuống Mức cao 3 Bảng 8.2 Các thời điểm lấy mẫu nhận dữ liệu Hình 8.5 Thời điểm lấy mẫu khi bit CPHA = 0 Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 93/115- Biên soạn: Lâm Quang Chuyên Hình 8.6 Thời điểm lấy mẫu khi bit CPHA = 1 8.4 BÀI TẬP VÍ DỤ Viết chương trình giao tiếp giữa 1 Master và 2 Slaver, theo yêu cầu sau: Khi nhấn nút 1 thì Master sẽ gởi dữ liệu từ PORTA đến Slaver 1, nút 2 thì Master gởi dữ liệu từ PORTA đến Slaver 2. Phân tích: Các bước thực hiện Chọn Master và Slaver Chọn tốc độ truyền dữ liệu Xác định ngắt/ không ngắt Xác định kiểu truyền dữ liệu (LSB trước hay MSB trước) Chọn mode hoạt động 0,1,2,3 Chương trình cho Master: /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Advanced Date : 28/01/2012 Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 1,000000 MHz *****************************************************/ #include Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 94/115- Biên soạn: Lâm Quang Chuyên // SPI functions #include // Declare your global variables here void main(void) { // Port A initialization PORTA=0xff; DDRA=0x00; // Port B initialization PORTB=0x07; DDRB=0xB0; // Port C initialization PORTC=0x00; DDRC=0x00; // Port D initialization PORTD=0x00; DDRD=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // SPI initialization // SPI Type: Master // SPI Clock Rate: 250,000 kHz // SPI Clock Phase: Cycle Start // SPI Clock Polarity: Low // SPI Data Order: LSB First SPCR=0x70; SPSR=0x00; // TWI initialization // TWI disabled TWCR=0x00; while (1) { // Place your code here while(PINB.2); spi(PINA); } } Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 95/115- Biên soạn: Lâm Quang Chuyên Chương trình cho Slave /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Date : 28/01/2012 Company : TRƯỜNG CAO ĐẲNG CÔNG THƯƠNG TP.HCM Chip type : ATmega16 AVR Core Clock frequency: 1,000000 MHz *****************************************************/ #include // SPI functions #include void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x40; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xFF; // Analog Comparator initialization ACSR=0x80; SFIOR=0x00; // SPI initialization // SPI Type: Slave // SPI Clock Phase: Cycle Start // SPI Clock Polarity: Low // SPI Data Order: LSB First SPCR=0x60; SPSR=0x00; while (1) { // Place your code here PORTD = SPDR; SPSR.7 = 1; } } Chương 8 Giao tiếp SPI Bài giảng vi điều khiển Atmega16 - 96/115- Biên soạn: Lâm Quang Chuyên 8.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG Câu 1: Chân SS là ngõ vào hay ngõ ra đối với Master và Slaver Câu 2: Chân SS của Slaver phải luôn ở mức cao hay mức thấp Câu 3: Hãy cài đặc vi điều khiển ở chế độ Master, tần số xung SCK = 62,500Khz, mức logic của chân SCK ban đầu bằng 1, thời điểm lấy mẫu cạnh lên của xung clock, truyền LSB trước, biết tần số thạch anh là 4Mhz. Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 97/115- Biên soạn: Lâm Quang Chuyên Chương 9 GIAO TIẾP THIẾT BỊ THEO NGHI THỨC I2C (TWO WIRE SERIAL INTERFACE) Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 98/115- Biên soạn: Lâm Quang Chuyên 9.1. GIỚI THIỆU: Là hoạt động truyền dữ liệu dạng nối tiếp có định địa chỉ, hỗ trợ cả Master và Slave, hoạt động I2C sử dụng 2 chân giao tiếp SDA và SCL, hoạt động I2C có thể truy cập tới từng ô nhớ của thiết bị. Hình 9.1 Hình vẽ giao tiếp theo nghi thức I2C 9.1.1 Đặc tính  Đơn giản, dễ giao tiếp và sử dụng chỉ với 2 dây  Tốc độ truyền 400Khz  Hổ trợ cho cả 2 hoạt động Master và Slave có thể hoán đổi vị trí cho nhau.  Có thể hoạt động như bộ truyền/ nhận dữ liệu  Có thể phân chia đến 128 địa chỉ khác nhau cho Slave  Hổ trợ nhiều Master kiểm soát đường truyền  2 chân giao tiếp SDA (PC1,23) và SCL (PC0,22) 9.1.2 Thuật ngữ:  SDA: Serial Data dữ liệu đường nối tiếp  SCL: Serial Clock xung đồng bộ clock Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 99/115- Biên soạn: Lâm Quang Chuyên 9.2 NGUYÊN LÝ HOẠT ĐỘNG GIAO TIẾP I2C Hoạt động I2C bắt đầu bằng 1 start bit và kết thúc bằng 1 Stop bit, gói dữ liệu là 8 bit và xen giữa là bit ACK, Định dạng gói địa chỉ Hình 9.2 Định dạng truyền dữ liệu theo nghi thức I2C Để bắt đầu bằng 1 start bit chân SDA sẽ từ mức cao xuống mức thấp, trong khi Stop bit chân SDA sẽ từ mức thấp chuyển lên mức cao trong cả 2 trường hợp này chân SCL đều ở mức cao, Hình 9.3 Định dạng Stop bit và Start bit Việc chuyển đổi dữ liệu giữa các bit được thực hiện tại mức thấp của chân SCL, Hình 9.4 Chuyển đổi dữ liệu tại mức thấp của chân SCL Ví dụ dạng sóng gởi dữ liệu từ Master đến Slaver theo dữ liệu 10011010 như sau: Hình 9.5 Dạng sóng trên chân SDA và SCL Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 100/115- Biên soạn: Lâm Quang Chuyên Hình 9.6 Lưu đồ giải thuật gởi dữ liệu từ Master đến Slaver Khởi động START bit Gởi 7 bit địa chỉ tới Slave Kiểm tra ACK Gởi 1 bit Read/ Write BEGIN SDA từ mức cao chuyển sang mức thấp trong khi SCL luôn ở mức cao Master gởi địa chỉ (7 bit) tới Slave trên chân SDA Master gởi yêu cầu Read/ Write tới Slave Read = 1, Write = 0. Khi ACK = 0, thì Slave đã nhận được địa chỉ, ACK = 1 thì Slave không nhận địa chỉ Khi Master nhận được NACK, thì Master sẽ gởi lại Start bit hoặc Stop bit để kết thúc quá trình gởi Gởi/ Nhận 8 bit dữ liệu Kiểm tra ACK Master gởi dữ liệu (8 bit) tới Slave hoặc nhận dữ liệu từ Slave Master kiểm tra bit ACK, nếu ACK thì Slave nhận được dữ liệu, nếu NACK thì Slave không nhận được dữ liệu Master có thể gởi/ nhận tiếp dữ liệu tới/ từ Slave hoặc gởi Stop bit tới Slave để kết thúc quá trình gởi/ nhận dữ liệu STOP Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 101/115- Biên soạn: Lâm Quang Chuyên 9.3 CÁC THANH GHI LIÊN QUAN 9.3.1 Thanh ghi TWBR (TWI bit rate register) dùng để chọn tần số phát xung clock trên chân SCL. Bit 7 6 5 4 3 2 1 0 TWB7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 9.7 Thanh ghi tạo tần số TWBR 9.3.2 Thanh ghi TWCR (TWI Control Register): Dùng để điều khiển hoạt động TWI Bit 7 6 5 4 3 2 1 0 TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE Read/ Write RW RW RW RW R RW R RW Giá trị ban đầu 0 0 0 0 0 0 0 0 Hình 9.8 Thanh ghi điều khiển TWCR Bit7 – TWINT: (cờ ngắt TWI) bit này bằng 1 khi hoạt động TWI hoàn tất, nếu bit I trong thanh ghi (SREG) và bit TWIE trong thanh ghi (TWCR) được cài đặc là 1, vi điều khiển sẽ nhảy tới vector ngắt TWI. Chân SCL sẽ duy trì mức thấp khi cờ TWINT được bậc lên 1. Cờ TWINT sẽ được xóa khi viết mức logic 1 lên bit này, và tự động xóa khi sử dụng hoạt động ngắt. Bit6 – TWEA: (TWI Enable Acknowledge bit, bit cho phép bắt tay) bit này điều khiển việc phát xung ACK. Nếu bit TWEA được viết lên 1, thì xung ACK sẽ được phát lên đường bus khi nó thỏa mãn các điều kiện sau:  Cấu hình bên Slave đã xác định được địa chỉ  Hoạt động nhiều Slave được nhận khi bit TWGCE trong thanh ghi TWAR được viết logic 1.  1 byte dữ liệu đã được nhận trong ở Master hoặc Slave. Khi bit này được viết mức logic 0, thì cấu hình tạm thời không kết nối với đường bus TWI, khi bit này bằng 1 thì nó sẽ kết nối với bus TWI. Bit5 – TWSTA: (TWI Start Condition Bit, bit kiểm tra điều kiện Master) khi 1 vi điều khiển nào đó muốn trở thành Master thì nó sẽ viết mức logic 1 lên bit này (TWSTA), phần cứng sẽ kiểm tra xem đường truyền trên bus có rãnh hay không và sẽ phát sinh xung Start trên đường bus, tuy nhiên nếu đường bus bận thì TWI sẽ chờ bit Stop và sẽ Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 102/115- Biên soạn: Lâm Quang Chuyên phát lại xung Start để giành quyền Master, bit TWSTA phải được xóa bởi phần mềm khi xung Start được truyền đi. Bit4 – TWSTO: (TWI Stop Condition Bit, bit kết thúc vai tò Master) đối với Master bit này được viết logic 1 sẽ phát điều kiện Stop trên đường bus. Khi điều kiện Stop được thực hiện trên đường Bus xong thì bit TWSTO sẽ được xóa tự động. Còn đối với Slave, bit này = 1 dùng để khắc phục lỗi, và sẽ không phát sinh điều kiện Stop trên đường Bus. Bit3 – TWWC: (TWI Write Collision Flag, cờ báo lỗi khi viết dữ liệu) cờ này sẽ có logic 1 khi viết dữ liệu vào thanh ghi dữ liệu (TWDR) trong khi TWINT ở mức logic 0. Cờ này sẽ về 0 khi viết dữ liệu vào thanh ghi TWDR khi bit TWINT ở mức 1. Bit2 – TWEN: (TWI Enable bit, bit cho phép TWI) bit này được viết logic 1 sẽ cho phép hoạt động TWI, khi bit này có mức logic 0 sẽ không cho phép hoạt động TWI. Bit1 – Res: (Bit dự trữ) Bit0 – TWIE: (TWI Interrupt Enable, cho phép ngắt TWI) khi bit này bằng 1 và bit I trong thanh ghi SREG bằng 1 thì sẽ cho phép hoạt động ngắt TWI. 9.3.3 Thanh ghi TWSR (TWI Status Register) Thanh ghi trạng thái TWI Bit 7 6 5 4 3 2 1 0 TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0 Read/ Write R R R R R R RW RW Giá trị ban đầu 1 1 1 1 1 0 0 0 Hình 9.9 Thanh ghi trạng thái TWSR Bit7..3 – TWS7: (TWI Status) bit này kết hợp với các bit Bit2 – Res (bit dự trữ) bit này luôn được viết là logic 0. (9.1) Bit1.0 – TWPS (TWI Prescaler Bit) 2 bit này dùng để xác định tốc độ truyền dữ liệu trong TWI.  TWBR : Giá trị trong thanh ghi TWBR  TWPS : Giá trị 2 bit cuối trong thanh ghi TWSR 9.3.4 Thanh ghi TWDR (TWI Data Register) Trong hoạt động truyền byte này chứa dữ liệu kế tiếp để truyền và trong hoạt động nhận thanh ghi chứa byte vừa mới được nhận. ầ ố = ầ ố ℎạℎ ℎ () 16 + 2() ∗ 4 Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 103/115- Biên soạn: Lâm Quang Chuyên Bit 7 6 5 4 3 2 1 0 TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 1 1 1 1 1 1 1 1 Hình 9.10 Thanh ghi dữ liệu TWDR 9.3.5 Thanh ghi TWAR (TWI Address Register) Bit 7 6 5 4 3 2 1 0 TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 1 1 1 1 1 1 1 0 Hình 9.11 Thanh ghi địa chỉ TWAR Thanh ghi này dùng để xác định địa chỉ của vi điều khiển trong vai trò là Slave, bit cuối cùng TWGCE dùng trong hoạt động đa Master. 9.4 BÀI TẬP VÍ DỤ Câu 1: Cài đặt tần số hoạt động là 125Khz theo nghi thức I2C với tần số thạch anh là 4 Mhz. Giải: Dựa vào công thức (9.1) ta có:  Để tần số là 125 khz thì mẫu số sẽ có giá trị bằng 32  Vậy ta chọn TWBR = 1, TWPS = 2. Câu 2: Vẽ sơ đồ mạch giao tiếp giữa atmega16 với DS1307, IC nhớ 24C32 và cảm biến nhiệt độ, độ ẩm STH10. ầ ố = ầ ố ℎạℎ ℎ () 16 + 2() ∗ 4 Chương 9 Giao tiếp I2C Bài giảng vi điều khiển Atmega16 - 104/115- Biên soạn: Lâm Quang Chuyên Hình 9.12 Sơ đồ giao tiếp I2C giữa các thiết bị 9.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG Câu 1: Trong quá trình hoạt động, thiết bị Slaver có thể trở thành Master được hay không, nếu được hãy nêu nghi thức giải quyết. Câu 2: Khi giao tiếp theo nghi thức I2C thì số thiết bị cho Slaver là bao nhiêu? Câu 3: Hãy cho biết tần số tối đa giao tiếp theo nghi thức I2C là bao nhiêu? Câu 4: Hãy cài đặc tần số SCL là 50Khz, tần số thạch anh là 8 Mhz Câu 5: Hãy cho biết chức năng của bit ACK Câu 6: Hãy trình bày giống nhau và khác nhau giữa các nghi thức giao tiếp I2C, USART, SPI. BT1 BATTERY U3 DS13074 7 51 2 6 3 8 G N D SQW SDAX1 X2 SCL VBAT V C C U1 Atmega16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 PB.0 PB.1 PB.2 INT2 PB.3 OC0 PB.4 PB.5 PB.6 PB.7 RESET VCC GND XTAL2 XTAL1 PD.0 RxD PD.1 TxD PD.2 INT0 PD.3 INT1 PD.4 PD.5 PD.6 OC2 PD.7 SCL PC.0 SDA PC.1 PC.2 PC.3 PC.4 PC.5 PC.6 PC.7 AVCC GND AVREF PA.7 PA.6 PA.5 PA.4 PA.3 PA.2 PA.1 PA.0 VCC5VCC5 Y1 ZTA VCC5 U2 24AA32A4 8 5 6 1 2 3 7 G N D V C C SDA SCL A0 A1 A2 WP VCC5 U4 SHT10 4 1 2 3 V C C G N D DATA SCK Phụ luc 1 Các chuẩn giao tiếp Bài giảng vi điều khiển Atmega16 - 106/115- Biên soạn: Lâm Quang Chuyên PHỤ LỤC 1 (Các chuẩn giao tiếp và bit chẵn lẻ) Các chuẩn giao tiếp Master Salver Hoán đổi Số lượng dây Star, stop bit Tiếp cận từng địa chỉ Tốc độ tối đa Độ dài giao tiếp Đồng bộ Bất đồng bộ Khung dữ liệu I2C x 2 x x x - 8 SPI - >3 - - x - 8 USART - 3 x - x x 5-9 Bảng 10.1 So sánh các chuẩn giao tiếp Kiểm tra chẵn lẻ (parity): là kiểm tra số lượng bit 1 và bit 0 trong một gói dữ liệu, có 2 dạng kiểm tra: kiểm tra chẵn (Even) và kiểm tra lẻ (Odd).  Kiểm tra chẵn: Nếu số lượng bit 1 trong 1 khung dữ liệu là chẵn thì bit parity (P) sẽ là 0, ngược lại sẽ là 1. o Ví dụ 1: Khi gói dữ liệu 8 bit (10101101) được gởi đi thì bit P sẽ là 1, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 101011011. o Ví dụ 2: Khi gói dữ liệu 8 bit (11000101) được gởi đi thì bit P sẽ là 0, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 110001010.  Kiểm tra lẻ: Nếu số lượng bit 0 trong 1 khung dữ liệu là chẵn thì bit parity (P) sẽ là 1, ngược lại sẽ là 0. o Ví dụ 1: Khi gói dữ liệu 8 bit (10101101) được gởi đi thì bit P sẽ là 0, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 101011010. o Ví dụ 2: Khi gói dữ liệu 8 bit (11000101) được gởi đi thì bit P sẽ là 1, cụ thể dữ liệu được gởi trên đường truyền sẽ là: 110001011. Phụ luc 2 IC thời gian thực DS1307 Bài giảng vi điều khiển Atmega16 - 107/115- Biên soạn: Lâm Quang Chuyên PHỤ LỤC 2 (IC thời gian thực DS1307) DS1307: là IC thời gian thực giao tiếp dữ liệu theo nghi thức I2C, chip này có 7 thanh ghi chứa thời gian đó là: giây, phút, giờ, thứ, ngày, tháng, năm. Ngoài ra nó còn 56 byte Ram dùng để chứa dữ liệu, sơ đồ chân của DS1307 như sau: Hình 10.1 Sơ đồ chân IC DS1307 Với:  Chân (1,2) X1, X2: Chân tạo dao động nối với thạch anh có tần số 32.768Khz,  Chân 3 (Vbat): Nối nguồn Pin nuôi 3,3 volt giữ cho DS chạy đúng thời gian khi không có nguồn nuôi DS1307.  Chân 4 GND: Nguồn Mass cho cả DS và nguồn nuôi 3,3v  Chân 5 SDA: Chân truyền nhận dữ liệu  Chân 6 SCL: Chân tạo xung clock để giao tiếp dữ liệu  Chân 7 SQW: Tạo tần số dao động xung vuông 1Hz, 4.096Khz, 8.192Khz, 32.768Khz  Chân 8 Vcc: Chân nguồn cung cấp cho DS, khi nguồn cung cấp này mất thì DS vẫn hoạt động chức năng thời gian nhờ vào nguồn nuôi 3,3 volt. Thanh ghi trong bộ nhớ DS1307: Thanh ghi điều khiển Hình 10.2 Thanh ghi điều khiển Control Register Bit 7: (Out) Nếu bit SQWE = 0 thì:  Bit OUT = 0, chân 7 (SQW/OUT) sẽ có mức logic 0 Phụ luc 2 IC thời gian thực DS1307 Bài giảng vi điều khiển Atmega16 - 108/115- Biên soạn: Lâm Quang Chuyên  Bit OUT = 1, chân 7 (SQW/OUT) sẽ có mức logic 1 Bit 4: (SQWE) Nếu bit SQWE = 1, thì nó cho phép xuất xung vuông trên chân số 7 (SQW/OUT), tần số xung vuông phụ thuộc vào chân RS1, RS0. Bit 1-0: Dùng chọn tần số dao động trên chân 7 (SQWE/OUT) Bảng 10. Chọn tần số ngõ ra trên chân SQW Hình 10.3 Sơ đồ nguyên lý kết nối DS1307 với LCD4x20 Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16 - 109/115- Biên soạn: Lâm Quang Chuyên PHỤ LỤC 3 (Điều khiển nhiều led ma trận) 10.1. GIỚI THIỆU VỀ IC THANH GHI DỊCH 10.1.1 Giới thiệu chung IC NC6B595 là thanh ghi dịch 8 bit vào nối tiếp ra song song và được lưu dữ liệu trong flip – flop D, dữ liệu đưa ra được tác động bởi cạnh lên của xung clock, ngõ ra ở mức thấp và cực C để hở, transistor loại TTL, chịu được áp 15 volt và dòng 200 mA, IC được cấu tạo gồm 3 tầng, Tầng 1: Chuyển dữ liệu từ nối tiếp ra song song nhờ vào 8 flip – flop D như hình vẽ 10.2, nhờ vào chân CLK. Tầng 2: Lưu 8 bit dữ liệu vào 8 flip – flop D nhờ vào chân STR như hình 10.2 Tầng 3: Xuất dữ liệu ra bên ngoài nhờ vào chân OE. 10.1.2 Chức năng các chân và nguyên lý hoạt động Sơ đồ chân của IC như sau: Hình 10.4 Sơ đồ chân IC NC6B595 Chân Vcc: Nguồn cung cấp 7 volt Chân Sin: tín hiệu ngõ vào dạng nối tiếp Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16 - 110/115- Biên soạn: Lâm Quang Chuyên Chân Q0-Q7 tín hiệu ngõ ra dạng song song Chân R Dùng reset thanh ghi dịch, tác động mức thấp Chân OE (Output Enable) chân này có mức logic thấp sẽ cho dữ liệu xuất ra ngoài, khi mức logic cao nó sẽ không cho phép xuất dữ liệu ra bên ngoài. Chân STR (Store) chân này có tác dụng như chân clock dùng chốt dữ liệu ra bên ngoài sau khi đã dịch xong 8 bit dữ liệu. Chân CLK (clock) tạo xung nhịp dịch dữ liệu nối tiếp từ chân Sin vào các flip – flop D, tác động cạnh lên. Chân Sout: Ngõ ra dạng nối tiếp cho IC dịch kế tiếp, được nối với chân Sin của IC kế. Chân NC (No Connection) không sử dụng Hình 10.5 Sơ đồ nguyên lý hoạt động IC NC6B595 Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16 - 111/115- Biên soạn: Lâm Quang Chuyên 10.2 ĐIỂU KHIỂN NHIỀU LED MA TRẬN Để điều khiển nhiều led ma trận ta phải sử dụng thanh ghi dịch, mỗi led ma trận sẽ được kết nối với 1 IC ghi dịch như hình vẽ 10.3, chương trình điều khiển xem phần phụ lục. Hình 10.6 Sơ đồ nguyên lý điều khiển 8 led ma trận Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16 - 112/115- Biên soạn: Lâm Quang Chuyên Chương trình trên CodeVision /***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Date : 5/12/2010 Chip type : ATmega16 Clock frequency : 4.000000 MHz *****************************************************/ #include #include // SPI functions #include #define STR PORTB.3 // Declare your global variables here unsigned char i,j; unsigned char flash addr[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char flash Ma[8][8]={ 0b01000001,0b01111101,0b00000111,0b00011100,0b10001011,0b11100011,0b11100111,0b0000 0000, 0b01000001,0b01000001,0b00001000,0b10100010,0b11011010,0b00000000,0b10001000,0b1000 0000, 0b01000001,0b01000001,0b00001000,0b00100010,0b10101010,0b00000000,0b10001000,0b1000 0000, 0b01000001,0b01111101,0b00001000,0b00100010,0b10001011,0b11100000,0b10001000,0b1000 0000, 0b01001001,0b01000001,0b00001000,0b00100010,0b10001010,0b00000000,0b10001000,0b1000 0000, 0b01010101,0b01000001,0b00001000,0b10100010,0b10001010,0b00000000,0b10001000,0b1000 0000, 0b00100010,0b01111101,0b11100111,0b00011100,0b10001011,0b11100000,0b10000111,0b0000 0000, 0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b0000 0000 }; void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0xff; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xff; // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // SPI initialization // SPI Type: Master // SPI Clock Rate: 1000.000 kHz Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16 - 113/115- Biên soạn: Lâm Quang Chuyên // SPI Clock Phase: Cycle Half // SPI Clock Polarity: Low // SPI Data Order: LSB First SPCR=0x70; SPSR=0x00; while (1) { // Place your code here //====================1 j = 0; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //====================2 j = 1; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //====================3 j = 2; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //====================4 j = 3; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; Phụ luc 3 Điều khiển nhiều led ma trận Bài giảng vi điều khiển Atmega16 - 114/115- Biên soạn: Lâm Quang Chuyên //====================5 j = 4; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //====================6 j = 5; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //====================7 j = 6; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //====================8 j = 7; i = 8; while(i--) { spi(Ma[j][i]); } STR = 0; STR = 1; PORTD = addr[j]; delay_us(100); PORTD = 0xff; //==================== }; } Tài liệu tham khảo Bài giảng vi điều khiển Atmega16 - 115/115- Biên soạn: Lâm Quang Chuyên TÀI LIỆU THAM KHẢO 1. Họ vi điều khiển 8051 – Tống Văn On, Hoàng Đức Hải – NXB Lao Động XH 2. Vi điều khiển với lập trình C – Ngô Diên Tập, NXB Khoa học Kỹ thuật 3. Đo lường điều khiển bằng máy tính – Ngô Diên Tập, NXB Khoa học Kỹ thuật 4. Đo lường điều khiển bằng máy tính – Nguyễn Đức Thành, ĐH Bách Khoa TP. HCM 5. Hướng dẫn lập trình Vi điều khiển PIC – Lê Duy Phi 6. The 8051 Microcontroller - Kenneth J. Ayala 7. 8. 9.

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

  • pdfbai_giang_vi_dieu_khien_atmega16_phan_2.pdf