Мой код 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
@Jose Dlr, 👍-3
Обсуждение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
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
вы пробовали добавлять два за раз, а не все или один подход - возможно, тогда *вы* сможете определить, какие два не сосуществуют (если все 6 комбинаций двух за раз всегда работают, то попробуйте 3 за раз) - по крайней мере, так я бы подошел проблема, если сообщения об ошибках не указывают на характер проблемы, @Jaromanda X
Вы должны опубликовать свой код, а также использовать правильное форматирование, иначе ваш вопрос будет закрыт очень быстро, @Roberto Lo Giacco
Я прикрепил Код к сообщению, @Jose Dlr
Ваш код должен быть вставлен в вопрос, ссылка на код может истечь. Если он слишком длинный для включения, то его следует сократить до [Минимального, полного и проверяемого примера](https://stackoverflow.com/help/mcve)., @Nick Gammon