Forum: Mikrocontroller und Digitale Elektronik String in EEPROm speichern und auslesen


von Jonas E. (jonas_e43)


Lesenswert?

Hallo,
ich würde gerne einen String in den EEPROM eines Atmega32 Controllers 
einspeichern und wieder auslesen. Ich weiß, dass es dazu ein AVR 
Tutorial gibt und ich habe es auch schon mit eeprom_update_block 
versucht nur leider klappt das nicht. Aus ähnlichen Posts aus dem Forum 
werde ich leider auch nicht schlau...
Bis jetzt sieht das Schreiben so aus:
1
uint16_t ee_HEADER EEMEM = 1;
2
char* g_Header = "Unbekannt";
3
eeprom_update_block(g_Header, &ee_HEADER, sizeof(g_Header));

Würde mich über etwas Hilfe freuen. :D
Gruß Jonas

von Karl H. (kbuchegg)


Lesenswert?

Jonas E. schrieb:

> ich würde gerne einen String in den EEPROM eines Atmega32 Controllers
> einspeichern und wieder auslesen. Ich weiß, dass es dazu ein AVR
> Tutorial gibt und ich habe es auch schon mit eeprom_update_block
> versucht nur leider klappt das nicht. Aus ähnlichen Posts aus dem Forum
> werde ich leider auch nicht schlau...

Tja.
Weil das ja auch nur die halbe MIete ist.
Du musst schon auch C so einigermassen können.
Es hilft dir nichts, wenn du die Bedienungsanleitung zu einem 
Videorekorder auf Englisch liest, und du kein Englisch kannst. Das ist 
aber nicht die Schuld der Bedienungsanleitung.
Genauso auch hier: C ist die Basis. Hier reden wir jetzt schon über eine 
Schicht darüber, die Kentnisse der Basis voraussetzt.

> uint16_t ee_HEADER EEMEM = 1;
> char* g_Header = "Unbekannt";

g_Header ist ein Pointer.

> eeprom_update_block(g_Header, &ee_HEADER, sizeof(g_Header));

Damit liefert sizeof(g_Header) die Größe eines Pointers.
Nur ... die interessiert dich ja eigentlich überhaupt nicht. Du willst 
ja nicht wissen, wie groß die Referenz auf den String ist, sondern du 
willst wissen, aus wievielen Buchstaben der String selber besteht.

-> strlen

oder aber, wenn der String in Arrayform vorliegt, dann muss man 
unterscheiden, was man will: will man das Array als Ganzes ins EEprom 
schreiben, auch auf die Gefahr hin, dass Teile vom Array noch gar nicht 
zur Speicherung des Arrays benutzt werden ...
1
   char Test[10] = "Hallo";
Test ist 10 char (also 10 Bytes) groß. Aber nur 6 Bytes davon sind zur 
Zeit in Verwendung

... oder will man tatsächlich nur den Teil haben, der auch tatsächlich 
zum String beiträgt.


> Würde mich über etwas Hilfe freuen. :D

Hilf dir selbst, dann hilft dir Gott.
Kauf dir ein C-Buch und arbeite das erste Drittel durch. Dann hast du 
das notwendige Rüstzeug, um auch in der µC-Programmierung recht 
problemlos bestehen zu können.
Aber ohne Literatur .... wird das nichts.

von Jonas E. (jonas_e43)


Lesenswert?

Hallo Karl Heinz,
ich hab mein Code jetzt nach deinen Informationen abgeändert:
1
uint16_t ee_HEADER EEMEM = 1;
2
char* g_Header = "Unbekannt";
3
eeprom_update_block(g_Header, &ee_HEADER, strlen(g_Header) * sizeof(char));
Damit funktioniert das Schreiben in den EEPROM.
Kennst du denn ein gutes C-Buch welches du mit empfehlen könntest?
Gruß Jonas

von Karl H. (kbuchegg)


Lesenswert?

Jonas E. schrieb:

> uint16_t ee_HEADER EEMEM = 1;
> char* g_Header = "Unbekannt";
> eeprom_update_block(g_Header, &ee_HEADER, strlen(g_Header) *
> sizeof(char));

fast.
strlen(...) + 1

Denn du bist darauf angewiesen, das abschliessende \0 Byte des Strings 
ebenfalls mit abzuspeichern. Denn: Wie soll denn der Lesecode später 
rausfinden, wie lang denn eigentlich der String war?
Dazu braucht er dieses \0 Byte. Also musst du es auch mit abspeichern.

> Kennst du denn ein gutes C-Buch welches du mit empfehlen könntest?

Wie immer: Kernighan&Ritchie Programmieren in C

von Walter S. (avatar)


Lesenswert?

ein bißchen unorthodox ist es auch einen String in eine 16-Bit Variable 
zu schreiben ...

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.