Timer ou Temporisateur : Compter un nombre d’impulsions (internes) basées sur la fréquence d’oscillation (fosc)
par incrémentation automatique d’un compteur.
- 3 TIMERs disponibles sur PIC16F877: – TIMER0: 8 bits – TIMER1: 16 bits – TIMER2 : 8 bits (uniquement sur
fosc)
- Paramétrage des TIMERs
- TIMER0 : OPTION_REG, INTCON<2,5>, TMR0
- TIMER1 : T1CON, PIR<TMR1IF>, PIE<TMR1IE>, TMR1H:TMR1L
- TIMER2 : T2CON, PIR<TMR2IF>, PIE<TMR2IE>, TMR2, PR2 (équivalent à 16bits)
Le Timer TMR0
C’est un compteur 8 bits ayant les caractéristiques suivantes :
- Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer) soit par une horloge externe
appliquée à la broche RA4 du port A (mode compteur).
Le choix de l'horloge se fait à l'aide du bit T0CS du registre OPTION_REG
- T0CS = 0 horloge interne
- T0CS = 1 horloge externe appliquée à RA4
- Dans le cas de l'horloge externe, Le bit T0SE du registre OPTION_REG permet de choisir le front sur lequel le
TIMER s'incrémente.
- T0SE = 0 incrémentation sur fronts montants
- T0SE = 1 incrémentation sur fronts descendants
- Quelque soit l'horloge choisie, on peut la passer dans un diviseur de fréquence programmable (prescaler) dont le
rapport DIV est fixés par les bits PS0, PS1 et PS2 du registre OPTION_REG.
L'affectation ou non du prédiviseur se fait à l'aide du bit PSA du registre OPTION_REG
- PSA = 0 on utilise le prédiviseur
- PSA = 1 pas de prédiviseur (affecté au chien de garde : watchdog)
- Le contenu du timer TMR0 est accessible par le registre TMR0. Il peut être lu ou écrit à n'importe quel moment.
Après une écriture, le timer ne compte pas pendant deux cycles machine.
- Au débordement de TMR0 (FF → 00), le drapeau INTCON.T0IF est placé à 1. Ceci peut déclencher l'interruption
T0I si celle-ci est validée.
Source
extérieure
1
- chaque fois que le compteur complète un tour, le drapeau T0IF se lève ou se positionne (T0IF=1). Si TH la période de
l'horloge source, T0 l'horloge de TMR0 et TF0 le temps qui sépare 2 levés de drapeau successifs :
- Sans prédiviseur : TF0 = 256 T0 = 256 TH
- Avec prédiviseur : TF0 = 256 T0 = 256 x (DIV x TH )
- Avec prédiviseur et compteur N dans le programme on obtient : N*TF0 = N x 256 x (DIV x TH )
Compteur: Il permet de compter des impulsions arrivant sur des broches.
- 2 compteurs d’impulsion : - TIMER0 (8bits) - TIMER1 (16bits)
- Registres utilisés :
- OPTION_REG : configuration TIMER0
- TMR0 : valeur du comptage du TIMER0
- T1CON: configuration TIMER1
- TMR1H:TMR1L : valeur du comptage du TIMER1
Fonctionnement du TIMER1 :
- Les impulsions sont comptées si : T1CON<TMR1ON> = 1
- Le TIMER1 est bloqué si : T1CON<TMR1ON> = 0
- Au retour à 0 : mise à 1 du bit PIR1<TMR1IF>
- La valeur du comptage est stockée dans TMR1H:TMR1L (accessible en lecture
et écriture)
Paramétrage du TIMER1 :
RC0 : Source
extérieure
Exemple : Réaliser une temporisation d’une milliseconde (1 ms) avec le TIMER1 (basée sur Fosc=20MHz)
- Utilisation de Fosc : 0 → TMR1CS : Fosc / 4 = 5MHz
- Choix d’un prescale : 2 → T1CKPS1:T1CKPS0 = 01 : (Fosc/4) / 2 = 2500kHz : Donc 2500 incréments = 1 ms
- Valeur de départ de TMR1 : 65536 - 2500 = 63036 : 63036 → 0xF63C
0xF6 → TMR1H et 0x3C → TMR1L
La modulation PWM :
La PWM «Pulse Width Modulation», ou modulation de largeur d’impulsion est un signal binaire de fréquence fixe
dont le rapport cyclique peut être modulé (varié).
Le rapport cyclique est le rapport entre le temps où il se trouve à l’état «1» par rapport au temps total d’une période.
Donc, si on pose :
- Tc = Durée d’un cycle (période)
- Rc le rapport cyclique
- Th = durée de l’état haut
- Tb = durée de l’état bas
on peut dire :
- Rc = Th / Tc (rapport cyclique en % = temps à l’état haut divisé par la période)
2
Exemple d’un signal PWM avec un rapport cyclique de 50% ,10% et 90% :
50%
10%
90%
Pour créer ce signal : on a besoin du temps Tc, (la fréquence fixe du signal), et le rapport cyclique.
le temps Tc :
Par le Timer2. On programme éventuellement le prédiviseur, on charge la valeur adéquate dans PR2, et le temps mis
par TMR2 pour déborder nous donne le temps Tc.
Donc, avec le même timer TMR2, avec Tcyc = durée d’un cycle d’instruction, et avec la formule (voir timer 2) :
- Temps du cycle utilisé pour le module PWM : Tc = (Tcyc * prédiviseur) (PR2 + 1)
- Temps du Timer2 utilisé dans le programme = Tc = (Tcyc * prédiviseur * postdiviseur) (PR2 + 1)
Le module PWM travaille avec le Timer 2, et au niveau de Tcyc de la façon suivante :
- entrer la valeur de débordement dans PR2
- A chaque fois que TMR2 déborde de PR2 à 0x00, la pin CCPx passe au niveau 1.
Donc, si on reprend un signal PWM quelconque, on a déjà :
On utilise un deuxième registre « PR2 », qui indique, au moment où TMR2 atteindrait cette valeur, que le signal doit
retomber à « 0 ».
Le Timer2 compte : le signal CCP vaut actuellement « 0 » :
- TMR2 arrive à la valeur de PR2
- Au cycle suivant, TMR2 repasse à « 0 », CCPx passe à « 1 »
- TMR2 arrive à la seconde valeur de consigne, CCPx passe à « 0 »
- TMR2 arrive à la valeur de PR2
- Au cycle suivant, TMR2 = 0, CCPx vaut « 1 »
- TMR2 arrive à la seconde valeur de consigne, CCPx passe à « 0 »
- Et ainsi de suite…
3
Ceci donne la représentation suivante :
Sous forme d’un graphique, la chronologie des événements en fonction du contenu du registre TMR2 du timer2 :
Exemple : Avec un PIC cadencé à 20MHz, et une fréquence de signal PWM de 78,125Khz :
Le temps Tc vaut : Tc = 1/78,125 Khz = 12,8 μs
Tc = (PR2 + 1) * Prédiviseur * 4 * Tosc
Tosc = 1/20MHz = 50 ns
PR2 = (Tc / (prédiviseur*4*Tosc) –1 = (12,8μs / 200ns) – 1 = 64 – 1 = 63 (avec prédiviseur=1)
Donc, on place 63 dans le registre PR2
Il sera alors possible d’ajuster notre rapport cyclique sur des valeurs comprises entre B’00000000,00’ et
B‘00111111,11 , soit 256 valeurs différentes, donc une précision sur 8 bits, ou encore une marge d’erreur de 0,4%.
La précision = 1 / ((PR2+1) * 4), et est donc multipliée par 4 par rapport à une comparaison sans utiliser de fractions
(sur 8 bits).
Les signaux PWM sont en général utilisés pour moduler le rapport cyclique d’un signal, et donc pour faire varier
continuellement celui-ci en fonction des résultats à obtenir.
Résumé :
- Tout d’abord le calcul de PR2, qui fixe le temps total de cycle Tc : PR2 = (Tc / (prédiviseur * 4 * Tosc) – 1
- la formule qui lie les 10 bits du second comparateur, sachant que ces 10 bits (COMPAR) expriment un multiple
de quarts de cycles d’instructions, donc un multiple de temps d’oscillateur Tosc, avec le temps du signal à l’état haut
(Th).
Th = COMPAR * prédiviseur * Tosc.
Donc,
COMPAR = Th / (prédiviseur * Tosc)
d’où :
Th = Tc * Rc
pour comparer TMR2 avec COMPAR codé sur 10 bits , il faut que TMR2 soit également codé sur 10 bits. Il faut
donc compléter TMR2 avec 2 bits qui représentent les quarts de cycle d’instruction.
Si on choisit un prédiviseur de 1, TMR2 sera complété, en interne, par le numéro (de 0 à 3) du temps Tosc en cours.
Si, on utilise un prédiviseur de 4, ce nombre sera complété par le nombre d’événements déjà comptabilisés par le
prédiviseur (de 0 à 3).
4
Si, par contre, on utilise un prédiviseur de 16, ce nombre sera complété par le nombre de multiples de 4 événements
déjà comptabilisés par le prédiviseur.
De cette façon, TMR2 sera bien complété avec 2 bits qui représentent des quarts de valeur.
Les registres utilisés :
- On a besoin d’une valeur de débordement pour notre timer 2, cette valeur se trouve dans le registre PR2.
- La valeur de la seconde comparaison (celle qui fait passer la sortie de 1 à 0) est une valeur de 8 bits (dans le
registre CCPRxL) complétée de 2 bits fractionnaires (les bits DCxB1 et DCxB0 du registre CCPxCON).
Pour lancer le mode « PWM », nous devons donc procéder aux initialisations suivantes :
1) On initialise PR2 en fonction de la durée totale du cycle (Tc): PR2 = (TC / (prédiviseur * 4 * Tosc) – 1
2) On calcule la valeur de comparaison DCB en valeur fractionnaire suivant la formule : DCB=Th/(prédivis*Tosc)
On place les bits 9 à 2 dans CCPRxL (valeur entière), les bits 1 et 0 (fraction) étant positionnés dans DCxB1 et
DCxB0 du registre CCPxCON
3) On place la pin CCPx en sortie en configurant TRISC
4) On lance le timer 2 en programmant son prédiviseur
5) On configure CCPxCON pour travailler en mode « PWM ».
5
Communication série : Asynchrone et synchrone
Les unités USRT et UART
L'unité USRT (Universal Synchronous Receiver/Transmitter) est une interface de communication de données
sérielle utilisant 2 broches d'E/S, l'une en transmission (TX) et l'autre en réception (RX), plus une ligne d’horloge
(clock line).
L’unité UART Universal Asynchronous Receiver/Transmitter utilise seulement RX/TX comme broches d’E/S. On
peut trouver aussi le terme SCI pour « Serial Communications Interface »
Communication synchrone
Communication asynchrone
Dans le protocole de communication asynchrone l’interface ne comprend pas la ligne d’horloge, il faut alors se
convenir d’une fréquence commune pour communiquer.
Le format du mot :
Chaque mot contient un bit Start, plusieurs bits de données (8 bits + bits de parité) et un bit Stop.
Le format le plus répandu est 8-N-1, c’est-à-dire : 1 bit Start + 8 bits de données + 1 bit Stop.
Les bits de donnée commencent par le bit b0, (le LSb).
Le transmetteur utilise son propre horloge interne pour cadencer l’envoi des bits
Le récepteur détecte le front descendant du START, utilise sa propre horloge et lit le bit de
donnée au son milieu
Donnée = 61H
Donnée = 61H
BIT 7 BIT 0
0 1 1 0 0 0 0 1
Protocole synchrone : envoyer MSb en premier
Exemple : Emission d’une donnée codée sur 8 bits, avec parité paire et un stop-bit.
Une porte majoritaire, est un circuit qui fournit sur sa sortie l’état majoritairement présent sur l’entrée.
Les modes compatibles
Le transfert d’une donnée sera composée de :
- 1 Start-bit - 7 ou 8 bits de donnée - 0 ou 1 bit de parité - 1 ou 2 stop-bits.
Ceci donne des longueurs totales comprises entre 9 et 12 bits.
7
Le registre RCSTA : en mode asynchrone
Le registre SPBRG
Ce registre permet de définir le débit qui sera utilisé pour les transferts.
La formule utilisée pour le calcul de SPBRG n’est pas identique à celle du mode synchrone.
Si BRGH = 0 (basse vitesse) : Débit = Fosc / (64 * (SPBRG + 1)) ↔ SPBRG = (Fosc / (Débit * 64)) – 1
Les limites d’utilisation sont (avec notre PIC à 20MHz) :
Débit min = 20*106 / (64 * (255+1)) = 1221 bauds
Débit max = 20*106 / (64 * (0+1)) = 312.500 bauds
Si BRGH = 1 (haute vitesse) : Débit = Fosc / (16 * (SPBRG + 1)) ↔ SPBRG = (Fosc / (Débit * 16)) – 1
Les limites d’utilisation sont (avec notre PIC à 20MHz) :
Débit min = 20*106 / (16 * (255+1)) = 4883 bauds
Débit max = 20*106 / (16 * (0+1)) = 1.250.000 bauds
8
Exemple de communication série asynchrone
9
TX9D contient la valeur du 9ème bit à envoyer par positionnement de TX9.
Le registre RCSTA : en mode synchrone (Bank0 : 18h)
RCSTA « ReCeive STAtus and control register », contient d’autres bits de contrôle et de status.
10
L’émission en mode maître
5
3
1 6
- Le transfert de la donnée dans le registre TXREG démarre la transmission (+TX9D) par le registre TSR (Transmitt
Shift Register).
- Le LSb (b0) sera envoyé en premier, au contraire du module MSSP (décalage vers la gauche : le MSb (b7) en
premier).
- Dès que l’octet est transféré dans TSR (avant qu’il ne soit complètement transmis), le registre TXREG est vide,
signalé par le flag d’interruption TXIF. Possibilité d’écrire une nouvelle valeur dans TXREG.
- Le chargement d’une valeur dans TXREG s’accompagne de l’effacement automatique de TXIF.
- Lorsque TSR termine l’envoi de son dernier bit, le bit TRMT passera à "1", (TXREG n’a aucun octet) indiquant la
fin effective de l’émission.
11