- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 2 von 2

Thema: Wie entnehme ich einer variable bestimmte bits als neue Var?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795

    Wie entnehme ich einer variable bestimmte bits als neue Var?

    Anzeige

    Powerstation Test
    Hallo zusammen.

    Ich weiß, dass dies hier mal wieder so ein nerviger Threat sein könnte, aber ich konnte bisher nichts im Forum finden, was dieses Thema anbelangt.

    Ich arbeite momentan mit dem CAN-bus, und baue mir eine Steueranlage auf.

    Diese hat mehrere Kommandostände, welche die Datenpakete an die Steuereinheit senden.

    In CAN kann man jedem Datenpacket einen "Identifizierer" zuweisen.

    Um die auswertung zu erleichtern, will ich das folgendermaßen machen:

    Der Identifier ist 11Bit groß.

    Dieser wird in eine uint16_t Variable sid eingelesen.

    Bit 0 - 5 geben auskunft über den Befehl,
    Bit 6 - 10 geben auskunft über den Absender.


    Nun will ich das ganze in zwei Variablen aufteilen:

    uint8_t absender
    uint8_t befehl



    Ich habe das bei mir folgendermaßen gelöst:

    Code:
    	receive.sender = (sid>>6);
    	x = (sid<<2);
    	receive.befehl = (x>>2);
    sid ist der Idenfitier, der zuvor ausgelesen wurde,
    x ist eine zwischenvariable.


    Das ist nicht der einzige Fall in meinen Programm...

    Darum würde ich gerne wissen, ob es dafür einen leichteren Weg gibt?

    Wenn ich zB bit 3-4 einer 8 Bit-Variable auslesen möchte,

    dann muss ich sie erst nach links verschieben und in eine Zwischenvariable abspeichern, und dann wieder nach rechts veschieben, um die anderen Stellen zu beseitigen....


    Ich hoffe man kann verstehen was ich ansprechen möchte...

    Vielen Dank,
    Gruß,
    Franz

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    In C kannst du bitfelder definieren
    Code:
    union {
    uint16_t    ident16;
      struct {
          unsigned command : 6;   // das sind 6 bit zusammen
          unsigned absender : 5;   // das sind 5 bit zusammen
     }  bits;
    } identifier;
    
     identifier.ident16 = 0x1234;
     if ( (identifier.bits.command  == x)  && ( identifier.bits.absender == y) ) 
     {
     }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad