14bit Daten in eine 16bit Variable kopieren?

#3953037
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 ?
#3953058
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.
#3953082
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.

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