带有 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 库。