Sei sulla pagina 1di 16

Tema 9

Temporizadores

El 8253 es un temporizador/contador de uso general. El 8254 es una versión más


rápida del 8253. Ambos poseen 3 temporizadores (down counters) que pueden contar
en binario o en BCD. Cada temporizador posee un registro contador de 16 bits.

D7 1 13 Vcc

D6 2 14 WR

D5 3 15 RD

D4 4 16 CS

D3 5 17 A1

D2 6 18 A0
8254
D1 7 19 CLK2

D0 8 20 OUT2

CLK0 9 21 GATE2

OUT0 10 22 CLK1

GATE0 11 23 GATE1

GND 12 24 OUT1

Este chip necesita un generador de reloj externo y debe estar conectado al bus de un
sistema procesador para poder establecer el modo de operación, así como programar
en el los valores de conteo. Cada uno de los temporizadores o Timers puede ser
programado en forma individual.
198 Microprocesadores de 16 bits y tecnología PC

A grandes rasgos, cada temporizador tiene:

• Una entrada de reloj (CLK)


• Una entrada de habilitación (GATE)
• Una salida (OUTPUT)
Para el caso particular del PC, cada temporizador posee una función especifica:

• Temporizador 0 = Tic del sistema (genera pulsos a una frecuencia de 18,2 Hz)
asignado al vector de interrupción 8 (IRQ 0 en el 8259).
• Temporizador 1 = Controla el ciclo de refresco del DMA (cada 15
microsegundos).
• Temporizador 2 = Controla el sonido del altavoz.
De estos tres temporizadores, los temporizadores 0 y 2 pueden ser manipulados por el
programador. El temporizador 1 no debe ser manipulado ya que puede provocar la
caída del sistema.

CLK 0
Registro
D7 - D0 8 Canal de Temp. 0 GATE 0
datos
OUT 0

RD CLK 1
WR Logica
Lectura/ Temp. 1 GATE 1
Línea interna

Escritura
A0
OUT 1
A1

CS

CLK 2
Regsitro
Palabra de Temp. 2 GATE 2
Control
OUT 2

Diagrama funcional del 8254

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 199

Distribución de pines
La definición de pines del 8254 es como se muestra a continuación:

A1, A0
Entradas de direccionamiento. Seleccionan uno de los cuatro registros internos.

CLK
Entrada de reloj. Es la fuente de temporización para cada contador

CS
Selección (activa baja)

GATE
Control de activación/desactivación de cada temporizador

OUT
Salida del contador

RD
Lectura de datos de los registros

WR
Escritura de datos a los registros

VCC y GND
Líneas de alimentación

Descripción funcional
El buffer del bus de datos, de 8 bits y tres estados, comunica el 8254 con la CPU. La
lógica de lectura y escritura acepta entradas del bus y genera señales de control para
las partes funcionales del 8254. Las líneas A0..A2 seleccionan uno de los tres
contadores o el registro de la palabra de control, para poder leerlos o escribirlos. El
registro de la palabra de control es seleccionado cuando A0=A1=1, este registro sólo
puede ser escrito (se puede obtener información de estado, como se verá más
adelante, con el comando read-back del 8254, no disponible en el 8253). Los
contadores 1, 2 y 3 son idénticos en su funcionamiento, por lo que sólo se describirá
uno; son totalmente independientes y cada uno de ellos puede ser programado en una
modalidad diferente. Si se observa el esquema de un contador, a la derecha, se verá el
registro de la palabra de control: aunque no es parte del contador propiamente dicho,
afecta a su modo de funcionamiento. El registro de estado, cuando es transferido al
correspondiente latch, contiene el valor en curso del registro de la palabra de control
y alguna información adicional (como se verá después en el comando read-back). El
contador propiamente dicho está representado en la figura por CE (Counting

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


200 Microprocesadores de 16 bits y tecnología PC

Element) y es un contador descendente síncrono de 16 bits que puede ser inicializado.


