Forum: Compiler & IDEs bit_is_set wieso = 8


von Bernd (Gast)


Lesenswert?

hallo,

mal ne blöde frage wieso kann man von der funktion bis_is_set einen 
anderen wert als 0 oder 1 zurückbekommen und wie habe ich diesen zu 
interpretieren ? Das mit 0 und 1 ist ja einleuchtend aber grössere Werte 
.

Gruß Bernd

von Christian (Gast)


Lesenswert?

Hallo Bernd

Jeder Wert ungleich 0 bedeutet, dass das Bit gesetzt ist.
In C wird 0 mit FALSE gleichgesetzt, jeder Wert ungleich 0 bedeutet aber 
TRUE.
In deinem Fall heisst das wahrscheinlich, dass das Bit 3 vom Port 
gesetzt ist.

Gruss
Christian

von Bernd (Gast)


Lesenswert?

Hallo,

das mit und 1 ist schon kar. hatte ich ja auch so erwartet aber wieso 
bekomme ich beim abfragen eines Pin nicht PORT einen wert von 8 zurück ?
hier der source:

bBit = bit_is_set(PINB,PB0);

alle anderen Pins diese port liefern wie erwartet eine 0 bzw. 1

von Christian (Gast)


Lesenswert?

OK, dann nochmal von vorn.

Die Funktion bit_is_set ist nämlich gar keine, sondern lediglich ein 
Macro, welches in iomacros.h folgendermassen deklariert ist:

#define bit_is_set(port, bit) (__inb(port) & (1<<(bit)))

Wenn man dies nun ohne Makro programmieren möchte schriebe man folgenden 
Befehl:

bBit = __inb(PINB & (1 << PINB3)); // Die korrekte Bez. für Pin 0, aber 
egal

So, jetzt macht das Programm folgendes:
Zuerst wird der Wert des Port B gelesen und auf den Stack geschoben, 
sagen wir mal Pin 0, 3 und 6 wären gesetzt, dann gibt dies folgenden 
Wert:
Port B = 01001001

Jetzt wird der Wert 1 um die Anzahl des gewünschten Pins nach links 
geschoben, das Resultat ist z. B. für Pin 3 = 00001000.

Und jetzt kommt das logische AND (Boolsche Algebra)

01001001
00001000
--------
00001000

Das Resultat ist, wie du unschwer feststellen kannst, Binär 00001000, 
was Dezimal dem Wert 8 entspricht.

Dies bedeutet aber auch, dass die anderen Pins nicht etwa 0 oder 1 
zurückliefern, sondern die entsprechende Wertigkeit des abgefragten 
Pins.
Wenn du jetzt aber das Resultat noch mal verknüpfst, so dass ein 
logischer Ausdruck entsteht, dann wird der Compiler als Resultat des 
logischen Ausdrucks 0 (FALSE) oder 1 (TRUE) zurückliefern.

Beispiel:
Du möchtest wissen, ob Pin 1 oder Pin 5 gesetzt ist. Dann wirst du 
schreiben:

bBitSet = bit_is_set (PINB, PINB1) || bit_is_set (PINB, PINB5)

Das Resultat dieser Berechnung ist nun entweder 0 oder 1.
Übrigens, die 1 ist Compilerabhängig. Viele C-Compiler defineren als 
Rückgabewert TRUE den Wert -1 (Binär 11111111).
Der Wert 0 als FALSE ist hingegegen obligatorisch für jeden Compiler.

Gruss
Christian

von Bernd (Gast)


Lesenswert?

Hallo,

Danke für die ausführliche Antwort.
jetzt habe ichs verstanden.


Gruß Bernd

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.