This is an old revision of the document!


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 Synchronized interrupts work by remembering the values of the inputs, which means that the changes in logical values are found by comparing values read during two different clock cycles. If the logical changes in the signal happen faster than the controller's duty-cycle, the interrupts either fire incorrectly or are skipped altogether. Asynchronous interrupts do not depend on the controller's clock and enable detecting faster changes in the external signal as well - the logical level must still be constant for at least 50 ns. ATmega128 has 4 synchronized and 4 asynchronous external interrupts.

 

Exemple

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 <avr/interrupt.h>
 
// 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.

fr/avr/external_interrupts.1269253103.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0