Das kann doch nicht so schwierig sein!
Hier zwei Routinen zum lesen vom uns schreiben in das EEPRO welche ich
mal gemacht habe:
;Schreiben eines Byte in das EEPROM.
;Dabei wird vor dem Schreiben an der gleichen
;Adresse gelesen und geprüft, ob der Wert in
;der angegebenen Adresse schon vorhanden ist
;um die Schreibzyklen zu erhöhen.
.def EEPByte=r16
.def EEPTemp=r17
EEPWB:
push EEPTemp
mov EEPTemp,EEPByte
rcall EEPRB
cp EEPTemp,EEPByte
breq EEPWBExit
out EEDR,EEPTemp
cli
sbi EECR,EEMWE
sbi EECR,EEWE
sei
EEPWBExit:
pop EEPTemp
ret
EEPRB:
sbic EECR,EEWE
rjmp EEPRB
out EEARH,xh
out EEARL,xl
sbi EECR,EERE
adiw xl,1
in EEPByte,EEDR
ret
Die Routine "EEPRB" ist zum lesen eines Bytes (EEP Read Byte) und die
Routine "EEPWB" zum schreiben (EEP Write Byte).
Die Routine EEPWB ruft Anfangs die Routine EEPRB auf um zu checken, ob
der gleiche Wert in einer EEPROM-Zelle schon enthalten ist.
Ist das der Fall, wird nicht geschrieben um die Write-Zyklen zu erhöhen
da der selbe Wert schon enthalten ist.
Auch ganz paraktisch einen ganzen Block von z. B. Einstellbaren
Parametern zu speichern wenn nur einer der Parameter verändert wird.
Da kann man dann jedes mal mit einer Routine alle speicherbaren
Parameter übergeben ohne das man für jeden Parameter eine Adresse
errechnen lassen muß und ohne das die Schreib-Zyklen unnötig minnimiert
werden.
An beiden Routinen übergibt man in X (XL und XH) die EEPROM-Adresse und
in R16 den zu schreibenden Wert.
Beim lesen ist nach EEPRB der Wert in R16.
Beispiel:
Schreiben:
ldi r16,105 ;Zu schreibende Zahl
ldi xl,low(312) ;Adresse low-Byte
ldi xh,high(312) ;Adresse high-Byte
rcall EEPWB ;Wert in R16 in EEPROM schreiben
Lesen:
ldi xl,low(312) ;Adresse low-Byte
ldi xh,high(312) ;Adresse high-Byte
rcall EEPWB ;Wert in R16 vom EEPROM lesen
... ;In R16 ist der Wert von der EEPROM-Adresse X.
Wenn das mit X (XL und XH) für die Adress-Übergabe nicht passt, kann
man ja ändern auf Y (YL und YH) oder Z (ZL und ZH).
Innerhalb der beiden Routinen wird der Adress-Pointer, in diesem Fall
X, nach einer Aktion áutomatisch um 1 erhöht.
Ist auch ganz Hilfreich für Block-Lese/Schreib-Routinen die sich dann
das erhöhen des Pointers schenken können.
Gruß
Andi