Leçons de niveau 15

Utiliser les PIC 16F et 18F/Le mode comparaison du module CCP (Capture Compare PWM)

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Le mode comparaison du module CCP (Capture Compare PWM)
Icône de la faculté
Chapitre no 10
Leçon : Utiliser les PIC 16F et 18F
Chap. préc. :Interruption timer0 en langage C
Chap. suiv. :Le mode capture du module CCP (Capture Compare PWM)

Exercices :

Le mode comparaison du module CCP (Capture Compare PWM)
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Utiliser les PIC 16F et 18F : Le mode comparaison du module CCP (Capture Compare PWM)
Utiliser les PIC 16F et 18F/Le mode comparaison du module CCP (Capture Compare PWM)
 », n'a pu être restituée correctement ci-dessus.

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.

Le timer1 et ses registres

Les registres utilisés par le Timer1 sont donc :

  • TMR1H et TMR1L,
  • T1CON
  • éventuellement le PORTC, et PIR1.


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 module comparaison du PIC16F8XX

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;


Image logo représentative de la faculté Voir les exercices sur : Le mode comparaison du module CCP.