OLM y OLL son dos latch de 8 bits (OL significa Output Latch; los subíndices M y L
están relacionados con el más y el menos significativo byte, respectivamente); ambos
son referenciados normalmente como un conjunto denominado OL a secas. Estos
latches siguen normalmente la cuenta descendente de CE, pero la CPU puede enviar
un comando para congelarlos y poder leerlos; tras la lectura continuarán siguiendo a
CE. La lógica de control del contador se encarga de que un sólo latch esté activo a un
tiempo, ya que el bus interno del 8254 es de 8 bits. CE no puede ser nunca leído
directamente (lo que se lee es OL). De manera análoga, existen un par de registros
CRM y CRL (CR significa Count Register) que almacenan la cuenta del contador y
se la transmiten convenientemente a CE. Los valores de cuenta se escriben siempre
sobre CR (y no directamente sobre CE). La lógica de control gestiona la conexión con
el exterior a través de las líneas CLK, GATE y OUT.

Programación del 8254


La programación se efectúa escribiendo en el registro de control

Los temporizadores funcionan como Down Counter esto es, contadores hacia abajo.
Cada contador o temporizador puede contar desde 0000H hasta FFFFH (en modo
binario) o desde 0000 hasta 9999 (en modo BCD).

Para leer y escribir los registros de cada temporizador, existen las siguientes
combinaciones de bit que deben ser escritas en el registros de control. Estos
registros son accesible manipulando las líneas de direcciones A0, y A1. Existen
básicamente, seis (6) registros de control individual, cuyas funciones son las
siguientes:

Registros de control del 8254

CS RD WR A1 A0 Descripción

0 1 0 0 0 Carga contador 0
0 1 0 0 1 Carga contador 1
0 1 0 1 0 Carga contador 2
0 1 0 1 1 Palabra de control
0 0 1 0 0 Lee contador 0
0 0 1 0 1 Lee contador 1
0 0 1 1 0 Lee contador 2
0 0 1 1 1 Tri-estado (sin operación)
1 x x x x Deshabilitado (tri-estado)
0 1 1 x x Tri-estado (sin operación)

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 201
7 6 5 4 3 2 1 0

SC1 SC0 RW1 RW0 M2 M1 M0 BCD

Selecciona BDC cuando es '1'


Selecciona el modo (0 al 5)
Control de lectura/escritura
00 = Capturar cuenta
01 = Lectura escritura solo del byte LSB
10 = Lectura escritura solo del byte MSB
11 = Lectura escritura primero LSB luego MSB
Selecciona contador
00 = Contador 0
01 = Contador 1
10 = Contador 2
11 = Comando de retrolectura

Cuando se programan los contadores, estos necesitan dos bytes para establecer el
valor de conteo. El 8254 detiene el conteo cuando se programa el primer byte (LSB)
y arranca cuando se programa el segundo byte (MSB).
La programación puede ser continua o alterna, esto es, se puede actualizar cada uno
por separado (se escriben los dos bytes seguidos a cada uno) o puede escribirse
primero los bytes LSB a contador, y luego los MSB para que así los tres arranquen a
la vez.

Comando Read Back


Sólo está disponible en el 8254, no en el 8253. Este comando permite leer el valor
actual de la cuenta, así como averiguar también el modo programado para un
contador y el estado actual de la patilla OUT, además de verificar el banderín de
cuenta nula (Null Count) de los contadores que se indiquen. El formato del comando
Read-Back es el siguiente:

El comando Read-Back permite enclavar la cuenta en varios OL's de múltiples


contadores de una sola vez, sin requerir múltiples comandos de enclavamiento,
poniendo el bit 5 a cero. Todo funciona a partir de aquí como cabría esperar (los
contadores permanecen enclavados hasta ser leídos, los que no son leídos permanecen
enclavados, si el comando se reitera sólo actúa la primera vez reteniendo la primera
cuenta...). También es posible enviar información de estado al latch OL, enclavándola

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


