Warum klappt das? (Interruptfrage)

Hiya,

ich (Newbie) habe gestern mal mit einen Lichtsensor und Interrupts experimentiert.

Lichtsensor hängt über Widerstand an +/-. Im Spannungsteiler habe ich den analogen Input 0 gefüttert. Ein Interrupt wurde an 0 attached und dort der Wert am analogen Pin 0 nochmals ausgelesen, und wenn ein Threshold überschritten wurde, die interne LED an Pin 13 auf HIGH gesetzt. Die Lichtsensorwerte wurden zudem noch an Processing übertragen.

Das tolle: alles hat gleich geklappt. Das dumme: nach etwas Studium bin ich mittlerweile überzeugt, dass der Interrupt 0 am Digitalen Pin 2 hängen müsste, so dass ich eigentlich gar nichts messen kann.

Was verstehe ich nicht richtig? Vielen Dank für hilfreiche Erläuterungen oder Referenzen, Markus

Vielleicht kannst du uns noch dein Sketch präsentieren.

Habe mich in Fritzing noch nicht so eingearbeitet, ist aber wirklich trivial:

(+) ---- Widerstand --- + ----- Lichtsensor ------- (-) | | Analog Pin 0

und im Code sowas wie: setup() { ... attachInterrupt(0, fire, CHANGE); ... } (Habe den Code leider gerade nicht zur Hand).

Wie die Reference beschreibt, muss der externe Interrupt (wird als Nummer 0 bezeichnet) an Digitalpin 2 angeschlossen.

http://www.arduino.cc/en/Reference/AttachInterrupt

Der Interrupt wird also ausgelöst, wenn an Pin 2 eine Signaländerung (CHANGE) erfolgt. Dabei wird in deinem Fall die Funktion fire() aufgerufen.

Aus deiner Erklärung ist nicht ganz klar was du mit dem analogen Signal wirklich machst.

Vermutlich wird der Interrupt zufällig ausgelöst, da dein Eingang (Pin2) offen ist. Zum Test kannst du ja mal einen Taster anschliessen und so einen Interrupt auslösen und die Weiterverarbeitung prüfen.

Hmm, denn digital Pin 2 habe ich natürlich nicht konfiguriert. Wenn solche "offenen" Ports tatsächlich flattern, dann erklärt sich aber das Verhalten meiner Schaltung sehr gut. Ich hatte mich ja gefragt, warum das klappt, obwohl ich wusste, dass es nicht klappte sollte.

Dadurch das Pin2 flattert, kriege ich natürlich die ganzen Interrupts - dort lese ich den analog Pin aus, und schalte die LED entsprechend. Das heisst, das Verhalten war synchron zum erwarteten Verhalten, nur leider hatte es nichts mit Änderungen am analog Pin zu tun, sondern mit dem flatternden digtal Pin 2.

Vielen Dank für die Hilfe, Markus

Wenn solche "offenen" Ports tatsächlich flattern, d

Das ist nur eine Vermutung, da im Code ja dieser Eingang vom Interrupt genutzt wird.

"Offene" IO Pints machen was sie wollen. Oft "flattern" sie, aber darauf ist kein echter Verlass. Letztendlich fangen Sie irgendwelche Signale wahllos ein. Das steht auch so in den Datenblätten / Application Notes. --> Grundsätzlich immer jeden Input Pin gleich mal mit digitalWrite auf High setzen (damit wird der Pullup aktiviert). Danach hört das Flattern sofort auf. Probier mal ob danach die Schaltung plötzlich nicht mehr tut --> dann war es das Flattern.

Gruß, Udo