Mit FOR Schleife BYTE Adresse EEPROM bis 255 auslesen

Hallo mal wieder alle zammen :slight_smile:

Ich versuche mit einer BYTE Variable cnt in einer FOR-Schleife die EEPROM Adressen 0-255 auszulesen,
da ich diesen mit EEPROM.begin(size ) inizialisieren will (size=256).
Ich bekomme es nicht hin! :confused:

Entweder es wird nur bis 254 gezählt (klar wegen -1) oder es wird zu einer unendlichen Schleife (wenn man <= als Operator nutzt, weil BYTE ja nie größer als 255 wird).
Klar könnte ich die Zähler-Variable cnt auch auf INT setzen, aber das wäre ja zu einfach :grinning:

Geht es auch mit der BYTE Version? Evtl. über WHILE? Ist aber nicht so schön…

Anbei die Zähl-Schleife ohne EEPROM Inizialisierung.
Danke für eure Ideen :wink:

constexpr int size {256}; //Später die Größe vom EEPROM

void setup() {
Serial.begin(115200); 
delay(5000);

  Serial.println( "????? Suchen ?????\n" );
  
    for (byte cnt = 0; cnt < size-1; cnt++) {
          Serial.print(cnt);
          Serial.print("\t");
          delay (20);
          }
  Serial.println( "!!!!! Suche abgeschlossen !!!!!\n" );
}

void loop() {
}

Klar könnte ich die Zähler-Variable cnt auch auf INT setzen, aber das wäre ja zu einfach

Die überraschende Alternative ist der “range based for loop”

#include <EEPROM.h>

byte array[256] EEMEM;

void setup() 
{
  Serial.begin(9600);

  for(byte &d:array) Serial.println(EEPROM[int(&d)]);
}

void loop() 
{

}

Evtl. über WHILE? Ist aber nicht so schön…

Weil Du danach fragst: Ja, ist nicht schön, weil fehleranfällig:

  byte cnt = 0;
  do {
    Serial.print(cnt);
    Serial.print("\t");
    delay (20);
    cnt++;
  } while (cnt);

Beim Überlauf nach 0 hält es dann an.
Man darf nur nie den Typ von cnt verändern und/oder das cnt++ vergessen.

Also diese Schein-Lösung auch gleich wieder entsorgen und die Richtige verwenden (deshalb nochmal zitiert).

byte array[256] EEMEM;
...
for(byte &d:array) Serial.println(EEPROM[int(&d)]);

(deleted)

noiasca: welche sorge bereitet dir im scope der for schleife ein int? Wenn du das eine Byte im RAM nicht frei hast, hast sowieso schon ein anderes Problem.

Das hat ihm sowieso! Offensichtlich nutzt ihm einen ganz geheimen ESP. Da ist int 32 Bit breit. Zudem belegt ein Byte auch 32 Bit (Alignment) Hat der ESP überhaupt Befehle für die 8Bit Verarbeitung?

Mal abgesehen davon, dass mein Beispiel nur eingeschränkt funktioniert, da der ESP keine .eeprom Section hat, bietet die Verwendung von Byte an der Stelle keine Vorteile.

combie:
Die überraschende Alternative ist der “range based for loop”

#include <EEPROM.h>

byte array[256] EEMEM;
 for(byte &d:array) Serial.println(EEPROM[int(&d)]);

Danke für eure Vorschläge! Speziell an dem von combie habe ich erstmal zu knacken :wink:

noiasca:
welche sorge bereitet dir im scope der for schleife ein int? Wenn du das eine Byte im RAM nicht frei hast, hast sowieso schon ein anderes Problem.

Nein, keine Probleme, mich hat es nur gewurmt, dass ich es nicht hinbekommen habe 8)

Heutzutage, wird sogar dies als noch Richtiger empfunden:

byte array[256];
  for(auto &d:array) { ... };

Der Compiler kann prüfen, ob man für d einen passenden Datentyp gewählt hat, oder man kann es ihn (per [b]auto[/b] ) gleich selber machen lassen.

Verringern möglicher Fehlerquellen: Eine Änderung des Datentyps von array muss dann (eventuell/hoffentlich) nicht an mehreren Stellen von Hand berücksichtigt werden.

