Pablo Software Solutions Pablo Software Solutions
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 ***********
Les interruptions sur un microcontrôleur PIC
[Retour]