Interruption: fonctionnement?

Hello,

J'ai commencé à bricoler avec l'arduino il y a peu.
Récemment j'ai voulu expérimenter l'usage des interruptions.
Sans rien brancher sur l'entrée digitale 2 (interruption 0), j'ai des changements d'état en permanence.
attachInterrupt(0,testfunction,LOW);
=> testfunction est appelée sans arret.

L'initialisation de l'entrée ne semble pas avoir d'effet:
pinMode(2, INPUT);

Ce comportement un "instable" est identique quand je tente de mettre en oeuvre avec un circuit simpliste comme celui-là:

J'ai oublié un truc?

J'ai oublié un truc?

Une résistance de pullup peut être :wink:

Sans rien brancher sur l'entrée digitale 2

Ne rien brancher sur une entrée c'est une fausse bonne idée. L'état de la broche est indéterminé et elle passe en permanence de 1 à 0 au grès des perturbations ambiantes.

L'initialisation de l'entrée ne semble pas avoir d'effet:
pinMode(2, INPUT);

pinMode(2, INPUT);
digitalWrite(2,HIGH); // active le pullup interne

L'activation du pullup interne peut aider. Mais c'est équivalent à une résistance très élevée en environnement bruyant il est préférable de mettre une résistance de valeur moyenne (qq kOhms) sur la broche.

Merci,

Sur le montage "DigitalReadSerial" il y a déjà une résistance de pulldown en fait.
J'ai essayé d'inverser en plaçant la résistance en pullup, de mettre les 2 :~ , je ne vois pas de changement.
L'activation du pullup interne ne semble pas avoir d'effet non plus. Enfin si, d'inverser l'effet: quand je ferme le circuit, il devient instable.

J'utilise une résistance de 1k, c'est peut-être trop peu?

J'utilise une résistance de 1k, c'est peut-être trop peu?

Non, non. Ue résistance "basse" donne une meilleur immunité aux perturbations.

Il doit y avoir autre chose.

Tu utilises une poussoir pour générer l'interruption? Le poussoir est de bonne qualité?

Si le poussoir n'est pas de bonne qualité, il peut faire des rebonds, a l'appui ou au relâchement, pendant un temps assez long (à l'échelle de l'arduino c'est à dire quelques dizaines de millisecondes) et donc appeler plusieurs fois de suite la routine d'interruption. Mais dans les positions stables du poussoir il ne devrait pas y avoir d'interruptions.

Bonjour,

Si les résistances de pullup sont bien en place c'est surement un probléme de rebond comme le précise fdufnews.

Une solution serait de placer un "petit" delayMicroseconds() dans le code de l'interruption ou de mettre une condensateur en parallèle du bouton.

Yep!

Tu as un exemple "d'anti rebond" dans l'IDE arduino --> exemples --> Digital --> Debounce.

ou alors ici avec le même schema :

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

@+

Zoroastre.

fdufnews:

J'utilise une résistance de 1k, c'est peut-être trop peu?

Non, non. Ue résistance "basse" donne une meilleur immunité aux perturbations.

Il doit y avoir autre chose.

Tu utilises une poussoir pour générer l'interruption? Le poussoir est de bonne qualité?

Si le poussoir n'est pas de bonne qualité, il peut faire des rebonds, a l'appui ou au relâchement, pendant un temps assez long (à l'échelle de l'arduino c'est à dire quelques dizaines de millisecondes) et donc appeler plusieurs fois de suite la routine d'interruption. Mais dans les positions stables du poussoir il ne devrait pas y avoir d'interruptions.

Pas de rebond, enfin peut-être mais c'est pas trop le pb pour le moment,

Avec ce petit montage et ce code, j'ai ~1000 appels/s à la fonction d'interruption quand l'interrupteur est ouvert.
Si j'active le pullup interne, la fonction n'est jamais appelée.
Je précise que j'ai fait l'essai avec 2 arduino uno V3 différents.

volatile unsigned long intercounter=0;

void setup(void)
{
  Serial.begin( 38400 );  
  Serial.println( "Test interrupt" );

  pinMode(2, INPUT); 
  //digitalWrite(2,HIGH);


  attachInterrupt(0,inter_code,CHANGE);
 //attachInterrupt(0,inter_code,RISING);
}

void loop(void)
{
  delay(100); 
}

void inter_code()
{
   Serial.println(intercounter,DEC);
   intercounter++;
}

Yep!

Tu as changé de resistance entre deux montages ???
Si la resistance est hs ou passante, ceci expliquerait le phénomène.

Si tu faisais le même montage sans la resistance de 10k, tu observerais le même problème.

Testes ta/tes resistance(s) à l'ohmètre (hors tension) !!!
Tu travailles sur un breadboard ???

@+

Zoroastre.

zoroastre:
Yep!

Tu as changé de resistance entre deux montages ???
Si la resistance est hs ou passante, ceci expliquerait le phénomène.

Si tu faisais le même montage sans la resistance de 10k, tu observerais le même problème.

Testes ta/tes resistance(s) à l'ohmètre (hors tension) !!!
Tu travailles sur un breadboard ???

@+

Zoroastre.

J'ai essayé avec quelques résistances, oui. Faut que je les vérifie ce soir... .
Je testerai aussi sans la résistance pour vérifier que ça ne change rien.
Oui je fais mes essais sur breadboard.

En admettant que ni la breadboard ni les résistances ne soient en cause, quelles autres sources de pb peuvent exister?
Ca pourrait être dû à mon usb du PC portable par exemple?

En admettant que ni la breadboard ni les résistances ne soient en cause

Commencer par éliminer les causes les plus probables c'est pas bon ça.
Écoutes bien ce que t'ont dit fdufnews, skywodd et zoroastre, ton problème sent le faux contact ou l'erreur de câblage à des lieux à la ronde. Ne bricoles pas l'existant et refais tout à partir de zéro, changes d'emplacement sur ta breadboard, tu gagneras du temps.

68tjs:

En admettant que ni la breadboard ni les résistances ne soient en cause

Commencer par éliminer les causes les plus probables c'est pas bon ça.
Écoutes bien ce que t'ont dit fdufnews, skywodd et zoroastre, ton problème sent le faux contact ou l'erreur de câblage à des lieux à la ronde. Ne bricoles pas l'existant et refais tout à partir de zéro, changes d'emplacement sur ta breadboard, tu gagneras du temps.

J'en conviens, j'ai au moins un doute sur la breadboard et le cablage, moins sur les résistances.
En attendant de m'y pencher ce soir avec le matériel, je me demande s'il y a encore d'autres pistes. Ca ne coute pas grand chose de les évoquer. :wink:

Ca semble marcher désormais en changeant de breadboard.

Un câblage simpliste fonctionne pourtant sur la première. :~

Pour la petite histoire, je voulais à la base reproduire un récepteur RF tel que décrit ici:
http://www.practicalarduino.com/projects/weather-station-receiver
J'avais remis en cause le bon fonctionnement du matériel quand je constatais l'instabilité du récepteur avec la sortie branchée sur une interruption.
Bon, celui-là reste instable, mais semble l'être moins en alimentant en 3,3v.
Je crois que je vais finir par devoir investir dans un oscillo...

Ah le charme de la plaquette pastillée et du fer à souder............

Moi, j'aurais pensé au BP qui ne serait pas relié à la masse de l'arduino... C'est tellement c** qu'on n'y pense pas...