Forum: Mikrocontroller und Digitale Elektronik Atmega8 EEPROM Schreiben/Lesen nur mit delay möglich


von digitus (Gast)


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

von Jörg X. (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

Das Schreiben des EEPROM dauert einige ms. Es muss unbedingt gewartet 
werden, bis das EEPROM wieder bereit ist.

von Volkmar e. P. (keepitsimple)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.