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!
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 - 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:
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.
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++.
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!
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!
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....
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.
Also wenn ich einfach drei popelige Litzen hernehme, funktioniert's einwandfrei. Es ist definitiv das Kabel. Bekloppt!
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.