Probleme beim Implementieren mehrerer Liberys

Hallo,

ich bin recht neu im Forum und beim Arduino basteln generell, daher entschuldige ich mich für eine, vielleicht dumme, Frage.

Ich versuche gerade mehrere Sketche, die für sch genommen auch super funktionieren in einem kleinen Roboter u vereinen.

Jetzt habe ich folgendes Problem:

ich verwende für den Ultraschallsensor diese Bibliothek :

#include <NewPing.h>

jetzt soll nich ein IR Modul dazu, dafür zieht sich das Arduino Programm diese:

#include <boarddefs.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <IRremote.h>
#include <IRremoteInt.h>

beim Kompilieren kommt nun immer dieser Fehler :

multiple definition of `__vector_7'

und zwar steht bezogen auf die zweite Libero im Code.

Steht erst die IR.h , ist newPing.h schuld und setzte ich NewPing.h ÜBER die IRremote.h, dann gilt der Fehler eben Ihr.

Was kann ich da machen?
Gibt es andere Bibliotheken, die ich nutzen kann oder muss ich die Umschreiben und wenn ja, wie?

bin für jede Hilfe dankbar.

Gruß,
Coffee

pS:
der ganze Fehlertext:

Arduino: 1.8.13 Hourly Build 2020/04/27 05:12 (Mac OS X), Board: "Arduino Uno"

libraries/NewPing/NewPing.cpp.o (symbol from plugin): In function NewPing::timer_ms_cntdwn()': (.text+0x0): multiple definition of __vector_7'
libraries/IRremote-2.2.3/IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino Uno.

Poste einfach mal die Links der verwendeten Libraries.
Für den US-Sensor benötigst du nicht unbedingt eine Library, das geht auch ohne.

Und poste bitte Sketch und Fehlermeldungen in Code-Tags.
Dann sind diese besser lesbar.

multiple definition of `__vector_7'

Erstens:
Glaube der Meldung.

Zweitens:
Es sind sogar die Zeilennummern und Dateien angegeben. So dass du problemlos nachschauen kannst, wie der Interruptvektor im Klartext heißt.

Grundsätzlich:
Interruptvektoren und die damit zusammenhängende Hardware kann man nur einmal nutzen!

Tipp:
Den __vector_7 findest du im Datenblatt deines geheimen µC beschrieben.

Ich behaupte:
Beide Libraries nutzen den gleichen Timer.
Und das geht eben nicht.

Tipp:
Den __vector_7 findest du im Datenblatt deines geheimen µC beschrieben.

So geheim ist der allerdings nicht.

Steht in der Fehlermeldung.

Ja, dann ist ja schon eins der Teilprobleme gelöst.

combie:
Tipp:
Den __vector_7 findest du im Datenblatt deines geheimen µC beschrieben.

Ich habe es mal versucht und war leider nicht erfolgreich, weder im Datenblatt, noch in den Bibliotheksdateien. Hast Du ein anderes geheimes Datenblatt?

http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

Tabelle: 11.1 Interrupt Vectors in ATmega328P
Auf Seite 49
Dummer weise beginnt sie mit Resetvector ==1, statt 0 wie es sein sollte.
Also einmal -1 rechnen

Zweite Quelle: Die iom328p.h in deinem Toolchain Ordner.

#define TIMER2_COMPA_vect_num 7
#define TIMER2_COMPA_vect _VECTOR(7) /* Timer/Counter2 Compare Match A */

Das ist die Wahrheit, die der Compiler vorfindet und so nutzt.

Leider gibts auch verwirrende Quellen: AVR Interrupt Vectors
Da eben auch -1
(vermutlich aus dem Datenblatt abgetippt, ohne zu prüfen/verstehen)

Wie auch immer.....
Es lässt sich auch der Startupcode des AVR - GCC untersuchen.
Damit bekommt man das Nummerierungsproblem in den Griff, bzw. vorgeführt
http://svn.savannah.gnu.org/viewvc/avr-libc/trunk/avr-libc/crt1/gcrt1.S?revision=2519&view=markup

Da sieht man zumindest, dass der Resetvector " XJMP __init " eben der Eintrag 0 und nicht 1 in der Sprungtabelle ist.

Auch evtl am Rande interessant: avr-libc: <avr/interrupt.h>: Interrupts

Testprogramm:

int main() 
{
}

ISR(TIMER2_COMPA_vect)
{
}

Auszug aus dem Kompilat:

Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 34 00 	jmp	0x68	; 0x68 <__ctors_end>
   4:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
   8:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
   c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  10:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  14:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  18:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  1c:	0c 94 40 00 	jmp	0x80	; 0x80 <__vector_7>
  20:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  24:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  28:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  2c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  30:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  34:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  38:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  3c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  40:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  44:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  48:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  4c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  50:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  54:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  58:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  5c:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  60:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>
  64:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__bad_interrupt>

combie:
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

Tabelle: 11.1 Interrupt Vectors in ATmega328P
Auf Seite 49
Dummer weise beginnt sie mit Resetvector ==1, statt 0 wie es sein sollte.
Also einmal -1 rechnen