202 Microprocesadores de 16 bits y tecnología PC

para que puede ser leída con comodidad por el puerto que corresponda a ese contador.
La palabra de estado tiene el siguiente formato:

En D0..D5 se devuelve justo la misma información que se envió en la última palabra


de control; en el bit D7 se entrega el estado actual de la patilla OUT del 8254, lo que
permite monitorizar por software las salidas del temporizador economizando
hardware en ciertas aplicaciones. El bit NULL COUNT (D6) indica cuándo la última
cuenta escrita en CR ha sido transferida a CE: el momento exacto depende del modo
de funcionamiento del contador. Desde que se programa un nuevo valor de cuenta,
pasa un cierto tiempo hasta que éste valor pasa de CR a CE: leer el contador antes de
que se haya producido dicha transferencia implica leer un valor no relacionado con la
nueva cuenta. Por ello, según las aplicaciones, puede llegar a ser necesario esperar a
que NULL COUNT alcance el valor 0 antes de leer. El funcionamiento es el
siguiente:

Operación Resultado
A -Escribir al registro de la palabra de control (1) NULL COUNT = 1
B -Escribir al registro contador (CR) (2) NULL COUNT = 1
C -Nueva cuenta cargada en CE (CR ->CE) NULL COUNT = 0

Notas:
(1) Sólo el contador especificado por la palabra de control tiene su NULL COUNT a
1; los demás contadores, lógicamente, no ven afectado su correspondiente bit NULL
COUNT.
(2) Si el contador es programado para cuentas de 16 bits, NULL COUNT pasa a
valer 1 inmediatamente después de enviar el segundo byte.

Si se enclava varias veces seguidas la palabra de estado, todas serán ignoradas menos
la primera, por lo que el estado leído será el correspondiente al contador en el
momento en que se enclavó por vez primera la palabra de estado.

Se pueden enclavar simultáneamente la cuenta y la palabra de estado (en un comando


Read-Back con D5=D4=0), lo que equivale a enviar dos Read-Back consecutivos. En
este caso, y con independencia de quién de los dos hubiera sido enclavado primero, la
primera lectura realizada devolverá la palabra de estado y la segunda la cuenta
enclavada (que automáticamente quedará de nuevo desenclavada).

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 203

Operaciones de escritura
El 8254 es muy flexible a la hora de ser programado. Basta con tener en cuenta dos
cosas: por un lado, escribir siempre primero la palabra de control, antes de enviar la
cuenta inicial al contador. Por otro, dicha cuenta inicial debe seguir exactamente el
formato seleccionado en la palabra de control (enviar sólo byte bajo, enviar sólo byte
alto, o bien enviar ambos consecutivamente). Teniendo en cuenta que cada contador
tiene su propio puerto y que la palabra de control indica el contador al que está
asociada, no hay que seguir un orden especial a la hora de programar los contadores.
Esto significa que, por ejemplo, se puede enviar la palabra de control de cada
contador seguida de su cuenta inicial, o bien enviar todas las palabras de control para
los 3 contadores y después las 3 cuentas iniciales; también es válida cualquier
combinación intermedia de estas secuencias (por ejemplo: enviar la palabra de control
para el contador 0, después la palabra de control para el contador 1, después la parte
baja de la cuenta para el contador 0, luego la parte baja de la cuenta para el contador
1, la parte alta de la cuenta para el contador 0, etc...).

Un nuevo valor de cuenta inicial puede ser almacenado en un contador en cualquier


momento, sin que ello afecte al modo en que ha sido programado (el resultado de esta
operación dependerá del modo, como se verá más adelante). Si se programa el
contador para leer/escribir la cuenta como dos bytes consecutivos (bajo y alto), el
sentido común indica que entre ambos envíos/recepciones no conviene transferir el
control a una subrutina que utilice ese mismo contador para evitar un resultado
incorrecto.

