AttachInterupt werkt niet als verwacht

Arduino specifieke Software
Berichten: 6
Geregistreerd: 02 Mei 2012, 20:43

AttachInterupt werkt niet als verwacht

Berichtdoor JHP » 03 Mei 2012, 20:44

Omdat ik problemen ondervond met de verbinding met mijn Arduino 2560, zie elders bij Hardware.
Probeerde ik een eenvoudig "voorbeeld" programma, te uploaden. Dat werkt nu.
Echter het programma werkt niet, zo als ik verwachte.
Het betreft het programma, dat in "Reference", als voorbeeld word geven voor het gebruikt van attachInterrupt().

Ik verwachtte, dat eenmaal indrukken en loslaten van een druktoets zou lijden tot het overgaan van het op het board aanwezige ledje van branden naar gedoofd en omgekeerd.

Waarschijnlijk als gevolg van kontakt dender gaat het ledje soms direct van aan naar uit.
Het blijft soms branden en soms is er geen verandering waarneembaar.

Wat doe ik fout.

Vast bedankt voor Uw reacties

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: AttachInterupt werkt niet als verwacht

Berichtdoor pjh » 04 Mei 2012, 06:44

Je moet zogenaamd 'debouncen'
Waar het probleem op neer komt is dat op een knop drukken de eerste paar miliseconden een instabiel signaal geeft. Voor de microcontroller is een milliseconde een eeuwigheid waarin aan-en-uit elkaar snel afwisselen.

Zonder debouncing ziet de microcontroller je knop 1000x aan en uit gaan. Je eindigd dan bij bv 1000 op aan en bij 1001 op uit, terwijl jij de knop maar 1x indrukte

Gebruikers-avatar
Berichten: 1
Geregistreerd: 04 Mei 2012, 17:38

Re: AttachInterupt werkt niet als verwacht

Berichtdoor berk » 04 Mei 2012, 17:42

http://arduino.cc/it/Tutorial/Debounce

In het kort: kijk hoeveel tijd er is verstreken tussen de pulsjes, als het binnen bv. een halve seconde is, kun je er vanuit gaan dat het idd contactdender is, en dat het signaal dus genegeerd kan worden

Berichten: 6
Geregistreerd: 02 Mei 2012, 20:43

Re: AttachInterupt werkt niet als verwacht

Berichtdoor JHP » 06 Mei 2012, 23:32

Allereerst bedankt voor jullie snelle reactie.

Ik had al geexperimenteerd met debounce-n.
Het debounce voorbeeld in Arduino werkt goed.
Het lukt me (nog) niet om interrupt en debounce, in die volgorde te combineren.
Later meer.

Berichten: 6
Geregistreerd: 02 Mei 2012, 20:43

Re: AttachInterupt werkt niet als verwacht

Berichtdoor JHP » 07 Mei 2012, 22:05

Hier na mijn oplossing voor gebruik van een interrupt met een denderende schakelaar.
Het werkt nog niet 100%, vooral het snel loslaten van de drukknop, geeft extra tellingen.

Wie heeft een beter en eenvoudige idee?

Code: Alles selecteren
/* interrupts_06.ino
   The circuit:  Arduino2560 r3
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 * LED attached from pin 13 to ground (or use the built-in LED on
   most Arduino boards)
*/   
// constanten
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin = 13;       // the number of the LED pin

// globaal bruikbare variabelen, kunnen weizigen
int iTeller = 0;
int iVorigeTeller = 0;
int iHeenEnWeer = 0;

void setup(){
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);

  // LOW to trigger the interrupt whenever the pin is low,
  // CHANGE to trigger the interrupt whenever the pin changes value
  // RISING to trigger when the pin goes from low to high,
  // FALLING for when the pin goes from high to low.
 
  // Most Arduino boards have two external interrupts:
  // numbers 0 (on digital pin 2) and 1 (on digital pin 3).
  // The Arduino Mega has an additional four:
  // numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).
 
  // Indien drukknop in rust, Pin 2 ligt via 10 K Ohm aan GND
  // Indien drukknop ingedrukt, Pin 2 ligt aan + 5 Volt.
   
  attachInterrupt(0, blink, RISING);
}

void loop(){
  // Alleen te printen indien geweizigd
  if ( iTeller > iVorigeTeller + 10 ){
     iHeenEnWeer++;
     Serial.println ( iHeenEnWeer );
     iVorigeTeller = iTeller;
  }
}

void blink(){
  unsigned long ulBeginTijd = 0;
  iTeller++;
  // schakel de interrupts korte tijd uit
  // om denderen inteperken
  noInterrupts();
  ulBeginTijd = millis();
  do {
  } while ( millis() > ulBeginTijd + 500U ); // 0,5 seconde
 
}


Gebruikers-avatar
Berichten: 13
Geregistreerd: 22 Jun 2012, 12:04

Re: AttachInterupt werkt niet als verwacht

Berichtdoor WallyCom » 24 Jun 2012, 21:13

Hallo,

Ik ben van mening dat hardwarematig debouncen de beste oplossing is indien je wilt sparen op code e/o processor gebruik.
Op de volgende site een mooi voorbeeld. http://www.elexp.com/t_bounc.htm
Zeker als je code wilt testen is deze methode een uitkomst.
Indien je alsnog softwarematig gaat debouncen nadat je weet dat de code werkt, weet je direct waar je de 'fout' moet zoeken.

M.Vr.Gr.,
Harry.
M.Vr.Gr.,
Harry

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: AttachInterupt werkt niet als verwacht

Berichtdoor pjh » 24 Jun 2012, 23:14

Dit http://youtu.be/CRJUdf5TTQQ filmpje gaat ook over hardware debouncing. Ter info.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 34 gasten