Forum: Mikrocontroller und Digitale Elektronik ATMega - EEprom oft überschreiben


von Marcel Pokrandt (Gast)


Lesenswert?

Hallihallo,
ich steh grad vor dem Problem, dass ich einen Wert in relativ
regelmässigen Abständen zwischenspeichern möchte, der mir nicht
verloren gehen soll.... da ich leider keine Möglichkeit kenne, nur das
SRAM mit Strom zu versorgen und den Prozessor abzuschalten, ist also
EEprom mein Mittel der Wahl. Da ich das aber etwa alle 2-3min
aktualisieren möchte, ist wohl über kurz oder lang damit zu rechnen,
dass die EEPROM-Zellen ausfallen (so etwa nach nem Jahr, wenn ich dem
Datenblatt glauben darf). Da ich natürlich nicht nach nem Jahr das Teil
ausbauen & den ATMEGA tauschen möchte, hab ich gelesen, man soll die
beschriebenen Zellen wechseln.

Ok... Dann dacht ich mir einfach: definier ich mir ein EEPROM-Array und
einen Zeiger. Der Zeiger steht zunächst auf 0 und zeigt an, welche
Speicherstelle (des Arrays) aktuell genutzt wird. Wenn ich nu schreibe,
wollte ich den Wert schreiben und anschliessend lesen + vergleichen.
Wenn der Wert ok ist, ist alles schön... sonst erhöh ich den Zeiger um
+1 (den ich ins EEPROM schreibe) und schreibe&vergleiche nochmal.
Diesmal also in die nächste Zelle. Damit erhoffe ich mir, wenn ich für
das Array die Größe 10 wähle eine überdimensionierte Lebenserwartung
von ~~10 Jahren.

JETZT DER KNACKPUNKT: Kann ich davon ausgehen, dass die Zelle - wenn
sie kaputt ist - beim direkt nachfolgenden Auslesen bereits einen
fehlerhaften Wert liefert?
Wäre sehr blöd wenn die Zelle den korrekten Wert liefert - ich davon
ausgehe, dass die noch in Ordnung ist - und die dann beim Neu
Einschalten plötzlich was anderes von sich gibt....

von Peter (Gast)


Lesenswert?

Und wo willst du den Zeiger auf das EEPROM speichen wenn die Spannung
weg ist?

von Bri (Gast)


Lesenswert?

Mal so als Idee, schreib den Wert doch 3 oder 5 mal ins EEPROM und mach
dann eine Mehrheitsentscheidung. Wenn ein Wert abweicht, dann erhöhe
den Zeiger.

von MicroMann (Gast)


Lesenswert?

>> Und wo willst du den Zeiger auf das EEPROM speichen wenn die
Spannung weg ist?

Im EEPROM vielleicht ?

>> Kann ich davon ausgehen, dass die Zelle - wenn
  sie kaputt ist - beim direkt nachfolgenden Auslesen bereits einen
  fehlerhaften Wert liefert?

Ich schätze mal, dass der Fehler sofort nach dem Schreiben erkennbar
ist.

'Opfere' doch einen und probier es mal aus (schreiben, lesen,
neustart, lesen). Den Schreibwert kannst du ja fix machen ( z.B.
abwechselnd 0x55 und 0xAA).

Wenn nun der ausgelesene Wert abweicht hälst du ihn an, und machst ne
(LED ?)Ausgabe. Dann weißt du es.

Gruß

von Ernst (Gast)


Lesenswert?

Du könntest auch einfach ein externes, serielles EEPROM an den I2C Bus
hängen, z.B. 24(lc)65.

das hat einen 4kbit "High Endurance" Block, der mindestens 1 mio
Schreibzugriffe aushält.

Und wenns dann wirklich am Ende ist, ist so ein 8pin IC einfacher und
schneller auszutauschen als der ganze uC. Muss vor allem nicht extra
programmiert werden (Bis auf die Initialisierung wo im Adressraum der
HE Block liegen soll, aber das kann der AVR ja machen wenn er ein
neues, leeres EEPROM findet).

von Winne (Gast)


Lesenswert?

Hallo,
Da Du eh einen 10fachen Overhaed planst erscheint mir die Mehrfachkopie
mit Mehrheitsentscheidung die sinnvollste Lösung. Wenn Du also das Datum
von vornherein in zehn verschiedenen Zeilen und Spaltenadressen
speicherst hast du den Größtmöglichen Schutz und erkennst gleichzeitig
und rechtzeitig durch Warnung ob die Speicherzuverlässigkeit nachläßt.

Aufgrund des Aufbaus der Eepromzelle wird das nachlassen einer zelle am
ehesten nach häufigem schreiben und daaran anschliesender langer Pause
auftreten, da die Capazität des Speicherzellen-C's aufgrund
ansteigender Selbstentladungsrate sinken dürfte. Also bringt eine
unmittelbare Kontrolle wenig.

Geschickter wäre  Staatisches RAM zu nutzen und nur bei Werteänderung
Eepromzelle aktivieren. Zusammen mit Mehrheitsenscheidung sollte das
Datum sicherer werden als Deine gesamte Schaltung ;-))

MfG Winne

von Lupin (Gast)


Lesenswert?

