float - Wert in EEPROM speichern

Gast #262547
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
Gast #1744212
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:
1
int main()
2
{
3
  lcd_init();      // LCD Initialisieren
4
  
5
  
6
  
7
  lcd_print("Hallo Da");
8
  lcd_line(3);
9
  lcd_print("gobert ");
10
  _delay_ms(PAUSE4);  
11
  
12
  EEOpen();
13
  
14
  float dSpeicher = 10.00;// 1. Durchlauf! 
15
  schreiben(dSpeicher);// Zählstand des Geldspeichers in den EEPROM schreiben
16
  
17
  
18
  dSpeicher = lesen();      // 2. Durchlauf!
19
      // Zählstand des Geldspeicher aus dem EEPROM lesen

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

8
  //_delay_ms(PAUSE1);
9
  //lcd_clear();
10
  //lcd_print(c);
11
  //_delay_ms(PAUSE1);
12
  char *c = (char*) &dWert;
13
  //lcd_clear();
14

15
  for(address=0; address<sizeof(float);address++)
16
  {
17
    lcd_clear();
18
    lcd_print("schreibe");
19
    lcd_line(3);
20
    lcd_print(*c);
21
    _delay_ms(PAUSE1);
22
    if(EEWriteByte(address,*c)==0)    // Bediengung erfüllt wenn schreiben Fehlerhaft
23
    {
24
      lcd_clear();
25
      lcd_print("Fehler a");
26
      lcd_line(3);
27
      lcd_print("t: Write");
28
      while(1);            // Endlosschleife um weiteres schreiben zu verhindern
29
            
30
    }
31
    if(EEReadByte(address)!=*c)
32
    {
33
      lcd_clear();
34
      lcd_print("Fehler a");
35
      lcd_line(3);
36
      lcd_print("t: Read");
37
      while(1);            // Endlosschleife um weiteres schreiben zu verhindern
38
            
39
    }
40
    //address++;
41
    c++;
42
  }
43
  lcd_ausgabe(dWert);
44
  _delay_ms(PAUSE1);
45
}
46

47
// Lesevorgang. Speichert 8 Bytes in dWert und gibt (double) zurück
48
float lesen(void)
49
{
50
  unsigned int address=0;
51
  float dWert;
52
  
53
  char *c = (char *) &dWert;
54
  //char * pEnd;
55
  for(address=0; address<sizeof(float);address++)
56
  {
57
    *c = EEReadByte(address);
58
    
59
    c++;
60
  }
61
  
62
  //dWert = strtod(data, *c);
63
  
64
  lcd_ausgabe(dWert);
65
  _delay_ms(PAUSE1);
66
  return dWert;
67
   
68
}
Angehängte Dateien:
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.