我发现当我使用定时器1时micros()
功能无法正常运行。我想:
micros()
函数实际上并不依赖于计时器(但是毫秒就是这样)如果我打电话
TCCR1B |= (1 << CS11) | (1 << CS10);
在setup()
。
微功能将在约0.25秒后开始报告偶发值。例如。之后,micros()会以非常低的速度增加,并且经常会倒退。
我在Arduino Uno上进行测试。
我还试图检查被调用的定时器中断是否过重。除了一些整数数学和一个digitalWrite之外,它没有做任何事情。
答案 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
}
使确定您的时间标志被声明为易失性,因为它在中断内被更改并在中断之外进行检查。