Báo cáo thí nghiệm môn Vi xử lý Lab 3: Serial Port + RTC + EEPROM

Báo cáo thí nghiệm môn Vi xử lý Lab 3: Serial Port + RTC + EEPROM của Đại học Bách khoa Thành phố Hồ Chí Minh với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!

LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
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
THAM KHẢO:
Tài liệu hướng dẫn thí nghiệm, chương 7, 9, 11
Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf
BÀI 1
a) Kết nối chân TxD và RxD của UART0 vào vào tín hiệu
UART_TxD0 (PD1) và UART_RxD0 (PD0) trên header J85 ở
khối UART.
b) Kết nối dây USB-Serial vào kit thí nghiệm Setup chương trình
Hercules với baudrate 9600, 8 bit data, no parity, 1 stop, no
handshake.
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
no parity => UPM (1,0) = (0,0)
1 stop => USBS = 0
c) 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.
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
d) 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.
(Lưu ý: tần số xung clock cho CPU trên kit thí nghiệm là 8Mhz)
BÀI 2
a) Kết nối các tín hiệu SDA (PC1) và SCL (PC0) của AVR vào các tín hiệu tương ứng
trên module RTC. Kết nối 1 chân port vào tín hiệu MFP (). Kết nối LCD 16x2 vào
1 port của AVR
b) Viết chương trình con khởi động RTC với thời gian hiện hành, cấu hình xung MFP
tần số 1Hz. Sau đó cứ mỗi cạnh lên của MFP, đọc các giá trị ngày tháng năm giờ
phút giây của RTC và cập nhật lên LCD
LCD : PORTA hiển thị
SW1 : PIND0 - điều
khiển SW2 : PIND1 -
điều khiển SCL : PC0
SDA : PC1
.DEF
REG_FLAG=R1
9
;REG_FLAG ch?a các c? bá
o
.DEF
COUNT=R20
;bi?n ??
.DEF
NUM_MAX=R2
1
;bi?n ??t giá tr? MA
X
.DEF
NUM_MIN=R22
;bi?n ??t giá tr? MIN
.DEF
POS_CRS=R23
?
;bi?n ??t v? trí con tr? hi?n th
.EQU
LCD=PORTA
;PORTA hi?n th
?
.EQU
LCD_DR=DDRA
.EQU
CONT=PORTD
;PORTD ?i?u khi?n
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
.EQU CONT_DR=DDRD ;
.EQU CONT_IN=PIND ;
.EQU SW_FLG=0
.EQU RS=0 ;bit RS
.EQU RW=1 ;bit RW
.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?n d? phòng
.EQU NULL=$00 ;mã k?t thúc chu?i ký t?
.EQU CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t
.EQU RTC_BUF=0X200
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN: LDI R16,HIGH(RAMEND) ;??a stack lên vùng ?/c cao
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0XFF
OUT LCD_DR,R16
LDI R16,0X00
OUT LCD,R16
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 R16,250 ;delay 25ms
RCALL
DELAY_US
;ctc delay 100?sxR16
LDI
R16,250
;delay 25ms
RCALL
DELAY_US
;ctc delay 100?sxR16
CBI
LCD,RS
;RS=0 ghi l?nh
LDI
R17,$30
;mã l?nh=$30 l?n 1,RS=RW=E=0
RCALL
OUT_LCD4
;ctc ghi ra LCD
LDI
R16,42
;delay 4.2ms
RCALL
DELAY_US
CBI
LCD,RS
LDI
R17,$30
;mã l?nh=$30 l?n 2
RCALL
OUT_LCD4
LDI
R16,2
;delay 200?s
RCALL
DELAY_U
S
CBI
LCD,R
S
;---------------------------------------------------------
;??t bit SQWEN=1,RS2:0=000 cho dao ??ng 1Hz
;xu?t ra chân MFP
;---------------------------------------------------------
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+W
RCALL
TWI_WRITE
LDI
R17,0B01000000
;MFP xu?t xung 1Hz
RCALL
TWI_WRIT
E
TWI_STO
P
LDI R17,0X07 ;??a ch? thanh ghi Control
RCALL
RCALL
RCALL
LDI XH,HIGH(RTC_BUF+3);X tr? buffer RTC th?
LDI XL,LOW(RTC_BUF+3)
LDI
R17,$84
;con tr? b?t ??u ? dòng 1 v? trí th?
SBI
LCD,RS
RCALL
CURS_POS
;xu?t l?nh ra LCD
LD
R17,X
;l?y data th?
ANDI
R17,0X07
LDI
R18,0X30
;chuy?n sang mã ASCII
ADD
R17,R18
SBI
LCD,RS
LDI
R16,1
;ch? 100?s
RCALL
DELAY_US
RCALL
OUT_LCD
;hi?n th? ra LCD
LDI
R17,0X20
;mã d?u tr?ng
DISP_NXT2:
LD
R17,X+
RCALL
NUM_DISP
DEC
COUNT
BREQ
SW_CHK
LDI
R17,'/'
SBI
LCD,RS
LDI
R16,1
;ch? 100?s
RCALL
DELAY_US
RCALL
OUT_LCD
;hi?n th? ra LCD
RJMP DISP_NXT2
;------------------------------------------------------------------
;-----------------------------------------------------------------;??t
l?i RTC
MI_CHK:
CPI COUNT,2 ;cài ??t phút?
BRNE SEC_CHK ;khác,ki?m tra giây
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
LDI XH,HIGH(RTC_BUF+1);X tr? buffer RTC phút
LDI XL,LOW(RTC_BUF+1)
LDI NUM_MAX,0X59
LDI NUM_MIN,0
LDI POS_CRS,$89 ;??t con tr? v? trí phút
RCALL SET_NUM
RJMP RTC_SET
SEC_CHK:
BRNE EXIT_CHK ;khác,thoát
LDI XH,HIGH(RTC_BUF+6);X tr? buffer RTC n?m
LDI XL,LOW(RTC_BUF+6)
LDI NUM_MAX,0X99
;-----------------------------------------------------
EXIT_CHK:
LDI NUM_MIN,1
LDI POS_CRS,$CC ;con tr? v? trí n?m
RCALL SET_NUM
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
RJMP RTC_SET
;----------------------------------------------------;L?u
các giá tr? cài ??t vào RTCC
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
LDI COUNT,7 ;l?u vào RTCC
LDI XH,HIGH(RTC_BUF);X tr? buffer RTC
LDI XL,LOW(RTC_BUF)
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X00 ;??a ch? thanh ghi giây RCALL
TWI_WRITE ;ghi ??a ch? TCCR WR_RTC:
LD R17,X+
RCALL TWI_WRITE ;ghi TCCR
BRNE
SW2_CODE
;không ph?i ki?m tra mã SW2
DEC COUNT
BRNE WR_RTC
RCALL TWI_STOP
RJMP START1
;------------------------------------------------------
;GET_SW ??c tr?ng thái SW1,SW2 có ch?ng rung
;Tr? v? mã SW1=1 ho?c mã SW2=2 và c? SW_FLG=1 n?u có SW nh?n
;Tr? v? c? SW_FLG=0 n?u không có SW nh?n
;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?n SW BACK0:
LDI R16,50 ;ki?m tra SW nh?n 50 l?n liên t?c
WAIT0:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2);che bit SW1,SW2 CPI
R17,(1<<SW1)|(1<<SW2);ki?m tra SW nh?n?
BREQ EXIT_SW ;không nh?n thoát
DEC R16 ;có nh?n ti?p t?c
BRNE
WAIT0 ;
PUSH
BACK1:
R17 ;c?t mã SW
LDI
WAIT1:
R16,50 ;ki?m tra sw nh? 50 l?n liên t?c
IN
R17,CONT_IN
ANDI
R17,(1<<SW1)|(1<<SW2)
CPI
R17,(1<<SW1)|(1<<SW2)
BRNE
BACK1 ;ch? nh? SW
DEC
R16
BRNE
WAIT1
POP
R17 ;ph?c h?i mã SW
CPI
R17,(1<<SW2) ;SW1=0 nh?n,SW2=1 không nh?n
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
LDI R17,1 ;gán giá tr? mã SW1
RJMP SET_FLG ;báo c? nh?n SW
SW2_CODE:
CPI R17,(1<<SW1) ;SW2=0 nh?n,SW1=1 không nh?n
BRNE EXIT_SW ;không ph?i thoát LDI R17,2 ;gán giá
tr? mã SW2
SET_FLG:
SBR REG_FLAG,(1<<SW_FLG);??t c? báo nh?n SW EXIT_SW:
RET
;----------------------------------------------------------------
NON_CR:
;SET_NUM cài ??t các giá tr? th?i gian ch?n qua bi?n COUNT
;Nh?n/nh? SW1 thoát
;Nh?n/nh? 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 tr? ?úng v? trí cài ??t
RCALL CURS_POS
SW_CHK1:
RCALL GET_SW ;??c SW
SBRS REG_FLAG,SW_FLG;có SW nh?n
RJMP SW_CHK1 ;ch? nh?n SW CPI R17,1 ;SW1 nh?n?
BREQ EXIT_NUM ;?úng,thoát
CPI R17,2 ;SW2 nh?n?
BRNE SW_CHK1 ;khác,??c l?i SW
LD R17,X ;n?p giá 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
DAY_CHK:
PRESET
;ti?n hành ??t
CPI
COUNT,0
;cài ??t ngày?
BRNE
PRESET
;khác,ti?n hành ??t
ANDI
PRESET:
R17,0X07
;l?c l?y data ngày
INC
R17
;t?ng giá tr? thêm 1
MOV
R18,R17
;c?t giá tr? ??t
ANDI
R17,$0F
;che l?y 4 bit th?p
CPI
R17,$0A
;giá tr?<10
BRCS
NON_CR
;?úng,không tràn
LDI
R17,$06
;hi?u ?ính BCD
ADD
R18,R17
;Input: Z ch?a ??a ch? ??u chu?i ký t?
;Output: hi?n th? chu?i ký t? ra LCD t?i v? trí con tr? hi?n hành
;S? d?ng R16,R17,ctc DELAY_US,OUT_LCD
;------------------------------------------------------------------
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
MSG_DISP:
LPM
R17,Z+
;l?y mã ASCII ký t? t? Flash ROM
CPI
R17,NULL
;ki?m tra ký t? k?t thúc
BREQ
EXIT_MSG
;ký t? NULL thoát
LDI
R16,1
;ch? 100?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?p t?c hi?n th? ký t?
EXIT_MSG:
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
RET
;----------------------------------------------------------
;CURS_POS ??t con tr? t?i v? trí có ??a ch? trong R17
;Input: R17=$80 -$8F dòng 1,$C0-$CF dòng 2 ;
R17= ??a ch? v? trí con tr?
;S? d?ng R16,ctc DELAY_US,OUT_LCD
;----------------------------------------------------------
CURS_POS:
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
CBI LCD,RS ;RS=0 ghi l?nh
RCALL OUT_LCD
RET
;-----------------------------------------------------------------
;INIT_LCD4 kh?i ??ng LCD ghi 4 byte mã l?nh theo giao ti?p 4 bit
;Function set:R18=$28 2 dòng font 5x8 giao ti?p 4 bit
;Clear display:R19=$01 xóa màn hình
;Display on/off LCDrol:R20=$0C màn hình on,con tr? off
;OUT_LCD ghi 1 byte mã l?nh/data ra LCD
;Entry mode set:R21=$06 d?ch ph?i con tr? ,?/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
RCALL OUT_LCD
LDI R16,20 ;ch? 2ms sau l?nh Clear display
RCALL DELAY_US
MOV R17,R20 ;R20=Display LCDrol on/off
RCALL OUT_LCD
MOV R17,R21 ;R21=Entry mode set
RCALL OUT_LCD
RET
;--------------------------------------------------
;OUT_LCD4 ghi mã l?nh/data ra LCD
;Input: R17 ch?a mã l?nh/data 4 bit cao ;-------------------------------------------
-------
OUT_LCD4:
OUT LCD,R17
SBI LCD,E
CBI LCD,E
RET
;------------------------------------------------------
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
STS
TWBR,R17
R15,R16 ;1MC n?p data cho R15
L1:MOV
R14,R16
;1MC n?p data cho R14
L2:DEC
R14
;1MC
NOP
;1MC
BRNE
L2
;2/1MC
DEC
R15
;1MC
BRNE
L1
;2/1MC
RET
;4MC
;---------------------------------------------------------
;TWI_INIT kh?i ??ng c?ng TWI
;??t t?c ?? tuy?n=100Khz
;---------------------------------------------------------
TWI_INIT:
LDI R17,8 ;t?c ?? truy?n SCL=100Khz
LDS R17,TWCR
RET
;--------------------------------------------------
TWI_NAK:
LDI R17,(1<<TWEN)|(1<<TWINT);cho phép TWI,xóa TWINT,tr? NAK
RET
;----------------------------------------------------------
TWI_STOP:
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
STS TWCR,R17
WAIT_NAK:
LDS R17,TWCR ;ch? c? TWINT=1 báo truy?n xong
SBRS R17,TWINT
RJMP WAIT_NAK
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
LDI R17,(1<<TWEN)|(1<<TWSTO)|(1<<TWINT);TWINT,STOP
STS TWCR,R17
RET
;---------------------------------------------------------
.ORG 0X200
MSG1: .DB "THU ",$00
MSG2: .DB "NGAY ",$00
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
BÀI 3
a) Kết nối các tín hiệu MOSI(PB5), SCK(PB7) của port SPI từ AVR đến tín hiệu SDI
và CLK của khối thanh ghi dịch. Kết nối 2 chân port khác vào tín hiệu nCLR và
LATCH. Kết nối ngõ ra của thanh ghi dịch vào Bar LED
b) 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.
.EQU SPI_PORT=PORTB
.EQU SPI_PORT_DDR=DDRB
.EQU SS=4
.EQU MOSI=5
.EQU MISO=6
.EQU SCK=7
.ORG 0
RCALL SPI_INIT
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
RCALL SETUART
LOOP:
LDS R17,UCSR0A
SBRS R17,RXC0
;cờ RXC0=1: thu xong
RJMP LOOP
;chờ cờ RXC0=1
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
CBI SPI_PORT,SS ; tạo clk clear
LDS R18,UDR0
RCALL SPI_TRANS
SBI SPI_PORT,SS ; tạo clk set
RJMP LOOP
SPI_INIT:
LDI R16,(1<<SS)|(1<<MOSI)|(1<<MISO)|(1<<SCK)
OUT SPI_PORT_DDR, R16 ; Output pins
LDI R16,(1<<SPE0)|(1<<MSTR0)|(1<<SPR00)
OUT SPCR0, R16 ; Enable, master, MSB first
LDI R16,(1<<SPI2X0) ; SCK=FOSC/16
STS SPSR0,R16
RET
SPI_TRANS:
OUT SPDR0,R18 ;ghi data ra SPI
WAIT_SPI:
IN R16,SPSR0 ; SPIF0
SBRS R16,SPIF0 ;cờ SPIF0=1 truyền SPI xong
RJMP WAIT_SPI ;chờ cờ SPIF0=1
IN R17,SPDR0
RET
SETUART:
LDI R16,(1<<RXEN0) ;cho phép thu
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=8MHz
STS UBRR0L,R16
RET
BÀI 4
a) Kết nối các tín hiệu MOSI, MISO, SCK của port SPI từ AVR các tín hiệu tương ứng trên
header J80. Kết nối 1 chân port khác vào tín hiệu nCS. Khối EEPROM
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
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
d) 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
.EQU
SPI_PORT=PORTB
.EQU
SPI_PORT_DDR=DDRB
.EQU
SS=
4
.EQU
5
MOSI=
.EQU
MISO=
6
.EQU
SCK=
7
.EQU
WIP=0
.EQU
PE=
$
42
.EQU
WREN=
$
06
.EQU
WRDI=
$
04
.EQU
RDSR=
$
05
.EQU
WRSR=
$
01
.EQU
SPI_RD=
$
03
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
.org 0
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
rjmp ioset
lOMoARcPSD| 36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
.org $40
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
ioset:
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
ldi r16,0xff
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
out ddra,r16
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
ldi r16,0
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
out porta,r16
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
stack
:
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
ldi r16,high(ramend)
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
out sph,r16
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
ldi r16,low(ramend)
out spl,r16
set_uart:
ldi r16,16
sts ucsr0b,r16
ldi r16,6
sts ucsr0c,r16
ldi r16,0
sts ubrr0h,r16
ldi r16,51
sts ubrr0l,r16
set_spi:
ldi r16,240
out ddrb,r16
sbi portb,4
sbi portb,6
ldi r16,0x51
out spcr0,r16
ldi r16,1
sts spsr0,r16
main:
ldi r18,0
rcall EEPROM_READ
start:
rcall uart_receive
inc r18
out porta,r18
RCALL EEPROM_ERASE
rcall eeprom_write
rjmp start
uart_receive:
lds r17,ucsr0a
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
sbrs r17,rxc0
rjmp uart_receive
lds r19,udr0
re
t
spi_trans:
out spdr0,r16
trans:
in r20,spsr0
sbrs r20,spif0
rjmp trans
in r21,spdr0
re
t
EEPROM_WRITE:
CBI SPI_PORT,SS
LDI R16,WREN
RCALL SPI_TRANS
SBI SPI_PORT,SS
CBI SPI_PORT,SS
LDI R16,0x02
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
MOV R16,R18
RCALL SPI_TRANS
SBI SPI_PORT,SS
WR_FIN:
LDI R16,RDSR
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBRC R21,WIP
RJMP WR_FIN
SBI SPI_PORT,SS
RET
EEPROM_ERASE:
LDI R16,WREN
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBI PORTB,SS
LDI R16,PE
CBI PORTB,SS
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS SBI
SPI_PORT,SS
eraser_FIN:
LDI R16,RDSR
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBRC R21,WIP
RJMP eraser_FIN
SBI SPI_PORT,SS
RET
EEPROM_READ:
LDI R16,SPI_RD CBI
PORTB,SS
RCALL SPI_TRANS
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,$FF
RCALL SPI_TRANS
SBI PORTB,SS
MOV R18,R21
RET
BÀI 5
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.
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
RCALL WRITE_TO_EEPROM
RCALL READ_FROM_EEPROM
OUT PORTA, COUNTER
RCALL USART_RECEIVER_CHAR
INC COUNTER ; TANG BIEN DEM
RJMP START
USART_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
STS UCSR0B, R16
LDI R16, (1<<UCSZ01)|(1<<UCSZ00) ; 8 BIT KHONG CHAN LE 1 STOP BIT STS UCSR0C, R16
RET
USART_RECEIVER_CHAR:
PUSH R17 ; CAT R17
WAIT_UART_RECEIVE:
LDS R17, UCSR0A
SBRS R17, RXC0 ; CHO CO RXC0 = 1
RJMP WAIT_UART_RECEIVE
LDS R19, UDR0
POP R17 ; LAY R17 RET
WRITE_TO_EEPROM:
WAIT_ENABLE_WRITE:
SBIC EECR, EEPE ; CHO ENABLE = 0
RJMP WAIT_ENABLE_WRITE
OUT EEARH, R21 ; DAY DIA CHI EEPROM HIGH
OUT EEARL, R20 ; DAY DIA CHI EEPROM LOW
.DEF
8
COUNTER = R1
.ORG
0
MAIN:
K
; SET STAC
LDI
R16, HIGH(RAMEND)
OUT
SPH, R1
6
LDI
W(RAMEND)
R16, LO
OUT
SPL, R16
CLR
COUNTER
; CLR BIEN DEM
LDI
R16,0XFF
A
; SET UP DDR
OUT
6
DDRA, R1
LDI
R20,
$
0
1
LDI
R21,
$
0
0
RCALL
USART_INI
T
START
:
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
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
RET
DELAY_5MS: ; CHUONG TRINH CON DELAY 5MS
LDI R20, 5
LP2:
LDI R21, 250
LP1:
NO
P
C
DE
R2
1
BR
NE
L
P
1
DE
C
R2
0
BR
NE
LP
2
RET
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
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?
Baudrate = 9600 = [2^(U2X).FOSC ]/[16.(UBRR+1)]
- UBRR=51.083 (U2X=0)
- Giá trị nạp vào UBRR = 51
- baudrate thực tế = [2^(U2X).FOSC ]/[16.(UBRR+1)]
=[2^(0).8000000]/[16.(51+1)] = 9615.38
- sai số = 0.16%
b. Cờ UDRE dùng để làm gì?
Cờ UDRE dùng để thông báo khi bộ đệm phát UDR trống (UDRE=1)
hay cần ghi dữ liệu vào thanh ghi này (UDRE=0)
c. Sự khác nhau giữa hardware UART và software UART (bit-banging UART)
hardware UART
software UART
Tốc độ truyền thông cao và
đáng tin cậy
Không tốn nhiều tài
nguyên CPU
Cần có 1 số chân đặc biệt
để kết nối linh kiện khác
Không linh hoạt trong cấu
hình và điều khiển
Tốc độ truyền thông
chậm hơn và không
đáng tin cậy
Tốn nhiều tài nguyên
CPU hơn
Không cần có 1 số chân
đặc biệt để kết nối linh
kiện khác
Linh hoạt trong cấu hình
và điều khiển
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
Sử dụng 1 bộ đếm thời gian để đạt
baudrate mong muốn
Xử lí tín hiệu độc lập với
CPU
Sử dụng các phép tính toán
của CPU để tạo ra tín hiệu
UART
d. Chân TxD0 và chân RxD0 của UART0 là chân port nào? TxD0 là chân PD1
RxD0 là chân PD0
e. Atmega324 có bao nhiêu phần cứng UART?
Atmega324 có 2 phần cứng UART USART0 và USART1
2. Mã nguồn chương trình với chú thích
call USART_Init
start:
call USART_ReceiveChar
call USART_SendChar
rjmp start
;init UART 0
;CPU clock is 8Mhz
USART_Init:
; Set baud rate to 9600 bps with 8 MHz clock
ldi r16, 51
sts UBRR0L, r16
;set double speed
;ldi r16, (1 << 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)
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
sts UCSR0B, r16
ret
;send out 1 byte in r16
USART_SendChar:
push r17
; Wait for the transmitter to be ready
USART_SendChar_Wait:
lds r17, UCSR0A
sbrs r17, UDRE0 ;check USART Data Register Empty bit
rjmp USART_SendChar_Wait
sts UDR0, r16 ;send out
pop r17
ret
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
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:PC1; SDA:PC0
Các chân SCL, SDA là các chân của giao tiếp I2C, được sử dụng để truyền
dữ liệu và tín hiệu đồng bộ giữa các thiết bị. Trên vi điều khiển AVR
ATmega324PA, các chân SCL và SDA được định nghĩa như sau:
- SCL: chân PC1
- SDA: chân PC0
Kết quả nhận được:
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
b. Vẽ hình mô tả kết nối trong bài thí nghiệm
2. Mã nguồn và chú thích
.DEF REG_FLAG=R19 ;REG_FLAG ch?a các c? báo
.DEF COUNT=R20 ;bi?n ??m
.DEF NUM_MAX=R21 ;bi?n ??t giá tr? MAX .DEF
NUM_MIN=R22 ;bi?n ??t giá tr? MIN
.DEF POS_CRS=R23 ;bi?n ??t v? trí con tr? hi?n th?
.EQU LCD=PORTA ;PORTA hi?n th?
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
.EQU LCD_DR=DDRA
.EQU
CONT=PORTD ;PORTD ?i?u khi?n
.EQU
CONT_DR=DDRD ;
.EQU
CONT_IN=PIND ;
.EQU
SW_FLG=0
.EQU
RS=0 ;bit RS
.EQU
RW=1 ;bit RW
.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?n d? phòng
.EQU
NULL=$00 ;mã k?t thúc chu?i ký t?
.EQU
CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t
.EQU
RTC_BUF=0X200
.ORG
0
RJMP
MAIN
.ORG
0X40
MAIN: LDI
R16,HIGH(RAMEND) ;??a stack lên vùng ?/c cao
OUT
SPH,R16
LDI
R16,LOW(RAMEND)
OUT
SPL,R16
LDI
R16,0XFF
OUT
LCD_DR,R16
LDI
R16,0X00
OUT
LCD,R16
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
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
R16,250 ;delay 25ms
RCALL
DELAY_US ;ctc delay 100?sxR16
LDI
R16,250 ;delay 25ms
RCALL
DELAY_US ;ctc delay 100?sxR16
CBI
LCD,RS ;RS=0 ghi l?nh
LDI
R17,$30 ;mã l?nh=$30 l?n 1,RS=RW=E=0
RCALL
OUT_LCD4 ;ctc ghi ra LCD
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
RCALL CURS_POS ;xu?t l?nh ra LCD
LDI ZH,HIGH(MSG2<<1);Z tr? ??u b?ng tra MSG2
LDI ZL,LOW(MSG2<<1)
RCALL MSG_DISP ;ghi MSG2 ra LCD
;--------------------------------------------------------
-
;??t bit SQWEN=1,RS2:0=000 cho dao ??ng 1Hz
;xu?t ra chân MFP
;--------------------------------------------------------
-
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X07 ;??a ch? thanh ghi Control
RCALL TWI_WRITE
LDI R17,0B01000000 ;MFP xu?t xung 1Hz
RCALL TWI_WRITE
RCALL TWI_STOP
;-------------------------------------------------------
-
;??c các thanh ghi 0x00-0x06 RTC
;--------------------------------------------------------
-
START1:
LDI XH,HIGH(RTC_BUF);X tr? ??u buffer RTC
LDI XL,LOW(RTC_BUF)
LDI COUNT,7
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
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?t ??c RTC_TCCR
RCALL TWI_WRITE ;ghi RTC+R
RTC_RD:
RCALL TWI_READ
ST X+,R17
DEC COUNT
BRNE RTC_RD
RCALL TWI_NAK
RCALL TWI_STOP
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
RCALL SET_NUM
RJMP RTC_SET
;-----------------------------------------------------
;L?u các giá tr? cài ??t vào RTCC
;-----------------------------------------------------
EXIT_CHK:
LDI COUNT,7 ;l?u vào RTCC
LDI XH,HIGH(RTC_BUF);X tr? buffer RTC LDI
XL,LOW(RTC_BUF)
RCALL TWI_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t ghi RTC
RCALL TWI_WRITE ;ghi RTC+W
LDI R17,0X00 ;??a ch? thanh ghi giây
RCALL TWI_WRITE ;ghi ??a ch? TCCR
WR_RTC:
LD R17,X+
RCALL TWI_WRITE ;ghi TCCR
DEC COUNT
BRNE WR_RTC
RCALL TWI_STOP
RJMP START1
;------------------------------------------------------
;GET_SW ??c tr?ng thái SW1,SW2 có ch?ng rung
;Tr? v? mã SW1=1 ho?c mã SW2=2 và c? SW_FLG=1 n?u có SW nh?n
;Tr? v? c? SW_FLG=0 n?u không có SW nh?n
;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?n SW BACK0:
LDI R16,50 ;ki?m tra SW nh?n 50 l?n liên t?c
WAIT0:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2);che bit SW1,SW2 CPI
R17,(1<<SW1)|(1<<SW2);ki?m tra SW nh?n?
BREQ EXIT_SW ;không nh?n thoát
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
DEC R16 ;có nh?n ti?p t?c
BRNE WAIT0 ;
PUSH R17 ;c?t mã SW
BACK1:
LDI R16,50 ;ki?m tra sw nh? 50 l?n liên t?c
WAIT1:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2)
CPI R17,(1<<SW1)|(1<<SW2)
BRNE BACK1 ;ch? nh? SW
DEC R16
BRNE WAIT1
POP R17 ;ph?c h?i mã SW
CPI R17,(1<<SW2) ;SW1=0 nh?n,SW2=1 không nh?n
BRNE SW2_CODE ;không ph?i ki?m tra mã SW2
LDI R17,1 ;gán giá tr? mã SW1
RJMP SET_FLG ;báo c? nh?n SW
SW2_CODE:
CPI R17,(1<<SW1) ;SW2=0 nh?n,SW1=1 không nh?n
BRNE EXIT_SW ;không ph?i thoát
LDI R17,2 ;gán giá tr? mã SW2
SET_FLG:
SBR REG_FLAG,(1<<SW_FLG);??t c? báo nh?n SW EXIT_SW:
RET
;----------------------------------------------------------------
;SET_NUM cài ??t các giá tr? th?i gian ch?n qua bi?n COUNT
;Nh?n/nh? SW1 thoát
;Nh?n/nh? 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 tr? ?úng v? trí cài ??t
RCALL CURS_POS
SW_CHK1:
RCALL GET_SW ;??c SW
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
SBRS REG_FLAG,SW_FLG;có SW nh?n
RJMP SW_CHK1 ;ch? nh?n SW CPI R17,1 ;SW1
nh?n?
BREQ EXIT_NUM ;?úng,thoát
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
LDI R16,1 ;ch? 100?s RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? giá tr?
POP R17 ;ph?c h?i data
ANDI R17,0X0F ;che l?y s? BCD th?p
ORI R17,0X30 ;chuy?n sang mã ASCII
SBI LCD,RS
LDI R16,1 ;ch? 100?s RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? giá tr? RET
;-----------------------------------------------------------------
;MSG_DISP hi?n th? chu?i ký t? k?t thúc b?ng mã NULL ??t trong Flash ROM
;Input: Z ch?a ??a ch? ??u chu?i ký t?
;Output: hi?n th? chu?i ký t? ra LCD t?i v? trí con tr? hi?n hành
;S? d?ng R16,R17,ctc DELAY_US,OUT_LCD
;------------------------------------------------------------------
MSG_DISP:
LPM R17,Z+ ;l?y mã ASCII ký t? t? Flash ROM
CPI R17,NULL ;ki?m tra ký t? k?t thúc
BREQ EXIT_MSG ;ký t? NULL thoát
LDI R16,1 ;ch? 100?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?p t?c hi?n th? ký t?
EXIT_MSG:
RET
;----------------------------------------------------------
;CURS_POS ??t con tr? t?i v? trí có ??a ch? trong R17
;Input: R17=$80 -$8F dòng 1,$C0-$CF dòng 2 ;
R17= ??a ch? v? trí con tr?
;S? d?ng R16,ctc DELAY_US,OUT_LCD
;----------------------------------------------------------
CURS_POS:
LDI R16,1 ;ch? 100?s
RCALL DELAY_US
CBI LCD,RS ;RS=0 ghi l?nh
RCALL OUT_LCD
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
RET
;-----------------------------------------------------------------
;INIT_LCD4 kh?i ??ng LCD ghi 4 byte mã l?nh theo giao ti?p 4 bit
;Function set:R18=$28 2 dòng font 5x8 giao ti?p 4 bit
;Clear display:R19=$01 xóa màn hình
;Display on/off LCDrol:R20=$0C màn hình on,con tr? off
;Entry mode set:R21=$06 d?ch ph?i con tr? ,?/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
RCALL OUT_LCD
LDI R16,20 ;ch? 2ms sau l?nh Clear display
RCALL DELAY_US
MOV R17,R20 ;R20=Display LCDrol on/off
RCALL OUT_LCD
MOV R17,R21 ;R21=Entry mode set
RCALL OUT_LCD
RET
;--------------------------------------------------
;OUT_LCD4 ghi mã l?nh/data ra LCD
;Input: R17 ch?a mã l?nh/data 4 bit cao ;-------------------------------------------------
-
OUT_LCD4:
OUT LCD,R17
SBI LCD,E
CBI LCD,E
RET
;------------------------------------------------------
;OUT_LCD ghi 1 byte mã l?nh/data ra LCD
;chia làm 2 l?n ghi 4bit
;Input: R17 ch?a mã l?nh/data,R16
;bit RS=0/1:l?nh/data,bit RW=0:ghi
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
;S?
d?ng ctc OUT_LCD4
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
BÀI 3
1. Trả lời các câu hỏi
a. Theo datasheet của 74HC595, tần số cao nhất của xung nhịp đưa vào 74595 là bao
nhiêu?
- Tần số clock cao nhất mà nó có thể hoạt động được là 55Mhz
b. Với clock là 8Mhz thì SPI của Atmega328 có tốc độ cao nhất là bao nhiêu?
- Tốc độ của SPI phụ thuộc vào tần số của xung clock và thời gian trễ của SPI.
Trên vi điều khiển Atmega328, thời gian trễ của SPI là 100 ns. Do đó, tốc độ cao nhất của SPI
là: fmax = clock / (2 * trễ) = 8 MHz / (2 * 100 ns) = 10 Mbps 2. Mã nguồn và chú
thích
;-------------------
-------------------------------
TWI_NAK:
LDI
R17,(1<<TWEN)|(1<<TWINT)
;cho phép TWI,xóa TWINT,tr? NAK
STS
TWCR,R17
:
WAIT_NAK
LDS
R17,TWCR
;ch? c? TWINT=1 báo truy?n xon
g
SBRS
R17,TWIN
T
RJ
MP
WAIT_NA
K
T
RE
------------------------
---------------
-----------
;--------
TOP:
TWI_S
LDI
R17,(1<<T
WEN)|(1<<TWSTO)|(1<<TWINT)
;cho phép TWI,xó
a
TWIN
T,STO
P
STS
TWCR,R17
RE
T
----------------------
;---------------------------
-------
-
.ORG
0
20
X
0
MSG1:
.DB
"THU ",
$
0
0
MSG2:
.DB
"NGAY "
,
$
0
0
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
BÀI 4
1. Trả lời các câu hỏi
a. Dung lượng của EEPROM 25AA1024 là bao nhiêu?
Dung lượng của EEPROM 25AA1024 là 128KB
b. Theo datasheet, tần số nhanh nhất của xung CK đưa vào
EEPROM này là bao nhiêu?
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
Theo datasheet, tần số nhanh nhất của xung CK đưa vào
EEPROM này để đảm bảo hoạt động ổn định của EEPROM là
20MHz
2. Mã nguồn và chú thích
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
ldi r16,low(ramend)
out spl,r16
set_uart:
ldi r16,16
sts ucsr0b,r16
ldi r16,6
sts ucsr0c,r16
ldi r16,0
sts ubrr0h,r16
ldi r16,51
sts ubrr0l,r16
set_spi:
ldi r16,240
out ddrb,r16
sbi portb,4
sbi portb,6
ldi r16,0x51
out spcr0,r16
ldi r16,1
sts spsr0,r16
main
:
ldi r18,0
rcall EEPROM_READ
start:
rcall uart_receive
inc r18
out porta,r18
RCALL EEPROM_ERASE
rcall eeprom_write
rjmp start
uart_receive:
lds r17,ucsr0
a
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
sbrs r17,rxc0
rjmp uart_receive
lds r19,udr0
ret
spi_trans:
out spdr0,r16
trans:
in r20,spsr0
sbrs r20,spif0
rjmp trans
in r21,spdr0
ret
EEPROM_WRITE:
CBI SPI_PORT,SS
LDI R16,WREN
RCALL SPI_TRANS
SBI SPI_PORT,SS
CBI SPI_PORT,SS
LDI R16,0x02
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
MOV R16,R18
RCALL SPI_TRANS
SBI SPI_PORT,SS
WR_FIN:
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
LDI R16,RDSR
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBRC R21,WIP
RJMP WR_FIN
SBI SPI_PORT,SS
RET
EEPROM_ERASE:
LDI R16,WREN
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBI PORTB,SS
LDI R16,PE
CBI PORTB,SS
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS SBI
SPI_PORT,SS
eraser_FIN:
LDI R16,RDSR
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBRC R21,WIP
RJMP eraser_FIN
SBI SPI_PORT,SS
RET
EEPROM_READ:
LDI R16,SPI_RD CBI
PORTB,SS
RCALL SPI_TRANS
LDI R16,0
lOMoARcPSD|36991220
LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,$FF
RCALL SPI_TRANS
SBI PORTB,SS
MOV R18,R21
RET
lOMoARcPSD|36991220
BÁO
Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử
BÀI 5
1. Trả lời các câu hỏi
a. Atmega324PA có dung lượng EEPROM là bao nhiêu?
- Atmega324PA có dung lượng EEPROM là 1024 byte, tương đương với 1 KB.
b. Liệt kê sự khác nhau giữa SRAM và EEPROM
c. Liệt
kêsự khác
nhau
giữaFlash và
EEPROM
SRAM
EEPROM
- là loại bộ nhớ tạm thời, có thể
đọc và ghi dữ liệu một cách nhanh
chóng.
- là loại bộ nhớ lưu trữ dữ liệu
trong thời gian dài, và có thể xóa
và ghi lại nhiều lần.
- là loại bộ nhớ volatile, có nghĩa là
nó sẽ mất điện khi nguồn cung cấp
bị ngắt. Do đó, nó thường được sử
dụng để lưu trữ dữ liệu tạm thời
hoặc bộ đệm.
- là loại bộ nhớ non-volatile, có thể
lưu trữ dữ liệu lâu dài mà không
cần nguồn cung cấp liên tục.
- thường có dung lượng nhỏ hơn
EEPROM và thường được sử dụng
để lưu trữ các biến tạm thời, các bộ
đệm hoặc các địa chỉ chỉ dùng một
lần.
- thường dung lượng lớn hơn và
được sử dụng để lưu trữ các giá trị
được lưu trữ lâu dài như cài đặt, dữ
liệu người dùng các thông số
khác.
- SRAM được sử dụng rộng rãi
trong các ứng dụng yêu cầu tốc độ
truy cập nhanh
- EEPROM được sử dụng rộng rãi
trong các ứng dụng yêu cầu lưu trữ
dữ liệu lâu dài và có thể xóa và ghi
lại nhiều lần.
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
c). Sự khác nhau giữa Flash và EEPROM
Flash
EEPROM
-Flash là một loại bộ nhớ
không xóa được, nghĩa là dữ
liệu có thể được ghi vào và
đọc từ nó nhiều lần, nhưng
không thể xóa bỏ một
-EEPROM là một loại bộ nhớ
có thể xóa được, cho phép lưu
trữ và truy xuất dữ liệu một
cách linh hoạt và tiết kiệm hơn
so với Flash.
cách độc lập một phần của
dữ liệu đã được ghi vào.
EEPROM được thiết kế để
lưu trữ các giá trị thay đổi
thường xuyên, chẳng hạn như
cấu hình dữ liệu của các
thiết bị.
- Mã nguồn và chú thích:
.DEF COUNTER = R18
.ORG 0
MAIN: ; SET STACK
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
CLR COUNTER ; CLR BIEN DEM
LDI R16,0XFF ; SET UP DDRA
OUT DDRA, R16
LDI R20, $01
LDI R21, $00
RCALL USART_INIT
START:
RCALL WRITE_TO_EEPROM
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
RCALL READ_FROM_EEPROM
OUT PORTA, COUNTER
RCALL USART_RECEIVER_CHAR
INC COUNTER ; TANG BIEN DEM
RJMP START
USART_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
STS UCSR0B, R16
LDI R16, (1<<UCSZ01)|(1<<UCSZ00) ; 8 BIT KHONG CHAN LE 1 STOP BIT
STS UCSR0C, R16
RET
USART_RECEIVER_CHAR:
PUSH R17 ; CAT R17
WAIT_UART_RECEIVE:
LDS R17, UCSR0A
SBRS R17, RXC0 ; CHO CO RXC0 = 1
RJMP WAIT_UART_RECEIVE
LDS R19, UDR0
POP R17 ; LAY R17
RET
WRITE_TO_EEPROM:
WAIT_ENABLE_WRITE:
SBIC EECR, EEPE ; CHO ENABLE = 0
RJMP WAIT_ENABLE_WRITE
OUT 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
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
LAP CHE DO HOAT DONG XONG
RCALL DELAY_5MS ;DELAY 5MS
RET
READ_FROM_EEPROM:
WAIT_READ:
SBIC EECR, EEPE ;CHO ENALBE = 0
lOMoARcPSD|36991220
BÁO
Nhóm:04
Nhóm môn Môn thí nghiệm:Vi xử
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 R1
8
RET
DELAY_
5
MS:
;
CHUONG TRINH CON DELAY 5MS
LDI
R20,
5
:
LP2
LDI
R21,
25
0
LP1
:
P
NO
DEC
1
R2
BRNE
L
P
1
DEC
R2
0
BRNE
LP
2
RET
-
Ảnh thực hành:
| 1/82

Preview text:

LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC 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 THAM KHẢO:
Tài liệu hướng dẫn thí nghiệm, chương 7, 9, 11
Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf BÀI 1
a) Kết nối chân TxD và RxD của UART0 vào vào tín hiệu
UART_TxD0 (PD1) và UART_RxD0 (PD0) trên header J85 ở khối UART.
b) Kết nối dây USB-Serial vào kit thí nghiệm Setup chương trình
Hercules với baudrate 9600, 8 bit data, no parity, 1 stop, no handshake. lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
no parity => UPM (1,0) = (0,0) 1 stop => USBS = 0
c) 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. lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
d) 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.
(Lưu ý: tần số xung clock cho CPU trên kit thí nghiệm là 8Mhz) BÀI 2
a) Kết nối các tín hiệu SDA (PC1) và SCL (PC0) của AVR vào các tín hiệu tương ứng
trên module RTC. Kết nối 1 chân port vào tín hiệu MFP (). Kết nối LCD 16x2 vào 1 port của AVR
b) Viết chương trình con khởi động RTC với thời gian hiện hành, cấu hình xung MFP
tần số 1Hz. Sau đó cứ mỗi cạnh lên của MFP, đọc các giá trị ngày tháng năm giờ
phút giây của RTC và cập nhật lên LCD LCD : PORTA – hiển thị SW1 : PIND0 - điều khiển SW2 : PIND1 - điều khiển SCL : PC0 SDA : PC1 .DEF REG_FLAG=R1 9 ;REG_FLAG ch?a các c? bá o .DEF COUNT=R20 ;bi?n ?? m .DEF NUM_MAX=R2 1 ;bi?n ??t giá tr? MA X .DEF NUM_MIN=R22 ;bi?n ??t giá tr? MIN .DEF POS_CRS=R23 ;bi?n ??t v? trí con tr? hi? ? n th .EQU LCD=PORTA ;PORTA hi?n th ? .EQU LCD_DR=DDRA .EQU CONT=PORTD ;PORTD ?i?u khi?n lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC .EQU CONT_DR=DDRD ; .EQU CONT_IN=PIND ; .EQU SW_FLG=0 .EQU RS=0 ;bit RS .EQU RW=1 ;bit RW .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?n d? phòng .EQU NULL=$00 ;mã k?t thúc chu?i ký t? .EQU CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t .EQU RTC_BUF=0X200 .ORG 0 RJMP MAIN .ORG 0X40 MAIN: LDI R16,HIGH(RAMEND) ;??a stack lên vùng ?/c cao OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 LDI R16,0XFF OUT LCD_DR,R16 LDI R16,0X00 OUT LCD,R16 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 R16,250 ;delay 25ms RCALL DELAY_US ;ctc delay 100?sxR16 LDI R16,250 ;delay 25ms RCALL DELAY_US ;ctc delay 100?sxR16 CBI LCD,RS ;RS=0 ghi l?nh LDI R17,$30 ;mã l?nh=$30 l?n 1,RS=RW=E=0 RCALL OUT_LCD4 ;ctc ghi ra LCD LDI R16,42 ;delay 4.2ms RCALL DELAY_US CBI LCD,RS LDI R17,$30 ;mã l?nh=$30 l?n 2 RCALL OUT_LCD4 LDI R16,2 ;delay 200?s RCALL DELAY_U S CBI LCD,R S
;---------------------------------------------------------
;??t bit SQWEN=1,RS2:0=000 cho dao ??ng 1Hz ;xu?t ra chân MFP
;--------------------------------------------------------- RCALL TWI_START ;phát xung START LDI
R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR RCALL TWI_WRITE ;ghi RTC+W RCALL TWI_WRITE LDI R17,0B01000000 ;MFP xu?t xung 1Hz RCALL TWI_WRIT E TWI_STO P LDI R17,0X07 ;??a ch? thanh ghi Control RCALL RCALL RCALL SBI LCD,RS LDI
XH,HIGH(RTC_BUF+3);X tr? buffer RTC th? LDI XL,LOW(RTC_BUF+3) LDI R17,$84
;con tr? b?t ??u ? dòng 1 v? trí th? RCALL CURS_POS ;xu?t l?nh ra LCD LD R17,X ;l?y data th? ANDI R17,0X07 LDI R18,0X30 ;chuy?n sang mã ASCII ADD R17,R18 SBI LCD,RS LDI R16,1 ;ch? 100?s RCALL DELAY_US RCALL OUT_LCD ;hi?n th? ra LCD LDI R17,0X20 ;mã d?u tr?ng DISP_NXT2: LD R17,X+ RCALL NUM_DISP DEC COUNT BREQ SW_CHK LDI R17,'/' SBI LCD,RS LDI R16,1 ;ch? 100?s RCALL DELAY_US RCALL OUT_LCD ;hi?n th? ra LCD RJMP DISP_NXT2
;------------------------------------------------------------------
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
;-----------------------------------------------------------------;??t l?i RTC MI_CHK: 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 tr? buffer RTC phút LDI XL,LOW(RTC_BUF+1) LDI NUM_MAX,0X59 LDI NUM_MIN,0 LDI POS_CRS,$89 ;??t con tr? v? trí phút RCALL SET_NUM RJMP RTC_SET SEC_CHK: BRNE EXIT_CHK ;khác,thoát LDI
XH,HIGH(RTC_BUF+6);X tr? buffer RTC n?m LDI XL,LOW(RTC_BUF+6) LDI NUM_MAX,0X99
;----------------------------------------------------- EXIT_CHK:
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com) LDI NUM_MIN,1 LDI POS_CRS,$CC ;con tr? v? trí n?m RCALL SET_NUM RJMP RTC_SET
;----------------------------------------------------;L?u
các giá tr? cài ??t vào RTCC lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC LDI COUNT,7 ;l?u vào RTCC LDI
XH,HIGH(RTC_BUF);X tr? buffer RTC LDI XL,LOW(RTC_BUF) RCALL TWI_START ;phát xung START LDI
R17,(CTL_BYTE|0X00);truy xu?t ghi RTC RCALL TWI_WRITE ;ghi RTC+W LDI R17,0X00 ;??a ch? thanh ghi giây RCALL
TWI_WRITE ;ghi ??a ch? TCCR WR_RTC: LD R17,X+ RCALL TWI_WRITE ;ghi TCCR BRNE SW2_CODE ;không ph?i ki?m tra mã SW2 DEC COUNT BRNE WR_RTC RCALL TWI_STOP RJMP START1
;------------------------------------------------------
;GET_SW ??c tr?ng thái SW1,SW2 có ch?ng rung
;Tr? v? mã SW1=1 ho?c mã SW2=2 và c? SW_FLG=1 n?u có SW nh?n
;Tr? v? c? SW_FLG=0 n?u không có SW nh?n
;S? d?ng R16,R17,c? SW_FLG thu?c thanh ghi FLAG_REG
;-------------------------------------------------------------------------- GET_SW: CBR REG_FLAG,(1<LDI R16,50
;ki?m tra SW nh?n 50 l?n liên t?c WAIT0: IN R17,CONT_IN
ANDI R17,(1< R17,(1<BREQ EXIT_SW ;không nh?n thoát DEC R16 ;có nh?n ti?p t?c BRNE WAIT0 ; PUSH R17 ;c?t mã SW BACK1: LDI R16,50
;ki?m tra sw nh? 50 l?n liên t?c WAIT1: IN R17,CONT_IN ANDI R17,(1<CPI R17,(1<BRNE BACK1 ;ch? nh? SW DEC R16 BRNE WAIT1 POP R17 ;ph?c h?i mã SW CPI
R17,(1<;SW1=0 nh?n,SW2=1 không nh?n lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC LDI R17,1 ;gán giá tr? mã SW1 RJMP SET_FLG ;báo c? nh?n SW SW2_CODE: CPI
R17,(1<;SW2=0 nh?n,SW1=1 không nh?n BRNE EXIT_SW
;không ph?i thoát LDI R17,2 ;gán giá tr? mã SW2 SET_FLG: SBR REG_FLAG,(1<RET
;---------------------------------------------------------------- NON_CR:
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
;SET_NUM cài ??t các giá tr? th?i gian ch?n qua bi?n COUNT ;Nh?n/nh? SW1 thoát
;Nh?n/nh? 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 tr? ?úng v? trí cài ??t RCALL CURS_POS SW_CHK1: RCALL GET_SW ;??c SW SBRS REG_FLAG,SW_FLG;có SW nh?n
RJMP SW_CHK1 ;ch? nh?n SW CPI R17,1 ;SW1 nh?n? BREQ EXIT_NUM ;?úng,thoát CPI R17,2 ;SW2 nh?n? BRNE SW_CHK1 ;khác,??c l?i SW LD R17,X ;n?p giá 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<;?úng,xóa bit ST RJMP PRESET ;ti?n hành ??t DAY_CHK: CPI COUNT,0 ;cài ??t ngày? BRNE PRESET ;khác,ti?n hành ??t ANDI R17,0X07 ;l?c l?y data ngày PRESET: INC R17 ;t?ng giá tr? thêm 1 MOV R18,R17 ;c?t giá tr? ??t ANDI R17,$0F ;che l?y 4 bit th?p CPI R17,$0A ;giá tr?<10 BRCS NON_CR ;?úng,không tràn LDI R17,$06 ;hi?u ?ính BCD ADD R18,R17
;Input: Z ch?a ??a ch? ??u chu?i ký t?
;Output: hi?n th? chu?i ký t? ra LCD t?i v? trí con tr? hi?n hành
;S? d?ng R16,R17,ctc DELAY_US,OUT_LCD
;------------------------------------------------------------------ MSG_DISP: LPM R17,Z+
;l?y mã ASCII ký t? t? Flash ROM CPI R17,NULL ;ki?m tra ký t? k?t thúc BREQ EXIT_MSG ;ký t? NULL thoát LDI R16,1 ;ch? 100?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?p t?c hi?n th? ký t? EXIT_MSG: lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC RET
;----------------------------------------------------------
;CURS_POS ??t con tr? t?i v? trí có ??a ch? trong R17
;Input: R17=$80 -$8F dòng 1,$C0-$CF dòng 2 ; R17= ??a ch? v? trí con tr?
;S? d?ng R16,ctc DELAY_US,OUT_LCD
;---------------------------------------------------------- CURS_POS: LDI R16,1 ;ch? 100?s RCALL DELAY_US CBI LCD,RS ;RS=0 ghi l?nh RCALL OUT_LCD RET
;-----------------------------------------------------------------
;INIT_LCD4 kh?i ??ng LCD ghi 4 byte mã l?nh theo giao ti?p 4 bit
;Function set:R18=$28 2 dòng font 5x8 giao ti?p 4 bit
;Clear display:R19=$01 xóa màn hình
;Display on/off LCDrol:R20=$0C màn hình on,con tr? off
;OUT_LCD ghi 1 byte mã l?nh/data ra LCD
Downloaded by Jarsil Camilia (camiilaa12822@gmail.com)
;Entry mode set:R21=$06 d?ch ph?i con tr? ,?/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 RCALL OUT_LCD LDI R16,20
;ch? 2ms sau l?nh Clear display RCALL DELAY_US MOV R17,R20 ;R20=Display LCDrol on/off RCALL OUT_LCD MOV R17,R21 ;R21=Entry mode set RCALL OUT_LCD RET
;--------------------------------------------------
;OUT_LCD4 ghi mã l?nh/data ra LCD
;Input: R17 ch?a mã l?nh/data 4 bit cao ;------------------------------------------- ------- OUT_LCD4: OUT LCD,R17 SBI LCD,E CBI LCD,E RET
;------------------------------------------------------ STS TWBR,R17 R15,R16 ;1MC n?p data cho R15 L1:MOV R14,R16 ;1MC n?p data cho R14 L2:DEC R14 ;1MC NOP ;1MC BRNE L2 ;2/1MC DEC R15 ;1MC BRNE L1 ;2/1MC RET ;4MC
;--------------------------------------------------------- ;TWI_INIT kh?i ??ng c?ng TWI ;??t t?c ?? tuy?n=100Khz
;--------------------------------------------------------- TWI_INIT: LDI R17,8 ;t?c ?? truy?n SCL=100Khz LDS R17,TWCR RET
;-------------------------------------------------- TWI_NAK: LDI R17,(1<RET
;---------------------------------------------------------- TWI_STOP: lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC STS TWCR,R17 WAIT_NAK: LDS R17,TWCR
;ch? c? TWINT=1 báo truy?n xong SBRS R17,TWINT RJMP WAIT_NAK lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC LDI R17,(1< STS TWCR,R17 RET
;--------------------------------------------------------- .ORG 0X200 MSG1: .DB "THU ",$00 MSG2: .DB "NGAY ",$00 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC BÀI 3
a) Kết nối các tín hiệu MOSI(PB5), SCK(PB7) của port SPI từ AVR đến tín hiệu SDI
và CLK của khối thanh ghi dịch. Kết nối 2 chân port khác vào tín hiệu nCLR và
LATCH. Kết nối ngõ ra của thanh ghi dịch vào Bar LED
b) 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. .EQU SPI_PORT=PORTB .EQU SPI_PORT_DDR=DDRB .EQU SS=4 .EQU MOSI=5 .EQU MISO=6 .EQU SCK=7 .ORG 0 RCALL SPI_INIT lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC RCALL SETUART LOOP: LDS R17,UCSR0A SBRS R17,RXC0 ;cờ RXC0=1: thu xong RJMP LOOP ;chờ cờ RXC0=1 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC CBI SPI_PORT,SS ; tạo clk clear LDS R18,UDR0 RCALL SPI_TRANS SBI SPI_PORT,SS ; tạo clk set RJMP LOOP SPI_INIT:
LDI R16,(1<OUT SPI_PORT_DDR, R16 ; Output pins LDI R16,(1< OUT SPCR0, R16 ; Enable, master, MSB first LDI R16,(1<; SCK=FOSC/16 STS SPSR0,R16 RET SPI_TRANS: OUT SPDR0,R18 ;ghi data ra SPI WAIT_SPI: IN R16,SPSR0 ; SPIF0 SBRS R16,SPIF0
;cờ SPIF0=1 truyền SPI xong RJMP WAIT_SPI ;chờ cờ SPIF0=1 IN R17,SPDR0 RET SETUART: LDI R16,(1<;cho phép thu STS UCSR0B,R16 LDI R16,(1< STS UCSR0C,R16 ;không parity, 1 stop bit LDI R16,0x00 STS UBRR0H,R16
LDI R16,51 ;9600 baud rate fosc=8MHz STS UBRR0L,R16 RET BÀI 4
a) Kết nối các tín hiệu MOSI, MISO, SCK của port SPI từ AVR các tín hiệu tương ứng trên
header J80. Kết nối 1 chân port khác vào tín hiệu nCS. Khối EEPROM lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
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
d) 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_PORT=PORTB .EQU SPI_PORT_DDR=DDRB .EQU SS= 4 .EQU MOSI=5 .EQU MISO= 6 .EQU SCK= 7 .EQU WIP=0 .EQU PE= $ 42 .EQU WREN= $ 06 .EQU WRDI= $ 04 .EQU RDSR= $ 05 .EQU WRSR= $ 01 .EQU SPI_RD= $ 03 .EQU SPI_WR=$02 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC .org 0 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC rjmp ioset lOMoAR cPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC .org $40 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC ioset: lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC ldi r16,0xff lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC out ddra,r16 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC ldi r16,0 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC out porta,r16 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC stack : lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC ldi r16,high(ramend) lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC out sph,r16 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC ldi r16,low(ramend) out spl,r16 set_uart: ldi r16,16 sts ucsr0b,r16 ldi r16,6 sts ucsr0c,r16 ldi r16,0 sts ubrr0h,r16 ldi r16,51 sts ubrr0l,r16 set_spi: ldi r16,240 out ddrb,r16 sbi portb,4 sbi portb,6 ldi r16,0x51 out spcr0,r16 ldi r16,1 sts spsr0,r16 main: ldi r18,0 rcall EEPROM_READ start: rcall uart_receive inc r18 out porta,r18 RCALL EEPROM_ERASE rcall eeprom_write rjmp start uart_receive: lds r17,ucsr0a lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC sbrs r17,rxc0 rjmp uart_receive lds r19,udr0 re t spi_trans: out spdr0,r16 trans: in r20,spsr0 sbrs r20,spif0 rjmp trans in r21,spdr0 re t EEPROM_WRITE: CBI SPI_PORT,SS LDI R16,WREN RCALL SPI_TRANS SBI SPI_PORT,SS CBI SPI_PORT,SS LDI R16,0x02 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS LDI R16,1 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS MOV R16,R18 RCALL SPI_TRANS SBI SPI_PORT,SS WR_FIN: LDI R16,RDSR lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC CBI SPI_PORT,SS RCALL SPI_TRANS SBRC R21,WIP RJMP WR_FIN SBI SPI_PORT,SS RET EEPROM_ERASE: LDI R16,WREN CBI SPI_PORT,SS RCALL SPI_TRANS SBI PORTB,SS LDI R16,PE CBI PORTB,SS RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS LDI R16,1 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS SBI SPI_PORT,SS eraser_FIN: LDI R16,RDSR CBI SPI_PORT,SS RCALL SPI_TRANS SBRC R21,WIP RJMP eraser_FIN SBI SPI_PORT,SS RET EEPROM_READ: LDI R16,SPI_RD CBI PORTB,SS RCALL SPI_TRANS lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC LDI R16,0 RCALL SPI_TRANS LDI R16,1 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS LDI R16,$FF RCALL SPI_TRANS SBI PORTB,SS MOV R18,R21 RET BÀI 5
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. lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC .DEF COUNTER 8 = R1 .ORG 0 MAIN: ; SET STA K C LDI R16, HIGH(RAMEND) OUT SPH, R1 6 LDI R W( 16, LO RAMEND) OUT SPL, R16 CLR COUNTER ; CLR BIEN DEM LDI R16,0XFF ; SET UP D A DR OUT DDRA, R16 LDI R20, $ 0 1 LDI R21, $ 0 0 RCALL USART_INI T START : RCALL WRITE_TO_EEPROM RCALL READ_FROM_EEPROM OUT PORTA, COUNTER RCALL USART_RECEIVER_CHAR INC COUNTER ; TANG BIEN DEM RJMP START USART_INIT : LDI R16, $00 STS UBRR0H, R16 LDI R16, 51
STS UBRR0L, R16 ; SET BAUD = 9600 , ... VI DU 1
LDI R16, (1<STS UCSR0B, R16 LDI R16, (1<RET USART_RECEIVER_CHAR: PUSH R17 ; CAT R17 WAIT_UART_RECEIVE: LDS R17, UCSR0A
SBRS R17, RXC0 ; CHO CO RXC0 = 1 RJMP WAIT_UART_RECEIVE LDS R19, UDR0 POP R17 ; LAY R17 RET WRITE_TO_EEPROM: WAIT_ENABLE_WRITE:
SBIC EECR, EEPE ; CHO ENABLE = 0 RJMP WAIT_ENABLE_WRITE
OUT EEARH, R21 ; DAY DIA CHI EEPROM HIGH
OUT EEARL, R20 ; DAY DIA CHI EEPROM LOW lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
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 RET
DELAY_5MS: ; CHUONG TRINH CON DELAY 5MS LDI R20, 5 LP2: LDI R21, 250 LP1: NO P C DE R2 1 BR NE L P 1 DE C R2 0 BR NE LP 2 RET lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử 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?
Baudrate = 9600 = [2^(U2X).FOSC ]/[16.(UBRR+1)] - UBRR=51.083 (U2X=0)
- Giá trị nạp vào UBRR = 51
- baudrate thực tế = [2^(U2X).FOSC ]/[16.(UBRR+1)]
=[2^(0).8000000]/[16.(51+1)] = 9615.38 - sai số = 0.16%
b. Cờ UDRE dùng để làm gì?
Cờ UDRE dùng để thông báo khi bộ đệm phát UDR trống (UDRE=1)
hay cần ghi dữ liệu vào thanh ghi này (UDRE=0)
c. Sự khác nhau giữa hardware UART và software UART (bit-banging UART) hardware UART software UART
• Tốc độ truyền thông cao và
• Tốc độ truyền thông đáng tin cậy chậm hơn và không • Không tốn nhiều tài đáng tin cậy nguyên CPU
• Tốn nhiều tài nguyên
• Cần có 1 số chân đặc biệt CPU hơn
để kết nối linh kiện khác
• Không cần có 1 số chân
• Không linh hoạt trong cấu
đặc biệt để kết nối linh hình và điều khiển kiện khác
• Linh hoạt trong cấu hình và điều khiển lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử
Sử dụng 1 bộ đếm thời gian để đạt Sử dụng các phép tính toán
của CPU để tạo ra tín hiệu baudrate mong muốn UART
Xử lí tín hiệu độc lập với CPU
d. Chân TxD0 và chân RxD0 của UART0 là chân port nào? TxD0 là chân PD1 RxD0 là chân PD0
e. Atmega324 có bao nhiêu phần cứng UART?
Atmega324 có 2 phần cứng UART là USART0 và USART1
2. Mã nguồn chương trình với chú thích call USART_Init start: call USART_ReceiveChar call USART_SendChar rjmp start ;init UART 0 ;CPU clock is 8Mhz USART_Init:
; Set baud rate to 9600 bps with 8 MHz clock ldi r16, 51 sts UBRR0L, r16 ;set double speed ;ldi r16, (1 << 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) lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử sts UCSR0B, r16 ret ;send out 1 byte in r16 USART_SendChar: push r17
; Wait for the transmitter to be ready USART_SendChar_Wait: lds r17, UCSR0A
sbrs r17, UDRE0 ;check USART Data Register Empty bit rjmp USART_SendChar_Wait sts UDR0, r16 ;send out pop r17 ret lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử Kết quả nhận được: 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:PC1; SDA:PC0
Các chân SCL, SDA là các chân của giao tiếp I2C, được sử dụng để truyền
dữ liệu và tín hiệu đồng bộ giữa các thiết bị. Trên vi điều khiển AVR
ATmega324PA, các chân SCL và SDA được định nghĩa như sau: - SCL: chân PC1 - SDA: chân PC0 lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử
b. Vẽ hình mô tả kết nối trong bài thí nghiệm
2. Mã nguồn và chú thích .DEF REG_FLAG=R19 ;REG_FLAG ch?a các c? báo .DEF COUNT=R20 ;bi?n ??m
.DEF NUM_MAX=R21 ;bi?n ??t giá tr? MAX .DEF NUM_MIN=R22 ;bi?n ??t giá tr? MIN .DEF POS_CRS=R23
;bi?n ??t v? trí con tr? hi?n th? .EQU LCD=PORTA ;PORTA hi?n th? lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử .EQU LCD_DR=DDRA .EQU CONT=PORTD ;PORTD ?i?u khi?n .EQU CONT_DR=DDRD ; .EQU CONT_IN=PIND ; .EQU SW_FLG=0 .EQU RS=0 ;bit RS .EQU RW=1 ;bit RW .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?n d? phòng .EQU NULL=$00 ;mã k?t thúc chu?i ký t? .EQU
CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t .EQU RTC_BUF=0X200 .ORG 0 RJMP MAIN .ORG 0X40 MAIN: LDI R16,HIGH(RAMEND) ;??a stack lên vùng ?/c cao OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 LDI R16,0XFF OUT LCD_DR,R16 LDI R16,0X00 OUT LCD,R16 lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử 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 R16,250 ;delay 25ms RCALL DELAY_US ;ctc delay 100?sxR16 LDI R16,250 ;delay 25ms RCALL DELAY_US ;ctc delay 100?sxR16 CBI LCD,RS ;RS=0 ghi l?nh LDI R17,$30 ;mã l?nh=$30 l?n 1,RS=RW=E=0 RCALL OUT_LCD4 ;ctc ghi ra LCD lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử RCALL CURS_POS ;xu?t l?nh ra LCD LDI
ZH,HIGH(MSG2<<1);Z tr? ??u b?ng tra MSG2 LDI ZL,LOW(MSG2<<1) RCALL MSG_DISP ;ghi MSG2 ra LCD
;-------------------------------------------------------- -
;??t bit SQWEN=1,RS2:0=000 cho dao ??ng 1Hz ;xu?t ra chân MFP
;-------------------------------------------------------- - RCALL TWI_START ;phát xung START LDI
R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR RCALL TWI_WRITE ;ghi RTC+W LDI R17,0X07 ;??a ch? thanh ghi Control RCALL TWI_WRITE LDI R17,0B01000000 ;MFP xu?t xung 1Hz RCALL TWI_WRITE RCALL TWI_STOP
;------------------------------------------------------- -
;??c các thanh ghi 0x00-0x06 RTC
;-------------------------------------------------------- - START1: LDI
XH,HIGH(RTC_BUF);X tr? ??u buffer RTC LDI XL,LOW(RTC_BUF) LDI COUNT,7 RCALL TWI_START ;phát xung START LDI
R17,(CTL_BYTE|0X00);truy xu?t ghi RTC_TCCR lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử 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?t ??c RTC_TCCR RCALL TWI_WRITE ;ghi RTC+R RTC_RD: RCALL TWI_READ ST X+,R17 DEC COUNT BRNE RTC_RD RCALL TWI_NAK RCALL TWI_STOP lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử RCALL SET_NUM RJMP RTC_SET
;-----------------------------------------------------
;L?u các giá tr? cài ??t vào RTCC
;----------------------------------------------------- EXIT_CHK: LDI COUNT,7 ;l?u vào RTCC
LDI XH,HIGH(RTC_BUF);X tr? buffer RTC LDI XL,LOW(RTC_BUF) RCALL TWI_START ;phát xung START LDI
R17,(CTL_BYTE|0X00);truy xu?t ghi RTC RCALL TWI_WRITE ;ghi RTC+W LDI R17,0X00 ;??a ch? thanh ghi giây RCALL TWI_WRITE ;ghi ??a ch? TCCR WR_RTC: LD R17,X+ RCALL TWI_WRITE ;ghi TCCR DEC COUNT BRNE WR_RTC RCALL TWI_STOP RJMP START1
;------------------------------------------------------
;GET_SW ??c tr?ng thái SW1,SW2 có ch?ng rung
;Tr? v? mã SW1=1 ho?c mã SW2=2 và c? SW_FLG=1 n?u có SW nh?n
;Tr? v? c? SW_FLG=0 n?u không có SW nh?n
;S? d?ng R16,R17,c? SW_FLG thu?c thanh ghi FLAG_REG
;-------------------------------------------------------------------------- GET_SW: CBR REG_FLAG,(1< LDI R16,50
;ki?m tra SW nh?n 50 l?n liên t?c WAIT0: IN R17,CONT_IN ANDI R17,(1< R17,(1< BREQ EXIT_SW ;không nh?n thoát lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử DEC R16 ;có nh?n ti?p t?c BRNE WAIT0 ; PUSH R17 ;c?t mã SW BACK1: LDI R16,50
;ki?m tra sw nh? 50 l?n liên t?c WAIT1: IN R17,CONT_IN ANDI R17,(1< CPI R17,(1< BRNE BACK1 ;ch? nh? SW DEC R16 BRNE WAIT1 POP R17 ;ph?c h?i mã SW CPI
R17,(1<;SW1=0 nh?n,SW2=1 không nh?n BRNE SW2_CODE ;không ph?i ki?m tra mã SW2 LDI R17,1 ;gán giá tr? mã SW1 RJMP SET_FLG ;báo c? nh?n SW SW2_CODE: CPI
R17,(1<;SW2=0 nh?n,SW1=1 không nh?n BRNE EXIT_SW ;không ph?i thoát LDI R17,2 ;gán giá tr? mã SW2 SET_FLG: SBR REG_FLAG,(1< RET
;----------------------------------------------------------------
;SET_NUM cài ??t các giá tr? th?i gian ch?n qua bi?n COUNT ;Nh?n/nh? SW1 thoát
;Nh?n/nh? 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 tr? ?úng v? trí cài ??t RCALL CURS_POS SW_CHK1: RCALL GET_SW ;??c SW lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử SBRS REG_FLAG,SW_FLG;có SW nh?n
RJMP SW_CHK1 ;ch? nh?n SW CPI R17,1 ;SW1 nh?n? BREQ EXIT_NUM ;?úng,thoát lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử
LDI R16,1 ;ch? 100?s RCALL DELAY_US RCALL OUT_LCD ;hi?n th? giá tr? POP R17 ;ph?c h?i data ANDI R17,0X0F ;che l?y s? BCD th?p ORI R17,0X30 ;chuy?n sang mã ASCII SBI LCD,RS
LDI R16,1 ;ch? 100?s RCALL DELAY_US RCALL
OUT_LCD ;hi?n th? giá tr? RET
;----------------------------------------------------------------- ;MSG_DISP
hi?n th? chu?i ký t? k?t thúc b?ng mã NULL ??t trong Flash ROM
;Input: Z ch?a ??a ch? ??u chu?i ký t?
;Output: hi?n th? chu?i ký t? ra LCD t?i v? trí con tr? hi?n hành
;S? d?ng R16,R17,ctc DELAY_US,OUT_LCD
;------------------------------------------------------------------ MSG_DISP: LPM R17,Z+
;l?y mã ASCII ký t? t? Flash ROM CPI R17,NULL ;ki?m tra ký t? k?t thúc BREQ EXIT_MSG ;ký t? NULL thoát LDI R16,1 ;ch? 100?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?p t?c hi?n th? ký t? EXIT_MSG: RET
;----------------------------------------------------------
;CURS_POS ??t con tr? t?i v? trí có ??a ch? trong R17
;Input: R17=$80 -$8F dòng 1,$C0-$CF dòng 2 ; R17= ??a ch? v? trí con tr?
;S? d?ng R16,ctc DELAY_US,OUT_LCD
;---------------------------------------------------------- CURS_POS: LDI R16,1 ;ch? 100?s RCALL DELAY_US CBI LCD,RS ;RS=0 ghi l?nh RCALL OUT_LCD lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử RET
;-----------------------------------------------------------------
;INIT_LCD4 kh?i ??ng LCD ghi 4 byte mã l?nh theo giao ti?p 4 bit
;Function set:R18=$28 2 dòng font 5x8 giao ti?p 4 bit
;Clear display:R19=$01 xóa màn hình
;Display on/off LCDrol:R20=$0C màn hình on,con tr? off
;Entry mode set:R21=$06 d?ch ph?i con tr? ,?/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 RCALL OUT_LCD LDI R16,20
;ch? 2ms sau l?nh Clear display RCALL DELAY_US MOV R17,R20 ;R20=Display LCDrol on/off RCALL OUT_LCD MOV R17,R21 ;R21=Entry mode set RCALL OUT_LCD RET
;--------------------------------------------------
;OUT_LCD4 ghi mã l?nh/data ra LCD
;Input: R17 ch?a mã l?nh/data 4 bit cao ;------------------------------------------------- - OUT_LCD4: OUT LCD,R17 SBI LCD,E CBI LCD,E RET
;------------------------------------------------------
;OUT_LCD ghi 1 byte mã l?nh/data ra LCD ;chia làm 2 l?n ghi 4bit
;Input: R17 ch?a mã l?nh/data,R16
;bit RS=0/1:l?nh/data,bit RW=0:ghi lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử ;S? d?ng ctc OUT_LCD4 lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử
;------------------- ------------------------------- TWI_NAK: LDI R17,(1<STS TWCR,R17 WAIT_NA : K LDS R17,TWCR
;ch? c? TWINT=1 báo truy?n xon g SBRS R17,TWIN T RJ MP WAIT_NA K RET ;------------------- --------------- ------------------- ----- TWI_STOP: LDI R17,(1<TWIN T,STO P STS TWCR,R17 RE T
;--------------------------- -------------------------- --- - .ORG X 0 0 20 MSG1: .DB "THU ", $ 0 0 MSG2: .DB "NGAY " , $ 0 0 BÀI 3
1. Trả lời các câu hỏi
a. Theo datasheet của 74HC595, tần số cao nhất của xung nhịp đưa vào 74595 là bao nhiêu? -
Tần số clock cao nhất mà nó có thể hoạt động được là 55Mhz
b. Với clock là 8Mhz thì SPI của Atmega328 có tốc độ cao nhất là bao nhiêu?
- Tốc độ của SPI phụ thuộc vào tần số của xung clock và thời gian trễ của SPI.
Trên vi điều khiển Atmega328, thời gian trễ của SPI là 100 ns. Do đó, tốc độ cao nhất của SPI
là: fmax = clock / (2 * trễ) = 8 MHz / (2 * 100 ns) = 10 Mbps 2. Mã nguồn và chú thích lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC BÀI 4
1. Trả lời các câu hỏi
a. Dung lượng của EEPROM 25AA1024 là bao nhiêu?
Dung lượng của EEPROM 25AA1024 là 128KB
b. Theo datasheet, tần số nhanh nhất của xung CK đưa vào EEPROM này là bao nhiêu? lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC
Theo datasheet, tần số nhanh nhất của xung CK đưa vào
EEPROM này để đảm bảo hoạt động ổn định của EEPROM là 20MHz
2. Mã nguồn và chú thích lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC ldi r16,low(ramend) out spl,r16 set_uart: ldi r16,16 sts ucsr0b,r16 ldi r16,6 sts ucsr0c,r16 ldi r16,0 sts ubrr0h,r16 ldi r16,51 sts ubrr0l,r16 set_spi: ldi r16,240 out ddrb,r16 sbi portb,4 sbi portb,6 ldi r16,0x51 out spcr0,r16 ldi r16,1 sts spsr0,r16 main : ldi r18,0 rcall EEPROM_READ start: rcall uart_receive inc r18 out porta,r18 RCALL EEPROM_ERASE rcall eeprom_write rjmp start uart_receive: lds r17,ucsr0 a lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC sbrs r17,rxc0 rjmp uart_receive lds r19,udr0 ret spi_trans: out spdr0,r16 trans: in r20,spsr0 sbrs r20,spif0 rjmp trans in r21,spdr0 ret EEPROM_WRITE: CBI SPI_PORT,SS LDI R16,WREN RCALL SPI_TRANS SBI SPI_PORT,SS CBI SPI_PORT,SS LDI R16,0x02 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS LDI R16,1 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS MOV R16,R18 RCALL SPI_TRANS SBI SPI_PORT,SS WR_FIN: lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC LDI R16,RDSR CBI SPI_PORT,SS RCALL SPI_TRANS SBRC R21,WIP RJMP WR_FIN SBI SPI_PORT,SS RET EEPROM_ERASE: LDI R16,WREN CBI SPI_PORT,SS RCALL SPI_TRANS SBI PORTB,SS LDI R16,PE CBI PORTB,SS RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS LDI R16,1 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS SBI SPI_PORT,SS eraser_FIN: LDI R16,RDSR CBI SPI_PORT,SS RCALL SPI_TRANS SBRC R21,WIP RJMP eraser_FIN SBI SPI_PORT,SS RET EEPROM_READ: LDI R16,SPI_RD CBI PORTB,SS RCALL SPI_TRANS LDI R16,0 lOMoARcPSD| 36991220 LAB 3-1
GIAO TIẾP SERIAL PORT, EEPROM, RTC RCALL SPI_TRANS LDI R16,1 RCALL SPI_TRANS LDI R16,0 RCALL SPI_TRANS LDI R16,$FF RCALL SPI_TRANS SBI PORTB,SS MOV R18,R21 RET lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử BÀI 5
1. Trả lời các câu hỏi
a. Atmega324PA có dung lượng EEPROM là bao nhiêu?
- Atmega324PA có dung lượng EEPROM là 1024 byte, tương đương với 1 KB.
b. Liệt kê sự khác nhau giữa SRAM và EEPROM c. Liệt SRAM EEPROM kêsự khác nhau
- là loại bộ nhớ tạm thời, có thể
- là loại bộ nhớ lưu trữ dữ liệu giữaFlash và
đọc và ghi dữ liệu một cách nhanh
trong thời gian dài, và có thể xóa và ghi lại nhiều lần. EEPROM chóng.
- là loại bộ nhớ volatile, có nghĩa là - là loại bộ nhớ non-volatile, có thể
nó sẽ mất điện khi nguồn cung cấp
lưu trữ dữ liệu lâu dài mà không
bị ngắt. Do đó, nó thường được sử
cần nguồn cung cấp liên tục.
dụng để lưu trữ dữ liệu tạm thời hoặc bộ đệm.
- thường có dung lượng nhỏ hơn
- thường có dung lượng lớn hơn và
EEPROM và thường được sử dụng được sử dụng để lưu trữ các giá trị
để lưu trữ các biến tạm thời, các bộ được lưu trữ lâu dài như cài đặt, dữ
đệm hoặc các địa chỉ chỉ dùng một
liệu người dùng và các thông số lần. khác.
- SRAM được sử dụng rộng rãi
- EEPROM được sử dụng rộng rãi
trong các ứng dụng yêu cầu tốc độ
trong các ứng dụng yêu cầu lưu trữ truy cập nhanh
dữ liệu lâu dài và có thể xóa và ghi lại nhiều lần. lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử
c). Sự khác nhau giữa Flash và EEPROM Flash EEPROM
-Flash là một loại bộ nhớ
-EEPROM là một loại bộ nhớ
không xóa được, nghĩa là dữ
có thể xóa được, cho phép lưu
liệu có thể được ghi vào và
trữ và truy xuất dữ liệu một
đọc từ nó nhiều lần, nhưng
cách linh hoạt và tiết kiệm hơn không thể xóa bỏ một so với Flash.
cách độc lập một phần của
EEPROM được thiết kế để
dữ liệu đã được ghi vào.
lưu trữ các giá trị thay đổi
thường xuyên, chẳng hạn như
cấu hình và dữ liệu của các thiết bị.
- Mã nguồn và chú thích: .DEF COUNTER = R18 .ORG 0 MAIN: ; SET STACK LDI R16, HIGH(RAMEND) OUT SPH, R16 LDI R16, LOW(RAMEND) OUT SPL, R16 CLR COUNTER ; CLR BIEN DEM LDI R16,0XFF ; SET UP DDRA OUT DDRA, R16 LDI R20, $01 LDI R21, $00 RCALL USART_INIT START: RCALL WRITE_TO_EEPROM lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử RCALL READ_FROM_EEPROM OUT PORTA, COUNTER RCALL USART_RECEIVER_CHAR INC COUNTER ; TANG BIEN DEM RJMP START USART_INIT: LDI R16, $00 STS UBRR0H, R16 LDI R16, 51
STS UBRR0L, R16 ; SET BAUD = 9600 , ... VI DU 1
LDI R16, (1<STS UCSR0B, R16
LDI R16, (1<STS UCSR0C, R16 RET USART_RECEIVER_CHAR: PUSH R17 ; CAT R17 WAIT_UART_RECEIVE: LDS R17, UCSR0A
SBRS R17, RXC0 ; CHO CO RXC0 = 1 RJMP WAIT_UART_RECEIVE LDS R19, UDR0 POP R17 ; LAY R17 RET WRITE_TO_EEPROM: WAIT_ENABLE_WRITE:
SBIC EECR, EEPE ; CHO ENABLE = 0 RJMP WAIT_ENABLE_WRITE
OUT 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 lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử LAP CHE DO HOAT DONG XONG RCALL DELAY_5MS ;DELAY 5MS RET READ_FROM_EEPROM: WAIT_READ:
SBIC EECR, EEPE ;CHO ENALBE = 0 lOMoARcPSD| 36991220 BÁO Nhóm:04 Nhóm môn
Môn thí nghiệm:Vi xử 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 R1 8 RET
DELAY_ 5 MS: ; CHUONG TRINH CON DELAY 5MS LDI R20, 5 : LP2 LDI R21, 25 0 LP1 : NOP DEC R2 1 BRNE L P 1 DEC R2 0 BRNE LP 2 RET - Ảnh thực hành: