有什么理由不在AVR上使用Timer0?


10

只是一个基本问题...对于arduino / avr / ATMega328,我发现了许多使用Timer1的示例(甚至有一个完整的库),但很少有使用Timer0(或Timer2)的示例。

现在,我知道使用这些定时器中的任何一个来控制ISR方法都将禁止在其相关引脚上使用PWM,但是是否有特定的原因使人们似乎远离Timer0?它是否在内部用于其他不应该惹的麻烦?

我当前的应用程序可以使用Timer1很好,我只是想知道我是否缺少其他一些经常被忽略的计时器。

Answers:


16

如果问题是关于裸露的AVR微控制器,则否,使用任何计时器都没有限制

  • 对于Arduino,最好避免使用Timer0,因为millis()delay()并且Arduino库中的所有内部计时都使用此计时器。更改时间常数将影响这些操作。
  • 正如问题所指出的那样,通过诸如TimerOne库类的库以及直接操作,Timer1是任何定时器/计数器任务的普遍首选。它是一个16位定时器,因此比8位定时器具有更好的分辨率。
  • tone()库使用了Timer2,但是由于使用率不高,所以还有许多人发现msTimer2库非常有用,就像TimerOne一样。直接操作Timer2也可以。
  • 如果您使用Arduino Mega板,则Mega,Timer3Timer4Timer5上的其他计时器(每个都是16位计时器)也可以使用。

9

除了禁用关联的PWM外,我想到的其他原因还有:

  • TIMER0是一个8位定时器,而TIMER1是一个16位定时器。

  • 在Arduino世界中,TIMER0用于定时器函数,如delay()和millis()。我见过的许多其他代码都以相同的方式使用它,因为8位分辨率通常足够。

  • TIMER2也是8位的,我想不出要专门避免只需要8位的原因。但是,它由Arduino tone()函数使用。

因此,我认为将TIMER1留为相当通用的选择,并且在需要16位定时器的情况下,它是较小的AVR的唯一选择。AVR Mega设备还包含均为16位的TIMER3-TIMER5。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.