Adafruit Feather 32u4 сервопривод

Я пытаюсь реализовать проект, в котором я использую feather 32u4 для управления сервоприводом. Он управляется с помощью кнопок на прикрепленном oled-оперении, чтобы установить сервопривод на 3 различных значения. Код, который был предоставлен мне, выдает ошибку для этой платы. После возни с аналогичным кодом, похоже, что оператор #include <Servo.h><Servo.h> выдает ошибку. В сообщениях также есть примечание о Wire.h, но это, похоже, не будет проблемой в любое другое время.

Сообщения об ошибках выглядят следующим образом:

Arduino: 1.6.13 (Mac OS X), Board: "Adafruit Feather 32u4"

libraries/Servo/avr/Servo.cpp.o (symbol from plugin): In function `ServoCount':
(.text+0x0): multiple definition of `__vector_17'
libraries/RadioHead-master/RH_ASK.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
Multiple libraries were found for "Wire.h"
 Used: /Users/bsd194.lab102/Library/Arduino15/packages/adafruit/hardware/avr/1.4.13/libraries/Wire
 Not used: /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/Wire
exit status 1
Error compiling for board Adafruit Feather 32u4.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Я бы прикрепил код, но я не знаю, как его опубликовать, чтобы он не выглядел странно.

, 👍2

Обсуждение

добавьте код ... используйте кнопку " {}", чтобы отформатировать его ... вы также можете отформатировать код, добавив три обратные метки `` в строке перед кодом и в строке после кода ... проголосуйте за то, чтобы ваш код был читабельным, @jsotola


1 ответ


1

Множественное определение сообщения __vector_17 означает, что в вашем коде вектор 17 прерывания определен несколько раз. Часто это происходит, потому что 2 используемые библиотеки используют одни и те же аппаратные периферийные устройства, такие как таймеры. Только одна библиотека может настраивать и использовать оборудование. Если вы попытаетесь это сделать, вы получите ошибку компилятора.

На Atmega32u4 прерывание с номером 17-это заголовок TIMER1 (Прерывание захвата Timer1)(см. Таблицу данных Atmega32u4, глава "Прерывания"). В сообщении об ошибке говорится, что библиотека Servo и библиотека RadioHead определяют это прерывание. Они оба пытаются использовать аппаратный Таймер1.

Следствием этого является то, что вы не можете просто использовать эти две библиотеки вместе. Так что же делать? Это может стать довольно трудным делом. Вы можете изменить одну из библиотек, чтобы использовать другой таймер (Atmega32u4 имеет 4 таймера). Это может повлечь за собой значительные изменения (в основном изменение имен регистров, но иногда и более сложные изменения, если новый таймер не того же типа). Некоторые библиотеки напрямую предоставляют возможность использовать другой таймер, но большинство этого не делает. К счастью для вас, библиотека RadioHead предоставляет простой способ изменить используемый таймер на Timer2, но вы не можете просто сделать это, так как на 32u4 следующим 16-битным таймером является Timer3. В этой теме форума Adafruit упоминается, как установить библиотеку RadioHead для Timer2 (раскомментировав определение RH_ASK_ARDUINO_USE_TIMER2 в RH_ASK.cpp) и дайте подсказку о том, как затем перейти на Timer3: Эффективно изменив все 2секунды в регистре таймера и имена битов на 3секунды. Чтобы быть уверенным, пожалуйста, каждый раз проверяйте, действительно ли существуют соответствующие имена регистров/битов (вы можете увидеть это в описаниях регистров в таблице данных).

,