Programmation Des Timers: 1. Objectifs
Programmation Des Timers: 1. Objectifs
Programmation Des Timers: 1. Objectifs
Département GE Programmables 1
1. Objectifs
Comprendre les modes de fonctionnement des Timers.
Mettre en œuvre les interruptions des Timers en language C.
2. Rappel
Les timers sont enfait des compteurs formés généralement d’un prédiviseur suivi d’un registre
compteur de 8 ou 16 bits. L’entrée d’horloge peut être interne (mode timer) ou externe (mode
compteur d’événements).
Lorsque le registre compteur atteint sa valeur maximale et repasse à 0, un bit indicateur (flag) sera
positionnée et une interruption pourra être générée, informant ainsi la CPU du débordement du
timer. Il faut bien noter que le bit indicateur de débordement devra être remis à 0 après chaque
débordement.
2.1. Timer 0
Le timer 0 est un compteur 8 bits pré positionnable par le registre « TMR0 » accessible en banque 0 ;
la valeur de ce registre sera incrémentée et il sera possible de la lire à tout moment.
Le timer 0 est configuré par le registre « OPTION_REG » accessible en banque 1 et 3.
Le timer 0 peut avoir comme source d’horloge, suivant le bit « TOCS » du registre « OPTION_REG » :
- soit l’horloge interne du microcontrôleur,
c’est à dire l’horloge du quartz à fréquence
divisée par 4 (TOCS=0) ;
- soit une horloge externe, appliquée sur la
borne TOCKI, borne multiplexée avec RA4
(TOCS=1). Dans ce cas, le comptage peut se
faire sur front montant (« TOSE » de «
OPTION_REG » au NL0) ou sur front
descendant (TOSE=1).
- soit en scrutant ce bit (ne pas oublier de le remettre au NL1 après lecture pour une nouvelle
utilisation) ;
- soit en autorisant une interruption du programme (mode interruption).
2.2 Timer 1
TMR1 est un Timer/Compteur 16 bits accessible en lecture/écriture par l'intermédiaire des registres 8
bits TMR1H (bank0) et TMR1L (bank0) qui constituent sa partie haute et sa partie basse.
On le configure à l'aide du registre T1CON (bank0)
En résumé :
Le temps qui sépare 2 levés de drapeau TMR1IF est :
Si on ajoute un compteur N dans le programme on obtient un temps = N x TF1
TMR2 est incrémenté par l'horloge interne Fosc/4. Il commence à 0 et quant il atteint la valeur du
registre PR2, le comparateur génère un signal qui :
- Remet TMR2 à 0.
- incrémente le postscaler qui fonctionne comme un diviseur de fréquence.
Comme le comptage commence à 0, si PR2=N, alors le comparateur annonce une égalité tous les N+1
coups d’horloge.
Au débordement du postscaler, le drapeau PIR1.TMR2IF est positionné, l'interruption
correspondante est déclenchée si elle est validée.
Le prescaler et le postscaler sont initialisés à chaque écriture dans TMR2 ou dans T2CON et au
RESET du processeur.
En résumé, Si on note :
DIV1 : rapport du pré diviseur DIV2 : Rapport du post diviseur
P : Valeur placée dans le registre PR2 Tsy : période de l'horloge système,
la périodicité du drapeau TMR2IF est donnée par : TF2 = DIV1 x (P+1) x DIV2 x Tsy .
Le registre T2CON:
Le mode scrutation
Nous savons maintenant que tout débordement du timer, entraine le positionnement du bit
indicateur de débordement (TOIF dans le cas du timer0 par exemple). Vous pouvez donc utiliser cet
indicateur (flag) pour déterminer si le timer a débordé ou non.
Le mode interruption
C’est le mode principal d’utilisation des timers. En effet, pour qu’une interruption se déclenche à
chaque passage du bit indicateur de débordement à 1, il faut positionner à l’avance les bits de
validation de l’interruption.
Pour que l’interruption timer 0 se déclenche lorsque T0IF passe à 1, il faut positionner les bits T0IE
et GIE.
Pour que l’interruption timer 1 se déclenche lorsque TMR1IF passe à 1, il faut positionner les bits
TMR1IE, PEIE et GIE.
Pour que l’interruption timer 2 se déclenche lorsque TMR2IF passe à 1, il faut positionner les bits
TMR2IE, PEIE et GIE.
Dés que le timer déborde, la CPU se branche automatiquement à une routine précédée par le mot
reservé #int_timer0 par exemple.
Exemple de programmation d’une interruption :
On veut faire clignoter la LED RC2 à une fréquence approximativement à 2 Hz. On admet que la
fréquence dequartz est Fosc=8MHz.
-------------------------------------------------------
La fréquence de clignotement Fc=2Hz Tc = 500ms.
Le timer provoque à chaque débordement, une interruption. La période de débordement T d doit etre
la moitié de Tc donc Td = 250ms.
La période maximale de débordement du timer 0 :
Td0max = 4*Tosc*Predivmax*28=4*0.125µs*256*256=32.768ms ; or nous voulons une période de 250ms
environ. Cherchons alors la période maximale de débordement du timer 1 :
Td1max = 4*Tosc*Predivmax*216=4*0.125µs*8*65536=262.0144ms ; cette valeur pourra etre acceptable.
On doit configurer le timer 1, en mode timer (horloge interne) avec une valeur de pré division égale à
8 ; d’où T1CON = 00110001=31h.
--------------------------------------------------
#int_timer1
Void interrupt() // routine d’IT
{ RC2 = !RC2 ; // inversion de l’état de la LED }
Void main()
{init(); // appel de la procédure init
while(1); // boucle infinite }
Travail à faire :
Préparation :
On veut configurer l’un des timers pourqu’il déborde toutes les 20 ms. La fréquence du
microcontroleur est Fosc=8Mhz.
Manipulation :
Le mode Timer
1. Tester le programme de clignotement d’une LED.
2. Modifier le programme pourque la LED clignote à 2 Hz exactement.
3. Réecrire le programme précédent en mode scrutation.
4. Réecrire le programme de clignotement d’une LED, en utilisant le timer 2 au lieu du timer 1.
1. Ecrire un programme qui incrémente le contenu du registre TMR0 à chaque appui sur le
bouton RA4. Afficher le compte sur les LEDs connectées au PORTC.
2. Modifier le programme pourque le registre TMR0 s’incrémente après 4 appuis sur le bouton
RA4.