[APL]  (<-Aller plus loin) interruption exter

Bonjour à tous,

Rapidement, on ressent tous le besoin de gérer les interruptions externes avec Arduino.

En attendant la fonction « attachInterrupt() » en « wiring », voici un exemple qui peux vous servir de point de départ pour vos programmes.

L'interruption externe 0 correspond physiquement à la broche « digital 2 » de la carte Arduino. C'est en réponse à un événement logique sur cette broche que sera appelée la fonction « SIGNAL(SIG_INTERRUPT0) ». Le paramétrage de l'événement déclencheur (front descendant, front montant, ?) s'opère via la fonction « initInt0(?) ».

Ce petit programme ne fait pas grand-chose, il fait basculer l'état de la broche 2 toutes les 250 milliseconde. Et change à chaque occurrence de l'interruption, l'état de la broche 13 (celle où l'on peux connecter une LED directement sans résistance). Pour visualiser facilement les différents modes de déclenchement de l'interruption, connecter une LED sur la broche 13 (et GND) et une autre via résistance env. 560 Ohm entre la broche 2 et GND. Changer le mode de déclenchement de l'interruption 0 via la fonction initInt0(?) et voyez ce qui se passe. Pour plus d'information sur les interruption extérieures consultez la documentation en anglais de l'ATmega8 : http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf pages 66 et suivantes.

Notez que :

  • que la broche 2 soit configurée en entrée ou en sortie, l'interruption se comporte pareil face aux transitions d'états ;
  • ce code ne gère que l'interruption externe 0 ;
  • qu'il n'est pas garantit qu'il fonctionne avec les futures évolutions de la librairie Arduino ;
  • que ce code n'a été testé qu'avec l'environnement de développement version 004.

Si ce code vous est utile, si vous avez des commentaires, des remarques et même des critiques, laissez un message à la suite :).

/***************************************/
// TEST_INTERUPT Arduino
// Benoît ROUSSEAU mai 2006
// - Contrôle d'une LED sous interruption.
// - C'est un essai "pour voir" et pour
// aller plus loin.
/***************************************/

// variables et définitions
// pour la LED branchée sur 
// la broche 13
#define LED  13
#define ALLUMEE HIGH
#define ETEINTE LOW
byte etatLED = ALLUMEE;  // état de la LED

#define EXTINT_LEVEL_LOW      0x00      // trigger on low level
#define EXTINT_EDGE_ANY            0x01      // trigger on any edge
#define EXTINT_EDGE_FALLING      0x02      // trigger on falling edge
#define EXTINT_EDGE_RISING      0x03      // trigger on rising edge

#define SUR_NIVEAU_BAS          EXTINT_LEVEL_LOW     // déclenchement sur niveau bas
#define SUR_FRONT_TOUS            EXTINT_EDGE_ANY           // déclenchement sur tous les fronts
#define SUR_FRONT_DESCENDANT      EXTINT_EDGE_FALLING  // déclenchement sur les fronts descendant
#define SUR_FRONT_MONTANT      EXTINT_EDGE_RISING   // déclenchement sur les fronts montants

#define sbi(PORT,BIT) PORT|=_BV(BIT)   // macro pratique pour mettre un bit x à 1 (Set Bit In)
#define cbi(PORT,BIT) PORT&=~_BV(BIT)  // macro pratique pour mettre un bit x à o (Clear Bit In)

/***************************************/
// Fonction appelée à chaque
// déclenchement de l'interruption 0
/***************************************/
SIGNAL(SIG_INTERRUPT0)
{
  digitalWrite (LED, etatLED);
  etatLED = !etatLED;
}

/***************************************/
// iniInt0
/***************************************/
// Initialisation de l'interruption 0
// valeurs possibles pour config :
// - SUR_NIVEAU_BAS
// - SUR_FRONT_TOUS
// - SUR_FRONT_DESCENDANT
// - SUR_FRONT_MONTANT
/****************************************/
void initInt0 (byte config)
{
  sbi(GICR, INT0); // 
  sbi(GIFR, INT0); // 

  MCUCR &= ~((1<<ISC01) | (1<<ISC00)); // raz
  MCUCR |= config; // 
}

/***************************************/
void setup()
{
  pinMode(2, OUTPUT);
  initInt0(SUR_FRONT_TOUS);
};

void loop ()
{
    digitalWrite (2, LOW);
    delay(250);
    digitalWrite (2, HIGH);
    delay(250);
};