PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compilerfehler mit CTC Timer, Arduino Mega.



Badenser
29.11.2016, 16:34
Hallo Leute,

ich bin gerade dabei für eine Robotersteuerung einen Timer in meinen Scetch zu Integrieren.
Als Vorlage habe ich die Anleitung von Heise unter: https://www.heise.de/developer/artikel/Timer-Counter-und-Interrupts-3273309.html verwendet.
Da Timer 1 der im Heise Beispiel scheinbar von der Servo Library benötigt wird, verwende ich Timer 3.
Die Version mit dem Überlauf eines Timer-Registers funktioniert einwandfrei.
Hier der Code:

void setup()
{
....
noInterrupts();
// Gem Heise:

TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 34286;
TCCR3B |= (1 << CS12) | (1 << CS10);
TIMSK3 = (1 << TOIE3);

interrupts();
....
}

ISR(TIMER3_OVF_vect)
{
TCNT3 = 34286;
....
}

Verwende ich aber die CTC (Clear Timer on Compare Match) Methode,
Hier der Code:

void setup()
{
....
noInterrupts();
// Gem Heise:
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
OCR3A = 32150;
TCCR3B |= (1 << CS12) | (1 << CS10);
TIMSK3 = (1 << OCIE3A);

interrupts(); // Alle Interrupts aktivieren
....
}
ISR(TIMER3_COMPA_vect)
{
....
}

.. bekomme ich die folgende Fehlermeldung:

Kompiliere ... Fertig!
Kompiliert um: 16:19:18

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_32'

sketch\Robot_2016_1_6.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

collect2.exe: error: ld returned 1 exit status

Mehrere Bibliotheken wurden für "IRremote.h" gefunden
Benutzt: C:\Users\klaus\Documents\Arduino\libraries\IRremot e
Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\RobotIRremote
exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Mega or Mega 2560.

Kann mir jemand Erklären was da los ist?

Grüsse Klaus

Sisor
29.11.2016, 17:16
1. Du hast die Bibliothek 2 mal auf dem Rechner. Das ist nicht schlimm, aber es wird beim Kompilieren immer eine Meldung ausgegeben, welche Bibliothek benutzt wurde.

2. In der Servo-Bibliothek wird ISR(TIMER3_COMPA_vect) [Servo.cpp, Zeile 86ff] bereits definiert. Dann versuchst du es im Sketch ein zweites mal zu definieren, was nicht erlaubt ist.
Die Servo-Bibliothek verwendet je nach Prozessor unterschiedliche und unterschiedlich viele Timer [siehe:ServoTimers.h, Zeile 34ff]. Die Bibliothek findest du unter: C:\Program Files (x86)\Arduino\libraries\Servo\src\avr.
Wenn du es dir leicht machen willst, erweiterst du die Zeile #include <Servo.h> in deinem Sketch so:

#undef __AVR_ATmega2560__
#include <Servo.h>
#define __AVR_ATmega2560__
Dann wird nur Timer1 benutzt und es können maximal 12 Servos verwendet werden.

Badenser
29.11.2016, 18:02
Danke für den Tip!
Gruß Klaus