Lab4 1-Eng
Lab4 1-Eng
OBJECTIVE:
REFERENCES:
Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf
EXPERIMENT 1:
a) Connect the TxD and RxD pins of UART0 to UART_TxD0 and UART_RxD0 signals on
header J85 in the UART block.
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
d) Use sample programs from the experiment guide to write a program that initializes
UART0 with the specified parameters, waits to receive one byte from UART0, and then
sends it back to UART0.
call USART_Init
start:
call USART_ReceiveChar
call USART_SendChar
rjmp start
;init UART 0
USART_Init:
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
ldi r16, (1 << RXEN0) | (1 << TXEN0)
ret
USART_SendChar:
push r17
USART_SendChar_Wait:
rjmp USART_SendChar_Wait
pop r17
ret
USART_ReceiveChar:
push r17
USART_ReceiveChar_Wait:
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
sbrs r17, RXC0 ;check USART Receive Complete bit
rjmp USART_ReceiveChar_Wait
pop r17
ret
e) Use Hercules to send a character to the kit and observe the received data to check the
program's functionality. (Note: The CPU clock frequency on the kit is 8 MHz.)
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
EXPERIMENT 2:
a) Connect the SDA and SCL signals of AVR to the corresponding signals on the RTC
module. Connect one port pin to the MFP signal. Connect a 16x2 LCD to one port of
AVR.
b) Write a subprogram to initialize the RTC with the current time, configure the MFP signal
to have a 1Hz frequency, and read the date, month, year, hour, minute, and second values
from the RTC. Then, update these values on the LCD.
c) Compile the program and observe the LCD to verify its functionality.
EXPERIMENT 3:
a) Connect the MOSI and SCK signals from the SPI port of AVR to the SDI and CLK
signals of the shift register. Connect two port pins to the nCLR and LATCH signals.
Connect the output of the shift register to the Bar LED.
b) Connect the UART signals as in exercise 1.
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
c) Write a program that receives one value from UART and outputs it to the Bar LED using
SPI.
;----------SPI--------;
.EQU SS = 4;LATCH
.EQU DD_MOSI = 5;DSI
.EQU DD_MISO = 6;CLR
.EQU DD_SCK = 7;CLK
.ORG 0
MAIN:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
START:
RCALL SPI_MASTER_INIT
RCALL USART_INIT
CLR DATA_SPI_TX
CLR DATA_SPI_RX
CLR DATA_TX
CLR DATA_RX
SBI PORT_SPI, SS ;STOP TRANSMIT SPI
AGAIN:
RCALL USART_RECEIVER_CHAR
MOV DATA_SPI_TX, DATA_RX
;TRANSMIT DATA
CBI PORT_SPI, SS
RCALL SPI_MASTER_TRANSMIT
SBI PORT_SPI, SS
RJMP AGAIN
SPI_MASTER_INIT:
;CONFIG I/O SPI
;MOSI, SCK, SS -> OUT
;MISO ->IN
LDI R17, (1<<DD_MOSI)|(1<<DD_SCK)|(1<<SS)
OUT DDR_SPI, R17
SBI PORT_SPI, DD_MISO ;PULL UP
;SPI ENABLE, MASTER, Fosc/16, MODE 0
LDI R17, (1 << SPE0) | (1 << MSTR0) | (1 << SPR00)
OUT SPCR0, R17
RET
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
SPI_MASTER_TRANSMIT:
PUSH R17
OUT SPDR0, DATA_SPI_TX ;TRANSMIT DATA FROM MASTER TO SLAVE, OUT TO PIN
MOSI
WAIT_MASTER_TRANSMIT:
IN R17, SPSR0
SBRS R17, SPIF0
RJMP WAIT_MASTER_TRANSMIT
IN DATA_SPI_RX, SPDR0 ;IN FROM PIN MISO
POP R17
RET
USART_INIT:
LDI R16, (1<<RXEN0) | (1<<TXEN0) ;Enable transmitter and receiver
STS UCSR0B, R16
USART_RECEIVER_CHAR:
PUSH R17
WAIT_USART_RECEIVE:
LDS R17, UCSR0A
SBRS R17, RXC0 ;bit RXC0 = 1 then continue to receive char
RJMP WAIT_USART_RECEIVE
LDS DATA_RX, UDR0 ;Read new data
POP R17
RET
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
EXPERIMENT 4:
a) Connect the MOSI, MISO, and SCK signals from the SPI port of AVR to the
corresponding signals on header J80. Connect one port pin to the nCS signal.
b) Connect the UART signals as in exercise 1.
c) Connect one port to the Bar LED.
d) Write a program to count the number of characters received from UART and display
them on the Bar LED. Every time a byte is received, increment the count and write it to
EEPROM. When the microcontroller loses power and then regains it, read the count from
EEPROM and use it as the starting value.
https://drive.google.com/file/d/1mIgAt71b-QC4GcGftQbwyp0a0Luya7hC/view?
usp=sharing
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
/*
Setup SPI với sck = Fosc/16
Ở bài này, thu tín hiệu bằng UART0 và phát tín hiệu tới thanh ghi dịch
bằng SPI
*/
.EQU SPI_PORT=PORTB
.EQU SPI_PORT_DDR=DDRB
.EQU SS=4;CS
.EQU MOSI=5;DI
.EQU MISO=6;DO
.EQU SCK=7;CLK
.EQU WIP=0 ;WIP báo bộ nhớ bận/rỗi? WIP = 1 -> bận, WIP = 0 -> rỗi
.EQU PE=$42 ;mã lệnh xóa 1 trang bộ nhớ
.EQU WREN=$06 ;mã lệnh cho phép ghi bộ nhớ
.EQU WRDI=$04 ;mã lệnh xóa cho phép ghi bộ nhớ
.EQU RDSR=$05 ;mã lệnh đọc trạng thái bộ nhớ
.EQU WRSR=$01 ;mã lệnh ghi trạng thái bộ nhớ
.EQU SPI_RD=$03 ;mã lệnh đọc bộ nhớ
.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
.ORG 0
LDI R16,$FF
OUT DDRA,R16
CBI PORTB,SS ;Put EEPROM to active state
SBI PORTB,SS
RCALL SPI_INIT
RCALL USART_INIT
START:
RCALL EEPROM_READ
OUT PORTA,R20
RCALL USART_RECEIVER_CHAR
INC R20
; RCALL EEPROM_ERASE
MOV R19,R20
RCALL EEPROM_WRITE
RJMP START
//Setuo USART0
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
//Nhận dữ liệu từ USART0
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
//Output R19
USART_RECEIVER_CHAR:
PUSH R17 ; CAT R17
WAIT_USART_RECEIVE:
LDS R17, UCSR0A
SBRS R17, RXC0 ; CHO CO RXC0 = 1
RJMP WAIT_USART_RECEIVE
LDS R19, UDR0
POP R17 ; LAY R17
RET
;ĐỌC DỮ LIỆU TẠI ĐỊA CHI 0X001000 TRONG EEPROM RA THANH GHI R20
;Output: R20
EEPROM_READ:
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 ;data rác để 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
SBRC 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 DỮ LIỆU TRONG THANH GHI R19 VÀO ĐỊA CHỈ 0X001000 TRONG EEPROM
//Input R19
EEPROM_WRITE:
LDI R16,SPCR0
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
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
//đọc thanh ghi STATUS
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
RET
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/8
STS SPSR0,R16
RET
//Chương trình con truyền dữ liệu = SPI
//Input để master truyền: R16
//Output master nhận lại từ Slaver: R17
SPI_TRANS:
OUT SPDR0,R16 ;ghi data ra SPI
WAIT_SPI:
IN R18,SPSR0 ;đọc cờ SPIF0
SBRS R18,SPIF0 ;cờ SPIF0=1 truyền SPI xong
RJMP WAIT_SPI ;chờ cờ SPIF0=1
IN R17,SPDR0
RET
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
EXPERIMENT 5:
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
https://doe.dee.hcmut.edu.vn/
LAB 4-1
COMMUNICATE WITH SERIAL PORT, EEPROM,
RTC
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:
NOP
DEC R21
BRNE LP1
DEC R20
BRNE LP2
RET
https://doe.dee.hcmut.edu.vn/
LAB REPORT
Group:
Class group: Subject:
EXPERIMENT 1:
According to the baud rate table provided by the ATMEGA324PA datasheet, the
transmission error is 0.2% at desired 9600 baud => The actual baud rate is about 9580
baud
b. What is the purpose of the UDRE flag?
This flag will give a notion when UDR ( UART Data Register ) is empty by setting
to 1. After that, the microprocessor could send a new data to UDR for transmitting.
c. Explain the difference between hardware UART and software UART (bit-banging
UART).
Hardware UART means that there is specialized hardware that is capable of
transmitting and receiving UART signal
Software UART is a piece of software that emulates the behavior of UART
transmitting and receiving protocol
d. Which port pins correspond to the TxD0 and RxD0 pins of UART0?
RxD0 : PD0
TxD0 : PD1
https://doe.dee.hcmut.edu.vn/
LAB REPORT
Group:
Class group: Subject:
EXPERIMENT 2:
EXPERIMENT 3:
b. With a clock of 8 MHz, what is the maximum SPI speed for the Atmega328?
SPI clock speed = clock frequency / SPI clock prescaler
The maximum SPI speeds for the Atmega328 with a clock frequency of 8 MHz and
different SPI clock prescaler settings are as follows:
SPI clock prescaler = 2: Maximum SPI speed = 4 MHz
SPI clock prescaler = 4: Maximum SPI speed = 2 MHz
SPI clock prescaler = 8: Maximum SPI speed = 1 MHz
SPI clock prescaler = 16: Maximum SPI speed = 500 kHz
https://doe.dee.hcmut.edu.vn/
LAB REPORT
Group:
Class group: Subject:
EXPERIMENT 4:
EXPERIMENT 5:
https://doe.dee.hcmut.edu.vn/
LAB REPORT
Group:
Class group: Subject:
https://doe.dee.hcmut.edu.vn/