Arduino: Daten im EEPROM speichern: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 20: Zeile 20:


<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:medium" line>
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:medium" line>
/ EEPROM beschreiben
// EEPROM beschreiben
#include <EEPROM.h>
#include <EEPROM.h>
void setup()
void setup()
{
{
for (int i = 0; i < 512; i++)
  for (int i = 0; i < 512; i++)
// Adresse mit Adresswert beschreiben
  // Adresse mit Adresswert beschreiben
EEPROM.write(i, i);
  EEPROM.write(i, i);
}
}
void loop()
void loop()
Zeile 32: Zeile 32:
}
}
</syntaxhighlight>
</syntaxhighlight>
Quelltext 1: EEPROM: Schreiben ins interne EEPROM
'''Quelltext 1:''' EEPROM: Schreiben ins interne EEPROM


Mit der Lesefunktion können nun die Daten aus dem EEPROM gelesen werden.
Mit der Lesefunktion können nun die Daten aus dem EEPROM gelesen werden.
Zeile 43: Zeile 43:
void setup()
void setup()
{
{
Serial.begin(9600);
  Serial.begin(9600);
}
}
void loop()
void loop()
{
{
// Daten lesen aus EEPROM
  // Daten lesen aus EEPROM
valEE = EEPROM.read(a);
  valEE = EEPROM.read(a);
// Ausgabe an serielle Schnittstelle
  // Ausgabe an serielle Schnittstelle
Serial.print(a);
  Serial.print(a);
Serial.print(": ");
  Serial.print(": ");
Serial.println(valEE);
  Serial.println(valEE);
// Adresszähler erhöhen
  // Adresszähler erhöhen
a = a + 1;
  a = a + 1;
// Falls Adresse = 512, wieder bei 0 beginnen
  // Falls Adresse = 512, wieder bei 0 beginnen
if (a == 512) {
  if (a == 512) {
a = 0;
    a = 0;
}
  }
delay(500);
  delay(500);
}
}
</syntaxhighlight>
</syntaxhighlight>
Quelltext 2: EEPROM: Daten auslesen
'''Quelltext 2:''' EEPROM: Daten auslesen


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


<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:medium" line>
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:medium" line>
/ EEPROM beschreiben
void ClearEEPROM ()
#include <EEPROM.h>
void setup()
{
for (int i = 0; i < 512; i++)
// Adresse mit Adresswert beschreiben
EEPROM.write(i, i);
}
void loop()
{
{
// ganzes EEPROM durchlaufen
for (int a=0; a < 512; a++)
  {
  // und Werte auf 0 setzen
  EEPROM.write(a, 0);
  }
}
}
</syntaxhighlight>
</syntaxhighlight>
Quelltext 3: EEPROM: Vor jedem Start eines Schreibvorgangs das gesamte EEPROM löschen
'''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.
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?
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&thinsp;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.
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&thinsp;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.
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.
Zeile 92: Zeile 88:


Quelle: [1]
Quelle: [1]
== Demo ==
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoEEPROM/DemoEEPROM.ino SVN: DemoEEPROM.ino]


== Literatur ==
== Literatur ==

Aktuelle Version vom 19. Mai 2023, 15:29 Uhr

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