Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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 16 MHz ATmega8535上的1 MHz定时器_Timer_Avr_Atmel_Atmega - Fatal编程技术网

Timer 16 MHz ATmega8535上的1 MHz定时器

Timer 16 MHz ATmega8535上的1 MHz定时器,timer,avr,atmel,atmega,Timer,Avr,Atmel,Atmega,我似乎无法理解这一点,尽管我觉得这很容易。 我在我的Atmel ATmega8535中制作了很多定时器,但这一个正好击中了我。 还有,我看过很多计算之类的,但这并不是我想要的 很简单: 我的ATmega8535以16MHz的频率运行,我只需要一个1MHz的定时器,这样我就可以在1MHz的基础上输出一些引脚上的数据 那我该怎么做呢? 下面的计算听起来不错(找到了) 那么这将导致 void initTimer() { // 8 bit timer 2 setup TCCR2 = (1

我似乎无法理解这一点,尽管我觉得这很容易。 我在我的Atmel ATmega8535中制作了很多定时器,但这一个正好击中了我。 还有,我看过很多计算之类的,但这并不是我想要的

很简单:

我的ATmega8535以16MHz的频率运行,我只需要一个1MHz的定时器,这样我就可以在1MHz的基础上输出一些引脚上的数据

那我该怎么做呢? 下面的计算听起来不错(找到了)

那么这将导致

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)
}
void initTimer()
{
//8位定时器2设置

TCCR2=(1您在中断功能内执行的操作可能比中断之间的间隔时间长。当您在16 MHz设备上有1 MHz定时器时,定时器中断之间有16个时钟信号,这并不是做任何有意义的事情的全部时间

此外,调用中断函数的开销也很大(仅此一项就可能超过16个刻度,但我不知道)当中断函数中运行的代码占用的时间超过两次中断之间的时间间隔时,您基本上会将计时器频率降低一个未知量,并为主代码留出很少的CPU时间


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

我没有看到任何启动计时器的代码。你是指SEI();?完全正确,我忘了,我将编辑原始POST我不知道SEI是什么。但是您的示例似乎配置了两个中断,并设置了中断处理程序。但是那里没有实际初始化计时器状态并开始运行的代码。我添加了TCCR2,预分频器设置为1(无预分频)。这将开始计时谢谢你的正确答案。我在AVRStudio模拟器中也注意到了这一点。我想我必须找到另一种方法以较慢的速度输出数据。不过,我认为我的计算是正确的?:-)是的,定时器中断每16个时钟周期调用一次。在16 MHz设备上,这意味着16 MHz/16=1 MHz定时器频率。
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)
}