static volatile unsigned long CurrentTime;
static volatile unsigned long Count=0;
void setup()
{
Serial.begin(9600);
CurrentTime=millis();
TCCR1A = 0;
TCCR1B = _BV(CS11);//8分频
TIFR1 |= _BV(OCF1A);
TCNT1=0;
OCR1A=2000;
TIMSK1 |= _BV(OCIE1A) ;
}
void loop()
{
if(millis()-CurrentTime>=1000)
{
Serial.println(Count);
Count=0;
CurrentTime=millis();
}
}
static inline void handle_interrupts(volatile uint16_t *TCNTn, volatile uint16_t* OCRnA)
{
Count++;
*TCNTn=0;
}
SIGNAL (TIMER1_COMPA_vect)
{
handle_interrupts(&TCNT1, &OCR1A);
}
//我做的一个定时器测试,这个程序的功能就是统计每秒定时器的累加数,你可以看成频率发生器
TCNT1=0; 这个是初始值
OCR1A=2000; 这个是对比值
我程序使用8分频,16位定时器,使用普通对比模式,也就是当 TCNT1=OCR1A时发生中断.我的程序每1ms发生一次中断,1ms就是OCR1A=2000.
这个2000怎么来的呢?有如下公式:
定时器初值=65536-(时钟频率/分频系数)*T
T是周期,我这里使用1ms,就是0.001s
上面的公式是定时器的初值,也就是TCNT1的值,那么OCR1A就设成65535了.
如果TCNT1=0,那么OCR1A就是(时钟频率/分频系数)*T
所以,16000000/8*0.001=2000
不知道你懂不懂,反正我也是学了几天定时器而已,以上的公式是看书上的,现在暂时明白了
|