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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.