Le TMR0 est un registre dont le contenu est le résultat du comptage des instructions ou des évènements survenus sur la broche RA4.
Les registres associés à la gestion du module TMR0 sont donnés dans le tableau ci-dessous.

.1. Les différents modes de fonctionnement.
Le timer 0 est en fait un compteur. Il y a deux possibilités :
- En premier lieu, il peut compter les impulsions reçues sur la pin RA4/TOKI. Nous dirons dans ce cas que nous sommes en mode compteur.
- Il peut aussi décider de compter les cycles d’horloge du PIC lui-même. Dans ce cas, comme l’horloge est fixe, nous compterons donc en réalité du temps. Donc, nous serons en mode « timer ».
La sélection de l’un ou l’autre de ces deux modes de fonctionnement s’effectue par le bit 5 du registre OPTION_REG : T0CS pour Tmr0 Clock Source select bit.
- T0CS = 1 : Fonctionnement en mode compteur.
- T0CS = 0 : Fonctionnement en mode timer.
Dans le cas où on décide de travailler en mode compteur, on doit aussi préciser lors de quelle transition de niveau le comptage est effectué. Ceci est précisé grâce au bit 4 du registre OPTION_REG : T0SE pour Timer0 Source Edge select bit.
- T0SE = 0 : comptage si l’entrée RA4/TOKI passe de 0 à 1.
- T0SE = 1 : comptage si l’entrée RA4/TOKI passe de 1 à 0.
2. Le registre TMR0.
Ce registre, qui se localise à l’adresse 0x01 en banque0, contient tout simplement la valeur actuelle du timer0. Il est possible d’écrire ou de lire TMR0. Si par exemple tmr0 a été configuré en compteur, la lecture du registre TMR0 donnera le nombre d’événements survenus sur la pin RA4/TOKI.
3. Les méthodes d’utilisation du timer 0.
a) Le mode de lecture simple.
La première méthode qui vient à l’esprit est la suivante : Nous lisons le registre TMR0 pour voir ce qu’il contient. La valeur lue est le reflet du nombre d’événements survenus, en prenant garde au fait que le TMR0 ne peut compter que jusqu’à 255. En cas de dépassement, le TMR0 recommence à 0.
b) Le mode de scrutation du flag.
Nous devons savoir à ce niveau, que tout débordement du timer 0 (passage de 0xFF à 0x00) entraîne le positionnement du flag T0IF du registre INTCON. On peut donc utiliser ce flag pour déterminer s’il y a eu débordement du timer 0, ou, en d’autres termes, si le temps programmé est écoulé.
c) Le mode d’interruption.
C’est évidemment le mode principal d’utilisation du timer 0. En effet, lorsque T0IE est positionné dans le registre INTCON, chaque fois que le flag T0IF passe à 1, une interruption est générée.
d) Les méthodes combinées.
Supposons qu’on veut, par exemple, mesurer un temps entre 2 impulsions sur la broche RB0. Supposons également que ce temps soit tel que plusieurs débordements du TMR0 puissent avoir lieu. Une méthode simple de mesure du temps serait la suivante :
- A la première impulsion sur RB0, on lance le timer 0 en mode interruptions.
- A chaque interruption de tmr0, on incrémente une variable.
- A la seconde interruption de RB0, on lit TMR0 et on arrête les interruptions.
- Le temps total sera donc (256*variable)+TMR0.
On a donc utilisé les interruptions pour les multiples de 256, et la lecture directe de TMR0 pour les « unités ».
4. Le prédiviseur.
Supposons que nous travaillions avec un quartz de 4MHz. Nous avons donc dans ce cas (4000000/4) = 1.000.000 de cycles par seconde. Chaque cycle d’horloge dure donc 1/1000000ème de seconde, soit 1µs.
Si nous décidons d’utiliser le timer 0 dans sa fonction timer et en mode interruptions. Nous aurons donc une interruption toutes les 256µs, soit à peut près toutes les quarts de millième de seconde.
Si nous désirons réaliser une LED clignotante à une fréquence de 1Hz, nous aurons besoin d’une temporisation de 500ms, soit 2000 fois plus. Ce n’est donc pas pratique.
Nous disposons pour améliorer ceci d’un PREDIVISEUR. Qu’est-ce donc ? Et bien, tout simplement un diviseur d’événements situé AVANT l’entrée de comptage du timer 0. Nous pourrons donc décider d’avoir incrémentation de TMR0 tous les 2 événements par exemple, ou encore tous les 64 événements.
Le tableau des bits PS0 à PS2 du registre OPTION_REG déterminent la valeur du prédiviseur.
Ces valeurs varient, pour le timer 0, entre 2 et 256. Le bit PSA, quant à lui, détermine si le prédiviseur est affecté au timer 0 ou au watchdog.
Ci-dessous la description du registre OPTION_REG.

- RBPU : PORTB pull-up enable bit. Ce bit permet d’activer (0) ou non (1) l’utilisation d’une résistance de tirage.
INTEDG : Interrupt Edge Select bit. Ce bit permet de sélectionner le front du signal qui peut provoquer une interruption sur la broche RB0. A 1 le front est montant, à 0 le front est descendant.
2016-12-15 15:16:41 / mazoughou@magoe.gn
0 commentaires
Votre impression compte aussi