Forum: Mikrocontroller und Digitale Elektronik Bitvariable in C testen


von Norbert (Gast)


Lesenswert?

Hallo C-Freund,

eigentlich müsste ich mich für diese Frage schämen. Aber hier habe ich 
einen Blackout.

Es soll die Bitvariable 'GOK' auf '0' getestet werden.

1.               if (!(GOK == 1))
                    {
                     bei GOK == 0 geht's hier weiter
                    }

oder 2.           if (GOK != 1)
                     {
                      bei GOK == 0 geht's hier weiter
                     }

oder 3.            if (GOK == 0)
                      {
                       bei GOK == 0 geht's hier weiter
                      }

Vielleicht kann man mir die Lösung schonend beibringen, vielen Dank!

Norbert

von Peter D. (peda)


Lesenswert?

Die ANSI Methode Bits zu testen oder zu setzen ist mittels Maskierung. 
Wenn der MC Bitadressierung unterstützt, optimiert er das auch meistens 
zu dem entsprechenden Bitbefehl:

#define BIT_NR 7 //Nummer des Bits im Register (0..7)
#define BIT_REGISTER 0xAA //Adresse des Registers

BIT_REGISTER != 1<<BIT_NR; // setzen

BIT_REGISTER &= ~(1<<BIT_NR); // löschen

if( BIT_REGISTER & (1<<BIT_NR) ){ // testen
; // tue was
}


Peter

von Jangomat (Gast)


Lesenswert?

Wenn GOK bereits als Bitvariable definiert ist, dann ist Dein Vorschlag 
Nr. 3 ausreichend (alle anderen stimmen übrigens auch!), oder noch 
kürzer:
if (!GOK)
        {
             //bei GOK == 0 geht's hier weiter
        }

von Sascha Weitkunat (Gast)


Lesenswert?

Kleiner schreibfehler bei Peter...
Das setzen müsste wie Folgt aussehen:

BIT_REGISTER |= (1<<BIT_NR);

von crazy horse (Gast)


Lesenswert?

und andersrum gehts natürlich genauso
if (GOK)
   {
   }
Und wenn wir einmal beim Thema sind: hat jemand eine Idee, wie man 
Bitfelder anlegen kann? Konkret gehts um ein Projekt, bei dem 4 
gleichartige Kanäle bedient werden sollen, und da die Verarbeitung für 
alle 4 Kanäle gleich ist, sind die entsprechenden Variablen natürlich 
als Arrays abgelegt. Zu jedem Kanal gehören auch 3 Statusbits. Im Moment 
habe ich char-Variablen für die Statusinformationen genommen, 
funktioniert auch. Aber jetzt kommen noch Erweiterungen hinzu, und der 
RAM ist ausgelutscht. Wenn ich die Statusinformationen als bit speichern 
könnte, hätte ich 10 byte gewonnen, das würde genügen.

von Sascha Weitkunat (Gast)


Lesenswert?

Das mit den Bitfeldern ist schnell erledigt...

typedef struct
{
  unsigned char Kanal_1:1;
  unsigned char Kanal_2:1;
  unsigned char Kanal_3:1;
  unsigned char Kanal_4:1;
} Status;

von crazy horse (Gast)


Lesenswert?

werd ich morgen mal probieren.

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.