Que onda Usuario_registrado,
Aqui te pongo un ejemplo muy sencillo y basico, PARA NADA es preciso, para precision tendrias que usar otro cristal y NO inicializar el tmr en valores, es decir nunca hacerle recargas como sucede en este ejemplo y la recarga esta en el MAIN y en la rutina de interrupcion.
Codigo:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#BIT LED=6.0
#int_TIMER0
void ISR() { /*ISR CADA 1.7 ms*/
led=!led;
SET_TIMER0(40);
}
void main() {
SET_TRIS_B(6);
output_bit(pin_b0,0);
SETUP_counters( RTCC_INTERNAL, RTCC_DIV_4 | RTCC_8_BIT);
//RTCC_INTERNAL:indica sin salida por los pines,es decir, usado como temporizador
//RTCC_DIV_4:Indica un preescaler de 4(dividio por 4 el tiempo)
//RTCC_8_BIT:Es una redundancia indicativa que es de 8 bits(256) es el tmr0,
//ya que el tmr1 es de 16 bits........
//;;;;;;;;;;;;;;;;;;;;;;;;;;;CALCULO:::::::::::::::::::::::::::::::::
// Para producir una interrupción por desbordamiento del tmr0 cada 1.7ms aprox
//Tenemos una Fosc fijada por el oscilador del micro= 4Mhz.... se sabe que cada
//instruccion ocupa 4 ciclos de reloj... esto es: 4mhz/4=1mhz.. realmente al micro
//le llegan 1Mhz....(esto depende de el Cristal que usemos, y su estabilidad dependera
//de si es cristal externo o el interno de algunos micros) AHORA!! queremos
//calcular el valor de carga(con que se inicie el tmr0) para que se desborde
//cada 1.7ms aprox,Como usamos preescaler , este no es mas que un DIVISOR de
//frecuencia,por tanto 1mhz/4=250khz esto es 4us cada incremento del tmr0 pero como
//el tmr es de 8 bits(256 PASOS por asi decrilo) entonces 4us*256= 1024us
//esto nos define que el desborde del tmr0 sera cada 1.024ms(1ms aprox...) teniendo
//en cuenta que estamos contando los 256 pasos..es decir, inicializamos el tmr0 desde
//0 hasta 255(256 pasos) esto nos define una formula GRAL:
//Fdesborde=Fosc/(4*preescaler*VAL)] , donde val nos ayudara a
//determinar el valor de iniciacion del tmr0 y esto se definide como :
//inicializacion=256-VAL.
//Ya aclarada la formula, calculemos lo que necesitamos 1.72ms=:aprox 581 hz
//VAL=Fosc/(4*preescaler*Fdesborde)=430.29 este valor supera nuestro TMR(solo llega a
//256, entonces aumentamos el divisor a 8(preescaler)
//ahora VAL= 215.14 este si nos sirve, inicializacion=256-215=41 aprox
//este es el valor con el que debemos cargar nuestro TMR0
ENABLE_INTERRUPTS(INT_RTCC);
SET_TIMER0(40);
//seteamos el timer0 a 6
ENABLE_INTERRUPTS(GLOBAL);
WHILE (TRUE){
}
}
Hay mas y mejores ejemplos en la web del pana Modulay http://personal.auna.com/asencio5/Ejemplos%20C/
Para aprender mas, sobre CCs esta el Microcursillo C Aqui
http://miarroba.com/foros/ver.php?foroid=46840&temaid=2307248
Salu2 pana!