Gleitkommazahlen im EEPROM speichern

OP #844323
Lesenswert?

Hallo,

Vielleicht ist das jetzt eine dumme Frage, aber ich weiß momentan nicht 
weiter bzw. ich will nix falsch machen.

Wie ist es am sinnvollsten Gleitkommazahlen (zB. 1,002345) byteweise in 
einem EEPROM abzuspeichern? Wie zerlegt man diese? Gibt es da fixe 
Richtlinien?

Ich hoffe, ich konnte mich verständlich ausdrücken :)
Danke schonmal...


mfg
Andy
OP #844334
Lesenswert?

EEPROM ist eigentlich egal... aber konkret ist es ein 24AA08 von 
Microchip (über TWI ansprechbar)
Programmiersprache sollte C sein und uC ein Mega168.
Datentypen: float zu uint8_t (Array)

Aber eigentlich wollte ich nur wissen, ob es eine prinzipielle 
Vorgehensweise für diese "Umrechnung" gibt - unabhängig von 
Programmiersprache und Plattform.
#844371
Lesenswert?

@Bruno:
Da oben steht was von einem externen EEPROM, das über TWI 
angeschlossen ist, da nützt ihm die eeprom.h überhaupt nix! Er kann 
sich zwar eine Funktion schreiben, die einen float übermittelt, was aber 
nichts daran ändert, dass diese Funktion dann die Aufteilung in einzelne 
Bytes übernehmen muss...
#844389
Lesenswert?

Andreas Posch wrote:
> D.h. mit Zahl.Bytes hol ich die Daten aus dem EEPROM und mit Zahl.Wert
> kann ich dann weiterarbeiten??
Genau. Musst nur aufpassen, dass Du Schreiben und Lesen in der selben 
Reihenfolge machst, sonst gibt's Datenmüll...

...und auf Groß- und Kleinschreibung achten! "Zahl.Bytes" ist nicht 
gleich "zahl.bytes"...

BTW: Das "eeprom_write" oben war natürlich nur als eine Art 
Pseudo-Funktion gedacht, da musst Du dann eben eine entsprechende 
Funktion einbauen, die ein einzelnes Byte ins EEPROM schreibt...
Gast #844503
Lesenswert?

Auslesen könntest du über Zeiger (hier double):
1
Lesefunktion(&Double_Variable,(uint8_t*)0,sizeof(double));
und schreiben so:
1
Schreibfunktion(&Double_Variable,(uint8_t*)0,sizeof(double));

In Lese- und Schreibfunktion werden die Bytes ab der dort angegeben 
Startadresse aus dem EEPROM geholt und 'reingeschrieben.
Auf die Speicherbereiche musste natürlich achten.

Du kannst dir die 'eeprom.h' im GCC mal angucken, das hilft sicher 
weiter.
#844999
Lesenswert?

Die Kontrolle ist doch die "Rückrechnung". Über den eigentlichen Aufbau 
der Gleitkommazahl (Vorzeichen, Mantisse, Exponent) brauchste Dir 
überhaupt keine Gedanken zu machen, wenn Du gewährleistest, dass beim 
Schreiben und Lesen jeweils die gleiche Reihenfolge eingehalten wird.

Eine Gleitkommazahl vom Typ float besteht in diesem Fall aus 32 Bit, 
die in 4 Bytes hintereinander im Speicher abgelegt werden und auf die 
man dort auch einzeln zugreifen kann...
Gast #845298
Lesenswert?

>Nur müsste ich jetzt wissen (zur Kontrolle),

Zur Kontrolle schreibst du deinen Floatwert ins Eeprom, und liest ihn 
dann wieder aus. Kommt der gleiche Wert wieder raus, stimmts.

Wenn du die Einzelbytes wirklich wissen willst, geht das am einfachsten, 
indem du dir mit dem Debugger einen im Ram gespeicherten Floatwert 
ansiehst.

Oliver
Gast #845668
Lesenswert?

>Wie ist es am sinnvollsten Gleitkommazahlen (zB. 1,002345) byteweise in
>einem EEPROM abzuspeichern? Wie zerlegt man diese? Gibt es da fixe
>Richtlinien?

Einfach in Bytes umrechnen, und abspeichern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren