MCP23017 Interrupt mit node.js

  • Hallo zusammen,
    nach dem meine Hardware nun vernünftigt arbeitet sitze ich schon mehrere Tage an der Programmierung des MCP23017-Bausteins.

    Auf meinem Pi läuft node.js mit express 4.0. Um mit dem MCP23017 zu kommunizieren habe ich das wiring-pi node plugin installiert.

    Angeschlossen ist das MCP wie folgt (I2C Adresse: 0x20):
    GPB0-GPB7 Inputs die ein Interrupt auslösen sollen bei Veränderung.
    GPA0-GPA7 Outputs die ein Relais steuern.
    INTB ist am GPIO 18 (bzw wiring-pi pin 1) am Pi angeschlossen.
    !RESET ist auf 3,3V.

    Mein Problem ist nun folgendes:
    Ich kann nur ein Interrupt auslösen, indem ich in der Konsole "i2cget -y 1 0x20 0x13" eingebe.
    Dort sehe ich dann auch welche Bits sich verändert haben. Aber dieser Interrupt soll doch allein auslösen :helpnew:

    Meine Software:

    Die Inputs arbeiten mit dem internen Pullup und sind daher Softwareseitig invertiert, damit es sich besser arbeiten lässt.

    Meine Ausgabe sieht nach dem oben gennanten i2cget Befehl so aus:

    Code
    I2C detected
    State: 00100001
    INTERRUPT!
    Caused by: 00100001
    Delta: 51

    Oder wenn sich Zustände geändert haben und ich noch einmal den i2cget Befehl ausführe:

    Code
    INTERRUPT!
    Caused by: 01000001
    Delta: 51


    Wie gesagt möchte ich aber, dass der Interrupt automatisch ausgelöst wird, sobald der Defvalue von 0 sich verändert. Sprich wenn sich der Status von 0 auf 1 ändert. Sonst aber nie.
    Achja der Interrupt-Pin bleibt immer bei 0. Beim auselesen kann ich es aus zeitkritischen Gründen nicht bestimmen ob dieser kurzzeitig auf 1 war.

    EDIT:
    So wie es ausschaut, muss man wohl immer einmalig einen read Befehl senden, damit die Interrupts automatisch starten. Ich probiere noch mal ein paar Sachen aus :D

    Einmal editiert, zuletzt von AncientCredit39620 (29. Mai 2016 um 17:41)


  • So wie es ausschaut, muss man wohl immer einmalig einen read Befehl senden, damit die Interrupts automatisch starten.


    Eher umgedreht - zumindest aus Sicht des Bausteins. Der löscht seine Interruptleitung, wenn ein Lesebefehl auf die Inputs durchgeführt wird. Nimm am besten mal das Voltmeter und prüfe, ob am Baustein das Richtige passiert. Je nach Pin-Konfiguration sollte die Interruptleitung gesetzt werden und bis zum nächsten Lesebefehl stehen bleiben. Wenn irgendein Stück Software auf den Inputs pollt, dann löscht sie Dir hinterrücks die Interruptleitung.

  • Ich kann mir ehrlich gesagt nicht so ganz erklären was nun Schuld war.
    Ich habe einfach nochmal komplett von vorne angefangen mit der Software und nun läuft es wie es soll. :D
    Da ich noch zusätzlich die Anordnung der In- und Outputs am MCP23017 geändert habe, kann es auch durchaus auch dort zu einem Fehler gekommen sein.

    Letztendlich musste ich auch feststellen, dass ein Interrupt bei der Veränderung von DEFVAL in meinem Projekt sinnlos war. Ich habe deshalb die Interrupts auf "value changed" umgestellt und dann nur die Interrupts gefiltert, die eine Veränderung vom vorherigen zu dem jetzigen Zustand von 0 zu 1 am interrupt flag hatten.


    Also ich revidiere meine Aussage und stimme schnasseldag zu.

    Danke für die Anregungen :danke_ATDE:

    Einmal editiert, zuletzt von AncientCredit39620 (31. Mai 2016 um 14:10)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!