beautypg.com

Atmega163(l) – Rainbow Electronics ATmega163L User Manual

Page 122

background image

ATmega163(L)

122

ldi

spmcrval, (1<

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<

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<

call

Do_spm

; re-enable the Application Section

ldi

spmcrval, (1<

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<

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