Vous êtes sur la page 1sur 15

Programmation des interruptions

et des temporisations

Interruptions et leurs traitements.


Configuration des registres de
contrôle. Exemples d’applications.
Timers pour la gestion du temps.
Configuration des registres de
contrôle. Exemples d’applications.
Interruptions et leurs traitements
Mécanisme général d’une interruption.
Une routine d’interruption peut être considérée comme un sous
programme déclenché par l’apparition d’un évènement spécifique.
Le programme se déroule normalement.
L’évènement survient
Le programme achève l’instruction en cours de traitement
Le programme traite l’interruption.
L’évènement qui déclenche l’interruption doit remplir deux
conditions :
- l’évènement doit être dans la liste des évènements susceptibles de
provoquer une interruption
- l’utilisateur doit avoir autorisé l’interruption, c'est-à-dire avoir signalé que
l’évènement en question devait générer une interruption.
Mécanisme d’interruption sur un PIC
Une interruption est un événement imprévisible qui provoque
l’arrêt d’un programme en cours d’exécution pour aller exécuter un autre
programme appelé programme (ou routine) d’interruption. A la fin du
programme d’interruption, le microcontrôleur reprend le programme
principal à l’endroit où il s’est arrêté.
Toute interruption provoque une sauvegarde de l’adresse PC (c'est-
à-dire l’adresse en cours du programme au moment ou est intervenu
l’interruption) dans une pile interne à 8 niveau et l’exécution du
programme est routé à l’adresse 0x04 de la mémoire FLASH. Cette
adresse est réservée pour les interruptions.
Enfin, une interruption ne peut pas être interrompu par une autre
interruption sauf si le programmateur remet le flag GIE à un trop tôt. Les
interruptions sont remises automatiquement en service après le retour
dans la boucle principale .
Types d’interruptions
• On distingue deux types d’interruptions : Les interruptions externes, qui
sont déclenchées lorsqu’un événement extérieur se produit tels que le
changement d’état d’une entrée destinée à l’interruption. Les
interruptions internes, qui sont déclenchées par le déroulement du
programme tel que le résultat d’un calcul ou le débordement d’un Timer.
• Toute interruption est gérée à l’aide de 3 bits : Un bit indicateur ou
drapeau (Flag bit). Ce bit est mis à 1 lorsque l’interruption correspondante
survient. Un bit d’activation (Enable bit). Ce bit permet d’activer ou de
désactiver l’interruption correspondante. Un bit d’activation globale
(Global Enable bit). Ce bit permet d’activer ou de désactiver toutes les
interruptions. Ces bits sont regroupés suivant le microcontrôleur cible
dans des registres appelés registres de configuration des interruptions tels
que : INTCON, PIE1, PIE2, PIR1 et PIR2. Le nombre de sources
d’interruptions dépend du microcontrôleur utilisé.
• En MikroC, le sous-programme d’interruption
est déclaré en tant que fonction avec le nom
spécial « Interrupt ». Cette fonction s’exécute
automatiquement en réponse aux
évènements déclencheurs des interruptions
activées par l’utilisateur.
REGISTRE DE CONFIGURATION DES
INTERRUPTIONS
• Le registre INTCON (INTerrupt CONtroller) est le registre principal de
contrôle et de gestion des interruptions. Suivant le type du
microcontrôleur donc du nombre de sources d’interruptions, le registre
INTCON est parfois accompagné par d’autres registres tels que (PIE, PIR1,
etc.) pour gérer la totalité des sources d’interruptions disponibles. Le
registre INTCON est parfois différent d’un PIC à un autre. Il est impératif
de revenir au document constructeur pour chaque type de
microcontrôleur (Data sheet).
EXEPLE D’APPLICATION
• 1. Exemple 1 Soient 4 LEDs connectés sur les pins RA0, RA1, RA2 et RA3
du Port A. Utiliser l’interruption sur (RB4-RB7) pour faire basculer l’état
des LEDs (RB4 commande RA0, RB5 commande RA1 et ainsi de suite).
EXEPLE D’APPLICATION(2)
• 2. Exemple 2 Utiliser l'interruption pour changer la vitesse de clignotement de
la diode Led connecté sur la pin RA0 selon le schéma de la figure ci-dessous.
Temporisations et comptages
Les différents modes de fonctionnement
La 16F84 ne comporte qu’un seul timer sur 8 bits, contrairement à d’autres PICs de la
famille (comme la 16F877). Si on examine attentivement le fonctionnement du timer0,
nous verrons qu’il s’agit en fait d’un compteur.
Le timer0 est en fait un compteur. Nous avons deux possibilités:
En premier lieu, nous pouvons compter les impulsions reçues sur la pin RA4/TOKI. Nous
dirons dans ce cas que nous sommes en mode compteur
Nous pouvons aussi décider de compter les cycles d’horloge du PIC lui-même. Dans ce cas,
comme l’horloge est fixe, nous compterons donc en réalité du temps. Donc, nous serons
en mode « timer ».
La sélection d’un ou l’autre de ces deux modes de fonctionnement s’effectue par le bit 5
du registre OPTION : T0CS pour Tmr0 Clock Source select bit.
T0CS = 1 : Fonctionnement en mode compteur
T0CS = 0 : Fonctionnement en mode timer
Dans le cas où vous décidez de travailler en mode compteur, vous devez aussi préciser de
quelle transition de niveau le comptage est effectué. Ceci est précisé grâce au bit 4 du
registre OPTION : T0SE pour Timer0 Source Edge select bit.
T0SE = 0 : comptage si l’entrée RA4/TOKI passe de 0 à 1
T0SE = 1 : comptage si l’entrée RA4/TOKI passe de 1 à 0
Le registre tmr0
Ce registre, qui se localise à l’adresse 0x01 en banque0, contient tout simplement la valeur
actuelle du timer0. Vous pouvez écrire ou lire tmr0. Si par exemple vous avez configuré tmr0
en compteur, la lecture du registre tmr0 vous donnera le nombre d’événements survenus sur
la pin RA4/TOKI.

