Zerteilen von Variablen, bitweises zerlegen

OP #4228486
Lesenswert?
• ▲
▼
Hallo liebe Mikrocontroller Gemeinde,

ich habe ein kleines Projekt bei dem ich Nachrichten über den Can 
geschickt bekommen und empfange Sie mit dem dsPIC4011.
Jetzt enthalten die CAN Botschaften:
z.B. ID 600 Nachricht 8 Byte Lang.
In dieser 8Byte langen Nachricht sind aber mehrere Informationen 
enthalten.
z.B. sind die ersten 3 Bit der 64Bit langen Nachricht die eine 
Information.
Die einzelnen Informationen möchte ich einzelnt auf Variablen speichern.
z.B.
led1_status = "ersten drei bits";
led2_status = "nächsten drei bits";

Nur ich weiß nicht wie ich die 64bit lange Nachricht so zerlege, dass 
z.B. die Variable led1_status nur 101 enthält, falls das die ersten drei 
bits waren.
Gibt es dafür Funktionen von Teile der 64bit Nachricht "abzuschneiden"?
Wie würdet ihr vorgehen?

Man könnte ja davon ausgehen das ich die Nachricht auf eine Variable 
geschrieben habe:

nachricht = 0x1223544291587456;
wie bekomme ich jetzt die ersten drei bits auf die variable led1_status?
#4228505
Lesenswert?
• ▲
▼
grundsätzlich, also in Pseudocode und ohne unterschidliche 
Variablentypen:

led_status = nachricht & 0x07

Erklärung: Du nimmst die Nachricht und wendest ein logisches UND an, 
zusammen mit einer Zahl, bei der nur die unteren 3 Bits gesetzt sind. 
Dadurch bleiben die unteren 3 Bits gleich, der Rest wird zu Null.
Gast #4228512
Lesenswert?
• ▲
▼
E. T. schrieb:
> grundsätzlich, also in Pseudocode und ohne unterschidliche
> Variablentypen:
>
> led_status = nachricht & 0x07
>
> Erklärung: Du nimmst die Nachricht und wendest ein logisches UND an,
> zusammen mit einer Zahl, bei der nur die unteren 3 Bits gesetzt sind.
> Dadurch bleiben die unteren 3 Bits gleich, der Rest wird zu Null.

Das sind wieder die letzten drei Bits. Wenn er aber die ersten drei 
haben möchte, dann ist die (zweite) Lösung von Peter II richtig.
Prinzipiell gilt aber: die benötigten Bits maskieren und bei Bedarf nach 
unten schieben.
Persönliche Seite #4228565
Lesenswert?
• ▲
▼
Robert L. schrieb:
> es gibt eine offizielle Definition was bei einem Byte/Word/usw.
> das "erste" und das "letzte" bit ist?

Ist bei der Zahl 1234 die eins die erste oder letzte Ziffer?

Üblich ist es, die 1 (also die höherwertigste Stelle) als erste, und die 
4 (also die niederwertigste Stelle) als letzte zu bezeichnen, was an der 
Reihenfolge der Darstellung liegt; wir schreiben (und lesen) nunmal von 
links nach rechts, und vom deutschen einer/zehner-Zahlendreher 
abgesehen, sprechen wir Zahlen auch soherum aus.

Das ist eben eintausendzweihundertvierunddreißig ... und nicht 
vierunddreißigzweihunderteintausend.

Werden Bits gezielt numeriert, geschieht das aber andersherum, da ist 
Bit 0 das niederwertigste und Bit 7 (15, 31, 63) das höchstwertigste.


Mit anderen Worten: Es kommt immer auf die sprachliche Präzision und den 
Kontext an.
Gast #4228566
Lesenswert?
• ▲
▼
Frank schrieb:
> Das ist normales C!
Ich weiß....

Frank schrieb:
> Bitfelder wurden ja schon genannt  .......
Die Antworten haben sich überschnitten.

Frank schrieb:
> Oft auch noch mit einer Union überlagert.
Ja.
Zahlreich im Einsatz, und hier auch vermutlich sinnvoll.

Frank schrieb:
> Bin ich zu Arduino verwöhnt?
Das war eher ideologisch gemeint, nicht so sehr technisch.

Ich finde das schieben doof. Ins besondere mit verstreuten Konstanten im 
Code recht unübersichtlich und damit fehlerträchtig.
Von mir aus darf der Compiler das gerne im Hintergrund erledigen.
Gast #4228597
Lesenswert?
• ▲
▼
Ulrich F. schrieb:
> Ich finde das schieben doof. Ins besondere mit verstreuten Konstanten im
> Code recht unübersichtlich und damit fehlerträchtig.

Ja, wenn du es wirklich mit numerischen Konstanten machst, stimmt das. 
Aber man kann sich ja die Konstanten mit Namen definieren, z.B.
1
#define LED12  3
2
led_status = nachricht >> LED12 & 0x07
Gast #4228639
Lesenswert?
• ▲
▼
Ulrich F. schrieb:
> Ich finde das schieben doof. Ins besondere mit verstreuten Konstanten im
> Code recht unübersichtlich und damit fehlerträchtig.
> Von mir aus darf der Compiler das gerne im Hintergrund erledigen.

Dann kapsel doch jeweils die Auswertung in einzelnen Funktionen oder du 
machst es wie beim Arduino objektorientiert in C++.

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