Intel 8253
# Intel 8253

El Intel 8253 y el 8254 son temporizadores de intervalos programables (PIT), que realizan funciones de temporización y conteo. Fueron primariamente diseñadas para el Intel 8080/8085, pero usadas más tarde en el IBM PC y en los sistemas x86. Se encuentran en todos los sistemas compatibles de IBM.

## Funcionamiento

El timer 8253 tiene 3 contadores independientes, llamados canales. Cada contador puede ser programado para operar en uno de seis modos. Una vez programados, los contadores pueden realizar la tarea asignada según el modo. Adicionalmente hay un registro de control (Control Word Register) que permite programar cada uno de los tres contadores independientemente. Por medio de este registro de control puede programarse un contador en uno de seis modos de operación.

Físicamente, el 8253 es accedido por cuatro puertos de entrada/salida a partir de una dirección base, que es definida mediante circuitos externos. En la dirección base + 0, base + 1, y base + 2 se encuentran los tres contadores, y en la dirección base + 3 se encuentra el registro de control. El valor de los contadores puede leerse y escribirse, y el registro de control es de solo escritura.

En el IBM PC, el timer 8253 se encuentra localizado en la dirección base de entrada/salida 40h. Por lo tanto, los tres contadores están en los puertos de entrada/salida 40h, 41h y 42h, y el registro de control se encuentra en el puerto 43h.

### Contadores

Los contadores son etiquetados como Contador 0, Contador 1 y Contador 2. Son contadores de 16 bits que pueden programarse para trabajar en modo binario o en modo BCD. Los contadores cuentan desde el número que se les asigne hasta cero regresivamente, son independientes uno del otro, y pueden ser leídos fácilmente por el CPU.

En el chip, cada contador tiene tres pines asociados a él:

* CLK (reloj). Es un pin de entrada por donde se recibe una señal de reloj para el contador. El contador contará hacia abajo decrementándose al ritmo de esta señal de sincronización.
* GATE (puerta). Es un pin de entrada que recibe una señal para controlar el contador. Su significado varía de acuerdo al modo de operación.
* OUT (salida). Es un pin por donde sale una señal que se comporta de acuerdo al modo de operación con que fue programado el contador.

### Registro Control Word

El PIT 8253 tiene un Control Word (palabra de control) de 8 bits usado para programar los contadores. El registro Control Word define cómo trabajará el PIT. Para programar los contadores, el microprocesador debe escribir una palabra de control (CW) a este registro y luego enviar un byte o dos bytes como valor inicial de conteo al contador. Esto debe hacerse cada vez que se quiera programar uno de los 3 contadores.

Los 8 bits del Control Word deben ajustarse de la manera siguiente para programar cada contador:

**Selección del contador**

Los bits 7 y 6 de la palabra de control definen cuál contador se está programando. Para seleccionar un contador se coloca en estos bits el número del contador que se desea programar, 00, 01, 10 (en binario), para los contadores 0, 1 y 2 respectivamente. El valor 11 (en binario) es inválido, ya que no existe el contador 3.

**Modos de operación**

Los bits 3, 2, y 1, de la palabra de control, indican el modo de operación del contador. Cada contador puede programarse en uno de seis modos de operación. Para programarlo, se envía al registro Control Word del chip la información de cómo se quiere que trabaje el contador y luego se envía al contador el valor inicial de conteo. Entonces el contador comenzará a funcionar de acuerdo a lo previsto en el modo de operación.

Al programar los modos 2 y 3, el bits más significativo del modo de operación, bit 3 de la palabra de control, es ignorado, y no importa su valor.

Los modos de operación son los siguientes:

