0

我似乎无法理解这一点,尽管对我来说这看起来很容易。我在我的 Atmel ATmega8535 中制作了很多计时器,但这个让我很受打击。另外,我看过很多计算等,但这并不是我想要的。

这很简单:

我的 ATmega8535 以 16 MHz 运行,而我想要的只是一个 1 MHz 的定时器,因此我可以在某些引脚上以 1 MHz 的频率输出一些数据。

那么我该如何进行呢?下面的计算听起来不错(在此处找到)。

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 定时器吗?

4

1 回答 1

1

您在中断函数中执行的操作很可能比中断之间的间隔时间长。当您在 16 MHz 设备上有一个 1 MHz 计时器时,您在计时器中断之间有 16 个时钟滴答,这对于做任何有意义的事情来说并不是很多。

此外,您还有调用中断函数的开销(仅此一项可能超过 16 个滴答声,但我不知道),这使您做某事的时间少于 16 个滴答声。当您的中断函数中运行的代码占用的时间超过中断之间的间隔时,您基本上会将您的定时器频率降低一个未知的数量,并为您的主代码留下非常少的 CPU 时间。

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

于 2013-05-19T19:22:35.103 回答