Vous êtes sur la page 1sur 5

Utilisation des timers

Lors de la séance précédente, nous avions réalisé une temporisation par boucle de décrémentation.
Les microcontrôleurs intègrent des compteurs, appelés « timers » qui gèrent parfaitement, entre
autres, ce genre de fonctions.

Le PIC16f877A intègre 3 timers :


- le timer 0 de 8 bits ;
- le timer 1 de 16 bits ;
- le timer 2 de 8 bits.

1 Etude du 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).

Denis Rabasté programmation des microcontrôleurs PIC 1/5


IUFM Aix Marseille
utilisation des timers

Suivant le bit « PSA » de « OPTION_REG », cette horloge peut être divisée (PSA=0) ou non. Le
rapport de division est fixé de 2 à 256 suivant les bits « PS2, PS1 et PS0 » du même registre.

Noter que le prédiviseur est une ressource commune avec le « Watchdog ». Il ne pourra être utilisé
que pour l’une des fonctions suivant « PSA ».

Lorsque le registre TMPR0 passe de FFh à 00h, le bit « TMR0IF » (TiMeR0 Interrupt Flag) du registre
« IT1CON » passe à 1. Il est possible de détecter ce passage :
- 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 (voir séance suivante).

2 Programmation

Ouvrir un nouveau projet TP2_timer pour PIC16F877A, y inclure le fichier « Prog1.asm » du répertoire
« Ressources \ TP2_timer », sauvegarder le fichier dans votre répertoire sous un nom différent,
supprimer la version d’origine du projet.

Analyser le programme (reproduit en annexe), noter en particulier :


- l’utilisation de la directive d’assemblage « BANKSEL » qui sélectionne la banque de la
variable qui suit ;
- l’initialisation du timer0 ;
- la détection de la fin du comptage.

Calculer la fréquence de sortie en RB0.

Compiler et simuler le programme en observant en particulier les registres « TM0 »,


« OPTION_REG », « IT1CON ».

On remarquera la difficulté d’effectuer la simulation avec un rapport de prédivision aussi important ; on


pourra contourner cette difficulté soit en modifiant le rapport, soit en utilisant des points d’arrêts.

Noter également l’effet de la directive « BANKSEL » sur les instructions mise en mémoire.

Programmer le circuit et vérifier le résultat.

Modifier le programme pour obtenir une fréquence de sortie de 1 s en utilisant le timer1.

Denis Rabasté programmation des microcontrôleurs PIC 2/5


IUFM Aix-Marseille
utilisation des timers

Annexe 1 : programme timer 0

;********************************************************************************:
; Ce programme fait clignoter la DEL de la sortie RB0 sur la carte PICDEM2PLUS
; à une fréquence de 7,5 Hz en utilisant le timer 0 *
;********************************************************************************

LIST P=16F877A ; directive qui définit le processeur utilisé


#include <P16F877A.INC> ; fichier de définition des constantes

;******************************************************************************
; BITS DE CONFIGURATION
;******************************************************************************
__CONFIG _HS_OSC & _WDT_OFF & _CP_OFF & _CPD_OFF & _LVP_OFF
; _XS_OSC l'oscillateur est configuré en oscillateur à quartz haute fréquence
; _WDT_OFF le watchdog est désactivé
; _CP_OFF le code de protection de la mémoire programme est désactivé
; _CPD_OFF le code de protection de la mémoire EEPROM est désactivé
; LVP_OFF la programmation basse tension est désactivée
; ces opérations sont nécessaires pour fonctionner en mode "debug"

;********************************************************************************
; DEFINITIIONS *
;********************************************************************************
#DEFINE DEL PORTB,0 ;la DEL sur le port B, bit 0

;********************************************************************************
; DEMARRAGE SUR RESET *
;********************************************************************************
org 0x0 ; Adresse de départ après reset
goto debut

org 0x10 ; adresse de début du programme


debut

