Utiliser les PIC 16F et 18F/Le mode comparaison du module CCP (Capture Compare PWM)
CCP (Compare, Caption, PWM) est un module interne au PIC qui peut fonctionner suivant trois modes :
- Comparaison (compare), ce mode permet en autre de générer des évènements périodiques,
- Capture (Caption), ce mode permet en autre d’effectuer des mesures de temps,
- Modulation de largeur d'impulsion (MLI ou PWM en anglais).
L'objectif de ce chapitre est de générer des signaux de fréquences déterminées. Ce travail est réalisé en général avec ce module CCP et plus exactement son mode comparaison. Nous allons commencer par décrire le fonctionnement du timer 1 du 16F877.
Le Timer 1 et ses registres
[modifier | modifier le wikicode]Le timer 1 est un peu différent du timer0 par le fait qu’il est sur 16 bits. Pour les PIC de la série 18F, nous avons déjà vu, que le timer0 est aussi sur 16 bits.
Les registres utilisés par le Timer1 sont donc :
- TMR1H et TMR1L,
- T1CON
- éventuellement le PORTC, et PIR1.
La détection synchronisée doit être obligatoirement utilisée dans les modes compare (de ce TD) et le mode capture du TD suivant.
Fonctionnement
[modifier | modifier le wikicode]Nous allons expliquer tout ce qui peut être déduit du schéma de documentation présenté.
- Prenez l'habitude d'interpréter les cadres en pointillés : ici on a encore un diviseur dont la valeur de division est choisie par les bits T1CKPS1 et T1CKPS0 du registre T1CON.
- Le dépassement de capacité du timer1 est mémorisé par un drapeau TMR1IF de PIR1. Ce drapeau ne se remet pas à zéro tout seul, c’est à vous de le faire.
- Le fonctionnement du timer1 peut être interrompu par le bit TMR1ON de T1CON.
- Le bit TMR1CS de T1CON choisit la source horloge du timer1. Elle peut être soit un oscillateur externe fabriqué sur PORTC (si le bit en question vaut 1) soit le quartz (divisé par 4)
- On est encore confronté au problème de l'écriture dans un registre 16 bits par un processeur 8 bits. Ce problème a déjà été rencontré dans le timer0 du 18FXXXX.
- 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.
Le nom des bits pour Mikro C
[modifier | modifier le wikicode]Sera documenté plus tard.
Le nom des bits pour Hitech C
[modifier | modifier le wikicode]On les retrouve à partir du fichier d'en-tête correspondant !
/* T1CON bits */
volatile bit T1CKPS1 @ (unsigned)&T1CON*8+5;
volatile bit T1CKPS0 @ (unsigned)&T1CON*8+4;
volatile bit T1OSCEN @ (unsigned)&T1CON*8+3;
volatile bit T1SYNC @ (unsigned)&T1CON*8+2;
volatile bit TMR1CS @ (unsigned)&T1CON*8+1;
volatile bit TMR1ON @ (unsigned)&T1CON*8+0;
/* PIR1 bits */
#ifdef __PINS_40
volatile bit PSPIF @ (unsigned)&PIR1*8+7;
#endif
volatile bit ADIF @ (unsigned)&PIR1*8+6;
volatile bit RCIF @ (unsigned)&PIR1*8+5;
volatile bit TXIF @ (unsigned)&PIR1*8+4;
volatile bit SSPIF @ (unsigned)&PIR1*8+3;
volatile bit CCP1IF @ (unsigned)&PIR1*8+2;
volatile bit TMR2IF @ (unsigned)&PIR1*8+1;
volatile bit TMR1IF @ (unsigned)&PIR1*8+0;
Voila de quoi travailler !
Le mode comparaison
[modifier | modifier le wikicode]Le mode comparaison va nous permettre de générer des signaux de fréquence déterminée.
Le fonctionnement de ce module est le suivant :
- vous imaginez que la valeur de TMR1 varie sans arrêt au rythme d'une horloge qui a été documentée dans la section précédente.
- quand le timer1 a la même valeur que le registre CCPR1 on dit qu'on a une comparaison.
- Une comparaison positionne toujours le bit CCP1IF du registre PIR1.
- Pour le reste tout va dépendre de la valeur des bits CCP1M3... CCP1M0 du registre CCP1CON.
- 0010 : Compare bascule sortie quand comparaison (CCPxIF)
- 1000 : Compare force CCP à un (CCPIF est géré)
- 1001 : Compare force CCP à zéro (CCPIF est géré)
- 1010 : Compare sort rien sur CCP mais sur CCPIF
- 1011 : Compare force Special Event Trigger reset sur timer1 (CCP1IF est géré)
- Comme on peut le remarquer, la logique de sortie permet éventuellemnt de changer le bit RC2 de PORTC à condition bien entendu que l’on ait pris soin de configurer correctement TRISC.
Le nom des bits pour Mikro C
[modifier | modifier le wikicode]Nous documenterons cela plus tard.
Le nom des bits pour HitechC
[modifier | modifier le wikicode]On les retrouve à partir du fichier d'en-tête correspondant !
/* 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;
/* PIR1 bits */
#ifdef __PINS_40
volatile bit PSPIF @ (unsigned)&PIR1*8+7;
#endif
volatile bit ADIF @ (unsigned)&PIR1*8+6;
volatile bit RCIF @ (unsigned)&PIR1*8+5;
volatile bit TXIF @ (unsigned)&PIR1*8+4;
volatile bit SSPIF @ (unsigned)&PIR1*8+3;
volatile bit CCP1IF @ (unsigned)&PIR1*8+2;
volatile bit TMR2IF @ (unsigned)&PIR1*8+1;
volatile bit TMR1IF @ (unsigned)&PIR1*8+0;
/* 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;
Faites ces exercices : Le mode comparaison du module CCP. |