TCCR1B 中断 micros()

TCCR1B breaks micros()

我发现当我使用定时器 1 时 micros() 功能停止正常运行。我认为:

  1. Arduino 内部函数(除了我没有使用的引脚 9. 10 上的 PWM)使用定时器 0
  2. micros() 函数实际上并不依赖定时器(但 millis 依赖)

如果我打电话 TCCR1B |= (1 << CS11) | (1 << CS10); setup().

micros 函数将在大约 0.25 秒后开始报告零星值。例如。之后micros()会以非常低的速度增加,而且经常倒退。

我正在 Arduino Uno 上进行测试。

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

根据数据表,第 93 页的“8 位 Timer/Counter0 带 PWM”和第 111 页的“16 位 Timer/Counter1 带 PWM”共享相同的预分频器模块,但是Timer/Counters 可以有不同的预分频器设置。下面的描述适用于 Timer/Counter1 和 Timer/Counter0。

所以这可能不是与时钟的交互 select,但您只有 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
}

确保您的时间标志被声明为可变的,因为它在中断内部被更改并在中断外部被检查。