Professional Documents
Culture Documents
Cổng nối tiếp (phần 1)
Cổng nối tiếp (phần 1)
Phần 1
Với X là giá trị (không dấu) được nạp vào thanh ghi UBRRn 𝑭𝒐𝒔𝒄.𝟐𝑼𝟐𝑿𝒏
U2X được xác định (0 hay 1) trong thanh ghi UCSRn X= -1
𝟏𝟔 𝐱 𝐓ố𝐜 độ𝑩𝒂𝒖𝒅
Chú ý :
+ Nếu ghi giá trị vào thanh ghi UBRRnL thì tốc độ baud sẽ được cập nhật tức thời.
+Phải nạp giá trị vào thanh ghi UBRRnH trước khi nạp vào thanh ghi UBRRnL.
Ví dụ: Cho fosc = 8MHz, CKDIV8 = 1, U2X0 = 0, chế độ truyền nối tiếp bất đồng bộ. Tìm giá trị nạp vào
thanh ghi UBRR0 để đạt được tốc độ baud 9600
𝑭𝒐𝒔𝒄.𝟐𝑼𝟐𝑿𝒏
X= -1
𝟏𝟔 𝐱 𝐓ố𝐜 độ𝑩𝒂𝒖𝒅
Với fosc = 8MHz, U2X0 = 0, tốc độ baud = 9600 → X = [(20 x 8 x106) /(9600 x 16) – 1 ]= 51.08
Vì nội dung thanh ghi UBRR0 là số nguyên, do đó chọn X = 51 (= 33H)
Chức năng của thanh ghi UCSRnC là quy định kích thước khung truyền và chế độ truyền.
Bit 7:6 – UMSELn[1:0]: USART Mode Select Bit 5:4 – UPMn[1:0]: Parity Mode
Các bit này dùng để lựa chọn các chế độ hoạt Các bit UPMn[1:0] có chức năng cấu hình các chế
động USART. độ bit kiểm tra chẵn lẻ.
Gồm 2 thanh ghi cùng tên để nạp dữ liệu cho bộ đệm phát (UDRn transmit) và bộ đệm thu
(UDRn receive).
Khi phát, UDREn = 1 (ghi dữ liệu mới vào bộ đệm phát) và bộ phát được cho phép (TXEN =
1), dữ liệu sẽ được phát nối tiếp ra chân TxD.
Khi thu, RXCn =1 (đọc dữ liệu từ bộ đệm thu). Bộ đệm thu (UDRn receive) gồm một FIFO
(First In, First Out). FIFO sẽ thay đổi trạng thái bất cứ khi nào bộ đệm thu được truy cập. Do
đó, tránh sử dụng các câu lệnh Read-Modify-Write (ví dụ: lệnh SBI, CBI) và các lệnh kiểm
tra bit (ví dụ: lệnh SBIC, SBIS) vì các lệnh này cũng làm thay đổi trạng thái FIFO.
Chương trình con phát data (số bit từ 5 đến 8) ra cổng nối tiếp USART0
USART0TRANS:
LDS R17,UCSR0A ; đọc thanh ghi UCSR0A
SBRS R17,UDRE0 ;kiểm tra bộ đệm phát UDR0 rỗng (UDRE0 = 1)?
RJMP USART0TRANS ;nếu UDR0 chưa trống thì tiếp tục kiểm tra lại
STS UDR0, R25 ;khi UDR0 trống thì chép dữ liệu R25 cần phát vào UDR0
RET
.INCLUDE<M324PADEF.INC>
.EQU COUNT=3 ; 3 ký tự (YES)
.EQU DATA= R25 ; R25 chứa data
RCALL USART0INIT ; khởi tạo USART0
MAIN:
LDI ZH, HIGH(TRANSTAB <<1)
LDI ZL, LOW(TRANSTAB <<1)
LDI R20, COUNT
AGAIN:
LPM DATA, Z+ ;lấy data từ bảng TRANSTAB
RCALL USART0TRANS ; truyền ra cổng nối tiếp
DEC COUNT
BRNE AGAIN
RJMP MAIN
TRANSTAB: .DB “YES”
Võ Thị Thu Hồng 22
Lập trình giao tiếp USART ATMEGA324P –Ví dụ 2 (tt)
USART0INIT:
LDI R16,(1<<TXEN0) ;cho phép phát USART0
STS UCSR0B, R16
LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ;8-bit data
STS UCSR0C ,R16 ;không parity, 1 stop bit
LDI R16,0x00
STS UBRR0H,R16
LDI R16, 51 ;9600 baud rate ( Fosc = 8 MHz)
STS UBRR0L,R16
RET
USART0TRANS:
LDS R19, UCSR0A ; đọc thanh ghi UCSR0A
SBRS R19,UDRE0
RJMP USART0TRANS ; chờ UDRE0=1
STS UDR0, DATA ; ghi data vào UDR0 để truyền đi
RET
USART1INIT:
LDI R16, (1<<TXEN1) ;cho phép phát USART1
STS UCSR1B,R16
LDI R16, (1<<UPM11) | (1<< UPM10) | (1<<USBS1)|
(1<<UCSZ11) | (1<<UCSZ10)
STS UCSR1C, R16 ;8 bit data, parity lẻ, 2 stop bit
LDI R16, 0x00
STS UBRR1H, R16
LDI R16, 12 ;baud rate =38.4K với Fosc = 8 MHz
STS UBRR1L,R16
RET
Ví dụ 4: Viết chương trình liên tục phát dữ liệu 9 bit ra cổng nối tiếp USART0 với bit phát
thứ 9 là LSB của R17 và 8 bit thấp dữ liệu là mã ASCII của ký tự A. Sử dụng USART 9
bit, 1 stop bit, không dùng bit kiểm tra chẵn lẻ, tốc độ baud 9600, tần số fosc = 8MHz,
CKDIV8 = 1.
INCLUDE <M324PADEF.INC>
.;bit thứ 9 = LSB (R17)
;byte thấp = R16
MAIN:
RCALL USART0INIT ;khởi tạo USART0
LDI R17,0x01 ;ví dụ bit phát thứ 9 = 1
LDI R16,'A’ ;phát mã ASCII ký tự 'A'
AGAIN:
RCALL TRANS9BIT ;gọi CTC phát 9 bit data
RJMP AGAIN
USART0INIT:
LDI R16, (1<<TXEN0)|(1<<RXEN0)|(1<<UCSZ02)
; 9 bit data, thu phát đồng thời
STS UCSR0B,R16
LDI R16,(1<<UCSZ01)|(1<<UCSZ00); 9 bit data
STS UCSR0C,R16 ;không parity, 1 stop bit
LDI R16,0x00
STS UBRR0H,R16
LDI R16,51 ;9600 baud rate với Fosc = 8 MHz
STS UBRR0L,R16
RET
Võ Thị Thu Hồng 28
Lập trình giao tiếp USART ATMEGA324P – Ví dụ 4 (tt)
TRANS9BIT:
LDS R18, UCSR0A đọc để xét cờ UDRE0 TRỐNG HAY KHÔNG
SBRS R18, UDRE0
RJMP TRANS9BIT ; đợi bộ đệm phát trống
; ghi bit0 của R17 vào bit TXB80 của thanh ghi UCSR0B
;Lưu ý copy bit phát thứ 9 từ R17 (bit LSB) vào TXB80 trước
khi nạp 8 bit thấp data vào UDR0
LDS R18,UCSR0B ; đọc thanh ghi UCSR0B
BST R17,0 ;cất bit R17(0) = vào cờ T
BLD R18,0 ;nạp cờ T vào bit R18(0) =TXB80
STS UCSR0B, R18
;Chép 8 bit thấp (R16) vào bộ đệm phát
STS UDR0,R16
RET
Võ Thị Thu Hồng 29
Lập trình giao tiếp USART ATMEGA324P – Nhận data từ cổng nối tiếp
Chương trình con nhận data (số bit từ 5 đến 8) từ cổng nối tiếp USART0
RECEIVE:
LDS R17, UCSR0A
SBRS R17,RXC0 ;kiểm tra cờ RXC0=1? (data sẵn sàng để đọc)
RJMP RECEIVE ;chờ nếu cờ RXC0=0
LDS R16, UDR0 ; lưu data vào R16
RET
Võ Thị Thu Hồng 30
Lập trình giao tiếp USART ATMEGA324P – Ví dụ 5
Ví dụ 5: Viết chương trình liên tục thu 1 byte dữ liệu từ cổng nối tiếp USART0 và xuất ra Port A. Biết
rằng bên phát sử dụng khung 8 bit dữ liệu, 1 stop bit, không dùng bit kiểm tra chẵn lẻ, tốc độ baud 9600,
tần số fosc = 8MHz, CKDIV8 = 1.
MAIN: USART0INIT:
LDI R21,0xFF LDI R16,(1<<RXEN0) ;cho phép thu
OUT DDRA,R21 ;Port A xuất STS UCSR0B,R16
RCALL USART0INIT LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ;8-bit data
AGAIN : STS UCSR0C,R16 ;không parity, 1 stop bit
RCALL RECEIVE LDI R16,0x00
OUT PORTA, R18 STS UBRR0H,R16
RJMP AGAIN LDI R16,51 ;9600 baud rate fosc=8MHz
STS UBRR0L,R16
RECEIVE: RET
LDS R17,UCSR0A
SBRS R17,RXC0 ;cờ RXC0=1? (data nhận đã sẵn sàng)
RJMP RECEIVE ;chờ nếu cờ RXC0=0
LDS R18,UDR0 ; đọc data vào R18
RET
Võ Thị Thu Hồng 31
Lập trình giao tiếp USART ATMEGA324P – Ví dụ 6
Ví dụ 6: Viết chương trình liên tục nhận data từ cổng nối tiếp USART0. Nếu data nhận được là chữ
thường từ a đến z thì đổi qua chữ in tương ứng và phát ngược lại. Biết bên phát sử dụng khung 8 bit dữ
liệu, 1 stop bit, không dùng bit kiểm tra chẵn lẻ, tốc độ baud 9600, tần số fosc = 8MHz, CKDIV8 = 1.
MAIN:
RCALL USART0INIT ; khởi tạo USART0
AGAIN:
RCALL RECEIVE ; đọc data từ cổng nối tiếp vào (thanh ghi R16)
CPI R16, ‘a’ ;so sánh data thu được với mã ASCII của ký tự ‘a’
BRCC GR_EQ ;cờ C = 0 → dữ liệu ≥ ‘a’ thì chuyển đến GR_EQ
RJMP AGAIN
GR_EQ:
CPI R16,'z'+1 ;so sánh dữ liệu thu được với mã ASCII của ký tự ‘z’ + 1
BRCS LOWCASE ;cờ C = 1 → dữ liệu < ‘z’ + 1(từ a đến z)
RJMP AGAIN
LOWCASE: ; đổi từ chữ thường sang chữ in
SUBI R16,0x20 ; chữ in = chữ thường – 20H
MOV R18,R16 ;chuẩn bị dữ liệu chép vào UDR0 phát
RCALL TRANSMIT
RJMP AGAIN
Võ Thị Thu Hồng 32
Lập trình giao tiếp USART ATMEGA324P – Ví dụ 6(tt)
USART0INIT:
LDI R16,(1<<TXEN0)|(1<<RXEN0) ;cho phép phát/thu
STS UCSR0B,R16
LDI R16, (1<<UCSZ01)|(1<<UCSZ00) ;8-bit data
STS UCSR0C, R16 ;không parity, 1 stop bit
LDI R16,51 ;baudrate=9600, fosc=8MHz
STS UBRR0L,R16
RET