星期一, 9月 05, 2005

PIC 的Timer

Timer0 和Watchdog共用一個prescalar(在Watchdog中叫postscalar),所以給Watchdog用的話,Timer0就不能用,同理,Timer0拿來用的話,Watchdog就不能用了。
為了避免要到處加clear watchdog,所以prescalar都是給watchdog用。

使用內部Crystal作clock時,clock = Fosc/4.
Timer0是8 bit timer,所以最長每256個instruction就會interrupt一次。
....有點太快。

Watchdog用的是內部的RC,產生period約15ms的reset信號,如果用postscalar(也就是Timer0的prescalar),最多可以到2.3 sec。


Timer1 是16 bit的counter,每次overflow後會由00開始技數,所以比較像是用來量測時間用的。
例如:方波開始時start,方波結束時check timer counter。


Timer2 固定使用內部Instruction Cycle (Fosc/4)作clock,可以由T2CON的T2PKCS0-T2PKCS1設定prescalar,TOUTPS0-TOUTPS3設定postscalar。
PR2是match register,決定Timer2的overflow的值

使用4M的crystal,instruction freq是1M。
設定Timer2的pre和post scalar都是16 (最大),設定PR2 (overflow count)是217的話。
count 18.0012次就算是1 sec。誤差是0.0012/18 = 0.006.4%
一天誤差5 sec。一個月誤差3 min,似乎太大。

pre=16, post=10. PR2=250
count 25 次就算是1 sec。誤差是0。

#include <pic.h>

unsigned int tick;
unsigned int sec;
void main(void)
{
T2CON = 0x4A; // post 10. pre 16
PR2 = 250; // 16 x 10 x 250 = 40000.
// use 4MHz, inst Freq = 4/4 = 1MHz
// so count 25 times = 1sec
tick=sec=0;
TMR2ON = 1;

while(1) {
while(!TMR2IF);
TMR2IF = 0;
tick++;
if(tick>=25){
tick=0;
sec++;
}
}
}

沒有留言:

網誌存檔