Durch einen Ausbau wurde eine dritte MCP23017 Bank notwendig.
Die Erweiterungen sind baugleich wie Bank 1 (0x20) und Bank 2 (0x21).
Die 8 Ausgänge (A0-A7) der Bank 3 lassen sich ohne Probleme schalten, nur die 8 Eingänge (B0-B7) funktionieren nicht.
Alle Eingänge werden mit 0V (GND) geschaltet. Dazwischen hängt ein Opto.
Grundsätzlich sollte es kein Problem sein, aber ich komme einfach nicht auf den Fehler woran es liegen kann.
list mcp23017_B3_HZR
Internals:
CFGFN /media/hdd/fhem/mycfg/AD_Controller/I2C_MCP23017_rasp02.cfg
DEF 0x22
FUUID 6006f430-f33f-1c1b-4170-848653a3fb9e68f4
I2C_Address 34
IODev RpiI2C_1
NAME mcp23017_B3_HZR
NR 325
RpiI2C_1_SENDSTAT Ok
STATE Ok
TYPE I2C_MCP23017
READINGS:
2021-02-03 10:27:15 PortA0 on
2021-02-03 10:27:15 PortA1 on
2021-02-03 10:27:15 PortA2 on
2021-02-03 10:27:15 PortA3 on
2021-02-03 10:27:15 PortA4 on
2021-02-03 10:27:15 PortA5 on
2021-02-03 10:27:15 PortA6 on
2021-02-03 13:17:35 PortA7 on
2021-02-03 12:56:09 PortB0 on
2021-02-03 12:56:09 PortB1 on
2021-02-03 12:56:09 PortB2 on
2021-02-03 12:56:09 PortB3 on
2021-02-03 12:56:09 PortB4 on
2021-02-03 12:56:09 PortB5 on
2021-02-03 12:56:09 PortB6 on
2021-02-03 12:56:09 PortB7 on
2021-02-03 14:00:15 state Ok
Attributes:
IODev RpiI2C_1
Interrupt B0,B1,B2,B3,B4,B5,B6,B7
InterruptOut connected_active-low
OnStartup A0=on,A1=on,A2=on,A3=on,A4=on,A5=on,A6=on,A7=on
OutputPorts A0,A1,A2,A3,A4,A5,A6,A7
Pullup B0,B1,B2,B3,B4,B5,B6,B7
alias Digital I/O Bank 3 | Port A0-A7 (Output) ,B0-B5 (Input)
devStateIcon Ok:it_net@0CFB0C Initialized:it_net@yellow defined:it_net@yellow disconnected:it_net@red error:it_net@red
devStateStyle style="text-align:left;;font-weight:bold;;"
event-on-change-reading .*
group MCP23017
icon it_net
invert_input B0,B1,B2,B3,B4,B5,B6,B7
room _IO
Die dritte Bank wurde beim GPIO Interrupt eingetragen.
list INT
Internals:
CFGFN /media/hdd/fhem/mycfg/GPIO/GPIO_rasp02.cfg
DEF 21
EXCEPT_FD 19
FUUID 5c4500f9-f33f-c019-b5f0-dfc1c428017fdc7e
GPIO_Basedir /sys/class/gpio
GPIO_Nr 21
NAME INT
NR 1005
STATE AUS
TYPE RPI_GPIO
WiringPi_gpio /usr/bin/gpio
lasttrg 1612357274.56659
READINGS:
2021-02-03 14:01:14 Dblclick off
2021-02-03 14:01:14 Longpress off
2021-02-03 14:01:19 Pinlevel low
2021-02-03 14:01:14 interrupt egal
2021-02-03 14:01:14 state off
fhem:
interfaces switch
Attributes:
active_low yes
alias RPI_GIPO 21 Interrupt für MCP23017 Modul
devStateIcon EIN:control_on_off@0CFB0C AUS:control_home@red
devStateStyle style="text-align:left;;font-weight:bold;;"
direction input
event-on-change-reading .*
eventMap on:EIN off:AUS
group MCP23017
icon control_on_off
interrupt both
room _GPIO,_IO
userReadings interrupt {fhem ("get mcp23017_B1_HZR,mcp23017_B2_HZR,mcp23017_B3_HZR");;"egal"}
Hardwaremäßig ist betreffend GPIO Interrupt keine Änderung notwendig.
... ist die Beschaltung der Eingänge so vorgegeben oder "Eigenkonstruktion" ?
Da der Baustein MCP23017SP über keine internen Pull-Down-Widerstände verfügt, werden alle als Eingang deklarierten Pins über die internen Pull-Up-Widerstände auf HIGH-Pegel gezogen (Negative Logik), um einen undefinierten Zustand oder das Auffangen von Störungen auszuschließen. Die Eingangspins müssen also aktiv gegen Masse gezogen werden.
Mit deiner Beschaltung über den Opto-Koppler erreichst du an den Eingängen keine ausreichende Pegeländerung.
LG
Papa Romeo
Ich habe es vorher schon ohne Optokoppler getestet, aber keine Änderung am Eingangspin erreicht.
Test mit Schalter gegen Masse und Schalter gegen 5V erreichten keine Änderung.
Da die Schaltkontakte doch sehr weit weg sind, habe ich eine Trennung über den Opto verwendet.
Jedenfalls habe ich einen Überlegungsfehler bei der Logig am Eingang, denn ich noch ändern muss.
Da werde ich nochmals einen Testaufbau machen um die Funktion der Eingänge nochmals prüfen.
Hoffentlich spielen meine alten Grauen Zellen da noch mit. :-[
...hast du´s mal mit externen Pullup´s versucht.
Hatte ähnliches Problem mal mit nem PCF8575. Ging dann nur mit externen Pullup´s.
Hallo Burny4600
Ich hatte bei meinen MCP´s als Eingang auch mal das selbe Problem. Die Reading für die einzelnen Eingänge wollten sich nicht ändern obwohl ich den Eingang direkt auf minus gelegt katte.
Bei mir war es dann der nicht richtig ausgeführte interupt. Wenn ich das richtig in deinen List für den Interupt sehe hast Du mehrere MCP´s als Eingänge. Ich zähle drei.
Sollte dann das Attr InterruptOut für die MCP´s mit Eingängen nicht besser so eingestellt sein.
attr mcp23017_B3_HZR InterruptOut connected_open-drain
Hatte das mal im Forum gelesen und bei meinen MCP´s bis her ohne Probleme am laufen.
Hab den Forum Eintrag gefunden https://forum.fhem.de/index.php/topic,23164.msg539631.html#msg539631.
Dann ist aber noch ein externer pull up Wiederstand am GPIO nicht unwichtig.
Ich verwende bei mir GPIO 4 mit einen 100K Ohm pull up Wiederstand als interupt.
Vieleicht hilft auch zum einkreisen des Fehlers einen Eingang auf masse legen und dann manuell einen get mcp23017_B3_HZR in der Konsole absetzten.
Wenn jetzt das reading im mcp23017_B3_HZR für den Eingang wechselt ist es der Interupt der nicht ausgewertet wird.
Viele Grüsse
Stephan
Ich habe jetzt alles durch.
Pull-UP extern vom Eingang gegen High (5V).
Die Eingänge schalten wiederum nicht eigenständig. Nur mit einem Refresh wechselt der Eingang seinen Zustand.
Meine Vermutung liegt beim Mixed Betrieb, da diese Bank sowohl mit Ausgängen und Eingängen betrieben wird.
Anbei ein vollständiger MCP23017 Plan mit Interrupt.
Die Interupt-Schaltung ist für die Trennung der 3,3V des PIs und die 5V des MCP23017.
Die Interupt-Schaltung ist aber nur einmal mit der ersten Bank ausgeführt.
Ich teste noch ein paar andere Möglichkeiten und Tipps aus dem Forum.
Hallo Burny4600
Es ist wirklich sehr wichtig das die Interup Ausgänge der MCP´s nur dann parallel angeschlossen sind wenn Du die InteruptOut Funktion der MCP´s mit Eingängen auf connected_open-drain stellst.
Ansonsten hast Du wenn ein Interupt low ist und der Andere high einen kurzschluss.
Eine sache ist mir noch aufgefallen ist zwar lange her aber ich glaube die Semikolons im userreading waren nicht ganz unwichtig. Ich habe bei mir 4 MCP´s als Eingänge und mein
usereading sieht so aus.
test {fhem ("get MCP0,MCP2,MCP4,MCP6");;;; "egal"}
Kann auch blödsinn sein aber vieleicht ist es nur die Anzahl der Semikolons Bei mir vier weil vier mal get ? wären dann bei Dir 3 ;;; . Ein Versuch kann nicht schaden.
Viele Grüsse
Stephan
Zitat von: Burny4600 am 05 Februar 2021, 18:47:49
Anbei ein vollständiger MCP23017 Plan mit Interrupt.
Die Interupt-Schaltung ist für die Trennung der 3,3V des PIs und die 5V des MCP23017.
Die Interupt-Schaltung ist aber nur einmal mit der ersten Bank ausgeführt.
Hallo Burny4600,
kleine Verständnisfrage:
1. Ist das jetzt der komplette Schaltplan oder fehl da jetzt noch ein MCP
2. hast du alle Int-Ausgänge der MCP angeschlossen oder nur Int A von Bank 1
3. Sind die Port´s vom MCP1 und MCP2 alle Ausgänge oder gemischt.
LG
Papa Romeo
@Papa Romeo
Zitat1. Ist das jetzt der komplette Schaltplan oder fehl da jetzt noch ein MCP
Das stimmt. Am Plan sind nur zwei Banken ersichtlich.
Der Pan dient nur zur Dokumentation des prinzipiellen Aufbaus der MCP23017.
Zitat2. hast du alle Int-Ausgänge der MCP angeschlossen oder nur Int A von Bank 1
Es gibt nur einen INT Ausgang für alle MCPs, und das ist INT-A der ersten Bank.
Zitat3. Sind die Port´s vom MCP1 und MCP2 alle Ausgänge oder gemischt.
Wie erwähnt handelt sich es hierbei um 3 Banken.
Bank 1 (Port A0-A7 und B0-B7) sind nur Eingänge
Bank 2 (Port A0-A7 und B0-B7) sind nur Ausgänge
Bank 3 (Port A0-A7) Ausgänge und (Port B0-B7) Eingänge und wird nachgerüstet.
@StelakuZitat... Eingang auf Masse legen und dann manuell einen get mcp23017_B3_HZR in der Konsole absetzten.
Wenn jetzt das Reading im mcp23017_B3_HZR für den Eingang wechselt ist es der Interupt der nicht ausgewertet wird.
So ist das Verhalten. Es kann nur mit dem Interrupt zusammenhängen.
Ich werde mir die Infos was den Interrupt betrifft nochmals abarbeiten. Ich denke da habe ich einen Denkfehler.
Zitat von: Burny4600 am 06 Februar 2021, 10:00:36
..Es kann nur mit dem Interrupt zusammenhängen.
So wie ich das sehe, hängt es definitiv am Interrupt.
Für was sind die Interruptausgänge da?
Wenn die Softare der MCU nicht in der Lage ist oder es programmiertechnisch nicht realisiert ist, das die MCP´s in bestimmten Intervallen über I2C abgefragt werden, erfährt die MCU nie eine Änderung an den PIN´s der Bank die als Eingänge fungieren.
Also nutzt man die INT-Ausgänge. Sie teilen der MCU mit, wenn sich ein Pegel an einem Eingäng ändert. Für Ausgänge spielt INT keine Rolle. Wenn du jetzt also den INT deiner 3 Bank nicht anschließt, wird die MCU nie eine Änderung an diesen Eingängen mitbekommen. Ausser über ein Refresh und somit ein "neu einlesen" des MCP´s über I2C.
INT von Bank1 ist angeschlossen --> sind Eingänge --> werden eingelesen --> funktioniert --> o.k
INT von Bank2 ist offen --> sind Ausgänge --> einlesen nicht erforderlich --> funktioniert --> o.k
INT von Bank3 ist offen --> Ausgänge -->einlesen nicht erforderlich --> funktioniert --> o.k
--> Eingänge --> werden nicht eingelesen --> n.o.k
LG
Papa Romeo
@Papa RomeoZitat...MCU nie eine Änderung an den PIN´s der Bank die als Eingänge fungieren
Das heißt. Alle Banken die Eingänge verwenden ist auch immer hardwaremäßig (INT-A, INT-B) mit dem Interrupt GPIO zu verbinden, wenn ich dich jetzt richtig verstanden habe.
Dann wäre also nicht nur der INT-A der ersten Bank (A0-A7), sondern auch der INT-B der ersten Bank an den Interrupt GPIO zu verbinden.
Ebenso wäre der INT-B der dritten Bank (B0-B7) an den Interrupt GPIO zu verbinden.
Das habe ich bisher noch nie so gehört, oder habe ich dich falsch verstanden?
Ich bin immer davon ausgegangen, dass auf einem Pi mit MCP23017 Banken nur ein einziges Mal der INT an den Interrupt GPIO hardwaremäßig zu verbinden ist.
Der Rest wird mit
interrupt {fhem ("get mcp23017_B1_HZR,mcp23017_B3_HZR");;"egal"}
verknüpft.
Zitat von: Burny4600 am 06 Februar 2021, 12:38:22
@Papa RomeoDas heißt. Alle Banken die Eingänge verwenden ist auch immer hardwaremäßig (INT-A, INT-B) mit dem Interrupt GPIO zu verbinden, wenn ich dich jetzt richtig verstanden habe.
...ich weiß jetzt nicht ob beide INT-Ausgänge genutzt werden müssen, wenn jetzt Port A und Port B als Eingänge genutzt werden oder in diesem Fall dann der Port A reicht. Wenn Du sagst dass deine Bank 1 funktioniert und Port A und B als Eingänge aktualisiert werden obwohl nur INT A angeschlossen ist, könnte das so sein.
Zitat von: Burny4600 am 06 Februar 2021, 12:38:22
Ich bin immer davon ausgegangen, dass auf einem Pi mit MCP23017 Banken nur ein einziges Mal der INT an den Interrupt GPIO hardwaremäßig zu verbinden ist.
Der Rest wird mit
interrupt {fhem ("get mcp23017_B1_HZR,mcp23017_B3_HZR");;"egal"}
verknüpft.
...wenn das so wäre, wie soll denn der MCP der Bank1, eine Änderung der Eingänge an Bank3 mitbekommen und dann einen Interrupt auslösen.
Das muss die Bank3 der MCU schon selber mitteilen oder sie wartet bis die MCU eine erneute I2C Abfrage initialisiert und frägt: " na Jung´s, habt ihr mir irgendwelche Änderungen mitzuteilen ?"
Hast du mal versucht, zur Änderung an der Bank3 auch eine Änderung an einem Eingang der Bank1 zu machen und dann geschaut ob die Bank3 auch aktualisiert wird ?
LG
Papa Romeo
@Papa Romeo
Folgender Test.
Eingang B4 an Bank 3 gesetzt => Keine Änderung an Bank 3 ersichtlich.
Eingang B0 an Bank 1 gesetzt => Statusänderung B0 an Bank 1 und der Status an der Bank 3 B4 wird mit geändert.
Damit ist deine Erklärung passend.
Wenn auf der Bank 1 die Eingänge A0 bis A7 den Status ändern, wird er INT-A ausgelöst.
Auch wenn auf der Bank 1 die Eingänge B0 bis B7 den Status ändern, wird INT-A ausgelöst.
Somit ist der INT-A der Bank für alle 16 Eingänge ausreichend.
Darum ist ein Hardware Interrupt an der Bank drei notwendig.
In diesem gemischtem Betrieb der Bank 3 (Ausgänge A0-A7 und Eingänge B0-B7) ist es wahrscheinlich besser den INT-B zu verwenden?
Was ist dein Ratschlag?
...kann ich dir auch nicht sagen. Must du testen.
Wie ich oben schon schrieb, kann sein das INTA eine Art "Masterfunktion" hat und wenn alle Port´s als Eingänge genutzt werden dieser dann ausreicht.
Bei deiner Bank3 hast du aber den PortA als Ausgang definiert und da denke ich mal, dass INTA dann von PortB nicht bedient wird.
Ich kann aber auch falsch liegen und INTA wird trotzdem gesetzt, dann wäre es aber meines Erachtens nach sinnlos getrennte INT-Ausgänge für PortA und B
zu Verfügung zu stellen.
LG
Papa Romeo
Hallo Burny4600
Bei gesetzten attr. interuptOut separate
IntA wird getriggert wenn an den A Ports eine Änderung stattfindet.
IntB wird getriggert wenn an den B Ports eine Änderung stattfindet.
Bei gesesten attr. interupOut connect
IntA und IntB werden beide getriggert wenn sich was an den Port A oder B ändert.
Bei zwei Banken mit Eingängen so wie bei Dir. Ist das attr. conected_open_drain in beiden MCP zu verwenden.
Dann kannst Du Dir aussuchen welche Int Ausgänge Du miteinander verbindest und dann zusammen auf Deinen Optokopler legst.
Gruß
Stephan
Zitat von: Stelaku am 05 Februar 2021, 18:58:51
Es ist wirklich sehr wichtig das die Interup Ausgänge der MCP´s nur dann parallel angeschlossen sind wenn Du die InteruptOut Funktion der MCP´s mit Eingängen auf connected_open-drain stellst.
Ansonsten hast Du wenn ein Interupt low ist und der Andere high einen kurzschluss.
... erweitere deine Interuptsteuerung wie im Anhang gezeigt mit einfachen Kleinsignaldioden (z.B. 1N4148) dann gehst du dem obigen aus dem Weg und kannst die INT-Ausgänge ohne Bedenken parallel legen. Eventuell musst du den 470 Ohm Widerstand etwas verkleinern, da er dann um 0.5 bis 0.7 Volt weniger verbraten muss.
Aber das musst einfach mal testen.
Solltest aber trotzdem bei allen MCP´s für die INT-Ausgänge Open-Drain oder aktiv-Low einstellen. Auch gemischt.
Aber ein aktiv-High an nur einem MCP sperrt dir deine Interrupt-Funktion.
LG
Papa Romeo
Es lag nur an der Interrupt Beschaltung.
Man lernt ja immer noch dazu.
@Papa Romeo
Das mit den Dioden hatte ich mir auch schon überlegt. Die 470E der LED sind auch mit vorgeschalteter Diode ausreichend.
@Stelaku
Das wäre auch eine Variante die zu überlegen ist.
Bisher hatte ich nur eine Doppelbank im Einsatz, darum gab es auch keine Probleme.
Danke für eure Tipps.
Jetzt funktioniert alles.