Modul für die Ansteuerung des MCP23017 I2C Portextender

Begonnen von klausw, 03 Mai 2014, 01:02:40

Vorheriges Thema - Nächstes Thema

Byllyy

Hallo und Dank für die schnelle Antwort

Ja die MCPs hängen an einem I2C des PI und ich nutze jeweils nur den INTB da nur dort die Eingänge sind. Wenn ich dich richtige verstehe braucht jeder MCP eine
eigene Interrupt Leitung zum PI und dort auch einen eigenen GPIO.

Ich meine gelesen zu haben das man die drei INT auch auf einen GPIO zusammenlegen kann und dann nur anders in FHEM konfigurieren kann.

R1F800

Zitat von: Byllyy am 05 Januar 2021, 10:44:38
Ich meine gelesen zu haben das man die drei INT auch auf einen GPIO zusammenlegen kann und dann nur anders in FHEM konfigurieren kann.

das gilt nur für jeweils einen Baustein, wenn man INTA und INTB zusammenfügt. Dann kann man in der Definition des MCP in FHEM beide Interrupts (BANK A und BANK B) kombinieren.

Byllyy

Vielen Dank "R1F800", ich habe meine Hardware nach deinem Ratschlag angepasst und alles läuft.

Byllyy

Ich brauche noch einmal eure Hilfe für ein aufgetretenes Problem. Bei meiner bisher fehlerfrei laufenden MCP23017 Erweiterung werden plötzlich die Eingänge
nicht mehr aktualisiert. Nur durch ein Reload der Oberfäche wird der Zustand aktualisiert.
Der Interrupt ist wie folgt definiert:
Internals:
   DEF        22
   EXCEPT_FD  69
   FUUID      5ff5d217-f33f-bc18-fc85-a2ed3e2ea5bc0d65
   GPIO_Basedir /sys/class/gpio
   GPIO_Nr    22
   NAME       Interrupt
   NR         151
   STATE      off
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/bin/gpio
   lasttrg    1611845294.02294
   READINGS:
     2021-01-28 15:41:07   Counter         709
     2021-01-28 15:48:14   Dblclick        off
     2021-01-28 15:48:14   Longpress       off
     2021-01-28 15:48:14   Pinlevel        low
     2021-01-28 15:48:14   state           off
     2021-01-28 15:48:14   test            egal
   fhem:
     interfaces switch
Attributes:
   active_low yes
   direction  input
   group      Hubo
   interrupt  both
   room       I2c,Unsorted
   userReadings test {fhem ("get icMCP23017");; "egal" }
   verbose    5


Den Anhang "egal" habe ich testweise eingefügt da ich im Log folgenden Fehler fand "Error evaluating Interrupt userReading test: hash- or arrayref expected".
Nach Verbose 5 habe ich auch noch "Datei: /sys/class/gpio/gpio22/value, FH: IO::File=GLOB(0x44657d0), EXCEPT_FD: 69, akt. Wert: 0" einmal gelesen.

Habt ihr einen Tipp ?
Vielen Dank,
Byllyy

R1F800


Byllyy

Gerne doch :
Internals:
   DEF        0x22
   FUUID      5ff5d196-f33f-bc18-0431-19c1436c004a19ba
   I2C_Address 34
   INTRIGGER  1
   IODev      i2cBus
   NAME       icMCP23017
   NR         150
   NTFY_TRIGGERTIME 2021-01-28 15:36:54
   STATE      Ok
   TYPE       I2C_MCP23017
   i2cBus_SENDSTAT Ok
   CHANGED:
     PortB4: off
     PortB4: on
     Ok
     Ok
     Ok
     Ok
     OkPortA5: off
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
     Ok
   CHANGEDWITHSTATE:
   READINGS:
     2021-01-25 16:32:51   PortA0          off
     2021-01-25 20:02:45   PortA1          off
     2021-01-25 22:26:06   PortA2          off
     2021-01-19 19:34:47   PortA3          off
     2021-01-20 15:24:31   PortA4          off
     2021-01-28 16:45:11   PortA5          off
     2021-01-25 15:38:19   PortA6          off
     2021-01-11 12:10:30   PortA7          off
     2021-01-19 15:43:48   PortB0          on
     2021-01-28 16:45:02   PortB1          on
     2021-01-06 16:49:28   PortB2          on
     2021-01-28 16:34:13   PortB3          on
     2021-01-28 15:36:55   PortB4          on
     2021-01-26 06:52:30   PortB5          on
     2021-01-26 06:50:46   PortB6          on
     2021-01-26 06:52:44   PortB7          off
     2021-01-28 16:45:21   state           Ok
