4.6 Ejemplo 4
Utilizar los temporizadores Timer0, Timer1 y Timer2. Utilizar interrupciones, declarar nuevos procedimientos...
Al analizar los ejemplos anteriores, es probable que se haya fijado en la desventaja de proporcionar tiempo de retardo por medio de la función Delay. En estos casos, el microcontrolador se queda ‘estático’ y no hace nada. Simplemente espera que transcurra una cierta cantidad de tiempo. Tal pérdida de tiempo es un lujo inaceptable, por lo que se deberá aplicar otro método.
¿Se acuerda usted del capítulo de los temporizadores? ¿Se acuerda de lo de interrupciones? Este ejemplo los conecta de una manera práctica. El esquema se queda inalterada, y el desafío sigue siendo presente. Es necesario proporcionar un tiempo de retardo suficiente largo para darse cuenta de los cambios en el puerto. Para este propósito se utiliza el temporizador TMR0 con el pre-escalador asignado. Siempre que se genere una interrupción con cada desbordamiento en el registro del temporizador, la variable cnt se aumenta automáticamente en 1 al ejecutarse cada rutina de interrupción. Cuando la variable llega al valor 50, el puerto PORTB se incrementa en 1. Todo el procedimiento se lleva a cabo “entre bastidores”, lo que habilita al microcontrolador hacer otra tarea.

' Cabecera******************************************************
program example_4a ' Inicio del programa
dim cnt as byte ' Definir la variable cnt como un byte
sub procedure interrupt ' Este subprocedimiento determina qué se lo que se
' debe hacer cuando se genere una interrupción
cnt = cnt + 1 ' Interrupción causa que la cnt se incremente en 1
TMR0 = 96 ' El valor inicial se devuelve en el temporizador TMR0
INTCON = 0x20 ' Bit T0IE se pone a 1, el bit T0IF se pone a 0
end sub ' Final de la rutina de interrupción
main: ' Inicio del programa
OPTION_REG = 0x84 ' Pre-escalador se le asigna al temporizador TMR0
ANSEL = 0 ' Todos los pines de E/S se configuran como digitales
ANSELH = 0
TRISB = 0 ' Todos los pines de puerto PORTB se configuran como salidas
PORTB = 0x0 ' Reiniciar el puerto PORTB
TMR0 = 96 ' Temporizador T0 cuenta de 96 a 255
INTCON = 0xA0 ' Habilitada interrupción TMR0
cnt = 0 ' A la variable cnt se le asigna un 0
while 1 ' Bucle infinito
if cnt = 50 then ' Incrementar el puerto PORTB después 50 interrupciones
PORTB = PORTB + 1 ' Incrementar número en el puerto PORTB en 1
cnt = 0 ' Reiniciar la variable cnt
end if
wend
end. ' Final de programa

Siempre que se produzca un desbordamiento en el registro del temporizador TRM0, ocurre una interrupción.
'Cabecera******************************************************
program example_4b ' Nombre del programa
dim cnt as byte ' Definir la variable cnt
sub procedure interrupt ' Definir el subprocedimiento de interrupción
cnt = cnt+1 ' Interrupción causa que la cnt se incremente en 1
PIR1.TMR1IF = 0 ' Reiniciar el bit TMR1IF
TMR1H = 0x80 ' El valor inicial se devuelve en los registros
TMR1L = 0x00 ' del temporizador TMR1H y TMR1L
end sub ' Final de la rutina de interrupción
main: ' Inicio del programa
ANSEL = 0 ' Todos los pines de E/S se configuran como digitales
ANSELH = 0
PORTB = 0xF0 ' Valor inicial de los bits del puerto PORTB
TRISB = 0 ' Los pines del puerto PORTB se configuran como salidas
T1CON = 1 ' Configurar el temporizador TMR1
PIR1.TMR1IF = 0 ' Reiniciar el bit TMR1IF
TMR1H = 0x80 ' Poner el valor inicial para el temporizador TMR1
TMR1L = 0x00
PIE1.TMR1IE = 1 ' Habilitar la interrupción al producirse un desbordamiento
cnt = 0 ' Reiniciar la variable cnt
INTCON = 0xC0 ' Interrupción habilitada (bits GIE y PEIE)
while 1 ' Bucle infinito
if cnt = 76 then ' Cambiar el estado del puerto PORTB después de 76 interrupciones
PORTB = not PORTB ' Número en el puerto PORTB está invertido
cnt = 0 ' Reiniciar la variable cnt
end if
wend
end. ' Final de programa

En este caso, una interrupción se habilita después de que se produzca un desbordamiento en el registro del temporizador TMR1 (TMR1H, TMR1L). Además, la combinación de los bits que varía en el puerto POTRB difiere de la en el ejemplo anterior.
'Cabecera******************************************************
program example_4c ' Nombre del programa
dim cnt as byte ' Definir la variable cnt como un byte
sub procedure Replace ' Definir el procedimiento ‘Reemplazar’
PORTB = not PORTB ' Definir el nuevo procedimiento ‘Reemplazar’
end sub ' Procedimiento invierte el estado del puerto
sub procedure interrupt ' Definir el subprocedimiento de interrupción
if PIR1.TMR2IF then ' Si el bit TMR2IF = 1,
cnt = cnt +1 ' Incrementar variable la cnt en 1
PIR1.TMR2IF = 0 ' Reiniciar el bit y
TMR2 = 0 ' Reiniciar el registro TMR2
end if
end sub ' Final de la rutina de interrupción
main: ' Inicio del programa
cnt = 0 ' Reiniciar la variable cnt
ANSEL = 0 ' Todos los pines de E/S se configuran como digitales
ANSELH = 0
PORTB = %10101010 ' Estado lógico en los pines del puerto PORTB
TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas
T2CON = 0xFF ' Configurar el temporizador T2
TMR2 = 0 ' Valor inicial del registro del temporizador TMR2
PIE1.TMR2IE = 1 ' Interrupción habilitada
INTCON = 0xC0 ' Bits GIE y PEIE se ponen a 1
while 1 ' Bucle infinito
if cnt > 30 then ' Cambiar el estado del puerto PORTB después de más de 30 interrupciones
Replace ' Subprocedimiento Reemplazar invierte el estado del puerto PORTB
cnt = 0 ' Reset variable cnt
end if
wend
end. ' Final de programa

En este ejemplo, una interrupción ocurre después de que se produce un desbordamiento en el registro del temporizador TMR2. Para invertir el estado lógico de los pines del puerto se utiliza el procedimiento Reemplazar, que normalmente no pertenece al lenguaje mikroBasic.