www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM verliert Daten!


Autor: Daniel B. (scheinleistung)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich habe festgestellt dass die paar Variablen die ich im EEPROM ablege 
(5% ausgelastet) manchmal verloren gehen. Beim Aufruf wird dann irg 
etwas anderes, aber nicht der abgespeicherte Wert ausgelesen. Das 
passiert aber nur selten deshalb kann ich es nicht recht 
nachvollziehen... hat jemand eine Idee wiran das liegen kann? Folgendes 
sollte doch korrekt sein?!

Verwende folgende Lib
#include <avr/eeprom.h>  

Schreibe zB wie folgt:
for(i = 0; i<6; i++)
{
eeprom_write_byte(&eeChannelArray[i], channelArray[i]);

eeprom_write_word(&eeBatteryLevel[i], batteryLevel[i]);
}

und lese wie folgt:
channeArray[i] = eeprom_read_byte(&eeChannelArray[i]);
    
batteryLevel[i] = eeprom_read_word(&eeBatteryLevel[i]);


Init:
unsigned char eeChannelArray[6] EEMEM = { JOB0, JOB1, JOB2, JOB3, JOB4, JOB5};

Autor: Basic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du so Doof oder tust Du nur so.

Lerne erst mal durchs lesen

Als erstes muss geprüft werden, ob ein vorheriger Schreibzugriff schon 
abgeschlossen ist. Danach wird die EEPROM-Adresse, auf die geschrieben 
wird, in das IO-Register EEAR (EEPROM Address Register) geladen. Dann 
schreibt man die Daten, welche man auf der im Adressregister 
abgespeicherten Position ablegen will ins Register EEDR (EEPROM Data 
Register). Als nächstes setzt man das EEMWE Bit im 
EEPROM-Kontrollregister EECR (EEPROM Control Register) um den 
Schreibvorgang vorzubereiten. Nun wird es zeitkritisch - es darf nun 
keinesfalls ein Interrupt dazwischenfahren - denn man muss innerhalb von 
4 Taktzyklen das EEWE Bit setzen um den Schreibvorgang auszulösen. Um 
das unter allen Bedingungen sicherzustellen werden die Interrupts kurz 
gesperrt. Danach startet der Schreibvorgang und läuft automatisch ab. 
Wenn er beendet ist, wird von der Hardware das EEWE Bit im Register EECR 
wieder gelöscht.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brownout Fuse aktiv (empfohlen) oder nicht (nicht empfohlen)? Wie 
oft schreibst du in das EEPROM, bist du schon über den X Schreibzyklen 
("the number of writes to EEPROM is not unlimited")?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Als erstes muss geprüft werden, ob ein vorheriger Schreibzugriff schon
>abgeschlossen ist. Danach wird die EEPROM-Adresse, auf die geschrieben
>wird, in das IO-Register EEAR (EEPROM Address Register) geladen. Dann
>schreibt man die Daten, welche man auf der im Adressregister

Ups, ein Hellseher. Du weisst also, was sich hinter 'eeprom_write_byte' 
vebirgt?

MfG Spess

Autor: Daniel B. (scheinleistung)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Nein, im Prinzip speichert man nur ein einziges Mal ins EEPROM 
(Parameterisierung) und liest dann nur noch beim "Hochfahren" der 
Elektronik. Und das kann tagelang gut gehen. Und dann auf einmal wird 
Mist gelesen. D.h. aber auch dass die Schreibvvorgänge alle funktioniert 
haben...

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie lange nach dem Hochfahren wartest Du, bis Du aus dem EEPROM liest? 
Eventuell ist es noch nicht bereit und bekommt dadurch die Abfrage in 
den falschen Hals?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ein anderer (und nicht ganz so unhöflicher) Tip: Brownout-Detektor 
einschalten, wenn der EEPROM benutzt wird. Das erste Byte (#0) möglichst 
nicht benutzen (mit Dummy-Variable füllen), da es besonders häufig von 
Datenverlust betroffen zu sein scheint.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das schliesst jedoch nicht aus, dass die Vcc im tagelangen Betrieb 
einmal in einen Spannungsbereich abfällt, in dem der µC noch nicht 
abstürzt, aber das EEPROM beim Lesen oder Schreiben kompromittiert wird.

Die Brownout Fuse kann verhindern, dass der AVR in diesem miesen 
Vcc-Bereich überhaupt arbeitet. Dadurch dass der µC unterhalb des 
Brownout-Levels in den Reset gezwungen wird.

Und man kann am Programmanfang auswerten und anzeigen, ob ein 
Brownout-Reset (oder je nach µC andere Resets) aufgetreten ist.

Hast du einen Überblick, ob der AVR durchläuft oder ob unbeobachtete 
Resets (Power-On, Watchdog, Brownout) stattgefunden haben, die eine 
höhere EEPROM-Schreiblast erzeugen als angenommen?

Kannst du eine Häufung von Fehlern an bestimmten EEPROM Adressen 
feststellen? Adresse 0 ist da besonders interessant.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. Berg schrieb:
> hat jemand eine Idee wiran das liegen kann?

Im Datenblatt steht, daß Brown-Out an sein muß oder ein externer 
Reset-IC dran.


Peter

Autor: Daniel B. (scheinleistung)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erst mal für Eure Tipps!

Also gelesen wird der EEPROM erst nach der Begrüßungssequenz das sind 
mehrere 100ms.

BrownOut ist inaktiv, da würde ich mich dann mal ran machen! Und danach 
teste ich das nochmal durch.

Prinzipiell sind aber meine lese und schreibe Vorgänge (s.o.) ,oder? Und 
da ich auf dem EEPROM mit keinerlei weiterer Zeiger Arithmetik arbeite 
sollte da auch nichts schief gehen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. Berg schrieb:
> Prinzipiell sind aber meine lese und schreibe Vorgänge (s.o.) ,oder?

Naja, ich finde die AVR-GCC Funktionen ziemlich umständlich, langsam und 
groß.
Ich lege immer eine Kopie im SRAM an zum Arbeiten und lese/schreibe mit 
einer Funktion dann den EEPROM:

http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Der Vorteil neben der Kleinheit ist auch, daß sie unnötiges Schreiben 
vermeidet.
Man kann also immer die ganze Struktur zum Schreiben übergeben und sie 
schreibt nur die Änderungen.

Da die GCC-Funktionen über einen indirekten Call aufgerufen werden, kann 
ich mir auch gut vorstellen, daß ein wildgewordener Pointer oder ein 
Stacküberlauf ein versehentliches Schreiben auslöst.


Peter

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.