Vous êtes sur la page 1sur 10

Université Badji Mokhtar – Licence Electronique

Matière : Systèmes à microprocesseurs 2023/2024


Enseignant : Dr S.BENSAOULA

Les interruptions

I. Introduction
Une interruption est un évènement qui provoque la rupture du programme principal et
l’exécution d’une procédure d'interruption. A la fin de cette procédure, le pic reprend
l’exécution du programme principal à l’endroit où il l’a laissé.
L’évènement déclencheur de l’interruption peut être une impulsion électrique externe ou une
interruption logicielle interne au pic.
Lorsqu’une interruption survient, le pic termine d’abord l'instruction en cours d’exécution
ensuite il lance l’exécution du sous-programme d'interruption.

Prise en compte de l’interruption

A chaque interruption sont associés deux bits (registre INTCON) :


- un bit de validation (autorisation) : permet d'autoriser ou non l'interruption.
- un drapeau (flag) : qui passe à 1 au déclenchement de l’interruption correspondante et
permet au programmeur de détecter sa présence.

1
II. Mécanisme de fonctionnement
La séquence classique de fonctionnement d'une interruption est la suivante :

1- Détection de l'événement déclencheur


2- Fin de l'instruction en cours
3- Sauvegarde de l'adresse de retour
4- Interdiction d’autres interruptions et déroutement vers la routine d'interruption
5- Sauvegarde de l’environnement
6- Identification de l'événement survenu
7- Traitement de l'interruption correspondante
8- Restauration de l’environnement
9- Retour au programme initial et autorisation des interruptions

Nous expliquons plus en détail chacune de ces étapes.


1. Détection de l'événement déclencheur :
le pic détecte la source d’interruption grâce au passage à 1 du bit flag.
2. Fin de l’instruction en cours :
Dès la détection de l’interruption, le pic termine d’abord l’exécution de l’instruction
en cours (adresse N)
3. Sauvegarde de l'adresse de retour :
L’exécution de l’instruction d’adresse N étant terminée, le pic sauvegarde dans la
pile l’adresse N+1 de reprise de l’exécution.
4. Déroutement vers la routine d'interruption :
Apres avoir sauvegardé l’adresse de retour N+1, le pic interdit la prise en compte
d’autres interruptions, et charge dans le PC (Program Counter ) l’adresse 0x04 de la
procédure d’interruption : l’exécution du sous-programme d’interruption démarre.

Remarques
Le pic interdit qu’un autre évènement (interruption) vienne interrompre une
procédure d’interruption en cours d’exécution. Cependant le programmeur peut
autoriser les interruptions à l’intérieure d’une procédure d’interruption.
PC : registre de 13 bits qui pointe la mémoire flash, donc il contient l’adresse de
l’instruction qui sera exécutée.
5. Sauvegarde de l’environnement :
La procédure d’interruption commence toujours par la sauvegarde de certains
registres. C’est au programmeur de sauvegarder l’environnement de travail, c’est-à-
dire les registres qui sont utilisés dans le programme principal mais aussi dans le
sous-programme d’interruption. Le contenu de ces registres est sauvegardé en
mémoire RAM.
6. Identification de l’évènement survenu :
A l’intérieur du sous-programme d’interruption on identifie la source de
l’interruption qui a causée la rupture de l’exécution du programme principal. Nous
verrons qu’il y a plusieurs sources d’interruption.

2
7. Une fois la source identifiée, on répond au service de cette interruption, c’est-à-dire
on exécute le programme correspondant.

8. Restauration de l’environnement :
Une fois l’exécution du programme correspondant à la source d’interruption
terminée, on doit restaurer c’est-à-dire transférer les contenus des registres
sauvegardés en RAM vers les registres respectifs.

9. Retour au programme principal :


Après la restauration, le pic exécute l’instruction de retour retfie qui consiste à
transférer l’adresse de retour N+1 de la pile vers le registre d’adresse PC, et autorise
la prise en compte d’autres interruptions.
L’exécution du programme principal reprend à partir de l’adresse (N+1).

Résumé
Apparition d’un évènement déclencheur d’une interruption, alors le pic exécute les actions
suivantes :
1. Sauvegarde le registre PC (adresse N+1) dans la pile, puis charge l’adresse 0x04 dans
le PC.
2. Interdiction d’autres interruptions : bit GIE = 0 (registre INTCON)
Fin procédure (retfie) :
1. L’adresse N+1 est transférée de la pile vers le PC
2. Autorisation des interruptions : bit GIE = 1 (registre INTCON)
C’est au programmeur:
1. d’identifier la source de l’interruption en testant les bits flag
2. de remettre à 0 le bit flag qui a provoqué l’interruption
3. de sauvegarder et de restituer les registres

III. Les sources d’interruption


Le pic 16F84 possède 4 sources d’interruption. La gestion de ces sources d’interruptions se
fait à l’aide de bits du registre INTCON. Chaque source possède 2 bits : l’un pour sa
validation (autorisation) ou son interdiction, et l’autre est un bit flag (drapeau) qui nous
informe si un évènement s’est produit ou non.
Interruption Source d’interruption bit validation bit flag
T0I débordement TMR0 (interne) T0IE T0IF
INT front sur pin RB0/INT (externe) INTE INTF
RBI front sur RB4-RB7 (externe) RBIE RBIF
EEI fin d’écriture en EEPROM (interne) EEIE EEIF
*
* : ce bit se trouve dans le registre EECON1

Les bits flag (drapeau) passent à 1 lors de la survenue d’une interruption. C’est au
programmeur de remettre ce bit à 0.

3
Le registre INTCON

L'interruption INT (entrée RB0 du PORTB)


La ligne RB0 est programmée en entrée. Un changement d’état ( ou ) sur l’entrée RB0
provoque une interruption. En plus de son bit de validation INTE et son drapeau INTF, elle
est gérée aussi par le bit INTEDG (registre OPTION_REG) qui détermine le front sur lequel
l'interruption se déclenche, 1=montant, 0=descendant.

L'interruption RBI (RB4 à RB7 du PORTB)


Les lignes RB4 à RB7 sont configurées en entrée. Cette interruption est provoquée par un
changement d'état sur l'une des entrées RB4 à RB7 du port B, le front n'a pas d'importance.
Les bits associés sont RBIE (validation) et RBIF (drapeau).

L'interruption T0I
Le débordement du registre TMR0 déclenche cette interruption. Les bits associés sont T0IE
(validation) et T0IF (drapeau).

L'interruption EEI
La fin de l’écriture dans la mémoire EEPROM génère cette interruption. Les bits associés
sont EEIE (validation) et EEIF (drapeau).

Lorsque les interruptions sont utilisées, le bit GIE doit être mis à 1 au début du programme
principal : GIE=1. A l’arrivée d’une interruption quelconque, le pic force GIE à 0 : GIE = 0 et
le remis à 1 à la sortie de la procédure d’interruption. Si le programmeur veut autoriser les
interruptions à l’intérieur de la procédure d’interruption, il doit mettre à 1 GIE: GIE=1.

4
IV. Reconnaissance de l'interruption active
Il n'existe qu'une adresse d'interruption, 0004h, pour les différentes sources. Les bits 0 à 2 du
registre INTCON et le bit 4 du registre EECON1 permettent de savoir quel événement a
déclenché une interruption. Ainsi, au début du programme d'interruption, si plusieurs sources
ont été validées, il faut impérativement aller tester ces différents bits pour connaître la source
active et dérouler le programme correspondant. On propose le code assembleur suivant
d’identification de la source d’interruption :

btfsc INTCON, 0 ; test du bit RBIF


call Int_PB ; appel sous-programme si RBIF=1
btfsc INTCON, 1 ; test du bit INTF
call Int_Ext ; appel sous-programme si INTF=1
btfsc INTCON, 2 ; test de bit T0IF
call Int_Timer ; appel sous-programme si T0IF=1
btfsc EECON1, 4 ; test de bit EEIF
call Int_EEPROM ; appel sous-programme si EEIF=1
Si aucun flag n’est positionné à 1 on génère un message d’erreur.
La priorité
Lorsqu’un système de traitement numérique est soumis à plusieurs sources d’interruption, le
programmeur doit instaurer un ordre de priorité dans la prise en compte de ces interruptions.
La mise en place d’un ordre de priorité dépend de l’architecture du processeur. Dans le cas du
pic 16f84, la priorité est réalisée lors de l’identification de la source d’interruption. Si deux ou
plusieurs évènements se sont déclenchés simultanément, l’identification de la source
commence par tester le bit flag de la source la plus prioritaire, et se termine par le test du bit
flag de la source la moins prioritaire.

