34
1 Les Timers

Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

1

Les Timers

Page 2: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

2

Principe de fonctionnement

● Rôle : Réaliser une temporisation● Élément essentiel : Compteur qui s'incrémente

à chaque front montant du signal qui lui est appliqué :

Page 3: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

3

Principe de fonctionnement

● Lorsque le compteur dépasse la valeur maximale qu'il peut contenir (par exemple : 256 pour un compteur sur 8 bits), un drapeau (flag en anglais) se lève.

0255254253

Page 4: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

4

Principe de fonctionnement

● Ce drapeau a pour but d'indiquer au programme que le compteur a débordé (c'est à dire qu'il a ”fini” de compter).

● De la même manière que pour la boîte aux lettres, c'est au programme de rebaisser le drapeau pour recommencer un cycle de comptage (ça ne se fait pas tout seul !).

Ré-initialisation du drapeau

Page 5: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

5

Méthodes de configuration

● Un Timer doit pouvoir compter un temps défini par le programme (par exemple 1ms, 10ms, 50ms, etc).

● Pour cela, 2 paramètres peuvent être modifiés : La fréquence du signal appliqué au compteur

Le compteur s'incrémentera ainsi plus ou moins vite. Le nombre d'impulsions à compter

Le drapeau se lève toujours lorsqu'il y a débordement, on peut donc faire partir le compteur d'une valeur non nulle pour réduire le temps de comptage.

Page 6: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

6

Méthodes de configuration

● Modification de la fréquence du signal appliqué au compteur : le pré-diviseur (prescaler en anglais)

Exemple : pour compter 4 fois moins vite

Page 7: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

7

Méthodes de configuration

● Modification du nombre d'impulsions à compter Si le compteur démarre à 0, il mettra beaucoup

de temps à atteindre sa valeur maximale. Pour réduire le temps de comptage, on peut

donc charger une valeur initiale non nulle dans le compteur.

Exemple : Valeur initiale égale à 250

0255254253252251250

Chargement du compteur à une valeur initiale de 250

→ 6 impulsions

Page 8: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

8

Les Timers du PIC 16F887

● Composition générale d'un Timer sur un microcontrôleur PIC :

● Calcul du temps mis par le Timer pour faire lever son drapeau :

T=T quartz×Valeur du pré-compteur fixe × Valeur du pré-compteur réglable × Nombre d'impulsions à compter

Page 9: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

9

Les Timers du PIC 16F887

● Les Timers sont internes au microcontrôleur.● Le 16F887 en compte 3 :

– Timer0 et Timer2 sur 8 bits

– Timer1 sur 16 bits

Page 10: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

10

Le Timer0 du 16F887

● Composition du Timer0 Le pré-diviseur peut prendre une valeur parmi la

liste suivante : 1, 2, 4, 8, 16, 32, 64, 128 ou 256

La valeur initiale peut prendre n'importe quelle valeur entière comprise entre 0 et 255.

Page 11: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

11

Le Timer0 du 16F887

● Calcul du temps maximum :– Pour que le drapeau se lève le plus tard possible, il faut

que la fréquence du signal appliqué au compteur soit la plus faible possible. Il faut donc configurer le pré-diviseur le plus grand : 256

– Il faut également faire démarrer le compteur avec la valeur la plus petite possible pour qu'il compte le nombre d'impulsion le plus grand : valeur initiale = 0

T MAX=T quartz×Valeur du pré-compteur fixe × Valeur du pré-compteur réglable max × Nombre d'impulsions à compter max

T MAX=1

4.106×4×256×(256−0)=65,536ms

Page 12: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

12

Le Timer0 du 16F887

● Calcul d'un temps de 10 ms :

avec

soitX Y Y arrondi Valeur initiale

(256 – Y arrondi)

1 10 000 Impossible

2 5 000 Impossible

4 2 500 Impossible

8 1 250 Impossible

16 625 Impossible

32 312,5 Impossible

64 156,25 156 256 – 156 = 100

128 78 ,125 78 256 – 78 = 178

256 39,0625 39 256 – 39 = 217

Pré-diviseur = 64Valeur à compter = 156

Soit valeur initiale = 100

T=10.10−3=

1

4.106×4× X×Y

X×Y=10000

X=valeur du pré-compteur

Y=valeur à compter=256 - valeur initiale

64×156=9984

128×78=9984256×39=9984

Page 13: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

13

Le Timer0 du 16F887

Page 14: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

14

Le Timer0 du 16F887

● Registre de configuration du Timer0 : OPTION_REG

/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

? ? ? ? ? ? ? ?

Page 15: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

15

/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

X (1) X (0) 0 X (0) 0 1 0 1

Le Timer0 du 16F887

● Registre de configuration du Timer0 : OPTION_REG

Pré-diviseur = 64

Si pré-diviseur ≠ 1:1 alors PSA = 0

