mikrocontroller.net

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


Autor: digitus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
                                              EEPROM_write:                  out EEARL, xl                    ; und ins EEARL schreiben  
                    out EEARH, xh                    ; und ins EEARH schreiben 

                                      
                    sbic EECR,EEWE                   ; Vorherigen Schreibvorgang abwarten                 
                    rjmp EEPROM_write 
                                    
                    out EEDR,temp1                   ; Daten ins EEPROM-Datenregister
                
                    sbi EECR,EEMWE                   ; Schreiben vorbereiten
                    sbi EECR,EEWE                    ; Und los !

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

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

ret
Mit Delay funktioniert es Problemlos!!NUR WARUM ?
Habe auch beim Lesen vom EEPROM ähnliche Probleme...
mfg

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Volkmar e. P. (keepitsimple)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.