我在正常模式下为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;
}
答案 0 :(得分:1)
使用中断时,需要同时启用全局中断(在定时器寄存器中)和本地中断(在状态寄存器中),以便触发中断向量。
这可以通过在准备好接收本地中断时调用sei()
(设置启用中断)来完成。通常,您希望在设置全局中断后,在setup
方法的末尾附近执行此操作。
我怀疑在使用Arduino IDE时会自动启用中断。