ich möchte einen Drehencoder-Wert im EEPROM abspeichern. Gelesen habe ich,dass er nur eine begrenzte Zahl beschrieben werden kann. Gilt das auch für das Lesen, oder kann ich das einfach in meine Schleife schreiben, die dann quasi oft (mehrmals in der Sekunde) lesen würde
je nach Projekt, kann man/reicht es sogar den langsamen Wegfall der Betriebsspannung detektieren und dann erst den Wert ins Eeprom schreiben, sofern er sich geändert hat. Ansonsten arbeitet man mit Variablen.
Eigentlich ist bei EEPROMs nicht das Schreiben das Problem, sondern das Löschen vor dem schreiben.
Moderne EEPROMs garantieren haben 1000000 Schreibzyklen. Die im Atmega aber weniger. Mehr Zyklen haben FRAMS oder das RAM in gewissen RTCs wie zb der DS1307 hat 56 Byte batteriegepuffertes RAM.
Ich sehe aber nicht die Notwendigkeit Daten so oft aus dem EEPROM zu lesen (auch wenn es kein Problem ist). Du kannst sie ja als Variable im RAM des ATmega halten.
In diesem Zusammenhang habe ich mal eine Frage, bezüglich der Adressierung beim schreiben.
Wenn ich Daten beispielsweise an Adresse "0" schreibe, ist das immer die gleiche Adresse (also hardwaremäßig) oder kommt dabei ein "wear leveling", wie bei PC-SSDs zum Einsatz?
Wenn Ersteres, wie handhabt ihr dann das Schreiben ins EEPROM?
Erhöht ihr die Adresse bei jedem Schreiben? Aber wie merkt man sich dann die neue Adresse?
kommt dabei ein "wear leveling", wie bei PC-SSDs zum Einsatz?
Nein!
Erhöht ihr die Adresse bei jedem Schreiben? Aber wie merkt man sich dann die neue Adresse?
Wie ich das mache?
Um "wear leveling" kümmere ich mich nicht!
Ich nutze das eeprom Section Gestrumpel des AVR GCC!
Damit erzeugt mir die IDE auch eine *.eep Datei.
Um fehlerträchtiges Gefummel mit Adressen muss ich mich nicht kümmern.
Wenn du Adresse 0 schreibst, wird auch Adresse 0 geschrieben- was denn sonst?
Die Arduinos haben keine eigenen Treiber für sowas an Bord, wie eine SSD....
Um ne Art Ringspeicher anzulegen, muss man sich was einfallen lassen, z.B. in das erste Byte die tatsächliche Variable schreiben, insfolgende dann einen festen Wert (z.B. FF, sollte was sein, was nie auftritt). Dann kann man anhand des Markers sehen, wo man beim letzten Mal war, ne Adresse zurück gehen und hat seinen Wert.
Neu geschrieben wird dann eine Stelle eher, somit ist die "alte FF" überschrieben. Und natürlich muss man das Ende des Adressbereiches abfangen, und da von vorne anfangen.
Allerdings: 100 000 Schreibzyklen sind ne ganze Menge, wenn man beispielsweise täglich Weckzeiten ins EEProm schreibt, dann reicht das für nen paar hundert Jahre, da würd ich solche Verrenkungen nich anfangen. Wenn man allerdings sekündlich nen Wert loggen möchte, macht es Sinn.