EEPROM write , benötige Hilfe (solved)

Hallo allerseits,

ich möchte in den EEPROM eines ESP8266 eine 1 oder eine 0 eintragen.
Aber ich verstehe nicht, warum das nicht klappt.

Es kommt immer beim Auslesen eine 255 zum vorschein, aber keine 1 :frowning:

Hat jemand vielleicht die muße mir das zu erklären und zu helfen ?

Vielen Dank.

Hier mein Code, mit dem ich versuche eine 1 in den EEPROM zu schreiben:

#include <EEPROM.h>

int addr = 0;
byte val = 1;

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

void loop()
{
  
  EEPROM.write(addr, val);
  addr = addr + 1;
  if (addr == 512)
  {
    addr = 0;
    EEPROM.commit();
  }
  delay(10000);
}

Und mit dem Standard Code lese ich es aus:

#include <EEPROM.h>

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;

void setup()
{
  // initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  EEPROM.begin(512);
}

void loop()
{
  // read a byte from the current address of the EEPROM
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value);
  Serial.println();

  // advance to the next address of the EEPROM
  address = address + 1;

  // there are only 512 bytes of EEPROM, from 0 to 511, so if we're
  // on address 512, wrap around to address 0
  if (address == 512)
    address = 0;

  delay(5000);
}

Gruß
Stefan(

Du solltest den Returncode von EEPROM.commit(); auswerten.

Gruß Tommy

Moin,
ok, ich glaube ich verstehe.
Das heißt, es wird bei 0 angefangen zu schreiben und erhöht jedesmal um 1 ?
Ist so so richtig ?

Also würde ich, um immer an die selbe Stelle zu schreiben, z.B. die Adresse 0 erst löschen und dann,
dort eine 1 oder 0 reinschreiben.

Oder bin ich da auf dem Holzweg ?

Hi

255 ist die leere (gelöschte) Zelle.
Auch solltest Du Deinen EEprom-vollschreib-Sketch eher mit put arbeiten - Das schreibt nur ins EEprom, wenn dort was Anderes steht, als Du dort rein schreiben willst.
Mit write wird der Inhalt erneut dort reingeschrieben, was einen zusätzlichen Lösch-Schreib-Zyklus entspricht und Die sind beim EEprom in absehbarer Zeit aufgebraucht - und dann ist diese eine Stelle im EEprom eben kaputt.

Bei Deinem Sketch wunderte ich mich eh, wenn Du maximal 512 Platz hast, aber bei 512 mit Schreiben beginnst, stimmt doch was nicht, oder?
... EEPROM hat doch gar keine .begin() Methode ?!?
Edit ... zumindest schreibt die Arduino-Referenz dazu Nix - und im Update-Beispiel wird's auch nicht benutzt.
Wenn's aber trotzdem da ist, wie #5 von Tommy56 vermuten lässt, soll's mich aber nicht stören.

MfG

du machst den commit nur alle 512 durchläufe.
Hast du 512 x 10000 Millis gewartet bevor du den anderen Sketch aufgespielt hast?

Vorschlag:
gib deine Schreibeoperation in das Setup und lass das delay weg.
Dann erwartest auch das vollständige beschreiben des eeproms
Schreibe ans Ende vom Setup ein Serial.println(F("fertig samma"));
dann weist, dass du den anderen Sketch aufspielen kannst.

postmaster-ino:
EEPROM hat doch gar keine .begin() Methode ?!?

Aber natürlich hat es das. Du musst doch die Größe festlegen.

Gruß Tommy

So... :slight_smile:
Habs hin bekommen... Vielen Dank

@postmaster-ino : Jetzt schau ich mir nochmal "put" an.

Vielen Dank und einen schönen 1. Advent

Gruß
Stefan

Dann wäre es im Sinne des Forums, wenn Du das funktionierende Ergebnis hier präsentierst.

Gruß Tommy

Hallo,

da die ESP8266 und ESP32 keinen EEPROM haben, ist es eine Emulation in Ram und Flash.
Es wird mit den EEPROM Funktionen nur in der Ram-Kopie gearbeitet, erst ein EEPROM.commit(); schreibt die Daten vom Ram ins Flash.
Man sollte das geziehlt einsetzen, wenn es nötig ist. Auch bei nur einem geänderten Wert wird auch die komplette Flashpage gelöscht und neu aus dem Ram beschreiben, weil es nur so geht.

Gruß aus Berlin
Michael