El wizard del C compiler hace bastante del trabajo de codigo y se expone a continuacion:
Primero destacar que ahora trabajaremos con un PIC mas poderoso, el cual es el modelo 16F873A así que deben seleccionarlo en Device en las configuraciones generales. Lo haremos funcionar con un oscilador externo de 4Mhz el cual mostrare como conectar con el esquema en Proteus.
En Communications desactivamos Use RS-232 y en Timers dejamos Enabled Timer2, no se preocupen de las otras opciones que aparecen en Timer2 porque lo configuraremos mediante una formula.
Luego en Interrupts activamos Timer 2 Overflow .
El codigo quedará asi(con los FUSES incluidos en el archivo .c):
______________________________________________________________________
#include <16F873A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4000000)
//------------------------Aqui esta la interrupción del timer 2-------------------
#int_TIMER2
void TIMER2_isr(void)
{
}
//---------------------------------------------------------------------------------------
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
}
____________________________________________________________________
Configurando el tiempo de desborde(Overflow) para que se ejecute el codigo de la interrupcion:
Nos interesa esta parte del codigo para configurarlo:
setup_timer_2(T2_DIV_BY_1,0,1)
El primer parametro es el prescaler y puede ser 1,4 o 16 para este PIC y tiene como objetivo dividir la frecuencia del oscilador.
El segundo es el registro PR2 que indica el momento de desborde del timer, es un numero que varia de 0 a 255.
El tercer parametro es el postscaler que el cual indica cuantas veces se debe desbordar el timer para ejecutar la interrupcion y ejecutar el codigo correspondiente para posteriormente resetear la cuenta, es un numero de 1 a 16.
Resumiendo las configuraciones del Timer 2:
1. Se divide la frecuencia mediante el prescaler.
2. Se establece un desborde(overflow) cuando se llena la cuenta del registro PR2.
3. El postscaler nos indica cuantas veces debe suceder el desborde para que se ejecute la interrupción.
Resumiendo las configuraciones del Timer 2:
1. Se divide la frecuencia mediante el prescaler.
2. Se establece un desborde(overflow) cuando se llena la cuenta del registro PR2.
3. El postscaler nos indica cuantas veces debe suceder el desborde para que se ejecute la interrupción.
La formula para calcular el valor de uno de los parametros del Timer 2 es:
PR2 = [([Tiempodeseado/(4/fosc)])/(Prescaler*Postscaler)]-1
Recuerden que los valores maximos para prescaler es 16, para PR2 es 255 y para postscaler 16.
En nuestro caso con un oscilador de 4 Mhz el tiempo maximo que le podemos asignar al Timer 2 es de 65.536ms.
Si pusieramos un oscilador de 20Mhz nuestro tiempo maximo de temporizacion sería 13.107ms, etc.
PR2 = [([Tiempodeseado/(4/fosc)])/(Prescaler*Postscaler)]-1
Recuerden que los valores maximos para prescaler es 16, para PR2 es 255 y para postscaler 16.
En nuestro caso con un oscilador de 4 Mhz el tiempo maximo que le podemos asignar al Timer 2 es de 65.536ms.
Si pusieramos un oscilador de 20Mhz nuestro tiempo maximo de temporizacion sería 13.107ms, etc.
Ejemplo:
Con las configuraciones del PIC dadas con anterioridad se desea configurar el Timer 2 para que ejecute una interrupción cada 50ms.
Solucion:
Como 50ms esta cerca de la temporizacion maxima que es 65.536ms ocupamos los valores maximos permitidos para prescaler y postscaler. Así mediante la formula calculamos PR2:
PR2 = [([50ms/(4/4E6)])/16*16)]-1
PR2=194.3125 ----> Como debe ser un valor entero entonces lo aproximamos a 195(mejor que sobre a que falte) lo que nos da una temporizacion exacta de 50.176ms(un valor muy muy cercano!)
Por lo tanto el Timer 2 nos queda:
setup_timer_2(T2_DIV_BY_16,195,16);
Aca dejo el codigo fuente y la simulacion en proteus.
Hola, buenas tardes. Te felicito por tu blog. En verdad me ayuda muchísimo para comprender la configuración y funcionamiento de los timers. Mil gracias por tomarte el tiempo de compartir tus conocimientos.
ResponderEliminarLink caido
ResponderEliminar