JVM-Electronics

  • Aumentar fuente
  • Fuente predeterminada
  • Disminuir fuente

Mikrobasic Timer 0

E-mail Imprimir PDF

CALCULO DEL TIEMPO EMPLEADO PARA LA INTERRUPCION DEL TIMER 0

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

optionreg

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

registers

Esta configurado de la siguiente forma:

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
Tiempo = (255-96) x 32 x 0.5 us

Queda resuelto así:

Tiempo = 159 x 32 x 0.5 = 2.544 us (2'5 ms +/-)

Ya sabemos que el Timer 0 desbroda cada 2'5 ms, según el código de ejemplo cada vez que se desborda y se genera la interrupcion (entra en sub proceure interrupt) se incrementa en uno el contador, cuando la comparación realizada con la variable contador, en el main del programa, alcance el valor 400 tendremos que:

400 veces a 2'5 ms = 1000 ms

Así vemos que cada segundo aproximadamente cambia de estado PORTB.
 
English Spanish