Forum: Compiler & IDEs eeprom_write_block / Wie schreibt man es richtig?


von flyingwolf (Gast)


Lesenswert?

Hi
Ich habe aus
1
void write_parkposition (void)
2
{
3
eeprom_write_block(&parkposition,(void *)0x0130,sizeof parkposition);
4
}
versucht was einfacheres zu machen, damit ich nicht für jede Variable im 
EEprom ein eigenes Unterprogramm brauche.
1
void write_endschalter (int who, char where[3])
2
{
3
float localfloat=who;
4
eeprom_write_block(&localfloat,(void *)where,sizeof localfloat);
5
}
Natürlich mault der Comiler rum.
Bei
1
write_endschalter (az_min, 0x0140);
kommt der allseits beliebte Kommentar :
main.c:1027: warning: passing argument 2 of 'write_endschalter' makes 
pointer from integer without a cast

Was sollte ich schreiben, damit das Gemaule ein Ende hat?
Ach ja! Vermutlich gibt es auch einen triftigen Grund, warum beim lesen 
nur Käse rauskommt, wenn ich meine Integers nicht vor dem speichern im 
Eeprom in floats umwandle, aber welchen?

von Stefan K. (_sk_)


Lesenswert?

Warum verwaltest Du Deine EEPROM-Variablen selber? Lass das doch den 
Compiler machen.

Eine Variable im RAM anlegen:
1
uint16_t ram_var;

Eine Variable als Gegenstück im EEPROM anlegen:
1
uint16_t ee_var __attribute__ ((section (".eeprom")));

im Programm so ins EEPROM kopieren:
1
  eeprom_write_block(&ram_var, &ee_var, sizeof(ee_var));

und so wieder zurückholen:
1
  eeprom_read_block(&ram_var, &ee_var, sizeof(ee_var));


Wenn Du einen ganzen Schwung voller Settings hast, die Du praktisch 
immer gemeinsam ins EEPROM und zurück kopieren willst, dann pack die am 
Besten in eine struct. Dann kannst Du alle Werte mit einem einzigen 
Befehl sichern oder wieder lesen.

Gruß, Stefan

von flyingwolf (Gast)


Lesenswert?

@_sk_
Ja, jemand der C programmieren kann würde das vermutlich so tun und der 
verstünde das auch was Du da schreibst, und inzwischen ist mir 
aufgefallen das ja (void *)0x0130  das zu dem acht, was es sein soll und 
dass (void *)where ja ein cast ist, was auch immer der tut und das ich 
das vermutlich dann in den Aufruf reinoperieren muss, vieleicht in der 
Art write_endschalter (az_min, (void *)0x0140);
irgendwie so eben...

von Walter (Gast)


Lesenswert?

wenn du das eeprom unbedingt von Hand verwalten willst,
dann z.B. so


void write_endschalter (int wert, void *eepromAdresse)
{
float localfloat=wert;
eeprom_write_block(&localfloat, eepromAdresse, sizeof localfloat);
}

und dann
write_endschalter (az_min, (void *)0x0140);


ich hab übrigens keine Idee für was dein

char where[3]

gut sein 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.