我尝试切换Arduino nano ATmega328P上的LED失败。
(计时器0是8bit
计时器)
我设法用Timer 1
执行它
代码为from here。
#define ledPin 13
void setup() {
pinMode(ledPin, OUTPUT);
cli(); // disable interrupts
TCCR0A = 0;
TCCR0B = 0;
TCCR0B |= (1 << CS02 | 1 << CS00); //clkI/O/1024
TIMSK0 = 0;
TIMSK0 |= (1 << TOIE0); // Overflow Interrupt Enable
TCNT0 = 0;
sei(); // enable interrupts
Serial.begin(9600);
}
ISR(TIM0_OVF_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
void loop() {
}
我还试图将中断向量更改为:TIMER0_OVF_vect
并收到此错误:
Arduino: 1.8.9 (Windows 10), Board: "Arduino Nano, ATmega328P (Old Bootloader)"
wiring.c.o (symbol from plugin): In function `__vector_16':
(.text+0x0): multiple definition of `__vector_16'
sketch\tests.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino Nano.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
我希望LED切换。
答案 0 :(得分:2)
您的第一段代码为:
ISR(TIM0_OVF_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
具有错误的ISR名称。 TIM0_OVF_vect
仅对某些ATtiny微控制器有效。您可以找到完整的中断列表以及here与哪些控制器一起使用。
然后,您尝试将其更改为使用对ATMEGA328P有效的TIMER0_OVF_vect
,但是您不能在Arduino上使用它,因为Arduino ATMEGA328P的构建将Timer0
用于millis()
和相关的定时。这就是为什么出现multiple definition of
错误的原因-链接器告诉您程序定义了两个TIMER0_OVF_vect
ISR(一个是您的草图,一个是connection.c)。
Timer2
默认情况下不使用,因此您应该可以使用它。唯一使用Timer2
的默认Arduino库是Tone
库。