Schick den controller doch in den Schlaf, dann braucht er nur ein paar
µA und das SRAM sollte erhalten bleiben.

von Stefan K. (_sk_)


Lesenswert?

>> Und wo willst du den Zeiger auf das EEPROM speichen wenn
>> die Spannung weg ist?

> Im EEPROM vielleicht ?

Tolle Idee. Die Daten im EEPROM werden lange halten, nur leider nicht
der Speicherbereich des Pointers.

Probier es mal so:
Ein Array definieren. Alle Werte im Array sind NULL. Bis auf Deinen
aktuellen Wert. Möchtest Due einen neuen Wert eintragen, dann suchst Du
den Wert im Array, der <> NULL ist. An die Stelle danach schreibst Du
den neuen Wert. Danach löscht Du den alten. Wenn das Ende des Arrays
erreicht ist, wieder von vorne anfangen.

Knackpunkt kann sein, dass Du auch Nullen speichern willst. Dann wird
es geringfügig komplizierter.

Die "normale" Lebensdauer der EEPROM-Zellen dürfte übrigens deutlich
über den angegebenen 100.000 liegen, jedenfalls, wenn Deine Schaltung
bei Raumtemperatur läuft.

Gruß, Stefan

von Helmut Ruoss (Gast)


Lesenswert?

Hallo Marcel,
ein weiterer Lösungsvorschlag:
nimm doch FRAMS.
Unter www.ramtron.com -> Nonvolative Memory findest Du
->serial/parallel FRAM.
Ich benutze serielle via SPI (I2C ist auch erhältlich) kannst Du in
einem wahnsinnstempo (verglichen mit EEproms) LEsen/Schreiben und das
ziemlich oft:
 High Endurance 1 Trillion Read/Writes
 45 Year Data Retention
 NoDelay™ Writes
 Advanced high-reliability ferroelectric process

Werbung bekomme ich von denen nicht gezahlt... - ich benutze die Dinger
nur und bin begeistert (habe zum Test Schillers Glocke als Text mal eben
gespeichert)

Viel Spaß beimn Ausprobieren

Gruß,
Helmut

PS: hab mich auch an NVRAMs versucht - auch ne gute Sache, die sind
aber gelinde gesagt sauteuer...

von MicroMann (Gast)


Lesenswert?

@Stefan Kleinwort

>>Tolle Idee. Die Daten im EEPROM werden lange halten, nur leider
nicht
der Speicherbereich des Pointers.

Du hast es anscheinend nicht verstanden.
Der Pointer wird immer nur gelesen. Das schädigt den EEPROM nicht.
Geschrieben wird er nur, wenn einige Speicherzellen Fehler haben. Dann
wird er auf die nächste unbeschädigte Speicherzelle gesetzt.

Das sollte < 1000 mal auftreten, dann ist der gesammte EEPROM
durchgenudelt.

Gruß

von Sebastian Heyn (Gast)


Lesenswert?

Hallo, wie du das beschrieben hast, so mache ich das auch. Die anwendung
läuft stabil

im eeprom an stelle 1 steht der zeiger, beim starten wird der eeprom
ausgelesen, dann wird der zeiger incr und dann gleich an die neue
stelle überschrieben. Die variablen werden dann aber im sram
gespeichert. wenn sich eine variable ändert wird sie im eeprom
geschrieben....
Entweder erstellst du ein eeprom image welchesmit geflasht wird, oder
das programm macht beim ersten start (stelle1=ff od. 00) automatisch.

von Sebastian Heyn (Gast)


Lesenswert?

Da sich die stelle des pointers nur einmal am programmstart ändert, kann
man das verkraften.. der eeprom bei den avrs hält wesentlich länger als
angegeben...

von Marcel Pokrandt (Gast)


Lesenswert?

Oh mann... das waren jetzt innerhalb kürzester Zeit ne ganze Menge Infos
auf einmal, die ich mir erstmal reinziehen muss. Danke schonmal dafür.
Waren auf jedenfall schonmal n paar interessante Gedanken dabei.
Die Ideen, die ich definitiv schonmal interessant finde:
- Pointer bei jedem Start ändern. Das ist ne super Sache... das sollte
die Schreibvorgänge relativ statistisch verteilen und die Belastung für
den Pointer wäre in der geplanten App. auch nicht zu hoch. Wird ~~ max.
3/Tag gestartet
-Schlafmodus... muss ich zugeben, mich noch nicht näher mit beschäftigt
zu haben. Das muss ich mir ansehen.
-externer EEPROM.. gut, wär ne Idee... aber muss auch so gehen.
-Speicherzelle töten... gg werd ich auf jeden Fall(!) ausprobieren.
Interessiert mich einfach.... Werde mal versuchen, dergleichen in nen
Mini-Prg. zu packen und berichten... Dann weiss ich wenigstens, wie
sich die Zelle dann verhält
-Mehrheitsentscheidung.. war ich jetzt nicht so überzeugt von. Dann
gehen mir statistisch gesehen alle zehn kurz nacheinander kaputt und
zögere das Sterben nur ein wenig hinaus.
-Externes SRAM hatte ich auch nachgesehen, aber nur bei Reichelt >=8€
gesehen.
-FRAM kenn ich nicht, muss ich mal nachsehen

Wie gesagt Jungs, danke erstmal...

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.