0% ont trouvé ce document utile (0 vote)
622 vues11 pages

Interruptions et Timers Atmega32

Ce document décrit les interruptions en informatique et leur utilisation avec les microcontrôleurs. Il explique les différents types d'interruptions, la configuration des registres nécessaires et donne des exemples d'utilisation des timers pour générer des interruptions à intervalles réguliers.
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • horloge,
  • circuit intégré,
  • fréquence d'interruption,
  • registres de configuration,
  • ATmega32,
  • application pratique,
  • architecture,
  • électrique,
  • contrôle moteur,
  • réponse rapide
0% ont trouvé ce document utile (0 vote)
622 vues11 pages

Interruptions et Timers Atmega32

Ce document décrit les interruptions en informatique et leur utilisation avec les microcontrôleurs. Il explique les différents types d'interruptions, la configuration des registres nécessaires et donne des exemples d'utilisation des timers pour générer des interruptions à intervalles réguliers.
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • horloge,
  • circuit intégré,
  • fréquence d'interruption,
  • registres de configuration,
  • ATmega32,
  • application pratique,
  • architecture,
  • électrique,
  • contrôle moteur,
  • réponse rapide

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

Vous aimerez peut-être aussi