Pour résumer ...
Le programme principal s exécute normalement ( clignotement de la led )
Un événement extérieur survient ( un appui sur le bouton )
Le micro contrôleur termine l 'instruction qu 'il exécutait et mémorise l 'adresse en cours ( cette adresse lui servira à revenir à l 'endroit ou il s 'est "dérouté" dès la fin de l 'interruption )
Le micro contrôleur saute à l 'adresse du sous-programme d 'interruption ( comme on le verra sur le pic 16f84 l 'adresse de sous-programme d 'interruption est 04 )
Le micro contrôleur exécute le programme d 'interruption
Le micro contrôleur revient à l 'adresse suivante par rapport à la dernière instruction exécuté dans le programme principal.
Sur le PIC 16F84 il y a quatre événements qui peuvent déclencher une interruption :
- Une modification de de l 'état d 'une des broches (configurées en entrées) RB4 à RB7
- Une modification de l 'état de la broche RB0/int
- La fin de l 'écriture en E²PROM
- Le débordement du timer interne
Pour que le micro contrôleur accepte une ou plusieurs de ces sources d 'interruptions il va falloir lui préciser par l 'intermédiaire de bits que l 'on déclarera dans un registre nommé INTCON
Vue des bits du registre INTCON bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF
Ce bit permet de valider les interruptions. C'est une validation générale Ce bit permet de valider l 'interruption issue de la fin d 'écriture en E²PROM Ce bit valide l 'interruption issue du débordement du TIMER Ce bit valide l 'interruption du programme suite à un changement d 'état sur RB0 Ce bit valide l 'interruption du programme suite à un changement d 'état sur RB4-RB7 Ce bit signale que l 'interruption en cours provient du débordement du TIMER Ce bit signale que l 'interruption en cours provient d 'un changement d 'état sur la broche RB0 Ce bit signale que l 'interruption en cours provient d 'un changement d 'état sur l 'une des broches RB4-RB7
Présentation
Vous êtes tranquillement en pleine conversation téléphonique avec votre ami(e) préféré(e) et soudain quelqu'un sonne à la porte, le premier réflexe est de faire patienter votre interlocuteur au téléphone et d 'aller voir à votre porte qui se présente...
on vous à interrompu pendant votre conversation.
Finalement c 'était un représentant , vous lui signifiez que vous n ' êtes pas intéressé et vite vous retournez à votre première tâche , c'est à dire à votre conversation téléphonique, vous avez traité le plus urgent.
Pour un programme qui se déroule "tranquillement" le principe est le même.
Une tâche de fond s ' exécute, c'est votre programme principal, par exemple vous faites clignoter une lampe ( led ).
Soudain l ' utilisateur "appui" sur le bouton "plus rapide" , que fait votre programme ?
en fait il fait comme vous avez fait précédemment, c 'est à dire que quelque soit l 'endroit ou l 'on se situe dans le programme
( c'est votre conversation téléphonique ) , il exécute le plus urgent, dans notre exemple il détecte l 'appui sur le bouton et enregistre cette information .
Ensuite l 'appui étant mémorisé le programme "revient" à l 'endroit ou il s 'était arrêté auparavant et la lampe clignote plus vite.
Maintenant un exemple de programme avec une interruption.
Dans cet exemple on configure le pic pour que dès l'apparition d 'une impulsion sur la broche RB0 ( sur un front montant, c'est le bit INTEDG du registre OPTION ( bit 6 ) qui précise front montant ou front descendant sur RB0 ),
on déroute le programme principal qui était en mode sleep pour allumer une led connectée sur RB1.
Le passage à 1 ( front montant ) sur la broche RB0 va provoquer une interruption du programme principal le compteur de programme va charger l 'adresse 04 ( sur le pic 16f84 ce sera toujours cette unique adresse ) correspondant à l 'adresse du sous-programme d'interruption.
A la fin d 'un programme d 'interruption il ne faut pas oublier :
- de remettre le flag ( un bit qui se positionne à 1 dès qu 'une interruption est active ) de l 'interruption déclenchée :
( soit TOIF soit INTF soit RBIF , dans notre exemple se sera INTF )
- de mettre l 'instruction de retour d 'interruption RETFIE afin que le programme revienne à l' endroit ou il a été dérouté
;************** Début du programme *********************
;------------ Directive d' assemblage pour PLAB --- -
list p=16f84A
#include p16f84A.inc
__config H'3FF9'
ORG 0
goto init
;****** Le programme d' interruption se déclenche ***
;****** lorsque l' entrée RB0 passe de 0 à 1 ***
ORG 4
;*********** Programme d 'interruption **********************
bsf PORTB,1 ; on allume la led connectée sur rb1
bcf INTCON,INTF ; on remet à 0 le bit du registre d' IT qui est passé à 1
RETFIE ; retour d 'interruption
;************* Programme d' INIT **************************
init
bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder
; à la 2eme page mémoire ( pour configurer trisa et trisb
; -> broches en entrée ou en sortie )
MOVLW B'10011001' ; rb0,rb3,rb4 en entrée ( rb0 sera la broche utilisée
; pour l ' interruption )
MOVWF TRISB
bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder
; à la 1ere page mémoire
bsf OPTION_REG,INTEDG ; Le passage de 0 à 1 sur RB0 provoque une IT
; sur un front montant
bsf INTCON,INTE ; autorise l ' IT sur RB0
bsf INTCON,GIE ; autorise les Interruptions
clrf PORTB
;************ Programme principal en rebouclage *********************
debut
sleep ; mise en sommeil du PIC conso : 3.2 mA, attente impulsion sur RB0
GOTO debut
;*********** Fin du programme ***********