Page 16: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

16

Le Timer0 du 16F887● Registres associés au Timer0 :

TMR0 : c'est le registre de comptage. C'est donc dans ce registre que nous allons rentrer la valeur de départ de notre compteur.

INTCON seuls les bits 7, 6, 5 et 2 sont utiles pour le Timer 0 (ce sont les seuls non grisés). Dans ce chapitre, nous ne nous intéresserons qu'au bit 2 appelé T0IF et qui correspond au flag permettant de tester la fin du comptage. Les bits 7, 6 et 5 seront vus lors du chapitre sur les interruptions.

OPTION_REG : Nous venons de le voir ...

Page 17: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

17

Le Timer0 du 16F887● Exemple de programme :

void tempo_timer0 ( void ); // tempo de 10ms avec le timer0void init ( void ); // initialisation des périphériques

void main ( void ){

init(); // initialisation des périphériques

while ( 1 ) // boucle infinie{

PORTB.1 = !PORTB.1; // on change l'état de RB1tempo_timer0(); // tempo de 10 ms

}}

void tempo_timer0 ( void ) // tempo de 10ms avec le timer0{ TMR0 = 100; // initialisation du registre de comptage T0IF = 0; // initialisation du drapeau lié au timer0 while ( T0IF == 0 ); // attente de la levée du drapeau}

void init ( void ) // initialisation des périphériques{

TRISB.1 = 0; // RB1 configuré en sortieOPTION_REG = 0x85; // configuration du timer0 : pré-diviseur à 64

}

Page 18: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

18

Le Timer0 du 16F887● Attention ! : Que se passe-t-il si on ne recharge

pas le registre de comptage (TMR0) à chaque début de temporisation ? Par exemple :

void tempo_timer0 ( void ) // tempo de 10ms avec le timer0{ T0IF = 0; // initialisation du drapeau lié au timer0 while ( T0IF == 0 ); // attente de la levée du drapeau}

void init ( void ) // initialisation des périphériques{

TRISB.1 = 0; // RB1 configuré en sortieOPTION_REG = 0x85; // configuration du timer0 : pré-diviseur à 64TMR0 = 100; // initialisation du registre de comptage

}La 1ère tempo est correctemais toutes les autres comptentde 0 à 255 au lieu de 100 à 255… faites donc attention à cela !

À ne pas faire en TP !(c'est pour illustrer ce qu'il ne faut pas faire ...)

Page 19: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

19

Le Timer0 du 16F887

● Exercice 1 : Temporisation de 1 ms avec le timer 0.

– Question 1 : Quels sont les registres du TIMER0 qu'il est nécessaire de configurer ?

– Question 2 : Calculer les valeurs du prescaler et du compteur nécessaire pour obtenir une temporisation de 1 ms.

– Question 3 : Donner la configuration des registres du TIMER0.

– Question 4 :

Ecrivez la fonction void Tempo_Timer0_1ms (void) qui permet d'utiliser le Timer 0.

Page 20: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

20

Le Timer0 du 16F887

● Exercice 2 : Temporisation de 8 ms avec le timer 0.

– Question 1 : Re-calculer les valeurs du prescaler et du compteur nécessaires pour obtenir cette fois une temporisation de 8 ms.

– Question 2 : Donner la configuration des registres du TIMER0.

Page 21: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

21

Le Timer0 du 16F887

● Exercice 3 : Temporisations variables avec le timer 0.

La temporisation maximale avec le Timer 0 est de 65 536 μs. Pour réaliser des temporisations plus longues nous allons faire des boucles.

Pour cela, nous allons écrire une fonction appelée TempoX10 qui lance X fois une temporisation de 10 ms. X sera une valeur passée en paramètre.

Par exemple, pour faire une temporisation de 1,5s, nous écrierons tempoX10(150).

Question : Écrire la fonction void tempoX10('X') en n'oubliant pas de configurer correctement le passage de paramètre qui lancera X fois une temporisation de 10ms.

Page 22: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

22

Le Timer2 du 16F887

● Il est légèrement différent du Timer 0 puisque le début de comptage est en principe 0x00 et que la fin de comptage est la valeur à entrer.

● Il possède comme le Timer 0 un pré-compteur fixe et un pré-compteur variable (3 valeurs possibles : 1, 4 et 16). C'est aussi un compteur 8 bits.

Page 23: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

23

Le Timer2 du 16F887

● Calcul de la durée de comptage

● Durée de comptage max :

T MAX=T quartz× Valeur du pré-compteur fixe × Valeur du pré-compteur réglable max × (Valeur définie + 1)

T MAX=1

4.106 ×4×16×256=4,096ms

Page 24: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

24

Le Timer2 du 16F887

● Originalité de ce Timer :

Le flag ne se lève pas systématiquement à chaque fin de comptage.

