www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik float - Wert in EEPROM speichern


Autor: Bastler0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kennt jemand eine elegante Methode, einen float - Wert in einem EEPROM
speichern und später wieder auszulesen?
Mein Problem ist die Wandlung von float in 4 x 8 Bit und wieder zurück
(unter C).

: Gesperrt durch Moderator
Autor: cazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welcher MC? Welcher Compiler? Interner oder externer EEPROM?

Autor: Bastler0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MC: Fujitsu MB90F352
Compiler: Softune
EEPROM ist über I²C - Bus angebunden

Mein Problem ist aber nicht das speichern oder ansprechen, sondern die
Umwandlung.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo bastler,

wenn du einen float-wert abspeichern möchtest brauchst du einfach nur
einen zeiger auf den float-wert, castest diesen auf char und kannst
wieder byte-weise arbeiten.

float f;
char *ptr = (char*) &f;

write_eeprom (adress + 0, *ptr++);
write_eeprom (adress + 1, *ptr++);
write_eeprom (adress + 2, *ptr++);
write_eeprom (adress + 3, *ptr++);

so sollte es funktionieren.

das auslesen funktioniert ähnlich :

float f;
char *ptr = (char *) &f;
*ptr++ = read_eeprom (adress + 0);
*ptr++ = read_eeprom (adress + 1);
*ptr++ = read_eeprom (adress + 2);
*ptr++ = read_eeprom (adress + 3);

wenn ich keinen tipp-fehler gemacht habe sollte es funktionieren

gruß
rene

Autor: Bastler0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@TheMason:
Danke für die schnelle Hilfe, das sieht gut aus und der Compiler hat
auch nicht gemeckert.
Testen kann ich die Funktionen erst, wenn ich Platine geliefert
bekomme.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Problem.

Funktioniert auch für alles andere (double, long, structs) :-)

Autor: Gregor (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

tut mir leid, dass ich das Thema wieder aufgreife, aber bei mir tuts 
nicht und ich verzweifle seit Tagen an dem Problem! :(

Ich möchte mal ein kleines Projekt starten! Dieses wird ein 
Elektrinisches Sparschwein! Die Geldwurfanlage und so weiter ist noc in 
Arbeit, es happert am Programm!

Ich benutze einen ATMEGA16L8 so wie das AVRStudio 4.18 SP2 und das 
AVR-Starterkit STK500 zu testzwecken. Angeschlossen sind im Moment die 8 
Taster um die Münzen zu simulieren! Der Speicher ist eine (double) 
Variable, die ich einem I²C EEPROM (ST24C02) speichern möchte, damit der 
Speicher erhalten bleibt, wenn der Strom ausgeschaltet wird.

Um die Funktion des EEPROMs zu testen schreibe ich den Startwert rein 
und lese ihn anschliessend wieder aus, um damit weiter zu arbeiten!

Jedoch schreibe ich eine 10.00 rein und bekomme immer wieder 12.08 
raus!?!
Bei anderen Versuchen meines Programms bekam ich andauernd 0.00 raus!?!

Hier der wichtige Teil des Codes:
int main()
{
  lcd_init();      // LCD Initialisieren
  
  
  
  lcd_print("Hallo Da");
  lcd_line(3);
  lcd_print("gobert ");
  _delay_ms(PAUSE4);  
  
  EEOpen();
  
  float dSpeicher = 10.00;// 1. Durchlauf! 
  schreiben(dSpeicher);// Zählstand des Geldspeichers in den EEPROM schreiben
  
  
  dSpeicher = lesen();      // 2. Durchlauf!
      // Zählstand des Geldspeicher aus dem EEPROM lesen

Meine Funktionen sind:
// Schreibvorgang. Speichert (double) in die ersten 8 Speicherzellen des I²C-EEPROM
void schreiben(float dWert)
{
  unsigned int address=0;
  //char c[16];
  //sprintf(c,"%.2f",dWert);

  //_delay_ms(PAUSE1);
  //lcd_clear();
  //lcd_print(c);
  //_delay_ms(PAUSE1);
  char *c = (char*) &dWert;
  //lcd_clear();

  for(address=0; address<sizeof(float);address++)
  {
    lcd_clear();
    lcd_print("schreibe");
    lcd_line(3);
    lcd_print(*c);
    _delay_ms(PAUSE1);
    if(EEWriteByte(address,*c)==0)    // Bediengung erfüllt wenn schreiben Fehlerhaft
    {
      lcd_clear();
      lcd_print("Fehler a");
      lcd_line(3);
      lcd_print("t: Write");
      while(1);            // Endlosschleife um weiteres schreiben zu verhindern
            
    }
    if(EEReadByte(address)!=*c)
    {
      lcd_clear();
      lcd_print("Fehler a");
      lcd_line(3);
      lcd_print("t: Read");
      while(1);            // Endlosschleife um weiteres schreiben zu verhindern
            
    }
    //address++;
    c++;
  }
  lcd_ausgabe(dWert);
  _delay_ms(PAUSE1);
}

// Lesevorgang. Speichert 8 Bytes in dWert und gibt (double) zurück
float lesen(void)
{
  unsigned int address=0;
  float dWert;
  
  char *c = (char *) &dWert;
  //char * pEnd;
  for(address=0; address<sizeof(float);address++)
  {
    *c = EEReadByte(address);
    
    c++;
  }
  
  //dWert = strtod(data, *c);
  
  lcd_ausgabe(dWert);
  _delay_ms(PAUSE1);
  return dWert;
   
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gregor schrieb:
> Hallo,
>
> tut mir leid, dass ich das Thema wieder aufgreife, aber bei mir tuts
> nicht und ich verzweifle seit Tagen an dem Problem! :(

Dann fang einen neuen Thread an.

Du hast noch nicht mal denselben Prozesser wie der um den es in diesem 
Thread geht.


PS: float ist völlig ungeeignet wenn es um Geldwerte geht.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.