Arduino: Daten im EEPROM speichern

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor: Prof. Dr.-Ing. Schneider

Einleitung

Der Microcontroller auf dem Arduino-Board besitzt ein eigenes internes EEPROM, in dem Daten gespeichert werden können. Diese Daten stehen auch nach einer Unterbrechung der Versorgungsspannung wieder zur Verfügung. Das interne EEPROM hat eine Größe von 512 Bytes. So wenig Speicherplatz kann somit nicht als optimaler Ablageort für ein GPS-Modul gedacht sein, das alle fünf Minuten einen Wert im Speicher ablegen will. Andernfalls kann man einfach nur eine kleine Reihe von Daten speichern. Sobald alle 512 Bytes aufgebraucht sind, wird beim Speichern wieder der erste Speicherort verwendet und der bisherige Wert überschrieben. Das Beschreiben und Lesen des internen EEPROMs erfolgt mit der EEPROMBibliothek. Diese Bibliothek besitzt die beiden Funktionen write() und read().

Beim Schreiben der Daten ins EEPROM ist zu beachten, dass jeweils nur 1 Byte, also 8 Bit, pro Adresse geschrieben werden kann. Der Adressbereich liegt zwischen 0 und 511.

// EEPROM beschreiben
#include <EEPROM.h>
void setup()
{
  for (int i = 0; i < 512; i++)
  // Adresse mit Adresswert beschreiben
  EEPROM.write(i, i);
}
void loop()
{
}

Quelltext 1: EEPROM: Schreiben ins interne EEPROM

Mit der Lesefunktion können nun die Daten aus dem EEPROM gelesen werden.

// Lesen der Daten aus dem EEPROM
#include <EEPROM.h>
int a = 0;
int valEE;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  // Daten lesen aus EEPROM
  valEE = EEPROM.read(a);
  // Ausgabe an serielle Schnittstelle
  Serial.print(a);
  Serial.print(": ");
  Serial.println(valEE);
  // Adresszähler erhöhen
  a = a + 1;
  // Falls Adresse = 512, wieder bei 0 beginnen
  if (a == 512) {
    a = 0;
  }
  delay(500);
}

Quelltext 2: EEPROM: Daten auslesen

Da vor dem erstmaligen Beschreiben des EEPROM alle Werte auf 255 gesetzt sind, sollte vor jedem Start eines Schreibvorgangs das gesamte EEPROM gelöscht werden, indem alle Speicherplätze mit 0 überschrieben werden.

void ClearEEPROM ()
{
 // ganzes EEPROM durchlaufen
 for (int a=0; a < 512; a++)
  {
   // und Werte auf 0 setzen
   EEPROM.write(a, 0);
  }
}

Quelltext 3: EEPROM: Vor jedem Start eines Schreibvorgangs das gesamte EEPROM löschen

Da der Speicherbereich im EEPROM sehr klein ist, sollten Sie sich bei der Speicherung von Daten Gedanken über den Rhythmus der Speicherung machen. Muss wirklich jede Minute ein Temperaturwert ermittelt werden oder reicht vielleicht auch ein Wert jede halbe Stunde?

Ein Punkt, den man beim Einsatz des EEPROM beachten sollte, ist die Anzahl der Schreib-/Lesezyklen. Gemäß Datenblatt des Microcontrollers liegt die Anzahl der garantierten Schreib- und Lesezyklen bei 100 000. Bei regelmäßigem Beschreiben kann dieser Wert schnell erreicht werden. Aus Erfahrung liegt die Zahl in der Praxis aber höher. Um sich keine unnötigen Probleme einzuhandeln, sollten Sie diesen Umstand dennoch im Kopf behalten.

Beim Realisieren einer Lösung zur Datenspeicherung sollte man sich also immer diese Gedanken machen. Ein Ansatz wäre das Speichern der gemessenen Werte im RAM. Nach einer bestimmten Anzahl Messwerte könnte dann ein Mittelwert ermittelt werden und dieser wird dann im EEPROM gespeichert.


Quelle: [1]

Demo

Literatur

  1. Brühlmann, T.: Arduino Praxiseinstieg. Heidelberg: mitp, 4. Auflage 2019. ISBN 978-3-7475-0056-9. URL: HSHL-Bib, O'Reilly-URL



→ zurück zum Hauptartikel: Arduino Praxiseinstieg