Heutzutage, wird sogar dies als noch Richtiger empfunden:

Durchaus!
Wobei hier auto quasi nur ein Alias für decltype(*array) oder decltype(array[0]) ist.

Desweiteren ist für Größenangaben eigentlich der Type size_t vorgesehen.

constexpr size_t myArraySize {256};
using MyArrayType = byte[myArraySize];

// MyArrayType myArrayImRam;

for(unsigned i {0}; i < myArraySize; i++) Serial.println(EEPROM[i]);

Ich hätte da noch eine Nachfrage zur Größe von eeprom.begin():

Laut Recherche zum ESP8266 mit 1MB Flash kann man die Größe von 4-4096 Bytes angeben.

Hat es Nachteile einfach immer 4096 Bytes anzugeben? So wie ich es verstanden habe, ist der Bereich von eeprom sowieso fest reserviert? Oder limitiere ich damit zum Bsp. den Flash oder RAM oder so?

Und im Vergleich zum ESP8285: Der hat ja noch einen extra Chip mit 1MB Flash. Kann man da den kompletten Bereich für eeprom reservieren? Oder gibt es Nachteile?

Ich danke euch :)

a) ich kenne keinen Nachteil und nehm auch immer 4096. b) "noch einen extra Chip" ... na ich weis nicht. der ESP8285 hat halt den flash on board, aber angebunden als DOUT und somit wird der Flash Zugriff langsamer sein als QIO. Ob du es irgendwo merkst - sei dahingestellt. Messen kannst es.

Danke :) Die Geschwindigkeit ist für mich nicht entscheidend.

Wie kann ich denn beim ESP8285 den kompletten „separaten“ Flash als EEPROM nutzen? Geht das automatisch?

progger: Wie kann ich denn beim ESP8285 den kompletten „separaten“ Flash als EEPROM nutzen? Geht das automatisch?

Hat da noch jemand eine Idee? Wenn meine Suche im Netz korrekt war, gehen maximal 4096 Byte. Stimmt das?

Wenn du keine Antwort auf die Frage bekommst, könnte es sein, dass es keine Antwort aufdie Frage gibt.

Man könnte sagen, dass schon die Frage falsch ist!

Falsche Frage:

Wie kann ich denn beim ESP8285 den kompletten „separaten" Flash als EEPROM nutzen?

Bessere Frage:

Kann ich denn beim ESP8285 den kompletten „separaten" Flash als EEPROM nutzen? Antwort: Nein.

Noch bessere Frage:

Kann ich denn beim ESP8285 den kompletten „separaten" Flash nutzen? Antwort: Ja. z.B. für OTA, oder/und dort ein Filesystem etablieren.

progger: Stimmt das?

Hast wohl keine Lust die Dokumentation zu lesen?

https://arduino-esp8266.readthedocs.io

Hoffst du das es einer für dich......

Ich danke euch :)

@Derfips Es steht dir nicht zu, darüber zu sinnieren, ob jemand „zu faul“ ist oder als Anfänger falsch sucht... oder die Zusammenhänge noch nicht ganz überblickt und alle Quellen im Netz kennt. Du solltest and deinem Ton arbeiten.

progger: Du solltest and deinem Ton arbeiten.

Du ebenfalls. Es steht Dir nicht zu, zu entscheiden, welche Meinung jemand äußern darf und welche nicht.

Gruß Tommy

Oh mannnnoooo ....

progger: @Derfips Es steht dir nicht zu, darüber zu sinnieren, ob jemand „zu faul“ ist oder als Anfänger falsch sucht... oder die Zusammenhänge noch nicht ganz überblickt und alle Quellen im Netz kennt. Du solltest and deinem Ton arbeiten.

Faul ist deine Deutung von Unlust!

Derfips: Hast wohl keine Lust die Dokumentation zu lesen?

https://arduino-esp8266.readthedocs.io

Hoffst du das es einer für dich......

"progger Trump" meine Meinung kannst du ignorieren, aber keinesfalls verbieten.

Edit: Mein Ton, ab jetzt für dich umgestellt, "Weißes Rauschen".

Und arbeite an deiner Art & Weise gleich mit, evtl. bekommst Du Rabatt ;)