Vi điều khiển Atmega8 có một module truyền thông nối tiếp USART. Có ba chân chính liên quan đến module này đó là chân xung nhịp - XCK (chân số 1), chân truyền dữ liệu – TxD (Transmitted Data) và chân nhận dữ liệu – RxD
(Reveived Data). Trong đó chân XCK chỉ được sử dụng như là chân phát hoặc nhận xung giữ nhịp trong chế độ truyền động bộ. Tuy nhiên trong luận văn này tôi không trình bày chếđộ truyền thông đồng bộ, vì thế chỉ cần quan tâm đến hai chân TxD và RxD. Vì các chân truyền/nhận dữ liệu chỉ đảm nhiệm một chức năng độc lập (hoặc là truyền, hoặc là nhận), để kết nối các chip AVR với nhau (hoặc kết nối AVR với thiết bị hỗ trợ UART khác) chúng ta phải đấu “chéo” hai chân này. TxD của thiết bị thứ nhất kết nối với RxD của thiết bị 2 và ngược lại. Module USART trên chip Atmega32 hoạt động “song công” (Full Duplex Operation), nghĩa là quá trình truyền và nhận dữ liệu có thể xảy ra đồng thời.
Các thanh ghi:
Cũng như các thiết bị khác trên AVR, tất cả hoạt động và trạng thái của module USART được điều khiển và quan sát thông qua các thanh ghi trong vùng nhớ I/O. Có 5 thanh ghi được thiết kế riêng cho hoạt động và điều khiển của USART, đó là:
UDR: hay thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận được và phát đi của USART. Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB (Transmit data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ. Đọc UDR thu được giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR tương đương đặt giá trị vào thanh ghi đệm phát, chuẩn bị để gởi đi. Chú ý trong các khung truyền sử dụng 5, 6 hoặc 7 bit dữ liệu, các bit cao của thanh ghi UDR sẽ không được sử dụng.
7 6 5 4 3 2 1 0
RXB[7:0] UDR(Read) TXB[7:0] UDR(Write)
R/W R/W R/W R/W R/W R/W R/W R/W
Hình 2.7: Thanh ghi UDR.
•UCSRA (USART Control and Status Register A): là 1 trong 3 thanh ghi điều khiển hoạt động của module USART.
7 6 5 4 3 2 1 0
RXC TXC UDRE FE DOR PE U2X MPCM UCSRA
R R/W R R R R R/W R/W
Hình 2.8: Thanh ghi UCSRA
Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trình nhận kết thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống (UDRE), khung truyền có lỗi (FE), dữ liệu tràn (DOR), kiểm tra parity có lỗi (PE)… Chúng ta chú ý một số bit quan trọng của thanh ghi này:
* UDRE (USART Data Register Empty) khi bit bày bằng 1 nghĩa là thanh ghi dữ liệu UDR đang trống và sẵn sàng cho một nhiệm vụ truyền hay nhận tiếp theo. Vì thế nếu muốn truyền dữ liệu đầu tiên chúng ta phải kiểm tra xem bit UDRE có bằng 1 hay không, sau khi chắc chắn rằng UDRE=1 hãy viết dữ liệu vào thanh ghi UDR để truyền đi.
* U2X là bit chỉ định gấp đôi tốc độ truyền, khi bit này được set lên 1, tốc độ truyền so cao gấp 2 lần so với khi bit này mang giá trị 0.
* MPCM là bit chọn chếđộ hoạt động đa xử lí (multi-processor).
•UCSRB (USART Control and Status Register B): đây là thanh ghi quan trọng điều khiển USART. Vì thế chúng ta sẽ khảo sát chi tiết từng bit của thanh ghi này.
7 6 5 4 3 2 1 0
RXCIE TXCIE UDRIE RXEN TXEN UC2 RXB8 TXB8 UCSRB
R/W R/W R/W R/W R/W R/W R R/W
Hình 2.9: Thanh ghi UCSRB
* RXCIE (Receive Complete Interrupt Enable) là bit cho phép ngắt khi quá trình nhận kết thúc. Việc nhận dữ liệu truyền bằng phương pháp nối tiếp không đồng bộ thường được thực hiện thông qua ngắt, vì thế bit này thường được set bằng 1 khi USART được dùng nhận dữ liệu.
* TXCIE (Transmit Complete Interrupt Enable) bit cho phép ngắt khi quá trình truyền kết thúc.
* UDRIE (USART Data Register Empty Interrupt Enable) là bit cho phép ngắt khi thanh ghi dữ liệu UDR trống.
* RXEN (Receiver Enable) là một bit quan trọng điều khiển bộ nhận của USART, để kích hoạt chức năng nhận dữ liệu phải set bit này lên 1.
* TXEN (Transmitter Enable) là bit điều khiển bộ phát. Set bit này lên 1 nghĩa là sẽ khởi động bộ phát của USART.
* UCSZ2 (Chracter size) bit này kết hợp với 2 bit khác trong thanh ghi UCSRC quy định độ dài của dữ liệu truyền/nhận.
* RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8. USART trong AVR có hỗ trợ truyền dữ liệu có độ dài tối đa 9 bit, trong khi thanh ghi dữ liệu là thanh ghi 8 bit. Do đó, khi có gói dữ liệu 9 bit được nhận, 8 bit đầu sẽ chứa trong thanh ghi UDR, cần có 1 bit khác đóng vai trò bit thứ chín, RXD8 là bit thứ chín này. Chú ý là các bit được đánh số từ 0, vì thế bit thứ chín sẽ có chỉ số là 8, vì lẽđó mà bit này có tên là RXD8 (không phải RXD9).
* TXB8 (Transmit Data Bit 8), tương tự như bit RXD8, bit TXB8 cũng đóng vai trò bit thứ 9 truyền thông, nhưng bit này được dùng trong lúc truyền dữ liệu.
•UCSRC (USART Control and Status Register C): thanh ghi này chủ yếu quy định khung truyền và chế độ truyền. Tuy nhiên, có một rắc rối nho nhỏ là thanh ghi này lại có cùng địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte cao dùng để xác lập tốc độ baud), nói một cách khác 2 thanh ghi này là 1. Vì thế bit 7 trong thanh ghi này, tức bit URSEL là bit chọn thanh ghi. Khi URSEL=1, thanh ghi này được chip AVR hiểu là thanh ghi điều khiển UCSRC, nhưng nếu bit URSEL=0 thì thanh ghi UBRRH sẽđược sử dụng.
7 6 5 4 3 2 1 0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL UCSRC
R/W R/W R/W R/W R/W R/W R/W R/W
1 0 0 0 0 1 1 0
Hình 2.10: Thanh ghi UCSRC
Các bit còn lại trong thanh ghi UCSRC được mô tả như sau:
* UMSEL (USART Mode Select) là bit lựa chọn giữa 2 chế độ truyền thông đồng bộ và không đồng bộ. Nếu UMSEL=0, chế độ không đồng bộđược chọn, ngược lại nếu UMSEL=1, chếđộđồng bộđược kích hoạt.
* Hai bit UPM1 và UPM0 (Parity Mode) được dùng để quy định kiểm tra pariry. Nếu UPM1:0=00, parity không được sử dụng (mode này khá thông dụng), UPM1:0=01 không được sử dụng, UPM1:0=10 thì parity chẵn được dùng, UPM1:0=11 parity lẻđược sử dụng (xem thêm bảng 1).
Bảng 2.1: Chọn kiểm tra parity.
UPM1 UPM0 Parity Mode
0 0 Disabled
0 1 Reserved
1 0 Enabled, Even Parity
1 1 Enabled, Odd Parity
* USBS (Stop bit Select), bit Stop trong khung truyền bằng AVR USART có thể là 1 hoặc 2 bit, nếu USBS=0 thì Stop bit chỉ là 1 bit trong khi USBS=1 sẽ có 2 Stop bit được dùng.
* Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2 trong thanh ghi UCSRB tạo thành 3 bit quy định độ dài dữ liệu truyền. Bảng 2 tóm tắt các giá trị có thể có của tổ hợp 3 bit này và độ dài dữ liệu truyền tương ứng.
Bảng 2.2: Độ dài dữ liệu truyền.
UCSZ2 UCSZ1 UCSZ0 Character Size
0 0 0 5-bit 0 0 1 6-bit 0 1 0 7-bit 0 1 1 8-bit 1 0 0 Reserved 1 0 1 Reserved 1 1 0 Reserved 1 1 1 9-bit
* UCPOL (Clock Pority) là bit chỉ cực của xung kích trong chế độ truyền thông đồng bộ. Nếu UCPOL=0, dữ liệu sẽ thay đổi thay đổi ở cạnh lên của xung nhịp, nếu UCPOL=1, dữ liệu thay đổi ở cạnh xuống xung nhịp. Nếu sử dụng chế độ truyền thông không đồng bộ, hãy set bit này bằng 0.
•UBRRL và UBRRH (USART Baud Rate Register): 2 thanh ghi thấp và cao quy định tốc độ baud.
15 14 13 12 11 10 9 8
URSEL - - - UBRR[11:8] UBRRH
UBRR[7:0] UBRRL 7 6 5 4 3 2 1 0
Lưu ý là thanh ghi UBRRH dùng chung địa chỉ thanh ghi UCSRC, chúng ta phải set bit này bằng 0 nếu muốn sử dụng thanh ghi UBRRH. Như quan sát trong hình trên, chỉ có 4 bit thấp của UBRRH được dùng, 4 bit này kết hợp với 8 bit trong thanh ghi UBRRL tạo thành thanh ghi 12 bit quy định tốc độ baud. Chú ý là nếu chúng ta viết giá trị vào thanh ghi UBRRL, tốc độ baud sẽ tức thì được cập nhật, vì thế phải viết giá trị vào thanh ghi UBRRH trước khi viết vào thanh ghi UBRRL.
Giá trị gán cho thanh ghi UBRR không phải là tốc độ baud, nó chỉ được USART dùng để tính tốc độ baud. Bảng 2.3. hướng dẫn cách tính tốc độ baud dựa vào giá trị của thanh ghi UBRR và ngược lại, cách tính giá trị cần thiết gán cho thanh ghi UBRR khi đã biết tốc độ baud.
Bảng 2.3: Tính tốc độ baud.
Operating Mode Equation for Calculating Baude Rate
Equation for Calculating UBRR Value Asynchronous Normal Mode (U2X = 0) 16( 1) OSC f BAUD UBRR = + 16 1 OSC f UBRR BAUD = − Asynchronous Double Mode (U2X = 0) 8( 1) OSC f BAUD UBRR = + 8 1 OSC f UBRR BAUD = − Synchronous Masster Mode 2( 1) OSC f BAUD UBRR = + 2 1 OSC f UBRR BAUD = −
Trong các công thức trong bảng 3, fOSC là tần số xung nhịp của hệ thống (thạch anh hay nguồn xung nội…). Để tiện cho theo dõi, chúng ta xem bảng ví dụ cách đặt giá trị cho UBRR theo tốc độ baud mẫu (các bảng tốc độ baude mẫu này được trình bày trong datasheet của các AVR tương ứng).
Bảng 2.4: Một số tốc độ baud mẫu.
(Trong datasheet của ATmega8 tốc độ baud này được trình bày trong các bảng 60, 61, 62, 63 ở các trang từ 159 đến 162).
Sử dụng module UART trên AVR
Thông thường, để sử dụng module USART trên AVR chúng ta phải thực hiện ba việc quan trọng, đó là:
- Cài đặt tốc độ baud (thanh ghi UBRR),
- định dạng khung truyền (UCSRB, UCSRC) và - kích hoạt bộ truyền, bộ nhận, ngắt…
Như đã trình bày ở trên, trong luận văn này chủ yếu đề cập đến phương pháp truyền thông không đồng bộ, việc xác lập các thông số hoạt động chủ yếu dựa trên chế độ này. Trong hầu hết các ứng dụng, tốc độ baud và khung truyền thường không đổi, trong trường hợp này chúng ta có thể khởi tạo trực tiếp USART ở phần đầu trong main và sau đó chỉ cần truyền hoặc nhận dữ liệu mà không cần thay đổi các cài đặt. Tuy nhiên, nếu trường hợp giao tiếp “linh hoạt” ví dụ chúng đang chế tạo một thiết bị có khả năng giao tiếp với một thiết bị đầu
cuối khác (như máy tính chẳng hạn), lúc này có thể cho phép người dùng thay đổi tốc độ baud hoặc các thông số khác để phù hợp với thiết bịđầu cuối.