Pages: [1]   Go Down
Author Topic: Probleme mit Interrupt  (Read 1091 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

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

und folgendes kleines Programm

Quote
int pbIn = 0;
volatile int i = 0;

void setup()
{
     Serial.begin(9600);
     attachInterrupt(pbIn, count, HIGH);
}

void loop()
{
   Serial.print(i);
   Serial.print(" | ");
//   Serial.print("\n");
   delay(1000);
}

void count()
{
   i++;
}

Ausgeben tut es :
 | 0 | 0 | 21 | 21 | 21 | 147 | 431 | 745 | 819 | 870 | 870 |.....

Kann mir jemand sagen, warum dass nicht immer nur eins hoch zählt ?

Gruß Goofy

Logged

NRW
Offline Offline
Sr. Member
****
Karma: 1
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
« Last Edit: February 17, 2012, 08:28:13 am by MueThoS » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Gut ich bin schnell .... aber so schnell leider auch nicht  smiley-cool

Habe das Attribut mal auf rising gesetzt - leider ohne Erfolg.
Quote
attachInterrupt(pbIn, count, RISING);
Wenn ich das erste mal drücke, habe ich gleich ... und so weiter
| 0 | 503 | 503 | 516 | 640 | 919 | 1838 |......

Gruß Goofy
Logged

Neuss
Offline Offline
Full Member
***
Karma: 0
Posts: 200
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Könnte das hier eine Erklärung sein?
http://de.wikipedia.org/wiki/Prellen
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.

Gruß
Wolfgang
« Last Edit: February 17, 2012, 09:14:11 am by voithian » Logged

NRW
Offline Offline
Sr. Member
****
Karma: 1
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Germany
Offline Offline
Full Member
***
Karma: 1
Posts: 141
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

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.

Viele Grüße

Elektrix
Logged

My blog about arduino and Linux themes:
http://heliosoph.mit-links.info/

Neuss
Offline Offline
Full Member
***
Karma: 0
Posts: 200
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
« Last Edit: February 17, 2012, 09:41:01 am by voithian » Logged

NRW
Offline Offline
Sr. Member
****
Karma: 1
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, ich. Ehme alles zurück und behaupte das gegenteil!
Bitte deinen taster entprellen! :-)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

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 smiley-wink

Wäre super wenn das evtl jemand mal kurz testen könnte ?

Vielen DANK schon mal

Gruß Goofy
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ??

Quote
int pbIn = 0;
volatile int i = 0;
int count_stopp, count_start;

void setup()
{
     Serial.begin(9600);
     attachInterrupt(pbIn, count, HIGH);
}

void loop()
{
   Serial.print(".");
   delay(1000);
}

void count()
{
  count_start = millis();
  if(count_stopp - count_start > 200)
  {
    i++;
    Serial.print(i);
  }
  else
  {
    Serial.print("-");
  }
  count_stopp = count_start;
}

Danke
Logged

Neuss
Offline Offline
Full Member
***
Karma: 0
Posts: 200
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-wink Änderungen sind durch //////////// gekennzeichnet.

Code:
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++;
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, das funktioniert smiley
Aber findet Ihr es nicht auch ein wenig komisch, dass wenn ich zwei
Drähte zusammen drücke ich bis zu 200 Zyklen habe ?
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, das funktioniert smiley
Aber findet Ihr es nicht auch ein wenig komisch, dass wenn ich zwei
Drähte zusammen drücke ich bis zu 200 Zyklen habe ?

Kommt halt drauf an, wieviel Kaffee du heute schon hattest...
Sorry, das war einfach ´ne Steilvorlage für den Spaß. smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Neuss
Offline Offline
Full Member
***
Karma: 0
Posts: 200
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: February 17, 2012, 11:22:03 am by voithian » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@sth77 - dr war nicht schlecht  smiley-wink

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 smiley

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 smiley-sad

Vielen herzlichen DANK
Logged

Pages: [1]   Go Up
Jump to: