MÓDULOS DE
COMPARACIÓN
CAPTURA Y PWM
Módulos CCP
Características generales
Dos módulos con idéntico funcionamiento.
Registro de captura de 16 bits.
Registro de comparación de 16 bits.
Registro de ciclo de trabajo PWM.
Módulo CCP1.
Consta de dos registros de 8 bits: CCPR1H y CCPR1L.
Registro de control: CCP1CON.
Acción especial: Generada mediante una comparación.
Resetea Timer1.
Módulo CCP2.
Consta de dos registros de 8 bits: CCPR2H y CCPR2L.
Registro de control: CCP2CON.
Acción especial: Generada mediante una comparación.
Resetea Timer1.
Lanza una conversión A/D.
Módulos CCP
Condiciones de funcionamiento
Temporizadores necesarios.
Modo captura ⇒ TMR1
Modo comparación ⇒ TMR1
PWM ⇒ TMR2
Interacción entre los dos módulos CCP.
CCPx CCPy Interacción
Captura Captura Misma base de tiempos definida en TMR1
La comparación debe configurarse con la acción especial, que
Captura Comparación
borra TMR1
La(s) comparación(es) deben configurarse con la acción
Comparación Comparación
especial, que borra TMR1
Las PWMs tendrán la misma frecuencia y tasa de actualización
PWM PWM
(interrupción TMR2)
PWM Captura Ninguna
PWM Comparación Ninguna
1
Módulos CCP
Registro CCP1CON / CCP2CON (17h / 1Dh)
- - CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0
bit 5-4 CCPxX:CCPxY: Bits menos significativos del PWM
En modo PWM:
Los dos bits menos significativos del ciclo de trabajo.
Los ocho bits más significativos están en CCPRxL.
bit 3-0 CCPxM3:CCPxM0: Bits de selección del modo CCP a utilizar
0000 = Comparación/Captura/PWM desactivada (reset del módulo CCP)
0100 = Modo de captura, cada flanco descendente
0101 = Modo de captura, cada flanco ascendente
0110 = Modo de captura, cada 4º flanco ascendente
0111 = Modo de captura, cada 16º flanco ascendente
1000 = Modo de comparación, CCPx=1 al igualarse (CCPxIF=1)
1001 = Modo de comparación, CCPx=0 al igualarse (CCPxIF=1)
1010 = Modo de comparación, genera interrupción al igualarse (CCPx invariable,
CCPxIF=1)
1011 = Modo de comparación, lanza acción especial (CCPxIF=1, CCPx invariable)
CCP1 resetea TMR1 / CCP2 resetea TMR1 y lanza una conversión A/D
11xx = Modo PWM
Módulos CCP
Modo captura
Captura en CCPRxH:CCPRxL los 16 bits de TMR1.
Cada flanco de bajada en CCPx
Cada flanco de subida en CCPx
Cada 4º flanco de subida en CCPx
Cada 16º flanco de subida en CCPx
Diagrama de bloques del modo de captura.
CCPxIF 1
RCy / CCPx Prescaler
1 , 4 , 16
CCPRxH CCPRxL
Detección de Habilita
flanco y Captura
TMR1H TMR1L
Qs CCPxCON<3:0>
2
Módulos CCP
Condiciones de funcionamiento en el modo captura
El pin CCPx debe configurarse como entrada.
TMR1 debe funcionar en modo temporizador o en modo contador
síncrono.
En modo contador asíncrono puede que la captura no funcione.
Podría generarse una falsa interrupción de captura al cambiar el
modo de captura.
Se aconseja deshabilitar CCPxIE al cambiar el modo de captura.
Tambi én podría generarse una falsa interrupción al cambiar el
prescaler. Además, un cambio no resetea la cuenta de flancos.
Se evitan estas situaciones reseteando el módulo CCP (CCPxCON ← 0)
antes de llevar a cabo un cambio de modo y/o un cambio de prescaler.
Módulos CCP
Modo comparación
Cuando CCPRx coincide con TMR1 (en sus 16 bits):
El pin RCy/CCPx se pone a 1
El pin RCy/CCPx se pone a 0
Se genera una interrupción
Lanza una acción especial
Diagrama de bloques del modo comparación.
TMR1 ← 0 (no alza flag TMR1F) CCPxIF 1
GO/DONE ← 1 Lanza acción
especial
CCPRxH CCPRxL
RCy / CCPx
Q S
Lógica de
Comparador
salida Coincidencia
R
TRISC<2> TMR1H TMR1L
CCPxCON<3:0>
3
Módulos CCP
Condiciones de funcionamiento en el modo comparación
El pin CCPx debe configurarse como salida.
TMR1 debe funcionar en modo temporizador o en modo contador
síncrono.
En modo contador asíncrono puede que la comparación no funcione.
Cuando se selecciona generar interrupción, el pin CCPx no se ve
afectado.
Se puede generar una acción especial por hardware.
CCP1: Resetea TMR1.
CCP2: Resetea TMR1 y lanza una conversión A/D (si está activado).
Módulos CCP
Modo PWM T
Genera una salida PWM de 10 bits
de resolución D
TMR2 = PR2
TMR2 = D
Diagrama de bloques del modo PWM. TMR2 = 0
Registros de
CCPRxL CCPRxH (esclavo)
Comparador R Q RCy / CCPx
CCPxCON<5:4>
TMR2 (* )
S
TRISC<2>
(*) TMR2 se concatena con Comparador
un reloj interno de 2 bits
TMR2 0
con frecuencia fosc para
CCPx 1 (si D0)
poder crear una base de PR2
CCPRxH CCPRxL
tiempos de 10 bits
4
Módulos CCP
Condiciones de funcionamiento en el modo PWM
El periodo T se indica en el registro PR2.
T = (PR2 + 1) · 4 · TOSC · PRESCALERTMR2
El ciclo de trabajo D se indica en CCPRxL y en CCPxCON<5:4>.
D = (CCPRxL:CCPxCON<5:4>) · TOSC · PRESCALER TMR2
CCPRxH es de sólo lectura en PWM.
Cuando TMR2 (+ 2 bits) se iguala a CCPxH (+ 2 bits), CCPx ← 0.
Existe una resolución (número de bits) máxima que se puede
obtener con el funcionamiento en modo PWM.
⎛ f osc ⎞
log⎜⎜ ⎟⎟
⎝ f ⋅ PS TMR 2 ⎠
Res = PWM
bits
log 2
Módulos CCP
f PWM 1,22kHz 4,88kHz 19,53kHz 78,12kHz 156,3kHz 208,3kHz
PRESCALER TMR2 16 4 1 1 1 1
(fosc = 20MHz)
PR2 0xFFh 0xFFh 0xFFh 0x3Fh 0x1Fh 0x17h
Resolución
10 bits 10 bits 10 bits 8 bits 7 bits 5,5 bits
máxima
Pasos a seguir para definir una PWM
1. Establecer el periodo T escribiendo en el registro PR2.
2. Establecer el ciclo de trabajo D en CCPRxL y en CCPxCON<5:4>.
3. Configurar el pin CCPx como salida.
4. Fijar el prescaler de TMR2 y activar el temporizador. (T2CON)
5. Configurar el módulo CCP para funcionar en modo PWM.
5
Módulos CCP
Módulos CCP en el compilador C de CCS
Configuración del módulo CCP
setup_ccp1 (modo); setup_ccp2 (modo);
modo: CCP_OFF (CCPxCON ← 00h)
CCP_CAPTURE_FE (CCPxCON ← 04h)
CCP_CAPTURE_RE (CCPxCON ← 05h)
CCP_CAPTURE_DIV_4 (CCPxCON ← 06h)
CCP_CAPTURE_DIV_16 (CCPxCON ← 07h)
CCP_COMPARE_SET_ON_MATCH (CCPxCON ← 08h)
CCP_COMPARE_CLR_ON_MATCH (CCPxCON ← 09h)
CCP_COMPARE_INT (CCPxCON ← 0Ah)
CCP_COMPARE_RESET_TIMER (CCPxCON ← 0Bh)
CCP_PWM (CCPxCON ← 0Ch)
CCP_PWM_PLUS_1 (CCPxCON ← 1Ch)
CCP_PWM_PLUS_2 (CCPxCON ← 2Ch)
CCP_PWM_PLUS_3 (CCPxCON ← 3Ch)
Módulos CCP
Definición del ciclo de trabajo en modo PWM
set_pwm1_ duty (valor); set_pwm2_ duty (valor);
valor:Dato (8 ó 16 bits) que fija el de la PWM.
valor CCPRxL:CCPxCON<5:4>
XXXXXXXX XXXXXXXX 0 0
Y Y Y Y Y YXXXXXXXXXX XXXXXXXXXX
Variables definidas en 16F877.h
long CCP_1; long CCP_2;
#byte CCP_1 = 0x15 #byte CCP_2 = 0x15
#byte CCP_1_LOW = 0x15 #byte CCP_2_LOW = 0x15
#byte CCP_1_HIGH = 0x16 #byte CCP_2_HIGH = 0x16
6
Módulos CCP
Configuración del pin CCPy como entrada/salida
set_tris_C (valor);
valor: Entero de 8 bits, cada uno de los cuales representa la
la configuración de un pin del puerto. (“1”⇒E / “0”⇒S)
Configuración del temporizador TMR1
setup_timer_1 (modo);
modo: T1_DISABLED (T1CON ← 00h)
T1_INTERNAL (T1CON ← 85h)
T1_EXTERNAL (T1CON ← 87h)
T1_EXTERNAL_SYNC (T1CON ← 83h)
T1_CLK_OUT (T1CON ← 08h)
T1_DIV_BY_1 (T1CON ← 00h)
T1_DIV_BY_2 (T1CON ← 10h)
T1_DIV_BY_4 (T1CON ← 20h)
T1_DIV_BY_8 (T1CON ← 30h)
Se pueden agrupar constantes de distintos grupos con |.
Módulos CCP
Configuración del temporizador TMR2
setup_timer_2 (modo,periodo,postscaler);
modo: T2_DISABLED (T2CON ← 00h)
T2_DIV_BY_1 (T2CON ← 04h)
T2_DIV_BY_4 (T2CON ← 05h)
T2_DIV_BY_16 (T2CON ← 06h)
periodo: PR2 ← periodo
postscaler: Número de necesarios para generar una
interrupción. Es un valor entre 1 y 16.
7
Módulos CCP
Ejemplo 1
setup_timer_2 (T2_DIV_BY_1 , 224 , 1);
300µs W ← 00000000
W ← W | 00000100
T2CON ← W
224 W ← E0h
Banco 1
100µs PR2 ← W
Banco 0
(f osc = 3MHz) setup_ccp1 (CCP_PWM_PLUS_1);
W ← 111111 011
Banco 1
#use standard_io (C)
TRISC ← W
T = 300µs ⇒ PR2 = 224 Banco 0
D = 100µs ⇒ carga = 301 RC2 ← 0
CCP1CON ← 0
W ← 0001 1100
Carga = 301 CCP1CON ← W
01 001 01 1 01
set_pwm1_ duty (0x4B); CCPR1L ← 01001011
01 001 01 1 01
CCPR1L CCP1CON<5:4>
Módulos CCP
Ejemplo 1 (cont.)
setup_timer_2 (T2_DIV_BY_1 , 224 , 1);
W ← 00000000
W ← W | 00000100
T2CON ← W
224 W ← E0h
Banco 1
¡¡ATENCIÓN!!
¡¡ATENCIÓN!! PR2 ← W
Banco 0
La
La instrucción
instrucción setup_ccp1 (CCP_PWM);
setup_ccpx
setup_ccpx (modo);
(modo); #use fast_io (C) -
siempre RC2 ← 0
siempre borra
borra el
el CCP1CON ← 0
registro
registro W ← 00001100
CCPxCON
CCPxCON CCP1CON ← W
set_pwm1_ duty (301);
4Bh CCPR1L ← 01001011
W ← CCP1CON
W ← W & 11 001111
W ← W | 00010000
CCP1CON ← W
8
Módulos CCP
Ejemplo 2
setup_timer_1 (T1_INTERNAL | T1_DIV_ BY_1);
W ← 100001 01
Configurar
Configurar uno
uno de
de
T1CON ← W
los
los módulos CCP
módulos CCP
para set_timer1 (0);
para lanzar
lanzar TMR1H ← 0
de
de manera
manera TMR1L ← 0
automática
automática
una
una conversión
conversión A/D
A/D CCP2 = 750;
cada
cada 1ms.
1ms. W ← 02h
CCPR2H ← W
750
f osc = 3MHz W ← EEh
CCPR2L ← W
TMR1 = 750
setup_ccp2 (CCP_COMPARE_RESET_TIMER);
(sin prescaler)
CCP2CON ← 0
W ← 00001011
CCP2CON ← W