LES TIMER
On peut répartir les fonctions d'un timer en 3 catégories principales :
Introduction de délais, ou temporisations,
Répétition périodique d’actions à intervalles précis,
Mesure de la durée entre des actions.
De ce fait les Timers permettent de générer un signal périodique modulé ou non en largeur d’impulsion ou la
génération d’une impulsion bien calibrée, créer des temporisations ou de compter les d'événements.
Plusieurs registres sont associés à un Timer pour configurer les différents modes décrits précédemment
Dans la mesure où on connaît exactement la période du cycle de l’horloge qui cadence le processeur, ainsi que
le nombre de cycles utilisés par chaque instruction, l’écriture d’une boucle de programme de durée précise ne pose
en principe aucun problème.
La question se complique si on veut effectuer une action périodique de période précise. En effet, il faut
décompter de la temporisation la durée des instructions de l’action. S’il s’agit d’une action séquentielle, le problème
est facilement soluble, mais si elle présente des aiguillages, il faut évaluer la durée de chaque chemin possible pour
calculer la temporisation à lui ajouter. Cela donne des logiciels très lourds à mettre au point, et surtout pratiquement
impossibles à modifier.
Si on veut mesurer logiciellement la durée écoulée entre deux événements, le logiciel doit contrôler deux actions
simultanément : l’avance d’un compteur chronomètre et la surveillance de l’occurrence de l’événement.
Ces exemples donnent une idée des problèmes posés par les temporisations logicielles. Dans les cas cités, c’est
difficile mais pas insurmontable. Mais le problème devient impossible pour deux raisons principales :
l’évolution des processeurs dont les vitesses d’horloge s’accélèrent, et le fonctionnement en parallèle avec des
interruptions dont on ignore la durée et la fréquence puisqu’on n’en connaît souvent même pas les sources. Il
devient alors absolument nécessaire de disposer d’une horloge autonome, qui gère l’incrémentation de son (ou
ses) compteurs indépendamment du logiciel du CPU. On appelle ce module périphérique timer (ou compteur de
temps).
LES TIMER du PIC 16F876/877
Le Pic16F877 comporte trois timers qui sont :
Le Timer TMR0
Le Watchdog Timer WDT (Chien de garde)
Le Timer TMR1
Le mode Timer
Dans ce mode, TMR1 est incrémenté par l’horloge système Fosc/4 éventuellement prédiviseé. Le bit de
synchronisation n'a pas d'effet car l'horloge Fosc/4 est toujours synchronisée sur l'horloge système.
Le mode Compteur
Dans ce mode, TMR1 est incrémenté à chaque front montant de l'horloge externe T1CKI (RC0) ou l'horloge
dédiée générée par l’oscillateur T1OSC à condition de positionner le bit T1OSCEN à 1 et de brancher un quartz
entre les broche RC0 et RC1.
En mode compteur, RC0 et RC1 sont automatiquement configurées en entrée, on n’a pas besoin de configurer
les bits TRISC,0 et TRISC,1
En fonctionnement Synchrone, l'horloge externe (éventuellement prédiviseé) n'incrémente pas
directement le timer mais elle est synchronisée sur l'horloge système ce qui peut entrainer un délai de
l'ordre de 1 cycle machine. Dans cette configuration
En fonctionnement Asynchrone, l'horloge externe (éventuellement prediviseé) incrémente le timer
indépendamment de l'horloge système.
Le registre de control de T1CON
Les module de Comparaison/Capture CCP1 et CCP2
Le module CCP est spécialement utilisé pour la commande des machines électriques (génération des signaux
PWM, mesure de vitesse, génération des signaux logiques …).
Le microcontrôleur PIC16F876/877 dispose de deux modules CCP identiques CCP1 et CCP2. Ces modules
sont liés au timer1 pour le mode Capture/ Compare, et au timer2 pour la mode PWM.
Les deux modules identiques CCP1 et CCP2 sont composés chacun d'un registre 16 bits. Ils peuvent opérer soit
comme un registre 16 bits de capture, soit comme un registre 16 bits de comparaison, soit enfin comme un
registre 8 bits pour générer du PWM.
Le module CCP1 est constitué de deux registres de 8 bits : CCPR1L et CCPR1H. Ce module est
contrôlé par le registre CCP1CON. La sortie en mode COMPARE ou mode PWM et l'entrée en mode
CAPTURE se font par la broche RC2.
Le module CCP2 est constitué de deux registres de 8 bits : CCPR2L et CCPR2H. Ce module est
contrôlé par le registre CCP2CON. La sortie en mode COMPARE ou mode PWM et l'entrée en mode
CAPTURE se font par la broche RC1.
En mode COMPARE ou CAPTURE, les modules utilisent le TIMER1. En mode PWM, ils utilisent le
TIMER2.
Les registres de contrôles CCP1CON et CCP2CON sont identiques. On ne décrira que CCP1CON.
CCP1CON : ( h'17'). (et CCP2CON en h'1D')
Au reset : CCP1CON = 00000000
bit 5 et bit 4 : CCP1X et CCP1Y :
Bits non utilisés en modes Compare et Capture.
Ce sont les 2 bits LSB pour le rapport cyclique en mode PWM. Les 8 bits MSB sont dans le registre CCPR1L
en h'15'.
bit 3 à bit 0 : CCP1M3 à CCP1M0 : bits de sélection du mode.
0 0 0 0 = Module CCP stoppé.
0 1 0 0 = Mode Capture à chaque front descendant.
0 1 0 1 = Mode Capture à chaque front montant.
0 1 1 0 = Mode Capture tous les 4 fronts montants.
0 1 1 1 = Mode Capture tous les 16 fronts montants.
1 0 0 0 = Mode Compare. Pin de sortie RC2 mise à "1" et Flag CCP1IF = 1 à l'égalité.
1 0 0 1 = Mode Compare. Pin de sortie RC2 mise à "0" et Flag CCP1IF = 1 à l'égalité.
1 0 1 0 = Mode Compare. Génération d'une Interruption. Et Flag CCP1IF = 1 à l'égalité.
1 0 1 1 = Mode Compare. Événement spécial généré et Flag CCP1IF = 1 à l'égalité.
1 1 x x = Mode PWM. (modulation de largeur d’impulsion)
MODE COMPARE :
Les deux modules CCP étant identiques on ne décrira que le module 1.
Les 16 bits des registres CCPR1 (CCPR1H et CCPR1L) sont constamment comparés avec la
valeur sur 16 bits des registres du Timer 1 ( TMR1H et TMR1L). Quand il y a égalité, la broche
préalablement programmée en sortie RC2, passe soit à "1" soit à "0" suivant la configuration
des 4 bits CCP1M du registre CCP1CON. Au même instant le Flag CCP1IF est mis à "1".
En mode Compare, les événements spéciaux générés quand il y a égalité sont:
- Pour CCP1: reset du Timer 1.
- Pour CCP2 : reset du Timer 1 et démarrage d'une conversion A/D.
Dans ce cas la broche de sortie n'est pas affectée, mais le Flag CCP1IF est mis à "1". Il est
rappelé que ce Flag doit être remis à "0" par soft.
mode 1000 :
Au moment de l'égalité, le drapeau CCP1IF est le bit RC2 passent a 1. C'est à l'utilisateur de les remettre à 0
pour une prochaine utilisation. RC2 doit être configurée en sortie.
mode 1001 :
Au moment de l'égalité, le drapeau CCP1IF passe a 1 et le bit RC2 passe a 0. C'est à l'utilisateur de les remettre
à leur état d’origine pour une prochaine utilisation. RC2 doit être configurée en sortie.
mode 1010 :
A l'égalité le drapeau CCP1IF passe à 1. La broche RC2 n'est pas utilisée.
mode 1011 :
A l'égalité, le drapeau CCP1IF passe à 1 et le timer TMR1 est remis à 0
MODE CAPTURE :
Quand un événement extérieur apparaît sur la broche préalablement programmée en entrée RC2, la valeur des
16 bits des registres du Timer 1 (TMR1L et TMR1H) est recopiée dans les registres CCPR1 ( CCPRIH et
CCPR1L). Cet événement est programmable par les 4 bits CCP1M du registre CCP1CON. La capture peut
avoir lieu à chaque front descendant, à chaque front montant, tous les 4 ou tous les 16 fronts montants.
Quand la capture a eu lieu, le flag CCP1IF est mis à 1. Ce bit doit être remis à 0 par soft.
Si une nouvelle capture survient alors que la valeur dans CCPR1 n'a pas été lue, l'ancienne valeur est perdue.
Les fonctions de Capture et de Compare sur le Timer 1 par les modules CCP1 et CCP2 peuvent générer une
interruption quand le Flag CCP1IF passe à 1 si le bit d'autorisation CCP1IE du registre PIE1 est mis à 1.
Plusieurs aspects sont à noter comme :
Si on veut déclencher la capture par un signal externe, celui-ci doit être applique sur la proche RC2 qui
doit être configurée en entrée par le bit TRISC,2
Si on veut déclencher la capture par programme en changeant la valeur du bit RC2, celui-ci doit être
configuré en sortie par le bit TRISC,2
Lors de la modification du mode de capture, une interruption indésirable peut intervenir. L'utilisateur
doit veiller à masquer l'interruption CCP1I avant de procéder a cette modification et de baisser le
drapeau CCP1IF après la modification.
En mode Sleep, le prescaler et le drapeau CCP1IF restent opérationnels. Le positionnement du drapeau
peut déclencher un Wake-up si le bit de validation CCP1IE a été valide auparavant
MODE PWM :
La modulation MLI (Modulation en Largeur d’Impulsion), PWM (Pulse Width Modution en anglais) est
utilisée dans la variation de la vitesse des moteurs électriques.
Le signal PWM est obtenu par modulation d’un signal triangulaire ou dents de scie avec un signal de référence,
dont la fréquence est très faible par rapport à la porteuse.
Pour atteindre une résolution de 10 bits Microchip a compété le registre CCPxH par
les deux bits CCP1X et CCP1Y du registre CCP1CON.
Principe : Un signal PWM est caractérisé par une période, et un temps de travail ou le
signal est à "1". Ce temps est appelé DUTY CYCLE à partir desquels on obtiendra le DUTY CYCLE RATIO
(rapport cyclique).
Period = Période
Pulse Width = Largeur d’impulsion= DUTY CYCLE
Duty Cycle Ratio = Rapport cyclique = Pulse Width /Period
La broche RC2 doit être configurée comme une sortie en mettant le bit 2 de TRISC à "0".
Le signal PWM est fabriqué à partir du Timer 2. Le signal interne Fosc/4 passe à travers le pré diviseur
programmable par 1, 4 ou 16 et fait compter TMR2.
Quand ce registre atteint la valeur écrite dans le registre PR2, trois événements se produisent :
- RAZ du registre TMR2.
- La broche de sortie RC2 est mise à "1", sauf si le Duty cycle vaut 0.
- Chargement de la valeur du registre CCPR1L dans le registre de Duty.
Quand le registre TMR2 atteint la valeur inscrite dans le registre interne de Duty, c'est à dire la valeur qui avait
été inscrite dans CCPR1L, la broche de sortie RC2 est remise à "0".
La période est déterminée par la relation suivante :
La durée du Duty cycle est la valeur écrite dans le registre 8 bits : CCPR1L. La durée du signal au niveau "1"
est donnée par la relation :
On peut avoir une meilleure résolution sur le Duty cycle en utilisant les 2 bits de LSB réservés à cet effet dans
le registre CCP1CON. Il s'agit des bits 4 et 5 : CCP1X et CCP1Y. La résolution est dans ce cas divisée par 4.
Si on appelle X le registre sur 10 bits, constitué de ces 2 bits en LSB et des 8 bits de CCPR1L comme MSB, la
durée à "1" est donnée par la relation :
Dans les 2 cas, quand on incrémente le registre CCPR1L de une unité, le Duty cycle augmente d'une durée
égale à : [Link] du pré diviseur.
Quand on passe à "1" le bit 5 la durée augmente de [Link]é div.
Quand on passe à "1" le bit 4 de CCP1CON, la durée augmente de [Link]é div
Si la durée du Duty cycle est supérieure à la période, le signal n'est pas remis à "0".
Le signal de sortie PWM passe à 1 lors du débordement du registre TMR2 et repasse à 0 lorsque le contenu du
registre TMR2 coïncide avec CCPR1H. Le contenu de registre CCPR1L est chargé dans CCPR1H au début de
chaque période. Cela implique qu’un changement du rapport cyclique ne prend effet qu’au début de la
prochaine période. Il faut bien noter que la valeur écrite dans CCPRxL ne doit pas dépasser le contenu du
registre PR2.
Marche à suivre pour faire du PWM :
- Ecrire dans PR2 la valeur permettant d'obtenir la Période désirée.
- Ecrire dans CCPR1L la valeur donnant la durée du Duty cycle.
- Configurer la broche d'utilisation en sortie ( bit = 0 dans TRISC).
- Initialiser le Timer 2 par T2CON ( prédiv, TMR2 on).
- Initialiser le CCP par CCP1CON (mode PWM, 2 bits LSB Duty cycle).
Remarque:
Le module CCP2 est identique au module CCP1, il suffit d’interchanger 1 et 2 et de constater les points
suivants :
CCP2 est associe a la broche RC1
Il est géré par le registre de control CCP2CON
Son registre de capture/comparaison est CCPR2 = CCPR2H:CCPR2L
En mode comparaison 1011, à l’égalité :
* le drapeau CCP2IF passe à 1
* RAZ de TMR1
* Envoi d’un GO vers le convertisseur analogique numerique
Le module de conversion A/N
Ce module est constitue d'un convertisseur Analogique Numérique 10 bits dont l'entrée analogique peut être
connectée sur l'une des 8 (5 pour 16F876) entrées analogiques externes. On dit qu'on a un CAN à 8 canaux. Les
entrées analogiques doivent être configurées en entrée à l'aide des registres TRISA et/ou TRISE.
Le control du module se fait par les deux registres ADCON0 et ADCON1
Déroulement d’une Conversion
Le PIC dispose d’un échantillonneur bloqueur intégré constitué d'un interrupteur S, d'une capacité de maintien
C=120 pF et d’un convertisseur Analogique numérique 10 bits. Pendant la conversion, la tension Ve à l'entrée
du convertisseur A/N doit être maintenue constante.
Au départ il faut commencer par faire l’acquisition du signal en fermant l’interrupteur S, ceci se fait à l’aide du
registre ADCON0, soit au moment de la validation du module par le bit ADON soit après un changement de
canal si ADON est déjà positionné.
Après la fin de l’acquisition, on peut démarrer une conversion en positionnant le bit GO_DONE, l'interrupteur
S s’ouvre pour assurer le blocage de la tension. La conversion commence, elle est réalisée en 12 TAD, à la fin,
le bit GO_DONE repasse à 0, le drapeau ADIF passe à 1 et le résultat est charge dans les registres ADRESL et
ADRESH. Le module met 2 TAD supplémentaires pour fermer l'interrupteur S ce qui démarre une nouvelle
phase d’acquisition pendant laquelle la tension Ve rejoint la tension analogique d'entrée Va. Le temps
d'acquisition dépend de la constante de temps RC, R étant la somme des résistances entre le module de
conversion et la source de la tension analogique. Après la fin de l’acquisition, on peut démarrer une nouvelle
conversion et ainsi de suite.
Temps de conversion
Le temps de conversion est égal à 12 TAD
TAD est le temps de conversion d'un bit, il dépend de la fréquence du quartz et du prediviseur (div)
choisi : TAD = div x 1/fosc. Le choix de div doit être ajusté pour que TAD soit ≥ à 1,6 μs
Temps de conversion d'un bit TAD (les cases grisees sont hors plage d’utilisation)
Avec un quartz de 4 MHz, il faut choisir div=8 ce qui donne TAD = 2 μs soit un temps de conversion :
TCONV= 24 μs
Temps d'acquisition
Temps d'acquisition = TACQ = Tc + CT +2 μs
Tc : temps de charge du condenseur = (Ric+Rss+Rs) C Ln(2047)
Ric = Résistance d’interconnexions, elle est inferieure a 1k
Rss = Résistance du l’interrupteur S (Sampling switch), elle dépend de la tension d’alimentation Vdd. Elle
est égale à 7kΩ pour Vdd=5V
Rs : Résistance interne de la source du signal analogique. Microchip recommande de ne pas dépasser 10 kΩ
C : Capacité de blocage = 120 pF
CT : Coefficient de température = (Tp -25°C) 0.05 μs/°C
Tp = Température Processeur, voisine de 45°C en temps normal
Exemple :
Ric = 1k, Rss = 7k, Rs = 2k, Tp = 45 °C :
Tc = 10k x 120pF x Ln(2047) = 9 μs
CT = 20 x 0.05 μs = 1 μs
TACQ = 2 + 9 + 1 μs = 12 μs
Fréquence d'échantillonnage
Si on veut échantillonner un signal variable, La période d'échantillonnage Te doit être supérieur ou égale à
Temin = TCONV + 2 Tad + TACQ
Avec les exemple précités, on aura la période d’échantillonnage min Temin = (12+2)x2 + 12 = 40 μs.
La fréquence d’échantillonnage max est donc femax = 1/Temin = 25 kHz
Si on tient compte de la règle de Shannon (fe > 2 fmax), on constate que l’on peut échantillonner des signaux
dont la fréquence ne dépasse pas 12 KHz.
Valeur numérique obtenue
Quelle est la relation entre la tension analogique convertie et le nombre N recueilli dans le registre ADRES ? Si
on note :
Q = pas de quantification = (Vref+ - Vref-)/1024
Va = tension analogique a convertir
N = valeur numérique obtenue,
Avec Vref- = masse, on obtient N = int (Va / Q)
Exemple :
Vref+ = Vdd = 5V, Vref- = 0, Vin = 4 V
Q = 5V/1024 = 0,0048828125 V
N = 4V / 0,0048828125 = 819
Programmation
1) Si les entrée de PORTE sont utilisées, le configurer en mode normal à l'aide du bit PSPMODE
2) Configurer les E/S en Analogique/Numérique/Référence (ADCON1)
3) Configurer les entrées analogiques en entrées (TRISA, TRISE)
4) Définir l'horloge de conversion à l'aide du diviseur DIV dans ADCON0
5) Choisir le canal à convertir et valider le module (ADCON0)
6) Attendre le temps d’acquisition (12 μs )
7) Lancer la conversion, GO = 1 (ADCON0)
8) Attendre fin de conversion, GO = 0 ou drapeau ADIF=1
9) Traiter le résultat
10) Si l'on désire prendre d'autres mesures, recommencer au point 7 en faisant attention aux timings