Atmega8 EEPROM Schreiben/Lesen nur mit delay möglich

Gast #616371
Lesenswert?
• ▲
▼
Hallo,

wenn ich Daten von meiner Gpsmaus, die im SRAM liegen, in den EEPROM 
speichern will, muss ich ein delay direkt nach dem Schreiben einbauen, 
weil es sonst vorkommt, dass er manche Bytes fehlerhaft ablegt.

Hier meine Schleife:
1
                                              EEPROM_write:                  out EEARL, xl                    ; und ins EEARL schreiben  
2
                    out EEARH, xh                    ; und ins EEARH schreiben 
3

4
                                      
5
                    sbic EECR,EEWE                   ; Vorherigen Schreibvorgang abwarten                 
6
                    rjmp EEPROM_write 
7
                                    
8
                    out EEDR,temp1                   ; Daten ins EEPROM-Datenregister
9
                
10
                    sbi EECR,EEMWE                   ; Schreiben vorbereiten
11
                    sbi EECR,EEWE                    ; Und los !
12

13
                    inc xl        ; low-Teil des Zeigers um 1 weiter
14
                    tst xl        ; Überlauf(255+1=0) ?
15
                    brne no_overflow    ; wenn nicht dann normal weiter
16
                    inc xh        ; andernfalls high-Teil um 1 erhöhen
17
                          ; (overflow des high-Teils wird oben gecheckt...)  
18

19
                    no_overflow:    ; Sprungemarke für keinen Überlauf
20
                    rcall delay100ms
21

22
ret
Mit Delay funktioniert es Problemlos!!NUR WARUM ?
Habe auch beim Lesen vom EEPROM ähnliche Probleme...
mfg
Gast #616386
Lesenswert?
• ▲
▼
Ich glaube du darfst das EEPROM-Adress_Register nicht ändern, solange 
das EEprom 'beschäftigt' ist.
    sbic EECR,EEWE    ; Vorherigen Schreibvorgang abwarten
    rjmp EEPROM_write
Diese Zeileb müssen wahrscheinlich vor die Änderung von EEARH/L.
Und schau mal im Datasheet nach wie lang das Schreiben dauern kann 
(IIRC. ~4ms!).
Manche AVRs haben sogar einen EPROm-Ready-Interrupt, wahrscheinlich eben 
weil das EEPROM so langsam ist.

hth. Jörg
#616505
Lesenswert?
• ▲
▼
Hi digitus,

Du musst erst die Statusabfrage machen, bevor Du die Adresse setzt.
Funktioniert bei mir so einwandfrei.

Aus dem Atmel-Datenblatt:

EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEWE
rjmp EEPROM_write
; Set up address (r18:r17) in address register
out EEARH, r18
out EEARL, r17
; Write data (r16) to data register
out EEDR,r16
; Write logical one to EEMWE
sbi EECR,EEMWE
; Start eeprom write by setting EEWE
sbi EECR,EEWE
ret

VG
Volkmar

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