Vous êtes sur la page 1sur 18

TEMPORIZADORES

El tiempo está presente en todo momento, y medirlo es un aspecto importante en casi cualquier
aplicación electrónica. Una de las primeras aplicaciones desarrolladas en el mundo de la
electrónica digital fueron los circuitos para medir el tiempo, y estos adquirieron tal importancia,
que están presentes en casi cualquier dispositivo electrónico moderno. En nuestro caso,
hablaremos de los circuitos temporizadores de los microcontroladores.
El elemento fundamental del temporizador es un contador binario, encargado de contar los
pulsos suministrados por algún circuito oscilador, con una base de tiempo estable y conocida.

La estructura básica de un temporizador está compuesto por tres bloques fundamentales:
•Contador binario: es el elemento básico del temporizador y su misión es contar los pulsos del
reloj. Sus características son:
•La cantidad de pulsos que puede contar.
•Controlar el evento de cuenta: ascendente o descendente.
•Circuitos de configuración y control: es la interfaz entre el contador binario y elementos
externos.
•Circuitos especializados de salida: Se utilizan para notificar, a otro elemento del sistema,
sobre el estado del temporizador o acerca de la ocurrencia de un determinado evento.
Características
Las características de un temporizador son:
• Longitud del contador: Determina la cantidad máxima de pulsos que se pueden contar. Los
más comunes son de 8 ó 16 bits.
• Lectura/escritura: En general, los temporizadores pueden ser escritos o leídos por el
procesador. En algunos casos, donde el temporizador está vinculado a algún periférico muy
específico, esta opción puede no existir o estar limitada.
• Modos de trabajo: Existen, en principio dos modos:
• Contador: cuenta los pulsos desde una fuente externa al procesador. Los pulsos contados
pueden tener período variable.
• Temporizador: cuentan los pulsos suministrados por una fuente estable y conocida, que
puede ser externa, o interna

 Forma de conteo: El conteo típico es ascendente, sin embargo, existen contadores con la
opción de configurar el modo de conteo (ascendente o descendente).
• Configuración de activación por flanco: Permite establecer cuando se produce el conteo, si
en el flanco de subida del reloj o en el flanco de bajada del reloj.
• Configuración del reloj: Permite configurar la base de tiempo del reloj. Para ello usa un
bloque funcional denominado Pre-escalador:
• Un pre-escalador, es básicamente otro contador que se coloca antes del contador principal
del temporizador y su función es dividir la señal del reloj a la entrada del contador principal.
Generalmente la longitud es configurable, pero no se permite leerlos o escribirlos por
software.

 Interrupciones: En la mayoría de casos, los temporizadores tienen interrupciones asociadas,
con el objetivo de notificar al procesador que ha ocurrido el cruce por cero o algún valor
específico en el registro de conteo.

TIMER0
El Timer0 tiene una amplia gama de aplicaciones. Se utiliza para generar pulsos de duración
arbitraria, en medir tiempo o en contar los pulsos externosU (eventos).
El Timer0 es un temporizador/contador de 8 bits con las siguientes características:
•Temporizador/contador de 8 bits.
•Pre-escalador de 8 bits, el cual es compartido con el WDT (Temporizador Perro Guardián).
•Generación de interrupción por desbordamiento.
•Fuente de reloj interna o externa programable.
•Selección del flanco de reloj externo programable.

Los registros utilizados para configurarlo y trabajar con el Timer0 son:


REGISTRO OPTION_REG
El registro OPTION_REG contiene varios bits de control para configurar el pre-escalador, el
Timer0, la interrupción externa y las resistencias pull-up en el puerto PORTB.


 RBPU: Resistencia Pull-Up del PORTB
• INTEDG: Bit selector de flanco activo de la interrupción externa
• T0CS: Bit selector de tipo de reloj para el Timer0
•1: Pulsos introducidos a través del RA4/TOCKI (contador).
•0: Pulsos de reloj internos Fosc/4 (temporizador).


 T0SE - TMR0
