You are on page 1of 37

Cổng nối tiếp ATmega324P

Phần 1

Võ Thị Thu Hồng 1


Truyền song song và truyền nối tiếp

Võ Thị Thu Hồng 2


Truyền nối tiếp đồng bộ và bất đồng bộ
Đồng bộ : phát và thu đều có clk

Không đồng bộ: xét theo tốc độ code

Võ Thị Thu Hồng 3


đồng bộ và bất đồng bộ
Đặc điểm USART ATmega324P
▪ 2 USART: USART0 và USART1. Ký hiệu là USARTn, với n = 0, 1.
▪ Giao tiếp song công toàn phần (full duplex) (thu và phát độc lập nhau).
▪ Giao tiếp nối tiếp bất đồng bộ và đồng bộ.
▪ Giao tiếp nối tiếp đồng bộ Master – Slave.
▪ Tốc độ truyền thông (baud rate) thay đổi được.
▪ Các khung truyền nối tiếp với 5, 6, 7, 8, hoặc 9 bit dữ liệu và 1 hoặc 2 stop bit.
▪ Khối tạo bit kiểm tra chẵn lẻ (bên phát) và khối kiểm tra lỗi bit này (bên thu) bằng
phần cứng.
▪ Phát hiện chồng chập dữ liệu (Data OverRun).
▪ Phát hiện lỗi khung truyền (Frame Error).
▪ Khối lọc nhiễu gồm khối phát hiện lỗi start bit và bộ lọc số thông thấp.
▪ 3 ngắt: phát USARTn_TX hoàn thành, bộ đệm phát USARTn_UDRE rỗng, thu
USARTn_ RX hoàn thành.
▪ Chế độ truyền thông đa xử lý (Multi-processor).
▪ Chế độ tăng gấp đôi tốc độ baud khi truyền nối tiếp bất đồng bộ.

Võ Thị Thu Hồng 4


Giao thức truyền nối tiếp
đơn công: một đường, mộ chiều
ATmega324P có 3 giao thức nối tiếp gồm
bán công: theo 1 đường nhất định trong 1 khoảng thời gian USART (USART0 và USART1), SPI và TWI
(tương đương với giao thức I2C).
▪ Chân XCK0/XCK1: phát xung clock
(master) hoặc nhận xung clock (slave) khi
truyền nối tiếp đồng bộ.
▪ Các chân /SS, MOSI, MISO, SCK: tín hiệu
trong giao thức SPI.
▪ Các chân RXD0/TXD0, RXD1/TXD1:
thu/nhận (trên chân RXD) và truyền/phát
(trên chân TXD) khi truyền nối tiếp bất
đồng bộ
ATmega324P hỗ trợ truyền thông song công toàn phần
▪ SCL, SDA: các tín hiệu trong giao thức
(full duplex) cho phép phát và thu dữ liệu cùng lúc.
TWI.

Võ Thị Thu Hồng 5


Sơ đồ khối thu phát nối tiếp ATmega324P

Data Bus AVR

Võ Thị Thu Hồng 6


Các thanh ghi USART ATmega324P
Không dùng được lệnh IN/OUT do đây là IO mở rộng
=> STS, LDS, ...

3 thanh ghi điều


khiển

Võ Thị Thu Hồng 7


Khối tạo Baudrate

Lập trình sao cho tốc


dộ bên phát và thu
bằng nhau
Bộ Mux nên nếu U2X
=0 THÌ QUA CỔNG 0

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
𝟏𝟔 𝐱 𝐓ố𝐜 độ𝑩𝒂𝒖𝒅

Võ Thị Thu Hồng 8


Thanh ghi định Baudrate (UBRRn: USART Baudrate Register )

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õ Thị Thu Hồng 9


Tính giá trị nạp thanh ghi UBRR theo Baudrate

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)

Võ Thị Thu Hồng 10


Bảng giá trị nạp UBRR theo Baudrate

Võ Thị Thu Hồng 11