Les méthodes d’utilisation du timer0


1Le mode de lecture simple
La première méthode qui vient à l’esprit est la suivante : Nous lisons le registre tmr0 pour
voir ce qu’il contient. La valeur lue est le reflet du nombre d’événements survenus, en
prenant garde au fait que le tmr0 ne peut compter que jusque 255. En cas de dépassement,
le tmr0 recommence à 0.
2Le mode de scrutation du flag
Nous devons savoir à ce niveau, que tout débordement du timer0 (passage de 0xFF à 0x00)
entraîne le positionnement du flag T0IF du registre INTCON. Vous pouvez donc utiliser ce flag
pour déterminer si vous avez eu débordement du timer0, ou, en d’autres termes, si le temps
programmé est écoulé. Cette méthode à l’inconvénient de vous faire perdre du temps
inutilement
3Le mode d’interruption
C’est évidemment le mode principal d’utilisation du timer0. En effet, lorsque T0IE est
positionné dans le registre INTCON, chaque fois que le flag T0IF passe à 1, une interruption
est généree
Le prédiviseur

Supposons que nous travaillons avec un quartz de 4MHz. Nous avons donc dans ce cas
(4000000/4) = 1.000.000 de cycles par seconde. Chaque cycle d’horloge dure donc
1/1000000ème de seconde, soit 1µs.
Si nous décidons d’utiliser le timer0 dans sa fonction timer et en mode interruptions.
Nous aurons donc une interruption toutes les 256µs, soit à peut près toutes les
quarts de millième de seconde.
Si nous désirons réaliser une LED clignotante à une fréquence de +- 1Hz, nous aurons
besoin d’une temporisation de 500ms, soit 2000 fois plus. Ce n’est donc pas
pratique.
Nous disposons pour améliorer ceci d’un PREDIVISEUR .
Qu’est-ce donc ? Et bien, tout simplement un diviseur d’événements situé AVANT
l’entrée de comptage du timer0. Nous pourrons donc décider d’avoir incrémentation
de tmr0 tous les 2 événements par exemple, ou encore tous les 64 événements.
Le tableau suivant représente les valeurs des bits PS0 à PS2 du registre OPTION qui
déterminent la valeur du prédiviseur.
Ces valeurs varient, pour le timer0, entre 2 et 256. Le bit PSA, quand à lui, détermine si
le prédiviseur est affecté au timer0 ou au watchdog. Voici le tableau exprimant
toutes les possibilités de ces bits :
PSA à PS0 sont les bits de configuration du prédiviseur
/tmr0 indique la valeur du prédiviseur résultante sur le timer0
/WD indique la valeur du prédiviseur résultante sur le Watchdog
temps tmr0 indique le temps max entre 2 interruptions tmr0 avec quartz de 4MHz
Temps watchdog indique le temps typique disponible entre 2 reset watchdog (indépendant du quartz utilisé). La valeur
entre parenthèses indique le temps minimal, qui est celui à utiliser pour faire face à toutes les circonstances.
Exemple 1
unsigned temps : 16;
char newtmro;

void main ()
{
PORTB=0;
TRISB= 0x00;
OPTION = 0xC5;
temps=0;
newtmro = TMRO+1;
for (;
{
clrwdt();
if (TMRO == newtmro)
{
++temps;
++newtmro;
}
if (temps == 15625)
{
RB0_bit =! RB0_bit;
temps=0;
}
}
}Exemple
Exemple 2
unsigned cnt;
void interrupt() {
cnt++;
// Increment value of cnt on every interrupt
TMR0L = 96;
INTCON = 0x20; // Set T0IE, clear T0IF
}
void main() {
ADCON1 = 0x0F; // Set AN pins to Digital I/O
T0CON = 0xC4; // Set TMR0 in 8bit mode, assign prescaler to TMR0
TRISB = 0; // PORTB is output
PORTB = 0xFF; // Initialize PORTB
TMR0L = 96; // Timer0 initial value
INTCON = 0xA0; // Enable TMRO
interrupt cnt = 0; // Initialize cnt
do {
if (cnt == 400) {
PORTB = ~PORTB; // Toggle PORTB LEDs
cnt = 0; // Reset cnt
}}
while(1); }
LA PROGRAMMATION DES PICS
PAR BIGONOFF
PREMIERE PARTIE – PIC16F84 – Révision 5

Leçon N°10 LES INTERRUPTIONS EN MIKROC


Par Mr Nizar TOUJENI

Vous aimerez peut-être aussi