Utiliser les PIC 16F et 18F/Le Timer0 des 16FXXX et le langage C

Leçons de niveau 15
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Le Timer0 des 16FXXX et le langage C
Icône de la faculté
Chapitre no 8
Leçon : Utiliser les PIC 16F et 18F
Chap. préc. :Les ports et le langage C
Chap. suiv. :Interruption timer0 en langage C

Exercices :

Le Timer0 des 16FXXX et le langage C
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Utiliser les PIC 16F et 18F : Le Timer0 des 16FXXX et le langage C
Utiliser les PIC 16F et 18F/Le Timer0 des 16FXXX et le langage C
 », n'a pu être restituée correctement ci-dessus.

Le timer 0 du PIC 16FXXX[modifier | modifier le wikicode]

Description matérielle[modifier | modifier le wikicode]

Le timer0 est un timer sur 8 bits. C'est totalement visible sur la figure ci-dessous. Les bits des registres 8 bits seront toujours repérés de b0 (poids faible) à b7 (poids fort).

Le timer0 du PIC 16FXXX

Cette figure est la première d'une longue série qui décrit complètement le fonctionnement matériel du timer0. Il vous faut cependant passer du temps pour la comprendre si vous voulez comprendre aussi les autres.

Que voit-on sur cette figure ?

  • La fréquence du quartz est divisée par 4 avant utilisation (en haut à droite)
  • C'est le registre OPTION qui permet une configuration du fonctionnement du timer0
  • Lors d'un débordement (overflow) du timer 0, un bit nommé "TMR0IF" du registre INTCON est positionné. Ce bit n'est jamais remis à 0 par le matériel car c’est un drapeau (flag)
  • Le bit "T0CS" du registre OPTION permet, à l'aide du multiplexeur en haut à droite de choisir l'entrée du timer 0. On voit qu’il peut s'agir du quartz interne du PIC ou du bit "T0CKI" du PORTA.
  • Le ou exclusif (=1) permet une éventuelle inversion
  • Les trois bits "PS2", "PS1" et "PS0" permettent un choix de division entre 2 et 256
  • La fameuse division ci-dessus ne sera prise en compte que si le multiplexeur du bas est positionné correctement par le bit "PSA" du registre OPTION.
  • Cette figure vous donne aussi la position de tous les bits. Par exemple, le fameux bit "T0CKI" du PORTA est le bit b4 du PORTA.

Et pour terminer une remarque sur le registre OPTION.


Comment l’utiliser avec un programme[modifier | modifier le wikicode]

Pour réaliser un programme, la première question que l’on se pose, est de savoir comment s'appellent les registres et comment s'appellent les bits correspondant. Encore une fois on donne ces noms à travers des fichiers d'en-tête et pour deux compilateurs différents.

Nom des bits et registres avec MikroC[modifier | modifier le wikicode]

Regardez ci-dessous comment les registres sont appelés ainsi que pour une fois quelques noms de bits :

const unsigned short
//********* bits de INTCON
GIE      = 0x0007,
EEIE       = 0x0006,
T0IE       = 0x0005,
INTE       = 0x0004,
RBIE       = 0x0003,
T0IF       = 0x0002,
INTF       = 0x0001,
RBIF       = 0x0000,
....
//********** bits de OPTION
NOT_RBPU       = 0x0007,
INTEDG       = 0x0006,
T1 T0CS       = 0x0005,
T0SE       = 0x0004,
PSA      = 0x0003,
PS2      = 0x0002,
PS1      = 0x0001,
PS0      = 0x0000,
...
unsigned short register volatile
  TMR0       absolute 0x0001;
...
unsigned short register volatile
  PORTA      absolute 0x0005;
...
unsigned short register volatile
  INTCON       absolute 0x000B;
unsigned short register
  OPTION_REG       absolute 0x0081,
  TRISA      absolute 0x0085,
...
Début de l'exemple
Fin de l'exemple


Nom des bits et registres avec HitechC[modifier | modifier le wikicode]

Comme d'habitude, les noms des registres sont sans surprise. Hitech C définit aussi un certain nombres de bits.

volatile unsigned char	TMR0	@ 0x01;
...
volatile unsigned char	PORTA	@ 0x05;
...
volatile unsigned char	INTCON	@ 0x0B;
unsigned char      	OPTION	@ 0x81;
...
volatile unsigned char  	TRISA	@ 0x85;
...
/*      PORTA bits      */
volatile bit	RA4	@ (unsigned)&PORTA*8+4;
volatile bit	RA3	@ (unsigned)&PORTA*8+3;
volatile bit	RA2	@ (unsigned)&PORTA*8+2;
volatile bit	RA1	@ (unsigned)&PORTA*8+1;
volatile bit	RA0	@ (unsigned)&PORTA*8+0;

/*	INTCON bits	*/
volatile bit	GIE	@ (unsigned)&INTCON*8+7;
volatile bit	EEIE	@ (unsigned)&INTCON*8+6;
volatile bit	T0IE	@ (unsigned)&INTCON*8+5;
volatile bit	INTE	@ (unsigned)&INTCON*8+4;
volatile bit	RBIE	@ (unsigned)&INTCON*8+3;
volatile bit	T0IF	@ (unsigned)&INTCON*8+2;
volatile bit	INTF	@ (unsigned)&INTCON*8+1;
volatile bit	RBIF	@ (unsigned)&INTCON*8+0;

/*	OPTION bits	*/
      bit	RBPU	@ (unsigned)&OPTION*8+7;
      bit	INTEDG	@ (unsigned)&OPTION*8+6;
      bit	T0CS	@ (unsigned)&OPTION*8+5;
      bit	T0SE	@ (unsigned)&OPTION*8+4;
      bit	PSA	@ (unsigned)&OPTION*8+3;
      bit	PS2	@ (unsigned)&OPTION*8+2;
      bit	PS1	@ (unsigned)&OPTION*8+1;
      bit	PS0	@ (unsigned)&OPTION*8+0;
...

/*      TRISA bits      */
volatile       bit	TRISA4	@ (unsigned)&TRISA*8+4;
volatile       bit	TRISA3	@ (unsigned)&TRISA*8+3;
volatile       bit	TRISA2	@ (unsigned)&TRISA*8+2;
volatile       bit	TRISA1	@ (unsigned)&TRISA*8+1;
volatile       bit	TRISA0	@ (unsigned)&TRISA*8+0;

Les différents modes de fonctionnement[modifier | modifier le wikicode]

Le timer0 est en fait un compteur. Mais qu’allez-vous compter avec ce timer ? Et bien, vous avez deux possibilités :

  • En premier lieu, vous pouvez compter les impulsions reçues sur la pin RA4/T0CKI. Nous dirons dans ce cas que nous sommes en mode compteur
  • Vous pouvez 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 d’un ou l’autre de ces deux modes de fonctionnement s’effectue par le bit 5 du registre OPTION : T0CS pour Tmr0 Clock Source select bit.

  • T0CS = 1 : Fonctionnement en mode compteur
  • T0CS = 0 : Fonctionnement en mode timer

Dans le cas où vous décidez de travailler en mode compteur, vous devez aussi préciser lors de quelle transition de niveau le comptage est effectué. Ceci est précisé grâce au bit 4 du registre T0CON : T0SE pour Timer0 Source Edge select bit.

  • T0SE = 0 : comptage si l’entrée RA4/TOKI passe de 0 à 1 (front montant)
  • T0SE = 1 : comptage si l’entrée RA4/TOKI passe de 1 à 0 (front descendant)

Mesure du temps d'exécution d'un algorithme[modifier | modifier le wikicode]

