Si, no hay problema.
Explicarte exactamente como funciona el timer quedaria para otro momento. La idea es realizar un cargar el timer para que cuando pase de 0xFF a 0x00 genere una interrupcion.
El timer en si es un contador y va a contar los pulsos de reloj (internos o externos que le llegan)
Este es el concepto mas simple de timer.
¿Ahora como creo el codigo?
La primera es leer el datasheet, i ver que registros tenes para modificar:
Los registros que influyen en el Timer0 son:
TMR0 ( contiene el valor de la cuenta)
INTCON ( los bits de habilitacion de la interrupcion del Timer0 y luego las globales)
OPTION_REG ( Aca se determina el prescaler y de donde tomo los pulsos)
TRISIO ( en caso de tomar un pulso externo y no de la señal del oscilador )
Para calcular el valor del preescaler y de valor inicial del TMR0 podes ayudarte con una pagina:
http://eng-serve.com/pic/pic_timer.htmlEjemplo, con el oscilador interno de 4Mhz y usando el TMR0 (podria usar el TMR1 que posee otros registros y es de 16bits)
Tengo que si yo cargo el valor: 60 en TMR0, y tengo un Preescaler de 1:256, el Timer va a desbordar cada 0.05017600 sec
Si quisiera 0.5s deberia desbordarse 10 veces. Siempre comenzando desde 60 el Timer ( ya que cuando desborda comienza de 0 ).
char contador=0;
void interrupt(void)
{
if(INTCON.T0IF)
{
// Recargo timer y borro flag, entra aca cada 0.05s
TMR0 = 60;
INTCON.T0IF = 0;
contador++;
if(contador==10)
{
//Entra aca cuando pasaron 0.5s
contador=0;
GPIO ^= 0x1; // Alterno el GPIO0
}
}
// En caso de tener otra interrupcion, es solo un ejemplo
if(INTCON.GPIF)
{
}
}
void main(void)
{
GPIO=0x00;
CMCON=0x07;
TRISIO = 0xFE; // GPIO0 como salida para test
OPTION_REG = 0b11010111;// Preescaler 1:256, Preescaler asignado a TMR0, Usa el oscilador interno
TMR0 = 60;
INTCON.T0IF = 0; // Limpio flag por las dudas
INTCON.T0IE = 1; // Habilito interrupcion
INTCON.GPIE = 1; // Habilito la interrupcion del puerto
INTCON.GIE = 1; // Habilito interrupciones globales
while(1)
{
}
}
Una cosa, el TMR0 no se puede parar, SIEMPRE esta funcionando. Eso puede llegar a traer unos problemas.
El TMR1 en cambio puede pararse. Los pasos son iguales, nomas que tienen otros registros