在带有计时器/计数器0中断的Arduino nano Atmega328P上导致切换的问题

时间:2019-06-22 18:27:50

标签: timer arduino interrupt atmega microchip

我尝试切换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切换。

1 个答案:

答案 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库。