L'optimisation d'un algorithme en vitesse (ou en taille) est très importante dans les systèmes embarqués réalisés par des micro-contrôleurs. Une recherche d'algorithmes sur Internet vous donnera des résultats qu’il vous faudra évaluer. Par exemple, le site : http://www.piclist.com/techref/language/ccpp/convertbase.htm vous propose un algorithme de division par 10 que voici :

unsigned int A;
unsigned int Q; /* the quotient */
        Q = ((A >> 1) + A) >> 1; /* Q = A*0.11 */
        Q = ((Q >> 4) + Q)     ; /* Q = A*0.110011 */
        Q = ((Q >> 8) + Q) >> 3; /* Q = A*0.00011001100110011 */
        /* either Q = A/10 or Q+1 = A/10 for all A < 534,890 */

L'exercice 1 se propose de mesurer le temps d'exécution de cet algorithme et d’en faire des comparaisons.

Le mode de scrutation du flag[modifier | modifier le wikicode]

Nous devons savoir à ce niveau, que tout débordement du timer0 (passage de 0xFF à 0x00) entraîne le positionnement du flag T0IF, bit b2 du registre INTCON. Vous pouvez donc utiliser ce flag pour déterminer si vous avez eu débordement du timer0, ou, en d’autres termes, si le temps programmé est écoulé. Cette méthode à l’inconvénient de vous faire perdre du temps inutilement dans une boucle d'attente. Petit exemple :

 
     clrf        tmr0                 ; début du comptage dans 2 cycles 
                                      ; (voir remarque plus bas) 
     bcf         INTCON , T0IF        ; effacement du flag 
loop 
     btfss       INTCON , T0IF        ; tester si compteur a débordé 
     goto        loop                 ; non, attendre débordement 
     xxx                              ; poursuivre : 256/65536 évènements écoulés

Le timer 0 du pic 18FXXXX[modifier | modifier le wikicode]

Le titre de ce chapitre ne contient pas le PIC 18F, mais nous décidons quand même de le documenter.

Documentation complète du timer0 du 18F4550

Que voit-on sur cette figure ?

  • La fréquence du quartz est divisée par 4 avant utilisation (en haut à droite)
  • C'est le registre T0CON qui permet une configuration du fonctionnement du timer0
  • Le timer 0 est sur 16 bits alors qu’il est sur 8 bits dans les 16F. En fait le timer 0 peut être configuré sur 8 ou 16 bits à l'aide du bit T08Bit du registre T0CON.
  • Lors d'un débordement (overflow) du timer 0, un bit nommé "TMR0IF" du registre INTCON est positionné. Ce bit n'est jamais remis à 0 par le matériel car c’est un drapeau (flag)
  • Le bit "T0CS" du registre T0CON permet, à l'aide du multiplexeur en haut à droite de choisir l'entrée du timer 0. On voit qu’il peut s'agir du quartz interne du PIC ou du bit "T0CKI" du PORTA.
  • Le ou exclusif (=1) permet une éventuelle inversion
  • Les trois bits "T0PS2", "T0PS1" et "T0PS0" permettent un choix de division entre 2 et 256
  • La fameuse division ci-dessus ne sera prise en compte que si le multiplexeur du bas est positionné correctement par le bit "PSA" du registre T0CON.
  • Le Timer0 peut être arrêter par le bit TMR0ON de T0CON. Les 16F n'offrent pas cette possibilité pour le Timer0.
  • Cette figure vous donne aussi la position de tous les bits. Par exemple, le fameux bit "T0CKI" du PORTA est le bit b4 du PORTA.

Les schémas donnés dans les documentations Microchip sont plus du style :

Documentation simplifiée du timer0 du 18F4550

On est confronté au problème de l'écriture dans un registre 16 bits par un processeur 8 bits. Ce problème est documenté dans cette figure.

  • Pour écrire on commence par les 8 bits de poids fort puis par les 8 bits du poids faible.
  • Pour lire on commence par lire les 8 bits de poids faible puis les 8 bits de poids fort.


Image logo représentative de la faculté Faculté de Sciences de l'ingénieur Faites ces exercices : Le timer0.