PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arrays und Structs im EEPROM vorbelegen



kowolfgang
26.06.2009, 17:44
Hallo,

ich bastel mir gerade ein kleines Slave Gerätchen für meinen RS485 Hausbus bestehend aus einem ATMega88 einem Display und ein bisschen Hühnerfutter.

Das Gerät soll die Vor und Rücklauf Temperaturen der Heizung mit 1wire Sensoren (DS18B20) messen und auf Anfrage die Daten über den Bus verschicken. Nebenbei sollen im Display noch die aktuellen Temperaturen mit den zugehörigen Sensornamen durchscrollen damit man die Temperaturen auch vor Ort ablesen kann.

Gleichzeitig soll das Gerät über nur den RS485 Bus konfigurierbar sein, also will ich die 1Wire Adressen und die Sensornamen in EEPROM vom Controller speichern.

Gerade hier hackts bei mir. Ich will im Programm die Namen und Adressen der Sensoren schonmal vorprogrammieren damit ichs später bei der Inbetriebname leichter hab, allerdings weiß ich nicht wie.

Die Adresse wird mit dem zugehörigen Namen in einer Struktur gespeichert, diese Struktur steckt wiederum in einem 10-feldigem Array das es sowohl im EEPROM als auch im RAM geben soll. Die Werte sollen beim Programmstart aus dem EEPROM in den RAM kopiert werden damit der EEPROM den Programmablauf nicht so stark bremst allerdings weiß ich nicht 1. wie man die Werte in diesem konstrukt aus Arrays und Structs vorbelegen kann und 2. wie man das ganze beim Programmstart sauber aus dem EEPROM ins RAM bringt.


typedef struct {
uint8_t label[16];
uint8_t rom_code[8];
} Sensor_Struct;


Sensor_Struct EE_Sensor[MAXSENSORS] EEMEM ;
Sensor_Struct Work_Sensor[MAXSENSORS] ;

Könnt ihr mir da nen paar Tipps geben wie man das elegant löst?? Ich kau da jetz schon ziemlich lange (4 Wochen) dran und mir is noch nix tolles eingefallen.

Besserwessi
26.06.2009, 21:44
Eine einfache, aber wohl etwas unsaubere Methode wäre es zu dem struct noch ein union zu definieren, so dass man die Bytes einzeln ansprechen kann. Also etwa als
union {
struct {
uint8_t label[16];
....
}
char bytes[16+8];
}

Die Form als .bytes[] kann man dann gut zum kopieren von / zum eeprom nutzen. Bei der Definition oben kann man das aber natürlcich auch gleich so machen. Schwieriger wird es direkt nur bei Elementen die größer als ein Byte sind.

Zum ersten initialisieren, kann man nutzen, dass dass EEPROM gelöscht nur 0xFF enthält. Man ließt die Daten aus dem EEPROM also nur, wenn das nicht 0xFF drin ist. Eine Checksumme wäre auch nicht schlecht.