Existance d'un post-compteur. Ce post-compteur peut prendre chaque

valeur entière entre 1 et 16. Exemple pour un post-compteur de 4 :

Page 25: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

25

Le Timer2 du 16F887

● La temporisation max de ce Timer est donc :

TMAX

= 16 * 4,096 ms soit 65,536 ms

● La formule permettant de calculer la durée de la temporisation est donc :

T=Valeur du post-compteur×1

F quartz×4×Valeur du pré-compteur réglable×(Valeur définie + 1)

Page 26: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

26

Le Timer2 du 16F887

Page 27: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

27

Le Timer2 du 16F887

Page 28: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

28

Le Timer2 du 16F887

Attention, en TP : pour choisir un prescaler de 16,mettez T2CKPS<1:0> = 10, sinon un bug deMPLABSIM vous donnera des résultats inchohérents

Page 29: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

29

Le Timer2 du 16F887

void tempo_timer2 ( void ); // tempo avec le timer2void init ( void ); // initialisation des périphériques

void main ( void ){ init(); // initialisation des périphériques

while ( 1 ) // boucle infinie { PORTB.1 = !PORTB.1; // on change l'état de RB1 tempo_timer2(); // tempo de 50 ms }}

void tempo_timer2 ( void ) // tempo de 50ms avec le timer2{ PR2 = 239; // Valeur définie de fin de comptage T2CON = 0x66; // configuration du timer2 TMR2IF = 0; // initialisation du drapeau lié au timer2 while ( TMR2IF == 0 ); // attente de la levée du drapeau}

void init ( void ) // initialisation des périphériques{ TRISB.1 = 0; // RB1 configuré en sortie}

void tempo_timer2 ( void ); // tempo avec le timer2void init ( void ); // initialisation des périphériques

void main ( void ){ init(); // initialisation des périphériques

while ( 1 ) // boucle infinie { PORTB.1 = !PORTB.1; // on change l'état de RB1 tempo_timer2(); // tempo de 50 ms }}

void tempo_timer2 ( void ) // tempo avec le timer2{ TMR2IF = 0; // initialisation du drapeau lié au timer2 while ( TMR2IF == 0 ); // attente de la levée du drapeau}

void init ( void ) // initialisation des périphériques{ TRISB.1 = 0; // RB1 configuré en sortie PR2 = 239; // Valeur définie de fin de comptage T2CON = 0x66; // configuration du timer2}

Ces 2 programmes fonctionnent … mais la solution de droite est plus intelligente

Page 30: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

30

Le Timer1 du 16F887

● Particularités de ce Timer 1 : Principe de fonctionnement similaire au Timer0 Le pré-compteur ne peut prendre que quatre

valeurs : 1, 2, 4 ou 8. Le compteur est un compteur 16 bits :

Registre de comptage composé de deux registres de 8 bits : TMR1H et TMR1L

Page 31: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

31

Fonctions particulières des Timers

● Les Timers 0 et 1 peuvent être utilisés en compteur d’événements extérieurs.

Exemples :

Compteur de pièces dans une machine industrielle Affichage de la vitesse d’un véhicule

● Timer 0 :

Signal à appliquer sur la broche RA4/T0CKl

Bit T0CS à mettre à 1

(Il faut bien sûr penser à mettre la ligneRA4 en entrée avec TRISA.4)

Page 32: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

32

Timer 0 en compteur d'évènements

● T0SE = 0 : les fronts montants attaquant le Timer0 correspondent aux fronts montants de RA4 / T0CKI

● T0SE = 1 : les fronts montants attaquant le Timer0 correspondent aux fronts descendants de RA4 / T0CKI

Page 33: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

33

Timer 1 en compteur d'évènements

● La broche du PIC associée au Timer 1 est la ligne RC0/T1OSO/T13CKI :

La ligne RC1 / T1OSI est aussi associée au Timer 1, mais ne joue pas de rôle dans le comptage d'événements extérieurs.

Compte tenu de la remarque ci-dessus, il faut déconnecter la ligne RC1 / T1OSI en invalidant la porte logique inverseuse.

bit T1OSCEN = 0

Page 34: Les Timers - systemesembarques.e-monsite.comsystemesembarques.e-monsite.com/medias/files/chapitre-5-timers.pdf · 4 Principe de fonctionnement Ce drapeau a pour but d'indiquer au

34

Timer 1 associé à un quartz

● Il est possible de connecter un quartz sur le Timer 1 et de compter les impulsions de celui-ci pour générer des temps plus précis comme par exemple pour créer une horloge de secondes, minutes, heures ou un chronomètre.

● Très utile pour gérer le mode sommeil du micro-controleur.

● En général, on prend un quartz dit d'”horloger” de 32768 Hz (on divise ensuite par 215 pour avoir 1s)

T1OSCEN = 1