www.mikrocontroller.net

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


Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Ich habe aus
void write_parkposition (void)
{
eeprom_write_block(&parkposition,(void *)0x0130,sizeof parkposition);
}
versucht was einfacheres zu machen, damit ich nicht für jede Variable im 
EEprom ein eigenes Unterprogramm brauche.
void write_endschalter (int who, char where[3])
{
float localfloat=who;
eeprom_write_block(&localfloat,(void *)where,sizeof localfloat);
}
Natürlich mault der Comiler rum.
Bei
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?

Autor: Stefan Kleinwort (_sk_)
Datum:

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

Eine Variable im RAM anlegen:
uint16_t ram_var;

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

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

und so wieder zurückholen:
  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

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.