Operaciones de lectura
Existen tres posibles métodos para leer el valor de un contador en el 8254. El primero
es el comando Read-Back, sólo disponible en el 8254 (y no en el 8253), como luego
veremos. El segundo consiste en leer simplemente el contador accediendo a su puerto
correspondiente: este método requiere inhibir la entrada CLK al contador (por
ejemplo, a través de la línea GATE o utilizando circuitería exterior de apoyo) con
objeto de evitar leer la cuenta en medio de un proceso de actualización de la misma,
lo que daría un resultado incorrecto. El tercer método consiste en el comando de
enclavamiento.

Comando de enclavamiento (Counter latch command)


Este comando se envía cual si de una palabra de control se tratara (A1=A0=1): para
diferenciarlo de ellas los bits 5 y 4 están a cero. En los bits 7 y 6 se indica el contador
afectado. Los demás bits deben estar a cero para compatibilizar con futuras versiones
del chip. Cuando se envía el comando, el OL del contador seleccionado queda
congelado hasta que la CPU lo lee, momento en el que se descongela y pasa de nuevo
a seguir a CE. Esto permite leer los contadores al vuelo sin afectar la cuenta en curso.
Se pueden enviar varios de estos comandos a los diversos contadores, cuyos OL's
quedarán enclavados hasta ser leídos. Si se envían varios comandos de enclavamiento
al mismo contador, separados por un cierto intervalo de tiempo, sólo se considerará el

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


204 Microprocesadores de 16 bits y tecnología PC

primero (por tanto, la cuenta leída corresponderá al valor del contador cuando fue
enclavado por vez primera).

Por supuesto, el contador debe ser leído utilizando el formato que se definió al enviar
la palabra de control; aunque en el caso de leer 16 bits, las dos operaciones no han de
ser necesariamente consecutivas (se pueden insertar en el medio otras acciones
relacionadas con otros contadores).

Otra característica interesante (¿disponible tal vez sólo en el 8254?) consiste en la


posibilidad de mezclar lecturas y escrituras del mismo contador. Por ejemplo, si ha
sido programado para cuentas de 16 bits, es válido hacer lo siguiente: 1) leer el byte
menos significativo, 2) escribir el nuevo byte menos significativo, 3) leer el byte más
significativo, 4) escribir el nuevo byte más significativo.

Modos de operación
Los modos de funcionamiento de cada contador son 6 en total. En las gráficas
siguientes se observan cada uno de ellos.

Modo 0: Interrumpir al terminar conteo


Modo 0 : Interrumpir al terminar el conteo
0 1 2 3 4 5 6 7 8 9 10 11 12
CLK

WR n
4 3 2 1 0
OUT
(n = 4) n

WR m

GATE

5 4 3 2 1 0
OUT
(m = 5)

A B
A+B = m

La salida es inicialmente baja antes de seleccionar este modo. Después que el


contador es cargado, la salida se mantiene baja mientras el contador efectúa el conteo.
Cuando se alcanza el final del conteo la salida cambia al nivel alto y así se mantiene

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 205

hasta que el contador es nuevamente cargado. La re-escritura de los registros durante


el conteo resulta en:

• Escribe el 1er byte (LSB): Detiene el contador


• Escribe el 2do byte (MSB): Arranca de nuevo el contador.

Esta modalidad es útil cuando se desea contabilizar pulsos de tiempo basado en


generadores de reloj, cuyo conteo sea un retardo programado a voluntad y el re-
disparo del timer sea necesario hacerlo en forma manual. Tambien es util si se desea
usar como temporizador de cuenta regresiva, para iniciar dispositivos que necesitan
un cantidad de tiempo especifica de iniciación, antes de ser usados.

Modo 1: Disparador programable

Modo 1 : Disparador programable


0 1 2 3 4 5 6 7 8 9 10 11 12
CLK

WR n

TRIGGER
4 3 2 1 0
OUT (n = 4)

TRIGGER
4 3 2 4 3 2 1 0
OUT

