Rainbow Electronics ATmega64M1 User Manual

Page 283

Advertising
background image

283

8209A–AVR–08/09

ATmega16M1/32M1/64M1

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 RWW section

ldi

spmcrval, (1<<RWWSRE) | (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, 1

;use subi for PAGESIZEB<=256

brne Rdloop

; return to RWW section

; verify that RWW section is safe to read

Return:

in

temp1, SPMCSR

sbrs temp1, RWWSB

; If RWWSB is set, the RWW section is not ready yet

ret

; re-enable the RWW section

ldi

spmcrval, (1<<RWWSRE) | (1<<SPMEN)

call Do_spm

rjmp Return

Do_spm:

; check for previous SPM complete

Wait_spm:

in

temp1, SPMCSR

sbrc temp1, SPMEN

rjmp Wait_spm

; input: spmcrval determines SPM action

; disable interrupts if enabled, store status

in

temp2, SREG

cli

; check that no EEPROM write access is present

Wait_ee:

sbic EECR, EEPE

rjmp Wait_ee

; SPM timed sequence

out

SPMCSR, spmcrval

spm

; restore SREG (to enable interrupts if originally enabled)

out

SREG, temp2

ret

Advertising