Thanh ghi điều khiển và trạng thái A (UCSRnA:USART Control and Status Register A)

Bit 7 – RXCn: USART Receive Complete


Cờ RXCn =1 khi bộ thu đầy (data sẵn sàng để đọc). Cờ RXCn bị xóa về 0 bằng phần cứng khi bộ đệm thu
trống (sau khi đọc thanh ghi xong UDRn). Dùng để tạo ra tín hiệu ngắt thu khi khai báo ngắt.
Bit 6 – TXCn: USART Transmit Complete
Cờ TXCn=1 khi truyền xong 1 frame . Cờ TXCn được xóa tự động bằng phần cứng khi chương trình ngắt phát
được thực thi (giả sử đã cho phép các bit ngắt tương ứng), hoặc cờ TXCn có thể được xóa bằng cách ghi 1 vào
vị trí của bit này. Dùng để tạo ra tín hiệu ngắt phát khi khai báo ngắt.
Bit 5 – UDREn: USART Data Register Empty
Cờ UDREn = 1 khi bộ đệm phát đang trống và sẵn sàng nhận dữ liệu mới. UDREn được tự động xóa khi ghi
dữ liệu mới vào thanh ghi UDRn. Khi cho phép ngắt toàn cục I = 1 và bit UDRIEn = 1, cờ UDREn = 1 sẽ tạo ra
tín hiệu ngắt thanh ghi dữ liệu trống (data register empty interrupt).Khi reset hệ thống, UDREn = 1( bộ đệm phát
trống).
Bit 4 – FEn: Frame Error
FEn = 1 nếu ký tự tiếp theo trong bộ đệm thu bị lỗi khung truyền. Khung truyền bị lỗi nếu stop bit đầu tiên là 0.
Võ Thị Thu Hồng 12
Thanh ghi điều khiển và trạng thái A (UCSRnA:USART Control and Status Register A) (tt)

Bit 3 – DORn: Data OverRun


DORn = 1 nếu bộ đệm thu đầy và 1 ký tự mới đang chờ trong thanh ghi dịch thu (Receive Shift Register) và xuất
hiện start bit của ký tự mới. DORn =0 khi bộ đệm thu (UDRn) được đọc. Đặt DORn = 0 khi khởi tạo UCSRnA.
Bit 2 – UPEn: USART Parity Error
UPEn = 1 nếu ký tự tiếp theo trong bộ đệm thu có lỗi kiểm tra chẵn lẻ (nếu kích hoạt kiểm tra chẵn lẻ qua
UPMn[1:0] trong thanh ghi UCSRnC). Bit này giữ giá trị cho đến khi bộ đệm thu (UDRn) được đọc. Đặt UPEn = 0
khi khởi tạo thanh ghi UCSRnA.
Bit 1 – U2Xn: Double the USART Transmission Speed
Chỉ có tác dụng khi truyền nối tiếp bất đồng bộ/đồng bộ. U2Xn=0 khi truyền SPI. thì tốc độ baud tăng gấp đôi so với
U2Xn = 0 (với cùng fosc và giá trị nạp cho thanh ghi UBRRn). Khi U2Xn = 1, bộ thu chỉ sử dụng 8 mẫu (thay vì 16
mẫu) cho việc lấy mẫu dữ liệu và khôi phục xung clock. Trong trường hợp này phải sử dụng tốc độ baud và tần số
xung clock hệ thống có độ chính xác cao.
Bit 0 – MPCMn: Multi-processor Communication Mode
Cho phép chế độ truyền thông đa xử lý. Khi MPCMn = 1, các khung truyền đến MCU slave mà không chứa thông tin
địa chỉ sẽ được MCU slave bỏ qua. Khi MCU slave đã nhận đúng địa chỉ, MCU slave xóa MPCMn. MCU master
không bị ảnh hưởng bởi bit MPCMn.
Võ Thị Thu Hồng 13
Khối truyền nhận USART

Võ Thị Thu Hồng 14


