Witam!
Piszę program, w którym uruchamiam TIMER1 w trybie 15, działa on jako PWM ze stałą częstotliwością i wypełnieniem. Inicjuje TIMER3 który działa też w trybie 15 ale wywołuje z niego dwa przerwania, od porównania z rejestrem OCR3A i OCR3B. W pierwszym przerwaniu zeruje bit COM1B1 czyli wyłączam sterowanie portem przez TIMER1. W drugim przerwaniu ustawiam bit COM1B1 czyli ponownie włączam generacje PWM na porcie. Całość ma działać tak, że sygnał z TIMER1 moduluje sygnałem z TIMER3 ale niestety nie działa jak bym chciał. Port którym steruje TIMER1 mam podłączony do głośnika. Przy wyłączonej modulacji TIMERem3 wszystko działa czysto. Jak włączę TIMER3 to modulacja działa ale co kilka, kilkanaście sekund słychać dziwne trzaski, jakby TIMER1 nie zerował portu przy porównaniu z OCR1B. Próbowałem zamiast zerowania bitu COM1B1 poprostu ustawiać port PB6 jako wejście, a w drugim przerwaniu znowu jako wyjście ale nic to nie zmienia. Zatrzymywanie i startownie TIMER1 w przerwaniach też daje ten sam efekt.
Kod poniżej, mam nadzieje że ktoś wpadnie na pomysł co jest nie tak, mi już brak pomysłów, z góry dzięki.
Piszę program, w którym uruchamiam TIMER1 w trybie 15, działa on jako PWM ze stałą częstotliwością i wypełnieniem. Inicjuje TIMER3 który działa też w trybie 15 ale wywołuje z niego dwa przerwania, od porównania z rejestrem OCR3A i OCR3B. W pierwszym przerwaniu zeruje bit COM1B1 czyli wyłączam sterowanie portem przez TIMER1. W drugim przerwaniu ustawiam bit COM1B1 czyli ponownie włączam generacje PWM na porcie. Całość ma działać tak, że sygnał z TIMER1 moduluje sygnałem z TIMER3 ale niestety nie działa jak bym chciał. Port którym steruje TIMER1 mam podłączony do głośnika. Przy wyłączonej modulacji TIMERem3 wszystko działa czysto. Jak włączę TIMER3 to modulacja działa ale co kilka, kilkanaście sekund słychać dziwne trzaski, jakby TIMER1 nie zerował portu przy porównaniu z OCR1B. Próbowałem zamiast zerowania bitu COM1B1 poprostu ustawiać port PB6 jako wejście, a w drugim przerwaniu znowu jako wyjście ale nic to nie zmienia. Zatrzymywanie i startownie TIMER1 w przerwaniach też daje ten sam efekt.
Kod poniżej, mam nadzieje że ktoś wpadnie na pomysł co jest nie tak, mi już brak pomysłów, z góry dzięki.
Kod: C / C++
