Datasheet

180
ATmega323(L)
1457E11/01
sbiw loophi:looplo, 2 ;use subi for PAGESIZEB<=256
brne Wrloop
; execute page write
subi ZL, low(PAGESIZEB) ;restore pointer
sbci ZH, high(PAGESIZEB) ;not required for PAGESIZEB<=256
ldi spmcrval, (1<<PGWRT) + (1<<SPMEN)
call Do_spm
; re-enable the Application Section
ldi spmcrval, (1<<ASRE) + (1<<SPMEN)
call Do_spm
; read back and check, optional
ldi looplo, low(PAGESIZEB) ;init loop variable
ldi loophi, high(PAGESIZEB);not required for PAGESIZEB<=256
subi YL, low(PAGESIZEB) ;restore pointer
sbci YH, high(PAGESIZEB)
Rdloop:
lpm r0, Z+
ld r1, Y+
cpse r0, r1
jmp Error
sbiw loophi:looplo, 2 ;use subi for PAGESIZEB<=256
brne Rdloop
; return to Application Section
; verify that Application Section is safe to read
Return:
in temp1, SPMCR
sbrs temp1, ASB ; If ASB is set, the AS is not ready yet
ret
; re-enable the Applicaiton Section
ldi spmcrval, (1<<ASRE) + (1<<SPMEN)
call Do_spm
rjmp Return
Do_spm:
; input: spmcrval determines SPM action
; check that no EEPROM write access is running
Wait_ee:
sbic EECR, EEWE
rjmp Wait_ee
; SPM timed sequence
out SPMCR, spmcrval
spm
.dw $FFFF ; ensure proper pipelining
nop ; of next instruction
; check for SPM complete
Wait_spm:
in temp1, SPMCR
sbrc temp1, SPMEN
rjmp Wait_spm
ret