Проблема с переключателем на Arduino nano Atmega328P с прерыванием по таймеру / счетчику0 - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь переключить светодиод на Arduino nano ATmega328P, но безуспешно. (Таймер 0 равен 8bit таймер)

Мне удалось выполнить это с Timer 1 с кодом отсюда .

#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.

Я ожидаю, что светодиод переключится.

1 Ответ

2 голосов
/ 24 июня 2019

Ваш первый блок кода с:

ISR(TIM0_OVF_vect) {
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}

имеет неправильное имя ISR. TIM0_OVF_vect действительно только для некоторых микроконтроллеров ATtiny. Вы можете найти полный список прерываний и какие контроллеры они используют с здесь .

Затем вы попытались изменить его на использование TIMER0_OVF_vect, которое действительно для ATMEGA328P, но вы не можете использовать это с Arduino, потому что сборки Arduino ATMEGA328P используют Timer0 для millis() и связанных с ними временных параметров. Вот почему вы получаете ошибку multiple definition of - компоновщик сообщает вам, что в вашей программе определены два TIMER0_OVF_vect ISR (один в вашем эскизе, другой в wiring.c).

Timer2 не используется по умолчанию, поэтому вы можете использовать его вместо этого. Единственная библиотека Arduino по умолчанию, которая использовала Timer2, - это библиотека Tone.

...