Skocz do zawartości

Aprawdzanie stanu pinu MCP23017 w przerwaniu Arduino


vtor

Pomocna odpowiedź

Witam

Jak się mylę to mnie poprawcie. Sygnał na pinie przerwania arduino (UNO) wywołuje funkcję w której ma być sprawdzany stan na pinie expandera.

void kontrola(){
  Serial.println ("TEST");
  if (mcp.digitalRead(0)== LOW){
    A = 0;
  }
}

Gdy następuje przerwanie to na serial monitorze pojawia się tylko " TES " i program się zawiesza. Czy jest to spowodowane tym że w przerwaniu hamowana jest komunikacja z expanderem? Czy coś innego i można jakoś rozwiązać ten problem ?

Link do komentarza
Share on other sites

Podobny temat poruszono tu. Serial.printl nie powinien być wywoływany w przerwaniach. Przerwania są dobre do relatywnie lekkich obliczeń. Nalezy unikać w nich delay, tego co wymaga odstępów czasowych czy wykorzystania innych przerwań. 

Możesz to obejść ustawiając w przerwaniu flagę (zmienną), którą sprawdzisz w pętli loop() i jeżeli warunek się zgodzi to wyświetl co chcesz.

Edit: tak myslę, że istota przerwań może się w tym miejscu rozmywać. Ale ich zaletą będzie niegubienie zdarzeń. Choć i tak będzie wyświetlał tekst na zasadzie przesłuchiwania zmiennej (co każdy obrót pętli coś sprawdzasz), to masz pewność, że zmiana zmiennej nie ucieknie. Bo gdybyś sprawdzał pin w pętli głównej i przy  okazji robił co jakiś czas coś czasochłonnego to na pewno zgubisz jakieś zmiany stanu. W tym przypadku przerwanie zadziała i będziesz miał pewność że zdarzenie zostanie zapamiętane, choć może wynik nie pojawi się od razu. 

To coś jak z pisaniem na klawiaturze telefonu. Często zdarza się, że pisze się coś, ale pod wpływem zwieszki tekst pojawi się dopiero po chwili, bo został zbuforowany przerwaniami niezależnymi od tego co widzi użytkownik.

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Problemem jest  sprawdzanie pinów ekspandera a nie println. Taka sama funkcja z println i sprawdzaniem pinów mikrokontrolera i działa wszystko ok.  A jak funkcja przerwania ma sprawdzać pin expandera ( bez println ) to program się zawiesza. Jest na to jakiś sposób ?

Można zrobić tak żeby piny expandera działały jak piny przerwań ?? (np. metody z biblioteki)

Link do komentarza
Share on other sites

Nie będzie to zgodne ze sztuką ale wewnątrz bloku przerwania daj na początku wywołanie:

sei();

Nie jestem pewny czy to działa, ale I2C wymaga włączonych przerwań, a wewnątrz bloku przerwania są one wyłączone. Niemniej nie powinno się tak tego robić, a to że print jakoś działa nie znaczy że powinno się go tam używać.

48 minut temu, vtor napisał:

Można zrobić tak żeby piny expandera działały jak piny przerwań ?? (np. metody z biblioteki)

Możliwe że musisz zagłębić się w istotę I2C nie na Arduino tylko na AVR, sprawdzić jakie są flagi itp bo na pewno coś jest co informuje o zakończeniu komunikacji. Mógłbyś sprawdzać kiedy wysyłane są informacje z ekspandera i reagować na to.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

14 godzin temu, vtor napisał:

Można zrobić tak żeby piny expandera działały jak piny przerwań ?? (np. metody z biblioteki)

mcp.thumb.jpg.3a2f8472e6c5c7cd543b2cea17503edf.jpg

wygląda , że chyba się da. 

tutaj link  do githuba z przykładem do w/w biblioteki. Możesz przejrzeć też bibliotekę, którą masz zainstalowaną w poszukiwaniu przykładów.

Link do komentarza
Share on other sites

@Treker i o to mi chodziło. Sądziłem , że tego właśnie się tyczy to drugie pytanie (zostało wydzielone od pierwszego)

17 godzin temu, vtor napisał:

Można zrobić tak żeby piny expandera działały jak piny przerwań ??

jeśli miało być inaczej to faktycznie mój błąd.

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.