mikrocontroller.net

Forum: Compiler & IDEs bit_is_set wieso = 8


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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


Gruß Bernd

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.