rezolut Napisano Luty 17, 2017 Udostępnij Napisano Luty 17, 2017 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żą? Cytuj Link do komentarza Share on other sites More sharing options...
rezolut Luty 18, 2017 Autor tematu Udostępnij Luty 18, 2017 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? Cytuj Link do komentarza Share on other sites More sharing options...
aw Kwiecień 6, 2017 Udostępnij Kwiecień 6, 2017 Przymierzam się do zastosowania tego układu w czujniku własnej konstrukcji. Znalazłem taka bibliotekę: https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library Jeżeli nie chcesz jej stosować, to na pewno pomoże analiza kodu źródłowego. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!