无法让计时器工作

时间:2015-06-18 08:03:51

标签: timer atmega

我在正常模式下为Atmega328编写了简单的计时器程序。但是如果我在Atmel Studio 6.2中编译代码,我就无法刷新LED。但是如果我在arduino IDE中编译,相同的代码工作正常。我已经为下面的Arduino以及Atmel Studio提供了代码。某处似乎有一个小问题。 F_CPU值有问题吗?

    // Code compiled using Atmel Studio:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define F_CPU 16000000
    unsigned char x=0;

    ISR(TIMER1_OVF_vect) {
        x=!x;
    }

    void setup() {
        DDRB=0x01;
        TIMSK1=0x01; // enabled global and timer overflow interrupt;
        TCCR1A = 0x00; // normal operation page 148 (mode0);
        TCNT1=0x0000; // 16bit counter register
        TCCR1B = 0x04; // start timer/ set clock
    };


    int main (void) 
    {
        setup();
        while(1)
        {
            PORTB= x;
        }
        return(0);
    }

使用Arduino IDE编写的代码:

#define LED 8
boolean x=false;

ISR(TIMER1_OVF_vect) {
x=!x;
}

void setup() {
pinMode(LED, OUTPUT);
TIMSK1=0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation page 148 (mode0);
TCNT1=0x0000; // 16bit counter register
TCCR1B = 0x04; // start timer/ set clock
};

void loop() {
PORTB= x;
}

1 个答案:

答案 0 :(得分:1)

使用中断时,需要同时启用全局中断(在定时器寄存器中)和本地中断(在状态寄存器中),以便触发中断向量。

这可以通过在准备好接收本地中断时调用sei()(设置启用中断)来完成。通常,您希望在设置全局中断后,在setup方法的末尾附近执行此操作。

我怀疑在使用Arduino IDE时会自动启用中断。