Timer0 Como Un Contador

8
Timer0 como un contador, declarar variables nuevas, utilizar símbolos, utilizar relés... En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa sin haber sido afectado de ninguna forma por su entorno. En la práctica, hay pocos dispositivos que funcionen de esta manera (por ejemplo, un simple controlador de luz de neón). Los pines de entrada se utilizan también en este ejemplo. En la siguiente figura se muestra un esquema, mientras que el programa está en la siguiente página. Todo sigue siendo muy simple. El temporizador TMR0 se utiliza como un contador. La entrada del contador está conectada a un botón de presión, así que cada vez que se presiona el botón, el temporizador Timer0 cuenta un pulso. Cuando el número de pulsos coincida con el número almacenado en el registro TEST, un uno lógico (5V) aparecerá en el pin PORTD.3. Este voltaje activa un relé electromecánico, y por eso este bit se le denomina ‘RELÉ’ en el programa. En este ejemplo, el registro TEST almacena el número 5. Por supuesto, eso puede ser cualquier número obtenido al calcular o definido como una constante. Además, el microcontrolador puede activar algún otro dispositivo en vez de relé, mientras que el sensor se puede utilizar en vez del botón de presión. Este ejemplo muestra una de las aplicaciones más comunes del microcontrolador en la industria; al realizar una cosa el suficiente número de veces, otra cosa debe estar encendida o apagada.

Transcript of Timer0 Como Un Contador

Page 1: Timer0 Como Un Contador

Timer0 como un contador, declarar variables nuevas, utilizar símbolos, utilizar relés...

En cuanto a los ejemplos anteriores, el microcontrolador ha ejecutado el programa sin haber sido afectado de

ninguna forma por su entorno. En la práctica, hay pocos dispositivos que funcionen de esta manera (por

ejemplo, un simple controlador de luz de neón). Los pines de entrada se utilizan también en este ejemplo. En

la siguiente figura se muestra un esquema, mientras que el programa está en la siguiente página. Todo sigue

siendo muy simple. El temporizador TMR0 se utiliza como un contador. La entrada del contador está

conectada a un botón de presión, así que cada vez que se presiona el botón, el temporizador Timer0 cuenta

un pulso. Cuando el número de pulsos coincida con el número almacenado en el registro TEST, un uno lógico

(5V) aparecerá en el pin PORTD.3. Este voltaje activa un relé electromecánico, y por eso este bit se le

denomina ‘RELÉ’ en el programa. 

En este ejemplo, el registro TEST almacena el número 5. Por supuesto, eso puede ser cualquier número

obtenido al calcular o definido como una constante. Además, el microcontrolador puede activar algún otro

dispositivo en vez de relé, mientras que el sensor se puede utilizar en vez del botón de presión. Este ejemplo

muestra una de las aplicaciones más comunes del microcontrolador en la industria; al realizar una cosa el

suficiente número de veces, otra cosa debe estar encendida o apagada.

' Cabecera ******************************************************program example_3 ' Nombre del programa

Page 2: Timer0 Como Un Contador

symbol RELAY = PORTD.3 ' Pin del puerto PORTD.3 es denominado RELÉdim TEST as byte ' Variable TEST es de tipo bytemain: ' Inicio del programaTEST = 5 ' Constante TEST = 5ANSEL = 0 ' All I/O pins are configured as digitalANSELH = 0PORTA = 0 ' Reiniciar el puerto PORTATRISA = 0xFF ' Todos los pines de E/S se configuran como digitales PORTD = 0 ' Reiniciar el puerto PORTDTRISD = %11110111 ' Pin RD3 se configura como una salida, mientras que los ' demás se configuran como entradasOPTION_REG.5 = 1 ' Contador TMR0 recibe los pulsos por el pin RA4OPTION_REG.3 = 1 ' Valor del pre-escalador es 1:1TMR0 = 0 ' Reiniciar el temporizador/contador TMR0

while 1if TMR0 = TEST then ' ¿Coincide el número en el temporizador con la constante TEST?

RELAY = 1 ' Números coinciden. Poner el bit RD3 a uno (salida RELÉ)end ifwend ' Quedarse en el bucle infinito

end. ' Final de programa

Sólo un símbolo (RELÉ) se utiliza aquí. Se le asigna el tercer pin del puerto PORTD en la declaración.

symbol RELAY = PORTD.3 ' Símbolo 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 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

Page 3: Timer0 Como Un Contador

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 programadim 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óncnt = cnt + 1 ' Interrupción causa que la cnt se incremente en 1TMR0 = 96 ' El valor inicial se devuelve en el temporizador TMR0INTCON = 0x20 ' Bit T0IE se pone a 1, el bit T0IF se pone a 0end sub ' Final de la rutina de interrupción

