Arduino伺服库冲突
Arduino servo library conflict
在我的代码中,我只使用了 LiquidCrystal 库和 Servo 库。当我尝试编译代码时出现以下错误
Servo/Servo.cpp.o: In function `Servo::attached()':
/usr/share/arduino/libraries/Servo/Servo.cpp:336: multiple definition of `__vector_42'
robot_v2.cpp.o:/usr/share/arduino/robot_v2.ino:662: first defined here
/usr/lib/gcc/avr/5.4.0/../../../avr/bin/ld: Disabling relaxation: it will not work with multiple definitions
Servo/Servo.cpp.o: In function `Servo::attached()':
/usr/share/arduino/libraries/Servo/Servo.cpp:336: multiple definition of `__vector_47'
robot_v2.cpp.o:/usr/share/arduino/robot_v2.ino:662: first defined here
collect2: error: ld returned 1 exit status
除了上面提到的库,我使用了一个 16 位定时器如下。
DDRC |= B01010101;
......
cli();
TCCR4A = 0;
TCCR4B = 0;
TCCR5A = 0;
TCCR5B = 0;
OCR4A = l_target;
OCR5A = l_target;
TCCR4B = _BV(WGM42) | _BV(CS41);
TCCR5B = _BV(WGM52) | _BV(CS51);
TIMSK4 |= (1 << OCIE4A);
TIMSK5 |= (1 << OCIE5A);
sei();
让我知道我做错了什么以及如何解决这个问题?除了 arduino 的标准伺服库之外,还有其他库吗?我正在使用 Arduino Mega 开发板。
这是 ISR。
ISR(TIMER4_COMPA_vect)
{
if (OCR4A != l_target) {
OCR4A = l_target;
}
PORTC ^= B00000001;
}
ISR(TIMER5_COMPA_vect)
{
if (OCR5A != r_target) {
OCR5A = r_target;
}
PORTC ^= B00010000;
}
我从伺服库中找到了相关代码。根据它使用 1,3,4 和 5 个定时器。所以,我不能将它们用于任何其他目的。我将不得不使用定时器 2 或任何其他解决方案。我正在回答我自己的问题,作为其他面临类似情况的人的参考。
// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
伺服库只在需要时分配定时器。每个计时器最多支持 12 个舵机,因此在 Mega 上,1 到 12 个舵机使用 timer5,13 到 24 也将使用 timer1,依此类推。分配顺序在文件ServoTimers.h中定义如下:timer5,timer1,timer3,timer4
假设您使用的舵机不超过 24 个,定时器 3 和 4 可用。如果将所有对定时器 5(TCCR5x、OCR5x、TIMSK5)的引用更改为定时器 3 TCCR3x、OCR3x、TIMSK3),则不应发生冲突。
在我的代码中,我只使用了 LiquidCrystal 库和 Servo 库。当我尝试编译代码时出现以下错误
Servo/Servo.cpp.o: In function `Servo::attached()':
/usr/share/arduino/libraries/Servo/Servo.cpp:336: multiple definition of `__vector_42'
robot_v2.cpp.o:/usr/share/arduino/robot_v2.ino:662: first defined here
/usr/lib/gcc/avr/5.4.0/../../../avr/bin/ld: Disabling relaxation: it will not work with multiple definitions
Servo/Servo.cpp.o: In function `Servo::attached()':
/usr/share/arduino/libraries/Servo/Servo.cpp:336: multiple definition of `__vector_47'
robot_v2.cpp.o:/usr/share/arduino/robot_v2.ino:662: first defined here
collect2: error: ld returned 1 exit status
除了上面提到的库,我使用了一个 16 位定时器如下。
DDRC |= B01010101;
......
cli();
TCCR4A = 0;
TCCR4B = 0;
TCCR5A = 0;
TCCR5B = 0;
OCR4A = l_target;
OCR5A = l_target;
TCCR4B = _BV(WGM42) | _BV(CS41);
TCCR5B = _BV(WGM52) | _BV(CS51);
TIMSK4 |= (1 << OCIE4A);
TIMSK5 |= (1 << OCIE5A);
sei();
让我知道我做错了什么以及如何解决这个问题?除了 arduino 的标准伺服库之外,还有其他库吗?我正在使用 Arduino Mega 开发板。
这是 ISR。
ISR(TIMER4_COMPA_vect)
{
if (OCR4A != l_target) {
OCR4A = l_target;
}
PORTC ^= B00000001;
}
ISR(TIMER5_COMPA_vect)
{
if (OCR5A != r_target) {
OCR5A = r_target;
}
PORTC ^= B00010000;
}
我从伺服库中找到了相关代码。根据它使用 1,3,4 和 5 个定时器。所以,我不能将它们用于任何其他目的。我将不得不使用定时器 2 或任何其他解决方案。我正在回答我自己的问题,作为其他面临类似情况的人的参考。
// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
伺服库只在需要时分配定时器。每个计时器最多支持 12 个舵机,因此在 Mega 上,1 到 12 个舵机使用 timer5,13 到 24 也将使用 timer1,依此类推。分配顺序在文件ServoTimers.h中定义如下:timer5,timer1,timer3,timer4
假设您使用的舵机不超过 24 个,定时器 3 和 4 可用。如果将所有对定时器 5(TCCR5x、OCR5x、TIMSK5)的引用更改为定时器 3 TCCR3x、OCR3x、TIMSK3),则不应发生冲突。