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;
}