Fixen von inkompatiblen Bibliotheken

Hallo zusammen,

mir ist aufgefallen, das gewisse Bibliotheken untereinander inkompatibel zusammen sind.

Bei der IRremote.h, NewPing sind schon ein paar mal Fehler aufgetaucht die ich so nicht behoben bekommen habe. Aktuell ist der Fehler folgender.

Arduino: 1.8.12 (Windows 10), Board: "Arduino Uno"

Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':

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

libraries\IRremote\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino Uno.

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Ich habe mal google benutzt und scheinbar auch eine Lösung gefunden, die da lautet:

Comment line #326 to line #340 in NewPing.cpp file if not using ATmega* board.

   // #if defined (__AVR_ATmega32U4__) // Use Timer4 for ATmega32U4 (Teensy/Leonardo).
   // ISR(TIMER4_OVF_vect) {
   //    intFunc(); // Call wrapped function.
   // }
   // #elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega8535__) // Alternate timer commands for certain microcontrollers.
   // ISR(TIMER2_COMP_vect) {
   //    intFunc(); // Call wrapped function.
   // }
   // #elif defined (__arm__)
   //    // Do nothing...
   // #else
   // ISR(TIMER2_COMPA_vect) {
   //    intFunc(); // Call wrapped function.
   // }
   // #endif

Jetzt komme ich zu meiner grundsätzlichen Frage: Wo und Wie kann ich die Bibliotheken und dessen code einsehen bzw. wie und wo ändere ich die genannte Stelle? Habe ich bislang noch nicht gemacht und nicht gefunden.

Hintergrund ich möchte mit einen passiven Buzzer geräusche erzeugen. mit tone(8,100) anschließend tritt der oben genannte Fehler auf. Ist dann wohl darauf zurückzuführen das ich die IR Libary verwende und dort müsste ich ähnliches ändern. Was meint Ihr?

Und: Genauer unterschied passiver und aktiver Buzzer und dessen Einsatz? Ich benötige ein Alarmgeräusch, auch gut laut wenns geht.

Danke für eure Hilfe.

Wo und Wie kann ich die Bibliotheken und dessen code einsehen

Alle Bibliotheken liegen auf deinem Rechner.

Ausführliche Ausgaben aktivieren und aufmerksam lesen.
Dort zeigt es dir die Pfade der benutzten Libs.

bzw. wie und wo ändere ich die genannte Stelle?

Anleitung

`__vector_7'

Damit ist ein Interrupt Vector gemeint.

IRremote.h kannst du in einem der Header sagen welcher Timer verwendet werden soll

Arduino: 1.8.12 (Windows 10), Board: "Arduino Uno"

Wenn eine Library nicht zum Uno kompatibel wäre, sollte man das mitbekommen.

Comment line #326 to line #340 in NewPing.cpp file if not using ATmega* board.

... trifft bei dir also nicht zu.

Dass sich unterschiedliche Libraries ins Gehege kommen was Pins, Timer, etc. angeht, ist natürlich möglich, und evtl. behebbar, wie Serenifly schon angedeutet hat.

Ab Zeile 76:
https://github.com/z3t0/Arduino-IRremote/blob/master/boarddefs.h

Der UNO ist am Ende in Zeile 152f

Serenifly:
IRremote.h kannst du in einem der Header sagen welcher Timer verwendet werden soll

Wenn du mir verraten kannst, wie ich das im Header deklarieren kann, wäre ich dir sehr dankbar. Ich denk du meinst direkt im aktuellen Scatch um den es geht richtig?

Serenifly:
Ab Zeile 76:
https://github.com/z3t0/Arduino-IRremote/blob/master/boarddefs.h

Der UNO ist am Ende in Zeile 152f

Habe ich mir angesehen... Ist das eine geänderte IRemote.h? Wie kann ich denn die hier geänderte IRemote.h als eigene Bib hinzufügen? Oder sollte ich diese Datei austauschen?
Textdatei erstellen? Code reinposten? IRemote.h benennen und dann über das Bibliotheken Menü hinzufügen oder wie?

Was ich noch nicht verständlich finde ist diese Timer Pin Belegung 3 und 9... Was genau sagt tx = pin3 und tx = pin9 aus? Hat das irgendwas mit den physischen digitalen Pins auf dem Board zu tun? Wäre gut zu wissen... Weil digital Pin9 und 3 werden sicherlich für andere Komponenten benutzt.

Danke für die Ausführungen und eure Hilfe.

tx = transmitt. Das ist der Sende-Pin. Siehe auch die serielle Schnittstelle. Gleiche Terminologie mit TX und RX

Du musst nur ändern welche Zeile auskommentiert ist. In deiner lokalen Version der Datei (wahrscheinlich im User Ordner). Das sollte doch selbst-erklärend sein. Es steht sogar dort:

// Uncomment the timer you wish to use on your board.

Der Timer der nicht auskommentiert ist wird verwendet. Sieht man auch am Namen der Konstante

Ah, danke schonmal für den Background.

Ich benötige leider doch noch etwas Hilfe. Ich habe den ausführlichen Bericht aktiviert. So auch entsprechend den Ort der Libary gefunden. Dort folgende Dateien geöffnet:

IRremote.cpp
IRremote.h
IRremoteInt.h

allerdings finde ich in keiner Datei die entsprechende Stelle, wo der Timer um bzw auskommentiert werden soll. Hab dich doch richtig verstanden, das ich dir original Datei abändern soll oder soll ich die verlinkte modifizierte IRremote.h austauschen?

Danke nochmals für weitere Ausführungen.

(Nach ein wenig frickeln sollte ich das dann aber hinbekommen, irgendwo hakts grade noch ein wenig)

Ah OK. Habs! Es ging was den Timer anbelangt logischerweise dem Link entsprechend um die boarddefs.h. Das erklärts natürlich.

Habe entsprechend die Änderung vorgenommen und der Fehler ist verschwunden!

Sehr gut vielen Dank!

Noch eine Frage die sich hieraus ergibt. Kann es sein, das trotz auskommentieren und ändern des Timers der Fehler wieder auftaucht weil eine andere Libary diese benutzt?

Wenn ja, wie könnte man solches Problem dann lösen? Jetzt nur in der Theorie? Gibts einen Timer3?

:slight_smile:

Gibts einen Timer3?

z.B. der Arduino Mega (ATMega2560) hat einen Timer3

Kommt also aufs Board drauf an...

Datenblatt des betreffenden µC befragen!
Dort sind alle Timer mit ihren jeweiligen Fähigkeiten aufgelistet.

Hi

mrzortrax:
Kommt also aufs Board drauf an...

Wie beim Auto ... ein Fiat 500 hat keine Schiebe-Plane, wie Diese bei LKW durchaus üblich sind.
Ein Fahrrad hat selten einen Ersatzreifen ... also: Ja, kommt schon auf das 'Modell' an.

MfG

Danke!