Folgendes Problem:
Ich bekomme ein Array mit 5 Bytes, in denen ein 24-Bit-Wert versteckt
ist. Und zwar so:
spi_buf[0] = X X X X X X X X
spi_buf[1] = X X X X X X 23 22
spi_buf[1] = 21 20 19 18 17 16 15 14
spi_buf[2] = 13 12 11 10 09 08 07 06
spi_buf[3] = 05 04 03 02 01 00 X X
Die Zahlen geben dabei die Bit-Positionen an, MSB first...
Jetzt hätte ich gerne eine Funktion, die mir auf einem Atmel AVR mit
AVR-GCC aus diesem (globalen) Array den 24-bit-Wert in einem uint32_t
zurückgibt.
Folgendes habe ich probiert:
1 | uint32_t get_temp (void)
|
2 | {
|
3 | return (((spi_buf[1] & 0b00000011) << 22) |
|
4 |
|
5 | ( spi_buf[2] << 14) |
|
6 |
|
7 | ( spi_buf[3] << 6) |
|
8 |
|
9 | ((spi_buf[4] & 0b11111100) >> 2));
|
10 |
|
11 | }
|
Leider funktioniert das nicht. Ich bekomme eine Compiler-Warnung, dass
ich weiter schiebe, als der Typ breit ist. Außerdem scheinen die Daten
korrumpiert zu sein.
Was mache ich falsch?