En esta modalidad la salida será baja mientras dure el conteo. Antes de empezar el la
cuenta, o al finalizar esta, la salida estará en estado alto.

Se puede re-disparar el monoestable manipulando el pin GATE (que en cuyo caso es


el TRIGGER).

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


206 Microprocesadores de 16 bits y tecnología PC

Modo 2: Generador de reloj


Modo 2 : Generador de reloj
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CLK

WR n (n = 4) (n =3)

4 3 2 1 0(4) 3 2 1 0(3) 2 1 0
OUT
0(3) 3 2 1 0(3) 2 1 0(3) 2 1
OUT
(n = 3)

RESET

En esta modalidad el contador trabaja como divisor por n. La salida se mantendrá en


nivel alto mientras dure el ciclo de conteo y se mantendrá baja solo por un ciclo de
reloj. El pin GATE manipula el contador permitiendo re-iniciar el conteo sin perder
los datos cargados en los registros.

Modo 3: Generador de onda cuadrada

Modo 3 : Generador de onda cuadrada


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CLK
4 2 4 2 4 2 4 2 4 2 4 2 4 2
OUT
(n = 4)
5 4 2 5 2 5 4 2 5 2 5 4 2
OUT
(n = 5)

Es similar a la modalidad anterior, solo que el contador se mantendrá en nivel alto se


haya completado medio conteo, y cambiara a nivel bajo durante la otra mitad.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 207

Modo 4: Disparo por software

Modo 4 : Disparador por software


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CLK

WR (n=4)
4 3 2 1 0
OUT

LOAD n (n=4)

GATE
4 4 3 2 1 0
OUT

En esta modalidad, la salida cambia al nivel alto después de haber seleccionado este
modo. Cuando la cuenta es cargada, el contador mantiene el nivel alto hasta finalizar
la cuenta, cambia al nivel bajo durante un ciclo de reloj, y posteriormente la salida
regresa al nivel alto. El pin GATE funciona como detener (flanco de bajada) y re-
disparador (flanco de subida)

Modo 5: Disparo por hardware

Modo 5 : Disparador por hardware


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CLK

GATE
4 3 2 1 0
OUT (n=4)

GATE
4 3 4 3 2 1 0
OUT (n=4)

Es similar al anterior, pero el disparo ocurre en el flanco de subida y es posible el


redisparo sin detener el contador.

Finalmente, cuando es necesario hacer lectura de los registros del contador, el 8254
retiene los valores en unos registros latch para tal fin, ya que esta lectura puede

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


208 Microprocesadores de 16 bits y tecnología PC

efectuarse al vuelo. Para hacerla, se usa el comando de retrolectura, el cual nos


permite leer el valor del registro de estado y los registros intermedios de conteo.

Funciones del 8254 en el PC


El la PC esta incorporado un 8254 que efectúa las siguientes funciones:

• Contador de tiempo real


• Control del DMA de refresco de memoria
• Control del altavoz
El primer temporizador (Timer 0) control el System Tic, o reloj de tiempo real. Este
temporizador recibe del generador de reloj 8484 una frecuencia de reloj de
1.193.180Hz. El Timer 0 divide esta señal de reloj, generando a su salida una señal
de 18,2Hz, la cual llega directamente a el pin de IRQ0 del 8259. Esta IRQ esta
mapeada como vector de interrupción 08H en la tabla de vectores de interrupción, y
de esta penden las rutinas de actualización de reloj de tiempo real, temporización de
los discos y accesos a memoria por funciones del DOS, entre otras.

El segundo temporizador (Timer 1) es el encargado de enviar las señal de refresco de


la DRAM. No se aconseja su manipulación, ya que es bastante sensible y puede
comprometer la integridad del sistema.

El tercer y ultimo temporzador (Timer 1) controla el sonido del altavoz incorporador


en el PC.

