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

Atmega32 - Jak poprawić kod do przełączania LED przyciskiem?

tomasz84_czw 12 Cze 2014 18:10 1674 13
  • #1 13701605
    tomasz84_czw
    Poziom 9  
    Probuje napisasc kod ktory bedzie zapalal/zgaszal LED za kazdym klikneciem. Poki co to bez problemu moge zgaszac led jak przycisk jest przycisniety i przytrzymany. Chodzi mi jednak o to aby (nacisnac, wypuscic) led_on, (nacisnac,wypuscic) led_off. Obecny kod robi to co zamierzam lecz nie jest wogole precyzyjny - 10razy nacisne przycisk, mrognie tylko 2 razy:(
    Co robie zle? Juz sie poddaje, prosze o pomoc:)


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 13701644
    janski-1
    Poziom 9  
    Problemem w Twoim przypadku są prawdopodobnie drganie styków przy wciskaniu przycisków. Najprostsze rozwiązanie to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 13701834
    tomasz84_czw
    Poziom 9  
    Dalej nie lapie za kazdym razem:( Tez chce uniknac delay bo program bedzie jeszcze rozwiniety. If state == mialo dzialac jako filter.
    Dzieki za odp ale nie pomoglo, jest inny sposob?
  • #4 13701886
    janski-1
    Poziom 9  
    A wrzuciłbyś jakiś schemat, jak to masz podłączone?
  • Pomocny post
    #6 13701935
    el2010tmp
    Poziom 25  
    -Pozbądź się WSZYSTKICH ostrzeżeń kompilatora.
    -Poczytaj o eliminacji drgań styków (np.: https://www.google.pl/#lr=lang_pl&q=avr+debouncing)
    -Wejścia/wyjścia wystarczy skonfigurować raz (chyba że zmieniasz funkcje w trakcie wykonywania programu).

    Dobrze by było abyś dostosował rozmiar kodu do rozmiaru problemu :D i zachował w jego strukturze pewien logiczny ład.
    Problem można rozwiązać np. tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Oczywiście istnieje bliżej nieokreślona ilość lepszych lub gorszych rozwiązań. Zastosuj więc takie które jest dla Ciebie najbardziej przejrzyste.

    Gdyby dalej nie działało pokaż poprawioną wersję kodu.
  • #7 13702122
    tomasz84_czw
    Poziom 9  
    Dzieki kod dziala:)

    Tylko poczatkowym zalozeniem bylo wykorzystanie "state maschine" zeby mozna bylo wiecej funkcji przypisac guzikowi:) Dlatego w przykladzie na poczatku mam ON OFF state. Czy jak dorzuce filter do tego co napisalem na poczatku to cos zmieni?

    Chcialbym miec nawet do 4 funkcji na guzik.
  • Pomocny post
    #8 13702389
    el2010tmp
    Poziom 25  
    tomasz84_czw napisał:
    Tylko poczatkowym zalozeniem bylo wykorzystanie "state maschine" zeby mozna bylo wiecej funkcji przypisac guzikowi

    Przykładowy kod jest również realizacją maszyny stanów i nie ma ograniczeń co do ilości funkcji.

    Problem z Twoim kodem polega na błędnej obsłudze wciskania klawisza.

    Filtr możesz dodać do funkcji int8_t button() jednak poprawy wymagają funkcje: void changeState() oraz char readButton(void).

    Sprawdzaj przycisk w jednym miejscu i na podstawie wyniku podejmuj stosowną reakcję. Reakcja może być oczywiście zależna od funkcji aktualnie przypisanej klawiszowi. Po prostu zamiast:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    napisz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    gdzie np.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 13702446
    janski-1
    Poziom 9  
    A, i zamiast podpinać to przez opornik do Vcc możesz skorzystać z rezystorów pull-up w mikrokontrolerze, robisz to ustawiając odpowiednio rejestr PORTx.
  • #10 13702756
    gaskoin
    Poziom 38  
    Słyszeliście kiedyś o złożoności cyklomatycznej ? Temat o maszynie stanów i przyciskach był stosunkowo niedawno. Wystarczy poszukać.
  • #11 13709314
    tomasz84_czw
    Poziom 9  
    Kod po zmianach dziala poprawnie:)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 13717208
    BlueDraco
    Specjalista - Mikrokontrolery
    Mało wiarygodne to Twoje źródło...
  • #14 13718513
    arek944
    Poziom 11  
    Na pewno bardziej wiarygodne, niż niektórzy "eksperci" z forum, co ich wypowiedzi nic nie wnoszą do tematu ;) A skoro kod działa, w dodatku lepiej niż _delay_ms() bez żadnych fałszywek czy przeskoków, to źródło można uznać za wiarygodne :P
REKLAMA