Forum: Compiler & IDEs Verständnissprobleme Bitmaske und Verknüpfung


von Marcel P. (souko)


Lesenswert?

Hallo Community,
ich stehe gerade ein bisschen auf dem Schlauch was Bitmasking und 
Datenbastelei in AVR_GCC angeht:

Ich habe folgende Variablen:

uint32_t ExtendedID;    // 29 bit Extended CAN-ID
uint16_t DeviceAdress = 0x1FFF; //maximum Device Adress -> 13 bit !
uint16_t MessageID = 0xFFFF;  //maximum Message-ID -> 16 bit !

ich möchte nun die beiden uint16_t zusammen in die uint32_t CAN-ID 
verpacken.

Dazu muss ich ja die DeviceAdress, welche so aussieht ->

 0001 1111 1111 1111

erstmal in eine 32er wandeln und 16 bit links schieben, oder ?:

 ( 16 << (uint32_t)DeviceAdress)

dann hab ich das hier, richtig ?:

 0001 1111 1111 1111 0000 0000 0000 0000

jetzt muss ich da ja irgendwie die MessageID reintüdeln, was mit 
bitweise AND (&) geht, oder ?

Nur da setzt es bei mir aus, und irgendwie verstehe ich das Tutorial 
auch gerade nicht mehr. Entweder zu müde oder zu viel Code vor Augen !

Es wäre wirklich nett wen mir jemand kurz auf die Sprünge helfen kann.

von Falk B. (falk)


Lesenswert?

@ Marcel Peterkau (souko)

>ich stehe gerade ein bisschen auf dem Schlauch was Bitmasking und
>Datenbastelei in AVR_GCC angeht:

Schon den Artikel Bitmanipulation gelesen?

>erstmal in eine 32er wandeln und 16 bit links schieben, oder ?:

> ( 16 << (uint32_t)DeviceAdress)

Ja.


>dann hab ich das hier, richtig ?:

> 0001 1111 1111 1111 0000 0000 0000 0000

Ja.

>jetzt muss ich da ja irgendwie die MessageID reintüdeln, was mit
>bitweise AND (&) geht, oder ?

ODER!

>Nur da setzt es bei mir aus, und irgendwie verstehe ich das Tutorial
>auch gerade nicht mehr. Entweder zu müde oder zu viel Code vor Augen !

Wahrscheinlich.
1
ExtendedID = ((uint32_t)DeviceAdress << 16) | MessageID;

von Marcel P. (souko)


Lesenswert?

AHHH, da lag der Fehler ! mit ODER...

ich hab die ganze Zeit versucht das mit & und irgendwelchen 
Bitmaskierungen hin zu bekommen (0x0000FFFF) !

Vielen Vielen Dank !

Klar, da der hintere Teil der DeviceAdress nach dem konvertieren in 32 
immer 0 ist, wird mit ODER der hintere 16er teil von der MessageID 
einfach übernommen.

Danke !

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Falk Brunner schrieb:
>> ( 16 << (uint32_t)DeviceAdress)
> Ja.

sicher? sieht mir merkwüdig aus.

ist es noch so sinnvoller?

((uint32_t)DeviceAdress) << 16

von Marcel P. (souko)


Lesenswert?

Falk Brunner schrieb:
> Wahrscheinlich.
> ExtendedID = ((uint32_t)DeviceAdress << 16) | MessageID;

Also dieses Beispiel hat wunderbar funkltioniert !

sieht dann bei mir in seiner gänze so aus:
1
void push_CAN_stats(){
2
  
3
  uint32_t iTemp32 = millis();
4
  
5
  if (iTemp32 % 1000 > 500 && !ui8_CANsendFlag) {
6
    
7
    CANMessage message;    // neue CAN-Msg erzeugen
8
                // Daten eintragen
9
    message.id = ((uint32_t)ui16_DeviceAdress << 16) | 0x4321; //(uint32_t) ui16_DeviceAdress;// & CAN_STAT_MSG_ID;
10
    message.extended = 1;
11
    message.rtr = 0;
12
    message.length = 4;
13
    message.data[0] = (iTemp32 & 0x000000ff);
14
    message.data[1] = (iTemp32 & 0x0000ff00) >> 8;
15
    message.data[2] = (iTemp32 & 0x00ff0000) >> 16;
16
    message.data[3] = (iTemp32 & 0xff000000) >> 24;
17
    
18
    can_send_message(&message);    // Msg abschicken
19
    
20
    ui8_CANsendFlag = 1;
21
  }
22
  if (iTemp32 % 1000 < 500 && ui8_CANsendFlag) ui8_CANsendFlag = 0;
23
  
24
}

von Falk B. (falk)


Lesenswert?

@Marcel Peterkau (souko)

>> ExtendedID = ((uint32_t)DeviceAdress << 16) | MessageID;

>Also dieses Beispiel hat wunderbar funkltioniert !

ja, aber deins war falsch. Verdrehte Reihenfolge der Operatoren! Hab ich 
in dem Moment aber nicht gesehen 8-0

( 16 << (uint32_t)DeviceAdress)

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.