Chapitre 6
Interruptions
Définitions
En informatique, une interruption est un arrêt
temporaire de l'exécution normale d'un programme
informatique par le mircroprocesseur afin d'exécuter un
autre programme (appelé routine d'interruption).
Elle est alors une fonctions avancés qui permet
d’interrompre momentanément le cours normal du
programme pour exécuter certaines instructions quand
des évènements particuliers sont détectés.
1
Définitions
L´interruption peut être interne ou externe selon les
évènements détectés
Le changement de tension sur un port est un exemple
d’interruption externe au microcontrôleur
Les microcontrôleurs possèdent des compteurs qui
sont souvent utilisés comme des chronomètres pour
déclencher des interruptions internes à intervalles
réguliers.
Vecteur des interruptions pour un Atmega32
Interruptions
avec priorité
selon leur
position dans le
tableau
Reset a la haute
priorité
3
Priorité d´interruption
Priorité d´interruption définie dans ISR (INT0_vect)
le vecteur des interruptions du MicroC External interrupt request 0
ISR (INT1_vect)
External interrupt request 0
3
ISR (ADC_vect)
ADC conversion complete
Boucle principale
15 dans la fonction
main()
Éxecution du programme Temps d´exécution
4
Broches d´interruptions dans Atmega32
Les broches INT0 et INT1
de l’ATMEGA32 peuvent
être utilisées pour détecter
les changements de niveau
de tension. Ces broches
correspondent aux bits 2 et
3 du port D (PD2 et PD3).
Pour lier une fonction
d’interruption externe à une
de ces broches, il faut
configurer certains registres
du microcontrôleur
5
Interruptions externes - Registres de
configuration
1. GICR
2. MCUCR
3. GIFR
4. SREG I ... ...
Registre GICR
1. GICR
GICR (General Interupt Control Register) : Les bits 5,
6 et 7 de ce registre permettent d’activer les
interruptions causées par les broches INT2, INT0 et
INT1
la bibliothèque avr\io.h contient déjà les définitions du
GICR, INT0, INT1 et INT 2 tels que:
#define INT0 6
#define GICR 0x3B
Pour activer l´Interruption externe INT0 il faut
mettre le bit INT0 à 1:
7
GICR |= (1 << INT0);
Registre MCUCR
2. MCUCR
MCUCR (MCU Control Register): ce registre permet de
définir les types de signaux qui doivent déclencher les
interruptions INT0 et INT1:
ISC00 et ISC01 pour configurer INT0
ISC10 et ISC11 pour configurer INT1
Registre MCUCR
ISC10 et ISC11 pour configurer INT1
Pour que l´Interruption INT1 soit sur front descendant:
MCUCR | = (1 << ISC11);
9
Interruptions externes – Registres de
configuration
3. GIFR
GIFR (General Interupt Flag Register): Les bits 5, 6 et 7
de ce registre passent à 1 lorsque des interruptions sont
déclenchées.
4. SREG I ... ...
Le Bit 7 dans le registre SREG (status register) permet
d´activer ou désactiver généralement toutes les
interruptions. Il faut le mettre a 1 pour autoriser les
interruptions. Ce la se fait par le macro:
sei(); //global interrupt enable identicale to SREG |= (1<<I)
cli(); // global interrupt desable, identicale to SREG &= ~(1<<I);
11
Programme à exécuter pendant l´interruption
5. ISR() : interrupt service routine
Le programme a effectuer lors du déclenchement
d´une interruption doit être écrit dans le macro
ISR()
Il faut inclure la Lib avr/interrupt.h
ISR(INT2_vect){ //External Interuupt Request 2
.. //les instructions que doit effectuer l´interruption
}
ISR(TIMER0_COMP_vect){..} //TCNT0 compare match A
ISR(TIMER0_OVF_vect){..} //TCNT0 overflow
ISR(SPI_STC_vect){..} //SPI sertial transfer complete
12
Interruption interne avec les Timers/compteurs
Un Timer est un circuit logique permettant
d'effectuer du comptage de temps, d'évènements (à
base de temps) pour la génération des interruptions
ou des signaux...
Les Timers représentent la partie la plus difficile à
maîtriser, due aux nombres de registres à configurer.
La famille AVR/Atmega contient:
Timer 0 composé de 8 bit
Timer 1 composé de 16 bit
Timer 2 composé de 8 bit (pas dans tous les AVRs)
13
Architecture du timer 0 et 1
External
Clock
14
Exemple d´application
On veut activer une fonction qui interrompe
le programme principale chaque 20ms à fin
de contrôler un moteur servo par ex.
On utilise pour ce la le Timer1 du Atmega32.
Il est à 16 bit, il peut compter jusqu´au 216-1
15
Configuration d´une interruption interne à base
de temps - registre TIMSK
Pour valider les interruptions internes liés aux timers 0, 1 ou 2 il faut mettre
le bit correspondant dans le registre TIMSK à 1,
TOIE0 : (Time overflow interrupt enable) Validation de l'interruption TIM0_OVF
au débordement du Timer 0 (255 -> 0)
TOIE1 : Validation de l'interruption TIMER1_OVF au débordement du
Timer 1, TCNT1 (0xFFFF -> 0)
OCIE0: (Output Compare Match Interrupt Enable) il valide l'interruption
TIM0_COMP si comparaison réussie de TCNT0 = OCR0
OCIE1A : Valide l'interruption TIMER1_COMPA si comparaison réussie de
TCNT1 = OCR1A.
OCIE1B : Valide l'interruption TIMER1_COMPB si comparaison réussie de
TCNT1 = OCR1B
Pour notre exemple on défini:
TIMSK |= (1<<OCIE1B);
16
Configuration de l´horloge pour le timer n
TCCR1B : Registre de controle du Timer 1 pour la sélection du
facteur de pré-division (prescaler) de l'horloge
TCCR1B |= (1<<CS11) | (1<<CS10); //for prescaler=64
19
Calcule du comparateur et choix du pre-diviseur
Pour le Timer 0: comparaison entre TCNT0 et OCR0
Pour le Timer 1: comparaison entre TCNT1 et OCR1A
ou TCNT1 et OCR1B
Dans notre exemple on doit alors choisir un pré-diviseur et calculer la valeur du
comparateur OCR1B pour atteindre les 20ms
20ms
Tcnt= 1/ fcnt = 1/ (fclk/ Prescaler) = Prescaler / fclk
TCNT1 = 0 1 2 3 x
La valeur du comparateur OCR1B est x = 20ms / (Prescaler/1 mhz)
Prediviseur = 1 OCR1B = 20 000;
Prediviseur = 8 OCR1B = 2500;
20
Résumé: interruption à base de temps
21
Exercice
Vous écrivez un programme en C qui fait clignoter une
LED_1 avec une fréquence de 2Hz.
Vous ajoutez dans le même programme une fonction qui
interrompe le programme principale chaque fois que le
bouton_1 est appuyé et qui fait allumer ou éteindre un
LED_2
Ajouter une fonction interrompant le programme principale
chaque 100 ms et qui incrémente un autre compteur de
temps Cnt0p1s jusqu´au 32000 (0 3200 s). Avec ce
desieme compteur on doit allumer des LED par exemple
rouge, vert et jaune pour un carrefour
22
Architecture du timer 0 (TCNT0)
23