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.

Impulsy w ATMega - jak je zliczyć?

marek-czarny 10 Cze 2014 08:56 1002 8
  • #1 10 Cze 2014 08:56
    marek-czarny
    Poziom 8  

    witam kolegów
    może ktoś z Was podpowie mi jak zliczyć ilość naciśnięć switcha za pomocą timera w procku ATMega?
    czytam i czytam i nie mogę załapać - dużo jest o przerwaniach i pomiarze czasu, ale mnie chodzi tylko o to żeby zliczyć pojedyńcze impulsy - naciskam pryszcza i do pamięci, za kilka sekund naciskam 5 razy - ma się dodać do tego co juz było i do pamięci
    podpowiedzcie proszę bo już mnie ch....ra bierze
    aha - język C
    pozdrawiam

    0 8
  • #2 10 Cze 2014 09:53
    xury
    Poziom 38  

    Rozumiem, że nie chodzi o zliczanie impulsów w danej jednostce czasu tylko ogólnie ilość aż do wykasowania przez obsługującego lub aż do przepełnienia zmiennej.

    Jest to bardzo proste przy wykorzystaniu przerwania INTx
    Po porostu w obsłudze przerwania dodajesz 1 do zmiennej która przechowuje ilość tych impulsów.

    0
  • #3 10 Cze 2014 10:15
    Steryd3
    Poziom 31  

    Sformowanie "naciskam" sugeruje-jak się domyślam- iż te impulsy będą powstawały w skutek działania palca na jakiś mono-stabilny przycisk. Jeżeli tak, to należy zadbać o eliminacje drgań styków takowego -bo pewnie chodzi o ilość przyciśnięć a nie o ilość wygenerowanych przy tej okazji szpilek.
    W takim przypadku należy w razie wystąpienia przerwania zewnętrznego INTx po jakimś określonym czasie (rzędu powiedzmy kilku -kilkudziesięciu ms) ponownie sprawdzić linię i dopiero na podstawie tego stwierdzić, że przycisk został naciśnięty i należy go zliczyć.
    Oczywiście można też okresowo sprawdzać daną linię portu ( co stały interwał czasu generowany przez przerwanie od timera-np. tryb CTC) i po zarejestrowaniu zmiany stanu (najczęściej na 0 logiczne) analogicznie odczekać , znów sprawdzić i zliczyć.
    Można co prawda też cały problem rozwiązać sprzętowo(np. odpowiedni scalak między przyciskiem a AVRem) ale ...tego podejścia raczej się nie stosuje z uwagi na koszty.

    0
  • #4 10 Cze 2014 10:39
    marek-czarny
    Poziom 8  

    dzięki Panowie za pomoc - trochę mi rozjaśniło
    drgania styków są mi znane - można załatwić sprawę programowo lub sprzętowo jak zrobię to wyjdzie w praniu

    reasumując:
    - ustawiam pin timera jako wejście i podciągam go do plusa wewnętrznym rezystorem
    - konfiguruję timer jako licznik
    - ustawiam zmienną ( nazwa ) do przechowywania sumy impulsów i .....
    powinno działać

    0
  • #5 10 Cze 2014 11:18
    tmf
    Moderator Mikrokontrolery Projektowanie

    Niestety nie będzie działać, jeśli nie zastosujesz w tym przypadku sprzętowego (filtr RC) debouncingu. Pytanie, czy to musi być całkowicie sprzętowo? Jeśli tak to tylko zewnętrzny filtr RC + podłączenie pod wejście XCK timera, wtedy każde naciśnięcie przycisku generuje impuls zegarowy zliczany przez timer. Całkowicie sprzętowa realizacja prostsza jest na AVR XMEGA, gdzie pod każdy pin IO można podłączyć sprzętowy filtr cyfrowy. Jeśli dopuszczalna jest realizacja programowa to najprościej odpuścić sobie timer i zrobić normalną detekcję naciśnięcia klawisza z programowym debouncingiem i zliczaniem impulsów. Użytkownik tak szybko przycisków nie naciska, żeby konieczne było sprzętowe zliczanie.

    0
  • #6 10 Cze 2014 11:27
    marek-czarny
    Poziom 8  

    ten debouncing to mówisz o ....... drganiu styków?
    czy można w takim razie kontrolować stan klawisza z opóźnieniem np.10ms?
    z drugiej strony kondensator 100nF na nóżkach pryszcza powinien załatwić temat

    0
  • #7 10 Cze 2014 11:42
    tmf
    Moderator Mikrokontrolery Projektowanie

    Sprzętowo w zwykłej ATMega nie można, w XMEGA tak. Kondensator + rezystor sprawę może załatwić, ale równie dobrze da się to załatwić programowo. Napisz skąd pomysł wykorzystania timera do zliczania naciśnięć?

    0
  • #8 10 Cze 2014 12:10
    marek-czarny
    Poziom 8  

    po prostu do nauki działania timera
    ma to symulować przychodzące impulsy i ich zliczanie

    zakładałem np. 1 impuls zapis do zmiennej, następnie dwa i zapis sumy do zmiennej itd. - taki prymitywny encoder
    przy okazji wyświetlanie wyników na LCD

    0