ghost1313 Napisano Kwiecień 6, 2021 Udostępnij Napisano Kwiecień 6, 2021 (edytowany) Cześć, dzisiaj na zajęciach uczelnianych dostałem od wykładowcy zadanie wywołania przerwania po naciśnięciu przycisku. Pierwsze naciśnięcie miało zapalić diodę, poczekać chwilę, zapalić drugą diodę, poczekać chwilę i zapalić trzecią. Drugie naciśnięcie miało w taki sam sposób pogasić diody, zaczynając od ostatnio zapalonej. Oczywiście zadanie skrajnie durne i od początku uczące błędnego podejścia do programowania mikrokontrolerów. Niemniej zacząłem się zastanawiać, jak można wykonać je poprawnie. Teoretycznie naciśnięcie przycisku może uruchomić timer, który zapali i pogasi te diody z pewnym opóźnieniem. To jeszcze powinno być proste, choć jestem pewien, że wykładowcy chodziło po prostu o zastosowanie zwykłego przerwania i funkcji delay w nim. Niemniej jest drugi problem - drgania styków. Jak to rozwiązać? Moim pomysłem było próbkowanie wejścia z użyciem timera, np. co 10ms, choć nie do końca wiem, czy akurat taki czas będzie odpowiedni. Edytowano Kwiecień 6, 2021 przez ghost1313 Link do komentarza Share on other sites More sharing options...
marek1707 Kwiecień 6, 2021 Udostępnij Kwiecień 6, 2021 Oczywiście, przeglądanie "klawiatury" - nawet w postaci jednego przycisku w obsłudze przerwania okresowego to typowe rozwiązanie. Wręcz nikt normalny nie podłącza przycisków do przerwań sprzętowych. A czy zrobisz sobie period 1ms, 5ms czy 20ms to nie ma to większego znaczenia. I tak przecież procedura programowa wyznaczająca stan stabilny powinna bazować na swoich licznikach i co najwyżej ustawisz ją na 50, 10 czy 2 takie same odczyty. Dopiero tak odfiltrowany stan - już bez żadnych odbić - przekazujesz dalej, do detektora wciśnięć, puszczeń a nawet bardziej wyrafinowanych kombinacji (dwuklik, dłuższe/krótsze naciśnięcia itp). Na tym samym przerwaniu okresowym możesz też puścić proces/automat zapalania i gaszenia LEDów - może mieć swoje własne liczniki czasu i graf przejść wyzwalany zdarzeniem (zapaleniem flagi?) otrzymanym z procesu klawiatury. Wszystko robisz na jednym timerze i żadne więcej zasoby sprzętowe do tego nie są potrzebne. Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 6, 2021 Udostępnij Kwiecień 6, 2021 Moim zdaniem nie potrzeba żadnych delay w obsłudze przerwania od switcha a nawet funkcji do filtrowania zakłóceń. Po pierwszym kliku blokujesz obsługę przycisku do czasu aż diody nie zaświecą się do końca. Gdy to nastąpi znów odblokowujesz przycisk, naciskasz -> blokujesz -> diody wygaszają się i tak w kółko. Nie widzę aby było trzeba przerywać proces w trakcie więc to powinno spełnić warunki zadania Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »