ATmega32u4定时器3溢出不起作用

时间:2019-03-15 11:50:12

标签: c

我在使用ATmega32u4时遇到了问题,在这里我可以成功使用定时器1溢出,但是当我尝试将代码重新用于定时器3时,它不起作用。

以下代码在定时器1(16位)溢出时打开和关闭LED(在b7引脚上)。可以。

#include  <avr/io.h>
#include  <avr/interrupt.h>

int main (void) { 

    DDRB |= (1<<7);; //PortB Output 
    PORTB = 0x00; //PortB All LEDs off

    TCCR1B |= (1<<CS10) | (1<<CS12); //Set Prescaler to 1024

    TIMSK1 |= (1<<TOIE1); //Enable Timer Overflowinterrupt 
    sei(); //Enable Interrupts 

    while(1); 

    return 0; 
} 

ISR(TIMER1_OVF_vect) 
{ 

    PORTB ^= (1<<7); //toggle LED

}

下一个代码旨在使用计时器3执行相同的功能,但不起作用。

#include  <avr/io.h>
#include  <avr/interrupt.h>

int main (void) { 

    DDRB |= (1<<7);; //PortB Output 
    PORTB = 0x00; 

    TCCR3B |= (1<<CS30) | (1<<CS32); //Set prescaler to 1024

    TIMSK3 |= (1<<TOIE3); //Enable Timer Overflowinterrupt 
    sei(); //Enable Interrupts 

    while(1); 

    return 0; 
} 

ISR(TIMER3_OVF_vect) 
{ 

    PORTB ^= (1<<7);

}

最后一个代码块用于测试计时器3的计数值是否正在增加(不涉及中断)。 (我在此测试中使用了其他LED)

#include <avr/io.h>

int main()
{

    // Prescaler of 1024
    TCCR3B |= (1<<CS32)|(1<<CS30);

    // Initialize Counter
    TCNT3 = 0;

    // Initialize LED
    DDRE |= (1 << 6); // LED0

    // Infinite Loop
    while (1)
    {
        // Flash every 0.016 secs
        // COUNTER = 0.016 / (PRE SCALER / CPU FREQ)
        // 250
        if( TCNT3 >= 250 )
        {
            // Toggle LED
            PORTE ^= (1 << 6); // If output use PORT, If input use PIN

            TCNT3 = 0;
        }
    }
    return 0;
}

据此,我假设我在调用中断时做错了什么,我不确定是什么

1 个答案:

答案 0 :(得分:0)

我不确定您是使用LilyPad还是Leonardo。

我从上面的代码中假设它是LilyPad。将TCCR3B更改为256,然后查看它是否可以为您解决问题。

       TCCR3B = 0x0C; // prescaler = 256