Como puede verse, los Timers 0 y 2 pueden sernos de utilidad. Sobretodo el primero,
ya que este es una puerta de entrada para la creación de rutinas que deban ejecutarse
en segundo plano sin intervención alguna del usuario. Esto es importante, ya que el
MSDOS por diseño, no es un sistema operativo multitarea, pero con la ayuda de
algunas técnicas de programación, es posible hacer algo al respecto.

Reloj CLK
8284 1193180 Hz
Timer 0
IRQ 0 (INT 08H)
Timer Timer 1
CTRL DMA
bit 0 (ctrl 8254) 8254 Timer 2

PPI
8255 bit 1 (ctrl altavoz) ALTAVOZ

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 209

Control del 8254


En el PPI (8255) incorporado en el PC, existe un registro en la dirección de puerto
61H que permite controlar el encendido/apagado del 8254. Específicamente, ese
control esta en el bit 0 de puerto 61H. Si el bit 0 esta a ‘1’ el 8254 estará en modo
activo, realizando sus funciones de conteo. Si el bit 0 esta a ‘0’, el 8452 detendrá su
conteo.

Esta capacidad de control es útil si se desean hacer cambios en los valores de los
temporizadores en forma segura.

Como dato adicional, el bit 1 del puerto 61H controla la activación/desactivación del
altavoz, con los valores ‘1’ y ‘0’ respectivamente.

Calculo de la frecuencia de operación del 8254


La frecuencia de operación de cada timer es individual, y como tal, puede ser
programada por separado. Todos los temporizadores tiene como frecuencia de reloj
base la derivada del 8484, esto es, 1193180 Hz.

Para establecer una nueva frecuencia de operación en alguno de los timers, es


necesario calcular el periodo de dicha frecuencia. Para ello, nos apoyamos en la
siguiente formula:

T = 1193180 / ft
donde ft es la frecuencia de operación deseada, y T es el periodo correspondiente a
programar en el temporizador. El valor de periodo obtenido debe ser convertido a
formato hexadecimal (de cuatro dígitos) para poder ser enviado como datos al 8454.
Este detalle lo veremos un poco más adelante.

Programación del periodo en el 8254


Si bien, cada vez que el 8254 es preparado para ser programado detiene los
temporizadores, para el caso del PC esto no es del todo cierto. Dado que algunos
BIOS tienen esquemas de programación diferentes, es mejor ir sobre seguro, así que
efectuaremos la detención/activación del temporizador por la vía manual. Para ello,
no apoyamos el en puerto 61H, veamos:

Detener el 8254

IN AL, 61H
AND AL, FEH
OUT 61H, AL

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


210 Microprocesadores de 16 bits y tecnología PC

Activar el 8254

IN AL, 61H
OR AL, 01H
OUT 61H, AL

Así de sencillo...

La programación es igual de fácil, pero haremos primero algunas definiciones. Para


reprogramar cualquiera de los tres timers, necesitamos acceder al registro de control
del 8454, usando para ello las siguientes direcciones de puerto:

Timer 0: 43H (Control), 40H (Datos)


Timer 2: 67H (Control), 66H (Datos)

El BIOS programa el Timer 0 y 1 en modo 2, y el Timer 2 en modo 3, todos


funcionando en modo de contador binario (véase la figura que describe este registro
en la cuarta página).

Por lo tanto, si deseamos programar el timer 0, es necesario enviarle un 34H al puerto


de control 43H, seguido de los valores bajo (primero) y alto (después) del periodo
respectivo de la frecuencia de operación deseada, en el puerto de datos 40H.

Este proceso es igual para timer 2, pero con el valor de control B6H, en los puertos
67H y 66H respectivamente. Aclaremos esto con un pequeño ejemplo, que veremos
en la sección siguiente.

Aceleración del temporizador 8254


El timer 0, que es el que nos interesa, esta programado por BIOS para generar el
mayor retardo posible. Los timers 1 y 2 están programados con un tiempo de conteo
de 2 unidades. El timer 0 esta programado con el valor máximo, de 65535 (FFFFH)
para generar de esta forma una frecuencia de aproximadamente 18,2Hz. La
frecuencia real de entrada del timer 0 es 4,77Mhz/4 = 1.1925Mhz, pero se toma como
frecuencia base 1.193180MHz.

