ATmega48/88/168
Simple Assembly Code
Example for a Boot Loader
Note that the RWWSB bit will always be read as zero in ATmega48. Nevertheless, it is
recommended to check this bit as shown in the code example, to ensure compatibility
with devices supporting Read-While-Write.
;-the routine writes one page of data from RAM to Flash
; the first data location in RAM is pointed to by the Y pointer
; the first data location in Flash is pointed to by the Z-pointer
;-error handling is not included
;-the routine must be placed inside the Boot space
; (at least the Do_spm sub routine). Only code inside NRWW section can
; be read during Self-Programming (Page Erase and Page Write).
;-registers used: r0, r1, temp1 (r16), temp2 (r17), looplo (r24),
; loophi (r25), spmcrval (r20)
; storing and restoring of registers is not included in the routine
; register usage can be optimized at the expense of code size
;-It is assumed that either the interrupt table is moved to the Boot
; loader section or that the interrupts are disabled.
.equ
PAGESIZEB = PAGESIZE*2
;PAGESIZEB is page size in
BYTES, not words
.org SMALLBOOTSTART
Write_page:
;
Page Erase
ldi
rcall
spmcrval, (1<<PGERS) | (1<<SELFPRGEN)
Do_spm
;
re-enable the RWW section
ldi
rcall
spmcrval, (1<<RWWSRE) | (1<<SELFPRGEN)
Do_spm
;
ldi
ldi
transfer data from RAM to Flash page buffer
looplo, low(PAGESIZEB)
;init loop variable
;not required for PAGESI-
loophi, high(PAGESIZEB)
ZEB<=256
Wrloop:
ld
r0, Y+
ld
r1, Y+
ldi
rcall
adiw
spmcrval, (1<<SELFPRGEN)
Do_spm
ZH:ZL, 2
sbiw
loophi:looplo, 2
;use
subi
for
PAGESI-
ZEB<=256
brne
Wrloop
;
execute Page Write
subi
sbci
ZL, low(PAGESIZEB)
ZH, high(PAGESIZEB)
;restore pointer
;not required for PAGESI-
ZEB<=256
ldi
rcall
spmcrval, (1<<PGWRT) | (1<<SELFPRGEN)
Do_spm
;
re-enable the RWW section
ldi
rcall
spmcrval, (1<<RWWSRE) | (1<<SELFPRGEN)
Do_spm
;
read back and check, optional
ldi
ldi
looplo, low(PAGESIZEB)
loophi, high(PAGESIZEB)
;init loop variable
;not required for PAGESI-
ZEB<=256
subi
sbci
Rdloop:
lpm
ld
cpse
rjmp
YL, low(PAGESIZEB)
YH, high(PAGESIZEB)
;restore pointer
r0, Z+
r1, Y+
r0, r1
Error
253
2545D–AVR–07/04