Utiliser les PIC 16F et 18F/Le mode capture du module CCP (Capture Compare PWM)
Une capture est un moyen matériel permettant la mesure de temps. On la retrouve dans la majorité des microcontrôleurs actuels.
Le mode capture du 16F877
[modifier | modifier le wikicode]Une capture est une lecture de manière matérielle de la valeur d'un timer, lecture synchronisée sur un événement extérieur. La lecture étant déclenchée de manière matérielle, on n'a pas besoin d'attendre de fronts d'horloge pour la réaliser.
On appellera dans la suite de ce cours capture toute recopie de la valeur d'un timer déclenchée par un événement externe.
L'intérêt de cette capture est d’éviter d’utiliser une interruption pour la réaliser : on aurait alors affaire à une capture logicielle.
Description matérielle
[modifier | modifier le wikicode]Dans le mode capture, CPPR1H et CPPR1L capturent la valeur du timer 1 quand un événement se produit sur RC2/CPP1 du port C. Un événement est défini comme :
- un front descendant
- un front montant
- tous les 4 fronts montants
- tous les 16 fronts montants
Attention le PORTC doit être configuré en entrée pour le bit b2 (avec TRISC) comme indiqué sur la figure.
Le fonctionnement de l’ensemble peut se résumer comme suit :
- Le cadre en pointillés représente toujours une sorte de filtrage sélectionné par les 4 bits de poids faibles de CCP1CON. Les choix possibles sont présentés dans le schéma
- Toute capture positionnera, le drapeau CCP1IF du registre PIR1. C'est un drapeau mis à un par le matériel mais qui sera remis à 0 par logiciel.
- Le drapeau CCP1IF est capable de déclencher une interruption, mais ceci n’est pas documenté pour l'instant.
- Une capture déclenche une recopie de la valeur 16 bits du timer1 dans le registre CCPR1. Cette recopie est symbolisée par un triangle dans nos schémas.
Noms des bits pour Hitech C
[modifier | modifier le wikicode]Quelques extraits des fichiers d'inclusions nous montrent le nom des bits :
/* Definitions for PORTC register */
volatile bit RC0 @ ((unsigned)&PORTC*8)+0;
volatile bit RC1 @ ((unsigned)&PORTC*8)+1;
volatile bit RC2 @ ((unsigned)&PORTC*8)+2;
volatile bit RC3 @ ((unsigned)&PORTC*8)+3;
volatile bit RC4 @ ((unsigned)&PORTC*8)+4;
volatile bit RC5 @ ((unsigned)&PORTC*8)+5;
volatile bit RC6 @ ((unsigned)&PORTC*8)+6;
volatile bit RC7 @ ((unsigned)&PORTC*8)+7;
/* Definitions for TRISC register */
volatile bit TRISC0 @ ((unsigned)&TRISC*8)+0;
volatile bit TRISC1 @ ((unsigned)&TRISC*8)+1;
volatile bit TRISC2 @ ((unsigned)&TRISC*8)+2;
volatile bit TRISC3 @ ((unsigned)&TRISC*8)+3;
volatile bit TRISC4 @ ((unsigned)&TRISC*8)+4;
volatile bit TRISC5 @ ((unsigned)&TRISC*8)+5;
volatile bit TRISC6 @ ((unsigned)&TRISC*8)+6;
volatile bit TRISC7 @ ((unsigned)&TRISC*8)+7;
/* Definitions for PIR1 register */
volatile bit TMR1IF @ ((unsigned)&PIR1*8)+0;
volatile bit TMR2IF @ ((unsigned)&PIR1*8)+1;
volatile bit CCP1IF @ ((unsigned)&PIR1*8)+2;
volatile bit SSPIF @ ((unsigned)&PIR1*8)+3;
volatile bit TXIF @ ((unsigned)&PIR1*8)+4;
volatile bit RCIF @ ((unsigned)&PIR1*8)+5;
volatile bit ADIF @ ((unsigned)&PIR1*8)+6;
/* Definitions for CCP1CON register */
bit CCP1M0 @ ((unsigned)&CCP1CON*8)+0;
bit CCP1M1 @ ((unsigned)&CCP1CON*8)+1;
bit CCP1M2 @ ((unsigned)&CCP1CON*8)+2;
bit CCP1M3 @ ((unsigned)&CCP1CON*8)+3;
bit DC1B0 @ ((unsigned)&CCP1CON*8)+4;
bit DC1B1 @ ((unsigned)&CCP1CON*8)+5;
bit P1M0 @ ((unsigned)&CCP1CON*8)+6;
bit P1M1 @ ((unsigned)&CCP1CON*8)+7;
Le mode capture du 18FXXXX
[modifier | modifier le wikicode]La différence essentielle est la possibilité d’utiliser le timer 3 (géré par T3CON) pour la capture. Le PIC 18F dispose d'un autre module de comparaison CCP2.
Une figure sera plus parlante :
C'est bien le bit T3CCP2 de T3CON qui sélectionne le timer 3 dans le module CCP1 d’après la documentation officielle.