;**** A P P L I C A T I O N N O T E A V R 1 0 0 ************************
;*
;* Title: Accessing the AT90S1200 EEPROM
;* Version: 1.1
;* Last updated: 97.07.17
;* Target: AT90S1200
;*
;* Support E-mail: avr@atmel.com
;*
;* DESCRIPTION
;* This Application note shows how to read data from and write data to the
;* EEPROM. Both random access and sequential access routines are listed.
;*
;***************************************************************************
.include "1200def.inc"
rjmp RESET ;Reset Handle
;***************************************************************************
;*
;* EEWrite
;*
;* This subroutine waits until the EEPROM is ready to be programmed, then
;* programs the EEPROM with register variable "EEdwr" at address "EEawr"
;*
;* Number of words :5 + return
;* Number of cycles :10 + return (if EEPROM is ready)
;* Low Registers used :None
;* High Registers used: ;2 (EEdwr,EEawr)
;*
;***************************************************************************
;***** Subroutine register variables
.def EEdwr =r16 ;data byte to write to EEPROM
.def EEawr =r17 ;address to write to
;***** Code
EEWrite:
sbic EECR,EEWE ;if EEWE not clear
rjmp EEWrite ; wait more
out EEAR,EEawr ;output address
out EEDR,EEdwr ;output data
sbi EECR,EEWE ;set EEPROM Write strobe
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
ret
;***************************************************************************
;*
;* EERead
;*
;* This subroutine waits until the EEPROM is ready to be programmed, then
;* reads the register variable "EEdrd" from address "EEard"
;*
;* Number of words :6 + return
;* Number of cycles :12 + return (if EEPROM is ready)
;* Low Registers used :1 (EEdrd)
;* High Registers used: :1 (EEard)
;*
;***************************************************************************
;***** Subroutine register variables
.def EEdrd =r0 ;result data byte
.def EEard =r16 ;address to read from
;***** Code
EERead:
sbic EECR,EEWE ;if EEWE not clear
rjmp EERead ; wait more
out EEDR,EEard ;output address
sbi EECR,EERE ;set EEPROM Read strobe
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
sbi EECR,EERE ;set EEPROM Read strobe 2nd time
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
in EEdrd,EEDR ;get data
ret
;***************************************************************************
;*
;* EEWrite_seq
;*
;* This subroutine increments the EEPROM address by one and waits until the
;* EEPROM is ready for programming. It then programs the EEPROM with
;* register variable "EEdwr_s".
;*
;* Number of words :7 + return
;* Number of cycles :10 + return (if EEPROM is ready)
;* Low Registers used :1 (EEWtmp)
;* High Registers used: :1 (EEdwr_s)
;*
;***************************************************************************
;***** Subroutine register variables
.def EEwtmp =r0 ;temporary storage of address
.def EEdwr_s =r16 ;data to write
;***** Code
EEWrite_seq:
sbic EECR,EEWE ;if EEWE not clear
rjmp EEWrite_seq ; wait more
in EEwtmp,EEAR ;get address
inc EEwtmp ;increment address
out EEAR,EEwtmp ;output address
out EEDR,EEdwr_s ;output data
sbi EECR,EEWE ;set EEPROM Write strobe
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
ret
;***************************************************************************
;*
;* EERead_seq
;*
;* This subroutine increments the address stored in EEAR and reads the
;* EEPROM into the register variable "EEdrd_s".
;*
;* Number of words :6 + return
;* Number of cycles :12 + return (if EEPROM is ready)
;* Low Registers used :2 (EErtmp,EEdrd_s)
;* High Registers used: :None
;*
;***************************************************************************
;***** Subroutine register variables
.def EErtmp =r0 ;temporary storage of address
.def EEdrd_s =r1 ;result data byte
;***** Code
EERead_seq:
in EErtmp,EEAR ;get address
inc EErtmp ;increment address
out EEAR,EErtmp ;output address
sbi EECR,EERE ;set EEPROM Read strobe
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
sbi EECR,EERE ;set EEPROM Read strobe 2nd time
;This instruction takes 4 clock cycles since
;it halts the CPU for two clock cycles
in EEdrd_s,EEDR ;get data
ret
;****************************************************************************
;*
;* Test/Example Program
;*
;****************************************************************************
;***** Main Program Register variables
.def counter =r18
.def temp =r19
;***** Code
RESET:
;***** Program a random location
ldi EEdwr,$aa
ldi EEawr,$10
rcall EEWrite ;store $aa in EEPROM location $10
;***** Read from a random locations
ldi EEard,$10
rcall EERead ;read address $10
out PORTB,EEdrd ;output value to Port B
;***** Fill the EEPROM with bit pattern $55,$aa,$55,$aa,...
ldi counter,64 ;init loop counter
ser temp
out EEAR,temp ;EEAR <- $ff (start address - 1)
loop1: ldi EEdwr_s,$55
rcall EEWrite_seq ;program EEPROM with $55
ldi EEdwr_s,$aa
rcall EEWrite_seq ;program EEPROM with $aa
dec counter ;decrement counter
brne loop1 ;and loop more if not done
;***** Copy 10 first bytes of EEPROM to r2-r11
ldi temp,$ff
out EEAR,temp ;EEAR <- $ff (start address - 1)
ldi ZL,2 ;Z-pointer points to r2
loop2: rcall EERead_seq ;get EEPROM data
st Z,EEdrd_s ;store to SRAM
inc ZL
cpi ZL,12 ;reached the end?
brne loop2 ;if not, loop more
forever:rjmp forever ;eternal loop