16MHz atmega8535上的1MHz定时器

时间:2013-05-19 19:01:24

标签: timer avr atmel atmega

似乎无法理解这一点,虽然看起来很容易。 我在我的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的定时器吗?

1 个答案:

答案 0 :(得分:1)

您在中断功能中执行的操作可能需要比中断之间的间隔更长的时间。当您在16 MHz器件上有1 MHz定时器时,定时器中断之间有16个时钟周期,这对于做任何有意义的事情都不是很多。此外,你还有调用中断函数的开销(这可能超过16个滴答,但我不知道),它给你少于16个滴答作用。当中断函数内部运行的代码超过中断间隔时,基本上会将计时器频率降低一个未知量,并为主代码留下很少的CPU时间。

我建议减少定时器频率,以便定时器中断有足够的时间运行,并为主代码留下足够的CPU时间(如果需要)或选择以更高CPU频率运行的设备。