MỤC TIÊU: Hiểu và sử dụng được các ngoại vi UART, I2C, SPI Hiểu cách giao tiếp với RTC, EEPROM b Kết nối dây USB-Serial vào kit thí nghiệm c Setup chương trình Hercules với baudrate 9
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN- ĐIỆN TỬ
BÁO CÁO THÍ NGHIỆM VI XỬ LÝ
LAB 3
NHÓM 5 - L03 GVHD: Nguyễn Phan Hải Phú
Trang 2MỤC TIÊU:
Hiểu và sử dụng được các ngoại vi UART, I2C, SPI
Hiểu cách giao tiếp với RTC, EEPROM
b) Kết nối dây USB-Serial vào kit thí nghiệm
c) Setup chương trình Hercules với baudrate 9600, 8 bit data, no parity, 1 stop, no handshake.
d) Sử dụng các ví dụ mẫu trong tài liệu thí nghiệm, viết chương trình khởi động UART0 với các thông số như trên, chờ nhận một byte từ UART0 và phát ngược lại UART0.
e) Dùng Hercules truyền một ký tự xuống kit và quan sát các dữ liệu nhận được để kiểm tra hoạt động chương trình.
Trang 3LDI R16, 6; 8 BIT KHONG XET CHAN LE , 1 STOP BIT
STS UCSR0C,R16 ; 1 STOP BIT KHONG XET CHAN LE
LDI R16,HIGH (RAMEND)
OUT SPH,R16 ; SET STACK
LDI R16, LOW (RAMEND)
SBRS R16,UDRE0 ; KIEM TRA CO TRONG KHONG
RJMP PHAT ; NEU CHUA TRONG THI TIEP TUC KIEM TRA LAI
Trang 4STS UDR0,R18 ; KHI TRONG THI CHEP DU LIEU VAO UDR0
c) Biên dịch chương trình và quan sát LCD để kiểm tra chương trình.
.DEF REG_FLAG=R19 ;REG_FLAG chứa các cờ báo
.DEF COUNT=R20 ;biế4n đế4m
.DEF NUM_MAX=R21 ;biế4n đặt giá trị MAX
.DEF NUM_MIN=R22 ;biế4n đặt giá trị MIN
Trang 5.DEF POS_CRS=R23 ;biế4n đặt vị trí con tro@ hiế@n thị
.EQU LCD=PORTA ;PORTA hiế@n thị
.EQU E=2 ;bit E
.EQU SCL=0 ;ký hiệu chân SCL
.EQU SDA=1 ;ký hiệu chân SDA
.EQU SW1=0 ;ký hiệu chân SW1
.EQU SW2=1 ;ký hiệu chân SW2
.EQU STO=7 ;bit cho phép OSC RTC
.EQU VBATEN=3 ;bit cho phép nguồBn dự phòng
.EQU NULL=$00 ;mã kế4t thúc chuồRi ký tự
.EQU CTL_BYTE=0B11011110 ;byte điếBu khiế@n truy xuâ4t
CBI CONT_DR,SW1 ;chân SW1 input
SBI CONT,SW1 ;điện trở@ kéo lến chân SW1
CBI CONT_DR,SW2 ;chân SW2 input
SBI CONT,SW2 ;điện trở@ kéo lến chân SW2
LDI R17,$30 ;mã lệnh=$30 lâBn 1,RS=RW=E=0
RCALL OUT_LCD4 ;ctc ghi ra LCD
LDI R18,$28 ;Function set 2 dòng font 5x8,mode 4 bit
LDI R19,$01 ;Clear display
LDI R20,$0C ;display on,con tro@ off
LDI R21,$06 ;Entry mode set dịch pha@i con tro@,DDRAM tăng 1 đ/c
Trang 6LDI R17,$80 ;con tro@ bă4t đâBu ở@ đâBu dòng 1
RCALL CURS_POS ;xuâ4t lệnh ra LCD
LDI ZH,HIGH(MSG1<<1);Z tro@ địa chỉ@ đâBu ba@ng MSG1 trong Flash ROM
LDI ZL,LOW(MSG1<<1)
RCALL MSG_DISP ;ghi MSG1 ra LCD
LDI R17,$C0 ;con tro@ bă4t đâBu ở@ đâBu dòng 2
RCALL CURS_POS ;xuâ4t lệnh ra LCD
LDI ZH,HIGH(MSG2<<1);Z tro@ đâBu ba@ng tra MSG2
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xuâ4t ghi RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X07 ;địa chỉ@ thanh ghi Control
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xuâ4t ghi RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X00 ;địa chỉ@ thanh ghi 0x00
RCALL TWI_WRITE
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X01);truy xuâ4t đọc RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+R
Trang 7LDI R17,$0C ;xóa con tro@
LDI R17,$84 ;con tro@ bă4t đâBu ở@ dòng 1 vị trí thứ
RCALL CURS_POS ;xuâ4t lệnh ra LCD
LDI R17,$86 ;con tro@ bă4t đâBu ở@ dòng 1 vị trí giờ
RCALL CURS_POS ;xuâ4t lệnh ra LCD
DISP_NXT1:
LD R17,-X ;lâ4y data
CPI COUNT,1 ;data=sec
BRNE D_NXT ;khác,hiế@n thị tiế4p
CBR R17,(1<<STO) ;xóa bit ST
LDI XH,HIGH(RTC_BUF+4);X tro@ buffer RTC ngày
LDI XL,LOW(RTC_BUF+4)
LDI COUNT,3
LDI R17,$C6 ;con tro@ bă4t đâBu ở@ dòng 2 vị trí ngày
RCALL CURS_POS ;xuâ4t lệnh ra LCD
Trang 8RJMP DISP_NXT2
; -
;Đặt lại RTC
; - SW_CHK:
RCALL GET_SW ;đọc SW chờ SW nhâ4n
CPI COUNT,0 ;cài đặt thứ?
BRNE HR_CHK ;khác,kiế@m tra giờ
LDI XH,HIGH(RTC_BUF+3);X tro@ buffer RTC thứ
LDI XL,LOW(RTC_BUF+3)
LDI NUM_MAX,7
LDI NUM_MIN,1
LDI POS_CRS,$84 ;đặt con tro@ vị trí thứ
RCALL SET_NUM ;đặt và hiế@n thị thứ
CPI COUNT,1 ;cài đặt giờ?
BRNE MI_CHK ;khác,kiế@m tra phút
LDI XH,HIGH(RTC_BUF+2);X tro@ buffer RTC giờ
CPI COUNT,2 ;cài đặt phút?
BRNE SEC_CHK ;khác,kiế@m tra giây
LDI XH,HIGH(RTC_BUF+1);X tro@ buffer RTC phút
CPI COUNT,3 ;cài đặt giây?
BRNE DAT_CHK ;kiế@m tra ngày
LDI XH,HIGH(RTC_BUF);X tro@ buffer RTC giây
Trang 9RJMP RTC_SET
DAT_CHK:
CPI COUNT,4 ;cài đặt ngày?
BRNE MO_CHK ;khác,kiế@m tra tháng
LDI XH,HIGH(RTC_BUF+4);X tro@ buffer RTC ngày
CPI COUNT,5 ;cài đặt tháng?
BRNE YEA_CHK ;khác,kiế@m tra năm
LDI XH,HIGH(RTC_BUF+5);X tro@ buffer RTC tháng
CPI COUNT,6 ;cài đặt năm?
BRNE EXIT_CHK ;khác,thoát
LDI XH,HIGH(RTC_BUF+6);X tro@ buffer RTC năm
LDI COUNT,7 ;lưu vào RTCC
LDI XH,HIGH(RTC_BUF);X tro@ buffer RTC
LDI XL,LOW(RTC_BUF)
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xuâ4t ghi RTC
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X00 ;địa chỉ@ thanh ghi giây
RCALL TWI_WRITE ;ghi địa chỉ@ TCCR
;GET_SW đọc trạng thái SW1,SW2 có chồ4ng rung
;Tra@ vếB mã SW1=1 hoặc mã SW2=2 và cờ SW_FLG=1 nế4u có SW nhâ4n
;Tra@ vếB cờ SW_FLG=0 nế4u khồng có SW nhâ4n
;Sư@ dụng R16,R17,cờ SW_FLG thuộc thanh ghi FLAG_REG
; - GET_SW:
CBR REG_FLAG,(1<<SW_FLG);xóa cờ báo nhâ4n SW
BACK0:
LDI R16,50 ;kiế@m tra SW nhâ4n 50 lâBn liến tục
WAIT0:
Trang 10IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2);che bit SW1,SW2
CPI R17,(1<<SW1)|(1<<SW2);kiế@m tra SW nhâ4n?
BREQ EXIT_SW ;khồng nhâ4n thoát
DEC R16 ;có nhâ4n tiế4p tục
CPI R17,(1<<SW2) ;SW1=0 nhâ4n,SW2=1 khồng nhâ4n
BRNE SW2_CODE ;khồng pha@i kiế@m tra mã SW2
LDI R17,1 ;gán giá trị mã SW1
RJMP SET_FLG ;báo cờ nhâ4n SW
SW2_CODE:
CPI R17,(1<<SW1) ;SW2=0 nhâ4n,SW1=1 khồng nhâ4n
BRNE EXIT_SW ;khồng pha@i thoát
;SET_NUM cài đặt các giá trị thời gian chọn qua biế4n COUNT
;Nhâ4n/nha@ SW1 thoát
;Nhâ4n/nha@ SW2 cài đặt giá trị
;Sư@ dụng R17,R18,ctc CURS_POS,GET_SW
; - SET_NUM:
MOV R17,POS_CRS ;đặt vị trí con tro@ đúng vị trí cài đặt
CPI COUNT,3 ;cài đặt giây?
BRNE DAY_CHK ;khác,kiế@m tra ngày
CBR R17,(1<<STO) ;đúng,xóa bit ST
RJMP PRESET ;tiế4n hành đặt
DAY_CHK:
CPI COUNT,0 ;cài đặt ngày?
BRNE PRESET ;khác,tiế4n hành đặt
ANDI R17,0X07 ;lọc lâ4y data ngày
PRESET:
INC R17 ;tăng giá trị thếm 1
MOV R18,R17 ;câ4t giá trị đặt
ANDI R17,$0F ;che lâ4y 4 bit thâ4p
CPI R17,$0A ;giá trị<10
Trang 11CP R17,NUM_MAX ;so sánh giới hạn MAX
BRCS DISP ;nho@ hởn,hiế@n thị
BREQ DISP ;bằng,hiế@n thị
MOV R17,NUM_MIN ;lớn hởn,tra@ vếB giới hạn MIN
DISP: ST X,R17 ;câ4t sồ4 BCD đặt vào buffer
RCALL NUM_DISP ;hiế@n thị sồ4 BCD đặt
PUSH R17 ;câ4t data
SWAP R17 ;hoán vị 4 bitthâ4p/cao
ANDI R17,0X0F ;che lâ4y sồ4 BCD cao
ORI R17,0X30 ;chuyế@n sang mã ASCII
ANDI R17,0X0F ;che lâ4y sồ4 BCD thâ4p
ORI R17,0X30 ;chuyế@n sang mã ASCII
;MSG_DISP hiế@n thị chuồRi ký tự kế4t thúc bằng mã NULL đặt trong Flash ROM
;Input: Z chứa địa chỉ@ đâBu chuồRi ký tự
;Output: hiế@n thị chuồRi ký tự ra LCD tại vị trí con tro@ hiện hành
;Sư@ dụng R16,R17,ctc DELAY_US,OUT_LCD
; -
MSG_DISP:
LPM R17,Z+ ;lâ4y mã ASCII ký tự từ Flash ROM
CPI R17,NULL ;kiế@m tra ký tự kế4t thúc
BREQ EXIT_MSG ;ký tự NULL thoát
LDI R16,1 ;chờ 100μsxR16 s
RCALL DELAY_US
SBI LCD,RS ;RS=1 ghi data hiế@n thị LCD
RCALL OUT_LCD ;ghi mã ASCII ký tự ra LCD
RJMP MSG_DISP ;tiế4p tục hiế@n thị ký tự
Trang 12RCALL OUT_LCD
RET
; -
;INIT_LCD4 khở@i động LCD ghi 4 byte mã lệnh theo giao tiế4p 4 bit
;Function set:R18=$28 2 dòng font 5x8 giao tiế4p 4 bit
;Clear display:R19=$01 xóa màn hình
;Display on/off LCDrol:R20=$0C màn hình on,con tro@ off
;Entry mode set:R21=$06 dịch pha@i con tro@ ,đ/c DDRAM tăng 1 khi ghi data
;RS=bit0=0,RW=bit1=0
; -
INIT_LCD4:
CBI LCD,RS ;RS=0: ghi lệnh
MOV R17,R18 ;R18=Function set
RCALL OUT_LCD ;ghi 1 byte data ra LCD
MOV R17,R19 ;R19=Clear display
;OUT_LCD4 ghi mã lệnh/data ra LCD
;Input: R17 chứa mã lệnh/data 4 bit cao
;OUT_LCD ghi 1 byte mã lệnh/data ra LCD
;chia làm 2 lâBn ghi 4bit
;Input: R17 chứa mã lệnh/data,R16
;bit RS=0/1:lệnh/data,bit RW=0:ghi
SWAP R17 ;đa@o 4 bit
ANDI R17,$F0 ;lâ4y 4 bit thâ4p chuyế@n thành cao
Trang 13;DELAY_US tạo thời gian trếR =R16x100μsxR16 s(Fosc=8Mhz)
;Input:R16 hệ sồ4 nhân thời gian trếR 1 đế4n 255
Trang 14b) Kết nối các tín hiệu UART như ở bài 1.
c) Viết chương trình nhận 1 giá trị từ UART và xuất ra Bar Led sử dụng SPI.
Trang 15OUT SPCR0, R16 ; Enable, master, MSB first
LDI R16,(1<<SPI2X0) ; SCK=FOSC/16
LDI R16,(1<<UCSZ01)|(1<<UCSZ00) ;8-bit data
STS UCSR0C,R16 ;khồng parity, 1 stop bit
b) Kết nối các tín hiệu UART như ở bài 1.
c) Kết nối 1 port vào Bar LED.
Trang 16d) Viết chương trình đếm số ký tự nhận được từ UART và xuất ra Bar Led, cứ mỗi lần có 1 byte nhận được, số đếm tăng lên 1 và được ghi vào EEPROM Khi vi xử lý mất điện và
có lại, số đếm được đọc ra từ EEPROM và lấy làm giá trị bắt đầu.
.EQU SPI_WR=$02 ;mã l?nh ghi b? nh?
.EQU MEM_BYTE3=0X00 ;??a ch? b? nh? byte 3 bit 23-16
.EQU MEM_BYTE2=0X01 ;??a ch? b? nh? byte 2 bit 15-8
.EQU MEM_BYTE1=0X00 ;??a ch? b? nh? byte 1 bit 7-0
Trang 17USART_INIT:
LDI R16, $00
STS UBRR0H, R16
LDI R16, 51
STS UBRR0L, R16 ; SET BAUD = 9600 , VI DU 1
LDI R16, (1<<RXEN0) ; CHO PHEP THU DU LIEU
LDI R16,SPI_RD ;mã l?nh ghi b? nh?
CBI PORTB,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE3 ;n?p ??a ch? byte 3 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE2 ;n?p ??a ch? byte 2 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE1 ;n?p ??a ch? byte 1 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,$FF ;dump data ?? nh?n
RCALL SPI_TRANS ;truy?n SPI
SBI PORTB,SS ;k?t thúc truy?n SPI
MOV R20,R17 ;d? li?u c?t vào R20
RET
;XÓA TRANG C?A EEPROM
EEPROM_ERASE:
LDI R16,WREN ;mã l?nh cho phép ghi b? nh?
CBI SPI_PORT,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
SBI PORTB,SS ;SS=1 ch?t l?nh cho phép ghi
LDI R16,PE ;mã l?nh xóa trang b? nh?
CBI PORTB,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE3 ;n?p ??a ch? byte 3 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE2 ;n?p ??a ch? byte 2 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE1 ;n?p ??a ch? byte 1 b? nh?
RCALL SPI_TRANS ;truy?n SPI
SBI SPI_PORT,SS ;k?t thúc truy?n SPI
WR_FIN: ;??c thanh ghi STATUS ki?m tra bit WIP=0 báo b? nh? r?i
LDI R16,RDSR ;mã l?nh ??c thanh ghi STATUS
CBI SPI_PORT,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
Trang 18SBRC R17,WIP ;bit WIP=0 b? nh? r?i
RJMP WR_FIN ;bit WIP=1 b? nh? b?n,ch? ti?p
SBI SPI_PORT,SS ;k?t thúc truy?n SPI
RET
;GHI S? TRONG THANH GHI R19 RA ??A CHI 0X001000 TRONG EEPROM
EEPROM_WRITE:
LDI R16,WREN ;mã l?nh cho phép ghi b? nh?
CBI SPI_PORT,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
SBI PORTB,SS ;SS=1 ch?t l?nh cho phép ghi
LDI R16,SPI_WR ;mã l?nh ghi b? nh?
CBI PORTB,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE3 ;n?p ??a ch? byte 3 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE2 ;n?p ??a ch? byte 2 b? nh?
RCALL SPI_TRANS ;truy?n SPI
LDI R16,MEM_BYTE1 ;n?p ??a ch? byte 1 b? nh?
RCALL SPI_TRANS ;truy?n SPI
MOV R16,R19
RCALL SPI_TRANS
SBI SPI_PORT,SS ;k?t thúc truy?n SPI
WR_FIN0: ;??c thanh ghi STATUS ki?m tra bit WIP=0 báo b? nh? r?i
LDI R16,RDSR ;mã l?nh ??c thanh ghi STATUS
CBI SPI_PORT,SS ;cho phép truy?n SPI
RCALL SPI_TRANS ;truy?n SPI
SBRC R17,WIP ;bit WIP=0 b? nh? r?i
RJMP WR_FIN0 ;bit WIP=1 b? nh? b?n,ch? ti?p
SBI SPI_PORT,SS ;k?t thúc truy?n SPI
OUT SPCR0, R16 ; Enable, master, MSB first
LDI R16,(1<<SPI2X0) ; SCK=FOSC/8
Trang 19AGAIN: SBIS TIFR0,TOV0
a) Kết nối các tín hiệu UART như ở bài 1.
b) Kết nối 1 port vào Bar LED.
c) Viết chương trình đếm số ký tự nhận được từ UART và xuất ra Bar Led, cứ mỗi lần có 1 byte nhận được, số đếm tăng lên 1 và được ghi vào EEPROM nội của AVR Khi vi xử lý mất điện và có lại, số đếm được đọc ra từ EEPROM nội và lấy làm giá trị bắt đầu.
CLR COUNTER ; CLR BIEN DEM
LDI R16,0XFF ; SET UP DDRA
STS UBRR0L, R16 ; SET BAUD = 9600 , VI DU 1
LDI R16, (1<<RXEN0) ; CHO PHEP THU DU LIEU
Trang 20OUT EEARH, R21 ; DAY DIA CHI EEPROM HIGH
OUT EEARL, R20 ; DAY DIA CHI EEPROM LOW
OUT EEDR, COUNTER ; DOC GIA TRI R18 VE THANH GHI DATA
SBI EECR, EEMPE ; BIT CHO PHEP GHI DU LIEU MOI VAO EEPROM
SBI EECR, EEPE ; BIT CHO PHEP GHI DU LIEU MOI VAO EEPROM , THIET LAP CHE DO HOAT DONG XONG
RCALL DELAY_5MS ;DELAY 5MS
RET
READ_FROM_EEPROM:
WAIT_READ:
SBIC EECR, EEPE ;CHO ENALBE = 0
RJMP WAIT_READ ; TIEP TUC CHO
OUT EEARH, R21 ; LUU DIA CHI BO NHO EEPROM
OUT EEARL, R20 ; LUU DIA CHI BO NHO EEPROM
SBI EECR, EERE ; CHO PHEP DOC EERE = 1
IN COUNTER, EEDR ;LUU DU LIEU DATA VE R18
Trang 21BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
BÀI 1
1 Trả lời các câu hỏi
a Với tần số là 8Mhz, baudrate thực tế sẽ sai lệch với mong muốn là 9600 như thế nào?
TL:0.2%
b Cờ UDRE dùng để làm gì?
TL: dùng để báo bộ đệm phát trống hay không để ghi dữ liệu UDRE = 1 – bộ đệm phát trống
UDRE = 0 – bộ đệm phát đang còn dữ liệu
c Sự khác nhau giữa hardware UART và software UART (bit-banging UART) TL: Hardware UART và software UART (hay bit-banging UART) là hai phương pháp để giao tiếp qua UART (Universal Asynchronous
Receiver/Transmitter).
Hardware UART được tích hợp sẵn trong vi điều khiển hoặc một số chip điều khiển khác Nó hoạt động với tốc độ cao và có độ chính xác cao hơn Hardware UART sử dụng các phần cứng riêng biệt để xử lý dữ liệu đầu vào/đầu ra, điều khiển đồng bộ dữ liệu và đồng bộ với tốc độ baudrate đã được thiết lập Điều này giúp giảm thiểu tối đa các lỗi trong quá trình truyền dữ liệu.
Software UART hay bit-banging UART là một phương pháp được thực hiện thông qua phần mềm trên vi điều khiển, thường được sử dụng trong các vi điều khiển không tích hợp sẵn UART hoặc khi cần tùy chỉnh độ phức tạp của giao tiếp UART Software UART sử dụng các chân IO của vi điều khiển để tạo tín hiệu UART và đọc các tín hiệu vào để phân tích dữ liệu Phương pháp này đòi hỏi nhiều xử lý phần mềm hơn, do đó thường yêu cầu thời gian xử lý cao hơn và có
độ chính xác thấp hơn so với hardware UART.
d Chân TxD0 và chân RxD0 của UART0 là chân port nào?
Trang 22BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
TxD0 -PD1 RxD0-PD0
e Atmega324 có bao nhiêu phần cứng UART?
;init UART 0
;CPU clock is 8MhzUSART_Init:
; Set baud rate to 9600 bps with 8 MHz clock ldi r16, 51
sts UBRR0L, r16
;set double speed ldi r16, (0 << U2X0) sts UCSR0A, r16 ; Set frame format: 8 data bits, no parity, 1 stop bit ldi r16, (1 << UCSZ01) | (1 << UCSZ00)
sts UCSR0C, r16 ; Enable transmitter and receiver ldi r16, (1 << RXEN0) | (1 << TXEN0) sts UCSR0B, r16
ret
;send out 1 byte in r16USART_SendChar:
push r17 ; Wait for the transmitter to be ready USART_SendChar_Wait:
lds r17, UCSR0A
Trang 23BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
sbrs r17, UDRE0 ;check USART Data Register Empty bit rjmp USART_SendChar_Wait
sts UDR0, r16 ;send out
pop r17 ret
;receive 1 byte in r16USART_ReceiveChar:
push r17 ; Wait for the transmitter to be ready USART_ReceiveChar_Wait:
lds r17, UCSR0A sbrs r17, RXC0 ;check USART Receive Complete bit rjmp USART_ReceiveChar_Wait
lds r16, UDR0 ;get data
pop r17 ret
BÀI 2
1 Trả lời các câu hỏi
a Các chân SCL, SDA là chân nào của AVR?
SCL – PC0 SDA – PC1
b Vẽ hình mô tả kết nối trong bài thí nghiệm