Jump to content

[PHP] I/O 16 Board Auslesen


Recommended Posts

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

Link zu diesem Kommentar
Share on other sites

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";
        }
    }
}

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...