Uso del timer2 para pwm con el pic 16 f877a con el compilador hi tech
1. Programacion del PIC 16F877A
USO DEL TIMER2 PARA PWM CON EL PIC 16F877A con el COMPILADOR HI TECH
Buitrón Quispe Carlos E.
Página 1
2. Programacion del PIC 16F877A
F:ESCRITORIO DECIMO CICLO fuses exporta y grabaPWM.c
#include <htc.h> // Directivas del Preprocesador
//__CONFIG(0x3F32); //Palabra de configuración 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
/* Declaración de variables GLOBALES con inicialización o sin inicialización*/
unsigned int x;
/* Declaración de funciones con o sin parámetros*/
void set_pwm(unsigned int duty); // prototipo de la función
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~ /* FUNCION PRINCIPAL*/
void main(void) // "función main" sin ningún 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
Buitrón Quispe Carlos E.
Página 2
3. 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 asignación 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 máximo de
// Cuentas será 8x256).
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ~~~~~~~´PASOS PARA CON FIGURAR EL REGISTRO INTCON ~~~~~~~~~~
// Es el controlador de Interrupciones, utilizar las banderas:
// bit 2 TMR0IF: Señalizador de desbordamiento del temporizador en TMR0
// 1 = se activa por defecto cuando hay desbordamiento de TMR0 (borrar por
Buitrón Quispe Carlos E.
Página 3
4. Programacion del PIC 16F877A
software)
// 0 = TMR0 register did not overflow
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// bit 5 TMR0IE: Bit de permiso de interrupción 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; // inicialización para ver como varia los niveles. (Cantidad de niveles)
while(1)
{
x++;
if(x>=1024) x=0;
set_pwm(x);
__delay_ms(10);
}
}
Buitrón Quispe Carlos E.
Página 4
5. Programacion del PIC 16F877A
void set_pwm(unsigned int duty)
{
CCPR1L = duty>>2;
CCP1CONbits.CCP1X = duty>>1;
CCP1CONbits.CCP1Y = duty;
}
Medida del Frecuencímetro 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 máxima iluminación.
Buitrón Quispe Carlos E.
Página 5