ariek44 napisał: Witam, chciałbym przy użyciu Atmega8 i zewnętrznego kwarcu odmierzać i zliczać
setne części sekund, sekundę mogę łatwo wyłapać z timera1 według przykładowych obliczeń
4000000MHz / 256 = 15625
65536 - 15625 = 49911
lub
8000000Mhz / 256 = 31250
65536 - 31250 = 34286
Nie mam jednak pomysłu jak.......
Z góry dziękuję za pomocne wypowiedzi.
Aby odmierzac setne czesci sekundy (czyli odcinki czasowe i dlugosci 10ms), niestety masz zle obrachunki.
Przy taktowaniu processora 4 MHz masz trzy mozliwosci ustawienia prescalera dla Timer1. - (Pr=1, Pr=8, Pr=64)
Oto przyklad dla Prescale =1:
'............
'............
const Timer1Reload = 40000
config timer1 = timer , prescale = 1
load timer1 , Timer1Reload
on ovf1 Timer1_isr
enable timer1
start timer1
enable interrupts
'Add your code here
Timer1_ISR:
load timer1, Timer1Reload
'Add your ISR code here
return
'Timer value explanation
' The timer is a 16Bit timer, it overflows when the timer reaches 65536
' The AVR is running at 4000000Hz, the prescaler is 1
' Each tick is 0.00025 ms - (1 / CPUSpeed in KHz ) * Prescaler
' The timer needs 40000 ticks to reach the required time ( 40000 * 0.00025 = 10ms)
' The start value for the timer must be set to 25536 so that it will overflow at 65536 after 40000 ticks
' NOTE: The load command does the inversion for you (256-value or 65536-value)
dla pr=8"
const Timer1Reload = 5000
config timer1 = timer , prescale = 8
-------------------------------
dla pr=64
const Timer1Reload = 625
config timer1 = timer , prescale = 64
-------------------------------
Pozostala czesc rutynny analogicznie jest podobna, uwzgledniajac odpwiednie liczby.
To jest tylko jeden z licznych sposobow odmierzania czasu stosujac timer1.
Mozesz z powodzeniem zamiast powyzszego (OVF1) uzyc trybu CTC timera1, mozesz tez uzyc timer0 lub Timer2 (jezeli taki jest mozliwy); stosujac odpowiedni preload i zliczac odpowiednia ilosc przepelnien.
Nie podaje tych liczb bo musialbym ci dac duzo "kompletow liczb" ze soba zwiazanych. Liczby te beda mialy scisly zwiazek z taktowaniem processora i prescalerem oraz uzytym trybem timera. Zadna z nich nie moze byc przypadkowa; musza w koncowym rachunku dac dokladnie 10 ms tak jak w powyzej umieszczonym przykladzie.
Mysle ze to powinno wystarczyc.
e marcus