Code:
; WRITE INTERNAL EEPROM
; Data to Write: R30
; Adress Hi Byte: R29
; Adress Lo Byte: R28
;
WRITE_EEPROM: PUSH R30 ; Store write value to stack
RCALL READ_EEPROM ; Check if value to write is same as content of EEPROM cell
MOV R31, R30 ; Move the current content of the EEPROM cell to R31
POP R30 ; Restore write value from stack
CP R30, R31 ; Compare current EEPROM content with new value
BRNE WAIT_EEWE ; If it is not equal, then write it
RET ; Don't stress EEPROM if the value is already there ...
WAIT_EEWE: SBIC EECR, EEWE ;
RJMP WAIT_EEWE ; wait until bit EEWE in EEPROM Control Register is clear
WAIT_SPMEN: IN R31, SPMCR ;
sbrc R31, SPMEN ;
RJMP WAIT_SPMEN ; wait until bit SPMEN in SPMCR is clear
OUT EEARH,R29 ; output address high
OUT EEARL,R28 ; output address low
OUT EEDR,R30 ; output data
SBI EECR,EEMWE ; set master write enable
SBI EECR,EEWE ; set EEPROM Write strobe
RET ;
;
; READ INTERNAL EEPROM
; Adress Hi Byte: R29
; Adress Lo Byte: R28
; Read Data : R30
;
READ_EEPROM: SBIC EECR,EEWE ; if EEWE not clear
RJMP READ_EEPROM ; wait more
OUT EEARH,R29 ; EEPROM address high
OUT EEARL,R28 ; EEPROM address low
SBI EECR,EERE ; set EEPROM Read strobe
IN R30,EEDR ; get data
RET ;