Go Down

Topic: [Resolu] L'interruption mystérieuse ... (Read 921 times) previous topic - next topic

ludobabs

Jan 30, 2013, 08:11 pm Last Edit: Jan 30, 2013, 08:56 pm by ludobabs Reason: 1
Bonjour à tous.

J'ai cablé les deux interruptions de mon Arduino Uno comme suit :



Lorsque "j'interruptise" un seul bp avec une frequence de qques Hz, parfois, ce n'est pas la bonne interruption qui s'enclenche. C'est un grand mystere ....

Code: [Select]
const int DUREE_ANTI_REBOND = 300;  // milli secpondes antirebond pour les switchs
boolean action_clavier = false;
unsigned long timer_touche_suivante;
unsigned long timer_touche_enter;

void setup()
{
 Serial.begin(9600);
 activer_interruptions();
}

/* loop */
void loop()
{
 // allumer le voyant de la carte
 digitalWrite(13, HIGH);

 // delay
 for(int i = 0;i <= 1000; i++) {
   if(action_clavier) continue;
   delay(1);
 }

 // eteindre
 digitalWrite(13, LOW);  
}
/* fin de loop */

// activer les interruptions
void activer_interruptions() {
 attachInterrupt(0, interruption_suivante, RISING);
 attachInterrupt(1, interruption_enter, RISING);
}

// desactiver les interruptions
void desactiver_interruptions() {
 detachInterrupt(0);
 detachInterrupt(1);
}
// ****************************************************** suivante  
void interruption_suivante()
{
 desactiver_interruptions();

 if (millis() > timer_touche_suivante + DUREE_ANTI_REBOND) {  
   timer_touche_suivante= millis();
   action_clavier = true;

   Serial.println("touche suivante");
   
 }

 activer_interruptions();
}

// ****************************************************** enter
void interruption_enter()
{
 desactiver_interruptions();

 if (millis() > timer_touche_enter + DUREE_ANTI_REBOND) {
   timer_touche_enter= millis();
   action_clavier = true;

   Serial.println("touche Enter");

 }

 activer_interruptions();
}


En utilisant seulement le bouton poussoir "touche suivante" par exemple voici ce que j'obtiens dans le moniteur serie.

Quote
touche suivante
touche suivante
touche Enter                              -> aie aie aie :D
touche suivante
touche suivante
touche suivante
touche suivante
touche suivante
etc ........


Ca fait la même chose quelque soit l'interruption utilisée, et la frequence d'apparition de l'interruption mystere n'est pas fixe. parfois il faut 2 ou trois actions sur le BP, parfois il en faut 50 ou plus.

Je me demande si j'ai bien cablé, si 10k est suffisant comme resistance de pulldown. Bref, encore une fois beaucoup de questions et le forum Arduino pour vos réponses.

Je vous remercie d'avance.

skywodd

Bonjour,

Habituellement on fait plutôt des résistances de pull-up avec une interruption FALLING.

Ps: les interruptions restent activent tant que tu ne les désactivent pas, donc pas besoin d'appeler activer_interruptions() et desactiver_interruptions() à chaque fois ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

ludobabs

Merci bien  :.

Quote
Habituellement on fait plutôt des résistances de pull-up avec une interruption FALLING.


Voila qui est fait. Du coup mon code devient :

Code: [Select]
const int DUREE_ANTI_REBOND = 300;  // milli secpondes antirebond pour les switchs
boolean action_clavier = false;
unsigned long timer_touche_suivante;
unsigned long timer_touche_enter;

void setup()
{
  Serial.begin(9600);

  // activer pull-up
  pinMode(2, INPUT);
  digitalWrite(2,HIGH);
  pinMode(3, INPUT);
  digitalWrite(3,HIGH);

  // def interruptions
  attachInterrupt(0, interruption_suivante, FALLING);
  attachInterrupt(1, interruption_enter, FALLING);
}

/* loop */
void loop()
{
  // allumer le voyant de la carte
  digitalWrite(13, HIGH);

  // delay
  for(int i = 0;i <= 1000; i++) {
    if(action_clavier) continue;
    delay(1);
  }
  action_clavier = false;

  // eteindre
  digitalWrite(13, LOW); 
}
/* fin de loop */

// ****************************************************** suivante 
void interruption_suivante()
{
  if (millis() > timer_touche_suivante + DUREE_ANTI_REBOND) { 
    timer_touche_suivante= millis();
    action_clavier = true;

    Serial.println("touche suivante");

  }
}

// ****************************************************** enter
void interruption_enter()
{
  if (millis() > timer_touche_enter + DUREE_ANTI_REBOND) {
    timer_touche_enter= millis();
    action_clavier = true;

    Serial.println("touche Enter");

  }
}


La mise en oeuvre est facilitée avec l'utilisation des pull-up internes de l'Aduino et l'interruption mysterieuse n'est plus !

Merci beaucoup

68tjs

Un condensateur de 10 ou 100 nF en parallèle sur le bouton poussoir forme un excellant anti-rebond matériel qui dans la très grande majorité des cas dispense d'utiliser un anti-rebond logiciel.

On ne peut pas supprimer pas les rebonds qui sont d'origine mécanique.

Avec le condensateur on traite la perturbation à la source en empêchant l'apparition de l'effet des rebonds sur le signal électrique. 

Avec un traitement uniquement logiciel le signal électrique reste perturbé mais on temporise pour attendre que les perturbations disparaissent.

Les deux solutions introduisent un retard mais ce retard est plus faible avec le condensateur.

ludobabs

#4
Jan 30, 2013, 09:30 pm Last Edit: Jan 30, 2013, 09:34 pm by ludobabs Reason: 1
Merci pour toutes vos reponses.

Quote
Un condensateur de 10 ou 100 nF en parallèle sur le bouton poussoir forme un excellant anti-rebond matériel qui dans la très grande majorité des cas dispense d'utiliser un anti-rebond logiciel.


100nF installés, plus d'interruption mysterieuse et plus d'anti rebond logiciel. Je dois avouer que, grace à vous, mon montage à retrouvé réactivité et fiabilité ! C'est génial ...

Merci

68tjs

Un : Comme quoi il faut toujours traiter à la source.

Deux : l'analogique est toujours utile  :smiley-mr-green:

skywodd

Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up