Pages: [1]   Go Down
Author Topic: Attachinterupt ne marche pas dans mon programme...  (Read 853 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Voila mon projet consiste à incrementer plusieurs compteur grace à l'arduino. L'un est régulier (environ toutes les secondes), l'autre est aléatoire. Ces incrémentation sont du a des appui sur des interrupteurs. J'ai donc choisi de mettre mon compteur régulier sur une interuption externe afin que si l'autre doit s'incrementer en même temps qu'il n'y ai pas de souci. Seulemnt mon interuption ne marche pas comme elle le devrait, j'ai deux exemple :

celui qui reprend l'exemple du site officiel :
Quote
volatile int cptlapin;            // compteur de lapins
int cpt_SC                        // compteur de sous comptage
int cptLM;                        // compteur de lapins morts

void setup()
{
  pinMode(2,INPUT);  
  attachInterrupt(0, INTERRUPT0,FALLING);
  Serial.begin(19200);           // ouvre le port série, fixe le taux de données à 19200 bps
  delay(1000);                   // attendre 1s
}

void loop()
{
// si on appui sur l'interupteur de Lapin morts alors cpt_LM++
// si on appui sur l'interupteur de sous comptage alors celui est activé/désactivé
}

void INTERRUPT0()
{
  cptlapin++;    // on compte un lapin
  if(actif)      // si le sous comptage est actif
  {
     cptSC++;     // on compte un lapin de sous comptage
  }
}
Le problème avec ce code, c'est qu'a chaque front descendant, le compteur est incrémenter 70 fois au lieu d'une seule !

J'ai donc changer le code :
Quote
volatile int cptlapin;            // compteur de lapins
int cpt_SC                        // compteur de sous comptage
int cptLM;                        // compteur de lapins morts

void setup()
{
  pinMode(2,INPUT);  
  Serial.begin(19200);           // ouvre le port série, fixe le taux de données à 19200 bps
  delay(1000);                   // attendre 1s
}

void loop()
{
attachInterrupt(0, INTERRUPT0,FALLING);
// si on appui sur l'interupteur de Lapin morts alors cpt_LM++
// si on appui sur l'interupteur de sous comptage alors celui est activé/désactivé
}

void INTERRUPT0()
{
  cptlapin++;    // on compte un lapin
  if(actif)      // si le sous comptage est actif
  {
     cptSC++;     // on compte un lapin de sous comptage
  }
 dettachinterrupt(0);
}
Mais j'ai toujours le même problème, un peu moindre néanmois : pour un appui, il incrémente de deux à trois fois au lieu d'une.

SVP comment faire pour qu'a chaque interuption, il incrémente qu'une seule fois ?
« Last Edit: June 10, 2009, 08:08:36 am by zaza » Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mouais, à mon avis ce n'est pas du côté du code mais de l'électronique qu'il faut chercher la cause : tu dois avoir des rebonds sur ton interrupteur ou un manque de pull-up (tu ouvres le circuit, tu as un front descendant, mais il n'y a rien pour le remonter alors il oscille 70 fois avant d'être suffisamment chargé.

Au lieu de désactiver ton interruption, ajoute un délai (attention aux délais qui ne fonctionnent pas dans les interruptions).
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci pour ton avis, j'ai essayer de mettre un delai mais sa fait toujours la même chose, sa compte seulement plus lentement qu'avant.
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En même temps il est préférable de désactiver l'interruption lors de l'entrée dans la fonction. Parce que sinon tu peux recevoir des IT entre l'appel et le moment ou tu fais le detach().
Le plus simple c'est de placer un petit filtre RC sur l'entrée d'interruption. A dimensionner en fonction du temps de réaction voulu et du rythme des appuis sur le bouton.
« Last Edit: June 14, 2009, 05:43:20 am by fdufnews » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oui tu as raison je ni avais pas pensé, j'essaye et je te tiens au courant
merci de ton aide
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le fait de mettre la fonction detachinterupt au début de l'interuption ne change en rien.
Que me conseilles tu pour le filtre RC ? Pourrai tu preciser le schéma de branchement stp ?
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon du coup j'ai réussi à le faire par le logiciel, merci beaucoup de votre aide.
Logged

Pages: [1]   Go Up
Jump to: