Imaginez une conversation normale :
- Chaque interlocuteur prend la parole quand vient son tour de parler.
- Survient alors un événement extérieur dont le traitement est urgent. Par exemple, un piano tombe du 3ème étage de l’immeuble au pied duquel vous discutez.
- Vous imaginez bien que votre interlocuteur ne va pas attendre la fin de votre phrase pour vous signaler le danger. Il va donc vous INTERROMPRE durant le cours normal de votre conversation., afin de pouvoir TRAITER IMMEDIATEMENT l’EVENEMENT extérieur.
- Les interlocuteurs reprendront leur conversation où elle en était arrivée, sitôt le danger écarté (s’ils ont évité le piano, bien sûr).
Et bien, pour les programmes, c’est exactement le même principe :
- Votre programme se déroule normalement.
- Survient un événement spécifique.
- Le programme principal est interrompu (donc, subit une INTERRUPTION), et va traiter l’événement, avant de reprendre le programme principal à l’endroit où il avait été interrompu.
L’interruption est donc une RUPTURE DE SEQUENCE ASYNCHRONE, c'est-à-dire non synchronisée avec le déroulement normal du programme. Vous voyez ici l’opposition avec les ruptures de séquences synchrones, provoquées par le programme lui-même (goto, break…).
1. Mécanisme général d’une interruption.
Nous pouvons dire, sans nous tromper de beaucoup, qu’une routine d’interruption est un sous-programme particulier, déclenché par l’apparition d’un événement spécifique.
Voici donc comment cela fonctionne :
- Le programme se déroule normalement.
- L’événement survient.
- Le programme achève l’instruction en cours de traitement.
- Le programme saute à l’adresse de traitement de l’interruption.
- Le programme traite l’interruption.
- Le programme saute à l’instruction qui suit la dernière exécutée dans le programme principal.
Il va bien sûr de soi que n’importe quel événement ne peut pas déclencher une interruption. Il faut que 2 conditions principales soient remplies :
- L’événement en question doit figurer dans la liste des événements susceptibles de provoquer une interruption pour le processeur sur lequel on travaille.
- L’utilisateur doit avoir autorisé l’interruption, c’est à dire doit avoir signalé que l’événement en question devait générer une interruption.
2. Mécanisme d’interruption sur les PIC.
Bien entendu, les PIC répondent au fonctionnement général ci-dessus, mais ils ont également leurs particularités. Voyons maintenant le principe des interruptions sur les PIC.
- Tout d’abord, l’adresse de début de toute interruption est fixe. Il s’agit toujours de l’adresse 0x04.
- Toute interruption provoquera le saut du programme vers cette adresse. Toutes les sources d’interruption arrivant à cette adresse, si le programmeur utilise plusieurs sources d’interruptions, il lui faudra déterminer lui-même laquelle il est en train de traiter.
- Les PIC, en se connectant à cette adresse, ne sauvent rien automatiquement, hormis le contenu du PC, qui servira à connaître l’adresse du retour de l’interruption. C’est donc à l’utilisateur de se charger des sauvegardes.
Remarque.
- Une interruption ne peut pas être interrompue par une autre interruption. Les interruptions sont donc invalidées automatiquement lors du saut à l’adresse 0x04 par l’effacement du bit GIE.
- Les interruptions sont remises en service automatiquement lors du retour de l’interruption.
Algorigramme des interruptions sur les PIC.

3. Les sources d’interruptions.
Le PIC16F877A comporte 14 sources d’interruption comme indiquées ci-dessous.

Voici un tableau récapitulatif des 13 interruptions disponibles sur le 16F876. Notez que le 16F877/4 dispose d’un port parallèle supplémentaire qui lui autorise une source d’interruption en plus. Sur ces composants, nous aurons donc 14 sources d’interruption.

