Vous êtes sur la page 1sur 16

Les Interruptions (1/16)

Définition
Une interruption est un signal demandant au processeur de suspendre
temporairement l’exécution du programme courant afin d’effectuer des
opérations particulières.
Ce mécanisme permet d’implémenter une réaction à une sollicitation en
respectant les exigences suivantes:
• offrir un délai de réponse très bref,
• programmation indépendante du code en cours d’exécution.
Le système d'interruption est le dispositif incorporé au séquenceur qui
détecte les signaux d'interruption.
Ces signaux arrivent de façon asynchrone, à n'importe quel moment, mais
ils ne sont pris en compte qu'à la fin de l'opération en cours.

Pr F. I. Barro, Microcontroleur AVR 1


Les Interruptions (2/16)

Source des interruptions


Les interruptions peuvent être déclenchées :
soit par un composant extérieur au processeur
- requête d’interruption (Interrupt ReQuest, IRQ), signalée via une ou
plusieurs broches configurables ou non,
- soit par un périphérique interne au composant (cas des microcontrôleurs
ou des DSP): interruption initiée par un timer, convertisseur A/N,
watchdog, …
- soit par la CPU: exception d’exécution ou dépassement lors d’un calcul
arithmétique, interruption logicielle (exception de privilège, opération
illégale …)

Pr F. I. Barro, Microcontroleur AVR 2


Les Interruptions (3/16)

Mécanisme de gestion d’une interruption


Lorsqu’une interruption survient , les opérations suivantes sont
effectuées par le processeur:
1. L’instruction en cours termine son exécution.
2. L’adresse de la prochaine instruction à exécuter est sauvegardée sur
la pile.
3. L’adresse de la routine d’exécution appropriée est obtenue en
chargeant le contenu d’un vecteur d’interruption.
4. La routine d’interruption est exécutée.
5. A la fin de la routine d’interruption, le processeur reprend
l’exécution du programme suspendu à l’adresse sauvegardée sur la pile.

Pr F. I. Barro, Microcontroleur AVR 3


Les Interruptions (4/16)

3 Types d’interruption:
1. Reset du système
2. Interruption non-masquable (NMI – Non
Maskable Interrupt)
3. Interruption masquable

Pr F. I. Barro, Microcontroleur AVR 4


Les Interruptions (5/16)

Interruption non-masquable (NMI – Non Maskable Interrupt)

Ne sont pas masqués par le General Interrupt Enable bit (GIE) mais peuvent être
activés par des bits individuels.
• Lorsqu'un NMI est accepté, tous les bits d'activation individuels sont
réinitialisés automatiquement, l'exécution du programme commence à l'adresse
stockée dans le vecteur d'interruptions non masquables (0FFFCh).
• Le programme utilisateur doit mettre les bits NMI en enable explicitement pour les
réenclencher.
• Un NMI peut être généré par une des 3 sources :
– Un pic (edge) sur la pin RST/NMI seul cas possible pour les AVR !
– Une faute d'oscillateur.
– Une violation d'accès dans la mémoire flash.

Pr F. I. Barro, Microcontroleur AVR 5


Vecteurs d’interruptions et niveaux
Les Interruptions (6/16) de priorité

Pr F. I. Barro, Microcontroleur AVR 6


Les Interruptions (7/16)

2 types d’interruptions externes possibles sur les E/S

Interruptions sur niveau bas, Interruptions sur changement


changement de niveau, front: de niveau seulement
INT0,…, INT7 PCINT0,…, PCINT23

les registres concernés sont les registres concernés sont


EICRA et/ou EICRB, EIMSK, EIFR PCICR, PCMSK0, PCMSK1,
PCMSK2, PCIFR.

Pr F. I. Barro, Microcontroleur AVR 7


Les Interruptions (8/16)

2 types d’interruptions externes possibles sur les E/S

Interruptions sur niveau bas, Interruptions sur changement


changement de niveau, front: de niveau seulement
INT0,…INT7 PCINT0,…, PCINT23

les lignes concernées sont : les lignes concernées sont :


INT0 = PD0 PCINT0 à PCINT7 = PB0 à PB7,
INT1 = PD1 PCINT8 = PE0,
INT2 = PD2 PCINT9 à PCINT15 = PJ0 à PJ6,
INT3 = PD3 PCINT16 à PCINT23 = PK0 à PK7.
INT4 = PE4
INT5 = PE5
INT6 = PE6
INT7 = PE7
Pr F. I. Barro, Microcontroleur AVR 8
Les Interruptions (9/16)

Pr F. I. Barro, Microcontroleur AVR 9


Les Interruptions (10/16)

Pr F. I. Barro, Microcontroleur AVR 10


Les Interruptions (11/16)

INTx = 1 : interruption locale activée

I = 1 : interruptions globales activées

Pr F. I. Barro, Microcontroleur AVR 11


Les Interruptions (12/16)

Prise en compte des interruptions sur une des lignes PCINT23:16

Prise en compte des interruptions sur une des lignes PCINT15:8

Prise en compte des interruptions sur une des lignes PCINT7:0

Prise en compte des interruptions sur une des lignes PCINTx sur
changement d’état de la ligne associée

Pr F. I. Barro, Microcontroleur AVR 12


Les Interruptions (13/16)

Pr F. I. Barro, Microcontroleur AVR 13


Les Interruptions (14/16)
Mise en œuvre logicielle:

• Inclure le fichier d’entête pour les interruptions: #include <avr/interrupt.h>

ISR(nom du vecteur d’interruption) ISR(INT0_vect)


{ {
• Déclarer et écrire le corps de la fonction d’interruption:
//faire qq chose //faire qq chose
} }

les registres concernés sont


EICRA et/ou EICRB, EIMSK,
• Dans le programme principal (main) configurer les lignes
EIFR;
par lesquelles on souhaite que des interruptions surviennent:
PCICR, PCMSK0, PCMSK1,
PCMSK2, PCIFR

sei(); //Activation globale des interruptions


• Activation globale des interruptions dans le registre SREG:
// cli(); // Désactivation globale des interruptions

Pour les noms des vecteurs d’interruption, voir le lien ci-dessous:


Pr F. I. Barro, Microcontroleur AVR 14
https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__interrupts.html
Les Interruptions (15/16)
Mise en œuvre logicielle: Exemple des lignes PE4 (INT4) et PE5 (INT5)
PE4 = bouton poussoir S3 avec Rpullup externe et PE5 = bouton poussoir S4 avec Rpullup externe
Détection des appuis de S3 et S4 par interruption
DDRE &= ~(S3 + S4);
EICRB |= (1 << ISC41) + (1 << ISC51);//détection sur front descendant
Configuration des lignes PE4 et PE5: //EICRB |= (1 << ISC41) + (1 << ISC40) + (1 << ISC51) + (1 << SC50);//détection sur front montant
EIMSK |= (1 << INT4) + (1 << INT5);// activation locale pour INT4 et INT5
EIFR |= (1 << INTF4) + (1 << INTF5);

ISR(INT4_vect) ISR(INT5_vect)
{ {
unsigned char i; unsigned char i;
for (i=0; i<10; i++) for (i=0; i<10; i++)
Déclarer et écrire le corps de la fonction d’interruption:
{ {
bleu_on_off(); rouge_on_off();
} }
} }

Pr F. I. Barro, Microcontroleur AVR 15


Activation globale des interruptions dans le registre SREG avant le « while(1) »: sei(); //Activation globale des interruptions
Les Interruptions (16/16)
Mise en œuvre logicielle: Exemple des lignes PK0 (PCINT16) et PK1 (PCINT17)
PK0 = bouton poussoir S1 avec Rpullup externe et PK1 = bouton poussoir S2 avec Rpullup externe
Détection des appuis de S1 et S2 par interruption
DDRK &= ~(S1 + S2);
PCICR |= (1 << PCIE2);
Configuration des lignes PK0 et PK1:
PCMSK2 |= (1 << PCINT16) + (1 << PCINT17); // ou bien: PCMSK2 |= S1 + S2;
PCIFR |= (1 << PCIF2);

ISR(PCINT2_vect)
{
unsigned char i;
if (!(PINK & S1)) if (!(PINK & S2))
{ {
Déclarer et écrire le corps de la fonction d’interruption: for (i=0; i<10; i++) for (i=0; i<10; i++)
{ {
jaune_on_off(); blanc_on_off();
} }
} }
}
Pr F. I. Barro, Microcontroleur AVR 16
Activation globale des interruptions dans le registre SREG avant le « while(1) »: sei(); //Activation globale des interruptions

Vous aimerez peut-être aussi