Skocz do zawartości
vtor

Aprawdzanie stanu pinu MCP23017 w przerwaniu Arduino

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 ?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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)

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

sei() - czyli włączenie przerwań pomogło. Dzięki za biblioteki (teraz mam tą Adafrutową) .

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@slon to co podkreśliłeś oznacza obsługę mechanizmu przerwań wbudowanego w ten ekspander. Nie jest to związane z przerwaniami Arduino.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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!

Gość
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...