Verständnissprobleme Bitmaske und Verknüpfung

Gast #3941951
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.
#3941957
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;
Gast #3941959
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 !
Gast #3941971
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
}
#3941977
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)

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