Académique Documents
Professionnel Documents
Culture Documents
1. INTRODUCCION
En estas notas se examinan los temporizadores del 80C31. Se inicia con una simplificada vista de los
temporizadores como ellos son comnmente usados con microprocesadores o microcontroladores.
Un temporizador es una serie de flip-flops divisores por dos que reciben una seal de entrada como una
fuente de reloj. El reloj se aplica al primer flip-flop, el que divide a la frecuencia del reloj por 2. La
salida del primer flip-flop sirve de reloj del segundo flip-flop, el que tambin divide por 2, y as
sucesivamente. ya que cada etapa sucesiva divide by 2, un temporizador con n etapas divide a la
frecuencia de la entrada de reloj by 2n. la salida de la ltima etapa funciona como reloj del flip-flop con
la bandera que indica el desborde del temporizador, la cual es probada por el software o genera una
interrupcin. El valor binario en los flip-flops del temporizador pueden tomarse como un "conteo" del
nmero de pulsos de reloj (o " eventos") ya que el temporizador fue arrancado. Un timer de16 bits, por
ejemplo, contara desde 0000H hasta FFFFH. La bandera de desborde se hace 1 en el desborde del
contador de FFFFH a 0000H.
La operacin de un temporizador simple se ilustra en la Figura 1 para un timer de 3 bits. Cada etapa se
muestra como un flip-flop tipo D disparado por flanco negativo operando en el modo de divisin por
dos (i.e., la salida se conecta a la entrada D ). El flip-flop de bandera es simplemente un candado tipo D,
que se hace 1 por la ltima etapa del timer. Es evidente en el diagrama de tiempos en la Figura 1b que
la primera etapa (Q0) conmuta a una frecuencia 1/2 de la del reloj, la segunda etapa a 1/4 la frecuencia
del reloj, y as sucesivamente. El conteo se exhibe en decimal, y es verificado fcilmente al examinar el
estado del los tres flip-flops. Por ejemplo, el conteo "4" ocurre cuando Q0, = 1, Q1, = 0, y Q2,= 0 (410 =
l002).
Los temporizadores son usados en virtualmente todas las aplicaciones orientadas al control, y los
temporizadores del 8051 no son la excepcin. hay dos temporizadores de 16-bit cada uno con cuatro
modos de operacin. Un tercer temporizador de 16-bits con tres modos de operacin se aadi al 8052.
Los temporizadores se usan para (a) intervalos de tiempo, (b) conteo de eventos, o (c) generacin de
baud rates para el puerto serial. Cada uno es un timer de 16 bits, por tanto, la 16ava o ltima etapa
divide la frecuencia de la entrada de reloj por 216 = 65,536. En aplicaciones de intervalos de tiempo, un
temporizador se programa para desbordarse a un intervalo regular y hacer 1 a la bandera de desborde
del temporizador. la bandera es usada para sincronizar al programa para llevar a cabo una accin tal
como cotejar el estado de una entrada o de envo de datos hacia las salidas. Otras aplicaciones pueden
usar los pulsos regulares del temporizador para medir e tiempo transcurrido entre dos condiciones (e.g.,
medicin del ancho de un pulso).
El registro TMOD contiene dos grupos de cuatro bits que fijan el modo de operacin par el
Temporizador 0 y el Temporizador 1. (Ver Tabla 2 y Tabla 3.)
TMOD no es bit-direccionable, ni necesita serlo. Generalmente, el es cargado una vez por el software al
inicio de un programa para iniciar el modo del temporizador . En lo sucesivo, el temporizador puede ser
parado, arrancado, y as na y otra vez al acceder a otros SFRs del temporizador.
El registro TCON contiene bits de estatus y de control para el Temporizador 0 y para el Temporizador
1 (ver Tabla 4). Los cuatro bits superiores en TCON (TCON.4 a TCON.7) se usan para apagar y
encender los temporizadores (TR0, TR1), o para sealar el desborde de un temporizador (TF0, TF1).
Cada temporizador se discute a continuacin. Ya que hay dos temporizadores en el 80C51, la notacin
"x" se usar para implicar ya sea al Temporizador 0 o al Temporizador 1; o sea. "THx" significa bien
TH1 o TH0 dependiendo del timer.
El arreglo de registros de temporizador TLx y THx y de banderas de desborde de temporizador TFx se
muestran en la Figura 2 para cada modo.
El modo 0 es un temporizador en modo de 13-bit que provee compatibilidad con el predecesor del
8051, el microcontrolador de INTEL, el 8048. Este modo no es generalmente usado en diseos nuevos.
(ver Figura 2a.) El byte alto del temporizador (THx) se pone en cascada con los cinco bits menos
significativos del byte bajo (TLx) del temporizador para formar un timer de 13 bits. Los tres bits altos
de TLx no se usan.
El modo 2 es de 8 bits con auto recarga. El byte bajo del temporizador (TLx) opera como un
temporizador de 8 bits mientras el byte alto del temporizador (THx) guarda el valor de recarga. Cuando
el contador se desborda desde FFH a 00H, no slo es la bandera del temporizador que se hace 1, sino
que el valor en THx es cargado en TLx; el conteo contina desde este valor up hacia arriba hasta la
siguiente transicin de FFH a 00H, y as indefinidamente. Este modo es conveniente, ya que el
temporizador se desborda a intervalos especficos, peridicos, una vez que TMOD y THx han sido
iniciados. (ver Figura 2c.)
5 Fuentes de Reloj
La figura 2 nos muestra como los temporizadores son excitados. Hay dos posibles fuentes de reloj,
seleccionadas al escribir al bit contador/temporizador (C/ T ) en TMOD cuando el temporizador es
iniciado. Una fuente de reloj es usada para producir intervalos de tiempo, la otra para contar eventos.
La figura 2 ilustra las varias configuraciones para los registros TLx y THx del temporizador, y las
banderas, TFx, de desborde del temporizador. Las dos posibilidades para avanzar los temporizadores se
muestran en la figura 3. Ahora se demostrar como arrancar, parar, y controlar a los temporizadores.
El mtodo ms simple para arrancar y parar los temporizadores es con el bit de control de corrida, TRx,
en TCON. TRx es limpiado tras un reset del sistema; ello es, los temporizadores se deshabilitan
(parados) por default. TRx se hace 1 mediante software para echar a volar los temporizadores (ver
figura 4). Ya que TRx est en el registro bit-direccionable TCON, es fcil arrancar y detener los
temporizadores dentro de un programa. Por ejemplo, el temporizador 0 es arrancado mediante
SETB TR0
y detenido mediante
CLR TR0
El ensamblador llevar a cabo la necesaria conversin simbolica de "TR0 a la direccin correcta del
bit. SETB TR0 es exactamente lo mismo que SETB 8CH.
Otro mtodo para controlar los timers es con el bit GATE en TMOD y la entrada externa INTx .
Haciendo GATE = 1 permite al timer ser controlado mediante INTx . ello es til para medir ancho de
Los timers son usualmente iniciados una vez al comienzo de un programa para fijar el modo correcto de
operacin. En lo sucesivo, dentro del cuerpo de un programa, los timers se arrancan, detienen, lo bits de
bandera se prueban y limpian, los registros del temporizador son ledos o actualizados, etc., como
requiera la aplicacin.
TMOD es el primer registro iniciado, ya que l fija el modo de operacin. Por ejemplo, la siguiente
instruccin inicia al Timer 1 como un timer de 16-bits (modo 1) avanzado por el oscilador interno
(intervalo de tiempo):
Cuando el timer se desborda, es necesario parar el timer y limpiar la bandera de desborde con software:
En algunas aplicaciones, es necesario leer el valor en los registros del timer "en caliente". Existe un
problema potencial que es simple protegerse contra l en software. Dado que dos registros del timer
deben ser ledos, un "error de fase " puede ocurrir si el byte bajo se desborda en el byte alto entre las
dos operaciones de lectura. Un valor que nunca se tuvo puede ser ledo. La solucin es leer el byte alto
primero, luego el byte bajo, y entonces leer el byte alto otra vez. Si el byte alto ha cambiado, repetir las
operaciones de lectura. Las instrucciones siguientes leen los contenidos de los registros TL0/TH0 del
timer en los registros R6/R7, lidiando correctamente con tal problema.
El siguiente programa crea quince pulsos con periodo de cada onda igual a 26 s usando slo software.
En el campo de comentarios para cada instruccin se coloc el nmero de ciclos de mquina que toma
la instruccin. Al sumar los ciclos se obtiene que el periodo de la onda consta de 24 ciclos de mquina,
diez de ellos en alto y 14 en bajo. Como cada ciclo de mquina dura 1.085 s, el periodo es igual a
26.04 s, o sea 38.4 kHz. Se supone un cristal de 11.0592MHz.
MOV R2,#15
ACALL LAZO
NOP
...
LAZO:
SETB P1.0 ; 1 (14 EN BAJO)
ACALL DOS ; 2+7
CLR P1.0 ; 1 (10 EN ALTO)
NOP ; 1
NOP ; 1
ACALL DOS ; 2+7
DJNZ R2,LAZO ; 2
RET
Escribir un programa usando al Timer 0 para crear una onda cuadrada de 4.8 kHz en P1.0.
Una onda cuadrada de 4800 Hz requiere un tiempo alto de 104.16 s y un tiempo bajo de 104.16 s.
Puesto que esta intervalo es menor que 277 s, el timer 0 en modo 2 puede usarse. Se supone un cristal
de 11.0592 MHz. Un desborde cada 104.16 s requiere un valor de recarga en TH0 de 96 cuentas
menos que 00H, o -96. Aqu est el programa:
ORG 100H
MOV TMOD, #02H ; 8 bits, modo de auto recarga
MOV TH0, #-96 ;-96 valor de recarga en TH0
SETB TR0 ; arranca al timer
BUC: JNB TF0, BUC ; espera el desborde
CLR TF0 ; limpia bandera del desborde del timer
CPL P1.0 ; conmuta bit del puerto
SJMP BUC ; repite
END
Este programa usa una instruccin para complementar el bit (CPL) en lugar de las instrucciones
booleanas SETB y CLR del ejemplo previo. Entre cada operacin de complemento, un retardo de 1/2 el
periodo deseado (104.16 s) es programado usando al Timer 0 en el modo de 8-bits con auto-recarga.
El valor de recarga puede ser especificado usando notacin decimal como -96, en vez de usar notacin
hexadecimal. El ensamblador realiza la conversin necesaria (0A0H). Notar que la bandera de desborde
del timer (TF0) debe ser explcitamente limpiada por el software despus de cada desborde.
Los intervalos de tiempo mayores que 277 s deben usar a timer en modo 1 de 16 bits. El retardo
mximo es 216 = 65,536 cuentas, alrededor de 71.1 milisegundos. El inconveniente del modo 1 es que
los registros del timer deben reiniciarse ras cada desborde, mientras que la recarga es automtica en el
modo 2.
Escribir un programa usando al Timer 0 para crear una onda cuadrada de 600 Hz en P1.0.
Una onda cuadrada de 600 Hz requiere un tiempo alto de 833.33 s y un tiempo bajo de 833.33 s.
Puesto que esta intervalo es mayor que 277 s, el timer 0 en modo 1 debe usarse. Se supone un cristal
de 11.0592 MHz. Un desborde cada 833.33 s requiere un valor de recarga en TH0 de 768 cuentas
menos que 0000H, o -768. Aqu est el programa:
Los intervalos de tiempo mayores que 71.1 ms deben usar a timer en modo 1 de 16 bits pero
combinndolo con un contador dentro de un bucle de software. El retardo mximo del modo 1, como ya
se dijo, es 216 = 65,536 cuentas de 1.085 s cada una, alrededor de 71.1 milisegundos.
Escribir un programa usando interrupciones para simultneamente crear tres ondas cuadradas:
una de 14.4 kHz, otra de 300 Hz y una ms de 15 Hz en P1.7, P1.6 y P1.5, respectivamente.
La configuracin de hardware con la temporizacin para las formas de onda deseadas se ofrece en la
Figura 6. Tal combinacin de salidas sera extremadamente difcil de generar en un sistema sin
interrupciones. El timer 0, provee sincronizacin para la seal de 14.4 kHz, opera en el modo 2, como
en el ejemplo previo: y el timer 1, provee sincronizacin para la onda de 300 Hz. Puesto que la seal de
300 Hz necesita 1.666 ms en alto y tambin 1.666 ms en bajo, el modo 2 no se puede usar para este
caso. (Recordar que 277 s es el mximo intervalo de tiempo en el modo 2 cuando el 80C31 opera a
11.0592 MHz.) Aqu est el programa:
1 0000 ORG 0
2 0000 802E SJMP MAIN
3 000B ORG 00BH ; vector del Timer 0
4 000B 8034 SJMP T0ISR
5 001B ORG 01BH ; vector del Timer 1
6 001B 8027 SJMP TlISR
7 001D
8 0030 ORG 0030H
9 0030 758912 MAIN: MOV TMOD,#12H ;Timer 1 = modo 1
10 0033 ;Timer 0 = modo 2
11 0033 758CE0 MOV TH0,#-32 ;14.4 kHz usando timer 0
12 0036 D28C SETB TR0
13 0038 D28F SETB TF1 ;fuerza interrupcion timer 1
14 003A 75A88A MOV IE,#8AH ;permite ambos timers interrumpan
15 003D 7C00 MOV R4,#0 ; inicia contador
16 003F 80FE SJMP $
17 0041
18 0041 B297 T0ISR: CPL P1.7
19 0043 32 RETI
20 0044
21 0044 C28E TlISR: CLR TR1 ; Apaga al timer
22 0046 758DFA MOV TH1, #HIGH(-1536) ; 1.666 ms tiempo alto &
23 0049 758B00 MOV TL1, #LOW(-1536) ; tiempo bajo igual
24 004C D28E SETB TR1 ; enciende al timer
25 004E B296 CPL P1.6
26 0050 0C INC R4 ; incrementa contador
27 0051 BC1404 CJNE R4,#20,FIN
28 0054 7C00 MOV R4,#0 ; reinicia contador
29 0056 B295 CPL P1.5
30 0058 32 FIN: RETI
31 0059 END
Aqu, el marco es para un programa completo que puede ser instalado en EPROM o ROM en un
producto basado en el 80C31. El programa principal y las ISRs se localizan encima de las localidades
de los vectores para el reset del sistema y ambas interrupciones, aunque la ISR para el timer 0 slo mide
tres bytes, por lo que bien pudo quedar a partir de la localidad 000BH. Las tres formas de ondas se
crean mediante instrucciones booleanas "CPL"; empero, los intervalos de tiempo necesitan mtodos
algo diferentes para cada uno.
Puesto que los registros TL1/TH1 deben ser recargados tras cada desborde (i.e. despus de cada
interrupcin), la ISR del timer 1 (a) detiene al timer, (b) recarga TL1/TH1, (c) arranca al timer, luego
(d) complementa al bit 6 del puerto 1, y si procede complementa el bit P1.5 para los 15 Hz. Notar
La ISR del Timer 0, como era de esperarse, simplemente complementa el bit 7 del puerto 1 y retorna,
mediante la instruccin RETI al programa principal. SJMP $ se usa en el programa principal para
abreviar la forma de ACA: SJMP ACA. Las dos formas son funcionalmente equivalentes. Notar que
las banderas de desborde TF0 y TF1 no son limpiadas explcitamente por el software, pues al usar
interrupciones dichas banderas son borradas por el hardware al saltar a la ISR (Rutina de Servicio a
Interrupcin) respectiva.
Un buzzer se conecta a P1.7 y un switch sin rebotes se conecta a P1.6. Escribir un programa que
lea el nivel lgico producido por el switch y suene el buzzer por un segundo por cada transicin
de1 a 0 detectada.
El buzzer en la figura 7 es un transductor piezo cermico que vibra cuando es estimulado con un voltaje
de CD. El objetivo aqu es generar un tono alrededor de 3.3 kHz a 5 voltios CD. Un inversor se usa
como driver pues el buzzer toma 8 mA de corriente. Como indican las caractersticas de CD del 8051 en
el manual, las patas del Puerto 1 pueden sumir un mximo de 1.6 mA. Crear retardos de software es uno
de las ms comunes tareas de programacin dadas a estudiantes de microprocesadores. El mtodo usual
de decrementar un contador dentro de un bucle no es necesario en el 8031, pues cuenta con timers
propios. Una subrutina de 1 segundo de retardo usando al Timer 0 se muestra en este ejemplo.
Hay dos situaciones no manejadas en el ejemplo visto. Primero, si la entrada conmuta durante el
segundo que el buzzer est sonando, la transicin no es detectada, ya que el software est ocupado en la
rutina delay. Segundo, si la entrada conmuta rpidamente en fraccin de milisegundo la transicin
puede ser no detectada tanto por las instrucciones JNB y JB.
PROBLEMAS
1. Escribir un programa para el 80C31 que produzca una onda casi cuadrada en P1.5 de 48.5
kHz, sin usar los timers.
2. Escribir un programa en el 80C31 que produzca una onda cuadrada en P1.2 de 12.5 kHz,
usando el timer 0.
3. Modificar el ejemplo 3 para que la frecuencia sea de 440 Hz.
4. Modificar ejemplo 1 para obtener una frecuencia de 30.8 kHz con 40% de duty,
tiempo _ alto
duty= 100 %.
periodo
5. Modificar ejemplo 4 para que la onda en P1.5 sea de 60Hz.
6. Programar el timer 1 para tener un baud rate de 19,200 bps en el puerto serial.
7. Modificar ejemplo 5 para que el buzzer suene en una deteccin si y la siguiente no.
8. Usar interrupciones en el timer 0, modo 1, para generar en P1.5 un periodo de 20 ms con
33% de duty.
10. Aadir el circuito dado del problema anterior al cableado de la prctica 5 que corre al
programa monitor, pero usando la entrada INT 0 y programar la interrupcin externa. Enviar
el tiempo real a exhibirse en la pantalla de la PC, cada 5 segundos.