微控制器TMR0定时器计数器中断

时间:2014-10-14 03:21:38

标签: timer microcontroller interrupt spi

我正在用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

}

2 个答案:

答案 0 :(得分:2)

定时器的32 ms周期由定时器的配置决定,该定时器不包含在您的代码摘录中(即,可以在代码的其他位置执行)。阅读PIC16F630/676 datasheet的第4.0节,其中解释了TIMER0模块。

Timer0配置如下:

  • T0CS是:
    • 清除以选择Timer0的内部时钟源(定时器模式),
    • 或设置为选择外部时钟源(计数器模式)。
  • T0IE设置为使能Timer0中断。
  • 预分频器可与内部时钟源配合使用,以调整Timer0的滴答速率
    • PSA被清除以将预分频器分配给Timer0。
    • PS2:PS0设置为选择预分频率。

因此,外部时钟源或内部时钟源和预分频器决定Timer0的滴答速率。

答案 1 :(得分:0)

32ms是定时器计数器计数0x07次的时钟源的时间段。

您的定时器单元与公共时钟源同步,该时钟源来自外部晶振或内部振荡器。在时钟配置期间,您需要确定定时器单元所连接的外围总线时钟。在配置定时器单元时,您可以使用预分频器进一步将此外设时钟分频为更低的频率,以增加周期范围。

现在假设您的外围总线时钟频率为1MHz且预分频器为1,您的计数器将每1us递增或递减一次,对于0x07计数,它将仅产生7us的周期。在您的示例中,您需要将预分频器32000(如果允许设置)设置为计数的参考时钟,以便1个计数表示32ms。

相关问题