uff... llevo un rato leyendome los post de redpic de como medir y generar pulsos, pero no consigo comprender como funciona el modulo CCP... mi duda es CUAL ES LA DIFERENCIA ENTRE EL CCP Y INT_EXT? porque ambos se activan a la entrada de un pulso, incluso se pueden configurar para que se activen a la subida o la bajada... el ccp en modo capture es lo mismo que la int_ext? para que sirve exactamente el modo compare?
gracias! y espero que compenses a tu mujer por tener tanta paciencia
Un poco de teoría descriptiva
:
El nombre del módulo CCP viene dado por las iniciales del acróstico de
Input Capture, Output Compare y Pulse Width Modulation. que desde la negrura de los tiempos ha sido llamado módulo
CCP.
El por qué tres funciones aparentemente tan dispares aparecen juntas en un único módulo, y no sólo en los PIC de
Microchip sino hasta donde alcanza mi conocimiento es un bloque generalizado entre los distintos fabricantes como
Motorola o
Atmel, lo ha apuntado muy acertadamente el maestro Nocturno: Su conjunción con un
Timer.
Intentaré describir lo mas claro que pueda como funciona este sistema, aunque antes vamos a ver qué ocurre con la mucho mas simple
Interrupción Externa por PB0 de un PIC16 (ó PB1 y PB2 en los PIC18) teniendo como objetivo el intento de saber cuanto dura un pulso externo.
La situación a que nos enfrentamos es un pulso que estando en estado lógico bajo cambia a estado lógico alto durante un tiempo y transcurrido éste vuelve a su estado inicial bajo. Es un pulso
bajo-alto-bajo y deseamos medir cuánto dura ese estado alto intermedio.
Esto mismo podemos describirlo como el tiempo que tarda en aparecer
un flanco de bajada tras haber aparecido un inicial flanco de subida. En la
Serie Técnicas en C me dedicaba a mostrar cómo realizarlo de tres formas distintas.
Nuestro problema estriba entonces en implementar un método para realizar lo siguiente:
- 1.-Esperamos a recibir un flanco de subida
- 2.-Guardamos estado inicial de un Timer
- 3.-Esperamos a recibir un flanco de bajada
- 4.-Guardamos estado final del mismo Timer
- 5.-Restamos estado inicial del final del Timer y obtenemos tiempo entre flancos.
Si la señal la conectamos al
PIN_B0 de un PIC16 (ó PB1 y PB2 en los PIC18) con la Interrupción Externa tenemos solucionados los puntos 1 y 3 de la tarea que nos hemos propuesto, conocer cuando llegan ambos flancos. Las tareas 2 y 4, guardar los valores del
Timer tenemos que escribirlo nosotros, habilitar las variables y leer el
Timer que deseamos. Es el método descrito en
Tiempo en Alto con INTEXT donde en cada cambio de flanco realizamos su correspondiente
t1=get_timer1();. Fíjate que el tema está en
get_timer().
Si por el contrario en vez de usar la Interrupción Externa usamos el módulo
CCP configurado para la función I
nput Capture tendremos la facilidad de realizar dos tareas al mismo tiempo. Si le decimos al PIC que espere en
CCP un
Input Capture por flanco de subida cuando éste llegue y se dispare la
Interrupción CCP tendremos ya en valor del
Timer guardado en su registro
CCPRxH:CCPRxL, o sea que las tareas 1 y 2 por un lado y las 3 y 4 de nuestra lista por otro estarán completadas. Es lo que describimos en
Tiempo en Alto con INTCCP en donde en lugar del
get_timer1() usamos el muchísimo mas directo
t1=CCP_2 que es cómo se llama el registro registro
CCPRxH:CCPRxL en
CCS C.
Como puedes ver el
CCP en
Input Capture lo que hace realmente es capturar el valor de un
Timer cuando se presenta un
flanco determinado. Nosotros lo utilizamos en nuestro ejemplo para conmutar el flanco a detectar y medir el ancho del pulso. Otras aplicaciones sólo dependen de la imaginación del artista.
De forma simétrica o complementaria a ésta de recoger el valor del
Timer cuando hay un cambio externo es el modo
Output Compare del
CCP. Este modo de funcionamiento del
CCP es justo lo
contrario al anterior: Producimos un cambio de estado en el pin del
CCP cada vez que el
Timer alcanza un valor determinado. O sea que ponemos el registro
CCPRx a un valor que nos interese y cuando el
Timer llega a ese valor el pin se pone en
Alto, en Bajo o conmuta, según programemos su función. Esto lo podéis ver en
Onda Simétrica Mediante INTCCP en modo Compare donde utilizamos este método para generar un pulso.
Insisto de nuevo en la idea:
Input Capture determina el valor del
Timer al cambiar el estado del
pin,
Output compare cambia el estado del
pin cuando el
Timer llega a un valor determinado. Son maravillosamente simétricos y complementarios.
Y por fin nos queda el
PWM que no es mas que especialización del anterior. Activando ésta función del
CCP lo que hacemos es cargar dos valores del
Output Compare para generar un ancho de pulso de salida determinado y qué porcentaje del mismo va a estar en alto y cuál en bajo, o sea que
modulamos el ancho de pulso. Este
PWM es una como un
Output Compare sofisticado con el que con muy poco código podemos controlar todos los parámetros del pulso que necesitamos generar.
Bueno y eso es todo por ahora amigos. Espero no haberos aburrido demasiado.