Thanh ghi điều khiển và trạng thái B (UCSRnB:USART Control and Status Register B)

Bit 7 – RXCIEn: RX Complete Interrupt Enable


RXCIEn =1 cho phép ngắt thu USART hoàn thành (USART Receive Complete Interrupt). Ngắt thu USART
chỉ xảy ra nếu RXCIEn = 1, bit ngắt toàn cục I = 1 và cờ RXCn =1(UCSRnA).
Bit 6 – TXCIEn: TX Complete Interrupt Enable
TXCIE = 1 cho phép ngắt phát USART hoàn thành (USART Transmit Complete Interrupt). Ngắt phát
USART chỉ xảy ra nếu TXCIEn = 1, bit ngắt toàn cục I = 1 và cờ TXCn=1 (UCSRnA ).
Bit 5 – UDRIEn: USART Data Register Empty Interrupt Enable
UDRIEn = 1 cho phép ngắt bộ đệm phát USART trống (USART Data Register Empty Interrupt). Ngắt bộ
đệm phát USART chỉ xảy ra nếu UDRIEn = 1, bit ngắt toàn cục I = 1 và cờ UDREn =1 (UCSRnA).
Bit 4 – RXENn: Receiver Enable
RXENn = 1 cho phép thu. Khi RXENn = 0 thì việc không cho phép bộ thu sẽ có tác dụng ngay lập tức. Dữ
liệu đang được thu sẽ bị mất. Bộ đệm thu xem như trống. Các cờ FEn, DORn và PEn không có tác dụng.
Võ Thị Thu Hồng 15
Thanh ghi điều khiển và trạng thái B (UCSRnB:USART Control and Status Register B) (tt)

Bit 3 – TXENn: Transmitter Enable


TXENn = 1 cho phép phát. Quá trình phát chỉ vô hiệu sau khi dữ liệu trong thanh ghi dịch phát và
bộ đệm phát được phát hoàn toàn ra đường truyền TxD.
Bit 2 – UCSZn2: Character Size
UCSZn2 kết hợp với 2 bit UCSZn1 và UCSZn0 (thanh ghi UCSRnC) quy định độ dài của dữ liệu
phát/thu (kích thước ký tự), từ 5 bit đến 9 bit.
Bit 1 – RXB8n: Receive Data Bit 8
Bit dữ liệu thu 8 (hay bit thu thứ 9) trong chế độ phát/thu 9 bit. Nội dung bit thu thứ 9 phải được đọc
từ bit RXB8n trước khi đọc các bit dữ liệu thấp trong bộ đệm thu UDRn.
Bit 0 – TXB8n: Transmit Data Bit 8
Bit dữ liệu phát 8 (hay bit phát thứ 9) trong chế độ phát/thu 9 bit. Nội dung bit phát thứ 9 phải được
ghi vào bit TXB8n trước khi ghi các bit dữ liệu thấp vào bộ đệm phát UDRn.

Võ Thị Thu Hồng 16


Thanh ghi điều khiển và trạng thái C (UCSRnC:USART Control and Status Register C)

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ẻ.

Võ Thị Thu Hồng 17


Thanh ghi điều khiển và trạng thái C (UCSRnC:USART Control and Status Register C) (tt)

Bit 3 – USBSn: Stop Bit Select


USBSn = 0, số stop bit là . USBSn = 1, số stop bit là 2. Bộ thu sẽ bỏ qua stop bit trong quá trình thu.

Bit 2:1 – UCSZn[1:0]: Character Size Bit 0 – UCPOLn: Clock Polarity


Dùng trong chế độ truyền nối tiếp đồng bộ. Nếu dùng chế độ
truyền nối tiếp bất đồng bộ thì UCPOLn = 0.

Võ Thị Thu Hồng 18


Đệm: chứa dữ liệu phát hoặc thu
Thanh ghi UDRn (UDRn:USART Data Register)

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.

Võ Thị Thu Hồng 19


