Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR C] Częstotliwość naciśnięcie przycisku.

Dzedorak 04 Cze 2012 20:22 1373 15
  • #1 04 Cze 2012 20:22
    Dzedorak
    Poziom 13  

    Witam.
    Jako, że dopiero powoli zaczynam zabawę z Atmegą (posiadam Atmege 32). Zaczynam od bardzo podstawowych rzeczy - chciałem liczyć częstotliwość naciśnięć przycisku a dokładniej ilość naciśnięć do momentu przepełnienia się licznika przez obsługę przerwań.
    Niestety nawet z tak trywialnym zagadnieniem mam kłopot, coś nie działa jak powinno.;)
    Zamieszczę może najpierw kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a main, poza inicjalizacjami i ustawieniem portów:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na wyświetlaczu dostaje nieadekwatne do ilości wciśnięć liczby, w zależności od szybkości naciśnięć liczby te się zmieniają. Jeżeli natomiast przestanę
    wogóle wciskać to licznik się nie zeruje (pozostaje na LCD ostatnio wyświetlana liczba).
    k to zmienna globalna.
    Co jest nie tak?
    Dodam jeszcze, że samo wyświetlanie ilości naciśnięć bez timera działało. Timer sam też działał.:)
    Proszę o podpowiedź.:P
    Pozdrawiam.
    Dzedorak

    0 15
  • #2 04 Cze 2012 21:41
    dondu
    Moderator Mikrokontrolery Projektowanie

    Witaj,

    Dzedorak napisał:
    Na wyświetlaczu dostaje nieadekwatne do ilości wciśnięć liczby, w zależności od szybkości naciśnięć liczby te się zmieniają, ...

    Jak zabezpieczyłeś się przed zjawiskiem drgań styków?

    0
  • #3 04 Cze 2012 21:44
    Dzedorak
    Poziom 13  

    nie zabezpieczałem się, ale gdy zliczałem same naciśnięcia bez timera wszystko było dobrze, więc na razie tak zostawiłem

    a tak czy tak licznik się nie zeruje, więc coś jest nie tak ;D

    0
  • #4 04 Cze 2012 21:45
    dondu
    Moderator Mikrokontrolery Projektowanie

    Dzedorak napisał:
    nie zabezpieczałem się, ale gdy zliczałem same naciśnięcia bez timera wszystko było dobrze, więc na razie tak zostawiłem

    a tak czy tak licznik się nie zeruje, więc coś jest nie tak ;D

    Zacznij od eliminacji drgań, bo to i tak wpłynie na cały Twój program. No chyba, że zrobisz to sprzętowo.

    0
  • #5 04 Cze 2012 21:56
    Dzedorak
    Poziom 13  

    Nie chciałem się tym zajmować, bo na razie mi to nie przeszkadza, nie zależy mi na dokładnym odczycie, chodzi mi o obsługę samego timera bardziej;>

    a, że później chciałem liczyć częstotliwość zewnętrznego przebiegu to to może być pewnego rodzaju wstęp :P

    0
  • #6 04 Cze 2012 21:59
    sulfur
    Poziom 24  

    Dzedorak napisał:
    loop_until_bit_is_set(PINB, 0);
    Tutaj powinno być clear zamiast set plus to co napisał dondu.

    0
  • #7 04 Cze 2012 22:00
    dondu
    Moderator Mikrokontrolery Projektowanie

    Pokaż cały program. Jeśli masz schemat to także załącz.

    0
  • #8 04 Cze 2012 22:08
    Dzedorak
    Poziom 13  

    sulfur - czemu clear? PIN B0 mam podciągnięty wewnętrznie do jedynki i naciskając przycisk zwieram go do masy, potem czekam aż znów będzie 1

    Kod: c
    Zaloguj się, aby zobaczyć kod


    to całość z wyjątkiem funkcji obsługi wyświetlacza LCD ale one działają :D

    schematu nie mam bo jest tu tylko przycisk podłączony do portu PB0, wszystko jest na płytce EvB, więc reszta jak zasilanie itp. jest OK

    0
  • #9 04 Cze 2012 22:12
    LordBlick
    VIP Zasłużony dla elektroda

    1. Zanim te "WyslijNapis" przejdą w przerwaniu, to licznik zdąży się przekręcić ze 100 razy...
    2. timer_init() jest cieniutki...

    0
  • #10 04 Cze 2012 22:16
    dondu
    Moderator Mikrokontrolery Projektowanie

    1. usuń z przerwań wyświetlanie na LCD. W przerwaniu ustawiaj flagę, a wyświetlanie zrób w pętli głównej.
    2. próbowanie tego algorytmu na przyciskach bez sprzętowej eliminacji drgań jest proszeniem się o rwanie włosów z głowy. Radzę więc podłącz jakiś sygnał cyfrowy, choćby z innego mikrokontrolera.

    EDIT:
    Lord mnie częściowo uprzedził :)

    0
  • #11 04 Cze 2012 22:24
    sulfur
    Poziom 24  

    Dzedorak napisał:
    potem czekam aż znów będzie 1
    No własnie nie, bo czekasz dopóki jest jedynką, czyli nie czekasz. Szansa, ż pomiędzy wejściem do ciała instrukcji if i wykonaniem loopa zmieni się stan portu jest czysto statystyczna.

    0
  • #12 04 Cze 2012 22:41
    Dzedorak
    Poziom 13  

    Ale to miało być czekanie aż do zwolnienia przycisku - bo tak to by mi naliczył kilka tysięcy od razu, nie?;D

    w przerwaniu ustawiać flagę - tzn. swoją zmienną globalną czy jakąś w rejestrze czy gdzieś?:D

    a co z timer_init'em jest nie tak?:P
    coś jeszcze powinno być?

    0
  • #13 04 Cze 2012 22:44
    dondu
    Moderator Mikrokontrolery Projektowanie

    Dzedorak napisał:
    w przerwaniu ustawiać flagę - tzn. swoją zmienną globalną ..

    Tak.

    Dzedorak napisał:
    a co z timer_init'em jest nie tak?:P
    coś jeszcze powinno być?

    A to zależy jaki tryb chciałeś ustawić. Nic nie piszesz w komentarzu przy tym fragmencie kodu. Właściwie to w ogóle nie komentujesz kodu, a to ułatwia nam rozwiązanie Twoich problemów.

    Nie podałeś także częstotliwości zegara.

    0
  • #14 04 Cze 2012 23:33
    Dzedorak
    Poziom 13  

    to teraz wygląda to tak, ale działa tak samo:(
    nie wiem czy to coś w ogóle zmienia bo clock wchodzi do preskalera 256 najpierw, wiec nie tak szybko sie przekreci;)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    co do clocka:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    a timer miał działać w trybie prostym/normalnym

    0
  • #16 05 Cze 2012 06:08
    sulfur
    Poziom 24  

    Dzedorak napisał:
    Ale to miało być czekanie aż do zwolnienia przycisku - bo tak to by mi naliczył kilka tysięcy od razu, nie?;D
    No właśnie, ale skoro wiesz lepiej to nie ma sprawy.

    0
  Szukaj w 5mln produktów