Hi,
ich lese mit einem mega32 mittels SPI einen MCP2515 CAN-Controller aus
wobei ich auf ein Problem beim zusammensetzten des Identifiers mittels
bitweise Verschiebung stoße.
Und zwar handelt es sich dabei um einen Standart Identifier mit einer
Länge von 10 bit, dessen Bits 3-10 ein eigenes Register für sich
beanspruchen und den Bits 0-2, die sich ein anderes Register mit
weiteren Daten teilen.
Nach dem einzelnen Auslesen (da das auslesen korrekt funktioniert hab
ich sie hier mal hart rein geschrieben) setze ich diese mit folgendem
Code zusammen:
1 | uint8_t part1 = 0b00100100;
|
2 | uint8_t part2 = 0b01100000;
|
3 |
|
4 | uint16_t id = ((uint16_t)(part1 << 3) | (uint16_t)(part2 >> 5));
|
part1 sollte durch die Verschiebung nach links ja '0b100100000'
betragen. Genau hier liegt aber mein Problem, part1 beträgt nach der
Verschiebung nämlich nur noch '0b100000', das höherwertige HIGH Bit geht
also irgendwie verloren.
part2 wird korrekt zu '0b11' verschoben.
Durch dieses Problem mit part1 erhalte ich am Ende natürlich nicht den
richtigen Wert, was ich mir aber nicht wirklich erklären kann.
Woran könnte das liegen? Ich hab das ganze auch noch auf meinem Rechner
ausprobiert und dort kommt als korrektes Ergebnis '0b100100011' heraus.
Vergesse ich da irgendeine Eigenart des AVR, weswegen es darauf nicht
klappt, auf meinem Desktop aber schon?
Gruß,
toti