<avr/eeprom.h> & <EEPROM.h>

Muss in meinem ESP8266-01 Werte in den EEPROM abspeichern welche größer sind als 256.

Hab hier auch was gefunden was prima im Arduino Uno funktioniert.

Leider kann ich nicht im ESP kompilieren. Kommt immer die Meldung: Kann File nicht finden.

Sobald ich die Platine von Uno zu Generic ESP ändere zickt die IDE rum.

Gibt es noch andere Möglichkeiten >256 im EEPROM zu speichern?

stoni99: Muss ...

Stoned?

Ob ich verstehe, was Du meinst, kann ich nur vermuten ...

Speichere keine Bytes ab, sondern z. B. Ints. Zu EEPROM.h habe ich hier mal einen „Merkzettel“ für mich zusammengetippt. Vielleicht hilft das.

Gruß

Gregor

Der ESP ist kein AVR. Wie soll das also gehen?

Achso!

Ich wollte also mit dem Code "Fremdgehen" ?! ;-) Immer diese Anfänger...

Hab hier noch was gefunden:

// save value

int a = value/256;
int b = value % 256;

EEPROM.write(0,a);
EEPROM.write(1,b);

// read value

int a=EEPROM.read(0);
int b=EEPROM.read(1);

value = a*256+b;

Funktioniert im UNO aber:

Sorry, ich verstehe die Rechnung nicht.

Die Referenz bringt mich auch nicht sonderlich weiter.

Hab mir a & b mal im Terminal anzeigen lassen: value=1400 / a=5 / B=120 Wenn ich 1400/256 rechne = 5,47 !! (wird gerundet weil int? - wieso stimmt dann value = a*256+b;) Wie komme ich mit int b = value % 256; auf 120?

Lasst mich nicht dumm sterben!! :grin:

Viele Dampfer....

Eben noch ESP8266....

Was auf dem UNO tut, kannste (alles) in die Tonne kloppen! (erstmal, im einzelnen kann man ja prüfen)

Denn: 1. Der ESP hat kein EEPROM (nur eine Emulation) 2. Beim ESP sind int nicht 16, sondern 32 Bit breit 3. Die EEPROM Lib für AVR und ESP sind in der Lage solche Datentypen ohne jede Verrenkung zu speichern.

Klarer: Du machst dir einen Kopp um nix.

Wenn du beim ESP die EEPROM Emulation nutzen möchtest, dann tu das. Lies die Doku dazu und dann men los!

Die Referenz bringt mich auch nicht sonderlich weiter.

Und was soll mir ein Link helfen, welcher auf deinen Rechner zeigt?

Wenn ich 1400/256 rechne = 5,47

Nein! Das ist eine Ganzzahl Division! Wird sind hier nicht in Python

stoni99: Sorry, ich verstehe die Rechnung nicht.

Die Integer Division liefert das erste Byte. Die Modulo Division das zweite. Modulo = Rest einer Division

Einfacher macht man das mit Bit-Schieben:

int value = ...;

byte low = value;
byte high = value >> 8;

Also die Zahl einfach einem Byte zuweisen. Dadurch fällt automatisch das obere Byte weg. Man muss es nicht mal durch & ausmaskieren. Und dann 8 mal nach rechts schieben um das obere Byte zu bekommen

Auf dem Arduino gibt es in der EEPROM Lib bei neuen Version übrigens Funktionen die das automatisch erledigen. Die nehmen jeden beliebigen Typ (auch komplexere Typen wie structs) und und bearbeiten die Byte-weise.

Danke! Hab es verstanden. Na prima wenn sich der ESP bei Integer Werten für EEPROM nicht verrenken muss. Ich liebe ihn immer mehr!

Na prima wenn sich der ESP bei Integer Werten für EEPROM nicht verrenken muss. Ich liebe ihn immer mehr!

Das gilt auch für die Arduino AVRs

stoni99:
Hab es verstanden.

Ich bin nicht so schnell :frowning: , hier der Sketch zur Anschauung, wenn es die Lib mal nicht für Dich macht:

 unsigned int a = 1400;
  unsigned int b = a / 256;
  unsigned int c = a % 256;
  Serial.print("a = ");
  Serial.print(a);
  Serial.print("  b = ");
  Serial.print(b);
  Serial.print("  c = ");
  Serial.print(c);

Bei 32 Bit Integer dann eher so:

 unsigned int a = 77000000;
  byte b = a >> 24;
  byte c = a >> 16;
  byte d = a >> 8;
  byte e = a;
  Serial.print("a = ");
  Serial.print(a);
  Serial.print("  b = ");
  Serial.print(b);
  Serial.print("  c = ");
  Serial.print(c);
  Serial.print("  d = ");
  Serial.print(d);
  Serial.print("  e = ");
  Serial.print(e);

a = 77000000 b = 4 c = 150 d = 237 e = 64

Das habe ich auf einem teensy 3.2 probiert.

Danke!!

@combie:

Hab ich das richtig verstanden: Für den ESP muß ich eine extra EEPROM Lib laden um auch "int" direkt zu schreiben/lesen?

Hab ich das richtig verstanden: Für den ESP muß ich eine extra EEPROM Lib laden um auch "int" direkt zu schreiben/lesen?

Nix extra! Habe ich nicht gesagt und auch nicht gedacht.

Verwende einfach die mitgelieferte Lib! Was hält dich davon ab? Die kann das.

Einfach #include an den Anfang und die Lib steht dir zur Verfügung

Nochmal: Lies die Doku dazu!!!! http://arduino.esp8266.com/versions/1.6.5-947-g39819f0/doc/reference.html Spiele mit den Beispielen!

Verwende put() und get() um deine int zu schaufeln.

Ich versteh es nicht… :confused:

Wo ist dein Problem?

Bräuchte mal ne deutsche Erklärung.

Dieser hier läuft auf meinem ESP. Baue ich ihn auf int = 1400 um geht nix mehr...

Warum zeigst du deinen Code nicht? Wie soll man denn so den Fehler finden?

Deutsche Erklärung..... Wir sind hier bei den Computern... da ist halt 99,9% der Doku in Englisch.... Da wirste dich dran gewöhnen müssen.