In diesem Abschnitt dreht sich alles rund um die Funktionen des EEPROM's. Die Abkürzung EEPROM steht dabei für Electrically Erasble Programmable Read-Only Memory. Hieraus wird deutlich, dass es sich um einen programmierbaren, nichtflüchtigen elektronischen Speicher handelt. Das bedeutet, der Speicher behält seine Informationen über lange Zeit, auch wenn der Speicher nicht mehr bestromt wird. Die Inhalte können dabei byteweise elektronisch gelöscht oder beschrieben werden.

Diese Möglichkeit zur Speicherung kleiner Datenmengen bietet sich gerade in der Mikrocontrollertechnik an, da die meißten Mikrocontroller einen solchen internen Speicher integriert haben. Besonders hervorzuheben gilt es, dass die Zwischenspeicherung von Werten über den EEPROM gut realisierbar ist, bevor die  gesammelten Werte dann gemeinsam weiterverarbeitet werden.


Technische Realisierung

Ein solcher Speicher besteht aus einer Matrix mit mehreren tausenden Feldeffekttransistoren (FET's), bei denen jeder dieser FET's ein Bit representiert. Wird der EEPROM byteweise beschrieben, werden gleichzeitig bei acht dieser FET's über ihren Steueranschluss (Gate) eine Ladung eingebracht. Nur durch den Löschvorgang kann diese Ladung wieder entfernt werden, da sonst der gespeicherte Wert erhalten bleibt. Wichtig ist zu erwähnen, dass der EEPROM beliebig oft ausgelesen werden kann, allerdings die Anzahl der Schreibvorgänge begrenzt sind. Diese Unterscheiden sich von Hersteller zu Hersteller und liegen ungefähr zwischen 10.000 bis 1.000.000 Schreibzyklen. Die Zeit für einen Schreibzyklus eines EEPROM's beträgt dabei ungefähr eine bis zehn Millisekunden.


Unterschiedliche Speichergrößen der verschiedenen Mikrocontroller

Die unterschiedlichen Speichergößen sind bedingt durch die verschiedenen Mikrocontroller auf den jeweiligen Arduino Boards. So hat zum Beispiel der Atmel Atmega 328P einen Speicherplatz von 1024 Bytes und der Atmel Atmega 168 einen Speicherplatz von 512 Bytes. Weitere Mikrocontroller mit den jeweiligen Speicherplätzen sind hier nachzuschauen. .


Einbindung der EEPROM Library

Um die jeweiligen Bytes des Mikrocontrollers für die Nutzung des EEPROM's zu setzen und auf die Funktionen zugreifen zu können, gibt es wieder eine Bibliothek von Arduino, welche eingebunden werden sollte.

Hierbei handelt es sich um die EEPROM Library, welche als Standartbibliothek direkt auf dem Arduino enthalten ist und nur noch mit dem Befehl #include <EEPROM.h> eingebunden werden muss.


Abspeichern und Auslesen von Messwerten mit Hilfe der Get- & Put- Funktion

Die wichtigsten Funktionen für das Abspeichern der Werte im EEPROM sind die -GET- und die -PUT- Funktion. Mit Hilfe dieser beiden Funktionen können die zuvor aufgenommenen Messwerte im EEPROM abgespeichert, sowie wieder ausgelesen werden. Der große Vorteil dieser Funktionen ist, dass die benötigten Bytes des internen Speichers automatisch aus dem Datentyp ermittelt werden und belegt werden.

In dem unten aufgeführten Beispiel werden die Messwerte des Lichtsensors als unsigned int aufgenommen und in dem EEPROM abgespeichert. Die Größe des Messwerts beträgt somit 16 Bit oder 2 Byte. Daraus resultiert bei einer Speichergröße des internen Speichers von 1024 Bytes die Speichermöglichkeit von 512 Messwerten.  

Codebeispiele

Zuerst muss die EEPROM library hinzugefügt werden. Daraufhin wird der Speicher initialisiert. Man benötigt zudem einen Initialisierungskey, damit beim Lesen beziehungsweise Speichern keine zufälligen Werte im Speicher eine Rolle spielen. So soll dann die Struktur für den Speicher aussehen:

 INIT_DONE_KEY | COUNTER | WERT1 | WERT2 | ... | WERTN

#include <EEPROM.h>

const unsigned int INIT_DONE_KEY = 22;

void setup()
{
  EEPROM.begin(512);
}

Wenn der Speicher gelöscht werden soll, kann man z.B den Initialisierungskey auf 0 setzten, damit der Counter auf 0 gesetzt werden soll und somit die Speichereinheiten neu überschrieben werden.

unsigned int initDone;
unsigned int counter;
unsigned int WERT1;
unsigned int WERT2;

void loop()
{
  EEPROM.get(0, initDone);                                                            //Der erste Wert im Speicher wird in initDone gespeichert
  if(!initDone = INIT_DONE_KEY)
  {
    EEPROM.put(0, INIT_DONE_KEY);                                                     //INIT_DONE_KEY wird auf Position 0 gespeichert.
    EEPROM.put(0 + sizeof(INIT_DONE_KEY), 0);                                         //Zähler wird auf null gesetzt.
  }

  EEPROM.get(0 + sizeof(unsigned int), counter);                                      //Zähler wird in die Varialble counter gespeichert.
  EEPROM.put(0 + 2 * sizeof(unsigned int) + counter * sizeof(unsigned int), WERT1);   //Neuer Wert wird im nächsten freien Speicher gespeichert.
}

Zuletzt geändert: Donnerstag, 27. Januar 2022, 12:29