Pages: [1]   Go Down
Author Topic: [Resolu] L'interruption mystérieuse ...  (Read 652 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 39
Ardui-Novice
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley-grin
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.
« Last Edit: January 30, 2013, 02:56:05 pm by ludobabs » Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 39
Ardui-Novice
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci bien  smiley-small

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

France S-O ou exil en IDF
Offline Offline
Edison Member
*
Karma: 25
Posts: 1904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 39
Ardui-Novice
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 30, 2013, 03:34:25 pm by ludobabs » Logged

France S-O ou exil en IDF
Offline Offline
Edison Member
*
Karma: 25
Posts: 1904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Deux : l'analogique est toujours utile  smiley-mr-green
Ça vient du cœur ça smiley-mr-green
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: