Arduino Nano: Zwei Interrupts unterscheiden - was mache ich falsch?

Liebes Forum,

ich verwende einen Nano, der laut Datenblatt auf dem PIN 2 und 3 einen interrupt "anbietet".

Ich habe da jeweils einen Knopf angeschlossen, die unterschiedliche Vorgänge auslösen sollen. WAS genau ist egal, ich habe das nur angedeutet mit einem Serial.println-Befehl. Jedenfalls kann ich die ISR-Schleifen nicht trennen, es werden immer beide ausgeführt. Das muss doch gehen!

Mein COde als Minimalbeispiel:

const byte weiter_pin      = 3; // Weiter-Button
const byte notaus_pin     = 2; // Not-Aus-Button 

void setup() {
  Serial.begin()

  pinMode(weiter_pin, INPUT_PULLUP);
  pinMode(notaus_pin, INPUT_PULLUP);
 
  attachInterrupt(digitalPinToInterrupt(weiter_pin), weiter, CHANGE); // Weiter-Knopf am Schlitten
  attachInterrupt(digitalPinToInterrupt(notaus_pin), not_aus, CHANGE); // Not-Aus-Knopf
}

void loop() {
}

void weiter() { 
   Serial.println("Interrupt-Funktion 'Weiter'");
}

void not_aus() {
  Serial.println("Interrupt-Funktion not_aus");
}

Danke für einen Stups in die richtige Richtung, ich sehe bestimmt den Wald vor lauter Bäumen nicht.

Danke und Gruß, kuahmelcher.

Ich kann mir das eigentlich nur vorstellen, wenn ein Kurzschluß zwischen den Pins existiert. Was passiert wenn Du einen Knopf ausbaust?

Abgesehen davon: für mechanische Schalter nimmt man keine Interrupts, die machen den Code nur komplizierter weil sie dann immer noch entprellt werden müssen.

Ja, du hast Recht. Es KANN nichts anderes sein und ich muss den Fehler meiner Lötkunst suchen :sob:
Ich schließe das mal, ist ja eigentlich gelöst.

Ja ... OK. Was würdest du vorschlagen?

Danke und Gruß,
kuahmelcher.

Not-Aus Knöpfe per Interrupt sind extrem unsensibel.

Not-Aus sollte immer über mechanische Schalter realisiert werden,
und die Stromversorgung komplett unterbrechen.

IDE Beispiele: Debounce, StateChangeDetection...

Ja - im Originalsketch habe ich das mit Debounce gelöst. Trotzdem Danke.

Aber noch einmal zum ursprünglichen Problem. Ich krieg's nicht hin. Ich habe ALLES Gelötete aussortiert und überprüft - ohne Befund. Das Problem scheint das Kabel selbst zu sein. Das Kabel ist das Folgende:

Kabel 7-pol

Wenn ich es anschließe, werden zuverlässig beide Interrupts ausgelöst. Kann's an der fehlenden Schirmung liegen??? Solche Fehler hasse ich, weil ich sie nicht verstehe. :roll_eyes:

Danke und Gruß,
kuahmelcher.

Hallo
Nehme die serial.println() aus der ISR raus und signalisiere, für die loop(), das ein Ereignis eingetreten ist.
Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Ich würde zuerst den Widerstand zwischen den Pins messen, mit und ohne gedrückte Taster.

Wie lang ist das Kabel? Die Eingänge sind rel. empfindlich, gerade bei Interrupts. Da reichen schon extrem kurze Spikes um einen Interrupt auszulösen. Da reicht also die kapazitive Kopplung der Adern u.U. aus. Die internen Pullups sind auch recht hochohmig, und verbessern das daher nur wenig.
Du könntest zusätzlich zu den internen noch extern niederohmigere ( ca. 1K ) Widerstände anschließen. Auch Kondensatoren zum FIltern gegen kurze Spikes könnten helfen.
Dass Interrupts für das Einlesen von Schaltern aber grundsätzlich eher problematisch sind, wurde dir ja schon gesagt.

... ja - richtig. Allerdings ist das eher ein Begriffs-Problem. Der "Not-Aus" schaltet keine Fräse aus oder sowas, sondern positioniert einen Schiebeschlitten. Besser wäre wahrscheinlich "Positions-Sensor" oder sowas - aber das war mir damals zu umständlich! :grinning:

Ich sehe kein Serial.begin() :wink: Das ist doch runtergekürzt auf irgendwas - da würde ich mal meinen, wer weiss, was jetzt hier noch fehlt...

Danke, hab's ergänzt! :wink:

Ok,
und dann mal was ganz verrücktes. Schalte die internen Pullups ab und beschalte das extern mit 5K gegen +5V.

Habe ich gemacht! Ergebnis ist das Gleiche (also wildes Durcheinander von Int0 und Int1). Übrigens auch, wenn ich GAR keinen Interrupt verwende und den Button über loop() und digitalRead() abfrage.
Warum hast du da ein anderes Ergebnis vermutet?

Als nächstes schneide ich mir jetzt das Kabel auf die minimal nötige Länge zurecht und versuche es nochmal. Es ist echt zum Mäusemelken!

Gruß, kuahmelcher.

Weil ich damit den Pegel stabiler auf HIGH ziehe.
Du kannst mit dem Widerstand auch auf 1K runtergehen. Von mir aus auch auf 500 ohm.
Allerdings kann ich mir nicht vorstellen, warum da 5 Meter Antenne solchen Unsinn veranstalten.

Ich habe hier alles mögliche an Kabeln schon ausprobiert. Selbst ne Verlängerungsschnur mit 25(?) Meter hat hier sowas nicht verursacht....

Ja ... eher so ... ungekürzte 5m. :grinning: Ich kürze es!

Ja, das mit den externen Widerständen habe ich auch noch ausprobiert - bringt nix (mit 10kOhm).

Ich setzte jetzt erst mal auf ein kürzeres Kabel.

Danke und Gruß, kuahmelcher.

10kOhm ist auch definitiv zu hoch - vor allem wenn das Kabel 5m lang ist. Da sind doch schon ordentliche Kapazitäten zwischen den Leitungen. Und wie gesagt reichen bei einem Interrupteingang schon sehr kurze Spikes zum Auslösen. Auch ein Kondensator - ca. 10-100nF - direkt am Eingang nach Gnd könnte was bringen.

HÄÄÄÄ? Ich werde weich in der Birne. Ich tausche jetzt das ganze Kabel mal aus …

ich hatte mal die S0-Schnittstelle eines Zählers in der Werkstatt angepappt, bevor es da ein cat-Kabel gab :wink:

Also wenn ich einfach drei popelige Litzen hernehme, funktioniert's einwandfrei. Es ist definitiv das Kabel. Bekloppt! :laughing:

Jetzt weiß ich, was den Fehler verursacht, aber ich habe ein altes Problem, von dem ich eigentlich dachte, dass es gelöst ist: Ich muss wieder auf Kabelsuche gehen!

Na - Danke jedenfalls für die Mithilfe!!
Gruß, kuahmelcher.