Forum: Mikrocontroller und Digitale Elektronik CAN ID aus teilen zusammenfühgen


von Jens B. (jayb)


Lesenswert?

Guten Tag

Ich habe vor eine CAN ID aus bestimmten Werten zusammen zu setzten.
Ich benutzte die Can-Lib vom kreatives-chaos.com.


Die ID soll sich aus BoT- Benachrichtigungstype, der senderadresse, der 
empfängeradresse und dem Datentyp zusammensetzten.

Wenn ich dies mit dem Code hier machen klappt des nicht

msg.id = (BoT<<24) | (boardadr<<16) | (rxdrive<<8) | (DoT<<0);

aber auch so gehts nicht

msg.id = (0x90<<24) | (0x03<<16) | (0x01<<8) | (0x10<<0);

wenn ich es aber manuel eingebe
z.B. mag.id = 0x09030110 klappt es....

wo ist der fehler???

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

ins blaue geraten
1
msg.id = (uint32_t)(BoT<<24) | (uint32_t)(boardadr<<16) | (uint32_t)(rxdrive<<8) | (uint32_t)(DoT<<0);

von Karl H. (kbuchegg)


Lesenswert?

** Lötlackl schrieb:
> ins blaue geraten
>
1
msg.id = (uint32_t)(BoT<<24) | (uint32_t)(boardadr<<16) |
2
> (uint32_t)(rxdrive<<8) | (uint32_t)(DoT<<0);


wahrscheinlich ein bischen zu spät gecastet.

wenn du das Ergebnis von
   Bot << 24

auf einen uint32_t castest, ist das Kind schon in den Brunnen gefallen, 
weil durch den <<24 alle Bits nach links rausgeschoben wurden, wenn BoT 
ein 16 Bit int ist.

Also: vorher bereits den BoT auf einen uin32_t casten, dann kann man ihn 
auch um 24 Bits nach links verschieben.

   ... ((uint32_t)Bot) << 24)  ...


und mit boardadr dasselbe machen.

Für rxdrive und Dot ist es grundsätzlich nicht notwendig zu casten. Man 
spart dann dem µC die Arbeit, in 32 Bit zu schieben, wenn es nicht 
notwendig ist.

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> wahrscheinlich ein bischen zu spät gecastet.

Ups! Sorry.
Da habe ich wohl mal wieder tief geschlafen.

von Jupp (Gast)


Lesenswert?

Warum muss denn ueberhaupt gecastet werden? Hex Werte werden in Hex 
geschrieben..

von Rolf Magnus (Gast)


Lesenswert?

Jupp schrieb:
> Warum muss denn ueberhaupt gecastet werden?

Weil der Typ sonst int ist, und falls der auf dem (unbekannten) 
Prozessor 16 Bit breit sein sollte, bleibt nach einem Verschieben um 24 
Bit nicht viel davon übrig.

> Hex Werte werden in Hex geschrieben..

Ähm, ja. Und mit einem Löffel kann man Suppe essen.

von Jens B. (jayb)


Lesenswert?

wow Dankeschön für die schnelle und hilfreiche unterstützung....

sry ich vergass den prozessor anzugeben, ich verwende eine Atmel 
AT90CAN128...




Euch allen ein frohes Fest.....

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.