CCP PIC modo captura


Compartir: Share on Facebook5Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

ccp pic modo captur en CCS

CCP PIC modo Captura en XC8.

CCP PIC modo Captura en CCS.

El módulo CCP PIC modo captura, lo que hace es capturar o guardar en sus registros CCPRxH y CCPRxL que juntos hacen un registro de 16 bits, el valor que se encuentra en el registro TMR1 esto es el valor que hay en el registro donde se guardan las cuentas del temporizador 1 el cual también es un registro de 16 bits el cual a su vez puede estar prescalado, (sobre el uso del registro TMR1 se puede encontrar información aquí), x puede ser 1 o 2 dependiendo del módulo CCP utilizado, se comentará para el caso del PIC16F877A la forma de utilizar este módulo en modo captura es muy similar en otros microcontroladores PIC que cuentan con este módulo, por lo cual es muy necesario siempre tener a mano la hoja de datos del PIC utilizado, la hoja de datos del PIC16F877A se puede encontrar aquí.

🙂 Puedes descargar este contenido en PDF desde aquí.

En el uso del módulo CCP PIC modo captura, la captura ocurre justo cuando en el pin CCPx, el cual tiene que ser configurado previamente como una entrada digital mediante el registro TRISC correspondiente, ocurre algunos de los siguiente sucesos o eventos, los cuales se eligen por programa:

  • Una señal digital en el pin CCPx pasa de alto a bajo, esto provocará una captura por parte del módulo CCPx por flanco de bajada.
  • Una señal digital en el pin CCPx pasa de bajo a alto, esto provocará una captura por parte del módulo CCPx por flanco de subida.
  • Una señal digital en el pin CCPx pasa de bajo a alto 4 veces seguidas, esto provocará una captura por parte del módulo CCPx por cada 4 flancos de subida que ocurran en este pin.
  • Una señal digital en el pin CCPx pasa de bajo a alto 16 veces seguidas, esto provocará una captura por parte del módulo CCPx por cada 16 flancos de subida que ocurran en este pin.

Para el caso del PIC16F877A x representa 1 o 2 ya que este pic cuenta con 2 módulos CCP, según la hoja de datos es necesario que el timer1 sea configurado para trabajar como temporizador o contador síncrono ya que en modo asíncrono el módulo CCP PIC modo captura no funcionará.

Cuando ocurre la captura el bit 2 CCP1IF del registro PIR1 se pone a 1, el cual indica que se ha producido una interrupción por captura mediante el módulo CCPx si se han habilitado las interrupciones de este módulo mediante los bits 7 y 6 del registro INTCON y el  bit 2 del registro PIE1, luego habrá que poner nuevamente a 0 el bit 2 del registro PIR1, si no se han habilitado las interrupciones pues no ocurrirá ninguna interrupción.

CCP PIC modo captura: Registro CCPxCON

Mediante este registro se elige en modo de trabajo del módulo CCPx, en la siguiente imagen se muestra el registro con los respectivos nombres de los bits que lo conforman.

CCP pic modo captura

Los bits 7 y 6 de este registro no se utilizan por lo que se les pone a 0.

Los bits 5 y 4 no se usan en modo captura, por lo que se les pondrá a 0, tampoco son utilizados en el modo comparación pero si en el modo PWM como se verá cuando se trate este modo.

Los bits 3, 2, 1 y 0 son los que se utilizarán para elegir el modo de trabajo del módulo CCP, si estos 4 bits se ponen a 0 el módulo CCP estará deshabilitado; para el uso del módulo CCP pic modo captura los valores asignados a estos pines serán como se indican en la siguiente tabla para decir cuando se quiere que ocurra la captura como se comento lineas arriba.

CCP pic modo captura eventos

Donde RCy/CCPx se refiere al pin correspondiente pin 17 o RC2 o CCP1 y pin 16 RC1 o CCP2 para el PIC16F877A.

Luego que ocurre la captura por cualquiera de los eventos seleccionados, el valor que en ese momento tenga el registro TMR1 de 16 bits, se guardará en los registros  CCPRxH y CCPRxL que juntos hacen un registro de 16 bits, los cuales deben ser leídos y guardados dentro de una variable de 16 bits antes de que ocurra otra captura de lo contrario el valor guardado será borrado y reemplazado por un nuevo valor.