Attributes:
   IODev      i2cBus
   Interrupt  B0,B1,B2,B3,B4,B5,B6,B7
   InterruptOut connected_active-low
   OutputPorts A0,A1,A2,A3,A4,A5,A6,A7
   Pullup     B0,B1,B2,B3,B4,B5,B6,B7
   group      Hubo
   room       I2c,Unsorted

R1F800

#246
sieht alles OK aus ... ggf ein Browserfehler ? SCRIPT Blocker AKTIV?
>>  NTFY_TRIGGERTIME 2021-01-28 15:36:54
scheint ja zu funktionieren.


Ach ja .. für den INT IN (GPIO) hast Du das einen PullUp eingebaut?
ggf ist aktuell das Netz nicht ok

Byllyy

Hallo R1F800,
mir scheint es auch ein Problem in der Verbindung Pi zum MCU zu sein, da ja softwaremäßig Nichts verändert wurde.
Meinst du einen PullUp den ich Hardwaremäßig in die INT Leitung einbauen soll?

Liebe Grüße und Danke,
Byllyy

R1F800


M.Piet

Hallo Zusammen,

Ich finde das sehr interessant und werde demnächst einen Testaufbau mit 3 x MCP23017 machen.
Ich habe nur eine Verständnisfrage zum Interrupt PIN.
Ich brauch 3 GPOIs am Pi, jeweils einen für jeden MCP23017, richtig?

hajo23

Zitat von: M.Piet am 19 August 2024, 09:57:13Hallo Zusammen,

Ich finde das sehr interessant und werde demnächst einen Testaufbau mit 3 x MCP23017 machen.
Ich habe nur eine Verständnisfrage zum Interrupt PIN.
Ich brauch 3 GPOIs am Pi, jeweils einen für jeden MCP23017, richtig?

Jeder MCP23017 stellt einen Port "A" und "B" bereit. Für jeden Port steht ein Interrupt Pin zur Verfügung. Theoretisch hättest Du also 6. Ob Du alle Interrupts brauchst, hängt natürlich von deiner Anwendung ab.

M.Piet

Danke für deine Antwort.
Mein Problem ist, das ich nicht so ganz verstanden habe, wofür der Interrupt ist und wann ich ihn brauche und wann nicht.

hajo23

Zitat von: M.Piet am 20 August 2024, 21:26:27Danke für deine Antwort.
Mein Problem ist, das ich nicht so ganz verstanden habe, wofür der Interrupt ist und wann ich ihn brauche und wann nicht.

Interrupts sind hilfreich, wenn deine Anwendung zeitnah auf eine Statusänderung an einem Eingang eines Ports reagieren soll. Dort könnte z.B. eine Taste angeschlossen sein.
Du kannst natürlich auch ohne Interrupts arbeiten, dann müsste deine Anwendung überprüfen, ob es an einem der Pins eine Statusänderung gab.

Stelaku

Hallo M.Piet

Du brauchst nur einen GPIO auf den Raspberi pi für das Interupt Signal vom allen MCP23017, die als Eingänge laufen sollen.
Ich habe bei mir alle INTA pins verbunden und auf den GPIO4 meines Raspbery pi gelegt.
Zusätzlich habe ich den GPIO4 über einen 100K Ohm wiederstand auf 3,3Volt gelegt (pull up).
Wenn die Interupts parralel geschaltet werden, müssen diese über das I2C_MCP23017 Modul beim anlegen mit dem Atribut interupt out auf connected_open-drain gestellt werden.
Da die Interupts nichts anderes sind als Ausgänge die von null auf 1 wechseln und dies nicht gut wäre wenn ein MCP ein null Signal am INTA hat und der zweite dann, weil sich ein Eingang verändert plötzlich eine 1 ausgibt.
Das wäre ein Kurzschluss, der mit dieser Atribut Einstellung verhindert wird.
Jedes mal wenn sich an einem MCP an einem Eingang wo auch das Atribut für Interupt aktiviert ist ändert, gibt es einen Impuls auf der INTA Leitung die vom
GPIO4 am PI erkannt wird. Diesen Impuls muss man dann durch ein selbst angelegtes Device auswerten und ein get auf die MCPs ausführen. Dieser get Befehl fragt alle Ports auf den MCP´s ab und gibt sie in das I2C_MCP23017 Device zurück. Das ist notwendig um immer einen aktuellen ist Zustand der Ports zu haben.
Hauptsächlich aber nur für die als Eingänge verwendeten Ports.
Die Ausgänge werden ja durch Fhem gesetzt und der Zustand somit gleich erfasst.

Viele Grüsse

Stephan

M.Piet

Hallo Stephan,
Super. Vielen Dank. Besser hätte man es nicht erklären können!!!!
Jetzt klingt das ganze für mich logisch und ich werde es so umsetzen. ☺️