Timer 在ATMEGA128L中错误执行计时器0 isr

Timer 在ATMEGA128L中错误执行计时器0 isr,timer,embedded,atmel,isr,Timer,Embedded,Atmel,Isr,我有一个atmega128L的开发板。我已将其计时器1配置为CTC模式,将计时器0配置为溢出模式,并启用两个计时器的中断。 我的CPU时钟频率是8Mhz。我为两个计时器使用了两个计数器变量,它将跟踪两个计时器执行isr的次数,并基于此在主代码中执行操作。根据我正在比较计时器0的计数器变量的值,它应该每16秒采取一次操作。但它每4秒就会采取一次行动。我已经尝试了不同的预分频器,我已经能够成功地为timer1采取行动。保险丝字节设置为高:1F、低:E4、扩展:FF我已附上代码的相关部分供参考: in

我有一个atmega128L的开发板。我已将其计时器1配置为CTC模式,将计时器0配置为溢出模式,并启用两个计时器的中断。 我的CPU时钟频率是8Mhz。我为两个计时器使用了两个计数器变量,它将跟踪两个计时器执行isr的次数,并基于此在主代码中执行操作。根据我正在比较计时器0的计数器变量的值,它应该每16秒采取一次操作。但它每4秒就会采取一次行动。我已经尝试了不同的预分频器,我已经能够成功地为timer1采取行动。保险丝字节设置为高:1F、低:E4、扩展:FF我已附上代码的相关部分供参考:

int main()
{
    cli();
    timer1_init();
    timer0_init();
    sei();

    while (1) 
    {   
        if(meter_interrupt_flag==1)
        {
            meter_interrupt_flag=0;
            transmitData(meter_interrupt_msg,strlen(meter_interrupt_msg));    
            //send some string "reading meter"

        }
        if(connection_interrupt_flag==1);
        {
            connection_interrupt_flag=0;
            checkNetworkConnection();
            transmitData(connection_interrupt_msg,strlen(connection_interrupt_msg));
            //send some string "connection interrupt"
        }
    }   
}

void timer1_init(void)
{
    overflow_counter=0;

    // set up timer with prescaler = 1024
    TCCR1B |= (1 << CS12) |(1 << CS10) | (1 << WGM12);

    // initialize counter
    TCNT1 = 0;
    OCR1A = 39062;
    TIMSK |= (1 << OCIE1A);
}

void timer0_init(void)
{
    overflow_counter_3=0;

    TCCR0 |= (1 << CS02) |(1 << CS01);        //prescalar 256
    TCNT0 = 0;
    TIMSK |= (1 << TOIE0);
}
ISR(TIMER1_COMPA_vect)
{
    overflow_counter++;

    if(overflow_counter>=12)
    {
        meter_interrupt_flag=1;
        overflow_counter=0;
    }
}

ISR(TIMER0_OVF_vect)
{
    overflow_counter_3++;
    if(overflow_counter_3>=4000)
    {
        connection_interrupt_flag=1;
        overflow_counter_3=0;
    }
}