Prosiłbym o pomoc w ujarzmieniu MCP23017.
MCP na porcie A ma diody, na porcie B chciałbym ustalać stan czujników - jeszcze nie sprecyzowanych, powiedzmy że dających 1 (VCC), która mnie interesuje w momencie zdarzenia, w spoczynku 0 (0V).
MCP podpięty poprawnie, I2C działa, przerwanie teoretycznie też, Arduino reaguje na przerwanie, ale..... no właśnie.
Wg noty układ porównuje stan na wejściu portu z rejestrem DEFVAL. Jeśli w DEFVAL są 0 a wejście podany stan VCC to teoretycznie powinno wystąpić przerwanie (zmiana stanu na pinie Arduino), wychwycone w trybie: albo RISING, albo FALLING. I do tego dążę. Nie bardzo mi jednak to działa. Arduino nie wychwytuje przerwania.
Gdy INTCON=0, czyli gdy MCP ma generować przerwanie przy zmianie stanu wejścia w stosunku do stanu poprzedniego - program działa. Działa, ale... podanie stanu np. na portB.4 (wartość 16) jest rozpoznawane i po chwili po zdjęciu sygnału z portu wartość ta jest zmniejszana nie zerowana. Ustawienie VCC na portB.0 daje 1, potem na portB.1 daje 3 - czyli układ pamięta stan portB.0. Potem kolejno zmniejsza wartość portu na 1 i dopiero na 0.
Ktoś konfigurował MCP23017 do pracy z przerwaniem?
Moje ustawienia - wyżej opisane i raczej jedyne działające to:
IODIR=0xFF - wejście
IPOL=0x00 - bez zmiany logiki
GPINTEN=0xFF - zezwolenie na przerwanie - odpalone jako ostatnie w konfiguracji
DEFVAL=0x00 - wartość do porównania ze stanem na wejściu
INTCON=0x00 - przerwanie gdy zmiana stanu na wejściu - powinno być raczej 0xFF, czyli przerwanie gdy wartość wejścia różna od 0 (od DEFVAL)
IOCON=0x00 - przerwanie Active_Low, czyli chyba w momencie zdarzenia na porcie wystawiany stan niski - z resztą Arduino tak wychwytuje przerwanie ustawione na FALLING
GPPU=0X00 - wejścia nie podciągnięte - zależy mi na 1 przy stanie VCC
Co ja tu mogłem przegapić, że przerwanie nie generuje się raz, tylko po podaniu stanu wysokiego na któryś pin portu B?
[ Dodano: 17-02-2017, 21:33 ]
OK, powiedzmy, że ogarnąłem temat i to co osiągnąłem musi mi wystarczyć - tj. reakcja układu na impuls wysoki z czujnika i reakcja na niski.
Problem w tym, że podając impulsy szybko na kolejne piny, i od razu je zdejmując MCP (albo Arduino?) nie reaguje natychmiast a z pewnym opóźnieniem. I mam coś takiego.
PIN 1 PORT 1 1
PIN 2 PORT 3 3
PIN 4 PORT 7 7
PIN 8 PORT 15 15
PIN 16 PORT 31 31
/... przerwa czasowa... kilkaset ms....//
PIN 1 PORT 30 30
PIN 2 PORT 28 28
PIN 4 PORT 24 24
PIN 8 PORT 16 16
PIN 16 PORT 0 0
Czy te opóźnienia to kwestia konfiguracji? Od czego one zależą?