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


von Bastler0815 (Gast)


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 User
von cazy horse (Gast)


Lesenswert?

welcher MC? Welcher Compiler? Interner oder externer EEPROM?

von Bastler0815 (Gast)


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.

von TheMason (Gast)


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

von Bastler0815 (Gast)


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.

von TheMason (Gast)


Lesenswert?

Kein Problem.

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

von Gregor (Gast)


Angehängte Dateien:

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
}

von Karl H. (kbuchegg)


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.