Vous êtes sur la page 1sur 11

Temporisateur /Compteur :

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 a déterminé l’emplacement de montée du signal de «0» à «1» : Tc est défini


TC = (PR2 + 1) * Tcyc * prédiviseur = Tc = (PR2 + 1) * 4 * Tosc * prédiviseur

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

START BIT0 BIT7 STOP


1 0 0 0 0 1 1 0

Protocole asynchrone : envoyer LSb en premier


Le transmetteur envoie les bits au front descendant de l’horloge
Le récepteur lit les bits de donnée au front montant de l’horloge

Donnée = 61H

BIT 7 BIT 0
0 1 1 0 0 0 0 1
Protocole synchrone : envoyer MSb en premier

Principe de transmission dans une unité UART :


Pour transmettre un octet (8bits), il suffit de l’écrire dans un registre dédié, puis l’unité UART transmet la donnée en
ajoutant le bit START et le bit STOP (éventuellement le bit parité).
6
Le module USART en mode asynchrone
La liaison utilise les 2 pins RC6/TX/CK et RC7/RX/DT : configurées en entrée via TRISC pour fonctionner en
mode USART
Le start-bit
Au repos, la ligne est au niveau "1", le start-bit est :
- Le premier bit émis
- Un bit de niveau opposé au niveau de repos (donc 0).
- Un bit d’une durée, égale à celle d’un bit de donnée.
Les bits de donnée
En général, les bits de donnée seront au nombre de 7 ou de 8 (cas les plus courants).
La durée d’un bit est directement liée au débit choisi pour la connexion. Le débit est en bauds (bits par seconde).
Exemple : pour une connexion à 9600 bauds, nous aurons : Tb = 1/9600 bauds = 104,16 µs.
La parité : permet d’imposer le nombre de bits à "1" émis (donnée + parité), soit comme étant pair (parité paire), soit
comme étant impair (parité impaire).
un cas de parité paire : donnée = B’00110100’ : 3 bits à "1", (parité paire) notre bit de parité devra valoir "1",
ce qui forcera le nombre total de bits "1" à valoir "4", ce qui est bien pair : B’001101001’ 4 bits à "1" = parité
paire
Le stop-bit : Pour revenir à l’état de repos il faut un bit dénommé « stop-bit ».
- Il sera le dernier bit émis de l’octet
- Son niveau est toujours celui du niveau de repos (donc 1).
- Sa durée sera par convention la même que celle d’un bit de donnée.

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.

Le registre TXSTA : en mode asynchrone

b7 : non : non utilisé en mode asynchrone


b6 : TX9 : TRANSMITT 9 bits enable bit (1 = 9 bits, 0 = 8 bits)
b5 : TXEN : TRANSMITT ENable bit
b4 : SYNC : SYNChronous mode select bit (1 = synchrone, 0 = asynchrone)
b3 : N.U. : Non Utilisé : lu comme « 0 »
b2 : BRGH : Baud Rate Generator High mode select bit
b1 : TRMT : TRansMiT shift register status bit (1 = TSR vide)
b0 : TX9D : TRANSMIT 9th bit Data

TXEN permet de lancer l’émission.


BRGH permet de choisir entre 2 prédiviseurs internes pour la génération des bits en fonction de SPBRG. Un mode
grande vitesse (BRGH = 1) et un mode basse vitesse (BRGH = 0).
TRMT indique quand le registre TSR est vide, c’est-à-dire quand l’émission de la dernière valeur présente est
terminée.
TX9D contient la valeur du 9ème bit à envoyer par positionnement de TX9.

7
Le registre RCSTA : en mode asynchrone

b7 : SPEN : Serial Port ENable bit


b6 : RX9 : RECEIVE 9 bits enable bit (1 = 9 bits, 0 = 8 bits)
b5 : non : non utilisé en mode asynchrone
b4 : CREN : Continuous Receive ENable bit
b3 : ADDEN : ADDress detect ENable bit
b2 : FERR : Frame ERRor
b1 : OERR : Overflow ERRor bit
b0 : RX9D : RECEIVE 9th Data bit

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

L’initialisation : 3 registres : TXSTA – RCSTA - SPBRG


Initialisation du PIC :
Init
bsf STATUS,RP0 ; passer en banque 1
movlw B’01000100’ ; mode asynchrone, émission 9 bits haute vitesse
movwf TXSTA ; dans registre TXSTA
movlw BRGVAL ; valeur calculée de SPBRG
movwf SPBRG ; dans baud rate generator
bcf STATUS,RP0 ; repasser banque 0
movlw B’11000000' ; module en service, réception 9 bits
movwf RCSTA ; dans registre RCSTA

Utilisation du 9 ème bit comme bit de parité


La parité n’est pas gérée automatiquement, il faut créer une petite routine pour la générer.
Parite
movf octet,w ; charger octet à envoyer
movwf temp ; sauver dans variable temporaire en RAM commune
bsf STATUS,RP0 ; passer en banque 1
bsf TXSTA,TX9D ; bsf pour parité impaire, bcf pour parité paire
loop
andlw 0x01 ; garder bit 0 de l’octet
xorwf TXSTA ; si « 1 », inverser TX9D
bcf STATUS,C ; effacer carry pour décalage
rrf temp,f ; amener bit suivant en b0
movf temp,w ; charger ce qui reste de temp
btfss STATUS,Z ; il reste des bits à « 1 » ?
goto loop ; oui, poursuivre
bcf STATUS,RP0 ; non, repasser banque 0
.. .. ; reste à charger TXREG et lancer l’émission.

8
Exemple de communication série asynchrone

RC7/RX <-> pin3/TX RC6/TX <-> pin2/RX Grnd <-> pin5/GND


