Interruptfunktion zählt immer durch

Hallo Forum,

keine Ahnung, was hier grundlegendes schief geht, aber ich möchte einen int einen hochzählen, wenn ich einen Knopf drücke, allerdings ist wichtig, dass es mit einem interrupt passiert, da der Knopf auch sehr schnell gedrückt werden kann.

Meine Idee:

volatile int counter=0;
long letzterAusloeser=0;
int bouncetime=2000; // in millisec

void setup()
{
   pinMode(3, INPUT);
  //digitalWrite(3,LOW);
  attachInterrupt(1, zaehl, RISING);
  Serial.begin(9600);

}

void loop()
{
 Serial.println(counter);
  delay(500);
}

void zaehl()
{
    counter++;

}

um das Debouncing etc kann ich mich kümmern, aber warum dreht mein int counter so durch und vor allem, warum bleibt er stehen, wenn ich den Knopf durchdrücke?

Zur Schaltung:

Knopf mit 47kOhm zwischen 5V und Pin 3.

Der Knopf ist ein handelsüblicher Knopf, den man runter drückt, dann gibts Kontakt - lässt man los, ist der Kontakt weg.

Also ich hab wirklich schon alles erdenkliche probiert, aber der counter bzw die Methode "zaehl" hat nichts mit dem zutun, was ich erwarte, nämlich hoch zu zählen wenn das Logiklevel von 0 auf 1 steigt.

Lese ich den Pin ohne die Interrupts aus, passt es perfekt. 0 wenn nicht gedrückt, 1 wenn gedrückt.
Dass mal ein paar mal doppelt gezählt würde (bouncing), ist mir klar, aber das, was ich sehe ist kein bouncing.

Ich hoffe, es kann mir jemand helfen.

VG
Daniel

Der Pin ist floating, wenn der Knopf nicht gedrückt wird. Wenn Du einen Pulldown-Widerstand hinzufügst (ca. 1k? von Pin 3 nach GND), dürfte der Knopf bis auf das Prellen funktionieren.

Allerdings brauchst Du für einen Knopf keinen Interrupt, denn der Arduino ist immer so schnell (bei vernünftiger Programmierung), dass er das mitkriegt, egal wie schnell Du den Knopf drückst. Allerdings ist dann ein Aufruf von delay() tabu. Siehe das Beispielprogramm BlinkWithoutDelay in der IDE.

BesterMann:
um das Debouncing etc kann ich mich kümmern, aber warum dreht mein int counter so durch und vor allem, warum bleibt er stehen, wenn ich den Knopf durchdrücke?

Wenn du den Knopf durchdrückst, prellt er nicht. Das Prellen entsteht beim drücken und loslassen. Mach eine Hardwareentprellung und lese den Pin dann mit RISING ein. delays oder blinkwithoutdelay klappt im Interrupt nicht. Gebe Pylon recht, dafür ist der Interrupt unnötig. Ein ordentlich programmierter loop läuft sehr schnell und erkennt diese Flankenwechsel. Interupts, würde ich aufgrund des Prellens von Tastern sowie so lieber nur für Elektrische Taster (Transistoren) nutzen.

BesterMann:
Knopf mit 47kOhm zwischen 5V und Pin 3.

Der Knopf ist ein handelsüblicher Knopf, den man runter drückt, dann gibts Kontakt - lässt man los, ist der Kontakt weg.

Das hört sich irgendwie falsch verschaltet an.
Am besten schaust Du Dir nochmal an, wie ein PullDown- oder PullUp-Widerstand mit einem Taster beschaltet wird.

Zum Beispiel hier (dort PullDown):
http://arduino.cc/en/Tutorial/DigitalReadSerial

Oder Du läßt den externen Widerstand weg und aktivierst den internen PullUp am Taster-Pin.

Mit der Auswertung von mechanischen und prellenden Buttons per Interrupt verkackst Du übrigens Dein Programm. Das kann man zwar machen, ist aber eher nichts, was irgendwie sinnvoll ist.