El PIC16F887 disponen de dos módulos CCP, que se diferencian
por su nomenclatura, CCP1 y CCP2, dado que su funcionamiento prácticamente es
igual.
Módulos CCP en modo captura:
En modo captura, una pareja de registros captura el valor
que tiene TMR1 cuando ocurre un evento especial en el pin RC2/CCP1 para el
módulo CCP1 y en el pin RC1/T1OSI/CCP2 para el módulo CCP2. Los eventos
posibles que pueden ocurrir sobre dichas pines son:
1° Un flanco ascendente.
2° Un flanco descendente.
3° Cada 4 flancos ascendentes.
4° Cada 16 flancos ascendentes.
Al efectuar la captura se activa el señalizador CCP1F para
el módulo CCP1, y si el bit de permiso está activado también se puede originar
una petición de interrupción. Una interesante aplicación del modo de captura es
la medición de los intervalos de tiempo que existen entre los impulsos que se
aplican a un pin del PIC.
Módulos CCP en modo comparación:
En este modo, el valor almacenado en el registro CCP1 se compara constantemente al valor almacenado en el registro del temporizador Timer1. Al igualarse los valores, el estado lógico en el pin de salida puede ser cambiado, lo que depende del estado de bits en el registro de control (CCP1M3 – CCP1M0). El bit de bandera CCP1IF se pone a uno simultáneamente.
Para poner el módulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:
- El pin RC2/CCP1 debe estar configurado como salida; y
- El temporizador Timer1 debe estar sincronizado con el reloj interno.
Modo de modulacion de anchura de pulsos (PWM):
Con este modo de trabajo se consiguen pulsos cuyo ancho en
el nivel alto es de duración variable y que son enormemente útiles en el
control de los motores. La pata RC2/CCP1 está configurada como salida y la
oscilación entre los niveles lógicos 0 y 1 a intervalos variables de tiempo. Se
intenta obtener un pulso cuyo nivel alto tenga un ancho variable (Duty Cicle),
dentro del intervalo fijo del período del pulso.
Para conseguir la oscilación de la pata se usa un comparador
que pone a 1 (Set) un flip-flop cuando el valor del registro PR2 coincide con
la parte alta del TMR2, momento en que TMR2 toma el valor 00H. Luego el
flip-flop sé resetea y se pone a 0 cuando otro comparador detecta la
coincidencia del valor existente en CCPR1H con el de la parte alta de TMR2.
Variando los valores que se cargan en PR2 y en CCPR1L se varía el intervalo de
tiempo en que la pata de salida está a 1 y a 0 .
Cuando se trabaja con una precisión de 10 bits de mas peso del TMR2 se concatenan con los 8 de CCPR1L y, de la misma forma, los ocho bits de mas peso del TMR2 se concatenan con los dos bits de menos peso del reloj interno, haciendo que el TMR2 cuente cada Tosc en vez de cada 4.Tosc.
El tiempo que dura el periodo de la onda depende del valor cargado en PR2, según la formula siguiente:
Cuando el valor de TMR2 coincide con el de PR2 suceden tres acontecimientos:
1° Se borra el TMR2.
2° La patita RC2/CCP1 se pone a 1.
3° El valor de CCPR1L, que es el que determina la anchura del pulso, se carga en CCPR1H.
1° Asignar el periodo cargando el oportuno valor en PR2.
2° Asignar la anchura del pulso cargando el registro CCPR1L y los dos bits 5 y 4 del CCP1CON.
3° Configurar la linea RC2/CCP1 como salida.
4° Asignar el valor del predivisir y activar el TMR2 escribiendo en T2CON.
5° Configurar el modulo CCP1 en modo PWM.
Ejemplo de PWM
Un ejemplo típico es un circuito de control de potencia. Refiérase a la siguiente figura. Si un cero lógico (0) indica un interruptor abierto y un uno lógico (1) indica un interruptor cerrado, la potencia eléctrica que se transmite a los consumidores será directamente proporcional a la duración del pulso. Esta relación se le denomina Ciclo de Trabajo.
Es importante tener en cuenta que para trabajar con CCP se deben manejar los siguientes registros
Si está habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los valores en modo de Comparación. Además, el módulo CCP1 puede generar señales PWM de frecuencia y de ciclo de trabajo variados.
Los bits del registro CCP1CON están en control del módulo CCP1.
En ese programa se utiliza el timer1 como comparador, cabe destacar que se compara el valor introducido para timer1 con el valor introducido a CCPR1 todos registros de 16 bits, se le asignó a CCPR1: FF FF (máximo valor), y a timer1 00 01 con la finalidad de que tarden en igualarse en la mayor cantidad de tiempo posible para poderlo visualizar, pues esto ocurre muy rápido. La salida de esta igualdad viene dada por el pin CCP1 (de acuerdo a la configuración hecha, cuando son iguales=1, cuando son distintos=0; esta configuración se hace con CCP1CON, bits3-0), a este pin (ccp1) conecto un Led (color amarillo) que indica los cambios, (son iguales=1, son distintos=0) dado que ocurren muy rápido se conectó 4 leds al puerto b, con retardode 1 seg, los primeros dos led (color rojo) encienden cuando son iguales, y se apagan cuando son distintos, y los otros dos led (color verde) encienden cuando la comparación es distinta y se apagan cuando la comparación es igual.
;CABE DESTACAR QUE COMPARA EL VALOR DEL TIMER1 CON EL VALOR DE CCPR1
;TODOS REGISTROS DE 16 BITS, SE LE ASIGNO A CCPR1:FF FF (MAXIMO VALOR), Y A TIMER1 00 01
;CON LA FINALIDAD DE QUE TRATEN EN IGUALARSE EN LA MAYOR CANTIDAD DE TIEMPO POSIBLE PARA PODERLO VISUALIZAR,
;PUES ESTO OCURRE MUY RAPIDO. LA SALIDA DE ESTA IGUALDAD VIENE DADA POR EL PIN CCP1 (DE ACUERDO
;A LA CONFIGURACION HECHA, CUANDO SON IGUALES=1, CUANDO SON DISTINTOS=0), A ESTE SE CONECTO UN
;LED QUE INDICA LOS CAMBIOS, DADO QUE OCURREN MUY RAPIDO SE CONECTO 4 LEDS AL PUERTO B, CON
;RETARDO DE 1 SE, LOS PRIMEROS DOS ENCIENDEN CUANDO SON IGUALES, Y LOS OTROS DOS ENCIENDES
;CUANDO LA COMPARACION NO ES IGUAL.
LIST p=16F887
INCLUDE <P16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
CONTA EQU 0x20
CONTB EQU 0x21
CONTC EQU 0x22
ORG 0x00
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISC
CLRF TRISB
CLRF TRISC
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
BANKSEL OPTION_REG
MOVLW 0x80;DESABILITA TIMER0
BANKSEL T1CON
MOVLW 0x01; SELECCION DEL HABILITA TIMER1
MOVWF T1CON
MOVLW 0x08; MODO COMPARACION: CCP1 SE PONE A 1, Y CUANDO TMR1=CCR1,Y
MOVWF CCP1CON;CCP1IF SE PONE A UNO
INICIO CLRF PORTB
MOVLW 0xFF
MOVWF CCPR1L;CARGA A LA PARTE BAJA DE CCPR
MOVLW 0xFF
MOVWF CCPR1H;CARGA A LA PARTE ALTA DEL CCPH
MOVLW 0x01
MOVWF TMR1L;CARGA A LA PARTE BAJA DE TIMER1
MOVLW 0x00
MOVWF TMR1H;CARGA A LA PARTE BAJA DE TIMER1
PRE BTFSS PIR1, CCP1IF; PREGUNTA POR BANDERA, SI SON IGUALES=1 SINO=0
GOTO RETAR1
MOVLW 0x0C
MOVWF PORTB
CALL RETARD
BCF PIR1, CCP1IF
GOTO INICIO
RETARD MOVLW d'100'
MOVWF CONTA
CICLO3 MOVLW d'80'
MOVWF CONTB
CICLO2 MOVLW d'60'
MOVWF CONTC
CICLO1 DECFSZ CONTC,F
GOTO CICLO1
DECFSZ CONTB,F
GOTO CICLO2
DECFSZ CONTA,F
GOTO CICLO3
RETURN
RETAR1 MOVLW 0x03
MOVWF PORTB
CALL RETARD
CLRF PORTB
GOTO PRE
END
Cabe destacar que a una frecuencia de 4 hz, T=250msg, como la bandera se activa luego de 16 flancos ascendentes: 250msegx16=4seg; lo que indica que cada 4seg se levanta dicha bandera, pasa a encenderse el led, como esto ocurre muy rápido se hizo un retardo de 1 seg, para el encendido del led. Resumiendo: El led permanece apagado 4seg, se enciende 1 seg (porque se levantó la bandera) , se apaga 4 seg, y así sucesivamente.
;ESTE PROGRAMA CONSISTE EL UTILIZAR EL MODO CAPTURA DEL TIMER1, ES NECESARIO
;SEÑALAR QUE ESTE MODULO CONSISTE EN CONECTAR UN EVENTO EXTERNO EN ESTE CASO UN RELOJ DE 4HZ,
;AL PIN 2 DEL PUERTO C (CCP1), SE CONFIGURA EL CCP1CON, DONDE SE INDICA EL CAPTURE DEL TIMER1
;ASOCIADO AL EVENTO EXTERNO. SE CONFIGURO PARA QUE CADA 16 FLANCOS ASCENDENTES DEL EVENTO EXTERNO
;SE CAPTURARA EL VALOR DEL TIMR1, CON ELLO SE PONE EN 1 LA BANDERA CCP1IF DEL REGISTRO PIR1
; CUANDO ESTO OCURRE SE ENCIENDE UN LED, CONECTADO AL PIN0 DEL PUERTOB, Y SE REPITE EL PROCESO.
LIST p=16F887
INCLUDE <P16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
CONTA EQU 0x20
CONTB EQU 0x21
CONTC EQU 0x22
ORG 0x00
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISC
CLRF TRISB
CLRF TRISC
BSF TRISC,2
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
BANKSEL OPTION_REG
MOVLW 0x80;DESABILITA TIMER0
BANKSEL T1CON
MOVLW 0x01; SELECCION DEL HABILITA TIMER1
MOVWF T1CON
MOVLW 0x07; OCURRE UN CAPTURE DEL TIMER1 CADA 16 FLANCOS
MOVWF CCP1CON;ACENDENTES DEL EVENTO EXTERNO
INICIO CLRF PORTB
PRO BTFSS PIR1, CCP1IF
GOTO PRO
BCF PIR1, CCP1IF
CLRF TMR1H
CLRF TMR1L
MOVLW 0x01
MOVWF PORTB
CALL RETARDO
GOTO INICIO
RETARDO MOVLW d'100'
MOVWF CONTA
CICLO3 MOVLW d'80'
MOVWF CONTB
CICLO2 MOVLW d'60'
MOVWF CONTC
CICLO1 DECFSZ CONTC,F
GOTO CICLO1
DECFSZ CONTB,F
GOTO CICLO2
DECFSZ CONTA,F
GOTO CICLO3
RETURN
END
Cuando se trabaja con una precisión de 10 bits de mas peso del TMR2 se concatenan con los 8 de CCPR1L y, de la misma forma, los ocho bits de mas peso del TMR2 se concatenan con los dos bits de menos peso del reloj interno, haciendo que el TMR2 cuente cada Tosc en vez de cada 4.Tosc.
El tiempo que dura el periodo de la onda depende del valor cargado en PR2, según la formula siguiente:
Cuando el valor de TMR2 coincide con el de PR2 suceden tres acontecimientos:
1° Se borra el TMR2.
2° La patita RC2/CCP1 se pone a 1.
3° El valor de CCPR1L, que es el que determina la anchura del pulso, se carga en CCPR1H.
El tiempo que la patita de salida esta a nivel alto, que es la anchura del impulso, depende del contenido cargado en CCPR1L y de los dos bits 5 y 4 del CCP1CON, cuando se trabaja con una precision de 10 bits.
El valor CCPR1L:CCP1CON <5:4> puede cargarse en cualquier momento, puesto que el ismo no se traspasa a CCPR1H y se compara hasta que concidan PR2 con TMR2. En el modo PWM el registro CCPR1L solo puede ser leido.
Los pasos a seguir para realizar la configuración del modo PWM son los siguientes:
1° Asignar el periodo cargando el oportuno valor en PR2.
2° Asignar la anchura del pulso cargando el registro CCPR1L y los dos bits 5 y 4 del CCP1CON.
3° Configurar la linea RC2/CCP1 como salida.
4° Asignar el valor del predivisir y activar el TMR2 escribiendo en T2CON.
5° Configurar el modulo CCP1 en modo PWM.
Ejemplo de PWM
Un ejemplo típico es un circuito de control de potencia. Refiérase a la siguiente figura. Si un cero lógico (0) indica un interruptor abierto y un uno lógico (1) indica un interruptor cerrado, la potencia eléctrica que se transmite a los consumidores será directamente proporcional a la duración del pulso. Esta relación se le denomina Ciclo de Trabajo.
Es importante tener en cuenta que para trabajar con CCP se deben manejar los siguientes registros
MÓDULO CCP1
Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros CCPR1L y CCOR1H. Se utiliza para capturar y comparar sus valores con los números almacenados en el registro del temporizador Timer1 (TMR1H y TMR1L).
Si está habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los valores en modo de Comparación. Además, el módulo CCP1 puede generar señales PWM de frecuencia y de ciclo de trabajo variados.
Los bits del registro CCP1CON están en control del módulo CCP1.
MÓDULO CCP2
Con exclusión de los nombres diferentes de los registros y de los bits, este módulo es una muy buena copia del módulo CCP1 puesto en modo normal. La única diferencia significativa entre ellos es el funcionamiento en modo de comparación del módulo CCP2. La diferencia se refiere a la señal de reinicio del temporizador T1. Concretamente, si el convertidor A/D está habilitado, al igualarse los valores de los registros TMR1 y CCPR2, la señal de reinicio del temporizador T1 iniciará automáticamente la conversión A/D. Similar al módulo anterior, este circuito también está bajo el control de los bits del registro de control. Esta vez es el registro CCP2CON.
PROGRAMAS CCP
Descripción del módulo comparador del timer1
En ese programa se utiliza el timer1 como comparador, cabe destacar que se compara el valor introducido para timer1 con el valor introducido a CCPR1 todos registros de 16 bits, se le asignó a CCPR1: FF FF (máximo valor), y a timer1 00 01 con la finalidad de que tarden en igualarse en la mayor cantidad de tiempo posible para poderlo visualizar, pues esto ocurre muy rápido. La salida de esta igualdad viene dada por el pin CCP1 (de acuerdo a la configuración hecha, cuando son iguales=1, cuando son distintos=0; esta configuración se hace con CCP1CON, bits3-0), a este pin (ccp1) conecto un Led (color amarillo) que indica los cambios, (son iguales=1, son distintos=0) dado que ocurren muy rápido se conectó 4 leds al puerto b, con retardode 1 seg, los primeros dos led (color rojo) encienden cuando son iguales, y se apagan cuando son distintos, y los otros dos led (color verde) encienden cuando la comparación es distinta y se apagan cuando la comparación es igual.
codigo:
;EN ESE PROGRAMA SE UTILIZA EL TIMER1 COMO COMPARADOR,;CABE DESTACAR QUE COMPARA EL VALOR DEL TIMER1 CON EL VALOR DE CCPR1
;TODOS REGISTROS DE 16 BITS, SE LE ASIGNO A CCPR1:FF FF (MAXIMO VALOR), Y A TIMER1 00 01
;CON LA FINALIDAD DE QUE TRATEN EN IGUALARSE EN LA MAYOR CANTIDAD DE TIEMPO POSIBLE PARA PODERLO VISUALIZAR,
;PUES ESTO OCURRE MUY RAPIDO. LA SALIDA DE ESTA IGUALDAD VIENE DADA POR EL PIN CCP1 (DE ACUERDO
;A LA CONFIGURACION HECHA, CUANDO SON IGUALES=1, CUANDO SON DISTINTOS=0), A ESTE SE CONECTO UN
;LED QUE INDICA LOS CAMBIOS, DADO QUE OCURREN MUY RAPIDO SE CONECTO 4 LEDS AL PUERTO B, CON
;RETARDO DE 1 SE, LOS PRIMEROS DOS ENCIENDEN CUANDO SON IGUALES, Y LOS OTROS DOS ENCIENDES
;CUANDO LA COMPARACION NO ES IGUAL.
LIST p=16F887
INCLUDE <P16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
CONTA EQU 0x20
CONTB EQU 0x21
CONTC EQU 0x22
ORG 0x00
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISC
CLRF TRISB
CLRF TRISC
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
BANKSEL OPTION_REG
MOVLW 0x80;DESABILITA TIMER0
BANKSEL T1CON
MOVLW 0x01; SELECCION DEL HABILITA TIMER1
MOVWF T1CON
MOVLW 0x08; MODO COMPARACION: CCP1 SE PONE A 1, Y CUANDO TMR1=CCR1,Y
MOVWF CCP1CON;CCP1IF SE PONE A UNO
INICIO CLRF PORTB
MOVLW 0xFF
MOVWF CCPR1L;CARGA A LA PARTE BAJA DE CCPR
MOVLW 0xFF
MOVWF CCPR1H;CARGA A LA PARTE ALTA DEL CCPH
MOVLW 0x01
MOVWF TMR1L;CARGA A LA PARTE BAJA DE TIMER1
MOVLW 0x00
MOVWF TMR1H;CARGA A LA PARTE BAJA DE TIMER1
PRE BTFSS PIR1, CCP1IF; PREGUNTA POR BANDERA, SI SON IGUALES=1 SINO=0
GOTO RETAR1
MOVLW 0x0C
MOVWF PORTB
CALL RETARD
BCF PIR1, CCP1IF
GOTO INICIO
RETARD MOVLW d'100'
MOVWF CONTA
CICLO3 MOVLW d'80'
MOVWF CONTB
CICLO2 MOVLW d'60'
MOVWF CONTC
CICLO1 DECFSZ CONTC,F
GOTO CICLO1
DECFSZ CONTB,F
GOTO CICLO2
DECFSZ CONTA,F
GOTO CICLO3
RETURN
RETAR1 MOVLW 0x03
MOVWF PORTB
CALL RETARD
CLRF PORTB
GOTO PRE
END
Simulacion en proteus;
Descripción programa del modo captura del timer 1
Este programa consiste el utilizar el modo captura del timer1, es necesario señalar que este módulo consiste en conectar un evento externo en este caso un reloj de 4hz, al pin 2 del puerto c (ccp1), se configura el ccp1con, donde se indica el capture del timer1 asociado al evento externo. Se configuro para que cada 16 flancos ascendentes del evento externose capturara el valor del timr1, con ello se pone en 1 la bandera CCP1IF del registro PIR1 cuando esto ocurre se enciende un Led, conectado al pin0 del puertob, y se repite el proceso.
Cabe destacar que a una frecuencia de 4 hz, T=250msg, como la bandera se activa luego de 16 flancos ascendentes: 250msegx16=4seg; lo que indica que cada 4seg se levanta dicha bandera, pasa a encenderse el led, como esto ocurre muy rápido se hizo un retardo de 1 seg, para el encendido del led. Resumiendo: El led permanece apagado 4seg, se enciende 1 seg (porque se levantó la bandera) , se apaga 4 seg, y así sucesivamente.
codigo:
;ESTE PROGRAMA CONSISTE EL UTILIZAR EL MODO CAPTURA DEL TIMER1, ES NECESARIO
;SEÑALAR QUE ESTE MODULO CONSISTE EN CONECTAR UN EVENTO EXTERNO EN ESTE CASO UN RELOJ DE 4HZ,
;AL PIN 2 DEL PUERTO C (CCP1), SE CONFIGURA EL CCP1CON, DONDE SE INDICA EL CAPTURE DEL TIMER1
;ASOCIADO AL EVENTO EXTERNO. SE CONFIGURO PARA QUE CADA 16 FLANCOS ASCENDENTES DEL EVENTO EXTERNO
;SE CAPTURARA EL VALOR DEL TIMR1, CON ELLO SE PONE EN 1 LA BANDERA CCP1IF DEL REGISTRO PIR1
; CUANDO ESTO OCURRE SE ENCIENDE UN LED, CONECTADO AL PIN0 DEL PUERTOB, Y SE REPITE EL PROCESO.
LIST p=16F887
INCLUDE <P16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
CONTA EQU 0x20
CONTB EQU 0x21
CONTC EQU 0x22
ORG 0x00
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISC
CLRF TRISB
CLRF TRISC
BSF TRISC,2
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
BANKSEL OPTION_REG
MOVLW 0x80;DESABILITA TIMER0
BANKSEL T1CON
MOVLW 0x01; SELECCION DEL HABILITA TIMER1
MOVWF T1CON
MOVLW 0x07; OCURRE UN CAPTURE DEL TIMER1 CADA 16 FLANCOS
MOVWF CCP1CON;ACENDENTES DEL EVENTO EXTERNO
INICIO CLRF PORTB
PRO BTFSS PIR1, CCP1IF
GOTO PRO
BCF PIR1, CCP1IF
CLRF TMR1H
CLRF TMR1L
MOVLW 0x01
MOVWF PORTB
CALL RETARDO
GOTO INICIO
RETARDO MOVLW d'100'
MOVWF CONTA
CICLO3 MOVLW d'80'
MOVWF CONTB
CICLO2 MOVLW d'60'
MOVWF CONTC
CICLO1 DECFSZ CONTC,F
GOTO CICLO1
DECFSZ CONTB,F
GOTO CICLO2
DECFSZ CONTA,F
GOTO CICLO3
RETURN
END
Simulacion en proteus:
acá les dejo en link con los archivos de proteus y MPLAB listos para simular
Disculpa, en tu primer ejemplo que envia _CONFIG1 y _CONFIG2?
ResponderEliminar