Atmega163(l) – Rainbow Electronics ATmega163L User Manual
Page 122

ATmega163(L)
122
ldi
spmcrval, (1<<ASRE) + (1<<SPMEN)
call
Do_spm
; transfer data from RAM to Flash page buffer
ldi
looplo, low(PAGESIZEB)
;init loop variable
ldi
loophi, high(PAGESIZEB)
;not required for PAGESIZEB<=256
Wrloop:
ld
r0, Y+
ld
r1, Y+
ldi
spmcrval, (1<<SPMEN)
call
Do_spm
adiw
ZH:ZL, 2
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