Go Down

Topic: Attachinterupt ne marche pas dans mon programme... (Read 933 times) previous topic - next topic

zaza

Jun 10, 2009, 03:08 pm Last Edit: Jun 10, 2009, 03:08 pm by zaza Reason: 1
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 ?

Luj06

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

zaza

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.

fdufnews

#3
Jun 14, 2009, 12:42 pm Last Edit: Jun 14, 2009, 12:43 pm by fdufnews Reason: 1
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.

zaza

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

zaza

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 ?

zaza

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

Go Up