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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.