|
hi:
9454的定时器0是可重载定时器,一般的定时器,我们都认为当计数寄存器溢出,就会自动重装载计数器。
但是用起来却有一个奇怪的地方,当设置定时器0中断使能的时候,计数寄存器溢出,定时器就会停止,必须把定时器0的中断标志清零,定时器0才会开始计时。
例如:以下为定时器0的中断程序
#pragma vector = __TIMER0_MATCH_vector
__interrupt void timer0_interrupt_routine()
{
//占用了7~10us
T0CON_bit.PND = 0; //必须清T0中断标志
}
其实把它翻译成汇编却是这样:它还有保护现场工作寄存器的指令
#pragma vector = __TIMER0_MATCH_vector
__interrupt void timer0_interrupt_routine()
{
//占用了7~10us
push R15 //定时器停止
push R14
push R13
push R12
push 0xDF
push R0
T0CON_bit.PND = 0; //必须清T0中断标志,定时器重新开始工作
pop R0
pop 0xDF
pop R12
pop R13
pop R14
pop R15
}
因此,定时器的定时时间实际上是 :计算的定时值 + 压栈的时候。所以如果要定时50us, 那么实际、计算的定时值应该小于50us,可能在45us左右。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|