14bit Daten in eine 16bit Variable kopieren?

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.