Ich hoffe, Du hast den Fehler erst gerade eben bemerkt, denn sonst hättest Du mich ja auf ein Datenblatt losgelassen, ohne auf den Fehler hinzuweisen. Denn WDT machte für mich keinen Sinn.

Den Rest schaue ich mir noch in Ruhe an.

@coffeeuser: Bei IRremote kann man den Timer wechseln und damit womöglich einem Konflikt aus dem Weg gehen. Siehe README.md.

Naja...
Die Tabelle im Datenblatt war mir schon bekannt.
Der Versatz eigentlich auch, nicht präsent, aber bekannt.
Habe aber bisher fast nur mit den Klarnamen gearbeitet.
Und nie mit der Tabelle im Datenblatt.

Ob es ein Fehler ist?
Das weiß ich nicht wirklich.
Scheint mir eher eine Nummerierte Liste zu sein.
Unglücklich nummeriert.

Auf jeden Fall ist iom328p.h die Wahrheit.
An der orientiere ich mich.
Das solltest auch du tun, denn diese bildet die Realität des Kompilers ab.
Die ISR Bezeichner sind im Laufe der Zeit öfter mal umbenannt worden. Doof, aber ist so.

Tipp:
Immer wachsam sein!
Und nicht die eigenen grauen Zellen abschalten, nur weil man eine Tabelle im Datenblatt findet.

combie:
Tipp:
Immer wachsam sein!
Und nicht die eigenen grauen Zellen abschalten, nur weil man eine Tabelle im Datenblatt findet.

Danke für den Tipp, aber den Ausschalter meiner grauen Zellen habe ich noch nicht gefunden, die generieren ständig Gedanken. Die Beschäftigung mit Arduino hat für mich mehrere Aspekte, auch das Wachhalten eben jener Zellen.

Es ist eher der Konflikt, wie sehr ich mich mit Details beschäftige und mich ggf. darin verliere, oder doch lieber an einer neuen LED-Animation probiere. Ein ewiger Kampf in meinem Innern.

Die Fehlermeldung lautet "multiple definition of `__vector_7'", weshalb ich den Text "__vector_7" in Dateien gesucht habe. Leider habe ich nur *.o-Dateien gefunden, deren Inhalt sich mir leider verschließt. Wie komme ich also von der Fehlermeldung, die mir ja helfen soll, auf "Timer/Counter2 Compare Match A"? Welchem Gedankengang der Programmierer von C++ und/oder der Arduino-IDE kann ich gerade nicht folgen?

#6 habe ich noch nicht komplett durchgearbeitet, sollte sich die Antwort dort verbergen :-[

Die Fehlermeldung lautet "multiple definition of `__vector_7'", weshalb ich den Text "__vector_7" in Dateien gesucht habe. Leider habe ich nur *.o-Dateien gefunden, deren Inhalt sich mir leider verschließt. Wie komme ich also von der Fehlermeldung, die mir ja helfen soll, auf "Timer/Counter2 Compare Match A"? Welchem Gedankengang der Programmierer von C++ und/oder der Arduino-IDE kann ich gerade nicht folgen?

Wenn du in den build Ordner schaust, findest du einen preproc Ordner.
Darin den Sketch NACH dem Präprozessor.

Mein Beispielcode aus #6 führt zu diesem:

# 1 "E:\\Programme\\arduino\\portable\\sketchbook\\sketch_jun09c\\sketch_jun09c.ino"


int main()
{
}


# 7 "E:\\Programme\\arduino\\portable\\sketchbook\\sketch_jun09c\\sketch_jun09c.ino" 3
extern "C" void __vector_7 /* Timer/Counter2 Compare Match A */ (void) __attribute__ ((__signal__,__used__, __externally_visible__)) ; void __vector_7 /* Timer/Counter2 Compare Match A */ (void)

# 8 "E:\\Programme\\arduino\\portable\\sketchbook\\sketch_jun09c\\sketch_jun09c.ino"
{
}

combie:
Wenn du in den build Ordner schaust, findest du einen preproc Ordner.
Darin den Sketch NACH dem Präprozessor.

Nun leuchtet es, zumindest etwas heller, denn in dem Bereich hatte ich nicht gesucht. Auch den Hinweis auf den Timer kann man dort entnehmen.

Danke!

OK, Wow ... hier wurde ja viel geschrieben.

vielen Dank für die Hilfe. Ich merke einfach, dass ich noch lange nicht tief genug drinstecke um all eure Ansätze voll nachvollziehen zu können. :confused:

Aber, ja. es lag am Reimer der US Sensor Library. Hab die entsprechende Passage aaskommentiert. nun scheinen beide gut zu laufen.
Hatte das wenig später in nem englischen Thread gelesen.
Tut mir leid, hätte hier eher wieder reingucken sollen.

Vielen Dank, aber nochmal.
ich versuche gerade euere Lösungsansätze auch nochmal nach zu vollziehen.

grüß,
Coffee

Danke für die Rückmeldung!