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

[Atmega32][C] Zliczanie kliknięć przycisku w timerze, eliminacja drgań przycisku

Aquater 22 Lis 2018 19:04 1020 7
REKLAMA
  • #1 17578213
    Aquater
    Poziom 6  
    Jestem studentem, i na laboratoriach z mikrokontrolerów dostaliśmy do wykonania następujące zadanie:
    Zliczać w timerze ilość kliknięć przycisku i po zarejestrowaniu 5 kliknięć zapalić diodę. Zdaje sobie sprawę że timery nie powinny być w takim celu.
    Największym problemem przy tym prostym programie są drgania styków. Postanowiłem rozwiązać ten problem przy wykorzystaniu drugiego timera. W procedurze przerwania Timer0_comp wyłączam zliczanie impulsów na T0 oraz włączam timer2 i ustawiam obsługę przerwania Timer2_comp, dzięki czemu po upływie zadanego czasu ponownie zostanie włączona możliwość zliczania impulsów. Jednak napotkałem na problem którego kompletnie nie rozumiem, po analizie pracy krokowej zauważyłem że po powrocie z przerwania Timer0_comp w głównej pętli programu samoistnie włącza się timer0 i ustawiana jest obsługa przerwania Timer0_comp. Chciałbym prosić o wyjaśnienie tego zjawiska i ewentualne porady przy rozwiązaniu tego zadania.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 17578416
    michalko12
    Specjalista - Mikrokontrolery
    Odpal timer z okresem 10ms, w każdym przerwaniu wsuwaj stan pinu do zmiennej 8 bitowej i jeśli stan zmiennej == 0xFF to przycisk wciśnięty, jeśli != 0xFF przycisk nie wciśnięty. Rejestruj "wirtualne" zbocza, tzn. tylko zmiany z 0x00 na 0xFF.
  • REKLAMA
  • #3 17578453
    Aquater
    Poziom 6  
    Mógłbym prosić o szersze wyjąśnienie? W którym przerwaniu?
    Czy chodziło mniej wiecej o coś takiego?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 17578500
    excray
    Poziom 41  
    michalko12 napisał:
    Odpal timer z okresem 10ms, w każdym przerwaniu wsuwaj stan pinu do zmiennej 8 bitowej i jeśli stan zmiennej == 0xFF to przycisk wciśnięty, jeśli != 0xFF przycisk nie wciśnięty. Rejestruj "wirtualne" zbocza, tzn. tylko zmiany z 0x00 na 0xFF.

    A po co? Jeśli przycisk jest wciśnięty to jest wciśnięty. Nie trzeba 8 razy się upewniać. Robisz przerwanie co 50ms i każdy odczytany stan traktujesz jako aktualny stan przycisku. Prosto, łatwo i skutecznie.
  • REKLAMA
  • #5 17578537
    mpier
    Poziom 29  
    Witam, pomijając kod, to Twój pomysł skąd się wziął? Z grubsza to masz 3 możliwości:
    - zliczasz timerem zmiany na pinie z pominięciem drgań
    - mierzysz czas między stanami wysokimi za pomocą Input Capture i zliczasz tylko te z minimalnym założonym odstępem
    - robisz normalną obsługę przycisku (w przerwaniu timera) i liczysz wciśnięcia.
    Nie używasz do tego wszystkich dostępnych timerów.
  • #6 17578554
    Aquater
    Poziom 6  
    Pan Dr inż L. stwierdził że da nam do zrobienia jakieś ciekawe zadanie i stwierdził że sam nie wie czy się da to jakoś rozwiązać ale my na pewno sobie poradzimy. Jestem w 100% świadomy że timery nie są stworzone do takich zastosowań ale mieliśmy być kreatywni
  • Pomocny post
    #7 17578574
    GanzConrad
    Poziom 25  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


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


    tak to z grubsza wygląda. Swoją droga jest to chyba najstarszy problem na forum (poza miganiem diodą ;-) )
    Podziękowania dla BlueDraco
  • #8 17578624
    Aquater
    Poziom 6  
    Cóż chyba odrobinę przekombinowałem bo przyczepiłem się myśli, że ilość kliknięć powinna być zliczana w TCNT0 zamiast po prostu w jakiejś zmiennej. Dziękuję bardzo
REKLAMA