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
56 trang |
Chia sẻ: Tiểu Khải Minh | Ngày: 27/02/2024 | Lượt xem: 30 | Lượt tải: 0
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:
- bai_giang_vi_dieu_khien_atmega16_phan_2.pdf