TD Timer

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 6

Université Badji Mokhtar – Licence Electronique

Matière : Systèmes à microprocesseurs 2023/2024


Enseignant : Dr S.BENSAOULA

TD – Le timer

Détermination du mot de configuration


Le timer est un compteur programmable. On peut programmer à l’aide d’un mot de 8 bits le
fonctionnement du registre TMR0, soit dans le mode timer (mesure du temps) ou dans le
mode compteur d’évènements extérieurs (compteur d’impulsions). Ce mot de 8 bits, appelé
mot de configuration, sera chargé dans le registre OPTION_REG.

Exemple1
Soit les propositions suivantes :
- registre TMR0 : mode timer
- pas de prédiviseur
a) déterminer le mot de configuration
b) écrire les instructions de programmation du timer

a) Mot de configuration
On fixe la valeur des bits du registre OPTION_REG intervenant dans la programmation de
TMR0.

bit5 T0CS = 0 : car mode timer


bit3 PSA = 1 : pas de prédivision
bit2-0 PS2-PS1-PS0 : n’interviennent pas, car pas de prédivision

Tous les bits qui n’interviennent pas dans la programmation de TMR0 seront fixés à 0.
Le mot de commande est :

en binaire B’00001000’
b) Instructions de configuration

bsf STATUS, RP0 ; passage en bank1 car OPTION_REG est en bank1


movlw B’00001000’
movwf OPTION_REG

1
Exemple2
Soit les propositions suivantes :
- registre TMR0 : mode compteur
- front descendant : comptage des impulsions sur front descendant
- prédiviseur : DIV=128
a) Quel est le mot de configuration
b) Ecrire les instructions de programmation

a) Mot de configuration : B’00110110’


b) Instructions :
bsf STATUS, RP0
movlw B’00110110’
movwf OPTION_REG

Exemple3
Soit les propositions suivantes :
- comptage de 10 évènements
- pas de prédiviseur
- front montant
Ecrire les instructions de configuration et d’initialisation de TMR0

Corrigé
Avant d’écrire ces instructions, on doit déterminer le mot de configuration et calculer la
valeur initiale du registre TMR0.

mot de configuration : B’00101000’


valeur de démarrage de TMR0 : 256-10 = 246

Instructions
bsf STATUS, RP0
movlw B’00101000’
movwf OPTION_REG
bcf STATUS, RP0 ; retour en bank0 car TMR0 en bank0
movlw .246
movwf TMR0 ; initialisation de TMR0

2
Application: la temporisation
La temporisation consiste à chronométrer une durée avant d’entreprendre une action.
Ce chronométrage est réalisé par le timer TMR0. Nous utilisons cette fonction pour faire
clignoter une led. On propose le schéma suivant :

La ligne RB0 commande la led, elle sera configurée en sortie

LED allumée : RB0 à l’état bas


LED éteinte : RB0 à l’état haut

L’action sur le bouton poussoir reset permet d’appliquer un niveau bas sur la pin MCLR
durant une durée déterminée (quelques ms). Lorsque le pic détecte ce niveau bas, il démarre
instantanément l’exécution du programme à partir de l’adresse 0x00.

Le principe du clignotement consiste à allumer la led durant une durée donnée, ensuite on
l’éteint durant la même durée (ou différente). La durée d’allumage ou d’extinction est
mesurée par le registre TMR0.
Pour notre application on prend la même durée D pour l’allumage et l’extinction de la led.

D = 1s = 1000ms
Pour mesurer D par TMR0 on doit définir certains paramètres de la relation vue en cours :

D = n x 256 x DIV x TH = 1000ms

TH = 1µs car FOSC = 4Mhz


DIV: on fait intervenir la prédivision car la mesure est trop grande pour le registre TMR0 à
lui seul.
256 : c’est le cycle complet du registre TMR0 (8bits)
n : notre programme mesure D=1s en comptant n débordement de TMR0

3
A l’aide du tableau des valeurs de prédivision vue en cours on choisit la valeur de DIV.
Comme la valeur de D est élevée, on choisit DIV = 256 (le maximum)
Il vient alors :
D = n x 256 x 256 x 1µs = 1000000 µs
d’où n = 15,26
On prend n = 15 car c’est un compteur de boucles et il doit être entier.

Mode timer avec prédivision

L’insertion du prédiviseur dans le système de mesure permet de faire de très longues mesures
de temps ou le comptage d’un très grand nombre d’impulsions extérieures en mode compteur
(pin RA4). Par exemple pour DIV=256 (PS2=1, PS1=1, PS0=1), on remarque sur cette figure
que le prédiviseur génère une impulsion T0 toutes les 256 impulsions TH. Le registre TMR0
s’incrémente à chaque fois qu’il reçoit une impulsion T0. Au débordement le bit T0IF du
registre INTCON passe à 1. Lorsqu’on aura fait n = 15 débordements, cela donne une
mesure de D=1s ; on change alors l’état de la led d’allumer à éteinte ou vice-versa.
Le bit T0IF doit être remis à 0 par programme.

Programme
list p=16f84
#include <p16f84.inc>

counter EQU 0x0C

org 0x00
bsf STATUS, RP0 ; bank 1 (pour TRISB et OPTION_REG)
clrf TRISB ; PORTB en sortie
movlw B'00000111'
movwf OPTION_REG
bcf STATUS, RP0 ; retour à bank 0
encore
bcf PORTB, 0 ; allume led
call delay ; temporisation 1s
bsf PORTB, 0 ; éteindre led
call delay ; temporisation 1s
goto encore ; recommencer
4
delay
movlw .15 ; pour attendre que TMR0 déborde 15 fois
movwf counter ; ce qui donne 15 x 256 x 256 μs
clrf TMR0
test
btfss INTCON, T0IF ; attendre que TMR0 déborde
goto test
bcf INTCON, T0IF ; débordement : raz T0IF
decfsz counter, f ; décrémente counter et test si fin tempo
goto test
return ; retour au programme principal
end

Commentaire :
La mesure de la durée de temporisation 1s est réalisée par TMR0. Cette mesure est lancée par
le sous-programme delay. A chaque fois que delay est appelé par le programme principal, le
pic charge le compteur de boucles counter par 15 et entre dans une boucle de test du
débordement. Dès qu’un débordement est détecté, la variable counter est décrémentée.
Lorsque counter atteint zéro on aura mesuré une durée de 1s, et delay retourne au programme
principal.

Ex1
Un bouton poussoir BP est câblé sur la ligne RA4. A chaque action sur BP le registre TMR0
s’incrémente et son contenu est affiché sur le PORTB. Au débordement on reprend le
comptage. Ecrire le programme assembleur.

Corrigé
D’après le schéma le comptage se fait sur le front montant des impulsions
Le PORTB est configuré en sortie car il affiche le contenu du registre TMR0.

5
Le programme
list p=16f84
#include <p16f84.inc>

org 0x00
bsf STATUS, RP0
clrf TRISB
bsf TRISA, 4 ; RA4 entrée
movlw B’00101000’ ; T0CS=1, T0SE=0, PSA=1
movwf OPTION_REG
bcf STATUS, RP0
clrf TMR0 ; raz compteur
start clrf PORTB ; raz affichage
read movf TMR0,w ; lecture compteur
movwf PORTB ; affichage
btfss INTCON, T0IF ; débordement ?
goto read ; non : retour lecture
bcf INTCON, T0IF ; oui: raz bit T0IF
goto start
end

Ex2
On veut mesurer la durée en ms du signal de la figure suivante lorsqu’il est à l’état bas. Pour
cela on injecte ce signal sur la ligne RA0, et on surveille les transitions positives et négatives.
A la transition négative on déclenche le timer, et à la prochaine transition positive on lit le
registre TMR0. La valeur lue est une mesure de la durée à l’état bas, elle est envoyée au
PORTB. A chaque affichage on démarre une nouvelle mesure.
On donne un quartz de 4MHz et DIV=256

Signal injecté

Ecrire le programme assembleur.

Commentaire: le déclenchement du timer consiste par exemple à sa remise à zéro dès la


détection du front descendant, le registre TMR0 continue par la suite son incrémentation sous
l’action de l’horloge.

Vous aimerez peut-être aussi