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:
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.
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.
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++
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.
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.