ich habe ein kleines Problem mit dem Interrupt.
Wenn ich den PIN2 zu VCC schließe dann zählt es mir nicht eins hoch, sondern gleich
eine ganz schöne Menge.
Ich habe einen GND -> 10K -> PIN2 und VCC -> Taster -> PIN2
Hmm normal würde ich fragen wie schnell kannst du den Taster drücken und wieder los lassen?
Ich weiß garnicht ob high zulassig ist laut referenz steht da change falling Rising und low
Hmm ich würds mal mit rising probieren
Kanns jetzt leider nicht ausprobieren, bin unterwegs.
Achso, nochwas:
Ich glaube du solltest den Pin noch als Eingang konfigurieren. (es sei den das passiert durch den attachinterrupt automatisch)
Zu dem Thema gibt es hier im Forum bestimmt eine Menge Beiträge.
Oder ist die Differenz der Zählerstäande davon abhängig, wie lange du den Taster gedrückt hältst (je länger, desto mehr Unterschied)? Dann würde ich auf etwas anderes tippen.
Mit dem entprellen ist mir zwar bekannt aber das das beim interrupt auch sein muß hätte ich nicht gedacht.
Vielleicht dann auch nochmal für mich zum verständnis:
Entprellen bedeutet nicht nur das mehrfache auslesen eines tastendrucks dadurch das der kontroller zu schnell abfragt sonder auch
Das die steugende flanke beim drücken mehrfach ausgewertet wird?
Ja. Du siehst es auf dem Oszillogramm auf der Wikipedia-Seite. Wenn du den Taster drückst federt er noch ein paarmal zurück bis er stabil auf dem Kontakt bleibt. Das macht dir mehrere Pulse, die der Controller alle erfasst, weil er schnell genug ist. Mehrere Impulse heißt natürlich auch entsprechend viele Flanken.
MueThoS:
Mit dem entprellen ist mir zwar bekannt aber das das beim interrupt auch sein muß hätte ich nicht gedacht.
...
Vielleicht dann auch nochmal für mich zum verständnis:
Entprellen bedeutet nicht nur das mehrfache auslesen eines tastendrucks dadurch das der kontroller zu schnell abfragt sonder auch
Das die steugende flanke beim drücken mehrfach ausgewertet wird?
Sobald die Bearbeitung des Interrupts in der Interuptserviceroutine erfolgt ist (was bei lediglich "i++" trotz eines gewissen Overheads ziemlich verdammt flott geht), kann der Interrupt erneut ausgelöst werden (z.B. durch die steigende Flanke beim Prellen).
das Prellen könnte ne Möglichkeit sein. Allerdings besteht mein "Taster" im
Moment noch aus zwei Drähtchen, die ich kurz zusammen halte.
Zu der zeitlichen Abhängigkeit - dass kann ich glaub verneinen - weil ich wenn ich
die Drähte länger zusammen halte, geht es "nur" um 100-400 schritte hoch
Wäre super wenn das evtl jemand mal kurz testen könnte ?
Also ich habe da mal was versucht, ist echt Lustig dass müsst ihr mal testen.
Aber dass das ein Prellen ist, kann ich fast nicht glauben - vor allem wie geschrieben
ich drücke da nur zwei Drähte zusammen ??
int pbIn = 0;
volatile int i = 0;
int count_stopp, count_start;
goofy79:
das Prellen könnte ne Möglichkeit sein. Allerdings besteht mein "Taster" im
Moment noch aus zwei Drähtchen, die ich kurz zusammen halte.
...
Wäre super wenn das evtl jemand mal kurz testen könnte ?
Goofy, mach dir doch selber ein sauberes Eingangssignal! Wofür hast du denn einen Arduino?
Einfach den Ausgang von Pin 13 statt des Tasters mit deinem Eingang verbinden und jede Sekunde Pin 13 für 100 Millisekunden auf HIGH setzen. Dann sollte dein Zähler schön hochzählen. Code folgt, aber das hättest du sicher auch allein geschafft. Änderungen sind durch //////////// gekennzeichnet.
int pbIn = 0;
volatile int i = 0;
void setup()
{
/////////////////////////////////////////////////////////////////
pinMode(13, OUTPUT);
//////////////////////////////////////////////////////////////////
Serial.begin(9600);
attachInterrupt(pbIn, count, RISING); //////////////////////////////
}
void loop()
{
Serial.print(i);
Serial.print(" | ");
// Serial.print("\n");
/////////////////////////////////////////////////////////////////
digitalWrite(13, HIGH); // set the LED on
delay(100); // wait for 100 ms
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
/////////////////////////////////////////////////////////////////
}
void count()
{
i++;
}
goofy79:
Also ich habe da mal was versucht, ist echt Lustig dass müsst ihr mal testen.
Nur noch eine kleine Anmerkung zu deinem geänderten Programm: in der Interrupt-Serviceroutine sollten keine längerdauernden Operationen durchgeführt werden, da während der Bearbeitung eines Interrupts normalerweise andere Interrupts gesperrt sind (was zu Problemen führen kann).
Daher resultiert wohl auch der Hinweis unter "Note" in der Arduino-Referenz zu attachInterrupt() bezüglich millis() und Serial.print.
Zu dem Serial.print und delay usw dass hatte ich am Anfang nicht drin, habe
es dann nur zum Debug eingefügt, weil mir die Werte komisch vor kahmen
Ja könnte das mal jemand versuchen, ob es nen Unterschied macht, wenn ich zwei Drähte
zusammen halte oder nen Taster dran habe. muss nämlich gestehen, dass ich gerade keinen
rumliegen habe