Lập trình giao tiếp USART ATMEGA324P – Khởi tạo USART
Khởi tạo USART
1. Thiết lập tốc độ baud.
2. Định dạng khung truyền (start bit, số bit data, bit kiểm tra chẵn lẻ, stop bit).
3. Chế độ phát hay thu hay thu phát đồng thời.
USART0INIT:
Ví dụ 1: Chương trình con LDI R16, (1<<TXEN0) ;cho phép bộ phát USART0
khởi tạo USART0, cho phép STS UCSR0B, R16
LDI R16,(1<<UCSZ01) | (1<<UCSZ00) ;8-bit data
phát. Khung dữ liệu 8 bit
STS UCSR0C, R16 ;không sử dụng kiểm tra chẵn lẻ,
data,1 stop bit. Baudrate9600. ;1 bit dừng (1 stop bit)
Fosc= 8MHz (CKDIV8 = 1) LDI R16,0x00
STS UBRR0H, R16
LDI R16,51 ;baud rate = 9600 ứng với Fosc = 8 MHz
STS UBRR0L,R16
RET

Võ Thị Thu Hồng 20


Lập trình giao tiếp USART ATMEGA324P – Truyền data ra cổng nối tiếp

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

Võ Thị Thu Hồng 21


Lập trình giao tiếp USART ATMEGA324P –Ví dụ 2
Ví dụ 2: Viết chương trình phát liên tục chuỗi “YES” ra cổng nối tiếp USART0, truyền 8 bit dữ
liệu, 1 stop bit, không kiểm tra chẵn lẻ, tốc độ baud 9600, tần số fosc = 8MHz, CKDIV8 =1.

.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

Võ Thị Thu Hồng 23


Lập trình giao tiếp USART ATMEGA324P –Ví dụ 2 (tt)

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

Võ Thị Thu Hồng 24


Lập trình giao tiếp USART ATMEGA324P – Ví dụ 3
Ví dụ 3: Viết chương trình phát liên tục chuỗi “VI XU LY ” ra cổng nối tiếp USART1. Sử dụng khung
truyền 8 bit dữ liệu, 2 stop bit, bit kiểm tra lẻ, tốc độ baud 38.4K, tần số fosc = 8MHz, CKDIV8 = 1.

.EQU COUNT = 6 ;số ký tự truyền


.DEF DATA= R18 ;R18 chứa data phát
RCALL USART1INIT
MAIN:
LDI ZL, LOW(TRANSTAB << 1)
LDI ZH, HIGH(TRANSTAB << 1)
LDI R20, COUNT
LOOP:
LPM DATA, Z+ ; lấy data từ bảng TRANSTAB
RCALL USART1TRANS ; CT con truyền
DEC R20
USART1TRANS: ; chương trình con truyền
BRNE LOOP
LDS R17,UCSR1A
RJMP MAIN SBRS R17,UDRE1
TRANSTAB: .DB “VI XU LY “ RJMP USART1TRANS
STS UDR1, DATA
RET
Võ Thị Thu Hồng 25
Lập trình giao tiếp USART ATMEGA324P – Ví dụ 3 (tt)

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õ Thị Thu Hồng 26


Lập trình giao tiếp USART ATMEGA324P – Ví dụ 4

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

Võ Thị Thu Hồng 27


Lập trình giao tiếp USART ATMEGA324P – Ví dụ 4 (tt)

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)

Chương trình con khởi tạo USART0


;

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

Võ Thị Thu Hồng 33


Lập trình giao tiếp USART ATMEGA324P – Ví dụ 6(tt)

;Chương trình con phát ký tự ;Chương trình con thu ký tự