Exemple
Soit les sources T0I et INT, avec T0I la plus prioritaire. A l’identification on procède comme
suit :
..
..
org 0x04
; sauvegarde contexte
..
..
; identification
btfsc INTCON, 2 ; test de bit T0IF
call Int_Timer ; appel sous-programme si T0IF=1
btfsc INTCON, 1 ; test du bit INTF
call Int_Ext ; appel sous-programme si INTF=1
..
..
5
Même s’il y a l’arrivée d’une seule interruption, le pic exécute toujours cette identification
dans cet ordre.

Intérêt des interruptions


Si les interruptions ne sont pas autorisées, alors le microcontrôleur doit scruter les bits flag en
permanence afin de détecter l’éventuelle arrivée d’un évènement. Si le processeur veut
exécuter d’autres taches, ceci augmentera considérablement la charge de traitement. C’est
pour permettre au microcontrôleur d’exécuter d’autres taches (calcul, affichage,
communication, etc.) qu’on met en place un système d’interruption. Le microcontrôleur
est occupé dans l’exécution d’autres programmes, c’est aux évènements externes et internes
s’ils sont validés de l’interrompre.

V. Sauvegarde et restitution du contexte


C'est un point important pour tous les sous-programmes, qui devient capital pour les sous-
programmes d'interruption. En effet, dans le sous-programme d’interruption beaucoup
d'instruction modifient le registre STATUS et/ou utilisent le registre w. Afin de rendre les
registres STATUS et w dans le même état à la fin du sous-programme d'interruption qu'au
début, il faut les sauvegarder au début et les restituer à la fin. Si d'autres registres sont utilisés
dans le sous-programme d'interruption, il faut généralement les sauvegarder aussi. Ainsi le
programme principal continue à fonctionner correctement après l’interruption.

Où sauvegarder ces registres ?


Dans le cas des pics on définit une zone de sauvegarde dans la RAM.

cblock 0x0C ; début de la zone de stockage


sauve_w : 1 ; 1 octet réservé pour la sauvegarde de w
sauve_Status :1 ; 1 octet réservé pour la sauvegarde de STATUS
endc
Comment sauvegarder ces registres ?
Pour w, il suffit d'utiliser l'instruction :

movwf sauve_w ; sauvegarde de w

Pour sauvegarder STATUS:


movf STATUS, w ; écrire la valeur de STATUS dans w
movwf sauve_Status ; sauvegarde STATUS dans sauve_Status

La première instruction movf modifie le bit Z du registre STATUS, on doit donc l’éviter.

La solution consiste à utiliser l'instruction swapf qui intervertit les 4 bits de poids fort et de
poids faible d'un registre, sans modifier le registre STATUS.

6
Principe
Soit input = 0x0F

swapf input, f

ou bien

swapf input, w ; résultat dans w

La séquence suivante permet de sauvegarder STATUS "swapé" :

swapf STATUS, w ; écrit STATUS "swapé" dans w


movwf sauve_Status ; sauvegarde de STATUS "swapé"

Comment restituer ces registres ?


La restitution des contenus des registres consiste à récupérer ces contenus en les transférant de
la mémoire RAM vers les registres respectifs.

a) On commence en premier lieu par restituer STATUS sans le modifier. Comme


STATUS a été sauvegardé "swapé", on doit récupérer son contenu en utilisant swapf
afin de retomber sur la valeur initiale.

swapf sauve_Status, w ; écrit sauve_Status "swapé" dans w


movwf STATUS ; restitue STATUS original

b) Pour restituer w on évite :

movf sauve_w, w ; car elle modifie STATUS

On utilise swapf :

swapf sauve_w, f ; écrit sauve_w "swapé" dans lui-même


swapf sauve_w, w ; swap sauve_w dans w, on obtient l’ancien valeur de w

7
Application
On propose le schéma de la figure suivante:

