Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Compare Capture PWM modeCompare Capture PWM modeCompare Capture PWM modeCompare Capture PWM mode
El modulo CCP se puede co...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 43
que cada vez que detecte un flaco de subida
rápidam...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 44
del CCP1 y a la vez activa el siguiente canal CCP
p...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 45
//Variable Globales //
////////////////////////////...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 46
T1_OSC1EN_OFF &
T1_SYNC_EXT_OFF &
T1_SOURCE_CCP); /...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 47
El circuito a manejar es el siguiente:
Al armar nue...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 48
Modo PWM
Esta configuración del CCP en modo PWM, no...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 49
El esquema a manejar para este ejemplo es el siguie...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 50
//Frecuencia FOSC 8Mhz
////////////////////////////...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 51
La desventaja de este método es que se debe de prog...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 52
__CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 53
25); //para alta Velocidad:
// FOSC / (16 * (spbrg ...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 54
Imágenes del Circuito Terminado:
Observe que el mot...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 55
El programa que contiene el Microcontrolador es el ...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 56
///////////////////////////////////////////////////...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 57
Ahora si deseamos realizar un variador de frecuenci...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 58
El programa que tiene el microcontrolador es e sigu...
[MODULO CCP] 2011
MicroCursos | Curso de Hi tech Compiler For PIC18 59
///////////////////////////////////////////////////...
Upcoming SlideShare
Loading in …5
×

Compare capture pwm mode 5

528 views

Published on

  • Be the first to comment

