Reloj de Tiempo Real del AT: MOTOROLA MC146818

Revisión del 01:28 23 jun 2019 de Javiermartin jc (discusión | contribuciones) (Texto reemplazado: «<div align="justify">» por «»)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Reloj de Tiempo Real del AT.
Información sobre la plantilla
Reloj de Tiempo Real AT.jpg


Reloj de Tiempo Real del AT: MOTOROLA MC146818. El MC146818 incorpora un completo reloj con alarma, calendario, interrupción periódica programable, generador de onda cuadrada y 64 bytes libres de RAM estática de bajo consumo. Los primeros 10 bytes de esta RAM son empleados para gestionar la fecha y la hora y los 4 siguientes son registros (A, B, C y D); los 50 restantes quedan a disposición del usuario.

Descripción del Integrado

Circuito Integrado

La línea OSC1 (de entrada) puede conectarse a señales cuadradas de 4.194304 Mhz, 1.048576 Mhz y 32768 Hz. La frecuencia de esta base de tiempos, como se verá, ha de indicarse en el registro A (bits DV0 a DV2). El chipprovee una útil salida de reloj en CKOUT dependiente del nivel de la entrada CKFS

Nivel de la entrada CKFS

La salida SQW genera una onda cuadrada, cuya frecuencia es programable (útil para alarmas). La línea -IRQ seencarga de solicitar las interrupciones periódicas si están habilitadas. La línea de entrada -RESET reinicializa el integrado asignando valores por defecto a ciertos bits de los registros B y C, aunque no afecta a la fecha/hora ni a la memoria. La entrada PS debe mantenerse a nivel bajo cuando se alimenta el chip hasta que la tensión se estabilice, poniéndose después en alto; esta entrada está asociada al bit VRT del registro D que indica si el integrado está en condiciones de operar. El bus bidireccional de direcciones y datos está multiplexado (líneas AD0..AD7): en los flancos de bajada de la entrada de validación de direcciones (línea AS) contiene direcciones, y datos en los flancos de subida de la entrada de validación de datos (línea DS). La línea -R/-W indica si la operación es de entrada o salida; CE permite habilitar el chip o desconectarlo de los buses. Los primeros 14 bytes son empleados para la fecha y hora.

Estructura de la memoria del MC146818

Registros del MC146818

REGISTRO A (lectura/escritura, excepto UIP).

Este registro sirve para indicar al integrado qué tipo de reloj lo gobierna, así como elegir la frecuencia de la interrupción periódica programable y la de la salida SQW. También contiene un bit que indica si hay una actualización del reloj en curso, lo que sucede una vez cada segundo, ya que en ese preciso instante no se pueden leer los registros con objeto de evitar lecturas incorrectas.

121203g.JPG

El bit UIP (Update In Progress), de sólo lectura, se pone a 1 mientras se actualizan los primeros 14 bytes de la memoria y poco tiempo antes de que comience dicha actualización. Antes de acceder a estos bytes, hay que esperar a que el bit UIP se ponga a cero (si no lo estaba ya): con el bit UIP a 0, es seguro que en un intervalo de al menos 244 microsegundos no se va a producir ninguna actualización, por lo que hay tiempo suficiente para acceder (sin prisas, pero tampoco con pausas). La actualización dura 248 microsegundos (1984 con relojes de 32768 Hz). Los bits RS0..RS3, de selección de velocidad, definen la frecuencia de la onda cuadrada generada en SQW y/o la de la interrupción periódica.

REGISTRO B (lectura/escritura).

En este registro hay bits útiles, entre otros, para controlar la inicialización de la fecha y hora, para habilitar o inhibir las diversas interrupciones y para establecer ciertas características de operación.

  • El bit SET puede ser establecido a 1, con lo que cualquier ciclo de actualización de los primeros 14 bytes de la RAM resulta abortado: de este modo, es factible proceder a inicializar la fecha y la hora sin el riesgo de que se produzca en medio una actualización. Este bit no se ve afectado por la señal -RESET.
  • El bit PIE (Periodic Interrupt Enable) sirve para permitir la interrupción periódica cuando es puesto a 1; tras una señal -RESET es puesto a 0.
  • El bit AIE (Alarm Interrupt Enable) ha de estar a 1 para habilitar la interrupción de alarma; también es puesto a cero tras un -RESET.
  • El bit UIE (Update Interrupt Enable) sirve para habilitar o inhibir la interrupción de fin de actualización, que se produciría tras cada actualización del reloj; la señal -RESET baja el bit UIE.
  • El bit SQWE (Square Wave Enable) permite habilitar o inhibir la señal de onda cuadrada de la salida SQW; también es borrado ante una señal -RESET.
  • El bit DM (Data Mode) permite seleccionar datos en binario (1) o BCD (0) en los bytes de fecha y hora; la señal -RESET no afecta a este bit.
  • El bit 24/12 sirve para elegir entre el modo 12 horas del reloj (bit a 0) o el de 24 (bit a 1): en el modo de 12 horas, el bit más significativo del byte de la hora estará activo para indicar "PM".

REGISTRO C (sólo lectura).

Este registro contiene bits que informan de las interrupciones que se producen. Permite identificar al ordenador qué o cuáles interrupción(es) se ha(n) producido. El bit IRQF (Interrupt ReQuest Flag) se activa cuando el bit PF y el PIE (registro B) están activos, o bien cuando el bit AF y el AIE (registro B) están activos, o bien cuando UF y el bit UIE (registro B) están activos. Es decir, IRQF se pone en alto cuando es necesario que se produzca una interrupción: la línea -IRQ se encarga de pedirla entonces, mientras: PF (Periodic Flag), AF (Alarm Flag) y UF (Update Flag) indican si es necesario que se produzca la interrupción correspondiente. Todos los bits de este registro son borrados ante una señal -RESET, pero también ante una lectura por software del registro C.

REGISTRO D (sólo lectura).

Este registro contiene sólo el bit VRT (Valid RAM and Time). Este bit está a cero cuando la patilla PS está a cero (PS se eleva a 1 cuando la tensión de alimentación es correcta). Por software, el bit VRT puede ser puesto a 1 mediante una simple lectura del registro D (si la patilla PS=1), con objeto de indicar que la fecha y hora establecidas son correctas; si fallara la alimentación, al caer la tensión en la patilla PS este bit pasaría de nuevo a cero. VRT no es afectado por -RESET.

Funcionamiento de la alarma

La interrupción de alarma se produce todos los días cuando llega la hora en que ha sido programada y el bit que permite esta interrupción está habilitado. Existe un método alternativo para programar la alarma, basado en los códigos indiferentes almacenables en los bytes de la alarma.

Un código indiferente es cualquier valor comprendido entre 0C0h y 0FFh. Si la hora de alarma es un código indiferente, la alarma se producirá cada hora. Si la hora y minuto de alarma son códigos indiferentes, ésta se producirá cada minuto. Si tanto la hora como el minuto y segundo de la alarma son códigos indiferentes, la alarma se producirá cada segundo.

El MC146818 dentro del ordenador

El MC146818 es por lo general exclusivo de los AT y PS/2. En muchos ordenadores, la implementación física se realiza con circuitos totalmente compatibles que incluyen 128 bytes de RAM en lugar de 64. En la RAM que sobra por encima de los primeros 14 bytes se almacenan parámetros de la configuración del sistema, modificables con el programa SETUP durante el arranque.

Por defecto, la BIOS inicializa el chip para trabajar con un reloj de 32768 Hz y a un ritmo de 1024 interrupciones periódicas por segundo (cuando están habilitadas), al escribir el valor 26h en el registro A. De la misma manera, el registro B se carga con 2 (modo 24 horas, datos en BCD y sin horario verano/invierno). El MC146818 está diseñado para ser conectado a un bus multiplexado, por lo que la circuitería de apoyo de los AT se encarga de gestionar la comunicación con el microprocesador, estableciendo dos puertos de entrada/salida en las direcciones 70h y 71h. Para leer o escribir cualquier registro de la RAM CMOS, basta con enviar al puerto 70h el número de registro y, a continuación, leer o escribir del puerto 71h. Entre los accesos a ambos puertos debe mediar un tiempo mínimo; de lo contrario la operación fallará. En particular, las últimas versiones de los compiladores de Borland no permiten acceder al reloj de tiempo real en la mayoría de las máquinas a través de las funciones outportb() e inportb(). La razón es que esas funciones están en una librería y es preciso llamarlas con paso de parámetros a través de la pila, lo que ralentiza excesivamente el proceso. Desde el lenguaje ensamblador, nunca hay problemas, aunque como es costumbre es conveniente insertar algún estado de espera (JMP SHORT $+2) entre dos operaciones E/S consecutivas, precaución necesaria en los ordenadores más antiguos. A nivel de interrupciones, la salida -IRQ del MC146818 está conectada a IRQ8 (INT 70h) a través del segundo controlador de interrupciones (véase la documentación del mismo).

Desde la interrupción 1Ah, la BIOS implementa una serie de servicios para acceder al reloj de tiempo real, incluyendo la posibilidad de programar la alarma (que invoque una INT 4Ah cuando llegue la hora). Las funciones de retardo de la INT 15h se apoyan también en el reloj de tiempo real.

Conviene tener presente que es de vital importancia acceder a los primeros 14 bytes de la CMOS sólo si el bit UIP del registro A (bit 7) está a cero. También es necesario poner a 1 el bit SET del registro B (bit 7) antes de modificar dichos bytes, devolviéndolo a 1 después. No respetar este principio puede provocar la lectura de fechas u horas incorrectas o una errónea asignación de valores. Para los demás bytes de la CMOS no es necesario tomar esta precaución.

Método para la configuración del AT Y PS/2

Los AT y superiores almacenan en los 50 ó 114 últimos bytes de RAM libres de la CMOS información relativa a la configuración del sistema. Los bytes más importantes y comunes a todas las máquinas se muestran a continuación.

  • Byte 0Eh: Diagnostics Status Byte. El bit 7 indica (si vale 1) que el MC146818 tiene un déficit de corriente eléctrica. El bit 6 indica (si es 1) que el chechsum o suma de comprobación de la CMOS ha fallado. El bit 5 indica (si vale 1) que la configuración del sistema es incorrecta (no hay al menos una disquetera presente o el modo de vídeo de la configuración no coincide con el detectado en el hardware). El bit 4 es puesto a 1 si el tamaño de la memoria detectado no coincide con el indicado en la configuración. El bit 3 activo indica que el adaptador o el disco fijo C: falló en la inicialización, siendo imposible botar desde él. El bit 2 activo indica que la hora del reloj es incorrecta. Los bits 1 y 0 están reservados.
  • Byte 0Fh: Shutdown Status Byte. Los bits de este byte son asignados durante la inicialización del sistema por parte de la BIOS, informando de su desarrollo (véase listado de la BIOS).
  • Byte 10h: Diskette Drive Type Byte. Los bits 7..4 indican el tipo de la disquetera A y los bits 3..0 el tipo de la disquetera B. Los valores posibles son 0 (no existe esa disquetera), 1 (5¼-360K), 2 (5¼-1.2M), 3 (3½-720K), 4 (3½-1.44M) y 5 (3½-2.88M en BIOS AMI) ó6 (3½-2.88M en BIOS IBM).
  • Byte 11h: Reservado.
  • Byte 12h: Fixed Disk Type Byte. Los bits 7..4 indican el tipo del primer disco fijo y los bits 3..0 el tipo del segundo. Existe una tabla definida por IBM cuando lanzó el AT con 14 tipos de disco; ninguno que se vende hoy en dia está en la tabla, por lo que es frecuente que estos campos estén inicializados con el valor 1111b (ó 0 si no hay disco duro instalado) para indicar simplemente la presencia de disco duro.
  • Byte 13h: Reservado.
  • Byte 14h: Equipment Byte. Los bits 7 y 6 indican el número de disquetes instalados; los bits 5 y 4 el tipo de adaptador de vídeo primario (00: EGA/VGA, 01: CGA-80, 10: CGA-40, 11: MDA); los bits 3 y 2 no se emplean. El bit 1 indica si hay coprocesador aritmético y el bit 0 está activo para confirmar que hay disqueteras.
  • Byte 15h-16h: Low and High Base Memory Bytes. El 15h es el bajo y el 16h el alto. Entre ambos forman una palabra de 16 bits que indica la cantidad de memoria convencional (típicamente 640 Kb).
  • Byte 17h-18h: Low and High Memory Expansion Bytes. El 17h es el bajo y el 18h el alto. Entre ambos forman una palabra de 16 bits que indica la cantidad de memoria extendida, en Kbytes.
  • Byte 19h: Número del primer disco duro. Número de identificación que la BIOS asigna al primer disco duro instalado.
  • Byte 1Ah-2Dh: Reservados.
  • Byte 2Eh-2Fh: Checksum. El 2Eh es el alto y el 2Fh el bajo. Entre ambos forman una palabra de 16 bytes que constituye el checksum o suma de comprobación de los bytes 10h-20h.
  • Byte 30h-31h: Low and High Memory Expansion Bytes. Habitualmente es el mismo valor que el almacenado en los bytes 17h y 18h; esta variable refleja sólo la memoria extendida ubicada por encima del primer megabyte que detecta la BIOS en el momento de arrancar.
  • Byte 32h: Date Century Byte. Valor BCD del siglo actual-1. Para 1992, por ejemplo, es 19h.
  • Byte 33h: Information Flag. El bit 7 indica si está instalada la vieja opción de ampliación de 128 Kb (hasta los 640 Kb) del IBM AT original: hoy en día suele estar siempre activo. El bit 6 es empleado por el programa SETUP para eliminar el mensaje inicial al usuario tras el primer SETUP. Los demás bits están reservados.
  • Byte 34h-3Fh: Reservados.

Véase también

Fuentes

  • CD, Carrera de Informática. MINED. Materiales Bibliográficos para los ISP, Versión 4 y 5