Está en la página 1de 5

Programacion del PIC 16F877A

USO DEL TIMER2 PARA PWM CON EL PIC 16F877A con el COMPILADOR HI TECH

Buitrn Quispe Carlos E.

Pgina 1

Programacion del PIC 16F877A

F:\ESCRITORIO DECIMO CICLO\ \fuses exporta y graba\PWM.c #include <htc.h> // Directivas del Preprocesador //__CONFIG(0x3F32); //Palabra de configuracin para el pic 16F877A __CONFIG( FOSC_HS & WDTE_OFF & PWRTE_ON & BOREN_OFF & LVP_OFF & CPD_OFF & CP_OFF & DEBUG_OFF & WRT_OFF ); #define _XTAL_FREQ 20000000 //Oscilador Externo de 20MHZ /* Declaracin de variables GLOBALES con inicializacin o sin inicializacin*/ unsigned int x; /* Declaracin de funciones con o sin parmetros*/ void set_pwm(unsigned int duty); // prototipo de la funcin //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ /* FUNCION PRINCIPAL*/ void main(void) // "funcin main" sin ningn valor de retorno. { /* REGISTROS Y SIMBOLO DEFINIDOS POR EL PROGRAMADOR*/ // ~~~~~~~~~~PASOS PARA CON FIGURAR EL MODULO TIMER 0 ~~~~~~~~~~~ //OPTION_REG=0B10100000; // voy al BANCO1 y configuro como usare el modulo timer

Buitrn Quispe Carlos E.

Pgina 2

Programacion del PIC 16F877A


// mediante el registro OPTION_REG. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //T0CS - BIT5: Bit selector de fuente para el TMR0 //1 = Clock externo, pin RA4/T0CKI //0 =Clock interno (CLKOUT) //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //T0SE - BIT4: Bit selector de flanco //1 = Incrementa en flanco de bajada en pin T0CKI //0 = Incrementa en flanco de subida en pin T0CKI //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //PSA - BIT3: Bits de asignacin del preescaler //1 = Prescaler es asignado al WATCHDOG //0 = Prescaler es asignado al modulo Timer0*/ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //Si el preescaler vale 1:8 quiere decir por cada 8 eventos o 8 pulsos o 8 ciclos que sucedan // Solo aumentar una cuenta en un valor de "uno" en el registro TMR0 (y el valor mximo de // Cuentas ser 8x256). ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ~~~~~~~PASOS PARA CON FIGURAR EL REGISTRO INTCON ~~~~~~~~~~ // Es el controlador de Interrupciones, utilizar las banderas: // bit 2 TMR0IF: Sealizador de desbordamiento del temporizador en TMR0 // 1 = se activa por defecto cuando hay desbordamiento de TMR0 (borrar por

Buitrn Quispe Carlos E.

Pgina 3

Programacion del PIC 16F877A


software) // 0 = TMR0 register did not overflow //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // bit 5 TMR0IE: Bit de permiso de interrupcin del TMR0 // 1 = Enables the TMR0 interrupt // 0 = Disables the TMR0 interrupt //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //TMR0=0X00; //Aseguramos que registro de conteo TMR0 est en 0 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //ADCON1 = 0x06; // Configuro puerto A, para obtener E/S digital. //TRISA=0XFF; // configuro puerto A como ENTRADA, PIN RA4: T0CKI se debe leer el estado. //TRISB=0X00; // configuro puerto B como SALIDA. TRISC=0X00; // configuro puerto C como SALIDA. CCP1CON = 0b00001100; // Configurar el modulo CCP, utilizar como modo PWM T2CON = 0b00000110; // configurar TIMER2 para funcionar el PWM PR2 = 255; // valor para calcular en resultado de frecuencia. PR = 0 o 255. set_pwm(512); // iniciar el PWM en 50%. 1024 niveles - 100%, 512 niveles = 50% x=0; // inicializacin para ver como varia los niveles. (Cantidad de niveles) while(1) { x++; if(x>=1024) x=0; set_pwm(x); __delay_ms(10); } }

Buitrn Quispe Carlos E.

Pgina 4

Programacion del PIC 16F877A


void set_pwm(unsigned int duty) { CCPR1L = duty>>2; CCP1CONbits.CCP1X = duty>>1; CCP1CONbits.CCP1Y = duty; }

Medida del Frecuencmetro a 1.22Khz Programa permite medir la intensidad de Luminosidad del Led cuando el Duty cicle llega al 100 el Led deja de Iluminar y retorna en parpadear hasta alcanzar la mxima iluminacin.

Buitrn Quispe Carlos E.

Pgina 5