EEPROM
Die EEPROM Lib ist sehr übersichtlich und kennt nur 2 Routinen.
byte Wert = EEPROM.read(addr); EEPROM.write(addr, Wert);
Mit write() schreibt man an die Addresse Addr ein Byte Wert, mit read() kann man von der Adresse wieder lesen. Mehr gibt es nicht zu tun.
Man sollte nur darauf achten, daß
- leere Werte 0xFF sind, d.h. ist ein EEPROM leer, sind alle Bits gesetzt
- man nicht zu oft ein und diesselbe Speicherzelle beschreibt. Das EEPROM hat eine „Standzeit“ von 100.000 Schreibzyklen, danach können die Speicherzellen defekt werden. EEPROM ist eben kein RAM. Also bitte nur so wenig wie möglich beschreiben
- die Größe des EEPROMs auf dem Arduino ist beschränkt. Üblicherweise sind das 1Kb. Das obere Ende bekommt man mit E2END heraus. Sowohl das Lesen wie auch das Schreiben des EEPROMs ist recht schnell.
Um z.B. das gesamte EEPROM zu lesen kann man folgende Schleife verwenden:
for ( addr = 0; addr <= E2END; addr++) { byte value = EEPROM.read(addr); ... }
Es gibt auch Erweiterungen, mit denen man ganze Datenstrukturen im EEPROM ablegen und wieder laden kann. z.B.
EEPROMStruct
Mit dieser ERweiterung können sie ganze Strukturen im EEPROM ablegen. Wenn Sie mehr als 1 Struktur ablegen möchten, müssen Sie für die Startadressen der Strukturen die Größen selber berechnen (mit sizeof()).
Die Erweiterung (ist Bestandteil meiner MCSTools-Erweiterung) besteht nur
aus einer einzigen Datei. Diese können Sie entweder in ihrem Sketchverzeichniss mit ablegen, oder Sie machen sich einen eigenen Ordner im libraries-Verzeichniss in Ihrem Sketchbook und plazieren dort die Datei.
z.B.
sketchbook libraries EEPROMStruct EEPROMStruct.h
- EEPROMStruct.h
#include <avr/eeprom.h> #include <EEPROM.h> #include <Arduino.h> // for type definitions template <class T> int EEPROM_writeStruct(int address, const T& value) { const byte* p = (const byte*)(const void*)&value; unsigned int i; for (i = 0; i < sizeof(value); i++) eeprom_write_byte((unsigned char *)address++, *p++); return i; } template <class T> int EEPROM_readStruct(int address, T& value) { byte* p = (byte*)(void*)&value; unsigned int i; for (i = 0; i < sizeof(value); i++) *p++ = eeprom_read_byte((unsigned char *)address++); return i; }