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

ATmega16 - działanie timera 1 i 2

golas17 23 Lut 2009 16:39 885 0
REKLAMA
  • #1 6192935
    golas17
    Poziom 16  
    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 :D 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
  • REKLAMA
REKLAMA