Se puede cambiar en cualquier momento el suceso que provocará la captura, para lo cual hay que apagar el módulo CCP cambiar  el tipo de suceso que provocará la captura y volver a habilitar el módulo CCP.

 😉 Mediante la utilización del módulo CCP PIC modo captura se puede medir el tiempo que dura una señal, esto es su periodo su frecuencia, o detectar en que momento ocurre algún evento en el pin CCPx utilizado.

Se utilizará el XC8 para los primeros ejemplos para de esta manera conocer la manipulación de los registros en el módulo CCP PIC modo captura; luego se harán otros ejemplos con el uso del CCS, el cual trae funciones integradas para la manipulación de estos registros.

CCP PIC modo captura con el MPLAB XC8.

El ejemplo realizado en el MPLABX con el XC8 para el uso del módulo CCP PIC modo captura se dividirá en dos partes o 2 ejemplos para ver la forma en que se manejarán los registros involucrados, se utilizará el PIC16F877A, el primer ejemplo que será la primerá parte, consistirá en ver por medio de una pantalla lcd el momento en que se captura la subida o el paso de una onda cuadra de bajo a alto, esto es por flanco de subida, lo cual se detecta cuando el bit 2 o CCP1IF del registro PIR1 se pone a 1, esto siempre ocurrirá cuando suceda una captura lo cual a su vez se puede utilizar con interrupciones del módulo CCP PIC modo captura, este ejemplo se podría hacer con interrupciones pero para para ver como el bit 2 o CCP1IF del registro PIR1 se pone a 1 con cada captura y para empezar se hará sin interrupciones.

En la segunda parte o segundo ejemplo se medirá el tiempo en que una onda cuadrada está a 1 o en alto o el semiperiodo, mediante el uso del CCP PIC modo captura, en este caso  sera necesario hacer 2 capturas, una por flanco de subida y la otra por flanco de bajada.

 😈 La intensión a partir de este tema es ir combinado los temas tratados anteriormente, por lo que para los ejemplos realizados para el CCP PIC modo captura es necesario que se sepan utilizar los temporizadores o timers del  PIC, sobre lo cual se encuentra información AQUÍ.

Como los ejemplos se harán en el XC8 se utilizará un driver para el manejo la pantalla LCD, la forma en que se utiliza se publicó en un par de vídeos en el canal de youtube de MrElberni, el driver para el LCD y los vídeos se pueden ver AQUÍ.

Ejemplo 1 en XC8 Mediante el uso de interrupciones por desborde del TMR0 (el como se logra esto se puede ver AQUÍ) se genera una onda cuadrada que será obtenida por el pin RD2 del PIC16F877A esta onda cuadrada será ingresada al pin CCP1(pin 17), donde con el uso del módulo CCP PIC modo captura se obtendrá el instante en que la onda cuadrada pasa de bajo a alto, para que este valor se mantenga casi constante, será necesario en cada ciclo de programa reiniciar el TMR1 a 0, para que el valor de la captura sea la misma en cada flanco de subida, este valor será visto en la pantalla LCD que estará conectado tal como se muestra en la imagen, siendo necesario en el driver del LCD modificar los pines utilizados tal como se comenta en los vídeos publicados sobre el LCD en XC8.

El circuito utilizado para el  ejemplo 1 y para el ejemplo 2 del uso del CCP PIC modo captura es el siguiente, donde tanto el pic como LCD deben estar alimentados adecuadamente:

 CCP pic modo captura

El código utilizado sin interrupciones en este caso es el siguiente, en cada línea de código se comenta el porque de cada línea de código.

CCP PIC modo captura ejemplo1 código1CCP pic modo captura ejemplo1 código 2CCP PIC modo captura ejemplo 1 código3La siguiente es una imagen del circuito realizado, el cable gris que se ve lleva la señal del pin RD2 al pin CCP1, se puede observar que la captura ocurre a los 33000us o 33ms aproximadamente; la onda cuadrada que se genera con el TMR0 es de un periodo de 100ms.

CCP pic modo captura imagen del circuito

Ejemplo 2 en XC8 en este caso se medirá el tiempo que una onda cuadrada está en alto, la onda cuadrada que se generará por interrupciones del TMR0 para este ejemplo será de un periodo de 50ms, esto es que estará 25ms en alto y 25ms en bajo, este tendrá que ser el valor visto en la pantalla LCD o uno muy cercano, pero se verá en microsegundos es decir 25000us con el uso del módulo CCP PIC modo captura, el circuito utilizado será el mismo que para el ejemplo 1, pero en este caso será necesario realizar 2 capturas, una cuando la onda cuadrada pase de bajo a alto y a continuación cuando la onda cuadrada vuelva del alto a bajo, lo  que hay que medir es el tiempo que transcurre durante este suceso.

A continuación el código utilizado para lograr esto mediante el uso del XC8, en cada línea de código está comentado el porque de esa línea de código.

ccp pic modo captura ejemplo2 código1

ccp pic modo captura ejemplo2 código2

ccp pic modo captura ejemplo2 código3

ccp pic modo captura ejemplo 2 código4

La siguiente es una imagen del circuito realizado para el ejemplo 2 del módulo CCP PIC modo captura , el cable gris que se ve lleva la señal del pin RD2 al pin CCP1, se puede observar que el tiempo que la onda cuadrada está en alto es de 25111us o 25,111ms es lo que se obtiene con el tmr0, 111us mas ya que si se quiere exactamente 25000us en el registro TMR0 habría que cargar un número con decimales y en este registro solo se pueden cargar números enteros y el mas cercano para obtener los 25ms es cargarlo a 158; la onda cuadrada que se genera con el TMR0 es de un periodo de 50ms.

ccp modo captura ejemplo 2

El mismo resultado se obtendría si se utiliza las interrupciones que provoca el módulo CCP PIC modo captura, el siguiente es el código para medir el tiempo que la onda cuadrada está en alto utilizando interrupciones que en estos casos es lo mejor, en los ejemplos los códigos anteriores se realizaron sin la utilización de las interrupciones para ver como responde el bit 2 o CCP1IF del registro PIR1 poniéndose a 1 con cada captura que se realice, siendo necesario que cada vez que se quiera saber cuando se realiza una captura que este bit se ponga a 0 para que se vuelva a detectar otra captura.

ccp pic modo captura ejemplo2 con interrupciones código1

ccp pic modo captura ejemplo2 con interrupciones código2

ccp pic modo captura ejemplo2 con interrupciones código3

ccp pic modo captura ejemplo2 con interrupciones código4

La siguiente es una imagen del circuito realizado para el ejemplo 2 del módulo CCP PIC modo captura, se puede ver en el hilo que une el pin RD2 con el pin CCP1 se ha colocado un osciloscopio para ver la onda generada, también se está midiendo la frecuencia que es de 20Hz lo que equivale a un periodo de 50ms y un semiperiodo de 25ms o 25000us, el la pantalla LCD se puede observar que el tiempo que la onda cuadrada está en alto es de 25111us o 25,111ms es lo que se obtiene con el tmr0, 111us mas ya que si se quiere exactamente 25000us en el registro TMR0 habría que cargar un número con decimales y en este registro solo se pueden cargar números enteros y el mas cercano para obtener los 25ms es cargarlo a 158; la onda cuadrada que se genera con el TMR0 es de un periodo de 50ms.

cpp pic modo captura ejemplo 2 en proteus

El uso del XC8 es muy interesante para la programación de los microcontroladores PIC ya que nos ayuda a manipular en  forma directa los registros del a utilizar, en este caso para el uso del módulo CCP PIC modo captura, ahora se presentan unos ejemplos utilizando el CCS, el cual cuenta  con una serie de funciones que ayudan y facilitan la programación de los microcontroladores PIC; los ejemplos realizados con el XC8 no tienen complicación para poder realizarlos en el CCS.

CCP PIC modo captura con el CCS.

El CCS tiene una función para el manejo del módulo CCP la cual es setup_ccpx(modo) que para el módulo CCP PIC en modo captura, dependiendo de cual de las opciones se quiere que se el motivo de la captura puede tener las siguientes opciones donde x puede ser 1 o 2 para los módulos CCP1 o CCP2:

setup_ccpx(CCP_OFF);//módulo CCP deshabilitado.

setup_ccpx(CCP_CAPTURE_FE);//cuando se necesita que la captura sea por flaco de bajada.

setup_ccpx(CCP_CAPTURE_RE);//cuando se necesita que la captura sea por flaco de subida.

setup_ccpx(CCP_CAPTURE_DIV_4);//cuando se necesita que la captura sea cada que pasen 4 flacos de subida o luego de 4 pulsos de alguna señal digital.

setup_ccpx(CCP_CAPTURE_DIV_16);//cuando se necesita que la captura sea cada que pasen 16 flacos de subida o luego de 16 pulsos de alguna señal digital.

El valor capturado y guardado en los registros CCPRxH y CCPRxL se puede leer y guardar en una variable de 16 bits mediante CCP_1 o CCP_2 dependiendo de cual de los módulos CCP se esté utilizando, por ejemplo si se crea una variable de 16 bits sin signo llamada valor_ccp y en ella se quiere guardar el valor capturado mediante el módulo CCP2 sería algo así:

unsigned int16 valor_ccp;//se crea la variable de 16 bits sin signo

valor_ccp=CCP_2;//se guarda el valor capturado con el módulo CCP2 en la variable valor_ccp

Si se van a utilizar las interrupciones por el módulo CCP, deben habilitarse las interrupciones globales, y habilitarse también las interrupciones del módulo CCP de esta manera:

enable_interrupts(GLOBAL);//habilitación de las interrupciones globales

enable_interrupts(INT_CCPx);//habilitación de las interrupciones del módulo CCPx

Ademas crear la función encargada de la atención a estas interrupciones la que tiene que ser creada de esta manera:

#INT_CCP1 //rutina de atención a las interrupción para el módulo CCP
void CCP1_isr(void) //el nombre de la función CCP1_isr puede ser cambiado
{

     //acciones a realizar durante la interrupción del módulo CCPx

    }

Ejemplo En este caso se medirá el periodo de una onda cuadrada, la onda cuadrada se generará por interrupciones del TMR2 con el PIC16F877A, para este ejemplo la onda cuadrada tendrá un periodo de 5ms, esto es que estará 2,5ms en alto y 2,5ms en bajo, en la pantalla LCD (se puede encontrar información sobre el uso de la pantalla LCD en el CCS aquí) se tendrá que ver 5000us o un valor próximo, se hará con el uso del módulo CCP PIC modo captura para medir este periodo, el circuito utilizado es el que se muestra a continuación, en este caso se hará la captura cada 4 flancos ascendentes mediante interrupciones del módulo CCP PIC modo captura, se medirá el tiempo que tarda en realizarse estos 4 flancos ascendentes y luego se dividirá este valor entre 4 obteniéndose el periodo de la onda cuadrada.

CCP pic modo captura

A continuación el código utilizado para lograr esto mediante el uso del CCS, en cada línea de código está comentado el porque de esa línea de código.

ccp pic modo captura en ccs codigo1

ccp pic modo captura en ccs codigo2

ccp pic modo captura en ccs código3

La siguiente es una imagen del circuito realizado para el ejemplo del módulo CCP PIC modo captura utilizando el CCS, el cable gris que se ve lleva la señal del pin RD2 al pin CCP1, se puede observar que el tiempo que la onda cuadrada está en alto es de 5024us o 5,024ms es lo que se obtiene con el tmr2, 24us mas ya que si se quiere exactamente 5024us en el registro PR2 habría que cargar un número con decimales, y en este registro solo se pueden cargar números enteros y el mas cercano para obtener los 5ms es cargarlo a 156,  ademas el CCS consume unos cuantos us al realizar sus funciones; la onda cuadrada que se genera con el TMR2 es de un periodo de 5ms.

ccp pic modo captur en CCS

Compartir: Share on Facebook5Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0