Witam,
Pracuję na ATmega16 taktowanym wewnętrznym oscylatorem RC. Chciałem wykorzystać Timer1 do odmierzania czasu np. 1s lub 1min (po zastosowaniu preskalera 1024), a Timer2 razem z przerwaniem zewnętrznym do wykonania regulacji fazowej. Kiedy chce tylko odmierzać czas, albo tylko regulować fazowo to wszystko działa poprawnie. Jednak kiedy chcę połączyć te dwa moduły tzn. zrobić coś takiego, żeby np. po odmierzeniu 30sekund zaświecić żarówkę z mocą 30% na kolejne 30sekund, to już jest problem. Nic się nie dzieje. Nie wiem co jest grane. W tym samy programie obsługuje kilka przerwań: zewnętrzne, od przetwornika adc i timerów. Ale tylko te od timerów coś chrzanią (tylko kiedy są razem włąćzone).
Próbowałem skorzystać z Timera0 zamiast Timera2 ale z dokumentacji wyczytałem że mają wspólny preskaler więc nie osiągnął bym celu.
Proszę o pomoc i wskazówki
Dodano po 6 [minuty]:
PS. oczywiście chodziło mi o to, że Timer0 i Timer1 mają wspólny preskaler
Dodano po 20 [minuty]:
Heh olśnienie
Spodziewałem się głupiego błędu, ale żeby aż tak...
Już tłumacze.
Otóż najpierw w programie włączałem zezwolenie na przerwania od Timer2:
TIMSK=_BV(OCIE2);
Następnie kilka linijek dalej włączałem pozwolenie na przerwania od Timera1:
TIMSK=_BV(OCIE1A);
Tym samym oczywiście kasowałem pierwszą instrukcję
głupota ludzka nie zna granic
Poprawnie powinno być oczywiście następująco:
TIMSK=_BV(OCIE2) | _BV(OCIE1A);
lub
TIMSK |= _BV(OCIE1A);
Przepraszam za zawracanie głowy. Problem rozwiązany
Pracuję na ATmega16 taktowanym wewnętrznym oscylatorem RC. Chciałem wykorzystać Timer1 do odmierzania czasu np. 1s lub 1min (po zastosowaniu preskalera 1024), a Timer2 razem z przerwaniem zewnętrznym do wykonania regulacji fazowej. Kiedy chce tylko odmierzać czas, albo tylko regulować fazowo to wszystko działa poprawnie. Jednak kiedy chcę połączyć te dwa moduły tzn. zrobić coś takiego, żeby np. po odmierzeniu 30sekund zaświecić żarówkę z mocą 30% na kolejne 30sekund, to już jest problem. Nic się nie dzieje. Nie wiem co jest grane. W tym samy programie obsługuje kilka przerwań: zewnętrzne, od przetwornika adc i timerów. Ale tylko te od timerów coś chrzanią (tylko kiedy są razem włąćzone).
Próbowałem skorzystać z Timera0 zamiast Timera2 ale z dokumentacji wyczytałem że mają wspólny preskaler więc nie osiągnął bym celu.
Proszę o pomoc i wskazówki
Dodano po 6 [minuty]:
PS. oczywiście chodziło mi o to, że Timer0 i Timer1 mają wspólny preskaler
Dodano po 20 [minuty]:
Heh olśnienie
Już tłumacze.
Otóż najpierw w programie włączałem zezwolenie na przerwania od Timer2:
TIMSK=_BV(OCIE2);
Następnie kilka linijek dalej włączałem pozwolenie na przerwania od Timera1:
TIMSK=_BV(OCIE1A);
Tym samym oczywiście kasowałem pierwszą instrukcję
Poprawnie powinno być oczywiście następująco:
TIMSK=_BV(OCIE2) | _BV(OCIE1A);
lub
TIMSK |= _BV(OCIE1A);
Przepraszam za zawracanie głowy. Problem rozwiązany