Bit selector de tipo de flanco en RA4/TOCKI. Selecciona el flanco (ascendente o descendente)
contado por el Timer0, por el pin RA4/T0CKI.
•1: Incrementa en flanco descendente en el pin RA4/TOCKI.
•0: Incrementa en flanco ascendente en el pin RA4/TOCKI.

 PSA
Bit que asigna el pre-escalador (hay sólo uno) al Timer0 o al WDT.
•1: Pre-escalador se le asigna al WDT.
•0: Pre-escalador se le asigna al Timer0.

 PS2, PS1, PS0:
Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia). El valor del divisor de
frecuencia se selecciona al combinar estos tres bits. Como se muestra en la siguiente tabla, el
valor del divisor de frecuencia se le asigna al Timer0 o al WDT.

La siguiente figura muestra el esquema del Timer0 con todos los bits que determinan su
funcionamiento. Estos bits se almacenan en el registro OPTION_REG.

El registro del pre-escalador de 8 bits no está disponible al usuario, lo que significa que no es
posible leerlo o escribir en él directamente

Al asignarle el pre-escalador al temporizador, el pre-escalador se pondrá a 0 con cualquier
escritura en el registro TMR0.
•Al escribir en el registro TMR0, utilizado como un temporizador, no se inicia el conteo de los
pulsos inmediatamente, sino con retraso de dos ciclos de instrucciones. Por consiguiente, es
necesario ajustar el valor escrito en el registro TMR0

Registro INTCON

 GIE (Global Interrupt Enable): controla simultáneamente todas las fuentes de interrupciones
posibles.
 PEIE (Peripheral Interrupt Enable): controla interrupciones habilitadas por los periféricos. Eso
significa que no influye en interrupciones causadas por el temporizador Timer0 o por el
cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT.
 TMROIE (TMR0 Overflow Interrupt Enable): controla interrupciones causadas por el
desbordamiento del Timer0.
•1: Habilita interrupciones por Timer0.
•0: Deshabilita interrupciones por Timer0.
 TMR0IF (TMR0 Overflow Interrupt Flag): detecta el desbordamiento en el registro del
temporizador Timer0, o sea el contador se pone a cero.
•1: En el registro del Timer0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por
software).
•0: En el registro del Timer0 no ha ocurrido desbordamiento.

Pasos para configurar TIMER0

Para utilizar el Timer0 apropiadamente, es necesario:
•Paso 1: Seleccionar el modo
•El modo de Timer0, se selecciona por el bit TOSC del registro OPTION_REG:
•TOCS = 0, es modo temporizador.
•TOCS = 1, es modo contador.
•Cuando se asigna el pre-escalador al temporizador se debe poner a cero el bit PSA del
registro OPTION_REG. El valor del divisor de frecuencias se configura al utilizar los bits PS2,
PS1 y PS0 del mismo registro.
•Al utilizar una interrupción, los bits GIE y TMR0IE del registro INTCON deben estar a uno.
•Paso 2: Medir o contar
• Para medir tiempo:
• Reiniciar el registro TMR0 o escribir un valor conocido en él.
• El tiempo transcurrido (en microsegundos al utilizar el oscilador de 4MHz) se mide al leer el
registro TMR0.
• El bit de bandera TMR0IF del registro INTCON se pone a uno automáticamente siempre
que ocurra el desbordamiento del registro TMR0. Si está habilitada, ocurre una interrupción.
• Para contar pulsos:
• La polaridad de pulsos a contar en el pin RA4/T0CKI se selecciona por el bit TOSE del
registro OPTION_REG:
• T0SE = 0, flanco de subida.
• TOSE = 1, flanco de bajada.
• Varios pulsos se pueden leer del registro TMR0. El pre-escalador y la interrupción se utilizan
de la misma forma que en el modo de temporizador.


