logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR] [AVR][Bascom] Jak zoptymalizować obsługę przycisków w menu?

morswin89 26 Lut 2012 11:34 4128 10
REKLAMA
  • #1 10600492
    morswin89
    Poziom 23  
    Witam

    Jak zrealizować dobry i porządny podprogram do obsługi przycisków używany do nawigacji i ustawień w menu?
    Napisałem już 2 wersje ale każda nie jest według mnie doskonała i ma swoje minusy:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Minus tego rozwiązania polega na tym, że używam polecenia wait oraz w każdym miejscu gdzie sprawdzam stan klawisza muszę wyzerować flaga i jeżeli jest dużo poziomów menu kod dość szybko się rozrasta.

    Inna wersja:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    W tej wersji jest trochę lepiej i używam timera do odmierzania czasu ale podczas ustawiania parametru:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program się "gubi" i pomija wartość 23 spowodowane tym ze na jedna pętle odczytuje jakby 2 wciśnięcia.

    Może ktoś ma jeszcze jakieś pomysły aby to ulepszyć i pozbyć się tych błędów.
  • REKLAMA
  • #2 10600805
    Konto nie istnieje
    Konto nie istnieje  
  • #3 10601824
    morswin89
    Poziom 23  
    Polecenie Debounce nie wdaje mi się zbyt odpowiednie do wielopoziomowego menu gdyż będzie powodować jeszcze dodatkowe skoki.

    Udało mi się zrobić tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    To samo co wyżej ale zajmuje chyba mniej pamieci.
  • REKLAMA
  • Pomocny post
    #4 10602014
    Konto nie istnieje
    Konto nie istnieje  
  • #5 10614677
    SylwekK
    Poziom 32  
    Jeśli nie szkoda Ci zmiennej typu Byte i masz jeszcze miejsce na programowy licznik w swoim programie to możesz zerknąć jak ja rozwiązałem badanie przycisku w tym temacie https://www.elektroda.pl/rtvforum/topic2232417.html
    Zapewniam Cię, że rozwiązanie to jest bardziej odporne na zakłócenia (drgania) i przede wszystkim przelotowe (żadnych wait) niż jakiekolwiek debounce czy znaczniki jednobitowe. Działa na zasadzie inkrementacji i jakakolwiek przerwa (drganie) zeruje licznik więc tylko po prawdziwym ustabilizowaniu się guzika będzie on zaliczony. [EDIT] A do tego możesz jeszcze w prosty sposób przerobić to na rozróżnianie czasu wciśnięcia guzika (krótki/długi).
  • Pomocny post
    #7 10614919
    SylwekK
    Poziom 32  
    Chyba dokładniej się nie da skomentować ;) Powinno być już wszystko jasne...

    Kod: text
    Zaloguj się, aby zobaczyć kod

    a w przerwaniu wywoływanym w tym przypadku co 1ms należy jeszcze uwzględnić co takiego:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Używam takiego typu badania kiedy mi zależy naprawdę na precyzji odczytu przycisku. Oczywiście można zrobić podobnie to na znaczniku bitowym i ustawiać licznik Lk zamiast Ps kiedy guzik nie wciśnięty. Rozwiązań jest 1000 :)
    Pozdrawiam
  • REKLAMA
  • #10 10620319
    SylwekK
    Poziom 32  
    Spokojnie możesz zmienić czas wywołania przerwania tylko weź wtedy poprawkę na opóźnienia, bo licznik programowy będzie już w innym tempie zliczał.
    Tutaj masz ideę rozpoznawania krótki/długi : https://www.elektroda.pl/rtvforum/topic1828017-30.html#8787304
  • REKLAMA
REKLAMA