====== Interruptions externes ====== Les interruptions externes sont une des fonctions périphériques les plus simples. Les AVRs classiques ont de 1 à 8 broches spécifiques, qui sont utilisées pour lancer des interruptions dans le programme quand leur valeur logique change ou lorsqu'elles sont à un certain état. Puisque cette fonction est d'habitude utilisée pour contrôler des signaux logiques externes, ces broches sont appelées des broches d'interruptions externes. Pour utiliser une interruption externe, la broche doit être configurée entrée standard (elle peut aussi l'être en sortie mais dans ce cas l'interruption ne pourra être réalisée que par l'utilisateur lui-même). Il est ensuite nécessaire d'affecter l'interruption correspondante ainsi que la condition nécessaire à l'exécution de cette interruption externe. Il existe quatre conditions possibles: * Le zéro logique (tension à 0V) * Un changement de la valeur logique * Un front descendant - la valeur logique change de 1 vers 0. * Un front montant - la valeur logique change de 0 vers 1. Lorsque le mode est configuré en zéro logique, l'interruption est exécutée continuellement aussi longtemps que la broche est à la valeur 0. Pendant cette période l'exécution du programme principal est interrompue. Il existe deux types d'interruptions: les interruptions synchronisées à l'horloge du contrôleur et celle qui sont non synchronisées. Les interruptions synchronisées travaillent en retenant les valeurs des entrées, cela signifie que les changements des valeurs logiques sont trouvés en comparant les valeurs lues de deux cycles d'horloge différents. Si le changement logique du signal intervient plus vite que le cycle de fonctionnement du contrôleur, il se peut que l'interruption ne fonctionne pas correctement ou s'arrête d'elle-même. Les interruptions non synchronisées ne dépendent pas de l'horloge du contrôleur et est alors capable de détecter les modification d'un signal externe plus facilement - le niveau logique doit rester constant au moins 50 ns. ATmega128 contient 4 interruptions externes synchronisées et 4 non synchronisées. Tâche: Faire un sorte que la broche numéro 9 (broche 7 du bus E) de l'ATmega128 lance une interruption si sa valeur change. Cette broche correspond à l'interruption externe INT7, à laquelle elle est synchronisée. #include // The code of the external interrupt ISR(INT7_vect) { // Do something } int main() { // Change pin 7 on bus E to an input by changing bit 7 to zero DDRE &= ~(1 << PIN7); // Defining a pull-up resistor to to pin 7 on bus E // to prevent input floating PORTE |= (1 << PIN7); // Set the interrupt mode to logical change for interrupt 7 // in the external interrupt configuration register EICRB = (1 << ISC70); // Allow external interrupt 7 EIMSK |= (1 << INT7); // Allow global interrupts sei(); // Endless loop while (1) continue; } En plus des interruptions lancées par de simples broches, si l'AVR a assez de broche il est possible d'utiliser un groupe entier de broches pour lancer des interruptions de changement de valeurs logiques. Ces interruptions sont appelées interruptions de changement de broches. Elles sont exécutées quand la valeur de la dernière broche est modifiée.