EEProm screiben und lesen

Gast #8016
Lesenswert?

;========================================
;=  R20 -> Adresse      =
;=  R21 -> Daten      =
;========================================

;----EEPROM-Daten lesen-----------------
eeprom_read:  out  EEAR, r20  ;EEPROM Adresse setzen
    sbi  EECR, 0    ;EEPROM lesen-Bit setzen
eeprom_r_wait:  sbic  EECR, 0    ;Bit wieder gelöscht?
    rjmp  eeprom_r_wait  ;nein
    in  r21, EEDR
    ret
;---------------------------------------

;----EEPROM-Daten schreiben-------------
eeprom_write:  sbic  EECR, 1
    rjmp  eeprom_write
    out  EEAR, r20  ;EEPROM Adresse setzen
    out  EEDR, r21  ;Daten
    sbi  EECR, 2    ;EEPROM MasterWriteEnable
    sbi  EECR, 1    ;EEPROM WriteEnable
eeprom_w_wait:  sbic  EECR, 1
    rjmp  eeprom_w_wait
    ret
;---------------------------------------

Danke an Steffen
Admin Persönliche Seite #8019
Lesenswert?

Das Warten auf den Reset von EECR, 0 kann man sich laut Datenblatt 
sparen. Stattdessen sollte lieber geprüft werden, ob ein möglicherweise 
vorhergehender Schreibvorgang schon abgeschlossen wurde.
Und beim Schreiben würde es auch mehr Sinn machen am Anfang zu prüfen ob 
das EEPROM bereit ist, da das Programm NACH dem schreiben ja ruhig 
weiterlaufen kann, auch wenn der Schreibvorgang noch läuft.

MfG
Andreas
Gast #8020
Lesenswert?

Hallo,

ich programmiere noch nicht lange ASM, und genau dieses Prog habe ich 
gesucht.
Ich habe es versucht für meinen 8515 umzuschreiben, es tut bei mir ohne 
Probleme.

Vielleicht hat ja jemand interesse daran.

Vielen Dank an Steffen.

MfG

Heye-Tammo
Angehängte Dateien:
Gast #496292
Lesenswert?

Hallo,

ich habe da irgendwie ein komisches Problem beim Arbeiten mit dem EEPROM 
im Mega162:

Am Ende des Listings habe ich folgendes zu stehen:
.eseg
text:
.db "Hallo!",0

Die Adressen werden korrekt in die EEARL/H geschrieben aber trotzdem 
landet nach einem sbi EECR,EERE immer nur 0xFF im EEDR.
Der EEPROM-Bereich ist korrekt beschrieben, wie ich nach einem Auslesen 
durch die ISP-Software festgestellt habe.

Hat jemand einen Tipp?

Gruß Max
Gast #496451
Lesenswert?

Kleiner Tip. Um bösen Überaschungen vorzubeugen sollte man für die 
Schreibsequenz die Interrupts sperren. Also

;----EEPROM-Daten schreiben-------------
eeprom_write:  sbic  EECR, 1
    rjmp  eeprom_write
    out  EEAR, r20  ;EEPROM Adresse setzen
    out  EEDR, r21  ;Daten
    in   r16,sreg   ; SREG sichern
    cli             ; Interrupts garantiert ausschalten
    sbi  EECR, 2    ;EEPROM MasterWriteEnable
    sbi  EECR, 1    ;EEPROM WriteEnable
    out sreg,r16    ; SREG wieder herstellen, mit oder ohne I Bit
eeprom_w_wait:  sbic  EECR, 1
    rjmp  eeprom_w_wait
    ret
;---------------------------------------

MFG
Falk
Gast #496625
Lesenswert?

(Noch) benutze ich ja keine Interrupts.

In dem Handbuch vom Mega162 steht, dass der interne Oszillator für das 
Timing des EEPROMs verwendet wird. Ich takte den Prozessor aber mit 
einem externen Clock. Ist das ein Problem?

Gruß Max

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren