bit_is_set wieso = 8

Gast #5767
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
Gast #5768
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
Gast #5769
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 24 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.