Apollo Guidance Computer

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
Apollo Guidance Computer
Agc view.jpg
Inventado por: MIT Instrumentation Laboratory
Fabricante: Raytheon
Introducido: Agosto de 1966
Discontinuado: Julio de 1975
Tipo: Aviación
Guidance Computer
Procesador: Basado en lógica RTL de CIs discretos
Frecuencia: 2,048 MHz
Memoria: palabras de 16-bits,
2048 palabras RAM (memoria de núcleos magnéticos), 36864 palabras de ROM (memoria de núcleos cableados)
Puertos: DSKY, IMU, Controlador manual, Radar de rendezvous (CM), Radar de aterrizaje (LM), Receptor de telemetría, Controlador del Motor, Reaction Control System
Alimentación: 55W[1] :120
Peso: 70 lb (31,7514659 kg)
Dimensiones: 24x12,5x6,5 pulgadas (61x32x17 cm)

El Computador de Navegación del Apolo ó Apollo Guidance Computer (en adelante AGC) era un elemento fundamental del programa Apolo. Su papel en el programa espacial fue proporcionar el control y la capacidad de cálculo necesarios para controlar la orientación, y la navegación del módulo de mando (CM, de Command Module) y del módulo lunar (LM, de Lunar Module). Este ordenador destaca por haber sido uno de los primeros computadores basados en CIs.

El AGC y su interfaz DSKY se desarrollaron a principios de los 1960s por el MIT Instrumentation Laboratory para el programa Apolo.

La interfaz de pantalla y teclado (DSKY) del Apolo Guidance Computer montada en el panel de control del módulo de mando, con el Flight Director Attitude Indicator (FDAI) encima.
Lista parcial de los códigos numéricos para verbos y nombres en el Apollo Guidance Computer. Fueron impresos en un panel lateral como guía de referencia rápida.

El AGC en el Apolo[editar]

Cada vuelo a la Luna (a excepción del Apolo 8, que no llevó módulo lunar en su misión a la órbita lunar) tenía dos AGCs, uno en el módulo de mando y otro en el módulo lunar. El AGC del módulo de mando estaba situado en el centro del sistema de navegación y orientación (G&C) de la nave. El AGC del módulo lunar llevaba su propio sistema primario de orientación, control y navegación del Apolo, conocido por el acrónimo de PGNCS (pronunciado como pings).

Cada misión lunar tuvo dos ordenadores adicionales:

Diseño[editar]

El AGC se diseñó en el MIT Instrumentation Laboratory bajo la dirección de Charles Stark Draper, con el diseño hardware a cargo de Eldon C. Hall.[1] Los primeros trabajos sobre la arquitectura llegaron de manos de J.H. Laning Jr., Albert Hopkins, Ramon Alonso,[2] [3] y Hugh Blair-Smith.[4] La empresa Raytheon fabricó el hardware de vuelo, y Herb Thaler[5] también estaba en el equipo de diseño.

El computador de vuelo del Apolo fue el primero en usar circuitos integrados (CIs). Mientras que la versión Block I usaba 4100 CIs, conteniendo cada uno una sencilla puerta NOR de 3 entradas, la versión posterior Block II (usada en los vuelos tripulados) empleó 2800 CIs, cada uno con dos puertas NOR de 3 entradas.[1] :34 Los CIs, de Fairchild Semiconductor, se implementaron usando lógica resistencia-transistor (RTL) en un flat-pack. Fueron conectados mediante wire wrap, y luego el cableado se incorporó en un molde plástico de epoxy. Al usar un único tipo de integrado (las doble NOR3) para todo el AGC, se evitaron los problemas que plagaban los primeros diseños de computadores basados en CIs, como el computador de guiado Minuteman II , que usaba una mezcla de puertas con lógica diodo-transistor y otras con lógica diodo-resistor.

El computador tenía 2048 palabras de memoria de núcleos magnéticos borrable y 36 kilopalabras de memoria de núcleos cableados de solo lectura. Ambas tenían un ciclo de 11,72 micro-segundos. La longitud de la palabra de memoria era de 16 bits: 15 bits de datos y 1 bit de paridad impar. El formato de palabra de la CPU de 16 bits eran 14 bits de datos, 1 bit de overflow, y 1 bit de signo (en representación complemento a uno).

Interfaz DSKY[editar]

Interfaz de usuario DSKY del computador del Apolo.
Diagrama de la interfaz DSKY del LM.

La interfaz de usuario con la que se accedía al AGC era la DSKY ( abreviatura del inglés display and keyboard, que en castellano significa teclado y pantalla), pronunciado comúnmente como dis-key. Poseía un vector de indicadores luminosos, varios visualizadores numéricos y un teclado tipo calculadora. Los comandos se introducían como números de dos dígitos: Verbo, y Nombre. El Verbo describía el tipo de la acción a realizar y el Nombre especificaba el dato afectado por la acción indicada por dicho verbo.

Los numerales se mostraban a través de visualizadores de siete segmentos electroluminescentes de alto voltaje de color verde. Para controlar estos visualizadores se usaban relés electromecánicos que limitaban su velocidad de refresco (la versión posterior Block II usaban rectificadores controlados de silicio más veloces). En ellos se podían visualizar tres números de 5 dígitos con signo en base octal o decimal, y se usaban típicamente para mostrar vectores tales como la actitud del vehículo espacial o un cambio de velocidad necesario (delta-V). Aunque los datos se almacenaban internamente en unidades métricas, estos se mostraban según el sistema anglosajón de unidades. Esta interfaz tipo calculadora[nb 1] fue la primera de su clase, y el prototipo para todas la interfaces de paneles de control similares.

El modulo de mando tenía dos DSKYs conectadas a su AGC; una situado en el panel de instrumentos principal y una segunda en la bahía de equipos cerca de un sextante que se usaba para alinear la plataforma de navegación inercial. El módulo lunar tenía una única interfaz DSKY para su AGC. Unos indicadores de actitud (FDAI), controlados por el AGC, se situaban sobre la DSKY en la consola del comandante y en el LM.

En 2009, se vendió un DSKY por $50788 en la subasta pública organizada por Heritage Auctions.[6]

Temporización[editar]

El cristal oscilador del reloj del AGC tenía una frecuencia de unos 2.048 MHz. Esta señal se dividía por dos para producir un reloj de 1.024 MHz de cuatro fases que usaba el AGC para realizar las operaciones internas. Además, la señal de 1.024 MHz se dividía por dos para producir una señal de 512 kHz denominada frecuencia maestra; esta señal se usaba para sincronizar los sistemas externos del Apolo.

A su vez, la frecuencia maestra primero se dividía mediante un escalador por cinco, usando un contador en anillo para producir una señal de 102.4 kHz. Luego era dividida por dos a través de 17 etapas consecutivas: desde F1 (51.2 kHz) hasta F17 (0.78125 Hz). La etapa F10 (100 Hz) era retroalimentada hacia el AGC para incrementar el reloj en tiempo real y otros contadores involuntarios usando el Pinc (detallado a continuación). La etapa F17 se usaba para cargar intermitentemente el AGC cuando trabajaba en modo standby.

Registros centrales[editar]

El AGC tenía cuatro registros de 16 bits con propósitos computacionales conocidos como los registros centrales:

A : El acumulador, para uso general
Z : El contador de programa - la dirección de la siguiente instrucción a ser ejecutada
Q : El resto de la instrucción DV, y la dirección de retorno en las instrucciones TC
LP : El producto inferior en las instrucciones MP

También habían cuatro posiciones en la memoria central, en las direcciones 20-23, denominadas posiciones de edición porque lo que estuviera almacenado allí sería devuelto desplazado o rotado un bit, excepto para lo que fuera desplazado a la derecha 7 bits, para extraer uno de los 2 códigos de operación de 7 bits empaquetados en una palabra. Esto era común a los AGCs del Bloque I y del Bloque II.

Otros registros[editar]

El DSKY y el AGC en una exposición en el Computer History Museum. El AGC está desmontado mostrando sus módulos lógicos.
Prototipo de módulo lógico del Bloque I de AGC.
Módulo lógico del Bloque II, con integrados flat-pack.
Doble puerta NOR del AGC
Esquema de la doble puerta NOR del AGC

El AGC tenía varios registros adicionales que se usaban internamente durante el transcurso de una operación:

S : Registro de 12 bits de dirección de memoria, la parte inferior de la dirección de memoria
Bank/Fbank : Registro de 4 bits de la ROM, para seleccionar el 1 k de palabras de la ROM cuando se direcciona en el modo conmutable-fijo
Ebank : Registro de 3 bits de la RAM, para seleccionar las 256 palabras de la RAM cuando se direcciona en el modo conmutable-borrable
Sbank (super-bank) : Extensión de 1 bit al Fbank, necesario porque las últimas 4 kilopabalras de la ROM de 36-kilopalabras no es alcanzable usando solo Fbank
SQ : Registro de secuencia de 4 bits; la instrucción actual
G : Registro de 16 bits del buffer de memoria, para mantener la transmisión de palabras de datos desde y hacia la memoria
X : La entrada 'x' del sumador (el sumador se usaba para realizar toda la aritmética complemento a uno) o el incremento del contador de programa (registro Z)
Y : La otra entrada ('y') al sumador
U : No es realmente un registro, sino la salida del sumador (la suma en complemento a 1 del contenido de los registros X e Y)
B : Registro buffer de propósito general, también usado para pre-cargar la siguiente instrucción. Al comienzo de la siguiente instrucción, los bits superiores de B (con el siguiente código de operación) eran copiados a SQ, y los bits inferiores (la dirección) eran copiados a S.
C : No es un registro independiente, sino el complemento a uno del registro B
IN : Cuatro registros de entrada de 16 bits
OUT : Cinco registro de salida de 16 bits

Conjunto de instrucciones[editar]

El formato de las instrucciones emplea 3 bits para el código de operación y 12 bits para las direcciones. Block I tenía 11 instrucciones: TC, CCS, INDEX, XCH, CS, TS, AD, y MASK (básicas), y SU, MP y DV (extras). Las ocho primeras, llamadas instrucciones básicas eran utilizadas directamente por el código de operación de 3 bits. El acceso a las últimas tres instrucciones era a través de un tipo especial de la instrucción INDEX llamada EXTEND, justo antes de la instrucción. Las instrucciones del AGC de Block I son:

TC (transfer control)
Salto incondicional a la dirección especificada en la instrucción. La dirección de retorno se almacenaba automáticamente en el registro Q, de forma que la instrucción TC se podía emplear para llamar a subrutinas.
CCS (count, compare, and skip)
Instrucción de salto condicional complejo. El registro A se cargaba con datos recuperados de la dirección especificada en la instrucción. (Debido a que el AGC usa la notación de complemento a 1, existen dos representaciones del 0. Cuando todos sus bits están a 0, se llama +0 [más cero]. Si todos los bits están a 1, se llama -0 [menos cero].) El valor absoluto disminuido (DABS) se operaba y se almacenaba en el registro A. Si el número era mayor de 0, el DABS decrementaba el valor en 1; si el número era negativo se calculaba su complemento antes de ser decrementado (ese es el valor absoluto). Por disminuido se entiende “decrementado pero no por debajo de cero”. Por lo tanto, cuando el AGC ejecuta la función DABS, los números positivos tenderán a +0 y también lo harán los negativos, pero después de informar su valor negativo a través del salto de cuatro vías (a continuación). El último paso en CCS es el salto de cuatro vías, dependiendo del dato del registro A antes del DBAS. Si el registro A era mayor que 0, CCS saltaba a la primera instrucción inmediatamente después de CCS. Si el registro A contenía +0, CCS saltaba a la segunda instrucción después de CCS, y -0 saltaba a la cuarta instrucción después de CCS. El objetivo principal de la cuenta era facilitar los bucles sencillos, controlados por un contador positivo, para acabar en un CCS, y un TC al principio del bucle, equivalente al BCT del IBM 360. La función de valor absoluto se consideró suficientemente importante para ser incorporada dentro de esta instrucción; cuando se usa para solamente esta función, la secuencia después de CCS era TC *+2, TC*+2, AD ONE. Un efecto colateral curioso era la creación y uso de agujeros CCS cuando se sabía que el valor probado nunca sería positivo, que ocurría más a menudo de lo que se esperaba. Eso dejaba dos palabras completas desocupadas y era responsabilidad de un comité especial ubicar valores constantes en esos agujeros.
INDEX
Suma el dato recuperado de la dirección especificada en la instrucción, a la siguiente instrucción. INDEX se puede usar para sumar o restar un índice a la dirección base especificada por el operando de la instrucción siguiente a INDEX. Este método se usa para implementar vectores, matrices y tablas de búsqueda; desde que la suma se hace en ambas palabras completas, también se usaba para modificar el código de operación en una instrucción extra, y en raras ocasiones ambas funciones a la vez.
RESUME
Una particularidad de INDEX (INDEX 25). Esta es la instrucción usada para volver de una interrupción. Provoca que la ejecución vuelva al punto de la interrupción.
XCH (exchange)
Intercambie el contenido de la memoria con el contenido del registro A. Si la dirección de memoria especificada es de memoria de sólo lectura, el contenido de la memoria no se ve afectado, y la instrucción únicamente carga el registro A. Si es una memoria borrable, se alcanza la corrección de desbordamiento (overflow) almacenando el bit más a la izquierda de los 16 bits de A como el bit de signo.
CS (clear and subtract)
Carga el registro A con el complemento a 1 del dato referenciado en la dirección de memoria especificada.
TS (transfer to storage)
Almacena el registro A en una dirección de memoria específica. TS además detecta y corrige desbordamientos de tal forma que puede propagar el acarreo de bits en una suma/resta multi precisión. Si el resultado no produce desbordamiento (los dos bits izquierdos de A con el mismo valor) no ocurre nada especial; si hay desbordamiento (esos dos bits distintos), el 1 más a la izquierda se lleva a la memoria como el bit de signo y el registro A se cambia a +1 o -1 según corresponda, y el control salta a la segunda instrucción después de TS. Como siempre es posible (aunque anormal) que suceda un desbordamiento, la instrucción TS se sigue de una TC a la lógica de no desbordamiento; cuando es una posibilidad normal (como en sumas/restas multi precisión), la instrucción TS va seguida por CAF ZERO (CAF = XCH a memoria fija) para completar la formación del bit de acarreo (+1, 0 o -1) en la siguiente palabra de alta precisión. Los ángulos se mantenían en precisión simple, mientras que las distancias y velocidades se almacenaban en doble precisión y el tiempo transcurrido en tripe precisión.
AD (add)
Añade el contenido de la memoria al registro A y almacena el resultado en A. Los dos bits más a la izquierda de A pueden ser diferentes (desbordamiento) antes o después de AD. El hecho de que el desbordamiento sea un estado más que un evento, perdona amplía las limitaciones del desbordamiento cuando se suman más de dos números siempre y cuando ninguno de los totales intermedios supera el doble de la capacidad de una palabra.
MASK
Ejecuta un AND de bits (booleano) de la memoria con el registro A y almacena el resultado en el registro A.
MP (multiply)
Multiplica el contenido del registro A por el dato de la dirección de memoria referenciada y almacena la parte más significativa del producto en el registro A y la menos significativa en el registro LP. Ambas partes del producto comparten el signo.
DV (divide)
Divide el contenido del registro A por el dato referenciado en la dirección de memoria. Almacena el cociente en el registro A y el valor absoluto del resto en el registro Q. De forma distinta a las máquinas modernas, los números reales se trataban como fracciones (punto decimal justo a la derecha del bit de signo), de manera que se podía producir basura si el divisor no era tan largo como el dividendo; no había protección frente a estas situaciones. En el AGC del Block II, un dividendo de doble precisión comenzaba en A y L (el registro LP del Block II), y el resto, con su signo, se dejaba en L. Esto simplificaba considerablemente la subrutina para la división de doble precisión.
SU (subtract)
Resta (complemento a 1) el dato en la posición de memoria referencia del contenido del registro A, almacenando el resultado en A.