;********************************************************************************
; PROGRAMME PRINCIPAL *
;*******************************************************************************
call init
boucle
bsf DEL ; mise à 1 de la sortie
call tempo
bcf DEL ; mise à 0 de la sortie
call tempo
goto boucle ; rebouclage
;********************************************************************************
; SOUS PROGRAMMES *
;********************************************************************************
;********************************************************************************
; INITIALISATION *
;********************************************************************************
init
; initialisation du PORTB en sortie
BANKSEL PORTB ; passage en banque 0
clrf PORTB ; RAZ des bascules D du port B
BANKSEL TRISB ; passage en banque 1
movlw b'00000000'
Denis Rabasté programmation des microcontrôleurs PIC 3/5
IUFM Aix-Marseille
utilisation des timers

movwf TRISB ; PORTB en sortie

; initialisation du Timer 0 :division par 256 de l'horloge interne


BANKSEL OPTION_REG ; Accès à la BANK1
movlw b'00000111' ; TOSC=0 PSA=0 PS2=1 PS1=1 PS0=1
movwf OPTION_REG ; predivision TMR0 timer 1:256
BANKSEL PORTB ; retour en banque 0

return
;********************************************************************************
; TEMPORISATION *
;********************************************************************************

tempo
clrf TMR0 ; RAZ DU TMR0
boucle_tmr
btfss INTCON,TMR0IF ; Test bit T0IF de INTCON
goto boucle_tmr ; boucle d'attente si timer non nul
bcf INTCON,TMR0IF ; RAZ du drapeau
return

;********************************************************************************
END ; directive signalant la fin du programme

Annexe 2 : exemple de solution pour le timer 1

Le timer 1 est un timer 16 bits prépositionnable par les registres 8 bits « TMR1H » (partie haute) et
« TMR1L » (partie basse) accessibles en banque 0.

Il peut fonctionner en compteur (déclenchement sur évènements externe) ou en timer (déclenchement


sur l’horloge cycle) ; dans ce dernier cas « TMR1CS » de « T1CON » doit être à 0.
Le rapport de prédivision est configuré de 1 à 8 par les bits « T1CKPS1 » et « T1CKPS0 » du même
registre.
Le fonctionnement n’est autorisé que si « TMR1ON » de « T1CON » est à 1.

Le débordement met le bit drapeau « TMR1F » de « PIR1 » à 1.

Denis Rabasté programmation des microcontrôleurs PIC 4/5


IUFM Aix-Marseille
utilisation des timers

« T1CON » et « PIR1 » sont en banque 0.

Pour obtenir une temporisation de 0,5 s avec une prédivision de 8 (soit une horloge à 8 µs), il faut un
préchargement dans TMR1H et L de :
216 - 0,5/(8 10-6 )= 3036d = 0BCDh.

Seules les parties modifiées par rapport au programme précédent ont été reproduites.

;********************************************************************************
; SOUS PROGRAMMES *
;********************************************************************************
;********************************************************************************
; INITIALISATION *
;********************************************************************************
init
; initialisation du PORTB en sortie
BANKSEL PORTB ; passage en banque 0
clrf PORTB ; RAZ des bascules D du port B
BANKSEL TRISB ; passage en banque 1
movlw b'00000000'
movwf TRISB ; PORTB en sortie

; initialisation du Timer 1 :division par 8 de l'horloge interne


BANKSEL T1CON ; passage en banque 0
movlw b'00110001' ; T1CGPS1=1 T1CGPS0=1 T1OSCEN=0 TMR1CS=0 TMR1ON=1
movwf T1CON ; predivision TMR1 timer 1:8, hor ext off, hor int
; timer on
return
;********************************************************************************
; TEMPORISATION *
;********************************************************************************

tempo
movlw 0xCD
movwf TMR1L ; initialisation de TMR1L
movlw 0x0B
movwf TMR1H ; initialisation de TMR1H

boucle_tmr
btfss PIR1,TMR1IF ; Test bit TMR1F de PIR1
goto boucle_tmr ; boucle d'attente si timer non nul
bcf PIR1,TMR1IF ; RAZ du drapeau
return

;********************************************************************************
END ; directive signalant la fin du programme

Denis Rabasté programmation des microcontrôleurs PIC 5/5


IUFM Aix-Marseille