Forum: Mikrocontroller und Digitale Elektronik 14bit Daten in eine 16bit Variable kopieren?


von M. G. (ixil96)


Lesenswert?

Hallo!

Ich möchte einen 14bit Datensatz von meinem Beschleunigungssensor in 
eine 16bit Variable kopieren.

Dazu lese ich wie im folgenden Codeteil 2 Byte aus und verschiebe das 1. 
Byte (MSB) um 8 Stellen nach links und das 2. Byte (LSB) um 2 Stellen 
nach rechts. Beide Bytes werden nun mittels ODER in FXLS_raw_z 
gespeichert.
1
// copy the 14 bit accelerometer uint8_t data into 16 bit uint16_t
2
FXLS_raw_z = ((FXLS_XYZ_Data[0] << 8) | FXLS_XYZ_Data[1])>> 2;

Wenn ich nun für das 1.Byte einen Wert von 0x0043 und für das 2. Byte 
einen Wert von 0x0024 erhalte, wird in die Variable FXLS_raw_z der Wert 
0x10C9 gespeichert.

Und diesen Wert verstehe ich jetzt nicht!

Ich verstehe das (binär betrachtet) so:

0000 0000 0100 0011 << 8 = 0100 0011 0000 0000
0000 0000 0010 0100 >> 2 = 0000 0000 0000 1001
==============================================
Ergebnis:                  0100 0011 0000 1001
in Hex:                      4    3    0    9

Wie kommt mein UC hier auf 0x10C9 ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal die Klammern an. Das nach-rechts-Schieben erfolgt erst 
nach der OR-Operation.

Wie aber kommt es zu dem merkwürdigen Format der Daten des 
Beschleunigungssensors? Das zweite Byte ist linkbündig?

von Paul (Gast)


Lesenswert?

Klammer?

von H.Joachim S. (crazyhorse)


Lesenswert?

irgendwas stimmt schon mal mit den Klammern nicht :-)

von Detlef K. (adenin)


Lesenswert?

H.Joachim Seifert schrieb:
> irgendwas stimmt schon mal mit den Klammern nicht :-)
Verwirrt mich nicht. 8)

von Karl H. (kbuchegg)


Lesenswert?

m. g. schrieb:

> Wie kommt mein UC hier auf 0x10C9 ?

Weil er den Code richtig abarbeitet?
Im Gegensatz zu dir?

von Karl H. (kbuchegg)


Lesenswert?

Rufus Τ. Firefly schrieb:

> Wie aber kommt es zu dem merkwürdigen Format der Daten des
> Beschleunigungssensors? Das zweite Byte ist linkbündig?


Beide Bytes sind linksbündig.
Das macht durchaus Sinn. Denn dann kann man unterschiedliche IC und/oder 
Modi mit unterschiedlichen Auflösungen alle über einen Kamm scheren, 
weil der mögliche Wertebereich bei allen immer gleich ist. Der eine 
macht eben größere Sprünge in diesem Wertebereich als der andere.

von user (Gast)


Lesenswert?

nicht so
((FXLS_XYZ_Data[0] << 8) | FXLS_XYZ_Data[1])>> 2
sondern so
((FXLS_XYZ_Data[0] << 8) | (FXLS_XYZ_Data[1] >> 2))

von Karl H. (kbuchegg)


Lesenswert?

user schrieb:
> nicht so
> ((FXLS_XYZ_Data[0] << 8) | FXLS_XYZ_Data[1])>> 2
> sondern so
> ((FXLS_XYZ_Data[0] << 8) | (FXLS_XYZ_Data[1] >> 2))

Das würde implementieren, was er beschrieben hat.
Aber es würde keinen Sinn ergeben.
Die erste Version hingegen ist nicht das was er beschrieben hat, ist 
aber diejenige, die Sinn ergibt.

Mein Fazit:
Der Code stammt nicht von ihm und bei der Analyse des Codes hat er sich 
vertan.

von M. G. (ixil96)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Sieh Dir mal die Klammern an. Das nach-rechts-Schieben erfolgt erst
> nach der OR-Operation.
>

Vielen Dank! Jetzt hab ich es verstanden :-)

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
Noch kein Account? Hier anmelden.