Problem mit Interruptserviceroutine und Library SoftwareSerial //Arduino UNO R3

Hallo zusammen,

ich möchte in einem Programm, in welchem ich die ISRs 0 und 1 benutze auch noch ein Sprachmodul (DFPlayer)einbinden. Die Software für das Sprachmodul benötigt neben einer eigenen Library noch die Library "SoftwareSerial.h" um mit dem Sprachmodul zu kommunizieren.

Mein Programm alleine geht. Das Testprogramm für die Sprachausgabe auch.
Dann habe ich die relevanten Zeilen aus dem Sprachausgabemodul in mein Programm übernommen.

Da schmeißt mir die IDE einen bzw. mehrere Fehler um die Ohren.

Ich habe jetzt den Code auf ein absolutes Minimum zusammengestrichen und bin dabei dann drauf gekommen, dass die SoftwareSerial intern auch die ISRs benutzt. Das geht natürlich nicht.

Aber wie kann ich das nun umgehen?

Mein Programm benötigt unbedingt ISR(PCINT0_vect) und ISR(PCINT1_vect)
Die sind aber schon in der SoftwareSerial.h bzw. .cpp drin.

Der nicht kompilierbare Codeschnipsel:

#include "Arduino.h"
#include "SoftwareSerial.h"
void setup () {};
void loop () {};
ISR(PCINT1_vect)                                          
{                                                           
}

Und die Fehlermeldung dazu:

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_4'
sketch\Test4_-_.ino.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.

Ich hatte in meiner Dummheit anfangs nicht die ganze Fehlermeldung beachtet, weil bei mir immer nur die letzten 3 Zeilen angezeigt wurden. (Ab collect2.exe: error ) Und ich habe ewig nach diesem Begriff gegoogelt.
Das Fehlerfenster habe ich natürlich inzwischen vergrößert und das Schlamassel damit erkannt.

Kann mir da jemand bitte helfen?

Dann musst Du einen Prozessor mit mehr HardwareSerial benutzen.

Gruß Tommy

Hallo
Warum verwendest du nicht die arduinoüblichen Interrupt-Methoden ?

Oder mal AltSoftSerial probieren:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Das verwendet die Timer Interrupts und nicht Pin Change

Serenifly:
Oder mal AltSoftSerial probieren:
AltSoftSerial Library, for an extra serial port

Das verwendet die Timer Interrupts und nicht Pin Change

Danke - das sieht gut aus. Laut Beschreibung müsste das damit gehen. Ich muss noch einen Weg finden wie ich die beiden RX/TX-Pins ändern kann Die sind irgendwo wohl "fest" vergeben. Aber für heute habe ich genug mit Fehlersuche und Versuchen verbracht. Morgen ist dann mein Motorrad dran. Mittwoch oder Donnerstag werde ich das dann mal testen.

paulpaulson:
Hallo
Warum verwendest du nicht die arduinoüblichen Interrupt-Methoden ?

Mein Programm benötigt unbedingt ISR(PCINT0_vect) und ISR(PCINT2_vect) für 8 parallele Dateneingänge. Also 8 verschiedene Interrupts. Bitte dazu aber jetzt keine Diskussion.

lupus1952:
Ich muss noch einen Weg finden wie ich die beiden RX/TX-Pins ändern kann Die sind irgendwo wohl "fest" vergeben.

Ich habe ja gesagt das die Bibliothek die Timer verwendet. Entsprechend kann man auch die Pins nicht ändern

Und wenn du 8 Interrupts brauchst kannst du die auch über die drei Interrupt Vektoren (0, 1 und 2) verteilen, so dass noch andere Pins frei sind

Serenifly:
Oder mal AltSoftSerial probieren:
AltSoftSerial Library, for an extra serial port

Das verwendet die Timer Interrupts und nicht Pin Change

Super Tipp! Das funktioniert. Leider kann man die seriellen Pins wirklich nicht ändern, so dass ich eben 2 meiner Abfrageleitungen woanders hingelegt habe. Jetzt ist aber ausgereizt. 16 Inputs, 8 mit PCINT , 8 ohne Interrupt und die 2 neuen Seriellen.
Vielen Dank!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.