Forum: Compiler & IDEs struct aus EEPROM laden


von Martin K. (dschadu)


Lesenswert?

Hi,

ich habe aktuell folgendes Problem:
Ich möchte Daten nach z.B. einem Stromausfall wieder aus dem EEPROM 
laden.
Konkret geht es um folgendes struct:
1
struct sDigitalOut
2
{
3
  uint32_t Preheat[10];
4
  uint32_t OnFromSecond[10];
5
  uint32_t OffFromSecond[10];
6
  uint16_t OnlyInMonth[10];
7
  uint8_t OnlyOnWeekday[10];
8
  uint8_t NumberOfTimers;
9
  };
Dieses struct initialisier ich einmal im RAM und einmal mit EEMEM:
1
struct sDigitalOut DigitalOut = { .NumberOfTimers = 0 };
2
3
struct sDigitalOut EEMEM EEDigitalOut = { .NumberOfTimers = 0 };

Beim start vom Controller möchte ich nun die Daten aus dem EEPROM lesen, 
das mache ich mit
1
eeprom_read_block(&DigitalOut, &EEDigitalOut, sizeof(struct sDigitalOut));

Allerdings ist dann .NumberOfTimers immer 255, also 0xFF, was mir sagt 
dass der EEPROM leer ist. Ich übertrage beim Flashen mit AVR Studio 6.2 
die .elf und die .eep Datei.
Wo liegt mein Fehler? Kommentier ich das eeprom_read_block aus, ist 
.NumberOfTimers korrekterweise 0.

Controller ist ein mega88pa mit einem 7,3728MHz Quarz. Programmiert wird 
über den originalen AVR ISP MK2.

von Andreas B. (bitverdreher)


Lesenswert?

Du mußt es vorher auch reinschreiben.
Nur die Definition schreibt nichts ins EEprom.

Gruß
Andreas

von Ich_kann_lesen (Gast)


Lesenswert?

Andreas B. schrieb:
> Du mußt es vorher auch reinschreiben.
> Nur die Definition schreibt nichts ins EEprom.

Martin K. schrieb:
> Ich übertrage beim Flashen mit AVR Studio 6.2
> die .elf und die .eep Datei.

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:

> Ich übertrage beim Flashen mit AVR Studio 6.2
> die .elf und die .eep Datei.
> Wo liegt mein Fehler? Kommentier ich das eeprom_read_block aus, ist
> .NumberOfTimers korrekterweise 0.

Das 'Lustige' an der Sache ist, dass du im Normalfall eigentlich genau 
das haben willst: Beim Flashen einer neuen Programmversion soll der 
allte EEPROM Inhalt erhalten bleiben. Denn sonst hättest du dir den 
ganzen Aufwand mit dem EEPROM ja auch gleich sparen können.


Das EEPROM kann gegen überschreiben beim Flashen mit einer Fuse 
geschützt werden. Ist die vielleicht bei dir gesetzt?
Hast du darauf geachtet, ob der Brenner auch wirklich das EEPROM bei 
beschreibt?


Ich machs meistens so, dass ich das EEPROM erst mal ignoriere. Wenn sich 
die Entwwicklung dann dem Ende zuneigt, lass ich einmalig den 
Programmcode laufen, der die aktuellen Werte ins EEPROM sichert. D.h ich 
mach das überhaupt nichjt mit dem Brenner, sondern mit dem im AVR 
laufenden Programm selbst. Da seh ich dann gleich auch, ob der Teil des 
Sicherns und Wiederherstellens beim Hochfahren auch funktioniert. Aus 
dem Studio raus hab ich ein EEPROM noch nie vom Brennprogramm 
beschreiben lassen.

von Ralf G. (ralg)


Lesenswert?

Karl Heinz schrieb:
> Ist die vielleicht bei dir gesetzt?
> Hast du darauf geachtet, ob der Brenner auch wirklich das EEPROM bei
> beschreibt?

und:
Die richtige Datei?

von Martin K. (Gast)


Lesenswert?

(bin der TE, aber auf Arbeit und bekomm mein Passwort grad nicht 
zusammen...)

Danke für die Antworten schon Mal.

Karl Heinz schrieb:
> Das EEPROM kann gegen überschreiben beim Flashen mit einer Fuse
> geschützt werden. Ist die vielleicht bei dir gesetzt?
Die Fuse ist nicht gesetzt, auch im Programer-Dialog ist das Häkchen 
nicht gesetzt

> D.h ich
> mach das überhaupt nichjt mit dem Brenner, sondern mit dem im AVR
> laufenden Programm selbst.
Das ist Plan B. Aber es muss doch auch mit dem Programer gehen?

Ralf G. schrieb:
> Die richtige Datei?
Die Datei die AVR-Studio erstellt nach dem Compilieren im Projekt-Ordner 
wo auch die .elf liegt.

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:

> Das ist Plan B. Aber es muss doch auch mit dem Programer gehen?

Dann eben nochmal an den PC, Brenndialog starten, das HEX-File vom 
EEPROM brennen lassen und auf die Ausgaben vom Brennprogramm achten.
Danach zur Kontrolle mal vom EEPROM auslesen, das ausgelesene in ein 
HEX-File speichern und die beiden mal vergleichen. Bei allen Schritten 
auf mögliche Meldungen vom Brennprogramm achten.

Denn: nach dem Brennen müssen die Daten ja im EEPROM liegen, können also 
auch wieder ausgelesen werden.

von Eduard S. (schneehase)


Lesenswert?

1
struct sDigitalOut EEMEM EEDigitalOut = { .NumberOfTimers = 0 };

Schreib mal bei der init in jede Variable 0.
Dann brauchst du ein Byte Array, das ein wenig größer ist als die 
Struktur.
Ins Array kommt überall ein 0xAA rein.

Dann liest du die Struktur in den Block aus Bytes und gibts über die 
Serielle aus.

So siehst du, ob das Eeprom beschrieben wurde. Und ob die Länge der 
Strunktur passt.

Du brauchst da vielleicht noch ein "packed".

von Martin K. (dschadu)


Lesenswert?

Hi,

danke noch mal für die Hilfe. Das Problem muss aber erst mal hinten 
anstehen. Werde dann wohl auch die Variante wie von Karl Heinz nutzen - 
einfach den EEPROM im Programm beschreiben (wie es eh auch vorgesehen 
ist) und beim programmieren das Häkchen setzen, dass der EEPROM nicht 
gelöscht werden soll.

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.