Hiho Ihr,
Ich nutze in meinem Programm die Bibliothek SoftwareSerial.h und möchte gleichzeitig einen interrupt mittels eines Buttons auf D8-D13 (Alle anderen Pins sind schon belegt) realisieren wie es hier beschrieben wird Arduino Playground - PinChangeInterrupt
Dummerweise nutzt die SoftwareSerial Bibliothek bereits PCINT0_vect.
#if defined(PCINT0_vect)
ISR(PCINT0_vect)
{
SoftwareSerial::handle_interrupt();
}
#endif
Quelle: SoftwareSerial/SoftwareSerial.cpp at master · PaulStoffregen/SoftwareSerial · GitHub
Gibt es eine elegante möglichkeit dieses Problem zu lösen ohne in der SoftwareSerial Bibliothek herumschreiben zu müssen?
Danke im Voraus!!
Grüße,
Klaschni
Für so etwas langsames wie einen Taster braucht man eigentlich keine Interrupts
ich möchte mein laufendes Programm, welches ca 1 Minute lang Dinge abarbeitet und danach in den Schlafmodus für ein paar stunden geht, jederzeit mit einem Taster unterbrechen können um eine Variable zu ändern.
Dafür brauche ich vermutlich interrupts?
Dann ja.
Kannst du nicht andere Pins umbelegen? Und hast du auch daran gedacht, dass auch "analoge" Pins digital verwendet werden können?
Umbelegen geht leider nicht mehr. Habe mir eine Platine fertigen lassen und wollte jetzt noch einen interrupt hinzufügen an die Pins die noch vorhanden sind. So gesehen ist es kein orginal Uno mehr. vielmehr ein Uno mit meinem ganzen gestripps fest auf einer platine + ein paar GPIOs nach außen verlegt um beispielsweise buttons oÄ. dran zu stöpseln 
Hallo,
blöd gelaufen. Ich sehe aktuell nur eine Möglichkeit, du schreibst dir eine weitere Methode(n) die in der ISR(PCINT0_vect) mit aufgerufen wird. Es wäre vielleicht auch schlau einen eigenen Header zu schreiben für alles was mit dem Pin gemacht werden soll und diesen zu inkludieren. Dann hat man nicht alles wild reingeklatscht.
PCINT ist portweise organisiert, mit Arduino Pins 8-13 in Port B mit PCINT 0. Wenn SoftwareSerial diesen PCINT benutzt, wäre es organisatorisch am einfachsten, andere Pins dafür zu verwenden. Wenn das aber so schon auf dem PCB festgelegt ist ... 
Aber falls der Button den Controller aufwecken soll, das kann ja mit jedem PCINT geschehen, auch mit dem von SoftwareSerial benutzten. Dazu muß nur vor dem Schlafengehen der PCINT auf diesen Port freigeschaltet werden. Ungetestet, sollte aber IMO funktionieren. Danach die ganz normale Abfrage des Buttons in loop().
Der Interrupt Vektor ist aber schon in SoftwareSerial definiert. Das kann nicht an einer zweiten Stell nochmal stehen. Klar, das Aufwecken bekommst du hin, aber nicht die Abfrage was nun eigentlich passiert ist.
Man könnte zur Not wie gesagt auch die SoftwareSerial Bibliothek anpassen. Eine eigene Version davon erstellen und z.B. in dem Interrupt eine Callback-Funktion ausführen. Würde ich sonst nicht empfehlen, aber wenn es denn sein muss
Es reicht völlig, den PCINT einzuschalten (wird er wohl schon vom SoftwareSerial) und dann noch die Interrupt-Maske für den Button Pin zu setzen (PCMSK0). Die SoftSerial ISR merkt dann, daß der Interrupt nicht für sie ist und ignoriert den Interrupt, aber der Arduino bleibt wach.
Dann müsste er mal sagen ob der Taster nur Aufwecken soll oder ob da noch andere Funktionen gewünscht sind. Ich dachte mir halt das es nicht nur wortwörtlich ums Aufwecken ging, sondern dass der Taster noch andere Funktionen hat. Ist aber nicht ganz klar
Weiter unten heißt es z.B.:
mit einem Taster unterbrechen können um eine Variable zu ändern.
Da muss man dann vielleicht irgendwann mal abfragen was eigentlich den Interrupt ausgelöst hat
Wenn der Arduino wieder wach ist, kann er jeden beliebigen Taster abfragen und damit anfangen was er (der Programmierer) will. Wo siehst Du da ein Problem?
Danke für eure Ideen!
Der Taster müsste dummerweise auch während das Programm grad mal nicht im Schlafmodus ist, also alle paar stunden ca. 1 Minute, auf Tastendruck die Variable ändern können. Da müsste ich dann wohl doch die Bibliothek anpassen wenn ich das richtig verstehe.
Häh?
Wenn der Arduino pennt, reicht ein eingeschalteter PCINT, daß der Arduino wach wird.
(und dort weiter macht, wo Er zuvor schlafen gelegt wurde).
Ab jetzt kann Er aktiv nachschauen, welcher Pin betätigt ist.
Was hindert Dich daran, nachzuschauen, wenn der Arduino nicht gerade erst wach geworden ist?
Also IMMER nachschauen, ob der Pin betätigt ist (also, sobald der Knabe wach ist).
MfG
Welche Bibliothek möchtes Du ändern, und warum? Die Abfrage von Tasten läuft in loop(), ständig oder in zeitlichem Abstand, und das hat mit keiner Bibliothek irgendwas zu tun.
Wenn mein aktives Programm beschäftigt ist, und das ist es manchmal 30 sek an stück. kann ich in der Zeit den Button ja nicht abfragen
Das heißt für diesen Fall bräuchte ich dann die ISR wenn ich das richtig verstehe. ODer ich müsste den Button > 30 Sekunden drücken.
... oder, Du programmierst mit etwas mehr Gehirnschmalz und kommst von delay() weg.
WAS macht Dein Programm denn 30 Sekunden lang, wo Es nicht in der Lage ist, einen Pin zu pollen?
MfG
Unter diesen Umständen würde ich für den Button einen eigenen Arduino nehmen. Am besten einen Uno, dort könnte man auch die Shields aufstecken, die sich am Mega beißen...