Sunteți pe pagina 1din 7

Timer0 como un contador, declarar variables nuevas, utilizar smbolos,

utilizar rels...
En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa sin haber sido afectado de
ninguna forma por su entorno. En la prctica, hay pocos dispositivos que funcionen de esta manera (por
ejemplo, un simple controlador de luz de nen). Los pines de entrada se utilizan tambin en este ejemplo. En
la siguiente figura se muestra un esquema, mientras que el programa est en la siguiente pgina. Todo sigue
siendo muy simple. El temporizador TMR0 se utiliza como un contador. La entrada del contador est
conectada a un botn de presin, as que cada vez que se presiona el botn, el temporizador Timer0 cuenta
un pulso. Cuando el nmero de pulsos coincida con el nmero almacenado en el registro TEST, un uno lgico
(5V) aparecer en el pin PORTD.3. Este voltaje activa un rel electromecnico, y por eso este bit se le
denomina REL en el programa.
En este ejemplo, el registro TEST almacena el nmero 5. Por supuesto, eso puede ser cualquier nmero
obtenido al calcular o definido como una constante. Adems, el microcontrolador puede activar algn otro
dispositivo en vez de rel, mientras que el sensor se puede utilizar en vez del botn de presin. Este ejemplo
muestra una de las aplicaciones ms comunes del microcontrolador en la industria; al realizar una cosa el
suficiente nmero de veces, otra cosa debe estar encendida o apagada.

' Cabecera ******************************************************
program example_3 ' Nombre del programa
symbol RELAY = PORTD.3 ' Pin del puerto PORTD.3 es denominado REL
dim TEST as byte ' Variable TEST es de tipo byte
main: ' Inicio del programa
TEST = 5 ' Constante TEST = 5
ANSEL = 0 ' All I/O pins are configured as digital
ANSELH = 0
PORTA = 0 ' Reiniciar el puerto PORTA
TRISA = 0xFF ' Todos los pines de E/S se configuran como
digitales
PORTD = 0 ' Reiniciar el puerto PORTD
TRISD = %11110111 ' Pin RD3 se configura como una salida, mientras
que los
' dems se configuran como entradas
OPTION_REG.5 = 1 ' Contador TMR0 recibe los pulsos por el pin RA4
OPTION_REG.3 = 1 ' Valor del pre-escalador es 1:1
TMR0 = 0 ' Reiniciar el temporizador/contador TMR0

while 1
if TMR0 = TEST then ' Coincide el nmero en el temporizador con la
constante TEST?
RELAY = 1 ' Nmeros coinciden. Poner el bit RD3 a uno
(salida REL)
end if
wend ' Quedarse en el bucle infinito

end. ' Final de programa
Slo un smbolo (REL) se utiliza aqu. Se le asigna el tercer pin del puerto PORTD en la declaracin.
symbol RELAY = PORTD.3 ' Smbolo REL = PORTD.3
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 funcin Delay. En estos casos, el microcontrolador se queda esttico y no hace nada.
Simplemente espera que transcurra una cierta cantidad de tiempo. Tal prdida de tiempo es un lujo
inaceptable, por lo que se deber aplicar otro mtodo.
Se acuerda usted del captulo de los temporizadores? Se acuerda de lo de interrupciones? Este ejemplo los
conecta de una manera prctica. El esquema se queda inalterada, y el desafo sigue siendo presente. Es
necesario proporcionar un tiempo de retardo suficiente largo para darse cuenta de los cambios en el puerto.
Para este propsito se utiliza el temporizador TMR0 con el pre-escalador asignado. Siempre que se genere
una interrupcin con cada desbordamiento en el registro del temporizador, la variable cnt se aumenta
automticamente en 1 al ejecutarse cada rutina de interrupcin. 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 interrupcin
cnt = cnt + 1 ' Interrupcin 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 interrupcin

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 interrupcin TMR0
cnt = 0 ' A la variable cnt se le asigna un 0

while 1 ' Bucle infinito
if cnt = 50 then ' Incrementar el puerto PORTB despus 50
interrupciones
PORTB = PORTB + 1 ' Incrementar nmero 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 interrupcin.
'Cabecera******************************************************
program example_4b ' Nombre del programa
dim cnt as byte ' Definir la variable cnt

sub procedure interrupt ' Definir el subprocedimiento de interrupcin
cnt = cnt+1 ' Interrupcin 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 interrupcin

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 interrupcin al producirse un
desbordamiento
cnt = 0 ' Reiniciar la variable cnt
INTCON = 0xC0 ' Interrupcin habilitada (bits GIE y PEIE)

while 1 ' Bucle infinito
if cnt = 76 then ' Cambiar el estado del puerto PORTB despus de
76 interrupciones
PORTB = not PORTB ' Nmero en el puerto PORTB est invertido
cnt = 0 ' Reiniciar la variable cnt
end if
wend

end. ' Final de programa

En este caso, una interrupcin se habilita despus de que se produzca un desbordamiento en el registro del
temporizador TMR1 (TMR1H, TMR1L). Adems, la combinacin de los bits que vara 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 interrupcin
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 interrupcin

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 lgico 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 ' Interrupcin 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 despus de
ms 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 interrupcin ocurre despus de que se produce un desbordamiento en el registro del
temporizador TMR2. Para invertir el estado lgico de los pines del puerto se utiliza el procedimiento
Reemplazar, que normalmente no pertenece al lenguaje mikroBasic.
4.7 EJEMPLO 5
Utilizar el temporizador perro - guardin
Este ejemplo muestra cmo NO se debe utilizar el temporizador perro-guardin. Un comando utilizado para
reiniciar este temporizador se omite a propsito en el bucle del programa principal, lo que habilita al
temporizador perro guardin ganar la batalla del tiempo y reiniciar al microcontrolador. Por consiguiente, el
microcontrolador se va a reiniciar sin parar, lo que indicar el parpadeo de los LEDs del puerto PORTB.

'Cabecera ******************************************************
program example_5 ' Nombre de programa
main: ' Inicio del programa
OPTION_REG = 0x0E ' Pre-escalador se le asigna al
temporizador WDT (1:64)
asm CLRWDT ' Comando en ensamblador para reiniciar el
temporizador WDT
end asm
PORTB = 0x0F ' Valor inicial del registro PORTB
TRISB = 0 ' Todos los pines del puerto PORTB se configuran como
salidas
Delay_ms(300) ' Tiempo de retardo de 30mS
PORTB = 0xF0 ' Valor del puerto PORTB diferente del inicial
while 1 ' Bucle infinito. El programa se queda aqu hasta que
el
wend ' temporizador WDT reinicie al microcontrolador
end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perro-guardin al
seleccionar la opcin Tools/mE Programmer/Watchdog Timer - Enabled.

S-ar putea să vă placă și