falsches Rechenergebnis mit unit32_t EEprom Variablen

Gast #3440151
Lesenswert?

Hallo zusammen,

ich habe ein Problem mit dem Einlesen einer uint32_t -Variablen über die 
Funktion 'eeprom_write_dword'.

Ich definiere die Variablen hiermit:

uint32_t eeSteigungA EEMEM =0;
uint16_t RxyA;

speichere die Variable so:

eeprom_write_dword (&eeSteigungA, Wert);

und will dann in einer Funktion diese Rechnung durchführen:

RxyA = 1234567890/eeprom_read_dword (&eeSteigungA);

und gebe es über UART dann an den PC aus:

USART_Transmit_String(utoa(RxyA,buffer,10));

Die Varaiable &eeSteigungA ist 9-stellig, also größer als uint16_t.
Leider ist das Eregebnis in der Ausgabe nicht das, was es sein sollte.
Mit eeprom_write_word und entsprechend kleinerer Stellenzahl 
funktioniert die Vorgehensweise.
Anscheinend verschluckt eeprom_read_dword ein paar Stellen, aber warum ?

Vielleicht kann mir hier jmd. den Tip geben.

Danke,
Helge
Gast #3444684
Lesenswert?

Warum eeprom_read_dword die verschluckt, weiß ich jetzt.
Ich lese es über UART und die atoi-Funktion ein, und da kann eben nicht 
mehr als 16bit geben.

Was mir aber noch ein Rätsel ist, ist die Tatsache, dass ich, wenn
ich eine Konstante über 16 bit groß wähle, ein richtiges Ergebnis 
erhalte,
multipliziere ich es aber mit einen Faktor, bekomme ich einen Überlauf.

RxyA = 123450000/eeprom_read_dword (&eeSteigungA); >>mit SteigungA 12345
wird 1000 ausgegeben

RxyA = 12345*1000/eeprom_read_dword (&eeSteigungA); >> Überlauf.

Wenn ich in der Rechnung als niemals über den 16-bit Überlauf kommen 
darf,
warum wird dann erste Rechnung richtig ausgegeben ?

Helge
#3444692
Lesenswert?

Im ersten Fall wird mit 32 Bit gerechnet, da 123450000 nicht in 16 Bit 
passt. Im zweiten Fall sind dagegen beide Zahlen in 16 Bit darstellbar, 
also wird auch nur mit 16 Bit gerechnet. Bei der Multiplikation 12345 * 
1000 gibt es dann entsprechend schon den Überlauf.

Abhilfe: Einen der Werte zu 32 Bit machen:
1
RxyA = 12345*1000UL/eeprom_read_dword (&eeSteigungA);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren