GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
pres_chapter5 (5).pptx
1. 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.
2. 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.
3. 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 .
4. 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é.
5. • 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.
6. 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).
7. 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).
8. • 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.
EXEPLE D’APPLICATION(2)
9. 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
10. 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
11. 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 :
12. 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.
13. 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
14. 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); }
Exemple 2
15. LA PROGRAMMATION DES PICS
PAR BIGONOFF
PREMIERE PARTIE – PIC16F84 – Révision 5
Leçon N°10 LES INTERRUPTIONS EN MIKROC
Par Mr Nizar TOUJENI