const byte LED=8;
const byte INT=3;
int etat=LOW;
void clignote(){            // Procédure d'interruption
etat=(etat==LOW)?HIGH:LOW;
digitalWrite(LED,etat);
}
void setup(){
pinMode(LED,OUTPUT);        // Sortie pour la LED
pinMode(INT,INPUT);         // Entrée pour le détecteur infrarouge 
attachInterrupt(digitalPinToInterrupt(INT),clignote,CHANGE);
}
void loop(){}               // Rien dans la boucle principale
#include <avr/io.h>
#include <avr/interrupt.h>
#define INT_BAS         0
#define INT_CHANGE      1
#define INT_DESCENTE    2
#define INT_MONTEE      3
void interruption_init        // Initialisation d'interruption
   (uint8_t num,uint8_t mode){
uint8_t isc0=0,isc1=0;
switch(mode){
  case INT_BAS:               // Interruption sur niveau bas
    isc0=0; isc1=0; break;
  case INT_CHANGE:            // Interruption sur changement d'état
    isc0=1; isc1=0; break;
  case INT_DESCENTE:          // Interruption sur front descendant
    isc0=0; isc1=1; break;
  case INT_MONTEE:            // Interruption sur front montant
    isc0=1; isc1=1; break;
  }
if(num==0){                   // Configuration pour INT0
  EICRA |= (isc1<<ISC01)|(isc0<<ISC00);
  EIMSK |= (1<<INT0);
  }
if(num==1){                   // Configuration pour INT1
  EICRA |= (isc1<<ISC11)|(isc0<<ISC10);
  EIMSK |= (1<<INT1);
  }
}
ISR(INT1_vect){               // Procédure d'interruption
PORTB ^= 0x01; }
int main(void){
DDRB |= 0x01;
DDRD &= ~0x08;
interruption_init(1,INT_CHANGE);
sei();                        // Autorisation des interruptions
while(1);
return 0;
}