Und ich schon wieder! Ein Problem jagt das nächste... Ich bekomme von meinem 24bit AD Wandler 3bytes zurück, die ich in die gemessene Spannung umrechnen möchte (z.B. 7b, 6c, 9d). Am liebsten nach folgendem Schema: D: 13 · 1 = 13 9: 9 · 16 = 144 C: 12 · 256 = 3072 6: 6 · 4096 = 24576 B: 11 · 65536 = 720896 7: 7 · 1048576 = 7340032 ———————— 8088733 Nur verstehe ich ncoh nicht, wie ich die 3 einzelnen bytes zerlegen kann und dann damit weiterrechen soll... Hat jemand einen Vorschlag? MfG Björn
@ Björn W. (bjoern2007) >Ich bekomme von meinem 24bit AD Wandler 3bytes zurück, die ich in die >gemessene Spannung umrechnen möchte (z.B. 7b, 6c, 9d). Am liebsten nach >Nur verstehe ich ncoh nicht, wie ich die 3 einzelnen bytes zerlegen kann Warum zerlegen? Du musst sie eher zusammenführen. unsigned long big; big = value1 <<16L | value2 <<8L | value3; >und dann damit weiterrechen soll... Festkommaartihmetik MfG Falk
Björn W. wrote: > Nur verstehe ich ncoh nicht, wie ich die 3 einzelnen bytes zerlegen kann > und dann damit weiterrechen soll... Garnicht. Die Bytes sind ja schon binär und damit im richtigen Format jeder CPU. Unter C mußt Du sie nur auf 32 Bit erweitern, da C keinen 24Bit-Typ kennt.
1 | unsigned long val = byte0 | (byte1 <<8) | ((unsigned long)byte2 << 16); |
Peter
Vielleicht besser mit Klammern, bei C kann das bisweilen schief gehen. big = (value1 <<16L) | (value2 <<8L) | value3; Das L ist so ein Trick den man wissen muss, damit werden die Schiebeoperationen in 32 Bit long durchgeführt. Ohne würden sie implizit in 16 Bit INT durchgeführt und zumindest des höchstwertige Byte würde im Nirvana landen. Böser Fehler. MfG Falk
Falk Brunner wrote: > Das L ist so ein Trick den man wissen muss, damit werden die > Schiebeoperationen in 32 Bit long durchgeführt. Hab ich eigentlich auch so gelernt, daß der Ergebnistyp immer der größte aus beiden Operanden ist. Aber einmal bin ich damit furchtbar auf die Fresse gefallen. Eine WINAVR-Version hat sich nur am Typ des linken Operanden orientiert und das L des rechten Operanden ignoriert. Seitdem caste ich jetzt immer den linken Operanden. Muß mal probieren, ob der aktuelle WINAVR es wieder richtig macht. Peter
Das scheint schon mal zu klappen. Aber aus z.B. 0x78, 0x37, 0xF9 wird 14329. Wenn ich 14329 wieder in Hex manuell umwandle, erhalte ich 0x37F9. Das würde bedeuten, daß die 0x78 verloren gehen...
@ Björn W. (bjoern2007) >Wenn ich 14329 wieder in Hex manuell umwandle, erhalte ich 0x37F9. Das >würde bedeuten, daß die 0x78 verloren gehen... Wie Peter feststellte scheinen einge Compiler da etwas nachlässig zu sein. Versuch mal das was Peter schrieb. MfG Falk
Jau, das funktioniert. Jetzt werden alle bytes verwendet. Danke euch allen...
und wie kann ich das jetzt in meine Spannung umrechnen? ich müsste es nur ncoh mit 196 multiplizieren und hätte dann einen Wert in nV. Nur, wie geht das? big = big * 196; irgendwie mag der uC das nicht...
@ Björn W. (bjoern2007) >big = big * 196; >irgendwie mag der uC das nicht... müsste gehen, einen Überlauf macht das bei UNSIGNED long eigentlich nicht. GGf. schau mal im Handbuch vom Compiler nach. MFG Falk
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.