PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Float Wert in EEPROM schreiben



AlexAtRobo
26.06.2006, 20:54
Ich versuche mich C anzufreunden. Die ersten Tests sind ganz positiv verlaufen, allerdings habe ich jetzt ein kleines Problem, an dem ich mir gerade die Zähne ausbeiße. Ich möchte einen Float Wert ins EEProm schreiben (Messdaten). Wie stelle ich das an? Ich kann ja immer nur ein Byte schreiben. Geht wohl mit Pointern, nur wie?!?!?

Danke für die Augenöffnung im Voraus...

Alexatrobo

SprinterSB
26.06.2006, 21:33
#include <avr/eeprom.h>

float afloat;
const float float_ee __attribute__ ((section (".eeprom")));

void write_float (const float * pfloat)
{
eeprom_write_block (pfloat, &float_ee, sizeof (float));
}

void foo ()
{
write_float (&afloat);
}

Je nach gcc-Version hat's unterschiedliche Makros wie EEMEM.

AlexAtRobo
26.06.2006, 21:45
Hallo,

das funktioniert einwandfrei. Nun noch eine kleine Frage:
const float float_ee __attribute__ ((section (".eeprom")));

Interpretiere ich richtig, dass der Compiler angewiesen wird, im EEPROM Platz für einen Float zu reservieren?
Was mache ich, wenn ich mehere Floats speichern möchte? Mehrfach die Zeile wie oben, für float1, float2,....
Was mache ich bei n floats?

Danke nochmal für die Hilfe, das Licht am ende des Tunnels wird heller, auch wenn der Weg noch steinig ist.

lg

Alexatrobo

SprinterSB
26.06.2006, 22:00
Jepp, das lokatiert ins eeprom. Die Antwort hängt davon ab, was du machen willst...
Wenn dein n sich erst zur Laufzeit ergibt musst du die Adresse selber verwalten. Wie du an eine Adresse schreibst weisst du ja jetzt.
Du könntest einfach an Stelle j schreiben:

eeprom_write_block (pfloat, (const void *) (j*sizeof (float)), sizeof (float));


In dem Falls brauchst du nichtmal ne Variable (oder Array ins EE zu legen, weil du dich selber um die "Verwaltung" kümmerst.

Ist n zur Compilezeit und im Modul bekannt, geht auch

const float float_ee[n] __attribute__ ((section (".eeprom")));
oder mit Initializer:

const float float_ee[n] __attribute__ ((section (".eeprom"))) =
{ 1.2,
2.718281828459045239,
M_PI
};

AlexAtRobo
26.06.2006, 22:07
Ok, hab ich verstanden, ist eigentlich so wie ich es mir gedacht habe. Jetzt noch zu deiner Letzten Codezeile, mit Initializer. Was genau bewirkt der? Ist das der Wert, der an die EEPROM Adresse beim Einspielen des Hex Files in den AVR geschrieben wird, oder hat das eine andere Bedeutung?

lg

Alexatrobo

SprinterSB
26.06.2006, 22:10
So ist es. Funktioniert genauso wie die Initializer "normaler" globaler Variablen. Die landen eben nicht in der Section ".eeprom" (EEPROM), sondern in der Standard-Section ".data" (initialisierter SRAM).

float_ee[2] ist also M_PI (bis auf Rundungsfehler).

Beispiele gibt's auch im Artikel zu GCC (der behandelt avr-gcc).