【发布时间】:2013-05-19 19:01:23
【问题描述】:
我似乎无法理解这一点,尽管对我来说这看起来很容易。 我在我的 Atmel ATmega8535 中制作了很多计时器,但这个让我很受打击。 另外,我看过很多计算等,但并不是我想要的。
很简单:
我的 ATmega8535 以 16 MHz 运行,而我只需要一个 1 MHz 的计时器,因此我可以在某些引脚上以 1 MHz 的频率输出一些数据。
那么我该如何进行呢? 下面的计算听起来不错(找到here)。
Target Timer Count = (1 / Target Frequency) / (1 / Timer Clock Frequency) - 1
= (1 / 1000000) / (1 / 16000000) - 1
= 0.000001 / 0.0000000625 - 1
= 16 - 1
= 15
那么这将导致
void initTimer()
{
// 8 bit timer 2 setup
TCCR2 = (1<<CS20); // Timer clock = system clock/1
TIFR = 1<<TOV2; // Clear TOV2/ clear pending interrupts
TIMSK = 1<<TOIE2; // Enable timer 2 overflow interrupt
sei();
}
ISR(TIMER2_OVF_vect) // 16 bit timer 2 overflow interrupt vector
{
TCNT2 = 256-15; // Make sure every overflow resets the TCNT2 to the 1 MHz setup
addUpSomething++; // Do something (...not relevant to this sample)
}
如何正确进行这些计算?这会产生一个 1 MHz 的计时器吗?
【问题讨论】:
-
我没有看到任何启动计时器的代码。
-
你的意思是 SEI(); ?完全正确,我忘记了,我会编辑原帖
-
我不知道
SEI是什么。但是您的示例似乎配置了几个中断,并设置了一个中断处理程序。但是那里没有真正初始化计时器状态并开始运行的代码。 -
我添加了 TCCR2,预分频器设置为 1(无预分频)。这将启动计时器