Das habe ich mir schon gedacht, warum funktioniert das Ganze aber dann mit der 8bit Variable lsb_srf? Die wird dann ja eigentlich auch aus dem Datenbereich ,,geschoben" und müsste somit mindestens 16bit groß sein.
Danke für Deine Hilfe!
Das habe ich mir schon gedacht, warum funktioniert das Ganze aber dann mit der 8bit Variable lsb_srf? Die wird dann ja eigentlich auch aus dem Datenbereich ,,geschoben" und müsste somit mindestens 16bit groß sein.
Danke für Deine Hilfe!
Aus dem obigen "Listing" kommt leider der Datentyp nicht raus. Prinzipiell kann das durchaus sein, das deine Variable auch ein 2 byte Integer ist und kein Byte. Wie sind deine Variable definiert?
result = ((returnvar << 16) + (lsb_srf << 8 ) + msb_srf);
würde ich so schreiben:
GrußCode:uint32_t result = returnvar; // convertion to 32 bit result = result << 16; // shift by 16 bit and build result result |= uint32_t(lsb_srf) << 8; // conversion to 32 bit and shift by 8 bit and build result result |= uint32_t(msb_srf); // conversion to 32 bit and build result
Georg
EDIT: Code
Vorher waren alle als uint8_t deklariert. Es funktioniert mit lsb als uint8_t, msb als uint8_t und returnvar als uint32_t. Jetzt ist es deklariert mit lsb als uint8_t, msb als uint16_t und returnvar als uint32_t, damit funktioniert auch alles problemlos.
Dieser Ausschnitt sieht so aus:
und so wird es wieder ,,zerlegt":Code:uint32_t getValue(uint8_t adr) { uint8_t lsb_srf = 0; uint16_t msb_srf = 0; uint32_t returnvar = 0; [herausfinden von msb/lsb (I²C) und returnvar] return ((returnvar << 16) | (lsb_srf << 8) | msb_srf); }
Code:gM_srf = getValue(ADDRESS); gM_check = ((gM_srf & 0xff0000) >> 16); if(gM_check == 0) { srf10_l = (gM_srf & 0xffff); [...] }
"lsb_srf << 8" funktioniert mit lsb_srf als uint8_t weil die Operation '<<' (wie auch alle anderen Operationen) in C mindestens in int (also hier 16-Bit) durchgeführt wird.
Nachtrag:
Obiges bedeutet aber auch, dass das Ergebnis von "lsb_srf << 8" dann signed ist. Probiere deinen Code mal mit einem Wert für lsb_srf bei dem das höchste Bit gesetzt ist, und bestaune dann das Ergebnis.damit funktioniert auch alles problemlos.
Geändert von sternst (02.01.2013 um 16:49 Uhr)
MfG
Stefan
Danke, nun hab’ ich es verstanden!![]()
Lesezeichen