Estructura y Arquitectura de Ordenadores. Pr ctica 1: Osciladores, temporizadores y contadores de tiempo en el PC, AT y PS/2. Introducci¢n. En la familia de ordenadores IBM existen diferentes eircuitos dedicados a contar tiempo Existen 3 elementos temporizadores que se dedican a: + marcar la velocidad de fimcionalniento de la CPU. + llevar el contador de tiempo del sistema (tic-tacs). + Un reloj/calendario de tiempo real. + Generar sonido a trav‚s del altavoz haciendo que suene eomo un zumbador. Osciladores: En el PC original, la extra¤a velocidad de 4.77MHz esta derivada de una frecuencia b sica de un oseilador (generalmente de cuarzo) que oscila a 14.31818MHz, utilizado habitualmente en la circuiter¡a de los televisores a color. Si se divide esta frecuencia entre 12, obtenemos 1.19318MHz que es la frecuencia de reloj que se utiliza para el temporizador i8253 (en los PC's) y el i8254 (en los AT's y PS/2). Actualmente los AT's, PS/2, 386 y 486 tienen una velocidad de reloj de la CPU mas alta. PROGRAMACION: No se puede programar por software. Temporizadores: En los PC's se monta el intel i8253 y en el resto de la familia IBM el intel i8254. Se emplean para contar los pulsos a 1.19318MHz que llegan del divisor de frecuencia del oscilador principal del sistema (el que marca el ritmo de funcionamiento de la CPU). Funciona independientemellte de la CPU. Lo £nico que necesita de ella es que sea programado para iniciar sus registros. Poseen 3 canales identicos pero que se dedican a 3 areas distintas. Cada canal se compone de un LATCH de 16 bits y un contador de 16 bits. La CPU escribe un valor en el LATCH. En esto consiste la programaci¢n de un canal. Sobre el contador exisle un n£mero que siempre est  decrement ndose. Irremediablemente este llega a 0, y cuando esto se produce, el temporizador emite un pulso por su linea OUT y carga el contenido del LATCH en el contador. A partir de aqu¡ se repite la seeuencia. El contenido del LATCH no se altera hasta que la CPU vuelve a reescribirlo. + canal 0: el 'tic-tac' del sistema. Se uliliza en el reloj del sislema. Est  controlado por la ROM BIOS desde el encendido del ordenador, de forma que produce aproximadamente 18.2 pulsos por segundo. Se mantiene una cuenta de estos pulsos en la posici¢n de memoria 0x0040:0x006C, que contiene el cuenteo del reloj del sistema. Con cada ciclo de reloj (a raz¢n de 1193180 veces por segundo) se decrementa el contador de 16 bits del canal 0. Sobre el LATCH asociado a este canal hay escrito 0xFFFF (salvo que nosotros indiquemos lo contrario. El tiempo gue se tarda en convertir este valor en 0 es 65536/1193180 Hz = 0.0549254 seg. Esto indica que se producen 1/(0.0549254 seg)=18.206482 pulsos por segundo (Hz). La salida del temporizador est  conectada a la IRQ0. Esta es gestionada por el PIC (i8259A). La ROM BIOS controla el contador de tiempo del sistema a trav‚s de la interrupci¢n 0x08. Esto significa que en la entrada 0x08 del vector de interrupciones del ordenador hay un puntero que apunta a la rutina de gesti¢n del contador de tiempo del sistema que pertenece a la BIOS. Esta se ejecuta 18.2 veces por segundo, salvo que no indiquemos lo contrario, deshabilitando las interrupciones hardware. Tambi‚n es posible hacer que esta rutina se lance m s veces por segundo cargando sobre el LATCH del canal 0 un n£mero inferior a 0xFFFF. Esta rutina, antes de finalizar, llama a la interrupci¢n 0x1C. Esta apunta a una instrucci¢n RETI (RETorno de Interrupei¢n). Si hacemos que esta entrada en el vector de interupcciones apunte a un programa construido por nosotros que acabe con una instrucci¢n RETI, habremos realizado un programa que se lanza 18.2 veces por segundo. Esto acarrea un imperativo: el que nuestra rutina no tarde m s de 0.0549254 segundos en ejecutarse (no es demasiado tiempo). Si esto no es asi anidaremos llamadas a nuestra rut¡na restora de interupci¢n porque es llamada antes de que se termine de ejecutar. + canal 1: refresco de la memoria. Controla el refresco de memoria de todas las m quinas, con escepci¢n del PCjr. Es mejor dejarlo en paz. La linea OUT de este canal est  conectada al DMA (i8237), que es el chip encargado de refrescar las DRAM. + canal 2: hace zumbar el altavoz. La linea OUT de este canal esta conectada al amplificador que da la potencia necesaria para que oscile la membrana del altavoz del PC. Puesto que por esta linea lo £nico que circula son pulsos a direrentes frecuencias, lo £nico que emite el altavoz del PC es zumbidos a diferentes freeueneias. Para programar un zumbido de una frecuencia alta, ponemos un valor bajo en el LATCH del canal 2. El sonido suena de forma constante, hasta que la CPU no indica lo contrario. La frecllencia m s baja generable es de 18.2 Hz. PROGRAMACION: Puerto: Opers: Comentario: 0x40 L/E LATCH del canal 0. Primero escribimos el LSB y a continuaci¢n el MSB. 0x41 L/E LATCH del canal 1. 0x42 L/E LATCH del canal 2. 0x43 E Registro de ¢rdenes del temporizador. Sobre el se indica el canal que se va a programar, el modo y la posibilidad de que se envie solamente la mitad del LATCH al contador. Bits: Comentario: 0 0=Datos en binario. 1=Datos en BCD. 1-3 Modo de funcionamiento. 4-5 Tipo de operaci¢n: 00=Desplazar el valor del contador del LATCH. 01=Leer/Escribir s¢lo el MSB. 10=Leer/Escribir s¢lo el LSB. 11=Leer/Escribir el MSB y a continuaci¢n el LSB. 6-7 N£mero del canal que se va a programar l0-2). Por ejemplo: para programar el canal 2 con un n£mero de 2 bytes en formato binario, escribiremos 0xB6. 0x61 E Pertenece al PPI (Interface Programable de Perif‚ricos) i8255A. Despu‚s de que se haya programado el contador de tiempo del canal 2, se necesita activar la circuiterla del altavoz. Este se controla cambiando los valores de los bits 0 y 1 de este puerto. El resto de los bits se utilizan para otras cosas (no tocarlos). El bit 0 controla la transmisi¢n de la se¤al OLIT del segundo canal. El bit 1 controla el amplificador. Se necesita que los 2 bits est‚n a 1 para que el altavoz zumbe. El reloj/calendario de tiempo real: S¢lo existe en los AT's y PS/2. Est  integrado sobre un Motorola MC146818 (en los AT's), alimentado por bater¡as, para que no pierda el contenido de sus registros cuando apagamos el ordenador. En los PS/2, el reloj de tiempo real est  implementado sobre un circuito hecho a medida. En los dos casos se trata de un procesador independiente que puede contar los pulsos horarios sin interferencias con las dem s operaciones del ordenador. Est  conectado a la IRQ8 (hacia el PIC) y normalmellte se manipula con la rutina de interrupci¢n apuntada por la entrada 0x4A del vector de interupciones. La BIOS del AT y del PS/2 controlan este chip a trav‚s de la intermpci¢n 0x1A. La rutina de la BIOS situada en la posicion de memoria apuntada por el puntero situado en la posici¢n de memoria 0x0000:(0x001A*4) es la rutina que se lanza cada vez que por la IRQ8 se produce una interupci¢n. Nota: Cada entrada en el vector de interrupciones tiene 4 bytes. PROGRAMACION: Puerto: Opers: Comentario: 0x70 E Registro de direcci¢n. En el se indica el n£mero del registro que se desea leer o escribir: N£mero Registro: Funci¢n: OxOO Segundos. OxO1 Alarma de segundos. OxOZ Minutos. 0x03 Alarma de minutos. 0x04 Horas. 0x05 Alarma de horas. 0x06 D¡a de la semana. 0x07 D¡a del mes. 0x08 Mes. 0x09 A¤o. 0x0A Registro de estado A. bit 7: 1 si se est  actualizando la hora. O se puede leer o escribir la hora. 0x0B Registro de estado B. bit 0: 1 activado el temporizador de tarifas el‚ctricas reducidas (USA). bit 1: 1 Se cuentan las horas de 0-23. O Se cuentan de 0-12. bit 4: 1 activada la interrupci¢n de final de actualizaci¢n. bit 5: 1 activada la interrupci¢n de alarma. bit 6: 1 activada la interrupci¢n peri¢dica. OxOC Registro de estado C. 0x0D Registro de estado D. 0x71 L/E Escribimos o leemos el dato del registro direccionado. PRACTlCA: Escribir un programa en lenguaje C (preferible Turbo C 2.00) que instale una rutina gestora de interupci¢n apuntada por la entrada 0x1C del vector de interrupciones. Se trata de construir tres funciones: void interrupt Tic(); /* Rutina gestora de la interrupci¢n 0x1C */ void AliveTic(); /* Instala la rutina de interrupci¢n sobre la IHT 0x1C */ void KillTic(); /* Desinstala la rutina */ El cuerpo principal del programa deber  de teller la siguiente estructura: main() { AliveTic(); getch(); /* Espera a que pulsemos una tecla */ KillTic(); } Instrucciones necesarias para construir el programa (b sico): #include /* setvect(), getvect() */ #include /* getch() */ Consejo(s): Dentro de Tic(); es aconsejable poner algunas instrucciones que nos indiquen que la rutina de interrupci¢n se est  ejecutando cada vez que se produce un "tic". Un punlero a una rutina de interrupci¢n se declar  as¡: void interrupt (*AntiguoTic)(); DOCUMENTACION: Listado del program fuente DEBIDAMENTE COMENTADO. Listado de la salida de una de sus ejecuciones. Comentario de la salida. BIBLIOGRAFIA: Solucionario del Programador para IBM PC, XT, AT y Compatibles. Robert Jourdain. AnayaMultimedia. 1988. Guia del Programador para el IBM PC y PS/2. Peter Norton y Richard Wilton. Anaya Multimedia. Microsoft Press. 1990. Microprocessor and Peripheral Handbook. Volume 1. Microprocessor. Intel Corporation. SMD Techical Mktg. SC4-40. P.O. Box 58122. Santa Clara, CA 95052-8122. Turbo C. Reference Guide. Version 2.0. Turbo C. User's Manual. Ve rsion 2.0.