Go Down

Topic: Problème interruption (Read 705 times) previous topic - next topic

alambic

Bonjour à tous,

Je suis nouveau dans la communauté arduino, et je rencontre quelques problèmes concernant une interruption externe.

J'ai programmé mon atmega328, puis placé sur mon circuit imprimé. Le microcontrôlleur fonctionne avec son horloge interne à 8MHz, et j'ai connecté une resistance de 10k à la broche reset. Le problème est que, l'interruption ne se fait jamais, et fait redémarrer le circuit :(    (une sorte de reset).

Voici le code, de mon côté, je sèche:
Code: [Select]

#include <math.h>

int bouton = 0;
volatile float maximum=700;
int dizaine;
int unite;
float val;

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(16, OUTPUT);
  for (int i = 3; i < 14; i++)
  {
    pinMode(i, OUTPUT);
  }
  pinMode(2, INPUT);
  digitalWrite(2,HIGH);
  attachInterrupt(bouton, normalisation, CHANGE);
}

int nombre_d(int number_d) {
  if (number_d == 0)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(8, LOW);
  }
  if (number_d == 1)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(8, LOW);
  }
  if (number_d == 2)
  {
    digitalWrite(1, LOW);
    digitalWrite(15, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(8, HIGH);
  }
  if (number_d == 3)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(8, HIGH);
  }
  if (number_d == 4)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(8, HIGH);
  }
  if (number_d == 5)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(8, HIGH);
  }
  if (number_d == 6)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(8, HIGH);
  }
  if (number_d == 7)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(8, LOW);
  }
  if (number_d == 8)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(8, HIGH);
  }
  if (number_d == 9)
  {
    digitalWrite(1, HIGH);
    digitalWrite(15, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(8, HIGH);
  }
}

int nombre_u(int number_u) {
  if (number_u == 0)
  {
    digitalWrite(16, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(13, LOW);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
  }
  if (number_u == 1)
  {
    digitalWrite(16, LOW);
    digitalWrite(12, LOW);
    digitalWrite(10, LOW);
    digitalWrite(13, LOW);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, LOW);
  }
  if (number_u == 2)
  {
    digitalWrite(16, HIGH);
    digitalWrite(12, LOW);
    digitalWrite(10, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(11, HIGH);
  }
  if (number_u == 3)
  {
    digitalWrite(16, LOW);
    digitalWrite(12, LOW);
    digitalWrite(10, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
  }
  if (number_u == 4)
  {
    digitalWrite(16, LOW);
    digitalWrite(12, HIGH);
    digitalWrite(10, LOW);
    digitalWrite(13, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, LOW);
  }
  if (number_u == 5)
  {
    digitalWrite(16, LOW);
    digitalWrite(12, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(9, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
  }
  if (number_u == 6)
  {
    digitalWrite(16, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(9, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
  }
  if (number_u == 7)
  {
    digitalWrite(16, LOW);
    digitalWrite(12, LOW);
    digitalWrite(10, HIGH);
    digitalWrite(13, LOW);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, LOW);
  }
  if (number_u == 8)
  {
    digitalWrite(16, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
  }
  if (number_u == 9)
  {
    digitalWrite(16, LOW);
    digitalWrite(12, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
  }
}

void normalisation() {
    maximum=analogRead(0);
}


void loop() {
val=(analogRead(0)/maximum)*100;
dizaine=round(floor(val/10));
unite=round(floor(val-10*floor(val/10)));
if ( dizaine > 9 ) {
dizaine=9;
unite=9;
}

nombre_d(dizaine);
nombre_u(unite);
delay(300);
}

68tjs

Si tu actionne la broche "reset" c'est normal que tu fasse un reset  :smiley-mr-green:

Avec la fonction attachInterrupt() il faut utiliser les interruptions dites "0" et "1" disponibles respectivement sur les broches numérotées 2 et 3.

Déplace la résistance et le bouton poussoir vers une de ces deux broches et cela devrait mieux.

alambic

Merci pour ta réponse, cependant cela ne vient pas de là. En effet, j'ai bien connecté la broche INT0 sur la partie dédiée à l'interruption (juste un bouton poussoir et une resistance).

Sachant que je suis en horloge interne (8 MHz), que dois-je lier à la broche reset? Merci par avance.

barbudor

#3
Apr 07, 2012, 06:07 pm Last Edit: Apr 08, 2012, 07:18 pm by barbudor Reason: 1
Tu es sur un montage perso (plaque a trou, circuit imprimé...) ou sur une vrai Arduino ?

Dans le dernier cas, tu ne touche pas à la broche reset.

Dans le premier cas tu relit encore une fois les schémas de référence d'une carte Arduino (Uno par ex.) et tu découvres ce que tu doit faire de ton signal reset.
Si tu continue à te prendre des resets c'est que tu a quelque chose qui vient faire reset (genre faux contact, cour-circuit, résistance de pull-up trop grande....

De plus, si ton interruption est crée par un BP+résistance, tu ne devrais pas utiliser le mode CHANGE qui va déclencher une interruption quand tu presses et quand tu laches le bouton (sans compter les rebonds).
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

skywodd

Salut,

Ton programme à l'air correcte, tu doit surement avoir un probléme au niveau de ton schéma.

Sans schéma ce sera pas possible de te venir en aide ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

alambic

En effet, cela sera plus facile avec un schéma de montage. Le voici:
http://hpics.li/333377a
Vous reconnaissez, l'alimentation  en haut avec la conversion de 9V en 5V via un régulateur de tension 7805.
La sonde de luminosité TEMT6000 alimentée en 5V et raccordée sur la pin analogique 0.
L'interruption, qui est générée sur la pin INT0.
Les autres pins digitales sont raccordées aux deux afficheurs 7 segments comme indiqué sur le code fourni lors de mon premier post.

Je n'ai pas mis de resistance de rappel et pas mis de quartz, car j'utilise l'horloge interne cadencée à 8MHZ, comme indiqué sur ce lien:
http://arduino.cc/en/Tutorial/ArduinoToBreadboard

Je rappel, que tout marche,sauf l'interruption.
Je vous remercie par avance.

barbudor

Tu es certain que c'est câblé comme sur ton dessin ?

Dans ton câblage la broche d'interruption est toujours reliée au GND et quand tu appuie sur le poussoir, la resistance se relie au GND aussi.
Mais rien ne se passe sur la pin d'interruption!

Dans ce cas tu as fait une erreur sur la position du poussoir.
La pin d'interruption doit être reliée par le pull-up au VCC et le poussoir doit mettre la pin d'interruption en contact avec le GND quand on appuie dessus.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

alambic

C'est bon, j'ai enfin trouvé l'erreur. La broche d'interruption était par défaut câblée à la masse. Il faut le faire au +5V comme indiqué sur ce schéma:
http://www.laboelectronique.be/image/ard_inter.jpg

Merci de m'avoir aidé. À bientôt.

Go Up