Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Temporizadores
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
• 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
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
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:
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)
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.
para que puede ser leída con comodidad por el puerto que corresponda a ese contador.
La palabra de estado tiene el siguiente formato:
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.
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...).
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.
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).
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.
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
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.
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
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)
GATE
4 3 2 1 0
OUT (n=4)
GATE
4 3 4 3 2 1 0
OUT (n=4)
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
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
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.
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.
Detener el 8254
IN AL, 61H
AND AL, FEH
OUT 61H, AL
Activar el 8254
IN AL, 61H
OR AL, 01H
OUT 61H, AL
Así de sencillo...
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.
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.
Veamos:
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.