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

[ATmega128][asm] Pomysły na obsługę przycisków

wojtek999 17 Sty 2009 11:40 2046 4
REKLAMA
  • #1 6011257
    wojtek999
    Poziom 16  
    Męczę się żeby wykonać jak najprostszą obsługę z eliminacją drgań zestyków 5 przycisków. Robię to w ten sposób:

    1. Do każdego przycisku mam przydzielone 3 flagi i 1 zmienną(załóżmy że przycisk nazywa się "UP":
    - F_UP_POM - flaga pomocnicza do eliminacji drgań
    - F_UP - flaga właściwa przycisku (gdy F_UP=1 to przycisk wciśnięty)
    - F_UP_HOLD - gdy=1 to znaczy, że przycisk jest przytrzymywany lub został już obsłużony
    - Licznik_UP - zmienna 1B

    2. Odczyt stanu przycisków odbywa się w przerwaniu Timera (co 32,768ms):
    - jeśli przycisk wciśnięty to:
    - przy pierwszym przerwaniu ustawiam tylko F_UP_POM
    - przy drugim ustawiam F_UP - czyli dopiero teraz jest informacja
    dla programu, że przycisk wciśnięty (dzięki temu wyeliminowane
    są drgania zestyków bo trzymany min 32,768ms)
    - przy trzecim przerwaniu ustawiam F_UP_HOLD co oznacza, że
    przycisk jest przytrzymywany
    - przy czwartym i kolejnych zwiększam Licznik_UP o 1. Gdy osiągnie
    on wartość załóżmy 10 (czyli po 327ms) to kasuje F_UP_HOLD i
    licznik
    - jeśli przycisk puszczony to kasuje wszystkie flagi i Licznik_UP

    3. Reagowanie na stan przycisków (czyli ich flag) jest zrobione w pętli głównej programu:
    - jeśli F_UP_HOLD=1 to nie reaguj
    - w przeciwnym razie:
    - jeśli F_UP=1 to np. zwiększ wartość "czegoś tam" o 1 i ustaw
    flagę F_UP_HOLD by wartość "czegoś tam nie zwiększała się
    w kółko (jeśli przycisk przytrzymywany to po upływie 327ms
    F_UP_HOLD wyzeruje się i znów wartość "czegoś tam"
    zwiększy się o 1

    Taka obsługa niby działa w porządku, ale raz na dłuższy czas przy przytrzymywaniu przycisku wartość "czegoś tam" zwiększy się o 1 i zaraz szybko znów o 1 (a powinno po upływie 327ms). Możecie podzielić się swoimi metodami obsługi przycisków lub skorygować mój algorytm jeśli zauważyliście błąd?
  • REKLAMA
  • #2 6017748
    marenc
    Poziom 24  
    Prostą rzecz skomplikowałeś jak tylko się dało... Jeżeli już chcesz czarować i nie robisz z przycisków typu matrix, to...

    2 zmienne ... podczas każdego sprawdzania działasz w taki sposób, że(zakładam, że '1'-wciśnięty) porównujesz wartości zmiennych z wartością rejestru(logiczny iloczyn - AND). Wynik tej operacji to stan '1' dla wciśniętych przycisków przez co najmniej 3 sprawdzania, więc 32,768ms*3=98,304ms. Na zakończenie wprowadzasz wynik do jednej zmiennej(na zmianę).

    Mieszając ilością zmiennych możesz regulować czas reakcji. Alternatywą jest sprawdzanie np. co 3 przerwania i porównywać tylko 1 zmienną z aktualnymi stanami ;)

    Powodzenia ;)
  • REKLAMA
  • #3 6018102
    wojtek999
    Poziom 16  
    Rzeczywiście dało się to uprościć mocno. Ponieważ dla potrzeb programu mam zrobione "fajne" makra typu:
    brfs Nazwa_Flagi, Etykieta ;skocz do Etykieta jeśli flaga
    ustawiona
    brfc Nazwa_Flagi, Etykieta ;skocz do Etykieta jeśli flaga
    wyzerowana
    setf Nazwa_flagi ;ustaw flagę
    clrf Nazwa_flagi ;zeruj flagę

    ..to korzystam z flag również przy przyciskach (upraszcza mi to program główny). Nazwa_flagi to numery 0-255 zdefiniowane wcześniej przez .EQU.

    Każdy przycisk ma jedną flagę i jeden licznik. Tak jak wcześniej sprawdzanie przycisków w przerwaniu Timera co ok. 32ms.

    Timer:

    Jeśli przycisk wciśnięty to zwiększ licznik.
    Jeśli przycisk puszczony to zeruj licznik i flagę.
    Potem jeśli licznik = 2 to ustaw flagę przycisku. Jeżeli nie równy 2 to zeruj flagę. Jeśli licznik = 15 to licznik =0.

    reti

    W pętli głównej sprawdzam tylko flagi przycisków przez wygodne makra i odpowiednio reaguje. Działa bez zarzutu.
  • REKLAMA
  • #4 6018116
    marenc
    Poziom 24  
    Piszesz w ASM, a program jest skomplikowany już przy zwykłych przyciskach. Zobacz ile zmiennych wykorzystujesz, zobacz ile trwa obsługa przerwania ... ASM to szybkość - nie zapominaj o tym. Pisanie wolnych programów w tym języku mija się z celem jego stosowania...
  • #5 6018880
    wojtek999
    Poziom 16  
    Teraz nie jest już skomplikowany - tylko 1 flaga i 1 zmienna. Wykonuje się szybko i co najważniejsze jest przejrzysty - a o to też przecież chodzi (z tego względu wprowadzono języki wysokiego poziomu żeby się później nie motać). Szczerze to brakuje mi jakichś dobrych przykładów, kursów itp. do robienia obsługi wielu rzeczy (choćby jak zrobić przejrzyste wielopoziomowe menu w ASM) - wszędzie tylko strona z opisem "programowanie od podstaw" i na podstawach się kończy a tu potrzeba się rozwijać... Jak znacie jakieś godne polecenia książki, ew. strony to podawajcie.
    Mógłbyś dokładniej opisać swój sposób obsługi przycisków wykorzystując 2 zmienne bo nie do końca zrozumiałem. Dzięki!

    Sprawdziłem ile zajmuje testowanie wszystkich 5 przycisków podczas przerwania Timera: 770cykli = niecałe 50us na zegarze 16Mhz(w tym podprogram do ustawiania/zerowania flagi zajmuje 127 cykli =8us). Co 32ms mogę spokojnie poświęcić 50us a nawet wiele więcej, bo i tak program główny będzie się przez zdecydowaną większość czasu kręcił w kółko bez celu. Nie będę więc już chyba nic zmieniał przy przyciskach, bo jak pisałem wykorzystanie flag bardzo u mnie zwiększa przejrzystość programu.
REKLAMA