anasell Geschrieben December 6, 2012 at 15:26 Geschrieben December 6, 2012 at 15:26 Hallo Zusammen, ich verwende für mein Projekt ein I/O 16 Board und möchte mit meinem PHP Script die einzelnen Eingänge abfragen (an denen unterschiedliche Taster und Sensoren hängen) Mein Problem besteht nun darin die Werte des Interrupts (Value Mask) einem eindeutigem high/low Status zuzuordnen. Es ist ja kein Problem rauszufinden an welchem Port ein Ereignis stattgefunden hat aber der Value Mask (von 0-255) ändert sich immer, je nach dem welche Eingänge parallel involviert sind. Bisher sehen meine Abfragen so oder ähnlich aus: if ( $port=="a" && $interruptMask==1 && $valueMask<255) das gibt allerdings manchmal Probleme wenn mehrere Eingänge aktiv sind. Ich bin mit PHP leider nicht so bewandert, wie könnte man das geschickter machen? Ich schätze man muss hier mit Bitshifting arbeiten aber da kenn ich mich leider überhaupt nicht aus ... Vielen Dank im Voraus Zitieren
photron Geschrieben December 6, 2012 at 15:46 Geschrieben December 6, 2012 at 15:46 Ich schätze man muss hier mit Bitshifting arbeiten aber da kenn ich mich leider überhaupt nicht aus ... Richtig, $interruptMask und $valueMask sind Bitmasken. Jedes Bit darin entspricht einem Pin. Mit dem &-Operator kannst du Bits testen: if ($interruptMask & (1 << 3)) { if ($valueMask & (1 << 3)) { echo "Interrupt: Pin 3 is high"; } else { echo "Interrupt: Pin 3 is low"; } } (1 << 3) bedeutet die 1 um 3 stellen nach links shiften, das ist dann Pin 3 bzw. der 4te Pin. Das mit $interruptMask verundet ergibt einen Wert ungleich 0 (den PHP als true interpretiert) wenn in $interruptMask auch das Bit für Pin 3 gesetzt ist. Der gleichen Test funktioniert auch mit $valueMask um zu bestimmen ob es Interrupt für high oder low ist. Wenn jetzt mehrere Pins involviert sind funktioniert das immer noch, da du mit diesem Muster einzelnen Pins testen kannst unabhängig voneinander: for ($pin = 0; $pin < 8; $pin++) { if ($interruptMask & (1 << $pin)) { if ($valueMask & (1 << $pin)) { echo "Interrupt: Pin $pin is high"; } else { echo "Interrupt: Pin $pin is low"; } } } Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.