Le module USART en mode série synchrone
Le module USART du PIC gère uniquement 2 pins, à savoir RC6/TX/CK et RC7/RX/DT, il n’y qu’une seule ligne
pour transmettre les données. Donc le PIC ne pourra émettre et recevoir en même temps en utilisant l’USART en
mode synchrone (liaison half-duplex).
L’USART pourra fonctionner dans les modes suivants :
- Mode synchrone maître : émission horloge sur CK et émission/réception données sur DT
- Mode synchrone esclave : réception horloge sur CK et émission/réception données sur DT
Mise en œuvre et protocoles
Il ne peut y avoir qu’un maître en même temps, de même qu’il ne peut y avoir
qu’un seul émetteur en même temps.

Le registre TXSTA : en mode synchrone (Bank1 : 98h=18h+80h)


Le registre «TRANSMITT STAtus and control register », contient des bits de status et de contrôle.

b7 : CSRC Clock SouRCe select bit (1 = master, 0 = slave) X


b6 : TX9 TRANSMITT 9 bits enable bit (1 = 9 bits, 0 = 8 bits)
b5 : TXEN TRANSMITT Enable bit
b4 : SYNC SYNChronous mode select bit (1 = synchrone, 0 = asynchrone)
b3 : N.U. Non Utilisé : lu comme « 0 »
b2 : non non utilisé en mode synchrone
b1 : TRMT TransMiT shift register status bit (1 = TSR vide)
b0 : TX9D TRANSMIT 9th bit Data
CSRC détermine si le PIC va travailler en tant que maître ou en tant qu’esclave. Dans le premier cas, il décide du
moment des transferts de données et pilote l’horloge. Dans le second cas, il subira les événements.
TX9 indique que les données seront codées sur 8 ou sur 9 bits (par exemple : envoyer et recevoir un bit de parité, ou à
autre usage).
TXEN permet de lancer l’émission.
SYNC indique le mode synchrone (1) ou asynchrone (0).
TRMT indique quand le registre TSR est vide : l’émission de la dernière valeur présente est terminée.

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.

b7 : SPEN Serial Port ENable bit X


b6 : RX9 RECEIVE 9 bits enable bit (1 = 9 bits, 0 = 8 bits)
b5 : SREN Single Receive ENAble bit
b4 : CREN Continuous Receive ENable bit
b3 : non non utilisé en mode synchrone
b2 : non non utilisé en mode synchrone
b1 : OERR Overflow ERRor bit
b0 : RX9D RECEIVE 9th Data bit
SPEN met le module USART en service.
RX9 réception sur 8 ou sur 9 bits.
SREN lance la réception d’un seul octet. La communication se terminera d’elle-même à la fin de la réception de
l’octet.
CREN lance la réception continue. Les octets seront reçus sans interruption jusqu’à ce que ce bit soit effacé.
OERR indique une erreur de type overflow.
RX9D contient le 9ème bit de la donnée reçue.
Le registre SPBRG (Bank1 : 99h=19h+80h)
Ce registre « Serial Port Baud Rate Generator » définit la fréquence de l’horloge utilisée pour la transmission, et donc
de fixer le débit.
SPBRG ne sert que pour le maître, l’esclave reçoit l’horloge, donc aucune raison de calculer sa valeur.
D = Fosc / (4 * (SPBRG + 1))
SPBRG = (Fosc / (4 * D)) – 1
Exemple : on veut réaliser une transmission à 19200 bauds avec un PIC cadencé à 20MHz. Quelle valeur à placer dans
SPBRG ?
SPBRG = (20 x 106 / (4 * 19200)-1 = 259,4.
la valeur maximale à placer dans SPBRG est de 255 (décimal) -> SPBRG = 255, ce qui donne un débit réel de :
D = 20 x 106 / (4 * (255+1)) = 19531 bauds.
L’erreur sera de : Erreur = (19531 – 19200) / 19200 = 1,72% (acceptable)
Le débit maximum avec un PIC cadencée à 20MHz -> SPBRG =0 ; Dmax = 20x106 /(4*(0+1)) = 5MBauds ; -> les
liaisons synchrones sont prévues pour travailler avec de très grandes vitesses.
Initialisation
Pour initialiser le module en mode synchrone :
- choix du mode maître ou esclave (CSRC),
- choix de l’émission sur 8 ou sur 9 bits (TX9),
- Positionner le bit SYNC pour le travail en mode synchrone (SYNC),
- choix pour communiquer en 8 ou en 9 bits (RX9),
- en mode maître, initialiser la valeur de SPBRG,
- Mettre le module en service (SPEN).
Par défaut, à la mise sous tension, les pins CK et DT sont configurées en entrée, il n’est pas nécessaire d’initialiser
leur bit respectif dans TRISC.
Exemple :
Init Exemple d’intialisation en mode esclave :
bsf STATUS,RP0 ; passer en banque 1 bsf STATUS,RP0 ; passer en banque 1
movlw B’10010000’ ; mode maître synchrone, movlw B’00010000’ ; mode esclave synchrone, émission
émission 8 bits 8 bits
movwf TXSTA ; dans registre TXSTA movwf TXSTA ; dans registre TXSTA
movlw BRGVAL ; valeur calculée de SPBRG bcf STATUS,RP0 ; repasser banque 0
movwf SPBRG ; dans baud rate movlw B’10000000' ; module en service, réception 8
generator bits
bcf STATUS,RP0 ; repasser banque 0 movwf RCSTA ; dans registre RCSTA
movlw B’10000000' ; module en service, réception 8
bits
movwf RCSTA ; dans registre RCSTA

10
L’émission en mode maître

5
3

4 transfert dans TSR

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