Hallo, ich habe folgendes Problem: Ich möchte einen BMP180-Drucksensor mit einem ATtiny 84A zum laufen bekommen. Leider muss man um die richtigen Werte zu bekommen ziemlich viel mit den internen Kalibrationswerten herumrechnen, und das klappt einfach nicht. Zum Beispiel folgendes: bmp180_cal.X2 = ((int32_t) bmp180_cal.MC * 2^11); bmp180_cal.X2 ist vom Typ int32_t, bmp180_cal.MC ist -11786 und int16_t. Ich erwarte ein Ergebniss von -24137728, es kommt jedoch -23577 heraus. Die Berechnung sollte ja im größeren Zahlenbereich ausgeführt werden, also 32Bit. Also eigentlich kein Problem, oder? (2l statt 2 hilft auch nicht.) Was mache ich falsch, ich komme einfach nicht drauf.
Bjoern schrieb: > Was mache ich falsch, ich komme einfach nicht drauf. das cast ist an der falschen stelle. so könnte es gehen: bmp180_cal.X2 = ((int64_t)bmp180_cal.MC) * 2^11); aber was soll das 2^11? das ist nicht 2 hoch 11 sondern http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren#Bitweises_exklusives_ODER_.28XOR.29_.5E
der ausdruck 2^11 ist nicht 2 hoch 11 sondern 2 xor 11 verwende hier eien bitshift. bmp180_cal.X2 = (((int32_t) bmp180_cal.MC)<<11)
Manchmal ist es auch vernünftig, nicht zu faul zu sein, sondern sich einen Taschenrechner zu schnappen und 2 hoch 11 selbst auszurechnen, wenn man schon nicht die Werte der 2-er Potenzen auswendig kennt. 2 hoch 11 ergibt 2048. Also einfach anstatt des Künstlens
1 | bmp180_cal.X2 = (int32_t) bmp180_cal.MC * 2048L; |
und dann klappts. Zugegeben, macht nicht soviel hier wie das Anschreiben als 2-er Potenz. Aber irgendwo muss man auch Abstriche machen. Im Gegenzug ist dafür die Operation selbst für Grundschulkinder leicht zu verstehen.
:
Bearbeitet durch User
Danke, das Brett vor dem Kopf ist endlich weg, wie doof... Läuft endlich.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.