main: ' Inicio del programaOPTION_REG = 0x84 ' Pre-escalador se le asigna al temporizador TMR0ANSEL = 0 ' Todos los pines de E/S se configuran como digitalesANSELH = 0TRISB = 0 ' Todos los pines de puerto PORTB se configuran como salidas

Page 4: Timer0 Como Un Contador

PORTB = 0x0 ' Reiniciar el puerto PORTBTMR0 = 96 ' Temporizador T0 cuenta de 96 a 255INTCON = 0xA0 ' Habilitada interrupción TMR0cnt = 0 ' A la variable cnt se le asigna un 0

while 1 ' Bucle infinitoif cnt = 50 then ' Incrementar el puerto PORTB después 50 interrupciones PORTB = PORTB + 1 ' Incrementar número en el puerto PORTB en 1cnt = 0 ' Reiniciar la variable cntend ifwend

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 programadim cnt as byte ' Definir la  variable cnt

sub procedure interrupt ' Definir el subprocedimiento de interrupcióncnt = cnt+1 ' Interrupción causa que la cnt se incremente en 1PIR1.TMR1IF = 0 ' Reiniciar el bit TMR1IFTMR1H = 0x80 ' El valor inicial se devuelve en los registrosTMR1L = 0x00 ' del temporizador TMR1H y TMR1Lend sub ' Final de la rutina de interrupción

main: ' Inicio del programaANSEL = 0 ' Todos los pines de E/S se configuran como digitalesANSELH = 0PORTB = 0xF0 ' Valor inicial de los bits del puerto PORTBTRISB = 0 ' Los pines del puerto PORTB se configuran como salidasT1CON = 1 ' Configurar el temporizador TMR1PIR1.TMR1IF = 0 ' Reiniciar el bit TMR1IFTMR1H = 0x80 ' Poner el valor inicial para el temporizador TMR1TMR1L = 0x00PIE1.TMR1IE = 1 ' Habilitar la interrupción al producirse un desbordamiento cnt = 0 ' Reiniciar la variable cntINTCON = 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

Page 5: Timer0 Como Un Contador

76 interrupcionesPORTB = not PORTB ' Número en el puerto PORTB está invertidocnt = 0 ' Reiniciar la variable cntend ifwend

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 programadim 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ónif PIR1.TMR2IF then ' Si el bit TMR2IF = 1,cnt = cnt +1 ' Incrementar variable la cnt en 1 PIR1.TMR2IF = 0 ' Reiniciar el bit yTMR2 = 0 ' Reiniciar el registro TMR2end ifend sub ' Final de la rutina de interrupción

main: ' Inicio del programacnt = 0 ' Reiniciar la variable cntANSEL = 0 ' Todos los pines de E/S se configuran como digitalesANSELH = 0PORTB = %10101010 ' Estado lógico en los pines del puerto PORTBTRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidasT2CON = 0xFF ' Configurar el temporizador T2TMR2 = 0 ' Valor inicial del registro del temporizador TMR2PIE1.TMR2IE = 1 ' Interrupción habilitadaINTCON = 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

Page 6: Timer0 Como Un Contador

Replace ' Subprocedimiento Reemplazar invierte el estado del puerto PORTB cnt = 0 ' Reset variable cnt end ifwend

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.

4.7 EJEMPLO 5

Utilizar el temporizador perro - guardián

Este ejemplo muestra cómo NO se debe utilizar el temporizador perro-guardián. Un comando utilizado para

reiniciar este temporizador se omite a propósito en el bucle del programa principal, lo que habilita al

temporizador perro guardián “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.

Page 7: Timer0 Como Un Contador

'Cabecera ******************************************************program example_5 ' Nombre de programamain: ' Inicio del programaOPTION_REG = 0x0E ' Pre-escalador se le asigna al temporizador  WDT  (1:64)asm CLRWDT ' Comando en ensamblador para reiniciar el temporizador WDTend asmPORTB = 0x0F ' Valor inicial del registro PORTB TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidasDelay_ms(300) ' Tiempo de retardo de 30mSPORTB = 0xF0 ' Valor del puerto PORTB diferente del inicialwhile 1 ' Bucle infinito. El programa se queda aquí hasta que elwend ' temporizador WDT reinicie al microcontroladorend. ' Final de programa

Para que este ejemplo funcione apropiadamente, es necesario habilitar al temporizador perro-guardián al

seleccionar la opción Tools/mE Programmer/Watchdog Timer - Enabled.