Skocz do zawartości

MCP23017 z przerwaniami


rezolut

Pomocna odpowiedź

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żą?

Link do komentarza
Share on other sites

Odpowiem sam sobie, że opóźnienia w zerowaniu portu po odjęciu sygnału wysokiego wynikają z braku rezystorów pull-down. Z rezystorami są znacząco niższe. Nie potrafię dobrać wartości rezystora, ale to kwestia czasu, prób i błędów.

Nadal zagadką zostaje dlaczego bez pull-down port sam zmienia stan po określonym czasie, akurat takim a nie innym?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.