eeprom_write_block / Wie schreibt man es richtig?

Gast #524053
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?
#524092
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
Gast #524120
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...
Gast #524231
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.