TCCR1B打破了micros()

时间:2017-06-02 11:36:08

标签: arduino arduino-uno arduino-ide

我发现当我使用定时器1时micros()功能无法正常运行。我想:

  1. Arduino内部功能(引脚9上的PWM除外,我没有使用)使用定时器0
  2. micros()函数实际上并不依赖于计时器(但是毫秒就是这样)
  3. 如果我打电话 TCCR1B |= (1 << CS11) | (1 << CS10); setup()

    微功能将在约0.25秒后开始报告偶发值。例如。之后,micros()会以非常低的速度增加,并且经常会倒退。

    我在Arduino Uno上进行测试。

    我还试图检查被调用的定时器中断是否过重。除了一些整数数学和一个digitalWrite之外,它没有做任何事情。

1 个答案:

答案 0 :(得分:1)

根据数据表,第93页上的“带PWM的8位定时器/计数器0”和第111页上的“带PWM的16位定时器/计数器1”共用同一个预分频器模块,但定时器/计数器可以有不同的预分频器设置。以下描述适用于T / C1和T / C0。“

所以它可能不是与时钟选择的交互,但你只有64个时钟来执行中断并退出它。进入和退出中断有一些开销。 DigitalWrite并不像你想象的那么快。因此,在不计算指令时钟周期的情况下,我想我会从你的上一个语句中追求思路 - 通过设置一个标志然后退出来减轻该中断的负荷。处理主循环中的标志。当你谈到微秒时,快速退出ISR尤为重要。伪代码:

volatile uint8_t timerflag = 0;
ISR <timer1_whatever>
{
     timerflag = 1;
}

back in main loop:
if (timerflag == 1)
{
    <do something>

    timerflag = 0; // reset for next interrupt
}

使确定您的时间标志被声明为易失性,因为它在中断内被更改并在中断之外进行检查。