PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schreiben von Werten in EEPROM, uninitialisierte Variablen



DarkFire
30.04.2006, 13:42
Hallo!

Ich habe ein kleines Problem.
Mit meinem ATMEGA32 habe ich mir eine Temperatursteuerung programmiert, wobei ich die Sollwerte vom PC auf den µController und die Messwerte vom µC zum PC übertrage.
Nun wollte ich die Sollwerte nicht im SRAM sondern im EEPROM speichern, damit sie bei einem Stromausfall nicht verloren gehen.
Das Speichern und Auslesen der Werte an sich ist kein Problem.

Nur habe ich das Problem, dass ich die Werte nicht initialisieren darf, da sonst bei einem Reset, warum auch immer, wieder diese Werte als Sollwerte verwendet werden.
Sobald ich die Werte einmal vom PC zum Atmel übertragen habe, ist das Problem sowieso gelöst, da diese ja dann im EEPROM stehen.
Aber davor habe ich eben diese nicht initialisierten Variablen, und deswegen funktioniert meine Steuerung nicht richtig.

Gibt es hierfür irgendeine Lösung, oder denke ich nur mal wieder zu kompliziert?

Chris

SprinterSB
01.05.2006, 14:26
Also in C geht ja bekanntlich alles ;-)

Aber ich verstehe nicht, was du machen willst bzw. wo es hakt. Willst du die (Start-) Werte in deinem Quellcode schon hinschreiben?

Nehmen wir mal an du hast ein Datum foo vom Typ foo_t definiert, der deine Werte beinhaltet und ins EEPROM lokatiert ist:



#define EEMEM __attribute__((section(".eeprom")))

typedef {...} foo_t;

const foo_t foo EEMEM =
{
.wert1 = VAL1,
.wert2 = VAL2
};


Dann wird beim Flashen die Struktur im EEPROM initialisiert. Ohne Initializer sind alle Werte auf 0.

Wo hakt's denn dabei?

PicNick
01.05.2006, 14:31
Gibt welche, die machen das mit einer Prüfsumme (egal welche).
Wenn die paßt, sind die Werte im EEPROM koscher und können verwendet werden, anderenfalls werden sie mit neuen Werten überschrieben (und die Prüfsumme korrigiert).

DarkFire
03.05.2006, 11:36
Wenn ich die Variable als const deklariere, kann ich Ihren Wert nicht mehr ändern.
Es geht mir um das, dass die Variablen bei einem Reset des Controllers nicht mit einem fixen Wert initialisiert werden, sondern nur ein mal beim Flashen und danach nur per Übertragung via UART geändert werden können.
Wie könnte ich das mit einer Prüfsumme realisieren?

Chris

PicNick
03.05.2006, 12:35
Irgendein CRC8 reicht . da gibt's auch im C funktionen für.
Oder einfach miteinander XOR-en, in einer Schleife

SprinterSB
25.05.2006, 13:32
Wenn ich die Variable als const deklariere, kann ich Ihren Wert nicht mehr ändern.
Wer hat dir denn das erzählt...?


const int i = 0;

...
{
int * pi = (int*) &i;

(*pi) = 2;
// und i ist danach 2
}

Aber das löst dein Problem nicht, denk ich.

izaseba
25.05.2006, 13:59
Es geht mir um das, dass die Variablen bei einem Reset des Controllers nicht mit einem fixen Wert initialisiert werden, sondern nur ein mal beim Flashen und danach nur per Übertragung via UART geändert werden können.

Und wo ist jetzt das Problem ?




uint8_t meine_eeprom_variable EEMEM = 123;


lesen:



uint8_t irgendwas;
irgendwas = eeprom_read_byte(&meine_eeprom_variable);

oder


UDR = eeprom_read_byte(&meine_eeprom_variable);

schreiben :

uint8_t irgendwas =150;
eeprom_write_byte(&meine_eeprom_variable,irgendwas);


Was willst Du jetzt da mit Prüfsummen ?
Ich verstehe das Problem nicht...

Gruß Sebastian