Para calcular el periodo de tiempo de la interrupción del Timer 0 vamos a emplear un ejemplo de código muy sencillo que viene (como ejemplo) en la instalación de Mikrobasic, aquí os mostrare como tenéis que calcular el periodo de arranque del timer (TMR0) para calcular la duración de cada interrupción.
El codigo esta probado para un PIC16F877A a 8 Mhz.
Codigo:
program Timer0
'*******************************************************************************
'Creado y verificado por: Julio Montagut
'Web: http://www.jvmbots.es
'
'Mikrobasic Version 7.0.3 (beta)
'
'-HARDWARE:
' MCU: PIC16F877A - HS - 8Mhz
' 8 Leds conectados en PORTB
'*******************************************************************************
dim contador as word
sub procedure interrupt
inc(contador) ' Incrementamos el valor de counter
TMR0 = 96
INTCON = %00100000 ' T0IE = 1, T0IF = 0
end sub
main:
OPTION_REG = %10000100 ' Asignacion del prescaler al Timer0
TRISB = 0 ' PORTB son salidas
PORTB = $FF ' Inicializacion de PORTB
contador= 0 ' Inicializacion de contador
TMR0 = 96
INTCON = %10100000 ' Habilitamos la interrupcion del TimerO
while TRUE
if contador= 400 then ' Si el contador es 400...
' cambiara de estado PORTB y reseteara counter
PORTB = not(PORTB)
contador= 0
end if
wend
end.
El timer0 es de 8 bits por lo tanto un recorrido desde 0 hasta 255, dicho recorrido lo contiene la variable TMR0. Tu puedes arrancar el Timer 0 con un valor ya prefijado de dicha variable, de forma que si el Timer tuviera que tardar 1 segundo en ejecutarse (que TMR0 llegue de 0 a 255) y tu estableces la variable TMR0 con un valor inicial de 128, solo le ocupara medio segundo en alcanzar el valor 255.
Para calcular el timer0 hace falta configurar varios parámetros, el prescaler, las interrupciones globales y ser consciente de la bandera de interrupción.
CONFIGURACION DEL TIMER0
Aquí os dejo la imagen de la configuración del registro OPTIONREG que tiene el valor binario %10000100

Podemos ver que el prescaler es 1:32 - equivalente a la configuración (100) de PS0, PS1 y PS2
También vemos que el bit 3 esta asignado a la interrupción del Timer 0
Ahora veremos el registro INTCON que forma parte de los registros del Timer 0

INTCON, tiene asignado el valor binario %10100000, que nos indica que el bit 7 (GIE) y el bit 5 (TMR0IE) están en valor 1 por lo tanto están las interrupciones globales activadas y que se provoque una interrupción con el desbordamiento del Timer 0.
Cada vez que el Timer 0 desborde (llegue a su valor 255) provocara una interrupción seteando el registro INTCON.T0IF = 1 y entrara en el sub de la interrupción (linea 5 del ejemplo), seguidamente en la línea 8 establece nuevamente INTCON.T0IF = 0 (bit 2) reseteando así la bandera de desbordamiento del Timer 0.
Vistos estos puntos de configuración y funcionamiento la formula para calcular es la siguiente:
Tiempo = INICIO x PRESCALER x (4/Fosc)
Como vemos en el ejemplo TMR0 se inicia con 96 como es un timer de 8 bits se lo restaremos del cursor, por lo tanto tenemos que:
- INICIO = 255 (Timer 8 bits) - 96 (valor de TMR0)
- PRESCALER = 32
- (4/Fosc) = 4/8.000.000 = 0.5 us
Queda resuelto así:





