Hallo Leute,
also im Moment funktioniert bei mir irgendwie garnix gescheit, ist mal ein Problem gelöst kommt gleich das nächste sinnlose Problem daher.
![]()
Okay zum Problem: ich habe Messwerte, die typischerweise als floats vorliegen. Diese Floats sollen in ein seperates EEPROM. Die schnittstelle ist per IIC realisiert (mit p. fleuries library).
Wenn ich einen float Wert auf einen Chip speichern möchte habe ich folgende Funktion geschrieben:
Zum abrufen der Bytes auf dem Chip und für die Konversion zurück zu float habe ich folgende Funktion:Code:void write_f(uint16_t adress, float f32) { union { float r; uint8_t i[sizeof(float)]; } u; u.r = f32; adress*=4; //in welche 4 zellen die einzelnen bytes kommen... i2c_start_wait(EEPROM_CHIP_V+I2C_WRITE); i2c_write(HIGHBYTE(adress)); //übertrage speicheradresse i2c_write(LOWBYTE(adress)); i2c_write(u.i[3]); //schreibe 4 bytes i2c_write(u.i[2]); i2c_write(u.i[1]); i2c_write(u.i[0]); i2c_stop(); return; }
Gut, wenn ich nun folgenden Aufruf tätige:Code:float read_f(uint16_t adress) { union { float f; uint8_t i[sizeof(float)]; } u; adress*=4; i2c_start_wait(EEPROM_CHIP_V+I2C_WRITE); i2c_write(HIGHBYTE(adress)); //übertrage speicheradresse i2c_write(LOWBYTE(adress)); i2c_rep_start(EEPROM_CHIP_V+I2C_READ); u.i[3] = i2c_readAck(); //schreibe die 4 bytes u.i[2] = i2c_readNak(); u.i[1] = i2c_readNak(); u.i[0] = i2c_readNak(); i2c_stop(); return u.f; }
... erhalte ich wie gewünscht 2.22 auf dem Display. Soll ja auch so sein.Code:char str[16]; union { float f; uint8_t i[sizeof(float)]; } u1; union { float f; uint8_t i[sizeof(float)]; } u2; u1.f = 2.22; u2.i[3] = u1.i[3]; u2.i[2] = u1.i[2]; u2.i[1] = u1.i[1]; u2.i[0] = u1.i[0]; dtostrf(u2.f,4,2,(char*)str); lcd_puts(str);
Wenn ich aber die Bytes über das EEPROM abhole:
Dann erhalte ich 2.23 auf's Display.Code:char str[16]; write_f(0, 2.22); dtostrf(read_f(0),4,2,(char*)str); lcd_puts(str);
Kann mir bitte jemand erklären, wie es zu dieser Rundung kommt? Ich habe schon allesmögliche probiert, finde aber den Fehler nicht raus...
Ich meine, der einzige Unterschied ist doch nur, dass einmal die Daten per IIC auf nen externen Speicher übertragen werden, beim anderen Fall bleibt halt alles im RAM. Das Phänomen ist übrigens Speicherzellenunabhängig.
Viele Grüße und danke schön mal wieder,
Simon







Zitieren
Lesezeichen