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 to comment
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 to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...