Hallo zusammen,
ich habe für meine atmega328p eine Funktion, die beim ersten Aufruf in
die Zelle 0 des eeproms einträgt und beim zweiten aufrufen in die Zelle
1.
Falls die Funktion nur einmal aufgerufen wird, wird der Float korrekt in
Zelle 0 eingetragen. Rufe ich aber ein zweites mal die Funktion auf um
auch in Zelle 1 was einzutragen, dann ist der Inhalt in Zelle 1 nicht
mehr korrekt.
Weiß einer wie ich dieses Problem lösen kann?
Hier die Funktion:
Ich kenne nun deine eeprom-funktion nicht, aber ein float hat doch 4
byte und das EEPROM ist byteweise orientiert, sodass evtl da was
überschrieben wird? Probiere doch statt eeprom_write_float(1, 22.22)
einmal eeprom_write_float(3, 22.22). Vielleicht geht es dann?
Kurt schrieb:> Das ist ja eine dämliche write_float-Funktion, wenn die bei> Adresse N nicht auf N * (Länge der float-Variable) zugreift.
Dämlich ist eher Deine Annahme, dass man ausschliesslich Floats ins
EEPROM schreibt und die Adressen dementsprechend immer Vielfache davon
wären.
Kurt schrieb:> Darum bleib ich bei asm...
Die Trolle waren auch schonmal besser.
EAF schrieb:> Clara E. schrieb:>> So simpel...>> Adressberechnungen muss man nicht selber machen!> Das kann man dem Compiler überlassen.> float name EEMEM = 42.42; // Default> // spaeter dann> eeprom_write_float(&name, 11.22); // evtl fehlt da noch ein cast> eeprom_write_float((unsigned)&name, 11.22);
Ist das nicht kompletter Blödsinn?
Warum ist die Zieladresse jetzt auch ein Float?
PittyJ schrieb:> Warum ist die Zieladresse jetzt auch ein Float?
Die Variable <name> ist hier ein Float.
Die Adresse von <name> ist natürlich ein Integer. Anders
schafft das kein Mikroprozessor.
PittyJ schrieb:> Warum ist die Zieladresse jetzt auch ein Float?
Die Variable liegt im EEPROM.
&name liefert einen Zeiger darauf
Der Zeiger wird zu einem unsigned gecastet
Wobei ich mich nicht sicher bin, ob das nötig ist, denn ich weiß nicht
wie eeprom_write_float() definiert ist
erklehr behr schrieb:> Kann man in einem beliebigen <eeprom.h> eines AVR Controllers> nachschauen.
Das habe ich natürlich getan.... schon vor langer Zeit.
Daher kenne ich diese Adressen Verwaltung, ja.....
Bin eher C++, und in C laufen die automatischen Konvertierungen etwas
anders ab, nicht so streng/typesicher.
Bin aber nicht sicher ob wirklich diese Funktion verwendet wird. Aus dem
Quelltext Fragment geht das nicht hervor.
EAF schrieb:> Bin eher C++, und in C laufen die automatischen Konvertierungen etwas> anders ab, nicht so streng/typesicher.
Keine Sorge, für den Fall hier reichts auch in C.
Oliver
erklehr behr schrieb:> Aber im um Kopf und Kragen reden bist ja ganz gut.
Sorry dass ich hier eine "Alternative Adressierung" für EEPROM Variablen
gezeigt habe.
Es ist schon OK, dass dir das nicht schmeckt.
Mag ja auch nicht jeder Himbeereis.
Aber ich kann es auch drastischer formulieren:
Wer händisch Adressen/Pointer festlegt, obwohl es auch automatisch geht,
weiß etwas ganz wichtiges noch nicht.
Wer es dennoch tut, obwohl er/sie/es weiß, ist dämlich genug sich selber
Stöcke zwischen die Beine zu werfen.
PittyJ schrieb:> Ist das nicht kompletter Blödsinn?> Warum ist die Zieladresse jetzt auch ein Float?
Hier ist jemand so ahnungslos.
Kurt schrieb:> Darum bleib ich bei asm...
Hier auch.
Eine eigene Frage?
Dieser Thread ist über 4 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.