hallo! Ich wollte mal Fragen wie genau ich an einem Pin ablesen kann ob der Input High(1) oder Low (0) ist? Mit:
bekommt man nur den Wert des Pins, in dem Fall 4 bei einer High-Spannung...Code:PINB & (1 << PB2);
Könnt ihr mir bitte helfen? Danke
hallo! Ich wollte mal Fragen wie genau ich an einem Pin ablesen kann ob der Input High(1) oder Low (0) ist? Mit:
bekommt man nur den Wert des Pins, in dem Fall 4 bei einer High-Spannung...Code:PINB & (1 << PB2);
Könnt ihr mir bitte helfen? Danke
Mit besagter Codezeile maskierst du ja das gewünschte Bit aus. Jetzt hast du zwei Möglichkeiten:
1. Das Bit an die gewünschte Stelle (ganz nach rechts) schieben. Geht mit (PINB & (1 << PB2)) >> PB2.
2. Wenn du sowieso eine Fallunterscheidung machst, einfach auf ungleich null prüfen: if ((PINB & (1 << PB2)) != 0) { ...
mfG
Markus
Tiny ASURO Library: Thread und sf.net Seite
Meine Funktion sieht so aus:
Es gibt in einem LCD nur 0 zurück?Code:uint8_t digitalRead(uint8_t pin) { uint8_t data; uint8_t reg; if(pin == PIN0 || pin == PIN1 || pin == PIN2 || pin == PIN3){ reg = PINB; } data = reg & (1 << pin) >> pin; return data; }
Versuchs Mal damit (Operatorreihenfolge!)
Davon abgesehen ist das eine reichlich ineffiziente Art, einen Pin einzulesen.Code:uint8_t digitalRead(uint8_t pin) { data = (reg & (1 << pin)) >> pin;
mfG,
Markus
Tiny ASURO Library: Thread und sf.net Seite
Wie denn dann?
Durch einen direkten Zugriff? Zum Beispiel Anstelle von if(digitalRead(...)) ein if((PINx & (1 << PINxy)) != 0))
mfG
Markus
Tiny ASURO Library: Thread und sf.net Seite
Vorsicht Falle:... Meine Funktion sieht so aus:
Code:... if(pin == PIN0 || pin == PIN1 || pin == PIN2 || pin == PIN3) ...
Wenn Du also auf Null abfragst und ne 1 erwartest/erhoffst, dann kriegst Du die NIE wenn vor dem high-Pin ein low-Pin steht *ätschepätsch sagt der Compiler*Zitat von Kernighan-Ritchie
Du liest meine Posting nicht stelle ich fest. Prima, dann brauch ich nix mehr zu schreiben.
Ciao sagt der JoeamBerg
Hallo Martin,
willkommen im Forum.Vielleicht mal der Reihe nach:... Pin ablesen ... High(1) oder Low (0) .. in dem Fall 4 bei einer High-Spannung ...
Wenn Du nen Wert ungleich 0 bekommst, dann ist das Ergebnis der Abfrage true, dann ist der Pinn high, bei low gibts ne Null - eben ein false. Du hast mit Deiner Codezeile also schon genau das, was Du willst: die Unterscheidung zwischen low und high.
Es gäbe aber auch andere Abfragen - ich als (denk)fauler Mensch möchte es gerne besser verständlich haben (jedenfalls für mich) und habe dies:Damit kann man nun weiter "spielen", beispielsweise frage ich auch mal ein, zwei oder mehrere Tasten ab, etwa so:Code:#define IsBitSet(ADDR,BIT) (((ADDR) & (1<<BIT))?1:0) // Fragt Bit = 1? #define IsBitClr(ADDR,BIT) (!((ADDR) & (1<<BIT))?1:0) // Fragt Bit = 1?Kleines Problemchen beim Tastendruck: die Aktion könnte eine nächste Abfrage auf die gleiche Taste "missverstehen", daher gehts bei mir meist nur dann weiter, wenn die Taste a) erstmal gedrückt und b) danach wieder gelöst wird. Geht easy so:Code:// - - - - - - - - - - - - - - - - #define PRTtstLCD PIND // #define Tst_A 6 // #define Tst_B 7 // #define PRTtstLC2 PINB // #define Tst_C 7 // #define TAan IsBitClr (PRTtstLCD, Tst_A) // Taster A gedrückt ?? #define TAaus IsBitSet (PRTtstLCD, Tst_A) // Taster A gelöst ?? #define TBan IsBitClr (PRTtstLCD, Tst_B) // Taster B gedrückt ?? #define TBaus IsBitSet (PRTtstLCD, Tst_B) // Taster B gelöst ?? #define TCan IsBitClr (PRTtstLC2, Tst_C) // Taster C gedrückt ?? #define TCaus IsBitSet (PRTtstLC2, Tst_C) // Taster C gelöst ?? // ============================================================================== = // ... und als Anwendung irgendwo im Code um abzufragen, ob eine von // drei Tasten gedrückt wurde: ... if ((TAan) || (TBan) || (TCan)) Isec_lok = 0; // ...Code:while (TBaus) {} // Warten bis TB gedrückt ist while (TBan) {} // Warten bis TB gelöst ist
Geändert von oberallgeier (01.12.2013 um 15:27 Uhr)
Ciao sagt der JoeamBerg
Lesezeichen