Timer Arduino纳米计时器
我想更多地了解计时器Timer Arduino纳米计时器,timer,arduino,avr,atmel,atmega,Timer,Arduino,Avr,Atmel,Atmega,我想更多地了解计时器 有什么计时器 它们会产生干扰吗 什么代码会将中断处理程序附加到它们 如何实现delay()和delayMicroseconds()呢。。。 他们使用定时器中断吗?(如果是,在此期间如何执行其他代码?) 或者他们重复轮询直到计时器达到某个值 或者它们是否会增加值X的次数 还是他们用另一种方式 思考Arduino纳米计时器的最佳方式是思考底层芯片中的计时器:处理器。它有三个计时器: 定时器0:8位,芯片引脚11和12上的PWM 定时器1:16位,芯片上的PWM引脚15和1
delay()
和delayMicroseconds()
呢。。。
- 他们使用定时器中断吗?(如果是,在此期间如何执行其他代码?)
- 或者他们重复轮询直到计时器达到某个值
- 或者它们是否会增加值X的次数
- 还是他们用另一种方式
思考Arduino纳米计时器的最佳方式是思考底层芯片中的计时器:处理器。它有三个计时器:
- 定时器0:8位,芯片引脚11和12上的PWM
- 定时器1:16位,芯片上的PWM引脚15和16
- 定时器2:8位,芯片上PWM引脚17和5
- “值匹配”中断发生在计时器值达到计时器寄存器中的比较值时,该值被添加到计时器的每个刻度上
- 当定时器值达到其最大值时,定时器溢出中断发生
ISR(TIMER1_OVF_vect) {
...
}
TIMSK1 |= (1<<TOIE1);
这将声明一个函数来服务计时器1溢出中断。然后需要使用TIMSK1
寄存器启用定时器溢出中断。在上述示例中,这可能如下所示:
ISR(TIMER1_OVF_vect) {
...
}
TIMSK1 |= (1<<TOIE1);
这将在TIMSK1寄存器中设置TOIE1
(请生成定时器1溢出中断)标志。假设您的中断已启用,则每当TIMER1溢出时,ISR(TIMER1\u OVF\u vect)
都将被调用
Arduino
delay()
函数在源代码(wiring.c
)中如下所示:
因此,它在内部使用micros()
函数,该函数实际上依赖于计时器0计数。Arduino框架使用timer0计算毫秒数,实际上,timer0 count是millis()
函数获取其值的地方
另一方面,delayMicroseconds()
函数使用某些定时的微处理器操作来创建延迟;使用哪种功能取决于处理器和时钟速度;最常见的是nop()
(无操作),它只需要一个时钟周期。Arduino Nano使用16MHz时钟,下面是它的源代码:
// For a one-microsecond delay, simply return. The overhead
// of the function call yields a delay of approximately 1 1/8 µs.
if (--us == 0)
return;
// The following loop takes a quarter of a microsecond (4 cycles)
// per iteration, so execute it four times for each microsecond of
// delay requested.
us <<= 2;
// Account for the time taken in the proceeding commands.
us -= 2;
//对于一微秒的延迟,只需返回即可。头顶
//函数调用的延迟约为1 1/8µs。
如果(--us==0)
返回;
//以下循环需要四分之一微秒(4个循环)
//每一次迭代,每一微秒执行四次
//请求延期。
谢谢!很高兴你发现它很有用。