Ich habe auf meinem Arduino UNO ein paar Daten in Arrays bzw. einfachen Variablen gespeichert und würde gerne verhindern, dass diese gelöscht werden, wenn ich den Arduino von der Spannungsversorgung nehme.
Hierzu hätte ich mir überlegt den Flashspeicher des Arduinos zu nutzen, um die Daten zu erhalten.
Allerdings habe ich jetzt gelesen, dass man diesen nur begrenzt oft beschreiben kann, bzw. dass man nur Konstanten auf den Flashspeicher speichern kann.
Da sich die Daten in dem Array des Öfteren ändern werden, müssen diese Änderungen natürlich auch auf dem Flash gesichert werden. Verwechsle ich den Flash gerade mit dem EEPROM, bzw. welcher der beiden Speicherarten hat jetzt eine begrenzte Lebensdauer? Habe jetzt mehrere Beschreibungen zu den beiden Arten gelesen und bin jetzt leicht verwirrt
Könnte vielleicht jemand schnell (und einigermaßen Anfängergerecht) erklären, was der genaue Unterschied zwischen den beiden Speichermethoden ist, bzw. was für meinen Anwendungsfall von Vorteil wäre?
Code habe ich bis jetzt noch keinen...ich weiß nur, dass ich ein paar Variablen und einen Array haben werde, die irgendwie festgehalten werden müssen.
Beide haben eine begrenzte Anzahl Schreibzugriffen, EEPROM ca. 100 000 garantierten Zyklen, Flash etwa das Zehnfache.
Jetzt kannst Du Dir aus der Häufigkeit Deiner Änderungen ausrechnen, wie lange Du mit dem EEPROM hin kommst. Wir kennen die Häufigkeit Deiner Änderungen nicht. Flash solltest Du nicht in erwägung ziehen.
Evtl. wäre FRAM etwas für Dich. Er ist ca. 10 hoch 35 mal beschreibbar und behält die Daten auch ohne Betriebsspannung. Der Hersteller gibt 55 Jahre an.
für meinen Anwendungsfall sollte EEPROM dann eh passen
Da sich die Daten in dem Array des Öfteren ändern werden
Ist jetzt die Frage, was "des Öfteren" bedeutet.
Da EEPROM relativ schnell und beliebig oft gelesen werden kann, wurde die Methode EEPROM.put erfunden,
die alle Datentypen und ganze Arrays schreiben kann, und außerdem erst prüft und nur echte Änderungen schreibt.
Die Daten im EEprom werden durch Ladungen in einem Isolierten Gate eines MOSFETs gespeichert. Diese Ladugen bekommt mann nicht wieder 100% weg und darum hat man bei einer bestimmten Anzahl von Löschen ( auf HIGH schreiben ) bzw schreiben irgendwann Ladungen herum die man nicht mehr wegbekommt. Darm garantiern die Hersteller nur eine Begrenzte Anzahl von Schreibzyklen bei denen der Datenerhalt innerhalb der Spezifikation garantiert wird.
ich möchte das Thema nochmal aufgreifen.
Welche (Speicher)Adressen darf ich benutzen ohne mir den Bootloader oder das Programm zu beschädigen?
Ich arbeite mit einem STM32F1 (Blue Pill).
Folgenden Code hab ich gefunden:
float f = 123.456f; //Variable to store in EEPROM.
int eeAddress = 0; //Location we want the data to be put.
//One simple call, with the address first and the object second.
EEPROM.put(eeAddress, f);
Fange ich bei 5 Variabeln, die ich speichern möchte, einfach bei Adresse Null an?
Viele Grüße
Martin
ich möchte das Thema nochmal aufgreifen.
Welche (Speicher)Adressen darf ich benutzen ohne mir den Bootloader oder das Programm zu beschädigen?
Ich arbeite mit einem STM32F1 (Blue Pill).
Folgenden Code hab ich gefunden:
float f = 123.456f; //Variable to store in EEPROM.
int eeAddress = 0; //Location we want the data to be put.
//One simple call, with the address first and the object second.
EEPROM.put(eeAddress, f);
Fange ich bei 5 Variabeln, die ich speichern möchte, einfach bei Adresse Null an?
Viele Grüße
Martin
Gehts um einen Arduino ?
Das EEprom was du hier beschreiben willst, hat nix mit dem Flashspeicher zu tun.
Gibt es auch nicht ( der Name 'Arduino' ist soweit ich weis geschützt, Nachbauten und Alternativdesigns dürfen sich deshalb auch nicht so nennen ).
Der Bluepill wird mit der STM32duino Erweiterung der IDE programmiert. Da die STM32F1-Prozessoren kein EEPROM besitzen, wird das EEPROM im Flash emuliert. Meines Wissens ( hab's mal genau gewusst, müsste aber mal wieder nachschauen ) wird dafür ein Bereich am Ende des Flash reserviert. Die Adressen, die man in der EEPROM Lib angibt, sind virtuell, und haben nichts mit der tatsächlichen Adresse im Flash zu tun. Wegen der begrenzten Schreibzyklen des Flash wird da auch nicht immer auf die gleiche Flash-Adresse geschrieben, selbst wenn du im EEPROM.write immer die gleiche Adresse verwendest. Die Lib hat ihre eigene Adressverwaltung. Du kannst also getrost bei Adresse 0 anfangen.
N.B. die STM32F1 sind meiner Meinung nach eine Interessante Alternative. Man bekommt unglaublich viel Rechenleistung (Cortex M3 Kern mit 72MHz) und Peripherie fürs Geld. Der Bluepill kostet nicht mehr als ein Nano-Clone und ist auch nur wenig größer. ( Meine MobaTools laufen übrigends auch da drauf )