Forum: Mikrocontroller und Digitale Elektronik attiny85 EEPROM schreiben/lesen


von Reini S. (schmali)


Angehängte Dateien:

Lesenswert?

Hallo Leute, bin neu hier und habe, trotz umfangreicher Suche, ein 
Problem mit dem Lesen bzw. Schreiben des EEProm eines attiny85. Habe 
beiliegendes Programm auf einem Arduino UNO ausgeführt und es läuft 
einwandfrei. Am attiny85 läuft es aber nur wenn mein String (nummer 
"+436642") den ich schreiben will bzw. dann zurücklese max. 7-stellig 
ist. Bei größerem String (ganze Telefonnummer) funktioniert es leider 
nicht mehr. Die LED´s sind nur zum "debuggen". LG Schmali

von kannAllesBesser! (Gast)


Lesenswert?

... besser so!

void write_string(int eeAddr , String data) {
  for (uint8_t i=0; i!=data.length()+1; i++) {
    EEPROM.write(eeAddr+i, data[i]);
  }
}

String read_string(uint16_t eeAddr) {
  char getByte, eeData[250+1];
  uint8_t i=0;
  while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) {
    eeData[i++] = getByte;
  }
  data[i] = getByte;
  return String(eeData);
}

von kannAllesBesser! (Gast)


Lesenswert?

... nochmal, besser so!

void write_string(uint16_t eeAddr , String data) {
  for (uint8_t i=0; i!=data.length()+1; i++) {
    EEPROM.write(eeAddr+i, data[i]);
  }
}

String read_string(uint16_t eeAddr) {
  char getByte, eeData[250+1];
  uint8_t i=0;
  while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) {
    eeData[i++] = getByte;
  }
  eeData[i] = getByte;
  return String(eeData);
}

von Brain 2.0 (Gast)


Lesenswert?

Schon mal mit get oder put versucht ?
https://www.arduino.cc/en/Reference/EEPROMGet

von Einer K. (Gast)


Lesenswert?

Brain 2.0 schrieb:
> Schon mal mit get oder put versucht ?
> https://www.arduino.cc/en/Reference/EEPROMGet
Das ist aus 2 Gründen problematisch:
1. String legt die Zeichenkette auf den Heap, der wird von put nicht 
mitgespeichert.
2. put interessiert sich nicht für Stringlängen.

von Reini S. (schmali)


Lesenswert?

Das funktioniert so leider nicht.
Warum soll die Schleife beim Schreiben um 1x öfter laufen als der String 
lang ist. Was ist data[Länge+1]?
Beim Lesen: Wie weiss sizeof(eeData) wie lang der String ist?

Beitrag #6574055 wurde von einem Moderator gelöscht.
Beitrag #6574069 wurde von einem Moderator gelöscht.
von Reini S. (schmali)


Lesenswert?

Auf eines möchte ich nochmals hinweisen. Der ursprüngliche Sketch 
funktioniert solange die Länge des Strings <= 7 ist. Es muss etwas mit 
dem attiny zu tun haben am Arduino läuft es auch bei größeren Strings.!

von ergo70 (Gast)


Lesenswert?

Du musst doch wissen, wie lang der String ist - falls Du nicht immer mit 
derselben Länge arbeiten willst. Also entweder die Länge am Anfang mit 
abspeichern (Pascal Strings) oder ein Terminator Zeichen an das Ende (C 
Strings).

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

kannAllesBesser! schrieb:
> String read_string(uint16_t eeAddr) {
>   char getByte, eeData[250+1];
>   uint8_t i=0;
>   while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) {
>     eeData[i++] = getByte;
>   }
>   eeData[i] = getByte;
>   return String(eeData);
> }

.. "vermutlich" ist return BIG string das Problem, daher besser
mit global Buffer:

char eeData[250+1];
void read_string(uint16_t eeAddr, char *string) {
   char getByte;
   uint8_t i=0;
   while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) {
     string[i++] = getByte;
   }
   string[i] = getByte;
   String(string);
}

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Apollo M. schrieb:
> char eeData[250+1];

bei RAM Size von 512 und Buffer size von 250 sehe ich Probleme, darum 
geht es auch mit dem 328/Uno der hat 2K RAM.

Die String()Funktion wird zuviel RAM allokieren wollen ...

Die Buffer Size musst du überdenken und besser dynamisch als statisch 
und entsprechend der tatsächlichen string Size!

von Reini S. (schmali)


Angehängte Dateien:

Lesenswert?

Danke Apollo M.,
das war ein guter Ansatz.
Ich habe den Code ziemlich gekürzt und die " Unterprogramme" entfernt 
und direkt im loop integriert und bei den Deklarationen gespart.
Ist ja bloß eine Telefonnummer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.