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....
Und wo willst du den Zeiger auf das EEPROM speichen wenn die Spannung weg ist?
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.
>> 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ß
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).
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
Schick den controller doch in den Schlaf, dann braucht er nur ein paar µA und das SRAM sollte erhalten bleiben.
>> 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
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...
@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ß
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.