Hallo,
ich möchte gerne einige Variablen im internen eeprom des AtMega8
abspeichern. Das funktioniert soweit auch einwandfrei, mir ist lediglich
noch nicht ganz klar, wie ich den Inhalt meiner Variablen "dynamisch" in
das eeprom schreibe.
Der Code sieht folgendermaßen aus:
1 | //Variablen für die Weckzeit
|
2 | volatile uint8_t w1_minute;
|
3 | volatile uint8_t w1_stunde;
|
4 | volatile uint8_t w2_minute;
|
5 | volatile uint8_t w2_stunde;
|
6 |
|
7 | //EEPROM-Variablen EEMEM
|
8 | uint8_t w1_minute_ee EEMEM;
|
9 | uint8_t w1_stunde_ee EEMEM;
|
10 | uint8_t w2_minute_ee EEMEM;
|
11 | uint8_t w2_stunde_ee EEMEM;
|
12 |
|
13 | //######## eeprom-Funktionen #######
|
14 | #define EEPROM_DEF 0xFF
|
15 |
|
16 | void eeprom_read (void){
|
17 |
|
18 | //EEPROM-Variablen lesen und den Weckzeit-Variablen zuordnen
|
19 | w1_minute = eeprom_read_byte (&w1_minute_ee);
|
20 | w1_stunde = eeprom_read_byte (&w1_stunde_ee);
|
21 | w2_minute = eeprom_read_byte (&w2_minute_ee);
|
22 | w2_stunde = eeprom_read_byte (&w2_stunde_ee);
|
23 |
|
24 | //Standardinhalt für leeres EEPROM setzen (Wert 0)
|
25 | uint8_t w1_minuteDefault = 0;
|
26 | if ((w1_minute = eeprom_read_byte (&w1_minute_ee)) == EEPROM_DEF){
|
27 | w1_minute = w1_minuteDefault;
|
28 | }
|
29 | uint8_t w1_stundeDefault = 0;
|
30 | if ((w1_stunde = eeprom_read_byte (&w1_stunde_ee)) == EEPROM_DEF){
|
31 | w1_stunde = w1_stundeDefault;
|
32 | }
|
33 | uint8_t w2_minuteDefault = 0;
|
34 | if ((w2_minute = eeprom_read_byte (&w2_minute_ee)) == EEPROM_DEF){
|
35 | w2_minute = w2_minuteDefault;
|
36 | }
|
37 | uint8_t w2_stundeDefault = 0;
|
38 | if ((w2_stunde = eeprom_read_byte (&w2_stunde_ee)) == EEPROM_DEF){
|
39 | w2_stunde = w2_stundeDefault;
|
40 | }
|
41 | }
|
42 |
|
43 | void eeprom_write (void){
|
44 | w1_minute = 30; //statische Zuweisung nur testweise
|
45 | eeprom_write_byte(&w1_minute_ee, w1_minute);
|
46 | eeprom_write_byte(&w1_stunde_ee, w1_stunde);
|
47 | eeprom_write_byte(&w2_minute_ee, w2_minute);
|
48 | eeprom_write_byte(&w2_stunde_ee, w2_stunde);
|
49 | }
|
Wie man sehen kann, schreibe ich die Werte der Weckzeit-Variablen per
eeprom_write in das eeprom. Wenn ich jetzt wie hier einen konstanten
Wert zuordne, wird dieser in das eeprom geschrieben und beim nächsten
Start auch wieder ausgelesen und angezeigt.
Meine Frage ist jetzt, wie ich die Funktion void eeprom_write am besten
aufrufen soll. Wenn ich sie einmal im Hauptprogramm aufrufe, sind die
Weckzeit-Variablen noch 0 und entsprechend wird das eeprom auch auf 0
gesetzt und nichts erneut eingelesen.
Ich möchte aber, dass das eeprom immer die aktuellen Werte der
Weckzeit-Variablen, die per Tastendruck hoch- und runtergezählt werden
können, enthält. Eine while-Schleife oder ein Aufruf durch einen Timer
erscheint mir nicht sinnvoll, da die Lebensdauer des eeproms ja begrenzt
ist.