Forum: Mikrocontroller und Digitale Elektronik EEPROM Data, geht das so nicht oder hat der Debugger ein Bug?


von tobi (Gast)


Lesenswert?

Hallo,

ich möchte gerne eine Standardkonfiguration fest ins EEPROM schreiben. 
Dafür habe ich folgendes geschrieben.
1
#ifndef EEMEM
2
  #define EEMEM  __attribute__ ((section (".eeprom")))
3
#endif
4
5
static char EEMEM dummy = 0xAA;
6
static ee_data_t EEMEM standard = {13604, 0.1, 100, FALSE, TRUE, FALSE};
7
static bool_t EEMEM used[EE_DATA_COUNT];
8
static ee_data_t EEMEM eedata[EE_DATA_COUNT];

Müsste durch das Attribut EEMEM die Strukturen nicht direkt ins EEPROM 
geschrieben werden oder muss ich die noch extra über 
eeprom_write_block(...) schreiben?

Im AVR Studio 4 Debugger wird mir jedenfalls angezeigt das nur lauter 
0en im EEPROM stehen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nee, du musst nach dem Kompilieren das Datenfile mit den EEPROM Daten in 
das EEPROM deinen AVR schreiben. Z.B. mit dem ISP-Programmer.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM-Speicherabbild_in_.eep-Datei

Beim Simulieren müsste eigentlich der Simulator fragen, ob er das 
vorhandene Datenfile mit den EEPROM Daten laden soll.

Nur 0en im EEPROM kann ich mir nicht erklären. In einem gelöschten 
EEPROM sollten dort 0xFF stegen.

von tobi (Gast)


Lesenswert?

Stefan B. schrieb:
> Beim Simulieren müsste eigentlich der Simulator fragen, ob er das
> vorhandene Datenfile mit den EEPROM Daten laden soll.

Das fragt er auch und ich sage ihm er soll es laden.

Stefan B. schrieb:
> Nur 0en im EEPROM kann ich mir nicht erklären. In einem gelöschten
> EEPROM sollten dort 0xFF stegen.

Ja ich meinte damit in dem von mir genutzen Bereich. Die ersten 88,8% 
sind komplett 0 und am Ende steht 0xFF.


Also ist es ein Bug vom Simulator, dass dieser die Daten nicht ins 
EEPROM läd? Werde natürlich später, wenn ich den µC zur Hand habe, 
testen ob die Daten auch wirklich geschriben wurden. Erstmal hab ich 
aber nur den Simulator.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nö, Daten sind drin, jedenfalls teilweise.

> static bool_t EEMEM used[EE_DATA_COUNT];
> static ee_data_t EEMEM eedata[EE_DATA_COUNT];

sind ja mit 0 initialisiert.

Die Position des EEMEM in der Definition der Variablen stimmt aber 
nicht. Siehe im Link oben, wie das dort gemacht wird.

von tobi (Gast)


Lesenswert?

Danke funktioniert jetzt soweit. Hab das EEMEM an die richtige Stelle 
gepackt und eine fehlende Funktion implementiert. Der Compiler hat die 
Struktur "standard" wohl wegoptimiert.

Gibt es einen Weg gezielt eine EEMEM Variable auf eine bestimtme Adresse 
zu legen, ohne gleich die komplette Adressierung selbst zu machen?

von Lutz (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM-Variable_auf_feste_Adressen_legen

Es lebe das Tutorial.
Und Du solltest #inlcude <avr/eeprom.h> nutzen statt irgednwas per Hand 
zu biegen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Also einfacher als bei
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Bekannte_Probleme_bei_den_EEPROM-Funktionen 
?

Brute-Force #1: Hilfsprogramm für AVR schreiben, das das EEPROM füllt, 
Laufenlassen (real oder im Simulator), Auslesen, beim richtigen Programm 
verwenden.

Brute-Force #2: Hilfsprogramm für PC schreiben, das ein Binärfile 
schreibt mit dem EEPROM Inhalt, mit objcopy in EEPROM-File umwwandeln, 
beim richtigen Programm verwenden.

Brute-Force #3: Mit einem HEX-Editor EEPROM Inhalt in ein Binärfile 
poken, mit objcopy in EEPROM-File umwwandeln, beim richtigen Programm 
verwenden.

Brute-Force #4: Mit einem TEXT-Editor EEPROM Inhalt direkt in dem 
EEPROM-File ändern, Checksummen korrigieren, beim richtigen Programm 
verwenden.

...

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.