Las instrucciones se implementaban en grupos de 12 pasos, llamados pulsos de temporización (timing pulses). Los pulsos se nombraban de TP1 a TP12. Cada conjunto de 12 pulsos se llamaba subsecuencia de instrucción. Las instrucciones simples, como TC, se ejecutaban en una sola subsecuencia de 12 pulsos. Las instrucciones más complejas necesitaban varias subsecuencias. La instrucción de multiplicación (MP) usaba 8 subsecuencias: una inicial llamapa MP0, seguida de una subsecuencia MP repetida 6 veces y terminada por MP3. Se redujo a 3 subsecuencias en Block II. Cada pulso de temporización (TP) en una subsecuencia podía disparar hasta 5 pulsos de control. Los pulsos de control eran señales que hacía en trabajo de la instrucción, como leer el contenido de un registro en el bus, o escribir datos del bus en un registro.

Memoria[editar]

La memoria del AGC Block I estaba organizada en bancos de 1K palabras (KP). El primer banco (banco 0) era de memoria borrable (RAM). Todos los siguientes bancos eran memoria fija (ROM).

Cada instrucción AGC tenía un campo de direccionamiento de 12 bits. Los bits más bajos (1-10) direccionan la memoria dentro de cada banco. Los bits 11 y 12 seleccionan el banco: 00 selecciona el banco RAM (banco 0), 01 el banco 1 (ROM), 10 el siguiente (banco 2, ROM) y 11 selecciona el registro de banco, que se puede usar para seleccionar cualquier banco por encima del 2. Los bancos 1 y 2 se denominaban bancos de memoria fijo-fijo porque siempre estaban disponibles independientemente del contenido del registro de banco. Los bancos 3 y superior e llamaban fijo-seleccionable porque el banco seleccionado se seleccionaba por el registro de banco.

Originalmente, el AGC Block I tenía 12KP de memoria fija, pero se incrementó posteriormente a 24 KP. El Block II tenía 32 KP de memoria fija y 4 KP de memoria RAM. El AGC transfería datos desde y hacia la memoria a través del registro G en un proceso llamado ciclo de memoria. El ciclo de memoria duraba 12 pulsos de temporización (11,72 μs), comenzando en el TP1 cuando el AGC cargaba la dirección de memoria a ser leída en el registro S. El hardware de la memoria recuperaba el dato/la palabra de la memoria de la dirección especificada en el registro S. Las palabras de la RAM se depositaban en el registro G en el TP6; las palabras de la ROM estaban disponibles en el TP7. La palabra recuperada de la memoria quedaba disponible en el registro G para el acceso del AGC durante los TP7 a TP10. Después del TP10, el dato existente en el registro G se escribía en la memoria.

Los 15 bits más bajos de cada palabra contenían instrucciones AGC o datos, usando el bit 16 como bit de paridad. Este bit se ponía a 0 o 1 a través de un circuito de generador de paridad de forma que la suma de 1 en cada palabra en la memoria, siempre fuera un número impar.

Para verificar el bit de paridad, se disponía de un circuito de chequeo de paridad que se encargaba de la verificación en cada ciclo de memoria; si el bit no tenía el valor esperado, se asumía que el dato estaba corrompido y se iluminaba la luz de alarma de paridad en el panel.


Modo Standby[editar]

El AGC tenía un modo de ahorro de energía controlado por un interruptor de standby. Este modo cortaba la corriente del AGC excepto al reloj de 2,048 MHz y al contador de impulsos. La señal F17 del contador de impulsos encendía y apagaba el AGC en intervalos de 1,28 segundos. En este modo, el AGC ejecutaba funciones esenciales, chequeaba el interruptor de standby y si estaba pulsado, cortaba la corriente y volvía a dormir hasta la siguiente señal F17.

En el modo standby el AGC permanecía dormido la mayor parte del tiempo, por lo que no se despertaba para ejecutar la instrucción Pinc necesaria para actualizar el reloj en tiempo real del AGC a intervalos de 10 ms. Para compensarlo, una de las funciones ejecutadas por el AGC cada vez que se despertaba era actualizar el reloj en tiempo real en 1,28 segundos.

El modo standby se diseñó para reducir el consumo de energía de 5 a 10 W (sobre 70W) durante el curso medio del vuelo, cuando el AGC no era necesario. Sin embargo, en la práctica, el AGC se dejó encendido en todas las fases de la misión y nunca se usó esta característica.


Buses de datos[editar]

El ACG tenía un buses de lectura y escritura de 16 bits. Los datos de los registros centrales (A, Q, Z o LP), u otros registros internos se podían colocar en el bus de lectura con una señal de control. El bus de lectura se conectaba con el bus de escritura a través de un búfer, de forma que cualquier dato que aparecía en el bus de lectura, también aparecía en el de escritura. Otras señales de control podían copiar los datos del bus de escritura en los registros.

Las transferencias de datos se comportaban de la siguiente manera: para mover la dirección de la siguiente instrucción desde el registro B al registro S, se empleaba una señal de control RB (READ B). Esto causaba que la dirección se moviese del registro B al bus de lectura y de ahí al bus de escritura. Una señal de control WS (WRITE S) movía la dirección desde el bus de escritura al registro S.

Existía la posibilidad de leer simultáneamente varios registros en el bus de lectura. Cuando esto ocurría, los datos de cada registro se incorporaban al bus a por medio de un OR (inclusivo). Este OR se usó para implementar la instrucción MASK que era una operación AND lógica. Debido a que el AGC no tenía posibilidad de hacer un AND lógico, pero sí un OR lógico a través del bus, y se puede invertir datos a través del registro C, según el teorema de De Morgan, se podía implementar un AND lógico a base de OR lógico y NOT, invirtiendo ambos operandos, ejecutando un OR lógico en el bus e invirtiendo el resultado.


Software[editar]

El bloque II[editar]

EL problema del PGNCS[editar]

Código de error 00404[editar]

Aplicaciones después del Apollo[editar]

Véase también[editar]

Notas[editar]

  1. The first advanced desktop calculators hit the market in roughly the same time frame, with scientific and then programmable pocket calculators appearing during the following decade. The first programmable handheld calculator, the HP-65, was tried on backup computations aboard the Apollo Command/Service Module in the Apollo-Soyuz Test Project in 1975.

Referencias[editar]

  1. a b c Hall, Eldon C. (1996), Journey to the Moon: The History of the Apollo Guidance Computer, Reston, Virginia, USA: AIAA, p. 196, ISBN 156347185X 
  2. «Ramon Alonso's introduction», AGC History Project (Caltech archive, original site closed) (MIT), July 27, 2001, http://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/conference1/alonso-intro.htm, consultado el 2009-08-30 
  3. «Ramon Alonso's interview (Spanish)», Ramón Alonso, el argentino que llevó a la Apollo 11 a la Luna (Diario La Nacion), March 7, 2010, http://www.lanacion.com.ar/nota.asp?nota_id=1240769 
  4. «Hugh Blair-Smith biography», AGC History Project (Caltech archive, original site closed) (MIT), January, 2002, http://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/people/hblairsmith.htm, consultado el 2009-08-30 
  5. «Herb Thaler introduction», AGC History Project (Caltech archive, original site closed) (MIT), 14-September-2001, http://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/conference2/thaler-intro.htm, consultado el 2009-08-30 
  6. [1]

Enlaces externos[editar]

Documentación sobre el AGC y su desarrollo[editar]

Documentación del diseño del hardware del AGC, y particularmente el uso de los nuevos circuitos integrados en lugar de transistores[editar]

Documentación del software operativo del AGC[editar]

  • Delco Electronics, Apollo 15 - Manual for CSM and LEM AGC software used on the Apollo 15 mission, including detailed user interface procedures, explanation of many underlying algorithms and limited hardware information. Note that this document has over 500 pages and is over 150 megabytes in size.

Algunos proyectos y simuladores basados en el AGC[editar]

  • AGC Replica – John Pultorak's successful project to build a hardware replica of the Block I AGC in his basement. Mirror site: AGC Replica.
  • Virtual AGC Home Page – Ronald Burkey's AGC simulator, plus source and binary code recovery for the Colossus (CSM) and Luminary (LEM) SW
  • Project Apollo for Orbiter – Addon for Orbiter spaceflight simulator, working towards a full simulation of the CSM and LEM including the Virtual AGC.
  • Eagle Lander 3D Shareware Lunar Lander Simulator with a working AGC and DSKY (Windows only)

Reportajes[editar]