我正在用MCP2515编程微控制器PIC16F676 SPI接口。它将在每224ms设置一个标志,定时器计数器将从0 * F8增加到0 * FF然后溢出以设置此标志。因此,32ms * 07H = 224ms。问题是如何让定时器每隔32ms进行一次中断,这是32ms的来源。
//Timer interrupts every 32ms and set a flag every 224ms (32ms * 07H = 224ms)
//Initial value = FFH - 07H = F8H
if(T0IF) //TMR0 overflow interrupt flag bit
{
TimerCounter++;
if(!TimerCounter) //if rolled over, set flag. Main will handle the rest.
{
TimerCounter = 0*F8;
gSampleFlag = 1;
}
T0IF = 0; //reset for next flag
}
答案 0 :(得分:2)
定时器的32 ms周期由定时器的配置决定,该定时器不包含在您的代码摘录中(即,可以在代码的其他位置执行)。阅读PIC16F630/676 datasheet的第4.0节,其中解释了TIMER0模块。
Timer0配置如下:
因此,外部时钟源或内部时钟源和预分频器决定Timer0的滴答速率。
答案 1 :(得分:0)
32ms是定时器计数器计数0x07次的时钟源的时间段。
您的定时器单元与公共时钟源同步,该时钟源来自外部晶振或内部振荡器。在时钟配置期间,您需要确定定时器单元所连接的外围总线时钟。在配置定时器单元时,您可以使用预分频器进一步将此外设时钟分频为更低的频率,以增加周期范围。
现在假设您的外围总线时钟频率为1MHz且预分频器为1,您的计数器将每1us递增或递减一次,对于0x07计数,它将仅产生7us的周期。在您的示例中,您需要将预分频器32000(如果允许设置)设置为计数的参考时钟,以便1个计数表示32ms。