Erwin14 napisał: Witam. Nie mogę dobrać parametrów timera tak by osiągnąć zadaną częstotliwość. Potrzebuje teraz osiągnąć by timer1 się przepełniał 10 razy na sekundę czyli co 100ms. ]
Do tej procedury nie musisz wcale zmieniac fusebitów. Możesz w zupełności pracowac z f-taktowania 1MHz wykorzystując wewnętrzny, wbudowany oscylator RC z fabrycznym ustawieniem.
Mega8 nie ma 'podzielnika przez 8' (CKDIV8) spotykany w innych processorach !
Nieuważna manipulacja fusebitami dla ‘mało obeznanych’ w tym temacie, często kończy się zablokowniem processora.
Gdybyś zadał sobie odrobinę trudu i poczytał w datasheet rozdział poświęcony dla Timera 1, z jego szerokimi możliwościami wyboru trybów pracy, to odnalazłbyś kilka różnych rozwiązań.
Zastosowany przez ciebie tryb ‘Normal’ nie jest tu najlepszym wyborem; - wymaga ciągłej ‘pomocy’ processora aby w każdym przerwaniu dokonac wpisu wstępnej wartości Timera, od której ma liczyc do jego pełnej pojemności i wtedy wywołac przerwanie (Ovf1).
Lepszym wyborem byłoby skorzystac z trybu CTC ( na przykład tryb 4), w którym timer liczy impulsy od poczatku (TCNT1=0) do określonej na wstępie wartości OCR1A i wtedy jest wywoływane przerwanie (jeżeli jest skonfigurowane) oraz jednoczesnie jego licznik jest automatycznie zerowany.
Dla f = 1MHz możesz zastosowac prescaler =8, okreslic OCR1A = 12500.
Przerwanie : zamiast TOIE1 skonfigurowac OCIE1A (bit 4 w TIMSK).
Jeżeli częstotliwośc wywoływania przerwań nie jest krytyczna i może miec niewielkie kompromisowe odchylenia od warunku ‘co 100ms’, to możesz dobrac inne pary wartości prescalera/OCR1A na przykład:
64/1562 – wywoła przerwania co 99.97 msec
256/390 – wywoła przerwania co 99.84 msec
1024/97 – wywoła przerwania co 99.33 msec
Ponadto Mega 8 posiada Timer2, który również może byc zastosowany w trybie CTC z odpowiednio dobranymi ustawieniami wstępnymi, (prescaler/OCR2), który jednak może byc skonfigurowany tylko:
1024/97 – wywoła przerwania co 99.33 msec.
e marcus