Lưu ý: tần số xung clock cho CPU trên kit thí nghiệm là 8Mhz a Kết nối các tín hiệu SDA và SCL 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..
Trang 1KHOA ĐIỆN – ĐIỆN TỬ
Báo cáo thí nghiệm
VI XỬ LÝGVHD: Nguyễn Tuấn Hùng Lớp_Nhóm: L07_01
Trang 2THAM KHẢO:
BÀI 2
BÀI 1
➢ 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
➢ 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
a) Kết nối chân TxD và RxD của UART0 vào vào tín hiệu UART_TxD0 và UART_RxD0 trên header J85 ở khối UART.
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.
(Lưu ý: tần số xung clock cho CPU trên kit thí nghiệm là 8Mhz)
a) Kết nối các tín hiệu SDA và SCL 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
MỤC TIÊU:
Trang 3BÀI 4
BÀI 3
BÀI 5
c) Biên dịch chương trình và quan sát LCD để kiểm tra chương trình.
a) Kết nối các tín hiệu MOSI, SCK 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.
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.
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.
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.
Trang 41 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?
b Cờ UDRE dùng để làm gì?
+ Cờ UDRE (USART Data Register Empty) được sử dụng để cho biết liệu bộ đệm truyền (UDR)
có sẵn để nhận dữ liệu mới hay không Nếu UDRE là 1, bộ đệm trống và sẵn sàng để ghi Cờ UDRE có thể tạo ra ngắt Data Register Empty UDRE được đặt sau khi thiết bị khởi động lại
để cho biết rằng bộ phát đã sẵn sàng.
c Sự khác nhau giữa hardware UART và software UART (bit-banging UART)
+ UART phần cứng và UART phần mềm (UART bit-banging) là hai cách thực hiện giao tiếp nối
tiếp không đồng bộ trên các thiết bị nhúng.
+ Phần cứng UART là một mạch tích hợp trong vi điều khiển có các thanh ghi và bộ đệm để gửi
và nhận dữ liệu nối tiếp Phần cứng UART có thể hoạt động với nhiều loại giao thức nối tiếp khác nhau và có thể đạt được tốc độ truyền cao Phần cứng UART không ảnh hưởng đến tài nguyên mã và không bị ảnh hưởng bởi các ngắt.
+ Software UART là thư viện phần mềm dùng để điều khiển các chân I/O để tạo xung truyền và
nhận dữ liệu nối tiếp UART phần mềm có thể linh hoạt hơn UART phần cứng vì có thể sử dụng bất kỳ chân nào trên vi điều khiển Tuy nhiên, phần mềm UART cũng có những hạn chế như: chiếm tài nguyên code, không thể hoạt động với tốc độ baud quá cao, phải tắt các ngắt để tránh lỗi thời gian…
d Chân TxD0 và chân RxD0 của UART0 là chân port nào?
BÀI 1
Trang 5.DEF TX_BUF = R16
; Replace with your application code INIT:
LDI R16, HIGH(RAMEND) OUT SPH, R16LDI R16, LOW(RAMEND) OUT SPL, R16
RCALL USART_INIT MAIN:
LOOP:
RCALL USART_RECEIVE_CHAR CPITX_BUF, 0
BRNE USART_SEND_CHAR RCALL DELAY_500MS RJMP LOOP
;INIT UART0
;CPU CLOCK IS 1MHZ USART_INIT:
;SET BAUDRATE TO 9600BPS WITH 8MHZ CLOCK LDI R16, 0
STS UBRR0H, R16 LDI R16, 51 STS UBRR0L, 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 1BYTE IN R16 USART_SEND_CHAR:
PUSH R17
;WAIT FOR THE TRANSMITTER TO BE READY USART_SEND_CHAR_WAIT:
+ Là chân của PortD
e Atmega324 có bao nhiêu phần cứng UART?
+ Atmega324 có hai UART phần cứng, được gọi là USART0 và USART1 Mỗi UART có các
chân Tx và Rx riêng biệt để gửi và nhận dữ liệu nối tiếp.
2 Mã nguồn chương trình với chú thích
Trang 6LDS R17, UCSR0A SBRS R17, UDRE0RJMP USART_SEND_CHAR_WAIT STS UDR0, TX_BUFPOP R17
RET
;RECEIVE 1 BYTE IN R16 USART_RECEIVE_CHAR:
PUSH R17
;WAIT FOR THE TRANSMITTER TO BE READY USART_RECEIVE_CHAR_WAIT:
LDS R17, UCSR0A SBRS R17, RXC0RJMP USART_RECEIVE_CHAR_WAIT LDS R16, UDR0
POP R17RETTABLE:
PUSH R17LDI ZL, LOW(TX_DATA << 1) LDI ZH, HIGH(TX_DATA << 1) MOV R16, R17
ADD ZL, R16 BRCC OVERFLOW INC ZH OVERFLOW:
LPM TX_BUF, ZPOP R17
RETDELAY_500MS:
PUSH R19 PUSH R20 PUSH R21 LDI R19, 32LP1: LDI R20, 125LP2: LDI R21, 250 LP3:
NOPDEC R21BRNE LP3DEC R20BRNE LP2DEC R19BRNE LP1POP R21
Trang 7BÀ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
+ Chân SCL là chân PD0
+ Chân SDA là chân PD1
b Vẽ hình mô tả kết nối trong bài thí nghiệm
SDA của vi xử lý nối với SDA của RTC SCL của vi xử lý nối với SCL của RTC PD0 nối với SW0
PD1 nối với SW1
POP R20POP R19RET
Trang 82. Lưu đồ giải thuật: 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
Trang 93. Mã nguồn và chú thích
.DEF NUM_MIN=R22 ;bi?n ??t giá tr? MIN
.EQU CTL_BYTE=0B11011110 ;byte ?i?u khi?n truy xu?t
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
Trang 10LDI R18,$28 ;Function set 2 dòng font 5x8,mode 4 bit
LDI R20,$0C ;display on,con tr? off
LDI R21,$06 ;Entry mode set d?ch ph?i con tr?,DDRAM t?ng 1 ?/c
LDI R17,$80 ;con tr? b?t ??u ? ??u dòng 1
RCALL CURS_POS ;xu?t l?nh ra LCD
LDI ZH,HIGH(MSG1<<1);Z tr? ??a ch? ??u b?ng MSG1 trong Flash ROM
LDI ZL,LOW(MSG1<<1)
RCALL MSG_DISP ;ghi MSG1 ra LCD
LDI R17,$C0 ;con tr? b?t ??u ? ??u dòng 2
RCALL CURS_POS ;xu?t l?nh ra LCD
LDI ZH,HIGH(MSG2<<1);Z tr? ??u b?ng tra MSG2
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_START ;phát xung START
LDI R17,(CTL_BYTE|0X00);truy xu?t 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?t ??c RTC_TCCR
Trang 11RCALL TWI_WRITE ;ghi RTC+R
CBR R17,(1<<STO) ;xóa bit ST
Trang 12LDI XH,HIGH(RTC_BUF+3);X tr? buffer RTC th?
LDI XL,LOW(RTC_BUF+3)
LDI POS_CRS,$84 ;??t con tr? v? trí th?
RCALL SET_NUM ;??t và hi?n th? th?
LDI XH,HIGH(RTC_BUF+2);X tr? buffer RTC gi?
LDI XH,HIGH(RTC_BUF+1);X tr? buffer RTC phút
LDI XL,LOW(RTC_BUF+1)
Trang 13LDI XH,HIGH(RTC_BUF);X tr? buffer RTC giây LDI
LDI XH,HIGH(RTC_BUF+4);X tr? buffer RTC ngày LDI XL,LOW(RTC_BUF+4)
LDI XH,HIGH(RTC_BUF+5);X tr? buffer RTC thángLDI XL,LOW(RTC_BUF+5)
LDI XH,HIGH(RTC_BUF+6);X tr? buffer RTC n?mLDI XL,LOW(RTC_BUF+6)
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âyRCALL TWI_WRITE ;ghi ??a ch? TCCR
Trang 14ANDI R17,(1<<SW1)|(1<<SW2);che bit SW1,SW2
CPI R17,(1<<SW1)|(1<<SW2);ki?m tra SW nh?n?
Trang 15CBR R17,(1<<STO) ;?úng,xóa bit ST
DAY_CHK:
MOV R17,NUM_MIN ;l?n h?n,tr? v? gi?i h?n MIN
RCALL NUM_DISP ;hi?n th? s? BCD ??t
RCALL DELAY_US
RCALL OUT_LCD ;hi?n th? giá tr?
;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
Trang 16;
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
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?
;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:
RCALL OUT_LCD ;ghi 1 byte data ra LCD
;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?n ghi 4bit
;Input: R17 ch?a mã l?nh/data,R16
Trang 17;bit RS=0/1:l?nh/data,bit RW=0:ghi
ANDI R17,$F0 ;l?y 4 bit th?p chuy?n thành cao
RCALL OUT_LCD4 ;ghi ra LCD
RET
;
;DELAY_US t?o th?i gian tr? =R16x100?s(Fosc=8Mhz)
;Input:R16 h? s? nhân th?i gian tr? 1 ??n 255
Trang 19BÀI 3
Thực hiện trên kit thí nghiệm:
1 Trả lời các câu hỏi
Trang 20.EQU SPI_DDR = DDRB.EQU SPI_PORT = PORTB.EQU SPI_SCK = 7.EQU SPI_MOSI = 5.EQU SPI_MISO = 6.EQU SPI_SS = 4 START:
RCALL SPI_MASTER_INIT RCALL USART_INITLDI R16, HIGH(RAMEND) OUT SPH, R16LDI R16, LOW(RAMEND) OUT SPL, R16
SBI SPI_PORT, SPI_SS MAIN:
LOOP:
RCALL USART_RECEIVE_CHAR CBI SPI_PORT, SPI_SS RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SS RJMPLOOP
SPI_MASTER_INIT:
LDI R16, (1 << SPI_MOSI) | (1 << SPI_SCK) | (1 << SPI_SS) OUT SPI_DDR, R16
CLR R16OUT SPI_PORT, R16LDI R16, (1 << SPE0) | (1 << MSTR0) | (1 << SPR00) OUT SPCR0, R16
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ố cao nhất của xung nhịp đầu vào cho 74595 là 25 MHz ở 4.5V Đây là tần suất hoạt
động tối đa được khuyến nghị cho thiết bị.
b Với clock là 8Mhz thì SPI của Atmega328 có tốc độ cao nhất là bao nhiêu?
+ Tốc độ cao nhất của SPI bạn có thể nhận được từ Atmega328P là một nửa của tốc độ CPU Vì
vậy, với một Arduino chạy ở 16MHz, tốc độ SPI cao nhất là 8MHz Với một clock là 8MHz, tốc độ SPI cao nhất là 4MHz.
2 Mã nguồn và chú thích
Trang 21RETSPI_MASTER_TRANSMIT: OUT SPDR0, R16
WAIT_TRANSMIT_CPLT:
IN R18, SPSR0 SBRS R18, SPIF0RJMP WAIT_TRANSMIT_CPLTRET
USART_INIT:
;SET BAUDRATE TO 9600BPS WITH 8MHZ CLOCK LDIR16, 0
STS UBRR0H, R16 LDI R16, 51 STSUBRR0L, R16
;SET FRAME FORMAT: 8 DATA BITS, NO PARITY, 1 STOP BIT LDIR16, (1 << UCSZ01) | (1 << UCSZ00)
STS UCSR0C, R16
;ENABLE TRANSMITTER AND RECEIVER LDI R16, (1 << RXEN0) | (1 << TXEN0) STS UCSR0B, R16
RETUSART_RECEIVE_CHAR:
PUSH R17
;WAIT FOR THE TRANSMITTER TO BE READY USART_RECEIVE_CHAR_WAIT:
LDS R17, UCSR0A SBRS R17, RXC0RJMP USART_RECEIVE_CHAR_WAIT LDS R16, UDR0
POP R17 RETUSART_SEND_CHAR:
PUSH R17
;WAIT FOR THE TRANSMITTER TO BE READY USART_SEND_CHAR_WAIT:LDS R17, UCSR0A
SBRS R17, UDRE0RJMP USART_SEND_CHAR_WAIT STS UDR0, R16
POP R17 RET
Trang 22.EQU SPI_DDR = DDRB.EQU SPI_PORT = PORTB.EQU SPI_SCK = 7.EQU SPI_MOSI = 5.EQU SPI_MISO = 6.EQU SPI_SS = 4.DEF TX_SPI_BUF = R23.DEF RX_SPI_BUF = R24
; DEF TX_BUF = R21.DEF RX_BUF = R22
; EQU WIP = 0.EQU WREN = $06.EQU RDSR = $05.EQU WRSR = $01.EQU SPI_RD = $03.EQU SPI_WR = $02.EQU PE = $42.EQU MEM_BYTE3 = $
.EQU MEM_BYTE21 = $0101
; .DEF COUNT = R25.ORG 0
RJMP INIT.ORG 0x40
1 Trả lời các câu hỏi
a Dung lượng của EEPROM 25AA1024 là bao nhiêu?
+ EEPROM 25AA1024 là bộ nhớ EEPROM nối tiếp 1024 Kbit với các chức năng EEPROM nối
tiếp cấp byte và cấp độ trang Nó được tổ chức dưới dạng một khối 128K x 8-bit Do đó, dung lượng của EEPROM 25AA1024 là 128 KB.
b Theo datasheet, tần số nhanh nhất của xung CK đưa vào EEPROM này
là bao nhiêu?
+ Tần số nhanh nhất của xung CK được đưa vào EEPROM này là 20 MHz Đây là tốc độ xung
nhịp tối đa của thiết bị.
2 Mã nguồn và chú thích
BÀI 4
Trang 23LDI R16, HIGH(RAMEND) OUT SPH, R16LDI R16, LOW(RAMEND) OUT SPL, R16
RCALL SPI_MASTER_INIT RCALL UART_INITCLR RX_BUF CLR TX_BUFCLR TX_SPI_BUFCLR RX_SPI_BUFLDI COUNT, 0SBI SPI_PORT, SPI_SS SER R16
OUT DDRA, R16 RCALL EEPROM_READMOV COUNT, RX_SPI_BUF CPI COUNT, $FFBRNE MAIN CLR COUNTMAIN:
RCALL UART_RECEIVE_CHAR INCCOUNT
RCALL EEPROM_DELRCALL EEPROM_WRITE OUT PORTA, COUNTRJMP MAIN
RETSPI_MASTER_TRANSMIT:
PUSH R18OUT SPDR0, TX_SPI_BUF WAIT_TRANSMIT_CPLT:
IN R18, SPSR0 SBRS R18, SPIF0RJMP WAIT_TRANSMIT_CPLT
IN RX_SPI_BUF, SPDR0POP R18
Trang 24;SET BAUDRATE TO 9600BPS WITH 8MHZ CLOCK LDIR16, 0
STS UBRR0H, R16 LDI R16, 51 STSUBRR0L, R16
;SET FRAME FORMAT: 8 DATA BITS, NO PARITY, 1 STOP BIT LDIR16, (1 << UCSZ01) | (1 << UCSZ00)
STS UCSR0C, R16
;ENABLE TRANSMITTER AND RECEIVERLDI R16, (1 << RXEN0) | (1 << TXEN0) STS UCSR0B, R16
RETUART_RECEIVE_CHAR: PUSHR17
;WAIT FOR THE TRANSMITTER TO BE READY UART_RECEIVE_CHAR_WAIT:LDS R17, UCSR0A
SBRS R17, RXC0RJMP UART_RECEIVE_CHAR_WAIT LDS RX_BUF, UDR0
POP R17 RETUART_SEND_CHAR: PUSHR17
;WAIT FOR THE TRANSMITTER TO BE READY UART_SEND_CHAR_WAIT:LDS R17, UCSR0A
SBRS R17, UDRE0RJMP UART_SEND_CHAR_WAIT STSUDR0, TX_BUF
POP R17 RETEEPROM_READ:
;SEND ADDRESS TO EEPROM LDITX_SPI_BUF, SPI_RD CBI SPI_PORT, SPI_SSRCALL SPI_MASTER_TRANSMITLDI TX_SPI_BUF, MEM_BYTE3 RCALL SPI_MASTER_TRANSMITLDI TX_SPI_BUF, HIGH(MEM_BYTE21) RCALL SPI_MASTER_TRANSMIT
Trang 25LDI TX_SPI_BUF, LOW(MEM_BYTE21)RCALL SPI_MASTER_TRANSMIT ; LAY DIA CHI TRONG EEPROM
;READ DATA FROM EEPROMLDI TX_SPI_BUF, $FF RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SSRET
EEPROM_WRITE:
;ENABLE WIRTE DATA LDI TX_SPI_BUF, WREN CBI SPI_PORT, SPI_SS
RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SSLDI TX_SPI_BUF, SPI_WR CBISPI_PORT, SPI_SS RCALL SPI_MASTER_TRANSMIT
;SEND ADDRESS TO EEPROM LDI TX_SPI_BUF, MEM_BYTE3 RCALL SPI_MASTER_TRANSMITLDI TX_SPI_BUF, HIGH(MEM_BYTE21) RCALL SPI_MASTER_TRANSMIT
LDI TX_SPI_BUF, LOW(MEM_BYTE21) RCALL SPI_MASTER_TRANSMIT
;WRITE DATA TO EEPROMMOV TX_SPI_BUF, COUNT RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SSCHECK_IN_PROCESS:
CBI SPI_PORT, SPI_SS LDI TX_SPI_BUF, RDSRRCALL SPI_MASTER_TRANSMIT SBRC RX_SPI_BUF, WIP RJMPCHECK_IN_PROCESS SBI SPI_PORT, SPI_SSRET
EEPROM_DEL:
;ENABLE WIRTE DATA LDI TX_SPI_BUF, WREN CBI SPI_PORT, SPI_SS
RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SS
Trang 26BÀ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à 1KB.
b Liệt kê sự khác nhau giữa SRAM và EEPROM
LDI TX_SPI_BUF, LOW(MEM_BYTE21) RCALL SPI_MASTER_TRANSMIT
;WRITE DATA TO EEPROMMOV TX_SPI_BUF, COUNT RCALL SPI_MASTER_TRANSMIT SBI SPI_PORT, SPI_SSCHECK_IN_PROCESS_DEL:
CBI SPI_PORT, SPI_SS LDI TX_SPI_BUF, RDSRRCALL SPI_MASTER_TRANSMIT SBRC RX_SPI_BUF, WIP RJMP CHECK_IN_PROCESS_DEL SBI SPI_PORT, SPI_SS
RET