MCP23017 INTA und INTB anschließen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Tag,

    erst einmal herzlich Willkommen ;)

    Wenn die Arbeitsspannung des MCP23017 auch 3,3 Volt beträgt, dann kannst du diese auf jeden freien GPIO klemmen. Dazu benötigst du aber RPi.GPIO um diese GPIOs als Input auf einen Flankenwechsel von High auf Low überwachen. Im Anschluss auf diesen IRQ kannst du das Auslesen des dazugehörigen Port Registers ( A oder B ) starten. Damit muss man nicht ständig den Bus blockieren, weil man in einem permanenten Auffrage-Loop ist.
    Allerdings hast du nur ca. 20 ms Zeit, diese Auffrage durchzuführen, falls einer der als Input genutzten GPIOs durch einen externe Vorgang ( Taster ) auf den Pegel Low gezogen wird.
    Andernfalls bei höheren Spannungen musst auf eine geeignet Art ( z.B. Pegelwandler ) die Spannungskompatibilität herstellen. Damit diese beiden INT Rückmelder funktionieren, muss mit einem Pull-Up der Eingang auf die Vc des MCP23017 zogen werden, und durch diesen Schaltvorgang der Pegel auf den LOW-Level absinken.

    es grüßt euer
    Willy

  • Guten Tag,

    in dem Sinne gibt es eine Beschaltungsdarstellung im Datenblatt zum MCP23x17 ("0" für die I2C Variante / "S" für die SPI Variante).

    Da hier immer noch keine Angaben gemacht werden, welche Programmiersprache primär für diese Anwendung genutzt werden sollen, bleibe ich mal bei der typischen die von vielen genutzt wird -Python.

    Wenn man den I2C / SPI Bus selber nicht durch permanente Abfragen blockieren will, und die CPU damit nicht "Dauerbeschäftigen" möchte, kann man diese beiden INT_A und INT_B Ausgänge oder nur einen davon mit einem freien GPIO am Raspberry Pi verbinden. Je nach dem an welchem Register A oder / und B irgendwelche schaltenden Elemente angeschlossen sind.

    Standardmäßig geben diese beiden Ausgänge eine Spannung gleich der VC des MCP23x17 aus. Hier mußt du, wie schon erwähnt darauf achten, keine höhere Spannung vom MCP23x17 zum Raspberry PI-GPIO zu führen. Das kann man mit einen Pegelwandler oder einen Spannungsteiler machen, falls die Betriebsspannung des MCP23x17 höher ist als die zulässige Eingangsspannung an einem GPIO.

    Das bedeutet, wenn kein Usereingabe über einen Taster am MCP23x17 erfolgt - ist der Pegel somit immer HIGH.

    Code
    def <Funktionsname>(inter):
        global Value_A
        # Code zum auslesen des Port-Registers
        Value_A = value
        
    
    GPIO.setup(<GPIO-Nummer>, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.add_event_detect(<GPIO-Nummer>, GPIO.FALLING, callback = <Funktionsname>, bouncetime = <Wert für Entprellzeit in ms>)  

    Da dieser Funktionsaufruf selber keinen Rückgabewert verarbeiten kann, also ein return unbeachtet bleiben würde, musst du das Ergebnis des unmittelbar auf die Erfassung eines LOW Pegels an diesem GPIO (Interruptauslösung) und dem darauf folgenden Auslesen des Portregisters diesen Rückgabewert der Port-Registerabfrage irgendwie aus dieser Funktion herausschleusen. Entweder mit dem unschönen global, oder du schreibst dir eine Objektklasse, so das du diesen Rückgabewert in einer der self. Variablen des Objektes zwischenspeichern und abfragen kannst. Die bouncetime kannst du hier auf 1 setzen, oder solange wie dein mechanischer Schalter / Taster noch prellen könnte. Aber niemals länger als 20 ms, denn nach diesen 20ms setzt der MCP20x17 diesen Ausgang, falls der Taster nicht absichtlich länger gedrückt wird automatisch wieder auf High.

    Wenn du beide INT_A und INT_B verwenden willst musst du natürlich zwei GPIOs belegen, und zwei solcher Abruffunktionen schreiben, immer eine jeweils für Register von welchem eine Änderung gemeldet wurde.

    Über einen separaten Timer kannst du nun in regelmäßigen Abständen prüfen, ob sich einer der beiden self.Variablen (Port A oder Port B) geändert hat, und dann die entsprechende Reaktion auslösen.
    Oder wenn es sich nur um OUT-Events handelt, also eine Schaltfunktion als Auslöser auf einen Tastendruck herbeigeführt werden soll, kannst du so einfache, im Programmlauf kurze Sachen, auch direkt in diese Abfragefunktion, wieder mit einer IF-Bedingung ausführen.

    Du kannst falls, der mech. Taster wirklich länger prellen sollte, weil er mechanisch verschlissen ist, auch eine wiederholte Mehrfachabfrage des Portregisters machen um einen einzelnen Störimpuls auszuschließen. Hier kann man zum Beispiel sagen, nachdem der MCP23x17 einen Taster-Event gemeldet hat, mache hintereinander 10 Abfragen und werte dieser Abfragen gezielt nach einer Häufigkeit aus. Wenn z.B. innerhalb dieser 10 Abfragerunden ( die nur wenige 10-100 ns dauern ) mehrmals eine LOW Pegel vom betreffenden Pin des Registers ermittelt wurde, kann man davon ausgehen das es ich um keine Störung, sondern um einen gewollt herbei geführten Event handelt. Oder man ergänzt diese Merhfachabfrage noch um die Auswertung, das der letze Einleseversuch einen LOW Pegel hatte (Das kann auch nicht immer gut sein, oder zu eine Fehlerhaften Auswertung führen). Vieles hängt hierbei von der Materialqualität der Taster ab, so das man keine allgemein gültige Empfehlung aussprechen kann, ob man die "bouncetime" bei der Interrupt Definition höher ansetzt, oder ob es zur Betriebssicherheit besser ist, schon unmittelbar auf das erste LOW Signal am INPUT GPIO zu reagieren, und dafür eine vergleichende Mehrfachabfrage über den I2C / SPI Bus durchzuführen.
    Hier kann man sich nur durch ausprobieren einer zu dem Anwendungsfall passenden Lösung annähern.


    Nur als letzter Hinweis - keine aufwendigen und Laufzeit verschlingenden Ausführungscodes in dieser Abfragefunktionen integrieren, denn wenn diese Funktion ausgeführt wird, wird für diesen Moment die Ausführung des Hauptprogramms welches normal weiter läuft unterbrochen.


    Ich hoffe ich habe das konzeptionell vollständig und ausreichend detailliert beschrieben. Auf den Abfragecode des MCP23x17 habe ich hier mal bewusst verzichtet, denn es gibt verschiedene und unterschiedliche Treiber-Library auch wieder anhängig ob es sich um die I²C oder die SPI Variante handelt.

    es grüßt euer
    Willy

    Edited 2 times, last by WillyR_aus_C (March 16, 2023 at 3:20 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!