http://micropic.free.fr
Utilisation du Timer0 du 16F84
Nous allons voir l'utilisation du timer interne du PIC 16F84

Ce timer utilise 4 composants :
  • l'entrée horloge ( soit interne , soit externe )
  • Le prescaler
  • Le registre de comptage
  • Le flag d'interruption
L'entrée horloge :
Nous utiliserons ici le timer interne du PIC ( il est possible d'utiliser un timer externe relié à la patte 3 du PIC ).
La fréquence du timer interne est égale à la fréquence du pic divisé par 4.
Donc , pour un PIC cadencé à 4 MHz , la fréquence interne sera de 1 MHz.

Le prescaler :
La fréquence interne peut être divisé avant d'intervenir sur le compteur interne par un coefficient contenu dans le préscaler.
Ce prescaler est défini par 4 bits du registre INTCON pour permettre une division par 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 ou 256.
Par exemple , si le prescaler est défini à 4 , et que le quartz est cadencé à 4 MHz , le prescaler enverra un signal d'horloge de 250 KHz ( 4 MHz / 4 / 4 ) au registre TMR0.

Le registre de comptage :
Le registre TMR0 peut être préchargé avec une valeur.
Chaque impulsion d'horloge du prescaler incrémente le registre TMR0.
Quand celui-ci passe de 255 à 0 ( débordement ) , le bit T0IF est mis à 1 , puis le registre TMR0 continue d'être incrémenté suivant les impulsion d'horloge du préscaler.

Le flag d'interruption :
Si les bits GIE ( Global Interrupt Enable ) et T0IE ( Timer 0 Interrupt Enable ) sont mis à 1 , une interruption se produit quand le registre T0IF passe à 1.
Le bit GIE est automatiquement mis à 0 ( désactivé ) et le PIC se branche à l'adresse 4 ( interrupt vector ).
Le programme doit donc tester le flag T0IF pour voir si il s'agit d'une interruption générée par le timer TMR0.
Il faut effacer T0IF avant de réautoriser les interruptions , sinon le programme va retourner directement à l'adresse 4 dès l'autorisation des interruptions .
Voici un petit schéma rappelant le fonctionnement des différents flags d'interruptions :



Voici un exemple de l'utilisation de ce timer : un compteur horaire ( avec clignotement des ":" )

Calculs théoriques :
Quartz = 4MHz
Prescaler = 64
La fréquence interne est le quart de la valeur du quartz : 4 MHz / 4 = 1MHz
Durée d'une impulsion : T=1/F = 1/1MHz --> 1µs
Une interruption se produit à chaque débordement du timer , donc tout les 256 µs ( de 0 à 255 , donc 256 ).
Le prescaler étant de 64 , nous aurons donc une interruption toutes les 16384 µs ( 256 * 64 )

Il faudrait donc implementer un compteur de 61 pour avoir un compteur d'une durée de 1 seconde ( 16384 µs * 61 = 0.999424 s ).
La dérive due à cette aproximation est actuellement d'environ 4 secondes pour 1 heure.


Voici le schéma de cablage :



ainsi que le fichier source du programme :
Timer0.asm
© 1999-2004 Philippe Brégea