Forum: Mikrocontroller und Digitale Elektronik attiny85 EEPROM schreiben/lesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Reini S. (schmali)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Reini S. (schmali)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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:

Bewertung
-1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.