问题描述
我正在尝试让我的 Arduino Uno R3 上的两个 LED 闪烁(用于学习目的)。我使用 avr-gcc 和 avrdude 来编译和加载我的程序。
我在 main 的 while 循环中使第一个闪烁。我正在尝试使用 Timer0 打开和关闭第二个。
首先,有效的代码:
#include <avr/io.h>
#include <util/delay.h>
int main() {
TCCR0B |= (1 << CS02) | (1 << CS00);
TimsK0 |= (1 << TOIE0);
DDRD = 1 << PD3;
DDRB = 1 << PB5;
PORTB = 0;
while(1) {
PORTD ^= 1 << PD3;
_delay_ms(500);
}
return 0;
}
正如预期的那样,此代码使我的 LED 闪烁,并且每秒重新开始。我也在设置(但不使用)第二个 LED 和计时器。
...
#include <avr/interrupt.h>
volatile uint8_t intrs;
ISR(TIMER0_OVF_vect) {
if (++intrs >= 62) { // meant to execute every second
PORTB ^= (1 << PB5);
intrs = 0;
}
}
int main() {
intrs = 0;
... // old setup
sei();
while(1) { ... }
}
现在,没有一个 LED 闪烁。更奇怪的是,当我删除 sei()
时,它们都不眨眼。我发现让第一个 LED 再次闪烁的唯一方法是注释掉 ISR
声明或将其标记为 ISR_NAKED
。
那么,是什么?
PS:我使用 makefile 来编译和加载。当我运行它时,它看起来像这样:
$ make
avr-gcc -c -Os -DF_cpu=16000000UL -mmcu=atmega328p -Wall -Wextra main.c
avr-gcc -o prog.elf main.o
avr-objcopy -O ihex -R .eeprom prog.elf prog.hex
avrdude -C/etc/avrdude.conf -v -V -carduino -patmega328p -P/dev/ttyACM0 -b115200 -D -Uflash:w:prog.hex
.. # avrdude logs
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)