Plantilla para el uso de la Interrupción RTCC mediante el TIMER0 La interrupción RTCC se produce cada vez que el contador TIMER0 pasa de FFh a 00h. • El TIMER0 hace un cómputo completo de 00h a FFh cada 512 us, sin embargo este tiempo puede ser cambiado mediante un preescaler o sea un divisor, ajustable. Los tiempos generados para cada configuración (Los Micros usados son el 16F628, el 16F876A y el 18F4550 pero puede ser fácilmente adaptado a otros modelos de PIC. Ocasionalmente se usan también los 18F1320 y 18F2550. Todos los tiempos están calculados para cristales de 4 Mhz y 20 Mhz, salvo en los 18F4550 y 18F2550 en funciones de USB que "corren" a 48 Mhz mediante el PLL interno) son: • • • • • • • • :2 :4 :8 :16 :32 :64 :128 :256 -> -> -> -> -> -> -> -> 512 1.0 2.0 4.0 8.1 16.3 33.3 66.6 µS al mínimo preescaler posible. mS mS mS mS mS mS mS al máximo preescaler posible. La plantilla usa un Preescaler de 128 para producir una interrupción RTCC cada 33.3 mS y así cada 30 veces que se produce cambio de estado la variable Flag, o sea 33.3 x 30 = 999 ms. PLANTILLA PARA USO DE INTERRUPCIÓN Y TIMER0. #include <16f628.h> // Selecciona el PIC #fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT // Opciones de configuración #use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz byte const NInts=30; // Numero de interrupciones para 1 Segundo // VARIABLES GLOBALES char C_Ints=0; char Flag=0; // Contador de Interrupciones ocurridas // Flag que cambia cada NInts interrupciones #int_RTCC RTCC_isr() { // Interrupción por desbordamiento // del TIMER0 RTCC if(C_Ints > NInts){ if(Flag==0){ Flag=1; } else{ Flag=0; } C_Ints=0; } } ++C_Ints; // Si las ints ocurridas > ints para 1 Seg. // Reinicializo Contador de Ints // Incremento el número de interrupciones // Ocurridas void main(void) { setup_counters(RTCC_INTERNAL,RTCC_DIV_128);// TIMER0: Clock Interno, Presescaler 128 setup_timer_1(T1_DISABLED); // para una RTCC cada 33.3 milisegundos setup_timer_2(T2_DISABLED,0,1); // -> 1 Segundo = 30 RTCC setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_RTCC); enable_interrupts(global); // Habilito Interrupción RTCC // Habilito Interrupciones do{ // Bucle infinito if(Flag==K){} else { // si ha cambiado Flag ... // AQUI HAGO LO QUE DESEE CADA 1 SEGUNDO } k=Flag; // Guardo estado anterior de Flag }While(TRUE); } EJEMPLO DE LA PLANTILLA PARA PARPADEO DE UN LED CADA ½ SEGUNDO #include <16f628.h> #fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT #use delay(clock=4000000) #use standard_io(B) #use fixed_io(b_outputs=PIN_B0) // // // // // Selecciona el PIC Opciones de configuración Velocidad del Cristal : 4 Mhz PORTB en estándar IO digital B0 como salida en PORTB byte const NInts=7; // Numero de interrupciones para 0.25 Segundos // VARIABLES GLOBALES char C_Ints=0; char Flag=0; char K=0; // Contador de Interrupciones ocurridas // Flag que cambia cada NInts interrupciones // Estado anterior del Flag #int_RTCC RTCC_isr() { // Interrupción por desbordamiento // del TIMER0 RTCC if(C_Ints > NInts){ if(Flag==0){ Flag=1; } else{ Flag=0; } C_Ints=0; } ++C_Ints; } // Si las ints ocurridas > ints para 0.25 seg. // Reinicializo Contador de Ints // Incremento el número de interrupciones // Ocurridas void main(void) { setup_counters(RTCC_INTERNAL,RTCC_DIV_128); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_RTCC); enable_interrupts(global); // TIMER0: Clock Interno, Presescaler 128 // para una RTCC cada 33.3 milisegundos // -> 1 Segundo = 30 RTCC output_low(PIN_B0); // Empiezo apagando el Led // Habilito Interrupción RTCC // Habilito Interrupciones do{ // Bucle infinito if(Flag!=K) { if(Flag==0){ output_low(PIN_B0); } if(Flag==1){ output_high(PIN_B0); } k=Flag; } }While(TRUE); } // // // // si ha cambiado Flag ... Si es 0 Apago el Led si es 1 Enciendo el Led Guardo estado anterior de Flag