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