TIMER D0S El TMR2 solo esta incorporado en unos pocos modelos de la gama media porque se trata de un temporizador de 8 bits dise帽ado para usarse conjuntamente con el circuito de Modulaci贸n de Anchura de Impulsos (PWM).
TIMER2: Modo Temporizador Para configurar TIMER2 se utiliza la función: setup_timer_2(MODO,PERIODO,POSTCALAR); PERIODO ES UN VALOR DE 8 BITS (0 – 255)
postcalar es un valor entre de 1 a 16 El modo puede ser t2_disable o t2_div_by_1 o t2_div_by_4 o t2_div_by_16
LECTURA Y ESCRITURA Y TMR2 VALOR=GET_ TIMER2(); SET_TIMER2(VALOR); LA VARIABLE VALOR ES DE OCHO BITS .
T = (PR2+1)·4·Tosc·TMR2preescaler.poscalar Duty = (X.8) ·Tosc·TMR2preescaler.postcalar
Primer acercamiento al PWM Con la ayuda de las dos anterores fórmulas para el cálculo del valor a cargar en PR2 y en CCPR1L (duty) realizar un programa que trabaje con frecuencia de 500 Hz es decir cada 1ms inicialmente. Además se desea que presionando el pulsador RB0 el duty cambie a 1,5 ms y si se presiona RA4 el duty cambie a 250µs. Variando el duty se conseguirán distintas lecturas en el osciloscopio.
T = (PR2+1)·4·Tosc·TMR2preescaler.postcalar F=500Hz es decir T= 2ms 2x10exp-3=(PR2+1).4.1/4000000.16.1 125=PR2+1 PR2=125-1
PR2=124 PARA 1ms el ciclo duty seria Duty = (X.8) ·Tosc·TMR2preescaler.postcalar T=1ms 1exp10-3=(x.8).1/4000000.16.1 4.10exp3/16=x.8 X.8=4.10exp3/16 x.8=250 X=250/8=31.25 x 2 = 62,5 SE
TOMA 62 para 1ms
PARA 1,5ms el ciclo duty seria Duty = (X.8) 路Tosc路TMR2preescaler.postcalar T=1,5ms 1,5exp10-3=(x.8).1/4000000.16.1 1.5x4.10exp3/16=x.8 X.8=6.10exp3/16 x.8=375
X=375/8=46,875 x 2 = 93,75 SE TOMA 94 para 1,5ms ----------------------------------------------------------------------------------------PARA 250us el ciclo duty seria Duty = (X.8) 路Tosc路TMR2preescaler.postcalar T=250us 250exp10-6=(x.8).1/4000000.16.1 250x4/16=x.8 X.8=1000/16 x.8=62,5 X=62,5/8=7,8125 x 2 = 15,625
SE TOMA 16 para 250us
TIMER 1 ES UN TEMPORIZADOR /CONTADOR DE 16 BIT FORMADO POR LA UNION DE LOS REGISTROS AMBOS REGISTROS PUEDEN LEER Y ESCRIBIR EN EL MODO TEMPORIZACION EL TIMER 1 SE INCREMENTA CADA CICLO DE INSTRUCCIÓN FOSC/4 EN EL MODO CONTADOR EL TIMER1 SE INCREMENTA CON CADA FLANCO ASCENDENTE DE UN RELOJ EXTERNO.
TIMER 1 Para leer el contenido del TIMER1 se utiliza la funci贸n: get_timer1();
Ejemplo: int16 valor; // Declarar una variable de 16 bits valor=get_timer1(); // Asignamos el valor del timer a la variable Para escribir un valor en el registro TIMER1 se utiliza la funci贸n: set_timer1(valor);
Ejemplo: int valor=1500; // Declarar una variable de 8 bits set_timer1(valor); // Asignamos el valor 1500 al Timer 1
o simplemente:set_timer1(1500);
TIMER1: Generador de interrupción (CCS) Para habilitar la interrupción del TIMER1 se utilizan las funciones: setup_timer_1(T1_INTERNAL| T1_DIV_BY_N); // N=1,2,4 o 8 enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); Para deshabilitar la interrupción: disable_interrupts(INT_TIMER1); La función de atención a la interrupción es: #int_TIMER1 int TIMER1_isr() { }
Interrupción del TIMER1 en CCS Ejemplo: Usar el Timer1 sin preescaler para realizar un programa que genere por el pin RB7 un tren de pulsos de frecuencia variable En función del valor del pin RA0. Para RA0=0 -> F=100Hz y para RA0=1 -> F= 200Hz. Al mismo tiempo en el LCD
se mostrará el texto “F=100Hz en pin RB7” o “F=200Hz en pin RB7” Según corresponda.
Interrupci贸n del TIMER1 en CCS Paso 1: Configuraci贸n del TIMER1 como temporizador sin preescaler y habilitar la interrupci贸n (dentro de la funci贸n main() ): setup_timer_1(T1_INTERNAL| T1_DIV_BY_1);
enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL);
Interrupci贸n del TIMER1 en CCS Paso 2: Programar la funci贸n de interrupci贸n, antes de la funci贸n main():int F=0; // Partimos con la frecuencia baja #int_TIMER1 int TIMER1_isr() { output_toggle(PIN_B7); if(F==0) set_timer1(65535-5000); // Recargamos para 5ms ->200Hz else set_timer1(65535-2500); // Recargamos para 2,5ms ->100Hz return 0; }
Interrupci贸n del TIMER1 en CCS Paso 3: Completamos la funci贸n main() con los mensajes del LCD y la captura del estado del pin RA0: while(true) { if(input(PIN_A0)) { // PIN_A0=1 -> F=200Hz,T=5ms,T/2=2,5ms If(primera_vez==1 || F==0 ) { // Para evitar el parpadeo del LCD, solo se escribe cuando se produce el cambio. printf(LCD_Putc,"F=200 Hz");
Interrupci贸n del TIMER1 en CCS Paso 3: continua
F=1; primera_vez=0; } }
else { // PIN_A0=0 -> F=100Hz,T=10ms,T/2=5ms if(primera_vez==1 || F==1) // Para evitar el parpadeo De la LCD, solo se escribe cuando se produce el cambio {
printf(LCD_Putc,"F=100 Hz"); F=0; primera_vez=0; } } }