Мой код Arduino, но он не компилируется, я не могу найти, что с ним не так?

Я попробовал объединить ЖК-дисплей, ультразвуковые сенсоры, светодиоды и ИК-код приемника в один основной код. Отдельно они работают нормально, но когда я ставлю их вместе, это дает мне следующую ошибку: "Ошибка компиляции для платы Arduino/Genuino Mega или Mega 2560".

Полная ошибка при компиляции :

Arduino: 1.8.5 (Mac OS X), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':
(.text+0x0): multiple definition of `__vector_13'
libraries/IRremote/IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld: Disabling relaxation: it will not work with multiple definitions
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.

https://drive.google.com/file/d/1YNOqxE0mAZJsQrV7_zMbRZ_jkur19rXt/view?usp=sharing

, 👍-3

Обсуждение

вы пробовали добавлять два за раз, а не все или один подход - возможно, тогда *вы* сможете определить, какие два не сосуществуют (если все 6 комбинаций двух за раз всегда работают, то попробуйте 3 за раз) - по крайней мере, так я бы подошел проблема, если сообщения об ошибках не указывают на характер проблемы, @Jaromanda X

Вы должны опубликовать свой код, а также использовать правильное форматирование, иначе ваш вопрос будет закрыт очень быстро, @Roberto Lo Giacco

Я прикрепил Код к сообщению, @Jose Dlr

Ваш код должен быть вставлен в вопрос, ссылка на код может истечь. Если он слишком длинный для включения, то его следует сократить до [Минимального, полного и проверяемого примера](https://stackoverflow.com/help/mcve)., @Nick Gammon


1 ответ


1

Процессор имеет фиксированное количество аппаратных устройств, таких как таймеры и последовательные порты. Если две библиотеки попытаются использовать одно и то же устройство (в данном случае это выглядит как таймер 2), то вы не сможете скомпилировать (не говоря уже о запуске) код без решения проблемы. Возможно, один из них может быть изменен для использования другого таймера, однако это может быть нетривиально.

В качестве примера предположим, что у вас есть один будильник, но вы хотите, чтобы он звонил и в 5 утра, и в 7 утра.


Глядя на исходный код в (каталог установки)/hardware/tools/avr/avr/include/avriomxx0_1.h, я вижу, что вектор 13 действительно для таймера 2;

/* Timer/Counter2 Compare Match A */
#define TIMER2_COMPA_vect_num   13
#define TIMER2_COMPA_vect       _VECTOR(13)
#define SIG_OUTPUT_COMPARE2A        _VECTOR(13)
,

Это прерывание Timer2 с tone() и IRremote, как здесь: https://forum.arduino.cc/index.php?topic=120955.0, @Jot

Судя по таблице данных, _vector_13 - это "Запрос на прерывание смены вывода 2", так что это может быть как-то связано с прерываниями смены вывода. Я не смотрел на код, так как он не был опубликован выше., @Nick Gammon

Когда я использую менеджер библиотек и устанавливаю IRremote by shirriff, добавляю вызов tone() и компилирую его для mega 2560, то получаю ошибку __vector_13. Я не знаю, как векторное число 13 связано с Timer2, но это так., @Jot

Спасибо Джоту, я смог понять, что делать., @Jose Dlr

@Jot вы правы - я посмотрел это в источнике., @Nick Gammon