Compare capture pwm mode 5

  1. 1. Compare Capture PWM modeCompare Capture PWM modeCompare Capture PWM modeCompare 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
  2. 2. [MODULO CCP] 2011 MicroCursos | Curso de Hi tech Compiler For PIC18 43 que cada vez que detecte un flaco de subida rápidamente copie el valor de TIMER y lo guarde en el registro CCPxH:CCPxL. En este caso si tenemos el TIMER configurado en 16 bit y el microcontrolador opera a 4Mhz, como mínimo valor de captura será: Timer configurado al mínimo: Tick – 1uS ~1uS capturara nuestro modulo como minina resolución para tener el máximo simplemente multiplicamos: 1 ‫ܵݑ‬ ∗ 65535 = 65.535݉ܵ Máxima resolución de captura. Nota: Estos valores pueden cambiar dependiendo de la velocidad de trabajo del Microcontrolador. Si usamos los dos módulos CCP en modo Captura podemos obtener el valor de ancho de pulso del un PWM. Al tener los dos valores guardados en los registros CCPxH:L procedemos a restar el valor guardado: ‫ܿ݊ܣ‬ℎ‫݋‬ ݀݁ ‫݋ݏ݈ݑ݌‬ = ‫:ܪ2ܲܥܥ‬ ‫ܮ‬ − ‫:ܪ1ܲܥܥ‬ ‫ܮ‬ Automáticamente tendremos el ancho de pulso, pero recuerde que tenemos limitante de captura con relación a la frecuencia de trabajo del microcontrolador. Para poner a prueba el modo captura del CCP, realizaremos una práctica donde capture el ancho de pulso de un generador de PWM. Los primero pasos son básicos en la programación se debe de configurar primero los puertos del microcontrolador como entradas o salidas respectivamente a cada modulo que vallamos a usar, después se Configurara el TIMER1 a 16 bit y un prescalar de 1, para que ticks sean cada ciclo del microcontrolador. Después Configuraremos el modulo CCP1 como captura con un flanco de interrupción de subida, después configuraremos el CCP2 sin interrupción pero con un flaco de bajada. Se realiza esta estrategia para esperar exactamente los flancos de subida y bajada, cuando configuramos el canal CCP1 en modo captura y que cada interrupción surja con un flanco de subida esto hace que cuando por primera vez al conectar nuestro circuito espera hasta que realmente este en un flanco de subida y empiece a contar el TIMER al realizar esta acción rápidamente se desactiva la interrupción
  3. 3. [MODULO CCP] 2011 MicroCursos | Curso de Hi tech Compiler For PIC18 44 del CCP1 y a la vez activa el siguiente canal CCP para que empiece el canal a contar el pulso positivo y cuando detecte el flaco de bajada detenga el timer y lo copie al registro CCP2H:L, después restamos los registros CCP2H:L-CCP1H:L . Ahora bien configuramos el USART (modo hardware) esto sirve para enviar el dato obtenido de la operación anterior, como nuestro resultado tendrá un valor mayor que 2 bytes, debemos de separarlos y enviar uno tras otro a nuestro software ‘Capture’ El programa que contiene el Microcontrolador es el siguiente: //////////////////////////////////////////////////////// // USO CCP modo Captura //// //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 & PLLPOSTDIV2 & CPUDIV1 & USBOSC); ///////////////////////////////////////////////////////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & 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 ////////////////////////////// Software para visualizar el ancho de pulso
  4. 4. [MODULO CCP] 2011 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 Desactivada T1_16BIT_RW &//valor de 16 bit T1_SOURCE_INT &//Corriente desde el oscilador principal T1_PS_1_1 &//Preescalar de 1
  5. 5. [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 Desactivada C1_EVERY_RISE_EDGE);//Cada elevación /*---------------------Fin de Conf. CCP1----------------------------*/ ////////////////////////////////////////////////////////////////////// // Configuracion de CCP2 (Captura) /// ////////////////////////////////////////////////////////////////////// OpenCapture2(CAPTURE_INT_OFF & //Interrupcion Activada C2_EVERY_FALL_EDGE);//Cada CAIDA /*---------------------Fin de Conf. CCP2----------------------------*/ /////////////////////////////////////////////////////////////////////// // Configuración del USART /// /////////////////////////////////////////////////////////////////////// OpenUSART(USART_TX_INT_OFF &//Interrupción por Transmisió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; } } }
  6. 6. [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’.
  7. 7. [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 fórmula: ܹܲ‫ܯ‬ ‫݀݋݅ݎ݁݌‬ = ሾሺ‫݀݋݅ݎ݁݌‬ሻ + 1ሿ ∗ 4 ∗ ܱܶܵ‫ܥ‬ ∗ ܶ‫2ܴܯ‬ ܲ‫ݎ݈ܽܿݏ݁ݎ‬ Del cual podemos despejar “period” ‫݀݋݅ݎ݁݌‬ = ቎ 1 ݂ ∗ ቀ 4 ܶ‫ܿݏ݋‬ቁ ∗ ܶ‫ݎ݈ܽܿݏ݁ݎ݌2ܴܯ‬ ቏ − 1 Tosc =corresponde a la frecuencia del Cristal interno o externo. F= a la frecuencia a trabajar TMR2presclar = es el valor antes definido en la función de OpenTimer2 Después tenemos la función de: SetDCPWM1(unsigned int dutycycle); Dutycycle = es de 0 a 512 que corresponde el porcentaje del ancho de pulso. Para entender mejor el uso del PWM, se hará un ejemplo sencillo para el de este modulo.
  8. 8. [MODULO CCP] 2011 MicroCursos | Curso de Hi tech Compiler For PIC18 49 El esquema a manejar para este ejemplo es el siguiente: Como vemos es muy simple nuestro proyecto simplemente hay que medir el ancho de pulso con un osciloscopio para ver el resultado. El programa que contiene el Microcontrolador es el siguiente: //////////////////////////////////////////////////////// // USO DEL PWM //// //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 & PLLPOSTDIV2 & CPUDIV1 & USBOSC); ///////////////////////////////////////////////////////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS); __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT); //////////////////////////////
  9. 9. [MODULO CCP] 2011 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 TMR2 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); }
  10. 10. [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 & PLLPOSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////////////////
  11. 11. [MODULO CCP] 2011 MicroCursos | Curso de Hi tech Compiler For PIC18 52 __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & 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 Transmision 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
  12. 12. [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 TMR2 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
  13. 13. [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.
  14. 14. [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 & PLLPOSTDIV2 & CPUDIV1 & USBOSC); ///////////////////////////////////////////////////////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & 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-------------------------*/
  15. 15. [MODULO CCP] 2011 MicroCursos | Curso de Hi tech Compiler For PIC18 56 ////////////////////////////////////////////////////////////////////// // Configuración de TIMER1 //// ////////////////////////////////////////////////////////////////////// OpenTimer1(TIMER_INT_OFF &//Desactiva Interrupcion por timer T1_16BIT_RW &//Contador de 16 bit T1_SOURCE_INT &//Corriente del Oscilador interno T1_PS_1_1 &//Prescalar de 1 T1_OSC1EN_OFF &//Oscilador del timer desactivado T1_SYNC_EXT_OFF &//Sincronismo Externo Desactivado 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 CCPRxH: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 PERIFERICOS 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:
  16. 16. [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. ‫ݐ݈ݑݏ݁ݎ‬ = ሺܽ݀ܿ ∗ 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:
  17. 17. [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 & PLLPOSTDIV2 & CPUDIV1 & USBOSC); ///////////////////////////////////////////////////////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & 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();
  18. 18. [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 Interno 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 Interrupcion por timer T1_16BIT_RW &//Contador de 16 bit T1_SOURCE_INT &//Corriente del Oscilador interno T1_PS_1_1 &//Prescalar de 1 T1_OSC1EN_OFF &//Oscilador del timer desactivado T1_SYNC_EXT_OFF &//Sincronismo Externo Desactivado T1_SOURCE_CCP); //Ambos CCP tiene el Timer1 /*---------------------Fin de Conf. TIMER1--------------------------*/ ////////////////////////////////////////////////////////////////////// // Configuracion de Compare /// ////////////////////////////////////////////////////////////////////// CCP1CON=0b00001010; //Evento de Interrupcion al ser iguales TMR1 y //CCPRxH:L CCP1IE=1; //Activa Interrupcion por CCP CCPR1L=30000&0xFF; //Inicializa registros de CCPRxH: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 PERIFERICOS while(1){ __delay_ms(10); ConvertADC(); //Empieza Conversion while(BusyADC()); //Espera a terminar result=ReadADC(); //lee resultado result=(unsigned int)(((unsigned long)result*65535)/1023); CCPR1L=result&0xFF; //Inicializa registros de CCPRxH:L CCPR1H=(result>>8)&0xFF;//Con un valor } }

×