带有 timer/counter0 中断的 Arduino nano Atmega328P 上的切换问题
Problem with toggle led on Arduino nano Atmega328P with timer/counter0 interrupt
我尝试切换 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 能切换。
你的第一个代码块:
ISR(TIM0_OVF_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
有错误的 ISR 名称。 TIM0_OVF_vect
仅对某些 ATtiny 微控制器有效。您可以找到完整的中断列表以及它们与 here.
一起使用的控制器
然后您尝试将其更改为使用 TIMER0_OVF_vect
,这对 ATMEGA328P 有效,但您不能将其与 Arduino 一起使用,因为 Arduino ATMEGA328P 构建使用 Timer0
作为 millis()
及相关时序。这就是您收到 multiple definition of
错误的原因 - 链接器告诉您您的程序定义了两个 TIMER0_OVF_vect
ISR(一个由您的草图定义,一个在 wiring.c 中)。
默认情况下不使用 Timer2
,因此您应该可以使用它。使用 Timer2
的唯一默认 Arduino 库是 Tone
库。
我尝试切换 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 能切换。
你的第一个代码块:
ISR(TIM0_OVF_vect) {
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
有错误的 ISR 名称。 TIM0_OVF_vect
仅对某些 ATtiny 微控制器有效。您可以找到完整的中断列表以及它们与 here.
然后您尝试将其更改为使用 TIMER0_OVF_vect
,这对 ATMEGA328P 有效,但您不能将其与 Arduino 一起使用,因为 Arduino ATMEGA328P 构建使用 Timer0
作为 millis()
及相关时序。这就是您收到 multiple definition of
错误的原因 - 链接器告诉您您的程序定义了两个 TIMER0_OVF_vect
ISR(一个由您的草图定义,一个在 wiring.c 中)。
Timer2
,因此您应该可以使用它。使用 Timer2
的唯一默认 Arduino 库是 Tone
库。