Compare Capture PWM mode Compare Capture PWM mode Compare Capture PWM mode Compare Capture PWM mode El modulo CCP se puede configurar en tres maneras: Comparador Captura PWM El modulo incluye también el TIMER1 y TIMER3 es un registro de control para establecer de funciones lógicas (Conocido como CCP) que aumentan la operación de los TIMERS y puede simplificar tus aplicaciones. Este hardware podría permitirte hacer múltiples funciones para ejecutar al mismo tiempo. Si el microcontrolador tiene 2 CCP, entonces uno es conocido como CCP1 y el otro como CCP2. Si tenemos dos módulos entonces todos los registros están identificados con el CCP1 o CCP2. Modo Captura El primer modulo Captura que es usado para funciones de repetición para el tiempo o para determinar el ancho de pulso. Se debe de configurar que tipo de flaco de debe de detectar y que timer usar para copiar el contenido del TIMER al registro de CCPxL (bajo byte) CCPxH (Alto byte). Diagrama de Operación en Modo Captura Un ejemplo sencillo es como se muestra en el diagrama siguiente: El timer empezara a incrementar hasta llegar a su valor de desbordamiento, si hemos configurado nuestro canal CCP en modo captura
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
MicroCursos | Curso de Hi tech Compiler For PIC18 45
//Variable Globales // ////////////////////////////// unsigned int valor1; unsigned int valor2; unsigned int result; unsigned char flag; unsigned char buffer[2]; ////////////////////////////// //FUNCION DE 1 SEG // ////////////////////////////// void DELAY1S(void){ unsigned char time; for(time=0;time<100;time++){ __delay_ms(10); } } ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ if(CCP2IF && CCP2IE){ CCP1IE=0; CCP2IF=0; valor1=ReadCapture1(); valor2=ReadCapture2(); result=valor2-valor1; flag=1; } if(CCP1IF && CCP1IE){ CCP2IE=1; } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// /////////////////// // Configuracion de Puertos /// /////////////////////////////////////////////////// /////////////////// TRISC=0x86; /*---------------------Fin de Conf. Puertos-------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de Timer1 /// /////////////////////////////////////////////////// /////////////////// OpenTimer1(TIMER_INT_OFF &//Interrupcion De sactivada T1_16BIT_RW &//valor de 16 bit T1_SOURCE_INT &//Corriente desde el oscilador principal T1_PS_1_1 &//Preescalar de 1
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 46
T1_OSC1EN_OFF & T1_SYNC_EXT_OFF & T1_SOURCE_CCP); //Sincronismo desactivado /*---------------------Fin de Conf. TIMER1--------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuración de CCP1 (Captura) /// /////////////////////////////////////////////////// /////////////////// OpenCapture1(CAPTURE_INT_ON & //Interrupción Desac tivada C1_EVERY_RISE_EDGE);//Cada elevación /*---------------------Fin de Conf. CCP1----------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de CCP2 (Captura) /// /////////////////////////////////////////////////// /////////////////// OpenCapture2(CAPTURE_INT_OFF & //Interrupcion Acti vada C2_EVERY_FALL_EDGE);//Cada CAIDA /*---------------------Fin de Conf. CCP2----------- -----------------*/ /////////////////////////////////////////////////// //////////////////// // Configuración del USART /// /////////////////////////////////////////////////// //////////////////// OpenUSART(USART_TX_INT_OFF &//Interrupción por Tr ansmisión apagado USART_RX_INT_OFF &//Interrupción por Recepció n Apagado USART_ASYNCH_MODE &//Modo Asincronico USART_EIGHT_BIT &//8-bit de transmision USART_CONT_RX &//Recepcion Continua USART_BRGH_HIGH, //Alta velocidad de baudios 25); //para alta Velocidad: // FOSC / (16 * (spbrg + 1)) // spbrg=(FOS/baud*16)-1 //Para baja Velocidad: // FOSC / (64 * (spbrg + 1)) /*---------------------Fin de Conf. USART---------- ------------------*/ WriteTimer1(0); GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICOS while(1){ if(flag){ DELAY1S(); buffer[0]=result&0xFF; buffer[1]=(result>>8)&0xFF; WriteUSART(buffer[0]); WriteUSART(buffer[1]); WriteTimer1(0); flag=0; CCP1IE=1; } } }
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 47
El circuito a manejar es el siguiente:
Al armar nuestro circuito procure primero
conectar el software, y después alimente el
circuito ya conectado a la entrada del serial y
listo.
Si usted no tiene un puerto Serial puede
adquirir un cable de USB-SERIAL para simular un
puerto Serial en una entrada de USB, es muy
eficiente realizar eso, ya que últimamente las
computadoras portátiles no tienen este puerto
de comunicación.
También es muy eficiente realizar
un circuito impreso del MAX232
para hacer enlaces más rápido, en
lugar de armar la conexión en el
protoboard todas las veces
necesarias, si realizamos esto
podemos ahorrar mucho tiempo
para hacer la práctica.
Al realizar la
práctica usted
verá en el
software el
tiempo que
corresponde
al acho de
pulso.
Esto Puede ser
en ‘mS’ o ‘uS’.
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 48
Modo PWM
Esta configuración del CCP en modo PWM, nos
proporciona un control del ancho de pulso a
una frecuencia muy estable más que usar
timers para realizar dicha acción.
El uso es muy sencillo cada canal CCP se debe
de configurar primero a la frecuencia deseada,
si se cuenta con más canales CCP cada uno de
ellos debe de tener la misma frecuencia lo único
que se puede cambiar individualmente es su
ancho de pulso.
Antes de entrar a la configuración del canal
PWM se debe de definir el timer2.
Este TIMER proporciona la frecuencia deseada
dependiendo del prescalar y postescalar.
La función de configuración del timer2 es la
siguiente:
OpenTimer2(unsigned char config);
Config puede tener los siguientes parámetros
separados por un ‘&’.
Establecer interrupción por TIMER2.
TIMER_INT_ON
TIMER_INT_OFF
Valor de Prescalar:
T2_PS_1_1
T2_PS_1_4
T2_PS_1_16
Valor postesclar:
T2_POST_1_1
T2_POST_1_2
...
T2_POST_1_15
T2_POST_1_16
Después que configuramos el TIMER2, ya
podemos poner la función de configuración del
PWM.
OpenPWM1(char period); Period puede ser cualquier valor de 0x00 a 0xFF. Para calcular el periodo se requiere la siguiente
MicroCursos | Curso de Hi tech Compiler For PIC18 50
//Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){} ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// //////////////////// // Configuracion del TIMER2 /// /////////////////////////////////////////////////// //////////////////// OpenTimer2(TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_1); /*---------------------Fin de Conf. TIMER2--------- ------------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de PWM /// /////////////////////////////////////////////////// /////////////////// OpenPWM1(124); //1kHZ de PWM //PWM period = [(period ) + 1] x 4 x Tosc x TMR 2 prescaler //PWM period = [(255)+1]x(4/4Mhz)x16 // [.001s/((4/8Mhz)*16)]-1=period // [1/(f*(4/Tosc)*preescalar)]-1=period SetDCPWM1(255);//Establece 50%de duty cycle /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=0; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=0; //ACTIVA INTERURPCIONES POR PERIFERICOS while(1); }
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 51
La desventaja de este método es que se debe de programar las veces que sea necesarias para cambiar el
ancho de pulso, entonces se realiza una pequeña practica para cambiar el ancho de pulso vía serial con
un software que fue realizado en Visual C# 2010 Express.
Este ejemplo controlara el giro de un motor DC vía serial, usando solo un canal CCP modo PWM.
El programa a manejar es el siguiente:
/////////////////////////////////////////////////// ///// // USO DEL PWM (Control de Motor) //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> #include<stdio.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// //////////
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 52
__CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ////////////////////////////// //Variables globales ////////////////////////////// unsigned char buffer[2]; unsigned char flag=0; unsigned int pwm; ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ if(RCIF && RCIE){ //Resivimos dos bytes getsUSART(buffer,2); RCIF=0; flag=1; } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// /////////////////// // Configuracion de Puertos /// /////////////////////////////////////////////////// /////////////////// TRISC=0x80; /*---------------------Fin de Conf. Puertos-------- -----------------*/ /////////////////////////////////////////////////// //////////////////// // Configuracion del USART /// /////////////////////////////////////////////////// //////////////////// OpenUSART(USART_TX_INT_OFF &//Interrupcion por Tr ansmision apagado USART_RX_INT_ON &//Interrupcion por Recepcion ENCENDIDO USART_ASYNCH_MODE &//Modo Asincronico USART_EIGHT_BIT &//8-bit de transmision USART_CONT_RX &//Recepcion Continua USART_BRGH_HIGH, //Alta velocidad de baudios
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 53
25); //para alta Velocidad: // FOSC / (16 * (spbrg + 1)) // spbrg=(FOS/baud*16)-1 //Para baja Velocidad: // FOSC / (64 * (spbrg + 1)) /*---------------------Fin de Conf. USART---------- ------------------*/ /////////////////////////////////////////////////// //////////////////// // Configuracion del TIMER2 /// /////////////////////////////////////////////////// //////////////////// OpenTimer2(TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_1); /*---------------------Fin de Conf. TIMER2--------- ------------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de PWM /// /////////////////////////////////////////////////// /////////////////// OpenPWM1(124); //1kHZ de PWM //PWM period = [(period ) + 1] x 4 x Tosc x TMR 2 prescaler //PWM period = [(255)+1]x(4/4Mhz)x16 // [.001s/((4/8Mhz)*16)]-1=period // [1/(f*(4/Tosc)*preescalar)]-1=period SetDCPWM1(0);//Establece duty cycle /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICOS while(1){ if(flag==1){ RCIE=0; //Convertimos los dos bytes a unsigned int pwm=(unsigned int)buffer[0]; pwm+=(unsigned int)buffer[1]<<8; SetDCPWM1(pwm);//Establece duty cycle flag=0; RCIE=1; } } }
Al armar nuestro circuito, primero conecte el
software y después conecte el circuito, y
empiece a mover la barra deslizadora y vera
que el motor empezara a girar lento
rápidamente depende como vallamos
moviendo el trackbar
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 54
Imágenes del Circuito Terminado:
Observe que el motor debe ser activado por
medio de un transistor 2N2222
He usado un cable de USB a serial para hacer el
interfaz en mi LABTOP.
Modo Comparador
El modo comparador cambia el estado de pin
CCPx del PIC cuando el contenido del TMR1
concuerda con el valor registros CCPRxH y
CCPRxL como se muestra en el esquema
siguiente:
Este modo es usado para switchar después de
un tiempo específico.
El evento que puede ser programado es para
establecer el pin CCPx a 0 o 1, y el reset para el
tiemer1. Cuando se usa el pin CCPx, debe ser
configurado como una salida entonces debe de
estar apropiadamente el bit del registro TRIS a
0. En todos los casos cuando el resultado de la
comparación es positivo, el bit CCPxIF en el
registro PIR es puesto a 1. Este bit puede ser
checado por el programa. Si el Modulo CCP la
interrupción es establecido, genera una
búsqueda de interrupción.
Uno de los eventos que puede ser generado
como el resultado de la comparación es iniciar
positivo es para resetear el timer1. Esta
operación incrementa las posibilidades para
timer1, como puede trabajar como un
comprador de 16 bit con un modulo contador
igual para el valor guardado en los registros
CCPRxH y CCPRxL en el modulo CCP.
Nuestra practica para entender mas sobre este
modo comparador, se tratara de configurar
correctamente el modulo y el timer para
empezar la comparación de un valor puesto en
los registros CCPPRxH:L, y cada vez que se de
esta igualdad surja una interrupción y podamos
cambiar de estado un pin determinado.
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 55
El programa que contiene el Microcontrolador es el Siguiente:
/////////////////////////////////////////////////// ///// // USO DEL COMPARADO //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ //Espera por interrupcion if(CCP1IF && CCP1IE){ RC0=~RC0;//cambia estado CCP1IF=0;//reset flag de interrupcion WriteTimer1(0);//inicializa a cero } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP(); /////////////////////////////////////////////////// /////////////////// // Configuración de PUERTOS //// /////////////////////////////////////////////////// /////////////////// TRISC=0x00;//Puerto C como salida /*---------------------Fin de Conf. PUERTOS-------- -----------------*/
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 56
/////////////////////////////////////////////////// /////////////////// // Configuración de TIMER1 //// /////////////////////////////////////////////////// /////////////////// OpenTimer1(TIMER_INT_OFF &//Desactiva Interrupcio n por timer T1_16BIT_RW &//Contador de 16 bit T1_SOURCE_INT &//Corriente del Oscilador inte rno T1_PS_1_1 &//Prescalar de 1 T1_OSC1EN_OFF &//Oscilador del timer desactiv ado T1_SYNC_EXT_OFF &//Sincronismo Externo Desact ivado T1_SOURCE_CCP); //Ambos CCP tiene el Timer1 /*---------------------Fin de Conf. TIMER1--------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuración de Compare /// /////////////////////////////////////////////////// /////////////////// CCP1CON=0b00001010; //Evento de Interrupción al ser iguales TMR1 y //CCPRxH:L CCP1IE=1; //Activa Interrupción por CCP CCPR1L=30000&0xFF; //Inicializa registros de C CPRxH:L CCPR1H=(30000>>8)&0xFF;//Con un valor de 30000 WriteTimer1(0); // /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICO S while(1);//ciclo perpetuo }
Cuando cargamos el registro CCPRx con un valor de 30000 nuestro periodo es calculado con la formula:
��� �� = 30000 ∗ 0.5�� ��� �� = 0.015 �
0.5uS es el valor que corresponde a los pasos que estará incrementando el timer1 en este caso como
vemos el valor corresponde a la frecuencia de trabajo del microcontrolador.
Cuando se cumpla la igualdad en TIMER1 y CCPRx generara una interrupción del cual se tuvo que
esperar 15mS para que siguiera tal interrupción después cambiamos de estado el pin deseado, al hacer
esto estamos generando una frecuencia de 33Hz.
El diagrama a Manejar es el siguiente:
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 57
Ahora si deseamos realizar un variador de frecuencia que tenga de rango 1Khz a 15 Hz usando un
Potenciómetro y una entrada análoga podemos hacerlo, simplemente se trata de que el valor leído del
canal análogo pase por una operación simple donde se convierte en un valor de 16 bit.
�����1 = "*�� ∗ 65535#/1023
El resultado se deposita en el registro CCPRxH:L y listo, al variar el potenciómetro variara la frecuencia:
El esquema a manejar es el siguiente:
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 58
El programa que tiene el microcontrolador es e siguiente:
/////////////////////////////////////////////////// ///// // USO DEL COMPARADO //// //Autor: george.manson.69 //// //Lugar: Mexico //// //Compilador: HI TECH PIC18 (LITE MODE) //// /////////////////////////////////////////////////// ///// #include<htc.h> /////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); ////////////////////////////// //Frecuencia FOSC 8Mhz ////////////////////////////// #define _XTAL_FREQ 8000000 ////////////////////////////// //Variable Globales // ////////////////////////////// unsigned int result; ///////////////////////////////////////////////// //Funcion de interrupcion //Si no se usa simplemente no hacemos nada... //Esto sirve para direccionar lo los datos //en un lugar muy cercano al Inicio de la memoria //de datos //////////////////////////////////////////////// static void interrupt isr(void){ //Espera por interrupcion if(CCP1IF && CCP1IE){ RC0=~RC0;//cambia estado CCP1IF=0;//reset flag de interrupcion WriteTimer1(0);//inicializa a cero } } ////////////////////////////// //FUNCION PRINCIPAL ////////////////////////////// void main(void){ /////////////////////////////////////////////// //Configuramos el Oscilador Interno a 8Mhz //// /////////////////////////////////////////////// OSCCON=0x70; NOP();NOP();NOP();NOP();
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 59
/////////////////////////////////////////////////// /////////////////// // Configuracion de PUERTOS //// /////////////////////////////////////////////////// /////////////////// TRISC=0x00;//Puerto C como salida TRISA=0x01;// /*---------------------Fin de Conf. PUERTOS-------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de ADC /// /////////////////////////////////////////////////// /////////////////// OpenADC(ADC_FOSC_RC &//Internal Oscilador Intern o ADC_RIGHT_JUST &//Justificacion a la derecha (10 -bit) ADC_20_TAD, //Tiempo de Adquisicion (TAD) ADC_CH0 &//CANAL 0 analogo ADC_INT_OFF &//Interrupcion por ADC APAGDO ADC_REF_VDD_VSS, //V+ref=VCC,V-ref=GND 1); //AN0=analogo,resto digitales /*---------------------Fin de Conf. ADC------------ ------------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de TIMER1 //// /////////////////////////////////////////////////// /////////////////// OpenTimer1(TIMER_INT_OFF &//Desactiva Interrupcio n por timer T1_16BIT_RW &//Contador de 16 bit T1_SOURCE_INT &//Corriente del Oscilador inte rno T1_PS_1_1 &//Prescalar de 1 T1_OSC1EN_OFF &//Oscilador del timer desactiv ado T1_SYNC_EXT_OFF &//Sincronismo Externo Desact ivado T1_SOURCE_CCP); //Ambos CCP tiene el Timer1 /*---------------------Fin de Conf. TIMER1--------- -----------------*/ /////////////////////////////////////////////////// /////////////////// // Configuracion de Compare /// /////////////////////////////////////////////////// /////////////////// CCP1CON=0b00001010; //Evento de Interrupcion al se r iguales TMR1 y //CCPRxH:L CCP1IE=1; //Activa Interrupcion por CCP CCPR1L=30000&0xFF; //Inicializa registros de CCPR xH:L CCPR1H=(30000>>8)&0xFF;//Con un valor de 30000 WriteTimer1(0); // /*---------------------Fin de Conf. PWM------------ ------------------*/ GIE=1; //INTERRUPCIONES GLOBALES ACTIVADAS PEIE=1; //ACTIVA INTERURPCIONES POR PERIFERICO S while(1){ __delay_ms(10); ConvertADC(); //Empieza Conversion while(BusyADC()); //Espera a terminar result=ReadADC(); //lee resultado result=(unsigned int)(((unsigned long)result*6553 5)/1023); CCPR1L=result&0xFF; //Inicializa registros de CCP RxH:L CCPR1H=(result>>8)&0xFF;//Con un valor } }