TRANSMIT: RECEIVE:
LDS R17,UCSR0A LDS R17,UCSR0A
SBRS R17,UDRE0 ;cờ UDRE0=1: bộ đệm phát trống SBRS R17,RXC0 ;cờ RXC0=1?
RJMP TRANSMIT ;chờ cờ UDRE0=1 RJMP RECEIVE ;chờ cờ RXC0=1
STS UDR0,R18 ;phát ký tự LDS R16,UDR0 ;thu ký tự
RET RET
Võ Thị Thu Hồng 34
Lập trình giao tiếp USART ATMEGA324P – Ví dụ 7
Ví dụ 7: Viết chương trình liên tục thu dữ liệu 9 bit từ cổng nối tiếp USART0. Nếu bit thứ 9 của dữ liệu thu
được là 0 thì xuất 8 bit thấp dữ liệu ra PortA, ngược lại xuất 8 bit thấp dữ liệu ra PortB. 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.
MAIN:
LDI R21,0xFF
OUT DDRA,R21 ;Port A xuất
OUT DDRB,R21 ;Port B xuất
RCALL USART0INIT ;khởi tạo USART0
AGAIN:
RCALL RECEIVE9BIT ;gọi CTC thu 9 bit data
SBRC R17,0 ; xét bit thứ 9 chứa trong bit 0 của R17
RJMP BIT1
OUT PORTA,R16 ;bit thứ 9 = 0: xuất 8 bit dữ liệu ra Port A
RJMP AGAIN
BIT1:
OUT PORTB,R16 ;bit thứ 9 = 1: xuất 8 bit dữ liệu ra Port B
RJMP AGAIN

Võ Thị Thu Hồng 35


Lập trình giao tiếp USART ATMEGA324P – Ví dụ 7 (tt)

USART_INIT: ;LSB của R17 lưu bit thứ 9


LDI R16,(1<<TXEN0)|(1<<RXEN0)|(1<<UCSZ02) ;R16 lưu byte thấp
; 9 bit data, thu phát đồng thời RECEIVE9BIT:
STS UCSR0B, R16 LDS R17,UCSR0A
LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ; 9 bit data SBRS R17,RXC0 ;cờ RXC0=1: thu xong
STS UCSR0C, R16 ;không parity, 1 stop bit RJMP RECEIVE9BIT ;chờ cờ RXC0=1
LDI R16,0x00 LDS R17, UCSR0B ;đọc bit data thứ 9
STS UBRR0H,R16 LDS R16, UDR0 ; lưu 8 bit data thấp vào R16
LDI R16,51 ;9600 baud rate với Fosc = 8 MHz LSR R17 ;dịch phải lấy bit data thứ 9
STS UBRR0L,R16 ANDI R17,0x01 ;lọc lấy bit data thứ 9 cất vào R17
RET EXIT: RET

Võ Thị Thu Hồng 36


Lập trình giao tiếp USART ATMEGA324P – Ví dụ 7 (tt)
;LSB của R17 lưu bit thứ 9
;R16 lưu byte thấp
RECEIVE9BIT:
LDS R17,UCSR0A
SBRS R17,RXC0 ;cờ RXC0=1: thu xong
RJMP RECEIVE9BIT ;chờ cờ RXC0=1 Có thể kiểm tra các lỗi khi thu data:
LDS R18, UCSR0A ;đọc các bit trạng thái lỗi frame (FE : Frame Error), lỗi
LDS R17, UCSR0B ;đọc bit data thứ 9 chồng chập data (DOR: Data
LDS R16, UDR0 ; lưu 8 bit data thấp vào R16 Overrun), lỗi kiểm tra chẵn lẻ (PE:
ANDI R18, (1<<FE0)|(1<<DOR0)|(1<<UPE0) Parity Error) bằng các dòng lệnh bên
;kiểm tra các bit trạng thái
BREQ NOERROR ;bằng 0: không lỗi
LDI R17,HIGH(-1) ;khác 0: báo lỗi R17=$FF
LDI R16,LOW(-1) ;R16=$FF
RJMP EXIT
NOERROR:
LSR R17 ;dịch phải lấy bit data thứ 9
ANDI R17,0x01 ;lọc lấy bit data thứ 9 cất vào R17
EXIT: RET
Võ Thị Thu Hồng 37

You might also like