En una entrada anterior (PWM) vimos una de las funcionalidades del mdulo
CCP. En esta entrada describiremos otra de sus funcionalidades, el modo
CAPTURE.
Como su nombre indica, este modo se usa para capturar eventos. Los eventos
sern bajadas o subidas de los pines correspondientes a CCP1 y CCP2 que son,
respectivamente, RC2 y RC1 (este ltimo puede cambiarse por RB3 en la
configuracin inicial). Para la captura se precisa que un timer este corriendo.
Este timer ser nuestro "reloj": capturar un evento ser grabar la "hora"
(contador del timer) en que se ha producido. Los timers usados con el mdulo
de CAPTURA pueden ser tanto el TMR1 como el TMR3.
Podramos conseguir similares resultados usando las interrupciones INTx que
vimos en los codificadores en cuadratura. Cada vez que entre la interrupcin
podramos guardar el valor de un timer que este corriendo. La diferencia es
que con este enfoque, para cuando "miremos la hora" ya habr pasado un
tiempo (mientras el micro termina lo que est haciendo, pasa el control a la
interrupcin, etc.) que puede ser del orden de microsegundos.
Por el contrario, si se usa el mtodo de captura, en cuanto se produce el
evento se copia el valor del timer usado a los registros CCPRxH:CCPRxL. Por
supuesto, ser nuestra responsabilidad guardar dicho valor en otra variable
antes de que se repita el evento y se machaque con otro valor.
En la entrada explicaremos la configuracin del modo de CAPTURA y los
registros asociados. En la siguiente entrada usaremos el modo de CAPTURA
para leer los datos de un sensor de luz (TSL235) cuya salida en una onda
cuadrada de frecuencia variable.
------------------------------------------------------------------------------------------Modo de Captura del mdulo CCP:
Como siempre, la mejor explicacin la encontraris en los datasheets de
Microchip. Aqu presentar un rpido resumen.
El modo de Captura es una de las tres funciones posibles que puede
desempear cada mdulo CCP (Capture-Compare-PWM) del PIC. Normalmente
hay 2 mdulos CCP1 y CCP2 con pines asociados RC2 y RC1 (notad la inversin
en la asignacin de pines). Es posible dedicar cada mdulo CCPx a una funcin
distinta. Uno podra estar en modo CAPTURA (usando TMR1) y el otro en modo
PWM (usando TMR2). Incluso usando ambos en modo CAPTURA podramos
usar una base de tiempos distinta en cada mdulo.
La siguiente tabla del datasheet muestra las posibilidades de combinacin:
Cada uno de los mdulos CCP tiene asociados varios registros (cambiar la x en
lo sucesivo por 1 o 2):
CCPxCON: con este registro definiremos el tipo de operacin (Capture /
Compare / PWM) del mdulo. El valor para seleccionar modo de CAPTURA es:
0b 000001xx
Los dos ltimos bits configuran el tipo de evento a capturar:
00:
01:
10:
11:
capturar
capturar
capturar
capturar
cada
cada
cada
cada
cada de la lnea.
subida de la lnea.
4 subida de lnea.
16 subida de lnea.
microsegundo. Sera fcil configurar T3CON por nuestra cuenta, pero en este
ejemplo usaremos las funciones de C18:
// Starts TMR3 using OSC as source, 16bit mode,
// with 1:2 prescaler (1 usec @ 8
MHz) OpenTimer3(TIMER_INT_OFF&T3_16BIT_RW&T3_SOURCE_INT&T3_PS_1_2&
T3_SOURCE_CCP);
// TMR3 as source for both CCP1/CCP2
T3CONbits.T3CCP2=1; T3CONbits.T3CCP1=1;
Aqu creo que hay un bug en C18. Segn la documentacin hay una mscara
(T3_SOURCE_CCP) que si se aadiese al argumento de OpenTimer3, pondra
los valores adecuados en los bits T3CCP1 y T3CCP2 de forma que TMR3 fuese
el timer a usar por ambos mdulos. Sin embargo, cuando la uso no se ponen
los bits a su valor correcto (1). Es por esto por lo que necesito ponerlos a 1
"manualmente"
en
la
siguiente
lnea.
Para que el mdulo CCP1 funcione correctamente y detecte los eventos es
necesario que su pin asociado (RC2) est declarado como una entrada:
TRISCbits.TRISC2=1; // RC2 as input
Ahora vamos a configurar el mdulo CCP1 en modo CAPTURA. Por ejemplo, si
deseamos configurar CCP1 en modo 4X (un evento es la llegada de 4 pulsos o
ms especficamente, la llegada de la 4 subida) basta hacer:
CCP1CON=0b00000110; // Modo CAPTURE. Event = x4 rising edges
Para hacer el programa ms legible podramos usar la correspondiente rutina
de C18 (en este caso tendramos que incluir fichero capture.h):
// CCP1CON=0b00000111 Modo CAPTURE. Event = x16 rising edges
OpenCapture1(CAPTURE_INT_OFF,C1_EVERY_4_RISE_EDGE);
Finalmente habilitaramos la interrupcin del CCP (alta prioridad):
enable_priority_levels;
enable_CCP1_int; set_CCP1_high;
enable_high_ints; enable_low_ints;
uint16 t0=0;
uint16 dt=0;
// High priority interruption
#pragma interrupt high_ISR
void high_ISR (void)
uint16 t;
if (CCP1_flag)
{
t=CCPR1H; t<<=8; t+=CCPR1L;
happened)
}
// Code @ 0x0008 -> Jump to ISR for high priority ints
#pragma code high_vector = 0x0008
void high_interrupt (void){_asm goto high_ISR
#pragma code
_endasm}
real, para medir el periodo de un sensor que convierte luz recibida en una
frecuencia de salida.
Publicado por Antonio
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con
FacebookCompartir en Pinterest
6 comentarios:
1.
Alfonso Pineda23 de septiembre de 2013, 5:05
Muchas gracias amigo Antonio, por usar tu tiempo y esfuerzo para
ensearnos.
Responder
2.
Vctor Marroqun Poblano11 de diciembre de 2013, 6:31
MUCHAS GRACIAS, ME HA SIDO DE GRAN AYUDA. OJAL PUEDAS
HACER LOS TUTORIALES EN MIKROC Y ENSEAR A USAR
COMUNICACIN USB. GRACIAS
Responder
3.
Wagner Jimenez29 de mayo de 2014, 2:02
Muy buena explicacio, gracias mil
Responder
4.
Annimo12 de septiembre de 2014, 23:24
hi
Responder
5.
Juan Hauara6 de julio de 2016, 5:17
Excelente muy buena explicacin, saludos y gracias.
Responder
6.