#include <avr/io.h>
#include <avr/interrupt.h>
void delay() {
volatile uint16_t i;
for (i=1e6; i; i--);
}
int main(void) {
DDRB = 255;
/* sei(); */
while (1) {
PORTB ^= 1;
delay();
}
}
上述程序闪烁LED。如果sei();
取消注释,则不会。我还没有启用任何中断源,数据表说它们默认情况下全部关闭,而引导加载程序(Caterina)确实使用TIMER1_COMPA,它会在运行我的代码之前再将其关闭。
似乎它可能无法调用未定义的中断处理程序。但我很困惑为什么它不会眨眼。
这里发生了什么?
答案 0 :(得分:3)
关闭引导加载程序[1],启用USB控制器并产生中断。
添加一个空的ISR(USB_GEN_vect)
修复了挂起但产生了大幅减速的眨眼,可能是由于ISR实际上没有对导致中断的条件做任何事情,因此被重复调用。
在USBCON = 0;
正常工作之前添加sei();
。
[1] Caterina,如上所述。引导加载程序的代码位于https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/bootloaders/caterina/
答案 1 :(得分:0)
如果LED保持亮起,则可能是看门狗定时器中断。在发生眨眼之前,你的micro会重新启动。我记得,它可能是使用熔丝位启用/禁用的。