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

Atmega 16 - Jak ustawić timer 0 w trybie CTC do próbkowania sygnału 50 Hz?

2shy 09 Lip 2013 12:14 1137 0
REKLAMA
  • #1 12502543
    2shy
    Poziom 10  
    Witam, mam problem z poprawną obsługą trybu CTC timera 0 w Atmega16. Taktowanie z wewnętrznego RC 8 MHz.

    Na wejście INT0 (aktywne zboczem narastającym) podaję prostokątny sygnał kluczujący o f=50 Hz i wypełnieniu 25%. W każdym okresie tego sygnału chcę go próbkować cztery razy - 20 ms okres dzielę na cztery, uzyskując 4 'bity', każdy o szerokości 5 ms. Próbkowanie miałoby się odbywać w środku trwania każdego 'bitu' - czyli w 2.5 ms, w 7.5 ms, w 12.5 ms i w 17.5 ms każdego okresu.

    Wymyśliłem to w ten sposób, że najpierw wykrywam narastanie sygnału kluczującego, po czym w przerwaniu je obsługującym ustawiam timer na CTC, by odmierzył 2.5 ms. W przerwaniu od timera zrobiłem prostą maszynę stanów, w której poza próbkowaniem odpowiednich wejść i generowaniem testowych impulsów, żeby sobie obejrzeć przebieg na oscyloskopie, modyfikuję zawartość rejestru OCR0 tak, aby od środka bitu odmierzył 5 ms do następnego środka.

    Napisałem sobie kod:


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


    Pytanie jak zawsze: dlaczego wyżej napisany kod nie działa tak, jak sobie zaplanowałem? Wiem, że delaya w ISR się nie używa, ale chciałem po prostu tymczasowo wygenerować jakieś krótkie impulsy. Impulsy na PB1 są jakby generowane na początku, a nie w środku każdego bitu. Dorzucam oscylogram, górny przebieg to kluczowanie na int0, dolny to impulsy na PB1. Atmega 16 - Jak ustawić timer 0 w trybie CTC do próbkowania sygnału 50 Hz?

    Dodano po 46 [minuty]:

    Poradziłem sobie z problemem. Program jest napisany dobrze. Wstyd się przyznać, ale źle sobie ustawiłem wyzwalanie w oscyloskopie. Zamykam, problem rozwiązany.
  • REKLAMA
REKLAMA