* 000 - Modo 0. Interrupt on Terminal Count (Interrumpe al terminar el conteo). El pin OUT se inicia en cero y se pondrá en 1 al terminar el conteo. La señal GATE puede usarse para poner en pausa o continuar el conteo. Es usado para generar un preciso retardo de tiempo bajo control del software. El contador comenzará a contar desde el valor inicial cargado en él, e irá decrementándose hasta llegar a 0. El pin OUT es puesto bajo después de que el Control Word (la palabra de control) que programa al contador es escrita, y el conteo comienza un ciclo de reloj después que el valor del contador es programado. La señal OUT sigue baja hasta que el contador alcanza 0, en ese momento la señal OUT es puesta alta hasta que el contador sea recargado o la palabra de control sea reescrita. La señal de GATE debe permanecer activa en alto para un conteo normal. Si GATE es bajada el conteo es terminado y la cuenta actual es trabada (latched) hasta que el pulso en GATE se vuelve a alto otra vez.
* 001 - Modo 1. Programmable On Shot (Disparo programable). En este modo, el 8253 puede ser usado como un multivibrador monoestable, la entrada por GATE es usada como la señal de disparo. La señal OUT estará inicialmente en alto, OUT irá a bajo en el pulso del CLK siguiente al disparo para hacer el pulso On Shot (de disparo), y permanecerá abajo hasta que el contador llegue a cero. Entonces, OUT irá a alto y permanecerá en alto hasta el pulso CLK después del siguiente disparo.
* X10 - Modo 2. Rate Generator (Generador de impulsos). Emite un pulso repitiéndolo cada cierto tiempo de acuerdo al valor del contador. En este modo, el dispositivo actúa como un contador divisor por n, el cual es comúnmente usado para generar una interrupción de reloj tiempo real (para mantener la hora del día). Como otros modos, el proceso de conteo comenzará el siguiente ciclo después que el valor del contador es enviado. La señal de OUT permanecerá alta hasta que el contador llegue a 1, y luego, estará baja por un pulso de reloj. Entonces OUT volverá a estar alta de nuevo, y el proceso completo se repetirá por sí solo una y otra vez, generando así un pulso al final de cada conteo.
* X11 - Modo 3. Square Wave Generator (Generador de onda cuadrada). Emite una onda cuadrada repetida una y otra vez, con una frecuencia regulada por el contador. Este modo es similar al modo 2. Sin embargo, la duración de los pulsos de reloj alto y bajo de la salida OUT serán diferentes a los del modo 2. En este modo, se generará una onda cuadrada con la mitad del tiempo en alto y la mitad del tiempo bajo, que se repetirá una y otra vez al igual que el pulso del modo 2.
* 100 - Modo 4. Software Triggered Strobe (Strobe disparado por software). Emite un único pulso al terminar el contador. Después de que es cargada una palabra de control y valor en el contador, la salida OUT permanece alta hasta que el contador llega a cero. El contador entonces generará un pulso bajo por 1 ciclo del reloj (un strobe) - después la salida se volverá alta de nuevo.
* 101 - Modo 5. Hardware Triggered Strobe (Strobe disparado por hardware). Emite un único pulso al terminar el contador, La puerta GATE se usa para iniciar el conteo regresivo para el disparo del pulso. Este modo es similar al modo 4. Sin embargo, el proceso de conteo es disparado por la entrada GATE. Después de recibir una palabra de control y un valor de conteo, la salida será puesta en alto. Una vez que el dispositivo detecta el borde de elevación (rising edge) en la entrada GATE, comenzará a contar, Cuando el contador llegue a 0, la salida por OUT estará baja por un ciclo de reloj - Después se volverá de nuevo alta, repitiendo el ciclo en el siguiente borde de elevación de GATE.

**Modo BCD**

Ajustando el bit 0 de la palabra de control se puede programar al contador para trabajar en modo binario usando 16 bits para el contador, o modo BCD, usando 4 dígitos decimales BCD.

**Modo de acceso**

Los bits 5 y 4 de la palabra de control indican el modo de acceso para leer o escribir el valor del contador. Esto es necesario porque cada contador es de 16 bits, pero el chip solo tiene una entrada/salida de solo 8 bits de datos. Con el modo de acceso se puede leer y escribir al contador en uno de los siguientes modos:

* Solo los 8 bits menos significativos
* Solo los 8 bits más significativos
* Primero los 8 bits menos significativos, y después los 8 bits más significativos. Para ello, se necesitan dos procesos de lectura o escritura para leer o escribir los 16 bits completos.

## Uso en el IBM PC y compatibles

El timer 8253 fue usado como temporizador en el computador IBM PC desde su introducción en 1981, y a partir de entonces, en los compatibles. Su funcionalidad es heredada hasta los computadores clones compatibles de hoy en día (de la arquitectura x86).

Estaba localizado en los puertos de entrada/salida 40h a 43h hexadecimal. Los tres contadores del timer recibían una señal de reloj de 1,1931817 MHz, que era la mitad de la frecuencia PCLK de 2,3863633 que generaba el controlador de reloj Intel 8284 de la tarjeta madre del PC. Los 3 contadores estaban programados de la manera siguiente:

* El contador 0 dividía esa frecuencia en 65536 y generaba la señal cíclica que disparaba una interrupción 18,2065 veces por segundo. Esta interrupción era procesada por el IBM PC ROM BIOS para mantener un contador por software en la RAM, que podía usarse para calcular la hora del sistema
* El contador 1 del 8253 dividía la frecuencia en 18 y enviaba una señal de 66287,87 Hz al canal 0 del controlador DMA Intel 8237 para el refrescamiento de la memoria RAM.
* El contador 2 del 8253 podía usarse con cualquier divisor entre 1 y 65536 y generar una onda cuadrada con una frecuencia desde 18,2 Hz hasta 596.590,85 Hz que podía usarse para producir tonos por el altavoz del computador. También, solo en el IBM PC, se usaba para generar los tonos que representaban el 0 y el 1 para almacenar datos y archivos en el grabador de casetes.

El IBM AT usaba el Intel 8254 como timer programable. Luego el timer desapareció como un circuito integrado individual y pasó a formar parte de chipset de la tarjeta madre. Hoy en día los computadores compatibles tienen esta funcionalidad en el chip southbridge. En algunos chipsets modernos, este cambio puede aparecer como diferencias de tiempo medibles en acceder un PIT usando el espacio de direcciones de entrada/salida x86. Lecturas y escrituras a tales registros del PIT en el espacio de dirección de entrada/salida pueden completarse mucho más rápidamente.

Las tarjetas madre más nuevas también incluyen un contador a través del Advanced Configuration and Power Interface (ACPI), un contador en el Local Advanced Programmable Interrupt Controller (Local APIC), y un High Precision Event Timer. El CPU en sí mismo también proporciona la facilidad del Time Stamp Counter (TSC).