Explication des différentes colonnes, de gauche à droite :
- Déclencheur : Evénement ou fonction qui est la source de l’interruption.
- Flag : Bit qui se trouve positionné lorsque l’événement survient.
- Registre : Registre auquel le flag appartient.
- Adr : Adresse de ce registre (tous en banque 0, avec INTCON présent dans les 4 banques).
- PEIE : Indique si le positionnement de PEIE du registre INTCON joue un rôle.
- Enable : nom du bit qui permet d’autoriser ou non l’interruption.
- Registre : Registre qui contient ce bit.
- Adr : adresse de ce registre (tous en banque1, avec INTCON dans les 4 banques).
4. Les registres de contrôle des interruptions.
a) Le registre INTCON.

- b7 : GIE. Il permet de valider ou d’invalider toutes les interruptions d’une seule fois.
- b6 : PEIE. Il permet de valider ou d’invalider les interruptions périphériques.
- b5 : T0IE. Valide l’interruption générée par le débordement du timer0.
- b4 : INTE. Valide l’interruption dans le cas d’une modification de niveau de la pin RB0. Rappelons le bit 6 du registre OPTION_REG, qui détermine quel est le sens de transition qui provoque l’interruption. On pourra donc choisir si c’est une transition 0à1 ou 1à0 qui provoque l’interruption, mais pas les deux ensemble.
- b3 : RBIE. Valide les interruptions si il y a changement de niveau sur une des entrées RB4 à RB7.
- b2 : T0IF. C’est un Flag, donc il signale. Ici c’est le débordement du timer0.
- b1 : INTF. Signale une transition sur la pin RB0 dans le sens déterminé par INTEDG du registre OPTION (b6).
- b0 : RBIF. Signale qu’une des entrées RB4 à RB7 a été modifiée. Rappelons que les flags ne se remettent pas à 0 tout seul. C’est le programme qui doit s’en charger, sous peine de rester indéfiniment bloqué dans une routine d’interruption. Nous dirons que ces flags sont des FLAGS REMANENTS.
Remarquez.
- Tous les bits dont le nom se termine par E (Enable) sont en fait des commutateurs de validation.
- Les bits dont le nom se termine par F sont des Flags (indicateurs).
b) Les registres PIE1, PIR1, PIE2, PIR2.
Voici le nom de chaque bit de ces registres.

Remarquez qu’il y a quelques bits non implémentés, qui donneront toujours « 0 » s’ils sont lus, mais aussi 2 bits réservés qu’il est impératif de maintenir à « 0 » afin de conserver toute compatibilité future.
Les bits des registres PIEx permettent d’autoriser les interruptions correspondantes, mais rappelez-vous que ces bits ne sont opérationnels que si le bit PEIE du registre INTCON est mis à 1. Dans le cas contraire, toutes ces interruptions sont invalidées.
Pour qu’une des interruptions décrites ici soit opérationnelle, je rappelle qu’il faut donc la triple condition suivante :
- Le bit GIE du registre INTCON doit être mis à 1.
- Le bit PEIE du registre INTCON doit être mis à 1.
- Le bit correspondant à l’interruption concernée (registre PIE1 ou PIE2) doit être mis à 1.
Voici maintenant le rôle de chacun des bits d’autorisation d’interruption, sachant qu’un bit à «1» autorise l’interruption correspondante :
PIE1
- PSPIE. Lecture/écriture sur le port PSP.
- ADIE. Conversion analogique/digitale.
- RCIE. Réception d’un caractère sur le port série USART.
- TXIE. Emission d’un caractère sur le port série USART.
- SSPIE. Communication sur le port série synchrone SSP.
- CCP1IE. Evénement sur compare/capture registre 1.
- TMR2IE. Correspondance de valeurs pour le timer TMR2.
- TMR1IE. Débordement du timer TMR1.
PIE2.
- EEIE. Ecriture dans l’EEPROM.
- BCLIE. Collision de bus pour le port série synchrone I2C.
- CCP2IE. Evénement sur compare/capture registre 2.
Et maintenant, les flags correspondants.
PIR1.
- PSPIF. Lecture ou écriture terminée sur le port parallèle.
- ADIF. Fin de la conversion analogique/digitale.
- RCIF. Le buffer de réception de l’USART est plein (lecture seule).
- TXIF. Le buffer d’émission de l’USART est vide (lecture seule).
- SSPIF. Fin de l’événement dépendant du mode de fonctionnement comme suit :
- Mode SPI. Un caractère a été envoyé ou reçu.
- Mode I2C esclave. Un caractère a été envoyé ou reçu.
- Mode I2C maître. Un caractère a été envoyé ou reçu
ou fin de la séquence « start »
ou fin de la séquence « stop »
ou fin de la séquence « restart »
ou fin de la séquence « acknowledge »
ou « start » détecté durant IDLE (multimaître)
ou « stop » détecté durant IDLE (multimaître)
- CCP1IF. Evénement compare/capture 1 détecté suivant :
- Mode capture : capture de la valeur TMR1 réalisée.
- Mode compare : La valeur de TMR1 atteint la valeur programmée.
- TMR2IF. La valeur de TMR2 atteint la valeur programmée.
- TMR1IF. Débordement du timer TMR1.
PIR2.
- EEIF. Fin d’écriture de la valeur en EEPROM.
- BCLIF. Collision de bus, quand le SSP est configuré en maître I2C.
- CCP2IF. Evénement compare/capture 2 détecté suivant le mode :
- Mode capture : capture du TMR1 réalisée.
- Mode compare : La valeur de TMR1 atteint la valeur programmée.
5. Configuration des interruptions primaires.
Des constatations précédentes, nous pouvons dire que nous disposons de 3 interruptions primaires. Pour mettre en service une de ces interruptions, il faut donc :
- Valider le bit concernant cette interruption.
- Valider le bit GIE (General interrupt enable) qui met toutes les interruptions choisies en service.
6. Configuration des interruptions périphériques.
Les interruptions périphériques sont tributaires du bit de validation générale des interruptions périphériques PEIE. Voici donc les 3 étapes nécessaires à la mise en service d’une telle interruption :
- Validation du bit concernant l’interruption dans le registre concerné (PIE1 ou PIE2).
- Validation du bit PEIE (PEripheral Interrupt Enable bit) du registre INTCON.
- Validation du bit GIE qui met toutes les interruptions en service.
Notez donc que la mise en service de PEIE ne vous dispense pas l’initialisation du bit GIE, qui reste de toute façon prioritaire. Cette architecture vous permet donc de couper toutes les interruptions d’un coup (effacement de GIE) ou de couper toutes les interruptions périphériques en une seule opération (effacement de PEIE) tout en conservant les interruptions primaires. Ceci vous donne d’avantage de souplesse dans le traitement des interruptions, mais complique un petit peu le traitement.
7. Mise en service des interruptions.
La gestion des interruptions passe par 3 opérations:
- déclaration du fichier utile à la gestion des interruptions;
- configuration des interruptions;
- écriture de l'interruption;
La déclaration du fichier utile à la gestion des interruptions est indispensable pour utiliser les instructions de sauvegarde des registres important au moment de l'interruption. Elle passe par l'écriture de la ligne ci-dessous à placer en début de fichier :
#include "int16CXX.h"
La configuration des interruptions se fait à l'aide de bits des registres INTCON (INTerrupt CONfiguration) et OPTION, le plus souvent au début de la fonction main.
L'écriture de l'interruption se fait selon le bésoin.
La structure prend ainsi la forme suivante :
#pragma origin 4
interrupt nom_de_l'interruption(void)
{
int_save_registers
Corps de l'interruption
int_restore_registers
}
- #progma origin 4 indique au compilateur d'écrire à partir de l'adresse 4.
- interrupt nom_de_l'interruption(void) indique que cette fonction est une interruption et lui donne un nom.
- int_save_register est une instruction qui sauvegarde l'état des registres importants.
- int_restore_registers est une instruction qui restitue l'état des registres importants.
Le corps de l'interruption passe en premier par la détection de la source d'interruption. Pour cela, nous utiliserons certains bits du registre INTCON.
2016-12-15 16:04:23 / mazoughou@magoe.gn
0 commentaires
Votre impression compte aussi