Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Timer AVR CTC定时器频率明显不准确_Timer_Frequency_Avr_Timing_Atmega - Fatal编程技术网

Timer AVR CTC定时器频率明显不准确

Timer AVR CTC定时器频率明显不准确,timer,frequency,avr,timing,atmega,Timer,Frequency,Avr,Timing,Atmega,我是AVR设备编程的初学者,为了摆脱低效的_ms_delay()和_us_delay()阻塞函数,我一直在尝试使用内置定时器控制基本LED闪烁程序的计时,该程序在16位定时器上采用CTC定时器模式。我的目标是使LED以2 Hz的频率闪烁,打开0.5秒,关闭0.5秒 根据,CTC输出的频率应该是f_CTC=f_Clock/(2N(OCR1A+1),因为我的芯片是328P的解释型mini,它的默认CPU速度是16MHz,使用上面的公式,当N=64时,达到我想要的频率所需的OCR1A值应该是62499

我是AVR设备编程的初学者,为了摆脱低效的_ms_delay()和_us_delay()阻塞函数,我一直在尝试使用内置定时器控制基本LED闪烁程序的计时,该程序在16位定时器上采用CTC定时器模式。我的目标是使LED以2 Hz的频率闪烁,打开0.5秒,关闭0.5秒

根据,CTC输出的频率应该是f_CTC=f_Clock/(2N(OCR1A+1),因为我的芯片是328P的解释型mini,它的默认CPU速度是16MHz,使用上面的公式,当N=64时,达到我想要的频率所需的OCR1A值应该是62499。考虑到所有这些,我写了以下代码:

#包括
内部主(空)
{
//设置CTC模式下的定时器TC1(16位)以2 Hz的频率运行
TCCR1A=0x00;
OCR1A=62499;//将时间分辨率设置为0.5秒
TCCR1B=0x0b;
TCCR1C=0x00;
//设置销方向

PORTD&=~(1我注意到一件事可能会导致您看到的问题


您正在使用线路
TIFR1 |=(1“我的目标是使LED以2 Hz的频率闪烁,打开0.5秒,关闭0.5秒。”你所描述的模式是1Hz,因为它每秒重复一次。只是一个旁注:只要你的AVR没有比忙着等待更好的事情要做,那就没什么错。这里没有效率低下这回事。@tofro好的一点……我只是知道作为一个新手程序员养成坏习惯是多么容易(我就是),所以在我的AVR确实需要做一些我想做的事情的情况下:)
if (TIFR1 & (1 << OCF1A))
{
    PORTD ^= (1 << PORTD6);
    TIFR1 |= (1 << OCF1A);
}