-         

Ergebnis 1 bis 6 von 6

Thema: Float Wert in EEPROM schreiben

  1. #1
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    40
    Beiträge
    245

    Float Wert in EEPROM schreiben

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Code:
    #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.
    Disclaimer: none. Sue me.

  3. #3
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    40
    Beiträge
    245
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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:
    Code:
    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
    Code:
    const float float_ee[n] __attribute__ ((section (".eeprom")));
    oder mit Initializer:
    Code:
    const float float_ee[n] __attribute__ ((section (".eeprom"))) =
    { 1.2, 
      2.718281828459045239, 
      M_PI
    };
    Disclaimer: none. Sue me.

  5. #5
    RN-Premium User Begeisterter Techniker
    Registriert seit
    30.04.2004
    Alter
    40
    Beiträge
    245
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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).
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •