似乎无法理解这一点,虽然看起来很容易。 我在我的Atmel ATMEGA8535上制作了很多计时器,但是这个只能击中我。 此外,我已经看过许多骚扰,但不是我想要的。
这很简单:
我的ATMEGA8535以16Mhz运行,我想要的是1MHz的定时器,所以我可以在1MHz的基础上输出一些引脚上的数据。
那我该怎么办? 这听起来不错(找到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 Timer2 Overflow Interrupt
sei();
}
ISR(TIMER2_OVF_vect) // 16 Bit Timer 2 overflow interrupt vector
{
TCNT2= 256-15; // make sure every overflow reset the TCNT2 to the 1MHz setup
addUpSomething++; // do something (...not relevant to this sample)
}
有人可以就计算提出建议吗?这会产生1MHz的定时器吗?
答案 0 :(得分:1)
您在中断功能中执行的操作可能需要比中断之间的间隔更长的时间。当您在16 MHz器件上有1 MHz定时器时,定时器中断之间有16个时钟周期,这对于做任何有意义的事情都不是很多。此外,你还有调用中断函数的开销(这可能超过16个滴答,但我不知道),它给你少于16个滴答作用。当中断函数内部运行的代码超过中断间隔时,基本上会将计时器频率降低一个未知量,并为主代码留下很少的CPU时间。
我建议减少定时器频率,以便定时器中断有足够的时间运行,并为主代码留下足够的CPU时间(如果需要)或选择以更高CPU频率运行的设备。