Forum: Mikrocontroller und Digitale Elektronik EEPROM: was mache ich denn jetzt falsches?


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Bevor ihr weiter liest: ja, ich brauche Urlaub, und zwar dringend...

Dann zum Problem... ich habe folgendes Programm für den ATMega8 
geschrieben:
1
struct eepromData
2
{
3
  uint8_t number;
4
  char str[10];
5
};
6
7
struct eepromData test;
8
struct eepromData eeTest[1] EEMEM;
9
10
int main()
11
{
12
  memset((&test), '\0', (sizeof(test)));
13
  eeprom_read_block(&test, &eeTest[0], sizeof(test));
14
  memset((&test.str), '\0', (sizeof(test.str)));
15
  itoa(test.number, test.str, 10);
16
  test.number++;
17
  eeprom_write_block(&test, &eeTest[0], sizeof(test));
18
}

Ich habe eine Datei angelegt mit alle 0x00 (also, 512 Bytes = 0).
Ich schreibe diese Datei in die EEPROM mit:

avrdude -pm8 -cstk500v2 -P/dev/ttyACM0 -U eeprom:w:test.eeprom:r

Und ich lese die Werte mit:

avrdude -pm8 -cstk500v2 -P/dev/ttyACM0 -U eeprom:r:out.eeprom:r && 
hexdump -C out.eeprom

Nun, habe ich zwei Probleme:

1) Nachdem ich das Programm wieder flashe, werde die vorige Werte in der 
EEPROM scheinbar gelöscht.
2) (vielleicht ist ein anderes Teil desselben Problems) Wenn ich den 
ATMega8 ausschalte und wieder einschalte, werden auch die Werte 
gelöscht.

In Prinzip, wenn ich die Werte von EEPROM lese kriege ich sowas:
1
00000000  03 32 00 00 00 00 00 00  00 00 00 ff ff ff ff ff  |.2..............|
2
00000010  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
3
*
4
00000200

die erste Byte wird immer erhöht und danach wird als String den vorigen 
Wert ausgegeben.
Wenn ich mehrmals die Werte lese (und das Programm entsprechend wieder 
gestartet) alles sieht es normal aus, aber, sobald ich eine der zwei 
vorher erklärte Aktionen durchführe, kriege ich wieder:
1
00000000  01 30 00 00 00 00 00 00  00 00 00 ff ff ff ff ff  |.0..............|
2
00000010  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
3
*
4
00000200

Ich freue mich auf eurer Hilfe und werde überhaupt nicht böse, wenn ihr 
sagt, daß ich dumm bin und was notwendiges vergessen habe! :D

Grüße
Luca Bertoncello

von (prx) A. K. (prx)


Lesenswert?

Luca Bertoncello schrieb:

> 1) Nachdem ich das Programm wieder flashe, werde die vorige Werte in der
> EEPROM scheinbar gelöscht.

Es gibt eine Fuse EESAVE, die kontrolliert, ob bei jeder 
Flash-Progammierung auch das EEPROM gelöscht wird.

von Hobby-Frickler (Gast)


Lesenswert?

Und das Problem beim Aus-Einschalten....

Hast du die Brown-Out Erkennung aktiviert (BODEN-Fuse)?

von Luca B. (lucabert)


Lesenswert?

A. K. schrieb:
> Luca Bertoncello schrieb:
>
>> 1) Nachdem ich das Programm wieder flashe, werde die vorige Werte in der
>> EEPROM scheinbar gelöscht.
>
> Es gibt eine Fuse EESAVE, die kontrolliert, ob bei jeder
> Flash-Progammierung auch das EEPROM gelöscht wird.

Ach! Gut, gesetzt und jetzt überlebt die Programmierung...

Danke
Luca Bertoncello

von Luca B. (lucabert)


Lesenswert?

Hobby-Frickler schrieb:
> Und das Problem beim Aus-Einschalten....
>
> Hast du die Brown-Out Erkennung aktiviert (BODEN-Fuse)?

Ja, und auch BODLEVEL...

Also, meine Fuses sind 0E C1 (für den ATMega8).

Auch ohne BODLEVEL verliert immer die Daten nach dem Ausschalten.
Was mache ich noch falsches?

Danke
Luca Bertoncello

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.