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

Jak zatrzymać timer w projekcie ATmega16 Timer-fotoradar odcinkowy?

blaboch 07 Sty 2015 14:56 1188 7
REKLAMA
  • #1 14303021
    blaboch
    Poziom 9  
    Posty: 6
    Witam serdecznie.
    Mam pewien problem. Robię drobny projekt odcinkowego pomiaru prędkości. Ma to działać w ten sposób,że przy przerwaniu z jednej fotokomórki uruchamia się stoper(timer). Przy przerwaniu z drugiej fotokomórki następuje zatrzymanie stopera. Czas jest poddawany obliczeniom na prędkość i jeżeli prędkość jest za duża zostaje wysłany sygnał na buzzer oraz żarówkę. Dozwoloną prędkość ustawiamy dwoma przyciskami.(mniej więcej w zakresie +-5 m/s). Mam jednak kilka kwestii spornych. Pomijając już fakt konfiguracji wyświetlacza. Nie za bardzo wiem, jak zatrzymać odliczający timer po drugim przerwaniu i czy skoro mam podłączony kwarc 16Mhz, to preskaler ustawiam na taktowanie zewnętrzne (tzn. 111), czy ustawiam preskaler tak, by timer działał częstotliwością 1Hz (1s) ?
    Kod jest dopiero zalążkiem, tego co ma zostać wgrane w uC.
    W załączniku schemat podłączenia.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • atmega.rar (173.64 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 14303663
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    blaboch napisał:
    ISR(INT0_vect)
    {
    ISR(TIMER3_OVF_vect)
    {
    TCNT3 = WARTOSC_PRZELADOWANIA;
    czas++; }}

    ISR(INT1_vect)
    {}

    Pomijając fakt że atmega16 nie ma timera nr3 ( tylko 0,1,2) ta konstrukcja wygląda dziwacznie :)

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


    blaboch napisał:
    skoro mam podłączony kwarc 16Mhz, to preskaler ustawiam na taktowanie zewnętrzne

    Taktowanie zewnętrzne wymaga fizycznego podłączenia sygnału taktującego z zewnątrz i jet możliwe tylko dla timera2.
    W Twoim przypadku ustaw po prostu preskaler wówczas zmienna "czas" będzie przechowywać liczbę przeładowań timera. Np. jeżeli przepełnienie będzie następować co 0.01s to zmienna czas będzie przechowywać wartość właśnie w takich jednostkach.

    Może warto również poczytać o innych trybach pracy timera: Output Compare, Input Capture?
  • REKLAMA
  • #3 14304113
    blaboch
    Poziom 9  
    Posty: 6
    Tak,zgadza się,po prostu z rozpędu wpisałem Timer3,bo pisałem wcześniej na Atmega128.
    Poprawiłem nieco kod,ale nadal mam problem z zatrzymaniem stopera. Czy może tryb CTC będzie tutaj lepiej współgrał?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 14307950
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Najśmieszniejsze jest to, że zapis:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jest w języku C całkiem poprawny, ale jego znaczenie jest zupełnie inne, niż to sobie wyobrażasz. Podpowiedź: operator "przecinek". ;)
  • REKLAMA
  • #6 14308288
    Karol966
    Poziom 31  
    Posty: 2041
    Pomógł: 83
    Ocena: 650
    Tego typu program jest tak prosty, że aż sobie sam nie zdajesz z tego sprawy :)
    Używasz dwóch przerwań
    1) pierwsze przerwanie np int0 uruchamia timer (o ile aktualnie nie jest uruchomiony - element zabezpieczeń)
    2) drugie przerwanie np int2 zatrzymuje timer i przepisuje jego stan do obliczenia prędkości.
    Do tego oczywiście precyzyjny timer z takim preskalerem aby maksymalnie dokładnie dokonał pomiaru czasu w zakładanym zakresie prędkości max/ min (jeśli regulujesz zakres prędkości to tym samym możesz regulować sobie preskaler timera)
    Zostaje jeszcze ew 1 timer dodatkowo do multipleksowania wyświetlacza diodowego ale nawet jeśli takowy posiadasz to możesz go na dziesiątki sposobów sterować np przez popularny 164/595 czy też specjalizowane układy.

    Ew może być tylko 1 przerwanie do zatrzymania licznika a start wywołasz na zwykłym wejściu.
  • REKLAMA
  • #7 14310164
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    BlueDraco napisał:
    Najśmieszniejsze jest to, że zapis:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jest w języku C całkiem poprawny, ale jego znaczenie jest zupełnie inne, niż to sobie wyobrażasz. Podpowiedź: operator "przecinek". ;)

    Tak czy inaczej unsigned int jest typem całkowitym więc zmienna odleglosc będzie równa zero.
  • #8 14310203
    blaboch
    Poziom 9  
    Posty: 6
    Fakt. Było kilka błędów. W chwili obecnej kod wygląda następująco:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozostało mi jedynie zdefiniować odpowiednio wyświetlacz i wyświetlić na nim informacje.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik pracuje nad projektem odcinkowego pomiaru prędkości z wykorzystaniem mikrokontrolera ATmega16. Problem dotyczy zatrzymania timera po przerwaniu z drugiej fotokomórki oraz konfiguracji preskalera. W odpowiedziach zasugerowano użycie przerwań do uruchamiania i zatrzymywania timera oraz omówiono różne tryby pracy timera, takie jak CTC. Użytkownik poprawił kod, aby uwzględnić zmienne do obliczeń prędkości oraz wyzerowanie licznika przy każdym pomiarze. Wskazano również na błędy w definicji zmiennych oraz konieczność precyzyjnego ustawienia preskalera dla dokładnych pomiarów.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA