Modulos ccp v2(ring telefono)

18
Módulos CCP ©ATE-Universidad de Oviedo 1 Módulos CCP ©ATE-Universidad de Oviedo 2 MÓDULO CCP (Captura/Comparación/PWM) Un microcontrolador de la gama media de los PIC16 puede tener hasta 2 módulos CCP. Cada módulo CCP tiene un registro de 16 bits que se puede utilizar de 3 formas distintas: 1. Como registro de 16 bits para captura de tiempo al producirse un evento. 2. Como registro de 16 bits para compararlo con el valor de cuenta del temporizador TMR1, pudiendo provocar un evento cuando se alcanza el valor contenido en este registro. 3. Como registro de 10 bits del ciclo de trabajo de una señal PWM generada por el microcontrolador. Los 2 módulos CCP disponibles se comportan casi idénticamente, salvo el caso del funcionamiento por disparo de evento especial (special event trigger) que tiene una pequeña diferencia si se trata del módulo CCP1 ó del módulo CCP2. Tras un reset, el módulo CCP está apagado (al forzar los bits de configuración al valor 0). En las siguientes transparencias se describirá el funcionamiento de CCP1. El funcionamiento de CCP2 es idéntico (salvo la excepción indicada anteriormente) pero cada uno tiene sus propios registros de carga y configuración (véase tabla adjunta).

Transcript of Modulos ccp v2(ring telefono)

Page 1: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo1

Módulos CCP

©ATE-Universidad de Oviedo2

MÓDULO CCP (Captura/Comparación/PWM)• Un microcontrolador de la gama media de los PIC16 puede tener hasta 2 módulos CCP.

• Cada módulo CCP tiene un registro de 16 bits que se puede utilizar de 3 formas distintas:

1. Como registro de 16 bits para captura de tiempo al producirse un evento.2. Como registro de 16 bits para compararlo con el valor de cuenta del temporizador

TMR1, pudiendo provocar un evento cuando se alcanza el valor contenido en este registro.

3. Como registro de 10 bits del ciclo de trabajo de una señal PWM generada por el microcontrolador.

• Los 2 módulos CCP disponibles se comportan casi idénticamente, salvo el caso del funcionamiento por disparo de evento especial (special event trigger) que tiene una pequeña diferencia si se trata del módulo CCP1 ó del módulo CCP2.

• Tras un reset, el módulo CCP está apagado (al forzar los bits de configuración al valor 0).• En las siguientes transparencias se describirá el funcionamiento de CCP1. El

funcionamiento de CCP2 es idéntico (salvo la excepción indicada anteriormente) pero cada uno tiene sus propios registros de carga y configuración (véase tabla adjunta).

Page 2: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo3

La siguiente tabla muestra qué temporizadores utiliza el módulo CCP en cada uno de sus modos de funcionamiento:

MÓDULO CCP (Captura/Comparación/PWM)

La siguiente tabla muestra las posibles interacciones entre los módulos CCP, donde CCPxes uno de los módulos y CCPy es el otro:

Módulos CCP

©ATE-Universidad de Oviedo4

CCPxCON -- CCP1CON (17h) Y CCP2CON (1Dh):Registros de control de cada módulo CCP

bit 7-6 No implementados: Leídos como ‘0’.

bit 5-4 DCxB1:DCxB0: Bits 0 y 1 del valor que fija el ciclo de trabajo en el modo PWM.

Modo Captura:No se usaModo Comparación:No se usaModo PWM:Estos bits son los 2 LSBs para el ciclo de trabajo. Los 8 bits más significativos están en CCPRxL.

bit 3-0 CCPxM3:CCPxM0: Bits de selección del modo de funcionamiento del módulo CCPx:0000= Captura/Comparación/PWM off(resetea el módulo CCPx) 0100= Modo Captura, cada flanco de bajada

0101= Modo Captura, cada flanco de subida0110= Modo Captura, cada 4 flancos de subida0111= Modo Captura, cada 16 flancos de subida1000= Modo comparación, el pin CCPx se pone a “1” cuando TMR1 alcanza el valor del registro de 16 bits (CCPRxH:CCPRxL). El bit CCPIF se pone a 1.1001= Modo comparación, el pin CCPx se pone a “0” cuando TMR1 alcanza el valor del registro de 16 bits (CCPRxH:CCPRxL). El bit CCPIF se pone a 1. 1010= Modo comparación, generación de interrupción software cuando se produce la igualdad. CCPIF se pone a 1. El pin CCPx no se ve afectado.1011= Modo comparación, generación de disparo de evento especial (special event trigger). CCPIF se pone a 1. El pinCCPx no se ve afectado. CCP1 resetea el TMR1; CCP2 resetea el TMR1 y lanza una conversión A/D nueva (si el módulo del conversor A/D está habilitado.11xx= modo PWM

Page 3: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo5

MODO CAPTURA• En modo Captura, los registros CCPRxH:CCPRxL toman el valor de 16 bits que tenga el TMR1cuando se produce un determinado evento en el pin CCPx (RC2/CCP1 para el módulo CCP1 y RC1/T1OSI/CCP2 para el módulo CCP2). Los posibles eventos son:

• Cada flanco de bajada.• Cada flanco de subida.• Cada 4 flancos de subida.• Cada 16 flancos de subida.

El evento se configura con los bits CCPxM3:CCPxM0 de los registros CCP1CON y CCP2CON respectivamente.• El bit CCP1IF (PIR1<2>) ó CCP2IF (PIR2<0>) se ponen a “1” cuando se produce el eventoconfigurado, pudiendo provocar un salto a la rutina de interrupción. El correspondiente flag debe limpiarse por software.• Si se produce otra captura antes de que se lea el valor del registro CCPRx, el último valor sobreescribe el valor anterior (que se pierde).

• En modo captura, el pin RC2/CCP1 y/o el pin RC1/T1OSI/CCP2 deben configurarse como entrada por puesta a uno de los bits TRISC<2> y TRISC<1> respectivamente. Si el bit RC2/TRISC1 y/o RC1/CCP2 se configura como salida, una escritura a este pin del puerto podría originar una captura.

¿ Cuenta ?

Módulos CCP

©ATE-Universidad de Oviedo6

Prescaler÷ 1 , 4 , 16

Detección deflanco y

CCPRxH CCPRxL

TMR1H TMR1L

CCPxCON<3:0>Qs

CCPxIF ← 1

RCy

/ CC

Px

Captura

T1SYNC

Reloj internoT1CKPS1:T1CKPS0

TMR1ONOn/off

TMR1CS

Prescaler1 , 2 , 4 , 8

Entrada de reloj

sincronizada

2

Detección desincronización

1

0

fOSC/4Reloj

interno

0

1

T1OSCENHabilitaoscilador

T1O

SC

RC0T1OSOT1CKl

RC1T1OSICCP2

Módulo CCP

Módulo TMR1

MODO CAPTURA:Hay que configurar

módulo CCPy

módulo TMR1

Page 4: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo7

MODO CAPTURA• FUNCIONAMIENTO DEL TMR1 PARA EL MODO CAPTURA: El TMR1 debe estar corriendo en modo temporizador ó en modo contador síncrono para que el módulo CCP produzca la comparación. No puede funcionar en modo contador asíncrono.

• CAMBIO ENTRE MODOS CAPTURA: Si se cambia de un modo captura (p.e. de 4 flancos) a otro (p.e. de cada flanco), el cambio puede generar una falsa interrupción. El usuario debe por software limpiar el bit CCPxIE para deshabilitar las interrupciones, limpiar el flag CCPxIF y luego cambiar el modo de captura. El cambio entre dos modos captura debe realizarse según el siguiente subprograma:

CLRF CCP1CON ; Apaga el módulo CCPMOVLW NEW_CAPT_PS ; Preparo en W el nuevo prescaler y preparo CCP ONMOVWF CCP1CON ; Cargo CCP1CON el valor

• CONTADOR DE FLANCOS DEL CCP (PRESCALER DEL CCP): Si en medio de una cuenta de 4 ó 16 flancos de subida se apaga el módulo CCP o se pasa a un modo que no sea el modo Captura (mediante los bits CCPxM3:CCPxM0), el prescaler del CCP se resetea.

• FUNCIONAMIENTO EN MODO DORMIDO: En modo dormido, el TMR1 no se incrementa (esta en modo síncrono ó temporizador). Pero, el prescaler del CCP sí puede continuar incrementando el contador de eventos y cuando llega al valor configurado pone el bit CCPxF a “1” provocando que el micro se “despierte”. No obstante, el contenido del TMR1 se transfiere a los CCPR pero el TMR1 no se ha visto incrementado y por tanto, el valor cargado no tiene un significado dado.

Módulos CCP

©ATE-Universidad de Oviedo8

EJEMPLO DE INICIALIZACIÓN EN MODO CAPTURACLRF CCP1CON ; Módulo CCP1 OFFCLRF TMR1H ; limpio TMR1HCLRF TMR1L ; limpio TMR1LCLRF INTCON ; Deshabilito interrupciones BSF STATUS, RP0 ; Banco 1BSF TRISC, CCP1 ; Pin RC2/CCP1 entrada CLRF PIE1 ; Deshabilito interrupciones de periféricosBCF STATUS, RP0 ; Banco 0CLRF PIR1 ; limpio flags de interrupciones de periféricosMOVLW 0x06 ; Modo captura, cada 4º flanco de subidaMOVWF CCP1CON ;BSF T1CON, TMR1ON ; Timer 1 ON

; En este ejemplo no usamos la interrupciones del CCP1; se muestrea el flag de CCP para detectar cuándo se produce una captura; Si se quisiera utilizar interrupciones habría que habilitarlas en el proceso de ; inicialización; Evento que provoca una capturaEvento_captura

BTFSS PIR1, CCP1IFGOTO Evento_captura

;; Si llegamos aquí es que se han producido 4 flancos de subida en el pin CCP1;

BCF PIR1, CCP1IF ; Se debe limpiar el flag para una nueva comparación

Page 5: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo9

REGISTROS ASOCIADOS CON EL MÓDULO CCP EN MODO CAPTURA

Módulos CCP

©ATE-Universidad de Oviedo10

MODO COMPARACION

• En modo comparación, el valor de 16 bits almacenado en los registros CCPRx es comparado continuamente con el valor de los registros del TMR1. Cuando se produce una igualdad, el pinCCPx puede experimentar o no un evento, que puede ser:

• Puesta a “1”.• Puesta a “0”.• Sin cambio.

• El evento viene fijado por el valor de los bits CCPxM3:CCPxM0 (CCPxCON<3:0>) (véase 4ª transparencia de esta presentación).

• Al mismo tiempo que se produce un evento en el pin se puede producir una interrupción ya que el flag CCPxIF (de PIR1 ó PIR2) se pone a “1”.

• TMR1 debe estar funcionando en modo temporizador ó modo contador síncrono para que el módulo CCP funcione correctamente en el modo comparación. En modo contador asíncrono, el modo comparación no funciona.

Page 6: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo11

Q S

R

Lógica desalida

CCPRxH CCPRxL

TMR1H TMR1LCCPxCON<3:0>

TRISC<2>

CCPxIF ← 1

RCy / CCPxCoincidencia

Comparador

Lanza acciónespecial

T1SYNCReloj internoT1CKPS1:T1CKPS0TMR1CS

Prescaler1 , 2 , 4 , 8

2

Detección desincronización

1

0

fOSC/4Reloj

interno

T1OSCENHabilitaoscilador

T1O

SC

RC0T1OSOT1CKl

RC1T1OSICCP2

1

0

TMR1ONOn/off

Módulo CCP

Módulo TMR1

Configuraciones para modo Comparación

Módulos CCP

©ATE-Universidad de Oviedo12

MODO COMPARACION

• CONFIGURACION DEL PIN CCPx PARA MODO COMPARACION: El pin CCPx que quiera verse modificado debe configurarse como salida, limpiando el bit del registro TRISC correspondiente. En el momento que se selecciona el modo de comparación deseado, el pin CCP se pone al nivel contrario al que tiene que cambiar cuando se produzca la igualdad entre los registros CCPRx y TMR1. Si la igualdad no afecta al pin CCPx, este tendrá el valor que se le haya dado previamente en el registro PORTC.

• MODO INTERRUPCION SOFTWARE: En este modo, el pin CCPx no se ve afectado, solo se activará al flag CCPxIF a 1 y se generará la interrupción si está habilitada.

• MODO DISPARO DE EVENTO ESPECIAL: Cuando se produce la igualdad, el registro TMR1 se resetea convirtiéndose por tanto, en un registro que marca la periodicidad del evento. En el caso del módulo CCP2, además de resetear el TMR1 se lanza una nueva conversión A/D (si el módulo de conversión A/D está activo) permitiendo programar la conversión A/D a periodos de tiempo fijos.

• FUNCIONAMIENTO EN MODO DORMIDO: Al no funcionar el TMR1 (modo síncrono) en modo dormido, el módulo CCP en modo comparación no funciona. El pin CCPx tendrá el valor que tenía antes de entrar en modo SLEEP y “despertará” con ese valor.

• TRAS UN RESET: El módulo CCP está apagado.

Page 7: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo13

EJEMPLO DE INICIALIZACIÓN EN MODO COMPARACIONCLRF CCP1CON ; Modulo CCP1 OFFCLRF TMR1H ; limpio TMR1HCLRF TMR1L ; limpio TMR1L

;aquí podriamos cargar el valor de la comparación en CCPR1H y CCPR1LCLRF INTCON ; Deshabilito interrupciones BSF STATUS, RP0 ; Banco 1BCF TRISC, CCP1 ; Pin RC2/CCP1 SALIDA CLRF PIE1 ; Deshabilito interrupciones de perifericosBCF STATUS, RP0 ; Banco 0CLRF PIR1 ; limpio flags de interrupciones de periféricosMOVLW 0x08 ; Modo comparación, a 1 el pin CCP1 cuando se iguale MOVWF CCP1CON ;BSF T1CON, TMR1ON ; Timer 1 ON

; En este ejemplo no usamos la interrupciones del CCP1; se muestrea el flag de CCP para detectar cuando se produce la igualdad de la comparación; Si se quisiera utilizar interrupciones habría que habilitarlas en el proceso de inicializaciónEvento_comparacion

BTFSS PIR1, CCP1IFGOTO Evento_comparación

;; Si llegamos aquí es que se ha producido una igualdad entre TMR1 y CCP1RH:CCP1RL;

BCF PIR1, CCP1IF ; Se debe limpiar el flag para una nueva comparación

Módulos CCP

©ATE-Universidad de Oviedo14

REGISTROS ASOCIADOS CON EL MÓDULO CCP EN MODO COMPARACIÓN

Page 8: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo15

MODO PWM• En modo PWM (MODULACIÓN DE ANCHO DE PULSO - Pulse Width Modulation), el objetivo es obtener a través de alguna de las patillas CCPx una forma de onda como la mostrada en la figura donde tanto el periodo como el ciclo de trabajo (Duty cycle) puede variar con el objetivo, por ejemplo, de regular la velocidad de un motor, la luminosidad de una bombilla, etc.

• El periodo de la señal viene fijado por la configuración de TMR2 y por el contenido del registro PR2 (0x92). Este registro de 8 bits contiene los 8 bits más significativos de una cuenta de 10 bits.

• El ciclo de trabajo o ciclo útil (duty cycle) viene definido por el contenido del valor del registro CCPRxL junto con los bits CCP1CON<5:4> antes de comenzar un nuevo periodo.

•El temporizador base con el que se compara el contenido de estos registros es el TMR2.

TMR2 = 0

TMR2 = PR2

TMR2 = D

T

D

Módulos CCP

©ATE-Universidad de Oviedo16

MODO PWM• PERIODO DE LA ONDA PWM:

Se calcula utilizando la siguiente fórmula:

Cuando TMR2 es igual a PR2, en el siguiente incremento de ciclo se producen tres acciones:

• El TMR2 se resetea.

• El pin CCPx se pone a 1. Salvo si el ciclo de trabajp esta fijado a 0 donde el pin CCPx no se pondrá a 1 nunca (el biestable RS es de borrado prioritario).

• El nuevo ciclo de trabajo es cargado desde el registro CCPRxL al registro CCPRxH que es el que realmente se compara con el TMR2 para fijar el ciclo ce trabajo.

T = (PR2 + 1) · 4 · TOSC · PRESCALERTMR2

Page 9: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo17

MODO PWM

CICLO DE TRABAJO DE LA ONDA PWM:• El ciclo de trabajo viene definido por el valor que se carga en el registro CCPR1L (8bits más significativos) junto con los bits CCP1CON<5:4> (2 bits menos significativos). Por tanto se consigue una resolución de 10 bits (DCxB9:DCxB0). La siguiente ecuación se utiliza para calcular el ciclo de trabajo (duty cycle) de la onda PWM:

• Los registros CCPR1L y los bits CCP1CON<5:4> pueden escribirse en cualquier instante de tiempo, pero no se cargan en CCPR1H y por tanto, no tiene efecto, hasta que finalice el periodo de la onda PWM actual.

• Si el ciclo de trabajo de la onda PWM es mayor que el periodo, la señal que sale por la patilla CCPx está siempre a 1.

T ON = (CCPRxL:CCPxCON<5:4>) · TOSC · PRESCALERTMR2

Módulos CCP

©ATE-Universidad de Oviedo18

TRISC<y>

RCy

/ CC

Px

R Q

S

CCPRxL

CCPxCON<5:4>

TMR2 ← 0CCPx ← 1 (si D≠0)CCPRxH ← CCPRxL

(*) TMR2 se concatena conun reloj interno de 2 bitscon frecuencia fosc parapoder crear una base detiempos de 10 bits

Registros de Duty Cycle

Comparador

TMR2 (*)

Comparador

PR2

CCPRxH (esclavo)

T2CKPS1:T2CKPS0

Prescaler1 , 4 , 16

2

fOSC/4Reloj

interno

Configuraciones para MODO PWM

Módulo CCP

Módulo TMR2

El postscaler de TMR2 no se utilizapara determinar la frecuencia PWM

pero sí se puede emplear para contar periodos completos de esa señal

Page 10: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo19

MODO PWM• La máxima resolución (máximo nº de bits que resultan útiles para definir el ciclo de trabajo) que se puede obtener para una onda PWM generada en este módulo viene dada por la siguiente fórmula:

• La siguiente tabla muestra frecuencias y resoluciones que se pueden obtener con un oscilador de 20 MHz

• La máxima resolución (en tiempo) viene fijada por el prescaler escogido para el TMR2:

( )bits

2log

log

Res 2 ⎟⎟⎠

⎞⎜⎜⎝

⎛⋅

= TMRPWMosc

PSf

f

Nmax * Tosc * Prescaler TMR2 = 1/fPWM

Módulos CCP

©ATE-Universidad de Oviedo20

MODO PWMPasos para configurar el módulo CCP para funcionar en modo PWM:

1. Definir el periodo de la onda PWM escribiendo en el registro PR2.2. Definir el ciclo de trabajo (tiempo en estado alto) escribiendo en los registros

CCPRxL y en los bits CCPxCON<5:4>.3. Definir el pin CCPx como salida, poniendo a “0” el bit TRISC<2> (para CCP1) y/o

el bit TRISC<1> (para CCP2).4. Seleccionar el valor del prescaler del TMR2 y habilitar el TMR2 por puesta a 1

del nit TMR2ON (T2CON<2>).5. Configurar el módulo CCP1 para funcionar en modo PWM

En modo SLEEP, el TMR2 no se incrementa y por tanto el estado del módulo CCP no cambia. Si el pin CCPx está a un determinado nivel (0 ó 1) cuando se ejecuta la instrucción SLEEP, el pin continuará en ese valor y se despertará con ese valor.No se puede generar una onda periódica en esa situación

Page 11: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo21

Ejemplo:

Cálculo de PR2 para obtener una onda PWM cuya frecuencia sea de 78,125 kHz. La Fosc es de 20 MHz y el prescaler del TMR2 = 1.

1/78,125kHz = [(PR2)+1] * 4 * 1/20MHz * 112,8us = [(PR2)+1] * 4 * 50ns * 1 PR2 = 63

Encontrar la máxima resolución del ciclo de trabajo que puede usarse con una frecuencia PWM de 78,125 KHz y un oscilador de 20 MHz

TPWM = 2N * TOSC 1/78,125kHz = 2N * 1/20MHz * 1 12,8 us = 2N * 50 ns * 1256 = 2N N= 8

MODO PWM

Por tanto, un ciclo de trabajo con una resolución de 8 bits es la que se obtiene si se quiere obtener una onda PWM de 78,125 kHz de frecuencia con un oscilador de 20 MHz.

Es decir los valores a cargar para el ciclo de trabajo estan en el margen 0 ≤DCxB9:DCxB0 ≤ 255. Cualquier valor mayor de 255 provocará que el ciclo de trabajo sea del 100% del periodo de la onda PWM.

La resolución será mayor si la frecuencia de la onda PWM es menor. Si la frecuencia crece, la resolución decrece.

Módulos CCP

©ATE-Universidad de Oviedo22

EJEMPLO DE INICIALIZACIÓN EN MODO PWM; Suponemos T2CON a 00h, por tanto, prescaler a 1 y apagado. Suponemos oscilador de 20 MHz

CLRF CCP1CON ; Módulo CCP offCLRF TMR2 ; limpio Timer2MOVLW 0x7F ; PR2 = 7Fh = 127MOVWF PR2 ; PeriodoPWM= (127 + 1) * 4 * 50ns * 1 = 25,6 usMOVLW 0x1F ; 8 bits altos del registro del duty a b’00011111’MOVWF CCPR1L ; CLRF INTCON ; Deshabilito interrupcionesBSF STATUS, RP0 ; Banco 1BCF TRISC, PWM1 ; Pin RC2/CCP1 salida PWMCLRF PIE1 ; Deshabilito interrupciones de periféricosBCF STATUS, RP0 ; Banco 0CLRF PIR1 ; Limpio flags de periféricosMOVLW 0x2C ; modo PWM, 2 LSBs del duty a b’10’MOVWF CCP1CON ; registro del duty b’0001111110’ = 126d

;por tanto duty = 126 * 50ns * 1 = 6,3 us 6,3us/25,6us = 24,6% de dutyBSF T2CON, TMR2ON ; Timer2 ON;; La interrupción de CCP1 no está activa en este modo PWM; el final del periodo se detecta por muestreo del TMR2IF;

Periodo_PWMBTFSS PIR1, TMR2IFGOTO Periodo_PWM

;OJO, solo se detecta el final del periodo si el postscaler del TMR2 está a 1:1BCF PIR1, TMR2IF

En el modo PWMlos flags CCP1IFy CCP2IF no se

utilizan

Page 12: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo23

REGISTROS ASOCIADOS CON EL MÓDULO CCP EN MODO PWM

Módulos CCP

©ATE-Universidad de Oviedo24

Características eléctricas del módulo CCP

Entrada en modo captura

Salida en modo comparación o PWM

Page 13: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo25

Ejemplo de uso del módulo CCP – modo PWMpara la generacion de un “ring” de llamada telefónica

Se trata de realizar el diseño del programa encargado de generar el “ring de llamada de un teléfono”. Para eso empleamos el módulo CCP1 de un PIC16F877 y la placa de prácticas que dispone de un zumbador cuyo esquema eléctrico aparece a continuación (el jumper J9 debe estar puesto).

Se emplea un oscilador de 4MHz para el microcontrolador.

Módulos CCP

©ATE-Universidad de Oviedo26

GENERACION DE UN RING TELEFÓNICO

320Hz....Silencio480Hz320Hz......480Hz320Hz480Hz320Hz

25ms25ms25ms25ms25ms25ms25ms25ms

1s(sonido)

2s1s (sonido)

El timbre de llamada consistirá en un intervalo de 1s de sonido (en el que se van alternando dos tonos de 320Hz y de 480Hz durante 25mscada uno), seguido de un intervalo de silencio de 2s y así sucesivamente.

Page 14: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo27

Planteamiento:

Se utiliza el módulo CCP1 en modo PWM para generar dos ondas cuadradas con frecuencias de emisión 320Hz y 480Hz. Para reducir armónicos, se hace que éstas ondas sean cuadradas (t en estado alto = t en estado bajo)

Se utiliza el temporizador TMR0 para temporizar intervalos de 25ms, mediante interrupción. Un segundo se contabiliza por 40 interrupciones de TMR0 y 2 segundos por 80 interrupciones de TMR0.Cuando entra una interrupción, se evalúa el estado actual y las posibles modificaciones en el mismo de acuerdo con el siguiente diagrama de estados:

GENERACION DE UN RING TELEFÓNICO

Estado 0Silencio

CCP1 inactivo

Estado 1PWM generando 320Hz

80 interrupciones deTMR0 (2s) en Estado 0

Estado 2PWM generando 480Hz

Interrupción de TMR0(25µs)

Interrupción de TMR0(25µs)

40 interrupciones deTMR0 (1s) en Estados 1

ó 2

Módulos CCP

©ATE-Universidad de Oviedo28

Cálculos: Modo PWM

Frecuencia: 1/frecuencia = (4/fosc) * Prescaler TMR2 * (PR2+1)

Con fosc=4MHzPrescaler TMR2 = 16 (elegido)Resulta: para 320Hz PR2= 194 (0xC2)

para 480Hz PR2=129 (0x81)

Ancho de pulso (tiempo en estado alto):1/(2*frecuencia) = (1/fosc) * Prescaler TMR2 * (CCPR1L+2bits)Tomamos los 2 bits de menor peso a ceroResultando: para 320Hz CCPR1L = 97 (0x61)

para 480Hz CCPR1L = 65 (0x41)

TMR0:Para temporizar 25ms = (4/fosc) * Prescaler TMR0 * (256-Precarga)Resulta: Precarga = 158 (0x9E)

GENERACION DE UN RING TELEFÓNICO

Page 15: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo29

Algoritmo utilizado –PROGRAMA PRINCIPAL:

•INICIALIZACIÓN

•Puertos: PORTC con RC2 como salida•TMR0 como temporizador y prescaler de 256•Carga de PR2 para generar 320Hz (0xC2)•CCP1 en modo PWM•TMR2 con prescaler de 16•Inicializamos variable ESTADO con código de onda de 320Hz•Ponemos a cero CONTADOR de interrupciones•Cargamos registro de ancho del pulso (duty) CCPR1L (0x61)•Precarga de TMR0 para desbordar tras 25ms (0x9E)•Borramos flag T0IF y activamos interrupciones de TMR0 •Ponemos en marcha TMR2

•BUCLE PRINCIPAL INFINITO (Del que sólo se saldrá por interrupción debida a TMR0)

GENERACION DE UN RING TELEFÓNICO

Módulos CCP

©ATE-Universidad de Oviedo30

INICIO bsf STATUS,RP0 ;Paso al banco 1bcf TRISC,2 ;Defino pin RC2/CCP1 como salida

; Para temporizar 25ms con TMR0: 25ms = (4/4MHz)* 256 * (256-158); precarga de TMR0: 158 (0x9E)

movlw b'00000111' ;TMR0 modo temporizadormovwf OPTION_REG ;y prescaler de 256

; 1/320Hz = (PR2+1)* Prescaler_TMR2 (=16) * 4/4MHz ---> PR2= 194 (0xC2)movlw 0xC2 ;Cargo PR2 para 320Hzmovwf PR2 ;aprovecho que estamos en banco 1

bcf STATUS,RP0 ;Vuelvo al banco 0movlw b'00001111' ;Definimos CCP1movwf CCP1CON ;en modo PWMmovlw b'00000011' ;Defino TMR2 con prescaler 16movwf T2CON ;y parado al principiomovlw 0x01 ;Inicializo señal PWM de f=320Hzmovwf ESTADO ;en variable ESTADOclrf CONTADOR ;Pongo a 0 contador de interrupciones

; Registro de duty: 1/(2*320Hz)=(CCPR1L_2bits) * PrescalerTMR2 * 1/4MHz ; CCPR1L=97 (0x61)

movlw 0x61 ;Cargo registro de dutymovwf CCPR1L ;para ton = 1/(2*320Hz)

movlw 0x9E ;Precargo TMR0movwf TMR0 ;para que desborde tras 25ms

movlw b'10100000' ;Pongo a 0 flag de TMR0 y activo movwf INTCON ;sus interrupcionesbsf T2CON,TMR2ON ;Pongo en marcha TMR2

BUCLE goto BUCLE ;Bucle infinito en espera de interrupción

Page 16: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo31

Algoritmo utilizado para Tratamiento de INTERRUPCION:

Se comprueba que T0IF=1 si no está a 1, salimos de inmediatoSalvamos el contexto del programa ppal. (W y STATUS)Precargamos TMR0 puesto que desbordóIncrementamos CONTADOR de interrupcionesVerificamos ESTADO actual para evaluar posibles cambiosSi ESTADO==0 (silencio) y CONTADOR == 80 (2s)

ponemos CONTADOR a cerocambiamos ESTADO a 1 (onda de 320Hz)activamos módulo CCP en PWMcargamos PR2 y CCPR1L adecuadamente para 320Hz

Si ESTADO ==1 (onda 320Hz)cambiamos ESTADO a 2 (onda de 480Hz)cargamos PR2 y CCPR1L adecuadamente para esa frecuencia

Si ESTADO ==2 (onda 480Hz)cambiamos ESTADO a 1 (onda de 320Hz)cargamos PR2 y CCPR1L para generar 320Hz

Si ESTADO era 1 ó 2Si CONTADOR ==40 (ha pasado 1s emitiendo)

ponemos CONTADOR a cerocambiamos ESTADO a 0 (silencio)desactivamos CCP2

Ponemos a cero el flag de TMR0 (T0IF)Recuperamos contexto del programa ppal. (W y STATUS)Retornamos del programa de tratamiento de interrupción

Módulos CCP

©ATE-Universidad de Oviedo32

PTI btfss INTCON,T0IF ;Si entramos aquí por otro motivoretfie ;distinto a T0IF=1 salimos de inmediato

movwf W_temp ;Salvamos el registro Wswapf STATUS,W ;y el registro STATUS pormovwf ST_temp ;si acaso se manipulan para el principalmovlw 0x9E ;Precargamos de nuevo TMR0movwf TMR0 ;para otros 25msincf CONTADOR,F ;Incrementamos el Contador de 25ms

;Ahora miramos en qué estado estábamosmovf ESTADO,F ;Comparamos ESTADO con 0btfsc STATUS,Zgoto SILENCIO ;Si era el 0 es de Silencio

movf ESTADO,W ;Comparamos ESTADO con 0x01xorlw 0x01btfsc STATUS,Zgoto A_320Hz ;Si era el 1 estaba a 320HZ

movf ESTADO,W ;Comparamos estado con 2xorlw 0x02btfsc STATUS,Zgoto A_480Hz ;Si era el 2 estaba a 480Hzgoto SALIR_PTI ;Si no era ninguno de los conocidos salimos

RUTI

NA

DE

INTE

RRU

PCIO

N

Page 17: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo33

SILENCIOmovf CONTADOR,W ;Si el ESTADO era de Silencio, salimosxorlw d'80' ;al cabo de 2s (80 interrupciones)btfss STATUS,Zgoto SALIR_PTI ;si no llegamos a 80 salimos sin cambiarclrf CONTADOR ;si ya pasaron 2s borramos contadormovlw 0x01 ;y cargamos 0x01 para codificar elmovwf ESTADO ;paso a ESTADO de 320Hz

movlw b'00001111' ;Activamos el módulo CCP en modo PWMmovwf CCP1CON ;de nuevo si había que cambiar

bsf STATUS,RP0movlw 0xC2 ;Cargo PR2 para 320Hzmovwf PR2 ;PR2 está en banco 1bcf STATUS,RP0

movlw 0x61 ;Cargo también registro de dutymovwf CCPR1L ;para ton = 1/(2*320Hz)

goto SALIR_PTI ;Vamos a salir de la interrupción

RUTI

NA

DE

INTE

RRU

PCIO

N

Módulos CCP

©ATE-Universidad de Oviedo34

A_320Hz movlw 0x02 ;El Estado era de generar ondamovwf ESTADO ;de 320Hz, tenemos que cambiar a 480Hz

; 1/480Hz = (PR2+1)* Prescaler_TMR2 (=16) * 4/4MHz ---> PR2= 129 (0x81)

bsf STATUS,RP0movlw 0x81 ;Precarga de PR2 para 480Hzmovwf PR2bcf STATUS,RP0

; Registro de duty: 1/(2*480Hz)=(CCPR1L_2bits) * PrescalerTMR2 * 1/4MHz ; CCPR1L=65 (0x41)

movlw 0x41 ;Cargamos el Ton tambiénmovwf CCPR1L ;para la mitad del periodogoto FIN_TONOS

A_480Hz movlw 0x01 ;El Estado era generando onda de 480Hzmovwf ESTADO ;hay que cambiar de Estado a 320Hz

bsf STATUS,RP0movlw 0xC2 ;Modificamos PR2 para 320Hzmovwf PR2bcf STATUS,RP0

movlw 0x61 ;Cargamos también Tonmovwf CCPR1L

RUTI

NA

DE

INTE

RRU

PCIO

N

Page 18: Modulos ccp v2(ring telefono)

Módulos CCP

©ATE-Universidad de Oviedo35

FIN_TONOS ;Parte final común de emisiónmovf CONTADOR,W ;Comparamos contador con 40xorlw d'40' ;para ver si ha pasado ya 1 segundobtfss STATUS,Zgoto SALIR_PTI ;Si no hemos llegado, salimosclrf CONTADOR ;si ya hemos llegado ponemos a 0 CONTADORclrf ESTADO ;pasamos a estado de Silenciobcf PORTC,1 ;y anulamos salidaclrf CCP1CON ;Desactivamos el módulo CCP2 en silencio

SALIR_PTIbcf INTCON,T0IF ;ponemos a cero el flag para la sig. interrupción

swapf ST_temp,W ;Recuperamos el registro STATUS con un SWAPFmovwf STATUSswapf W_temp,F ;Recuperamos también el W con dos SWAPFswapf W_temp,W

retfie ;Retornamos de programa de tratamiento de ;interrupción

RUTI

NA

DE

INTE

RRU

PCIO

N