Arduino IDE с ошибкой ATtiny85 «множественное определение `__vector_5»

У меня возникла проблема с компиляцией кода для моей схемы ATtiny85.

Я использую timer/counter0 в обычном режиме, поэтому при его переполнении срабатывает ISR TIMER0_OVF_vect. Когда у меня есть этот ISR в моем коде, он не компилируется и выдает эту ошибку:

wiring.c.o (symbol from plugin): In function `__vector_5':
(.text+0x0): multiple definition of `__vector_5'
sketch\Glove_heater_v1.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 ATtiny25/45/85.

Может быть, мне просто нужно использовать другое имя для ISR?

My Code:

//Красный светодиод на PB0
//Синий светодиод на PB1
//Кнопка PB2
// Делитель напряжения батареи PB3
//Управление МОП-транзистором PB4

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile uint8_t checkVoltage = 0;

void setup() {

   DDRB = 0b0010011; //установить PB0,PB1,PB4 как выход, PB2,PB3 как вход
   PORTB = 0b00000011; // устанавливаем PB0, PB1 HIGH, чтобы светодиоды были выключены, а остальные контакты были LOW

   //Настройка TC0 для триггера прерывания по переполнению
   TCCR0B |= 0b00000101; //clk/1024 прескалер
   TIMSK |= 0b00000010;  //установить TOIE0 для разрешения прерывания от переполнения
   sei();
}

void loop() { // ничего не делаем в этом тестовом коде

}

ISR(TIMER0_OVF_vect){ //Таймер/счетчик 0 прерывает проверку напряжения
   checkVoltage = 1;
}

Любые идеи приветствуются!

, 👍2

Обсуждение

Arduino использует его для подсчета миллисекунд., @KIIV


1 ответ


Лучший ответ:

2

Сообщение об ошибке:

wiring.co [...]: несколько определений `__vector_5'
Glove_heater_v1.ino.cpp.o [...]: впервые определено здесь

__vector_5 равно TIMER0_OVF_vect. Итак, у вас есть одно определение этого ISR в вашем скетче и еще один в проводке.c. Эта проводка.c является частью ядра Ардуино. Как пишет КИЕВ в комментарии, он использует TIMER0_OVF_vect для учета времени (millis(), micros() и delay()).

У вас есть два варианта решения этой проблемы:

  • вы можете использовать другой таймер (Таймер 1) в своем скетче и оставить Таймер 0 для ядра Arduino
  • поскольку вы все равно не используете ядро Arduino, вы можете избавиться от него просто определив main() в вашем скетче вместо setup() и петля().
,

Ах, я вижу, большое спасибо за объяснение. В финальном коде используются оба таймера, поэтому в данном случае я не буду использовать ядро Arduino., @Eric Navarrete