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

[C][Atmega8A] - Prośba o sprawdzenie kodu do debouncingu styków przycisków

Dople 24 Mar 2013 13:09 1266 4
REKLAMA
  • #1 12104438
    Dople
    Poziom 19  
    Poproszę o sprawdzenie kodu. W gruncie rzeczy działa, tak jak powinien: jeden z przycisków diodę zapala (czy też "zaświeca"), ale po zwolnieniu go ona gaśnie. Naciśnięcie drugiego zapala inną diodę, którą wyłącza ponowne naciśnięcie tego samego przycisku.

    Chodzi mi głównie o wytknięcie ewentualnych mankamentów, możliwości, kiedy ten kod się mógłby nie sprawdzić, a także jakiekolwiek inne podpowiedzi. Chciałbym, żeby to był w miarę możliwości "elegancki" kod.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 12104761
    BlueDraco
    Specjalista - Mikrokontrolery
    KEY=((PIND & 0x01) & 1);

    1. Nazw zmiennych zwyczajowo nie pisze się wielkimi literami
    2. Wystarczy:

    key = PIND >> NR LINII PRZYCISKU & 1;
    - w ten sam sposób dla każdego przycisku.

    3. Nie ma sensu deklarować zmiennych związanych ze stanem przycisków poza procedurą przerwania timera, bo nie są one nigdzie więcej potrzebne.
    Zmienne keystate powinny mieć atrybut static, pozostałe bez atrybutów.
    4. Nie ma sensu deklarować ich jako volatile, bo są używane tylko na jednym poziomie priorytetu - w obsłudze przerwania.
    5. Zmienne te powinny mieć typ uint8_t, bo realnie mają po jednym lub po 4 bity, a to się mieści w 8-bitowym bajcie. AVR wykonując operacje na int musi robić to w dwóch kawałkach po 8 bitów.

    Jaka jest częstotliwość przerwań timera?
  • REKLAMA
  • #3 12104807
    Dople
    Poziom 19  
    Rezonator kwarcowy 1MHz (fabryczny), preskaler /256.

    edit: ~65,5ms. Próbowałem policzyć na windowsowym kalkulatorze, zamiast na tym, co zwykle i jakieś cyrki mi wychodziły. Głupio.
    edit2: Aj, notacji naukowej przez ten szereg cyfr nie zauważyłem.

    Skąd pytanie o częstotliwość przerwań timera?
  • REKLAMA
  • Pomocny post
    #4 12106672
    BlueDraco
    Specjalista - Mikrokontrolery
    Przy 65 ms możesz mieć spore opóźnienie reakcji - ok. 1/4 sekundy. Daj preskaler 8 albo zwiększ częstotliwość do 8 MHz.
  • #5 12107973
    Dople
    Poziom 19  
    Dziękuję.
    W zasadzie mogę napisać "dostałem, co chciałem", ale temat zamknę jutro, jeżeli nie pojawią się jakieś nowe posty.
REKLAMA