//------------------------------------------------------------------- /*! * \fn void exo13() * \brief Exercice 13: * Gestion d'une interruption matérielle: ajouter à l'exo12 la commande de la * commutation de la LED connectée à LEDPIN par l'appui sur le bouton poussoir * connecté à BUTTONPIN. Pour cela vous utiliserez une interruption sur broche. * La liste des vecteur d'interruption est visible en page 49 de * https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf * vous utiliserez external interrupt en page 53, BUTTONPIN doit être égal à 2 * car c'est uniquement cette broche qui peut déclencher cette interruption. */ void exo13(){ exo12(); } //Début solution void setupINT0(){ pinMode(LEDPIN, OUTPUT); digitalWrite(LEDPIN,HIGH); pinMode(BUTTONPIN, INPUT_PULLUP); cli(); // disable all interrupts EICRA= (EICRA&0xFC) |2; //ICS0 = 10 pour front descendant EIMSK= EIMSK|1; //enable INT0 sei(); // enable all interrupts } //------------------------------------------------------------------- /* PROBLEME IL Y A LES REBONDS SUR LE POUSSOIR.... anti rebond par logiciel * en inhibant les interruptions après la première pendant un certain temps */ ISR(INT0_vect) { unsigned int minTempsEntreIT0=300; static unsigned long timerIT0 = millis(); static unsigned char counter=0; unsigned long timeActuel=millis(); if ( timeActuel - timerIT0 >= minTempsEntreIT0) { timerIT0=timeActuel; if (counter==0) digitalWrite(LEDPIN,LOW); //allume else digitalWrite(LEDPIN,HIGH); //eteind counter = (counter+1)%2; Serial.println("it"); } } ////autre exo à envisager: désactivation dans l'it puis réactivation dans loop via timer partagé //------------------------------------------------------------------- //temporisation avec interruption timer -> sera vu au tp suivant sur afficheur 7 segments //------------------------------------------------------------------- //Fin solution