Ejemplo: Manejo de Timer0 como temporizador sin Interrupciones
En el presente ejemplo programaremos el Timer0 para que cuando llegue a un determinado
valor (CUENTA) cambie el valor lógico del bit 0 de PORTC. Configuraremos el pre-escalador y el
valor de la variable CUENTA para que la frecuencia de oscilación sea lo más cercano a 120 Hz.
Debemos recordar que el Timer0 cuenta desde 0 (o el valor que almacenemos en dicho registro)
hasta FF, luego de lo cual se reinicia nuevamente a 0.

Debemos averiguar qué valor de pre-escalador requerimos para tener un valor de frecuencia los
más cercano a 120 Hz. para ello debemos hacer pruebas con el siguiente programa:

El circuito en Proteus es el siguiente:

Ojo que estamos empleando dos instrumentos virtuales del Proteus: Osciloscopio y
Contador/Timer:



Si comenzamos a probar con diversos valores de pre-escalador tendremos los siguientes
resultados:

Observamos que el mejor resultado es para el pre-escalador de 1:32 y con el valor de cuenta
igual a 0x82.

Ejemplo: Manejo del Timer0 como contador, sin interrupciones
El presente programa contará los pulsos que ingresan por el pin RA4/TOCKI (flanco de subida) y
cada 8 pulsos, incrementará la cuenta que se visualiza en los display. Emplearemos el pre-
escalador y lo configuramos a 1:8. El programa en assembler es:

El circuito en Proteus es el siguiente:






Ejemplo: Manejo del Timer0 como contador, sin interrupciones
El presente programa contará los pulsos que ingresan por el pin RA4/TOCKI (flanco de subida) y
cada 10 pulsos, incrementará la cuenta que se visualiza en los display. El programa en
assembler es:


El circuito en Proteus es el siguiente:


Ejemplo: Manejo de Timer0 como temporizador y con Interrupciones
En el presente ejemplo programaremos el Timer0 para que inicie la cuenta a partir de un cierto
valor y cuando cambie de FF a 00, invierta el valor lógico de PORTC. Configuraremos el pre-
escalador y el valor de la variable CUENTA para que la señal que se genera en el PORTC sea
de 120 Hz.



El circuito a emplear es el mismo que el primer ejemplo:





















TAREA 6

Elaborar un programa que permita disparar un tiristor según el circuito mostrado. Las
características del programa son:
•El circuito de cruce por cero generá un pulso cada vez que la señal alterna (AC) pasa por cero
voltios.
•Dicha señal debe ser usada para generar interrupción al microcontrolador por el pin RBO.
•Cada vez que se genera interrupción por RBO. El programa de atención a la interrupción
configura un timer para que realice una cuenta de tiempo proporcional al valor leído en el
PORTC. Dicho tiempo es el equivalente al ángulo de disparo, por lo tanto debe variar entre 0 a
8.33 milisegundos aproximadamente.
•PORTC = 0x00, equivale aproximadamente a un ángulo de disparo igual a cero grados.
•PORTC = 0xFF, equivale aproximadamente a un ángulo de disparo de 180 grados
•Una vez que el timer llegue al final de la cuenta generá un interrupción. El programa de
atención a la interrupción deberá activar el pin RB1 por un tiempo que debe estar en
microsegundos (revisar el datasheet de algún Tiristor para tener una referencia de tiempo). Este
tiempo debe ser generado por una rutina de delay (no use timer). Finalizado el tiempo deberá
desactivar el pin RB1.
•El programa pirncipal debe estar mostrando una cuenta del 0 a 255 por el PORTD a un
frecuencia "visible al ojo humano".

Observar que el programa de atención a la interrupción debe "atender" a dos tipos de
interrupciones:
•La interrupción generada por el cruce por cero (RBO).
•La interrupción generada por el timer.

Analice que algoritmo empleará para atender a estas dos interrupciones. El plazo de entrega
vence el domingo 31 de agosto a las 23:55 horas.