Skocz do zawartości

Zmiana Stanu po wciśnieciu przycisku na przerwaniu


Rayu85

Pomocna odpowiedź

Witajcie,

Natknąłem się na problem w miejscu w którym bym się go nie spodziewał.

Potrzebuję zrobić akcję na przerwaniu która po wciśnięciu przycisku zmieniała by stan w innym miejscu z HIGH na LOW.

Niby prosta rzecz a już godzinkę szukam i nie mogę znaleźć.

Główny problem to to, że musi się to wykonać na przerwaniu.

A wszystkie metody opisywane na forach zawierają delay, którego nie chciał bym używać na przerwaniu przy tak prostej akcji.

Czy istnieje jakaś komenda zmieniająca stan?

Jeszcze krótkim słowem objaśnienia chodzi o to aby po wciśnięciu przycisku urządzenie przeszło w inny tryb pracy, a po ponownym wróciło do podstawowego trybu.

W związku z tym potrzebował bym zmienną deklarującą w którym trybie znajduje się aktualnie maszyna.

[ Dodano: 10-01-2017, 00:17 ]

Kolejne kilka godzin prób i szukania przyniosło efekty.

boolean stan = 0;
void setup() {
Serial.begin(9600);
pinMode(A5, INPUT_PULLUP);
pinMode(13, OUTPUT);
}

void loop() {
 if(digitalRead(A5) == HIGH)
 {
 delay(20);
 stan = !stan;
 digitalWrite(13,stan);
 while(digitalRead(A5) == HIGH);
 delay(20);
 Serial.println(stan);
 }
}

Program działa poprawnie ale nadal zawiera niewielki delay.

Co prawda internet twierdzi że te delay są niezbędne do poprawnego redukowania drgań, ale na moim przycisku po usunięciu ich wszystko pracuje ok.

Stąd moje pytanie czy chcąc umieścić taki kod na przerwaniu zostawić te małe opóźnienia czy lepiej je usunąć i zaryzykować że co któreś wciśnięcie przycisku nie zadziała prawidłowo ale nie będzie opóźnień na przerwaniu.

Dodam że przycisk nie będzie raczej wciskany często i w trakcie pracy robota, więc sumaryczne 40ms nie powinno wpłynąć drastycznie na jego pracę.

Link do komentarza
Share on other sites

Te opóźnienia służą do tak zwanego "debouncing", czyli tak jak mówisz, ignorowania drgań i zakłóceń. Zawsze ich trochę będzie, chyba, że masz debouncing zrobiony sprzętowo kondensatorem i opornikiem.

W przypadku przerwania jak najbardziej masz rację, że żadnych delay być nie może. Zresztą, też nie byłyby takie użyteczne, bo kiedy używasz przerwania, to ono będzie wywoływane wielokrotnie, po jednym razie na każde "drgnienie" przycisku. Więc zamiast opóźnienia musisz po prostu znaleźć sposób na zignorowanie wszystkich wywołań przerwania poza pierwszym.

Najłatwiej to zrobić na początku przerwania zapamiętując w zmiennej czas gdy ostatnio było to przerwanie wywołane i porównując z obecnym czasem. Jeśli różnica jest zbyt mała, to od razu robisz powrót z przerwania.

Tutaj masz przykład: https://www.arduino.cc/en/Tutorial/Debounce

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.