【问题标题】:Unable to produce 1s delay using timer module使用定时器模块无法产生 1s 延迟
【发布时间】:2021-06-22 10:04:11
【问题描述】:

我正在尝试使用计时器模块产生 1 秒的延迟。 定时器寄存器中的值是 61 DEC,它会每 50ms 产生一个中断,这会增加一个名为 value 的变量的值。

在 20 次中断后,大约 1 秒将过去,这将改变 LED 的状态。但这似乎没有按预期工作。振荡器频率为 4MHz,定时器模块的预分频值为 256,目标微控制器为PIC16F72。 代码如下:

char value;
bit state;

void Interrupt(){     
  if(TMR0IF_bit){
      value++;
      TMR0 = 61;    
      TMR0IF_bit = 0;    
    }
}

void main(){      
  value = 0;
  state = 0;  
  TRISB.RB0 = 0;
  OPTION_REG = 0x87;
  TMR0 = 61;
  INTCON = 0xA0;
  
  while(1){
    if(value == 20){
      value=0;
      state=~state;
      PORTB.RB0=state;
    }
  }
} 

【问题讨论】:

  • 什么意思:似乎不起作用?尝试使用调试器。
  • 我尝试使用调试器,但它没有进入中断例程。我尝试将调试器工具与秒表一起运行,即使 2 秒后它也没有立即进入中断例程。
  • 使用调试器检查计数器寄存器,确认定时器正在运行。
  • 如果它没有进入中断处理程序,那么你可能有不同的问题,但不将value声明为volatile仍然是一个问题。
  • 如果您的问题已经解决,请考虑将您的帖子标记为已解决,以便其他人知道。

标签: timer embedded pic mikroc


【解决方案1】:

ISR 的声明错误

开关:

void Interrupt(){  

到:

void interrupt(){  

别忘了volatile

volatile char value;

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多