Dado que el timer 0 tiene como vector de interrupción el 08H, puede pensarse que
nada impide capturar este vector y colocar una rutina propia que sea ejecutada en
forma periódica. Si para nuestra rutina es suficiente que se ejecute 18 veces por
segundo, es preferible capturar el vector 1CH, el cual es establecido por BIOS para
ser punto de enganche encadenado de rutinas temporizadas. De hecho, el vector
original solo tiene una instrucción: IRET.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Temporizadores 211

En ocasiones, es necesario que el PC haga procesos a velocidades mayores. Un caso


típico es la adquisición de datos a velocidades mayores que 18 muestras por segundo.
Si por ejemplo, deseamos adquirir datos de un convertidor A/D a una rata de
transferencia de 100 muestras/segundo, podemos proceder de la siguiente manera:

Paso 1: Calculo del periodo

Dado ft=100, entonces

T = 1193180 / 100 = 1193, de aquí, y convirtiendo en hexadecimal, tenemos que

T = 04A9H => TLSB = A9H y TMSB = 04H

Paso 2: Programación del temporizador

A continuación, se debe enviar el nuevo periodo al temporizador. Es necesario, por


cuestiones de seguridad, desactivar el 8254, ejecutar las instrucciones de
programación y luego finalmente, activar el 8254. Las rutinas de
activación/desactivación fueron discutidas con anterioridad, así que nos
concentraremos solo en las instrucciones de programación.

Veamos:

MOV AL, 34H ;Comando de control: modo 2, programación, LSB, MSB


MOV DX, 43H ;Envío al puerto de control
OUT DX, AL
MOV DX, 40H ;Selección puerto de datos
MOV AX, 04A9H ;Periodo a programar
OUT DX, AL ;Envío del LSB
MOV AL, AH
OUT DX, AL ;Envío del MSB

Como puede verse, es realmente sencillo re-programar el timer 0, pero es necesario


tomar en cuenta que, si se acelera este temporizador, todos los procesos y rutinas ISR
asociadas al vector 08H (incluida la 1CH) también se aceleraran, lo cual provocara la
caída del sistema.

Para contrarrestar este efecto, la solución también es sencilla. Se debe capturar el


vector 08H y establecer un contador, el cual llevara un control del numeró de entradas
(interrupciones generadas) y según el factor de aceleración usado, contabilizar el
tiempo equivalente para hacer la llamada encadenada (o anidada) a la ISR original.
Por ejemplo, si el timer 0 se acelero de 18,2 Hz a 182 Hz (factor x10) entonces la

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


212 Microprocesadores de 16 bits y tecnología PC

rutina ISR del vector 08H debe contar hasta 10 antes de llamar la ISR original. De
esta manera, la ISR colocada por el programador en dicho vector, se ejecutará 10
veces más rápido que la ISR original, y esta ultima (incluida la 1CH) no percibirá
diferencia alguna en tiempo.

Recomendaciones de uso
El 8254 es un dispositivo verdaderamente útil, que puede ser usado en cualquier
situación en la que se necesite control de tiempo preciso, sin necesidad de crear
pesadas rutinas de temporización, que de paso, son muy imprecisas.

En el PC, el 8254 es un arma poderosa para la ejecución de rutinas ISR de servicio


que efectúen operaciones en segundo plano bajo MSDOS y sin necesidad de usar
hardware adicional o instrucciones especiales. Mención especial merece el caso de la
aceleración del timer 0, ya que permite extender el uso de PC en aplicaciones
profesionales, en la que sea necesario manejar un gran flujo de datos en forma fácil y
rápida, dado que las consideraciones a tomar para este caso son menores comparadas
con otras soluciones, en las que seria necesario usar dispositivos adicionales y quizá
una programación más compleja.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ

Potrebbero piacerti anche