Chaque action sur BP déclenche l’interruption INT sur le front montant de l’impulsion.
Le programme principal s’arrête et le pic exécute le sous-programme d’interruption qui
inverse l’état de la led : d’allumer elle devient éteinte et vice-versa.
Programme
list p=16F84
#include <p16F84.inc>
cblock 0x0C
w_save :1
status_save : 1
output: 1
counter:1
endc
org 0x00
goto init

; ******* ROUTINE INTERRUPTION *************

org 0x04 ; la procédure d’interruption est logée à l’adresse 0x04


movwf w_save ; sauve registre w en RAM
swapf STATUS, w ; swap status et résultat dans w
movwf status_save ; sauve status swappé en RAM

; traitement interruption RB0


bcf STATUS, RP0 ; passage en bank0
movf output, w
xorlw 0x80 ; inversion bit
movwf output
movwf PORTB ; inversion état led
bcf INTCON, INTF ; raz flag INTF

8
; restitution registres
swapf status_save, w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_save, f ; swap ancien w sans modifier STATUS
swapf w_save, w ; restitution w original
retfie ; retour de l’interruption vers le programme principal

; ******* PROGRAMME PRINCIPAL *************

init bsf STATUS, RP0


movlw B’00000001’ ; RB7 sortie, RB0 entrée
movwf TRISB
movlw B’11000000’
movwf OPTION_REG ; bit INTEDG = 1 : front montant
bcf STATUS, RP0
movlw B'10010000'
movwf INTCON ; GIE=1, INTE=1: autorisation des interruptions
clrf output ; output image du PORTB
movf output, w
movwf PORTB ; led allumée

; ****** TACHE DE FOND *******


start movlw .10
movwf counter
ici decfsz counter
goto ici
goto start
end

Commentaires
1. La variable output est une image du contenu du PORTB, l’état du PORTB est mémorisé
dans output.
2. Au reset le pic démarre à l’adresse 0x00 et exécute le programme principal. L’instruction
goto init évite l’exécution du sous-programme d’interruption. Le pic entre dans une boucle
infinie appelée la tache de fond. L’action du bouton poussoir BP déclenche l’interruption
INT, l’exécution de la tache de fond est suspendue et le pic démarre l’exécution du sous-
programme d’interruption à l’adresse 0x04. A l’exécution de l’instruction retfie il revient à la
tache de fond.
3. Un système sous interruption exécute un programme en continu, ce programme peut être
interrompu à tout moment. On appelle un tel programme tache de fond. En générale dans
une tache de fond on réalise des traitements de données, transmission de fichiers de données,
affichage de résultats, etc.

9
Exercice
Un local est placé sous surveillance à l’aide de 4 détecteurs D1 à D4 TOR (Tout-Ou-Rien).
En cas d’infraction (passage de 1 à 0 de Di) le détecteur déclenche une interruption du
pic16f84 sur le front descendant. Le pic allume alors la led Li correspondant au détecteur Di
activé. Les anodes des led sont portées au + 5V. L’utilisateur peut éteindre les led par un
reset manuel.

1) Tracer le schéma d’interface du local avec le pic16f84.


2) Ecrire le programme assembleur.

Questions

1) Expliquer en 2 lignes le rôle de la pile.

2) Les deux sources d’interruptions RBI et INTR sont actives. La source RBI est la plus
prioritaire. Ecrire les instructions d’identification de ces deux interruptions.

3) Citer dans l’ordre les 2 actions exécutées par le pic lorsqu’il détecte un évènement
d’interruption.
4) Comment appelle-t-on les bits d’identification des interruptions.

5) Les interruptions du pic 16f84 sont-elles synchrones ou asynchrones.

6) Quel est l’intérêt de faire fonctionner le pic sous interruption ; expliquer en 3 lignes.

7) Une interruption peut-elle interrompre un sous-programme d’interruption? Justifier votre


réponse.

8) A quoi correspond le vecteur d’adresse 0x004 au niveau de la mémoire programme ?

9) Citer les 4 sources d’interruption.

10) Citer dans l’ordre les 2 actions exécutées par le pic lorsqu’il quitte la routine
d’interruption

10

Vous aimerez peut-être aussi