You are on page 1of 665

UNIVERSIDAD DE ORIENTE

NÚCLEO DE ANZOÁTEGUI
ESCUELA DE INGENIERÍA Y CIENCIAS APLICADAS
DEPARTAMENTO DE ELECTRICIDAD

Análisis, Diseño y Simulación de


Sistemas Basados en Microprocesador

REALIZADO POR

LUIS DANIEL URDANETA GUEVARA

TRABAJO PRESENTADO COMO REQUISITO PARCIAL


PARA ASCENDER A LA CATEGORÍA DE
PROFESOR AGREGADO

Puerto la Cruz, noviembre del 2005


ii

Dedicatoria

A mi esposa: Leyda Thays


A mis hijas: Ana Cristina y Luz Cristina

Quienes supieron soportar con paciencia y considera-


ción las numerosas y largas sesiones de trabajo necesa-
rias para la culminación de este proyecto.
iii

Prefacio
El presente trabajo ha sido realizado con un doble fin: el primero es cumplir
con lo establecido en el articulo 30 del Reglamento de Personal Docente y de Investi-
gación de la Universidad de Oriente, y el segundo servir como texto guía en la asigna-
tura Sistemas de Microprocesadores I (60-4953), la cual tiene carácter obligatorio
para estudiantes cursantes de la carrera de Ingeniería Eléctrica en el Departamento de
Electricidad de la Universidad de Oriente.

El contenido de las asignaturas Introducción a los Circuitos Digitales y Labo-


ratorio de Circuitos Digitales ponen en contacto al estudiante con circuitos integrados
(CI) fabricados utilizando tecnologías de Integración a Escala Pequeña, o SSI (2 has-
ta 50 transistores en un CI) e Integración a Escala media, o MSI (50 hasta 500 fun-
ciones transistorizadas en un CI). Lo cual abarca el uso de puertas básicas y flip
flops, así como contadores, comparadores y registros de desplazamiento, entre otras
funciones lógicas.

En estos cursos se enseñan los principios y técnicas de análisis y diseño de sis-


temas digitales que capacitan al estudiante para diseñar y construir circuitos electró-
nicos digitales combinatorios y/o secuenciales que realizan funciones de control e
instrumentación en equipos y sistemas industriales, mediante el cableado de compo-
nentes electrónicos discretos y CIs de propósito específico fabricados con tecnología
TTL y CMOS. A partir de estos módulos fundamentales se organizan sistemas digi-
tales capaces de usar información proveniente del mundo real representada en forma
de valores discretos para resolver problemas de ingeniería de mediana complejidad.

El diseño de un sistema digital mediante el método de cableado de compo-


nentes electrónicos presenta como desventaja fundamental que cualquier variación en
las especificaciones originales de diseño que representen una mejora en el funciona-
miento del circuito requiere la introducción de nuevos componentes y la realización
de nuevas interconexiones.

El material vertido en este libro capacita al estudiante para diseñar y construir


sistemas digitales más eficientes y versátiles y, en cierto modo, inteligentes, que pue-
den usarse en aplicaciones distintas sin necesidad de introducir modificaciones en la
estructura física del circuito. Tales sistemas aceptan información proveniente de las
entradas y la procesan según lo establece una secuencia de instrucciones o programa
almacenado en memoria, de modo que una variación del programa determinará la
función que realice el sistema digital. Esta evolución en el diseño lógico se debe a los
avances en la tecnología de fabricación de CI como: Integración a Escala Grande, LSI
(500 hasta 50000 transistores) e Integración a Escala Muy Grande, VLSI (más de
50000 funciones transistorizadas en un CI).
iv

JUSTIFICACIÓN

Aunado al espectacular desarrollo de la tecnología de fabricación de circuitos


integrados, se ha establecido un incremento sostenido de las posibilidades de aplica-
ción de los productos de la microelectrónica. Del desarrollo de sistemas dedicados a
satisfacer necesidades especificas del sector militar e industrial, la microelectrónica
ha emergido como una tecnología de base con presencia universal, significando con
esto que sus efectos se han hecho sentir en todos los ámbitos de la vida del ser huma-
no: en la ciencia, economía, industria, política y administración, en el desarrollo del
arte y medios de entretenimiento, en las técnicas de asistencia médica, en la enseñan-
za, y en la educación.

La microelectrónica es, en esencia, la tecnología disponible más eficiente para


procesar información, permitiendo el desarrollo y la producción de sistemas de trata-
miento electrónico de datos que son capaces de: representarlos, procesarlos, almace-
narlos y transmitirlos por medio de señales eléctricas. Como técnica de vanguardia
para el tratamiento de la información, la microelectrónica abarca los sectores donde
es necesario realizar funciones de: adquirir y agrupar datos, procesarlos, almacenarlos
y entregar resultados del procesamiento.

En la historia del desarrollo de la industria de productos LSI, tiene lugar pre-


ponderante un dispositivo de relativo bajo costo, adecuada flexibilidad, y gran poten-
cia de procesamiento: el microprocesador, el cual es el equivalente LSI de la unidad
central de un procesador de un computador, y el cual se ha insertado aceleradamente
en los sectores productivos a lo ancho y largo del planeta, siendo utilizado con profu-
sión en el tratamiento de datos, procesamiento de señal, supervisión y control de pro-
cesos, e instrumentación. La disponibilidad de una CPU integrada y con arquitectura
poco compleja hizo posible la producción en serie de un nuevo y versátil sistema de
cómputo de bajo costo denominado microcomputador (μC). Además, el µP es un
componente de presencia casi obligatoria en el diseño de sistemas empotrados.

Un sistema empotrado es una aplicación basada en µP diseñada con un propó-


sito específico y cuyo hardware y programa de control no es modificado por el usua-
rio. Desde hace algunos años, los sistemas empotrados han adquirido cada vez mayor
importancia debido a su amplia utilización en el medio industrial y en muchas activi-
dades de nuestra vida diaria, aunque usualmente no los percibimos. Ejemplos de estos
sistemas puede ser encontrado en relojes con alarma, sistemas de sonidos, televisores,
teléfonos celulares y automóviles, entre muchos otros. Este desarrollo, ha sido soste-
nido por los continuos avances de la tecnología de semiconductores concretados con
la producción de chips cada vez más pequeños y rápidos.

El uso extendido del microprocesador en sistemas electrónicos inteligentes ha


introducido cambios notables en las técnicas de diseño convencional debido a que es
fundamental que el ingeniero en funciones posea los conocimientos que lo habilite
para resolver problemas complejos usando esta tecnología. Debe ser capaz de diseñar
v

circuitos en bloques y conectarlos como una unidad funcional o sistema, teniendo la


capacidad de establecer la arquitectura del microcomputador, interconectando correc-
tamente la unidad de procesamiento central (CPU) con los dispositivos externos a
éste, y generar el programa de aplicación que controla el equipo diseñado.

El advenimiento de la era del μP ha forzado además cambios substanciales en


el arquetipo educativo de la Ingeniería Eléctrica. La extraordinaria importancia que el
μP ha alcanzado en el desarrollo de sistemas y equipos, establece la necesidad que el
Ingeniero Electricista adquiera un conocimiento sólido sobre los conceptos teóricos
relacionados con la arquitectura y programación de microprocesadores, de modo que
lo habilite para poder analizar y desarrollar aplicaciones reales de sistemas electróni-
cos basados en microprocesadores.

ALCANCE

Como ingenieros, tenemos plena conciencia de las posibilidades universales


de aplicación de los μPs. Como docentes, nos preocupa determinar como enseñar en
forma clara, comprensible, sencilla y eficiente, la teoría y práctica de los sistemas
basados en μPs.

En general, las aplicaciones de los microprocesadores pueden agruparse en


dos categorías principales:

a.- En la primera, el μP se usa como una unidad central de proceso, junto con
dispositivos de memoria y de entrada y salida, periféricos tales como te-
clado, monitor, y otros equipos externos, los cuales en su conjunto integran
un microcomputador de propósito general. Estos sistemas son usualmente
diseñados y ofrecidos al público por empresas establecidas. El PC compa-
tible IBM y el Macintosh son ejemplos de tales sistemas; éstos son apropia-
dos para el tratamiento de cantidades relativamente grandes de datos usan-
do μPs modernos como el Pentium VI/3.0 GHz y el Power PC. Los usua-
rios típicos de estos equipos comúnmente se limitan a desarrollar progra-
mas de aplicación en lenguajes de alto nivel, y rara vez realizan diseño de
hardware.

b.- La segunda corresponde a los sistemas empotrados donde uno o más μPs
asociados con otros dispositivos LSI o VLSI, son usados para diseñar un
sistema dedicado a realizar una tarea especifica, como: adquisición de da-
tos, procesamiento de señal, control e instrumentación.

Aunque los sistemas dentro de este grupo presentan todas las características
propias de un microcomputador, tienen poca potencia para el procesamien-
to de datos, estando dirigidos desde el punto de vista de su arquitectura y
vi

de su programación a resolver un problema concreto. En este tipo de equi-


pos, el diseñador debe usar criterios de diseño de hardware y de progra-
mación de μPs. Específicamente, debe confrontarse con trasductores de
señal, convertidores análogo - digital y digital - análogo, y otros dispositi-
vos y modos de interconexión entre el μP y el mundo real; debiendo tener
conocimiento de técnicas típicas para comunicación con periféricos como
consultas sucesivas, manejo de interrupciones, y acceso directo a memoria.
En esta categoría el uso de dispositivos de E/S programables y el uso del
lenguaje ensamblador son algunas de las tareas a las cuales el diseñador
debe prestar especial atención.

Considerando la primera modalidad, el programa de estudios de la carrera de


Ingeniería Eléctrica de la Universidad de Oriente incluye un número suficiente de
asignaturas que permiten la formación del estudiante en el área de Programación de
Computadores, siendo común el uso de lenguajes de alto nivel como Pascal, C, y
ADA. Además, el estudiante de la mención de sistemas digitales es entrenado en el
manejo instrumental de programas de aplicaciones específicas, tales como: paquetes
de análisis matemático, simuladores de circuitos electrónicos y de sistemas de con-
trol, además de aplicaciones de inteligencia artificial, y otros programas relacionados
con otras áreas del conocimiento.

El material de estudio que se presenta en este trabajo es producto de notas de


clase realizadas por el autor durante los últimos 12 años y pretende servir como texto
guía de la asignatura Sistema de Microprocesadores, curso que se propone la for-
mación del estudiante para el diseño de sistemas de la segunda categoría, enseñando
las técnicas conocidas para el diseño de la arquitectura y la programación de sistemas
empotrados. Debe ser obvio que este es un curso introductorio que debe se comple-
mentado con la asignatura Sistemas de Microprocesadores II (60-4953) y Laboratorio
de Sistemas de Microprocesadores (60-5911), donde se introducen los microcontrola-
dores, se analizan las técnicas de interconexión en sistemas basados en microproce-
sadores y se verifica experimentalmente los conceptos y técnicas aprendidas en los
cursos teóricos.

La separación de las aplicaciones generales basadas en microprocesadores en


dos modalidades, es en realidad una estrategia instruccional. Al final de su periodo de
formación, nuestro egresado estará capacitado para realizar el diseño y construcción
de sistemas inteligentes donde generalmente uno o más μPs de bajo nivel realizan
control local y utilizan los recursos ofrecidos por microcomputadores comerciales
tipo PC. En este caso, el estudiante debe conocer no solo la arquitectura del micro-
procesador seleccionado para su aplicación, sino que debe comprender la arquitectura
del PC, las técnicas de programación y la manera de establecer la comunicación entre
los equipos.

Como se expuso, este libro se escribe para usarse como guía texto en un curso
introductorio de microprocesadores dentro del plan de estudios de la mención de Sis-
vii

temas Digitales de la carrera de Ingeniería Eléctrica. Para la exposición de la teoría


general de μPs y sus aplicaciones prácticas se usa el μP de 8 bits INTEL 8085A. La
corporación INTEL no es la única casa fabricante de μPs, ni los que produce son ne-
cesariamente los mejores. En realidad, no existe un μP mejor que otro, el óptimo es
aquel que reúna las características y especificaciones requeridas por un proyecto en
particular.

El uso de un μP real, en lugar de uno hipotético, permite cierta profundización


en las características, ventajas y limitaciones de un dispositivo comercial, así como
ilustrar su uso en aplicaciones del mundo real. Además, es seguro que con la com-
prensión de la teoría básica de funcionamiento de un μP, el modo de operación de
cualquier otro µP se entenderá con esfuerzo mínimo.

¿POR QUÉ EL 8085?

Es de vital interés para el autor justificar la selección del μP 8085A como dis-
positivo comercial a utilizar, para presentar los principios fundamentales de los mi-
croprocesadores y la arquitectura y programación de aplicaciones prácticas basadas
en μPs. Por qué se selecciona un microprocesador de 8 bits, diseñado treinta años
atrás, en lugar de un microcontrolador moderno o un µP de 16 ó 32 bits con mayor
potencia de cómputo.

En principio, se considera necesario el uso de un µP y no un µCtrl para iniciar


al estudiante en el conocimiento de las técnicas básicas de diseño de sistemas empo-
trados, porque en la práctica, un microcontrolador no es más que una aplicación basa-
da en microprocesador. De modo, que en el fiel cumplimiento del proceso enseñanza
aprendizaje, deben conocerse primero los conceptos y técnicas de diseños básicas
antes de intentar comprender el modo de funcionamiento de aplicaciones especificas
más complejas. En concreto, el proceso de fabricación de un µCtrl se inicia con el
diseño de un computador basado en µP el cual posteriormente es integrado en el en-
capsulado del circuito. El diseñador del µCTRL debe usar las técnicas conocidas para
diseñar el subsistema de memoria, la estructura de E/S y la lógica de selección y de-
codificación de direcciones. Además, debe realizar la interconexión a la CPU de cir-
cuitos periféricos como temporizadores y conversores de datos.

El uso de un microprocesador en el proceso de enseñanza hace muy fácil para


el educando comprender la arquitectura y el modo de funcionamiento, no solo de mi-
crocontroladores, sino de microprocesadores modernos de alto desempeño. Además,
al final de un curso que use un microprocesador para introducir los conceptos del
tópico de sistemas empotrados, el estudiante estará capacidad de desarrollar el código
VHDL de una aplicación práctica, un microcontrolador por ejemplo, que después será
descargado sobre una FPGA.

También es cierto que en el desarrollo de sistemas empotrados dedicados a re-


solver problemas prácticos de ingeniería típicos del medio industrial, sea usual que la
viii

aplicación diseñada deba usar los recursos de un sistema de propósito general, para lo
cual, se requiere interconectar al PC la tarjeta empotrada diseñada y escribir los pro-
gramas de comunicación en ambos sistemas y cualquier otro código de procesamiento
o presentación de información en el PC. En los casos que el prototipo use la capaci-
dad de procesamiento del PC para realizar sus funciones, la aplicación debe ser dise-
ñada como una extensión del sistema microcomputador. Por ejemplo para un sistema
programables de adquisición y control de datos analógicos y digitales las entra-
das/salidas de los circuitos integrados de la aplicación deben ser interconectados por
medios de puertos al µP del PC.

Hasta los sistemas Pentium II, el usuario tenía acceso directo a los buses de
datos, direcciones y control del µP por medio de ranuras ISA. De este modo, podía
usar las técnicas convencionales para diseñar la aplicación. A partir de los sistemas
basados en Pentium III, el acceso a los buses del µP se realiza a través del bus PCI,
pero igual deben usarse la técnicas básicas para el diseño de subsistemas de memoria
y estructuras de puertos de E/S. En cualquier caso, un conocimiento de cómo se orga-
niza y diseña un sistema basado en microprocesador simplificará las tareas propias
del desarrollo del proyecto

Lo expuesto en párrafos anteriores se simplifica diciendo que usar un micro-


procesador en lugar de un microcontrolador para introducir los conceptos propios del
desarrollo de sistemas empotrados representa una ventaja para el estudiante, al permi-
tírsele aprender como se organizan e interconectan las unidades funcionales que inte-
gran un sistema microcomputador. De otra forma, sería como iniciar un curso de elec-
trónica de audio a partir de los amplificadores de potencia integrados. en lugar de
hacerlo con el funcionamiento del diodo, del transistor bipolar y los amplificadores
básicos.

Por otra parte, en asignaturas avanzadas como Organización y Programación


de Computadores I y II, los estudiantes de la mención de Sistemas Digitales de la
carrera de Ingeniería Eléctrica completan su formación con tópicos relacionados con
el uso de microprocesadores de 16, 32, y 64 bits. En estos cursos el computador mo-
derno es presentado como un sistema complejo constituido por un conjunto de uni-
dades funcionales o subsistemas organizados en forma jerárquica. De modo que es
necesario que el estudiante tenga en su conducta de entrada, conocimientos básicos de
sistemas basados en microprocesadores, para un mejor aprovechamiento de los temas
tratados.

Con lo expuesto en párrafos anterior se considera que se justifica la selección


de un µP en lugar de un µCtrl para introducir al cursante de la carrera de Ingeniería
Eléctrica en el campo de desarrollo de sistemas empotrados. El uso de un procesador
de 8 bits se explica porque las exigencias de cómputo, velocidad y de recursos de
memoria de los sistemas empotrados típicos pueden ser satisfechas por µPs de 8 bits.
De hecho, la mayoría de las modelos de microcontroladores modernos destinados a
aplicaciones industriales son de 8 bits.
ix

En segundo término, se bebe responder a la interrogante sobre la edad del µP


seleccionado para impartir el curso. Para esto es útil realizar un recorrido breve sobre
la evolución del diseño de µPs. El microprocesador 8085 fue introducido por INTEL
en el año 1977 como un μP de 8 bits para propósito general, siendo una versión mejo-
rada de su predecesor el 8080 al incluir en el encapsulado el generador de reloj 8224
y el controlador de sistema 8228, y funcionar con una fuente de poder de tensión úni-
ca de 5 Voltios. Con solo 2 instrucciones más que las del 8080 y un ciclo de instruc-
ción reducido desde 2 μs en el 8080 hasta 1.3 μs en el 8085A (0.8μs para el 8085A-2)
fue considerado como un dispositivo levemente más evolucionado que su antecesor.

No obstante, algunas características funcionales novedosas como disponer de


cuatro entradas de interrupciones vectorizadas además de la entrada estándar INT del
8080, y puertos de E/S para comunicación en serie, junto con otras funciones de con-
trol convirtieron al 8085A en un μP usado ampliamente en la solución de problemas
de control en ambiente industrial. Junto con μP INTEL se aparecieron dos circuitos
LSI, el 8155 y el 8755A compatibles terminal a terminal con el μP. De modo que con
solo 3 circuitos integrados se puede realizar un microcomputador con todas las fun-
ciones del CPU, 256 bytes de RWM, 2Kbyte de EPROM, 38 líneas de E/S distribui-
das en 4 puertos de 8 bits y uno de 6 bits, todos programables como puertos de E/S, y
un temporizador/contador programable de 14 bits.

El uso extendido del 8085A implicaba que un número significativo de diseña-


dores de aplicaciones basadas en μPs lo estaban usando en sus proyectos, lo cual re-
sultó en una gran cantidad de literatura técnica disponible. Se publicaron numerosos
artículos en revistas especializadas, libros de texto, y notas de aplicaciones que junto
con los sistemas de desarrollo ofrecido por INTEL y otras empresas facilitaban el di-
seño de aplicaciones académicas e industriales basadas en este μP. Se estima que In-
tel vendió sobre los 100 millones de este modelo de μP. El 8085A y los miembros de
la familia de μPs INTEL de 16, 32 y 64 bits ha sido, cada cual en su época, los μPs
de propósito general más utilizados en el planeta.

A partir de la introducción de los µPs 8086/8088 y hasta la actualidad, los si-


guientes microprocesadores diseñados han sido dirigidos al uso en máquinas de pro-
pósito general y no se continúo liberando nuevas versiones de µPs dirigidos a control.
Este espacio fue ocupado por los microcontroladores, cuyas primeras versiones em-
pezaron a usarse en aplicaciones de control. La familia MCS-51 de INTEL se convir-
tió en un estándar industrial existiendo el día de hoy más de cuarenta empresas fabri-
cantes de semiconductores en todo el mundo que producen dispositivos pertenecien-
tes a esta familia.

De modo, que se usa un microprocesador de vieja data, debido a que la gama


de µPs de 8 bits modernos es muy limitada, al ser éstos sustituidos actualmente por
microcontroladores. Algunas empresas ofrecen hoy día µPs de 8 bits con arquitectura
CISC similares al 8085 y con rendimiento superior. Por ejemplo, el PopCorn viene en
x

forma de un núcleo lógico en código VHDL el cual puede ser sintetizado junto con
sus circuitos asociados sobre una FPGA.

Además, los microprocesadores de 8 bits como el 8085 no son necesariamente


piezas de museo destinados a desaparecer. Actualmente varias empresas de semicon-
ductores producen versiones CMOS del µP 8085. Por ejemplo el MSM80C85AH es el
modelo colocado por OKI Semiconductor a un mercado reducido de usuarios. Debido
a su alta inmunidad a la radiación cósmica, las versiones actuales del 8085 son usadas
en el diseño de instrumentos para la navegación espacial. También fue usado por la
NASA como CPU del sistema de control del vehiculo explorador Sojourner que se
desplazo por el planeta Marte durante el mes de julio del año 1997 en la misión Path-
finder. El sistema de control del vehículo autónomo Sojourner gobernaba la opera-
ción de 80 periféricos tales como sensores de temperatura y velocidad, cámaras de
TV, lasers, modem, motores y un espectrómetro de rayos x. Además ejecutó 12 expe-
rimentos científicos. El código para el procesamiento, gestión de E/S y los experi-
mentos ocupó 16 Kbytes de PROM, 160 Kbytes de EEPROM y 576 Kbytes de RWM.
Esto significa que el 8085 es un dispositivo completamente operativo capaz de reali-
zar las funciones típicas de un µP, como se ha demostrado hace algunos años en la
misión a Marte y en otras aplicaciones en el sector espacial.

Para finalizar, conviene resaltar que experiencia de más de 12 años en la en-


señanza de sistemas basados en µPs indica que los bachilleres que se han iniciado en
este mundo usando el 8085 no han tenido dificultades para realizar proyectos de gra-
do con μPs más avanzado o con μCtrls. De modo que por las razones expuestas, con-
sidero que brindar atención a un μP de 8 bits cuando el estado del arte apunta hacia
dispositivos de 32 y 64 bits no debe considerarse en modo alguno una desventaja.
INTEL es el líder indiscutible en la producción de μPs y sus productos mantienen la
nomenclatura y terminología usada originalmente en sus primeros dispositivos, y al-
gunas de las características funcionales han permanecido inalterables. Así, iniciar el
estudio de μPs con el 8085 hace sencillo acceder a procesadores modernos de gran
potencia del mismo u otro fabricante.

ORGANIZACIÓN DEL CONTENIDO


Sigue una breve descripción de la forma como están organizados los trece ca-
pítulos que constituyen este libro:

CAPÍTULO 1

Inicia este trabajo realizando una presentación del computador y mostran-


do su evolución a través de los años, desde las primeras máquinas del si-
glo XVII. La historia del computador se divide por generaciones, resaltán-
dose los avances más significativos de cada una.
xi

CAPÍTULO 2

En forma breve se presenta la estructura funcional del computador, descri-


biéndose las unidades funcionales que lo constituyen. También se ofrece
una clasificación de los computadores.

CAPÍTULO 3

Introduce los conceptos de arquitectura y organización. Usando un proce-


so de síntesis, se obtiene la estructura interna de un microprocesador típi-
co y se describe de modo funcional las unidades principales que forman
parte de un µP. Se introducen algunos conceptos básicos como estados,
ciclo de instrucción y tiempos de espera y se exponen técnicas de diseños
básicas de decodificadores de memoria y de puertos presentándose al fi-
nal un diagrama eléctrico de un microcomputador típico basado en el µP
hipotético sintetizado.

CAPÍTULO 4

Presenta la arquitectura y el modo de operación del µP 8085 de INTEL.


Se discute la arquitectura interna del procesador y la función de sus ter-
minales. Se expone en forma concisa las consideraciones de temporiza-
ción y diagramas de tiempo del µP, el ciclo de instrucción y el diagrama
completo de transición de estados.

CAPÍTULO 5

Enseña como diseñar un sistema microcomputador 8085 usando tanto cir-


cuitos integrados para bus multiplexado como chips de puertos y de me-
moria convencionales.

Presenta las técnicas de diseño de circuitos decodificadores de memorias


y puertos usando decodificadores y dispositivos programables. Se descri-
ben circuitos de memoria reales y se discute las consideraciones de velo-
cidad de las memorias del sistema y las características eléctricas de los
terminales del µP.

CAPÍTULO 6

Expone el modelo de programación del 8085, los formatos de instrucción


y los modos de direccionamiento del µP. Se presenta el repertorio de ins-
trucciones del µP y se describe la función de cada instrucción usando
ejemplos prácticos cuidadosamente seleccionados.

Se explica como programar funciones de control de tiempo para generar


tiempos de retardo y formas de onda.
xii

CAPÍTULO 7

Justifica el uso del lenguaje ensamblador para el desarrollo de programas.


Se presentan técnicas de programación como diseño hacia abajo, código
estructurado y programación modular. Se describen las estructuras lógicas
de programación usando programas ejemplos.

Se describe el proceso de ensamblaje y la relocalización de código. Espe-


cífica la sintaxis del lenguaje ensamblador y las directivas de control.

Se presentan las herramientas para desarrollo de programas como: entor-


nos integrados para desarrollo y programas simuladores, mostrándose
ejemplos ilustrativos.

Se explica, usando ejemplos, como escribir código que use MACROS y


tablas de consulta

CAPITULO 8

Discute las distintas técnicas de gestión de entrada y salida; entrada por


programa, por interrupciones y acceso directo a memoria.

Se describe el sistema de interrupciones del 8085. Se presentan los con-


troladores de interrupción 8259 y de acceso directo a memoria 8237.

CAPITULO 9

Se presentan circuitos programables para interconexión de E/S como el


8255, el 8155 y el controlador de teclado/pantalla 8279.

Se ofrecen aplicaciones prácticas realizadas con el 8055 mostrando los


circuitos y programas. Algunas de éstas son: control de una matriz de te-
clado, manejo de una pantalla del indicadores multiplexados, voltímetro
digital, comunicación con impresora CENTRONICS, control de módulo
LCD, generador de baudios, generador de forma de onda, programa mo-
nitor para microcomputador, medidor de temperatura y medidor de capa-
cidad.

Los tópicos contenidos en este trabajo están estructurados para ser cubiertos
en un semestre regular. Al estudiante culminar la lectura y estudio de este material,
estará en capacidad de poner en práctica procedimientos de análisis, diseño y puesta
en operación de sistemas basados en microprocesadores.

Luis Daniel Urdaneta Guevara


Puerto la Cruz, septiembre del 2005
xiii

Este libro está destinado

En particular a:
Los cursantes de la asignatura Sistemas de Microprocesadores I, dictada en el
pregrado de Ingeniería Eléctrica de la Universidad de Oriente.

En general a:
Quienes teniendo un conocimiento limitado del universo de los microprocesa-
dores, o careciendo totalmente de éste, desean aprender de modo rápido y eficiente
los conceptos, técnicas, criterios de diseño y de selección de dispositivos relaciona-
dos.
xiv

Conducta de entrada
Los que inician el estudio de la arquitectura y programación de microprocesado-
res y microcomputadores con la lectura de este texto requieren tener un sólido conoci-
miento de técnicas de análisis y diseño de circuitos digitales combinatorios y secuencia-
les; y de los principios que rigen el funcionamiento de los dispositivos semiconductores
básicos y de su comportamiento cuando integran circuitos electrónicos excitados por
señales digitales y analógicas. Para la realización de las sesiones de simulación se re-
quiere estar familiarizado con el manejo de un microcomputador en entorno WIN-
DOWS.
xv

Propósito

Al culminar el estudio de este texto el estudiante estará capacitado para analizar,


diseñar, y construir, usando circuitos integrados comerciales, aplicaciones basadas en
microprocesadores. Pudiendo además escribir, ensamblar y depurar el programa del
sistema.
xvi

Advertencia
Este trabajo no pretende actuar como un manual del usuario de los progra-
mas CAD usados para la simulación de los ejemplos. Solo se presentan resultados
obtenidos de las pruebas realizadas en el microcomputador para algunos ejemplos
seleccionados. En modo alguno debe el lector debe considerar que se han aprove-
chado al máximo las opciones de análisis, simulación y presentación de resultados,
ofrecidas por las aplicaciones CAD. El interesado debe recurrir a los archivos de
ayuda para familiarizarse con el manejo de cada programa simulador.
xvii

Contenido
Dedicatoria………………………………………………………………………………... .ii
Prefacio……………………………………………………….............................................iii
Este libro está destinado………………………………………………………………….xiii
Conducta de entrada………………………………………...............................................xiv
Propósito………………………………..…………………………………………………xv
Advertencia………………………………………………………………………………xvi

Capítulo 1. INTRODUCCIÓN AL COMPUTADOR.


1.1 GENERALIDADES………………………………………………………………….. 1
1.2 EL COMPUTADOR Y SU HISTORIA……………………………………………… 2
1.2.1 Los precursores del computador moderno………………………………………. 2
1.2.2 El computador digital……………………………………………………………. 4
La primera generación: Las válvulas de vacío………………………………….. 4
La segunda generación: Los transistores..…………………………….............. 13
La tercera generación: Los circuitos integrados………………………………. 15
La cuarta Generación: El microprocesador……………………………………. 18
La quinta Generación: Tecnología VLSI……………………………………… 24

Capítulo 2. ORGANIZACIÓN DEL COMPUTADOR.


2.1 ESTRUCTURA FUNCIONAL DEL COMPUTADOR 31
2.1.1 La unidad central de proceso 33
2.1.2 La unidad de control 34
2.1.3 La memoria 34
2.1.4 La unidad de entrada/salida 35
2.1.5 El generador de reloj 35
2.2 LAS INSTRUCCIONES DEL COMPUTADOR 36
2.3 CLASIFICACIÓN DE LOS COMPUTADORES 39

Capítulo 3. INTRODUCCIÓN AL MICROPROCESADOR.


3.1 GENERALIDADES………………………………………………………………… 41
3.2 ARQUITECTURA INTERNA DEL MICROPROCESADOR…………………….. 45
3.2.1 Proceso de síntesis de un microprocesador………………………………………… 45
El conjunto de instrucciones del microprocesador…………………………………. 46
La unidad de cálculo……………………………………………………………….. 46
Periférico de entrada……………………………………………………………….. 47
Periférico de salida…………………………………………………………………. 51
El conjunto extendido de instrucciones…………………………………………….. 54
Formatos para representación de información………………………………………55
La memoria del sistema……………………………………………………………. 58
El generador de direcciones………………………………………………………... 65
xviii

El microprocesador como máquina de estados…………………………………….. 68


La unidad de control………………………………………………………………... 70
Comunicación con periféricos lentos………………………………………………. 73
Conjunto extendido de instrucciones………………………………………………. 75
Instrucciones no soportadas………………………………………………………... 80
Diagrama final del microprocesador sintetizado…………………………………… 83
Las señales de entrada y salida al microprocesador………………………………... 84
3.2.2 El sistema microcomputador……………………………………………………….. 86
Las direcciones de memoria………………………………………………………... 87
Las direcciones de los puertos……………………………………………………… 90
3.3 ARQUITECTURA DE UN µP DE 8 BITS MÁS VERSÁTIL……………………. 91
3.4 ARQUITECTURA DE UN µCOMPUTADOR ESTÁNDAR………………………. 98

Capítulo 4. ARQUITECTURA Y OPERACIÓN DEL µP 8085


4.1 GENERALIDADES……………………………………………………………….. 101
4.2 ESTRUCTURA FUNCIONAL DEL 8085A……………………………………..... 104
4.2.1 La unidad de control…………………………………………………………..105
4.2.2 Los registros internos………………………………………………………… 108
4.2.3 La unidad aritmética y lógica………………………………………………… 110
4.2.4 El bus interno de datos……………………………………………………….. 111
4.3 CONSIDERACIONES DE TIEMPO PARA EL 8085A…………………………... 114
4.3.1 El ciclo de instrucción………………………………………………………... 115
4.3.2 Secuencia de transición de estados…………………………………………... 118
4.3.3 El estado de espera…………………………………………………………… 122
4.3.4 El modo de operación paso a paso…………………………………………… 125
4.3.5 Ciclos de lectura y escritura en memoria y puertos de E/S…………………... 127
4.4 LA SECUENCIA DE INICIO DEL 8085A……………………………………….. 129

Capítulo 5. EL MICROCOMPUTADOR BÁSICO.


5.1 SISTEMA MCS-85 MÍNIMO…………………………………………………….. 134
5.2 INTERCONEXIÓN CON DISPOSITIVOS CONVENCIONALES……………… 143
5.2.1 La memoria de programa…………………………………………………….. 147
5.2.2 La memoria de datos…………………………………………………………. 151
5.2.3 Los puertos de entrada y salida………………………………………………. 154
5.3 DECODIFICACIÓN EXHAUSTIVA DE LAS DIRECCIONES………………… 158
5.4 PUERTOS DE E/S SELECCIONADOS COMO MEMORIA……………………. 173
5.5 DECODIFICADOR CON DISPOSITIVOS PROGRAMABLES………………… 179
5.6 CONSIDERACIONES SOBRE INTERCONEXIÓN A LOS BUSES……………. 188
5.6.1 Carga máxima del bus del 8085A…………………………………………... 188
5.6.2 Selección de la memoria del sistema………………………………………… 190
5.7 MEMORIAS EEPROM Y FLASH…………………………………………………193
5.8 BANCOS DE MEMORIA…………………………………………………………. 197
xix

Capítulo 6. INTRODUCCIÓN A LA PROGRAMACIÓN DEL 8085A


6.1 EL MODELO PARA PROGRAMACIÓN……………………………………….. 207
6.2 FORMATO DE LAS INSTRUCCIONES………………………………………… 208
6.3 MODOS DE DIRECCIONAMIENTO……………………………………………. 210
6.3.1 Direccionamiento directo…………………………………………………….. 210
6.3.2 Direccionamiento Inmediato…………………………………………………. 211
6.3.3 Direccionamiento por registro………………………………………………...213
6.3.4 Direccionamiento indirecto por registro……………………………………... 213
6.4 EL CONJUNTO DE INSTRUCCIONES DEL 8085……………………………… 214
6.4.1 Grupo de instrucciones para transferencia de datos…………………………. 215
6.4.2 Grupo de instrucciones que ejecutan operaciones lógicas…………………… 218
6.4.3 Instrucciones para manejo de la pila…………………………………………. 234
6.4.4 Grupo de instrucciones para bifurcaciones…………………………………... 240
6.4.5 Grupo de instrucciones aritméticas…………………………………………... 249
6.5 ARITMÉTICA DE PUNTO FIJO O DE PUNTO FLOTANTE…………………... 276
6.6 INSTRUCCIONES ADICIONALES……………………………………………… 284
6.7 RUTINAS DE RETARDO………………………………………………………… 284
6.7.1 El lazo de retardo básico……………………………………………………... 285
6.7.2 Retardos de mayor duración…………………………………………………..289

Capítulo 7. DESARROLLO Y SIMULACIÓN DE PROGRAMAS


7.1 EL LENGUAJE DE PROGRAMACIÓN…………………………………………. 294
7.1.1 Traducción de programas…………………………………………………….. 296
7.1.2 Lenguaje ensamblador o de alto nivel………………………………………... 298
7.1.3 El formato HEX-INTEL……………………………………………………... 303
7.2 ESTRUCTURA DEL PROGRAMA……………………………………………… 306
7.2.1 Programación modular……………………………………………………….. 306
7.2.2 Diseño hacia abajo…………………………………………………………… 307
7.2.3 Código estructurado………………………………………………………….. 308
Estructura secuencial………………………………………………………… 309
Estructura IF-THEN/ELSE………………………………………………….. 311
Estructura CASE……………………………………………………………. 313
Estructura DO-WHILE………………………………………………………. 316
Estructura REPEAT-UNTIL………………………………………………... 317
7.3 EL LENGUAJE ENSAMBLADOR………………………………………………. 318
7.3.1 El proceso de ensamblaje…………………………………………………….. 319
7.3.2 Proceso de ensamblaje de un programa modular…………………………….. 320
7.3.3 Lenguaje ensamblador para el 8085………………………………………….. 325
Formato de línea……………………………………………………………... 326
Conjunto de caracteres……………………………………………………….. 327
Delimitadores………………………………………………………………… 327
Especificación de operandos………………………………………………….327
Símbolos reservados…………………………………………………………. 329
Definición de símbolos………………………………………………………. 329
Evaluación de expresiones…………………………………………………… 331
xx

Traducción de un archivo fuente…………………………………………….. 332


Directivas generales del ensamblador……………………………………….. 340
7.4 HERRAMIENTAS PARA DESARROLLO DE PROGRAMAS…………………. 365
7.4.1 Programas para simulación del microprocesador 8085……………………… 371
7.4.2 Sistema integrado para desarrollo de programas…………………………….. 396
7.5 MACROS………………………………………………………………………….. 409
7.6 TABLAS DE CONSULTA (lookup tables)………………………………… 415

Capítulo 8. TÉCNICAS DE GESTIÓN DE ENTRADA Y SALIDA


8.1 ENTRADA Y SALIDA POR PROGRAMA……………………………………… 429
8.2 ENTRADA Y SALIDA USANDO INTERRUPCIONES………………………… 443
8.2.1 El sistema de interrupciones del 8085A…………………………………………. 445
Interrupciones disparadas por la entrada INTR…………………………………... 449
Interrupciones disparadas por las entradas RST………………………………….. 453
8.2.2 El controlador de interrupciones 8259A………………………………………… 475
Interconexión con el sistema 8085A……………………………………………… 476
Programación del 8259A………………………………………………………... 479
8.3 ACCESO DIRECTO A MEMORIA………………………………………………. 492

Capítulo 9. DISPOSITIVOS DE E/S PROGRAMABLES


9.1 CIRCUITO PARA INTERCONEXIÓN DE PERIFÉRICOS 8255……………….. 497
9.1.2 Modos de operación del 8255ª…………………………………………... 499
Modo 0…………………………………………………………………... 500
Modo 1…………………………………………………………………... 500
Modo 2…………………………………………………………………... 500
9.1.3 Programación del 8255ª…………………………………………………. 500
9.1.4 Aplicaciones del 8255Aª………………………………………………… 503
Operación en el modo 0…………………………………………………. 503
Operación en el modo 1…………………………………………………. 529
Operación en el modo 2…………………………………………………. 536
9.2 DISPOSITIVO 8155: SRAM/PUERTOS DE E/S/TIMER………………………... 539
9.2.1 Sección de entrada y salida del 8155………………………………………… 541
Registro de comando…………………………………………………………. 542
Registro de estado……………………………………………………………. 544
9.2.2 Sección del temporizador-contador del 8155………………………………… 560
9.3 CONTROLADOR DE TECLADO Y PANTALLA 8279…………………………. 580
9.3.1 Funcionamiento del 8279…………………………………………………….. 582
9.3.2 Programación del 8279………………………………………………………. 585

Bibliografía…………………………………………………………………………. 644
Introducción al Computador 1

Introducción al Computador

1.1 GENERALIDADES

La presentación del computador en un curso introductorio de sistemas de mi-


croprocesadores se justifica plenamente por el hecho que el μP es en realidad la uni-
dad de proceso fundamental de un tipo de computador conocido como microcompu-
tador (μC).

El μP es un circuito integrado LSI con dimensiones reducidas pero de gran


complejidad, que posee todas las características de programabilidad presentes en
computadores grandes. Es el mayor y más seductor desafío al cual se han enfrentado
los diseñadores lógicos en los últimos veinte años. El desarrollo acelerado de esta
tecnología ha resultado en la aparición de nuevos componentes, técnicas, y aplicacio-
nes que han permitido la solución de problemas prácticos de ingeniería de cierta
complejidad, mediante el uso de técnicas de computación. Antes la aparición del μP
el uso de computadores estaba destinado para aplicaciones muy especializadas.

El μP puede presentarse como un recurso cuya versatilidad y potencia supera


la de cualquier dispositivo que la técnica digital haya tenido disponibles hasta su apa-
rición en el mercado de la electrónica. La certeza de esta aseveración descansa en tres
factores fundamentales.

• Son de bajo costo, y la posibilidad de ser programados permiten su inclu-


sión en una gran variedad de aplicaciones.

• Su uso en el diseño de sistemas digitales disminuye en forma significativa


el número de componentes necesarios.
Introducción al Computador 2

• El tiempo de ingeniería empleado en el desarrollo de sistemas se acorta en


forma drástica.

Estas tres cualidades han resultado en un cambio sustancial en las técnicas de


diseño lógico, de hecho en la actualidad todos los sistemas cuya complejidad esté por
debajo del nivel de minicomputadores, se diseñan en base a μPs.

1.2 EL COMPUTADOR Y SU HISTORIA

Exponer con detalle el origen computador y el nacimiento y desarrollo de la


informática implica narrar una larga historia que quizás se inicie hace cuatro mil años
con el uso del ábaco por la civilización china y continúe hasta los computadores de
nuestros días. Para simplificar la reseña de la evolución de las máquinas de computa-
ción, es útil considerar dos aspectos técnicos fundamentales: el uso de sistemas me-
cánicos para realizar cálculos matemáticos y la aplicación de la electrónica para el
diseño de computadores.

Aunque en esta sección se inicia con la descripción de algunas de las primeras


calculadoras mecánicas antecesoras del computador de nuestros días, para los propó-
sitos de este trabajo interesa más bien destacar ciertos acontecimientos históricos del
siglo XX que son fundamentales para proporcionar una visión general de la evolución
de la estructura y funcionamiento de los computadores digitales desde su aparición
hace más de 50 años.

1.2.1 Los precursores del computador moderno

La idea del autómata inteligente es antigua, si se considera que el eminente


matemático francés Blaise Pascal (1623-1662) diseño en el siglo XVII (1642) una
máquina Calculadora Mecánica basada en rodamientos dentados y engranajes que
permitía ejecutar operaciones de suma y resta. La figura 1.1 es una ilustración de la
contribución del eminente científico francés al progreso del conocimiento.

Fig. 1.1 Los diez dientes de cada rueda de la máquina de Pascal representaban los dígitos del 0 al 9.
Las operaciones se realizaban rotando las ruedas el número de dígitos necesarios.
Introducción al Computador 3

La reflexión con la cual Pascal acompaño la presentación de su calculadora


ha perdurado a través del tiempo, revelando que además de ser un gran científico te-
nía alma de visionario,

Este anuncio pretende poner en tu conocimiento, amable lector, que yo


presento a la opinión pública una pequeña máquina..., que te proporcio-
na alivio del trabajo que tantas veces fatigo tu espíritu, cuando has hecho
cálculos con tu pluma.

Inspirado en el diseño de Pascal, el famoso matemático germano Gottfried


Wilhelm Leibniz (1646-1716) desarrolló en 1670 una versión de la calculadora más
eficiente y precisa, capaz de realizar las cuatro operaciones aritméticas: suma, subs-
tracción, multiplicación y división. A pesar que los diseños de Pascal y Leibniz no
tuvieron mayor éxito comercial, en las postrimerías del siglo XIX fueron de uso
común versiones perfeccionadas de éstas máquinas, tanto en el campo científico co-
mo financiero.

El primer equipo de computación automática fue inventado por el francés Jo-


seph Marie Jacquard (1752-1834), quien introdujo el concepto de programa almace-
nado para el control del cálculo, al diseñar un telar automático. El telar de Jacguard
fue presentado en París en el año 1801 y utilizaba placas delgadas perforadas para
seleccionar cada hilo de la tela de acuerdo con el patrón de tejido deseado, simplifi-
cando la realización de diseños con tramas complejas. Está máquina tuvo un impacto
significativo en la industria textil francesa debido a que miles de fábricas usaron el
telar de Jacquard para automatizar el proceso de tejido.

Aunque puede considerarse a la máquina calculadora de Pascal como el pre-


cursor del computador moderno, numerosos registros históricos asignan tal mérito a
la máquina diferencial inventada por los matemáticos ingleses Charles Babbage
(1792-1871) y Augusta Ada Byron (1815-1852). En la figura 1.2 se muestra una sec-
ción de la estructura de ésta calculadora mecánica programable.

Fig. 1.2 Máquina diferencial de Babbage.


Introducción al Computador 4

En el año 1820 Babbage inició este proyecto pero no pudo culminar la cons-
trucción de su diseño por falta de financiamiento. No obstante, en el año 1991 unos
científicos británicos ensamblaron la máquina basándose en las especificaciones de-
jadas Babbage, comprobando su funcionamiento al realizar en forma correcta cálcu-
los sencillos con una precisión de 31 dígitos.

En realidad los diseños de Babbage eran demasiado avanzados para el nivel


de desarrollo de la tecnología del siglo XIX. De hecho en 1830 proyectó la máquina
analítica, jamás construida, dirigida a realizar cálculos complejos, la cual presentaba
notables similitudes con la organización de un computador moderno: un grupo de
tarjetas perforadas introducían datos al dispositivo, una unidad de memoria para al-
macenamiento, una unidad operativa para realizar los cálculos matemáticos y una
impresora para la salida de los resultados.

En el año 1880, el norteamericano Herman Hollerith empleado de la Oficina


del Censo de los Estados Unidos diseño un sistema basado en tarjetas perforadas para
procesar los datos correspondientes al censo de habitantes del año 1890. La informa-
ción almacenada en las tarjetas era interpretada haciéndolas pasar a través de sensores
eléctricos. En el año 1896, Hollerith fundó una empresa que treinta años más tarde se
convertiría en el famoso consorcio International Business Machines Corporation
(IBM).

1.2.2 El computador digital

Los fundamentos de los sistemas digitales modernos y la base de la sintaxis de


los programas de computación actuales fueron propuestos por el matemático británico
George Boole en El análisis Matemático de la Lógica (1847), y en su tratado clásico
Una Investigación de las Leyes del Pensamiento, publicado en el año 1954. La teoría
de la lógica simbólica o Álgebra de Boole fue el primer intento de fusionar la lógica
con la matemática y estaba basado en los conceptos de la lógica de Aristóteles de
verdadero (1) y falso (0).

Pasados ochenta años, en 1938, Claude Elwood Shannon, publicó su trabajo


Un Análisis Simbólico de Relés y Circuitos de Interrupción, donde entrega los resul-
tados de su investigación sobre una teoría de conmutación basada en las proposicio-
nes de Boole. Las primeras aplicaciones prácticas del álgebra de Boole fueron en re-
des de conmutación telefónicas construidas con relés, y posteriormente en el diseño
de sistemas digitales usando válvulas de vacío como componentes básico.

La Primera Generación: Las Válvulas de Vacío

La primera generación de computadores nace en el año de 1946 cuando se


puso en operación la famosa computadora gigante norteamericana ENIAC (Electronic
Numerical Integrator and Calculator), proyecto financiado por el gobierno de los
Introducción al Computador 5

Estados Unidos, y desarrollada en la Escuela de Ingeniería Moore de la Universidad


de Pennsylvania bajo la supervisión de John Presper Eckert y John.Mauchly.

Esta máquina es aceptada como el


primer computador programable, y
se alojaba en un gabinete de 30
metros de longitud, 3 metros de
altura y 1 metro de profundidad,
estando constituida por 18000 tu-
bos de vacío.

Este computador digital de 2 mi-


llones de dólares, pesaba 30000
kilogramos y consumía 150 KW,
requiriendo toneladas de equipos
de aire acondicionado para evitar
el sobrecalentamiento.
Fig.1.3 La computadora gigante ENIAC ocupaba un área significativa
de un edificio.
El ENIAC se diseño en base a una
arquitectura conocida como tipo
Harvard, cuya característica fun-
damental es que usa unidades de
memoria separadas para los datos
y las instrucciones.

La arquitectura Harvard fue intro-


ducida en la década de los 30's por
un científico de la Universidad de
Harvard llamado Howard Aiken.

Las figuras 1.3 y 1.4 muestran en


forma dramática las diferencias
existentes entre el ENIAC y un
Fig.1.4 El microcontrolador C167R aloja en un área de 100 mm2
µcomputador monopastilla mo- todos los elementos de un computador, además de múltiples
derno. controladores de periféricos.

En la figura 1.5 se presenta un diagrama de la arquitectura del ENIAC donde


se observa el uso de buses distintos para la transferencia de datos e instrucciones, un
conjunto de veinte acumuladores para almacenar los operandos y dos unidades arit-
méticas para ejecutar divisiones, productos y extracción de raíces cuadradas. La ope-
ración y sincronización global del sistema la realizaba la unidad de control.

La unidad de almacenamiento estaba constituida por tambores magnéticos pu-


diendo almacenar 20 números decimales de 10 dígitos. El programa en lenguaje de
Introducción al Computador 6

máquina era realizado mediante cableado externo y los datos se introducían por me-
dio de tarjetas perforadas como se muestra en la figura 1.5. Este computador ejecuta-
ba una operación de suma en un tiempo de 200 μs y una multiplicación en la eterni-
dad de 2.8 ms.

Lectora de Impresora de
tarjetas tarjetas

Bus de Escritura

Bus de Lectura

Unidad de Control

Multiplicador
Acumulador

1 2 3 ... 20

Divisor y

Bus de Instrucciones

Unidad de
Programación

Fig. 1.5 Estructura del computador ENIAC

Como sistema de computo el ENIAC solo es de interés histórico, su valor se


debe al hecho que marcó el inicio del desarrollo de una industria de importancia vital
para el progreso del conocimiento científico de este siglo. El pobre rendimiento de
un computador basado en miles de válvulas de vacío y la complejidad para la realiza-
ción y carga del programa en código de máquina limitaron significativamente el es-
pectro de aplicaciones factibles de resolver con este computador. La primera aplica-
ción para la cual se utilizó el ENIAC fue la construcción de tablas exactas para el cál-
culo de trayectoria de proyectiles de nuevas armas.
Introducción al Computador 7

Pese a que en el mes de diciembre de 1943 se puso en marcha el computador


Colossus, y el año siguiente el Harvard Mark I, la mayoría de los datos históricos
señalan al ENIAC como el primer computador electrónico para aplicaciones de pro-
pósito general.

Fig. 1.6 ElColossus fue la primera computadora totalmente electrónica.

El diseño del Colossus se inició en 1939, estando compuesto por 1500 válvu-
las de vacío. Fue construido en la ciudad de Londres por un equipo de científicos
británicos dirigido por Alan Mathison Turing (1912-1954), matemático británico
conocido por su proposición de la máquina de Turing. El Colossus fue usado durante
la segunda guerra mundial para descifrar las transmisiones de radio del ejército nazi.

El Mark I era un computador electromecánico que contenía 200000 compo-


nentes y 800 kilómetros de cable, requiriendo diez segundos para realizar una divi-
sión entera. Pese a su lentitud extrema, la ENIAC era mil veces más rápida. En la ar-
quitectura del Mark I se distinguen las unidades que constituyen los computadores
modernos, tales como la memoria, la unidad aritmética, la unidad de control, y los
puertos de entrada y salida.

Fig. 1.7 El computador MARK I.


Introducción al Computador 8

El computador ABC (Atanasoff-Berry Computer) fue otra máquina, anterior al


ENIAC, construida en 1939 en la universidad del estado de Iowa por John Atanasoff
(1903-1995) y su asistente Clifford Berry. Como un hecho curioso, Atanasoff alega-
ba ser el autor de ciertos principios y técnicas que se utilizaron en el desarrollo del
ENIAC sin contar con su autorización. En el año 1973, y con base en este argumento,
la empresa propietaria de las especificaciones para la fabricación del ENIAC fue des-
pojada del derecho exclusivo para fabricar o vender el computador.

El desarrollo de los computadores sucesores del ENIAC, también basados en


válvulas de vacío, fue impulsado fundamentalmente por la necesidad de resolver pro-
blemas de ingeniería de la industria de armamentos de los Estados Unidos, tales como
el diseño de aviones de combate y misiles. La razón para el uso restringido de estos
computadores gigantes es obvia, a mediados de los años 40, en plena postguerra, las
fuerzas armadas eran el único sector de la sociedad norteamericana capaz de financiar
los altos costos inherentes a la fabricación de una máquina de gran volumen y que
requería una cantidad considerable de energía eléctrica para su funcionamiento. De
hecho el ENIAC nace impulsado por las necesidades militares del Laboratorio de
Investigación de Balística (BRL) de las fuerzas armadas norteamericanas.

La intención de construir un computador de propósito general capaz de reali-


zar tareas tanto en el medio académico e industrial como en el comercial, sin varia-
ciones sustanciales en la estructura física del sistema, fue obstaculizada en forma se-
vera por problemas de complejidad variable derivados del uso de la arquitectura Har-
vard. Un uso eficiente de la memoria del sistema era deseable dado el alto costo de
esta unidad de la máquina. No obstante, establecer en la fase de diseño la capacidad
de las memorias separadas era una tarea que se distinguía por su ambigüedad, debido
a la variedad de tareas que potencialmente debía resolver el computador.

En una aplicación de corte administrativo o financiero es seguro que se re-


quiere el almacenamiento de una cantidad considerable de datos, cuyo procesamiento
necesita la ejecución de programas con algoritmos convencionales desarrollados
usando un número reducido de instrucciones; mientras que para realizar cálculos
científicos de cierta envergadura usualmente se alimenta al sistema con unos pocos
datos iniciales y se ejecutan programas basados en algoritmos complejos que exigen
una gran cantidad de código ejecutable. Si se usa arquitectura Harvard, es claro que,
dependiendo de la aplicación, una de las memorias del sistema será subutilizada.

El paso decisivo para el diseño y construcción del primer computador moder-


no fue dado por uno de los asesores del proyecto ENIAC, el científico húngaro John
Von Neumann (1903-1957) quien introdujo el concepto de máquina de programa al-
macenado que sentó las bases del computador. En una artículo científico publicado
en el año 1946 Von Neumann junto con Burks y Goldstine, presentan el primer com-
putador que funcionaba con el programa almacenado en memoria el EDVAC (Elec-
tronic Discrete Variable Computer), el cual estaba basado en una arquitectura nove-
Introducción al Computador 9

dosa que usaba una memoria común para el almacenamiento de los datos y las ins-
trucciones.

Fig. 1.8 El computador EDVAC.

El razonamiento de Von Neumann fue que si toda información se carga en el


sistema como números y en un formato que permita que el procesador sea capaz de
distinguir cuando un arreglo determinado de bits corresponde a un dato o a una ins-
trucción, bastará con espacio común de memoria para almacenar los datos de E/S y
las instrucciones del programa. El mérito de Von Neumann estuvo en la idea de la
construcción de una máquina de propósito general, cuya secuencia de operación po-
día ser programada de acuerdo con las necesidades de una aplicación específica. El
programa que debía ejecutarse, los datos, y resultados se almacenan en una memoria,
concepto novedoso que sustituía el cableado de componentes, y que permitía cambiar
el comportamiento del equipo con la simple modificación del programa en memoria.

El formato de instrucciones propuesto por Von Neumann, dividía la instruc-


ción en dos campos: el campo de código de operación para identificar la instrucción
a ejecutar, y el campo de dirección para especificar la localización en memoria del
operando u operandos a usar por la instrucción. La figura 1.9 muestra el formato
descrito.
Código de Dirección Dirección Dirección Dirección
Operación Operando Operando Resultado Instrucción
siguiente
1 2
Campo de
Código de Campo de Dirección
Operación

Fig. 1.9 Formato de la instrucción de cuatro direcciones


Introducción al Computador 10

Debido a que el computador es una máquina de naturaleza secuencial que


acepta información de entrada, realiza algún tipo de operación sobre estos datos, en-
trega un resultado, y luego se dirige a ejecutar la próxima instrucción. En un principio
se pensó que la instrucción básica (una operación aritmética, por ejemplo) debía con-
tener la siguiente información:

1. El código de operación para señalar el tipo de operación: suma, res-


ta, producto, detección de paridad, complemento etc.

2. La dirección de los operandos que participan en el cálculo.

3. La dirección de memoria donde debe almacenarse el resultado.

4. La dirección donde está la instrucción próxima.

Una máquina de cómputo cuya instrucción tenga el formato de la figura 1.9 se


conoce como computador de 4 direcciones. A pesar que no existían obstáculos insal-
vables para la construcción de un computador de este tipo, algunas consideraciones
indican que el uso de tal formato resulta en sistemas de estructura compleja y dimen-
siones exageradas. La principal desventaja está relacionada con el número de bits de
cada instrucción, si se asignan 8 bits para identificar al código de operación, con una
memoria de 65536 posiciones que necesita 16 bits para especificar cada dirección de
memoria, resulta un total de 72 bits por instrucción. El autor supone que los diseña-
dores de la época no consideraron la posibilidad de almacenar cada instrucción en
una celda de memoria ni transferirlas en paralelo al interior del procesador, lo que
exigiría el uso de memorias con palabras de 72 bits e igual número de líneas para el
bus de instrucciones, pero si suponemos que se hizo de esta manera no debe extraña
que como resultado se obtuviesen máquinas de dimensiones colosales y funciona-
miento ineficiente.

Para la reducción de la longitud de la instrucción existen dos opciones: usar


cinco posiciones de la memoria para almacenar cada instrucción o eliminar algunos o
todos los campos de dirección. En el primer caso es obvio que persiste un problema
de práctico debido a que el registro de instrucciones del procesador debía ser capaz
de almacenar 72 bits. En la actualidad estas dificultades han sido superadas, los com-
putadores actuales no usan instrucciones de 4 direcciones y los microcomputadores
utilizan instrucciones de una dirección o sin dirección. En la sección próxima se ex-
pone como fue posible construir máquina de una dirección o sin ésta.

Después de proponer una arquitectura que se convirtió en un estándar para el


diseño de los computadores construidos en los siguientes 55 años, John Von Neu-
mann participó a partir de 1946 en el proyecto de desarrollo del computador IAS
construido en 1952 en el Instituto para Estudios Avanzados en Princenton. Un dia-
grama funcional del IAS se muestra en la figura 1.10 donde se aprecia el uso de una
memoria común para las instrucciones y los datos.
Introducción al Computador 11

Instrucciones y datos

Direcciones

Fig. 1.10 Diagrama de bloques del computador IAS.

A diferencia del ENIAC, el computador IAS era una máquina binaria y no de-
cimal, con la unidad de memoria constituida por 1000 posiciones de 40 bits donde se
podían almacenar tanto datos como las 21 instrucciones disponibles para la máquina.
El IAS fue el modelo a seguir para el diseño se los siguientes computadores de propó-
sito general. Excepto algunos casos, todos los computadores modernos mantienen la
estructura de la máquina de Von Neumann. Los continuos avances logrados en la ar-
quitectura y el incremento de la capacidad de memoria permitió la construcción de
dispositivos cada vez más rápidos y eficientes, mientras que se desarrollaron los pri-
meros lenguajes simbólicos que simplificaron en forma notable el proceso de desarro-
llos de programas.
En 1950 el computador abandonó los centros académicos y de investigación
con la liberación de la primera máquina comercial, el UNIVAC I. (Universal Automa-
tic Computer) fabricada por una empresa fundada en el año 1947 por John Eckert y
John.Mauchly: Eckert-Mauchly Computer Corporation, la cual posteriormente se
fundió con la Sperry Rand Corporation. Esta última empresa compartía con IBM el
dominio de la industria de fabricación de computadores. La figura 1.11 es una foto-
grafía del UNIVAC I en operación. A finales del los 50 salió al mercado el modelo
UNIVAC II, el cual era una máquina más avanzada que su antecesor La Eckert-
Mauchly Computer Corporation, ahora la división UNIVAC de la Sperry, también
inició el desarrollo de la serie de computadores con código 1100. El primer modelo
de esta serie fue el UNIVAC 1103 destinado para aplicaciones científicas de gran
complejidad que involucraban el procesamiento de grandes cantidades de datos a alta
velocidad.
Introducción al Computador 12

Fig. 1.11 El UNIVAC I. Primer computador capaz de procesar texto además de datos numéricos.

Fig. 1.12 El UNIVAC II.

Por su parte, el consorcio IBM puso en venta los modelos 604 y 701, en los
años 52 y 53 respectivamente. El precio de adquisición del modelo 701 alcanzaba el
millón de dólares. A mediados de la década del 50, IBM liberó el modelo 650, el cual
tuvo amplia aceptación en los medios científicos y académicos de todo el mundo.

Los computadores de esta generación se programaban usando lenguaje de máqui-


na, lo que requería personal técnico altamente especializado. No existía sistema ope-
rativo y la velocidad máxima de procesamiento que alcanzaron estas máquinas fue de
40 mil operaciones por segundo. Eran equipos de grandes dimensiones, poca capaci-
dad de memoria, de difícil mantenimiento y con un alto consumo de energía.
Introducción al Computador 13

La segunda generación: Los Transistores

El desarrollo del transistor entre los años 1948 y 1952, realizado por los cien-
tíficos William Shockley (1910-1989), John Baardeen (1908-1991), y Walter Brattain
(1902-1987), de los laboratorios Bell de los Estados Unidos, conmocionó a la indus-
tria de la electrónica al ofrecer un dispositivo amplificador y conmutador de estado
sólido con menores dimensiones, precio más bajo, y más eficiente que los tubos de
vacío de uso común. Los radios portátiles y audífonos están entre los primeros en
cuya fabricación se usaron transistores.

A partir del año 1956, la sustitución de las válvulas de vacío por transistores
en la fabricación de sistemas procesadores puso a disposición de los usuarios máqui-
nas de menor precio, mayor confiabilidad y menor consumo de energía, las cuales
constituyen lo que se conoce como la segunda generación de computadores. La tabla
1.1 señala que un computador típico de la segunda generación, fabricado con tecno-
logía de transistores discretos, funcionaba a una velocidad de 200 mil operaciones por
segundo, mientras que una máquina de la tercera generación construida con una com-
binación de la tecnología SSI y MSI, era 5 veces más rápida.

Tabla 1.1 Características típicas de los computadores agrupados por generación.


GENERACIÓN PERIODO TECNOLOGÍA VELOCIDAD
operacio-
nes/seg
I 1946-1955 Válvulas de vacío 40000
II 1956-1964 Transistores discretos 200000
III 1965-1970 Circuitos integrados- 1000000
Tecnologías SSI, MSI.
IV 1971-1977 El µprocesador. 10000000
Tecnología LSI.
V 1978 → Diseño VLSI. 100000000

En la cuarta generación el uso circuitos integrados con integración LSI (Inte-


gración a Escala Grande: 50 hasta 50000 funciones transistorizadas en un CI), per-
mitió diseñar máquinas que superaban en un factor de 250 la velocidad de los compu-
tadores de la primera generación y en 50 veces la de sus antecesores inmediatos.

A pesar de su indiscutible reinado en la industria de computación, no fue la


IBM quien introdujo el primer sistema de computación de estado sólido, las empresas
NCR (National Cash Registers) y Radio Corporation of America (RCA), en este or-
den, ofrecieron a partir de 1956 sistemas de computación de capacidad baja construi-
dos con transistores.

En 1960 se incorpora al mercado de equipos con semiconductores la empresa


Digital Equipment Corporation (DEC) con el modelo PDP-1, el cual se considera
Introducción al Computador 14

como el primer minicomputador en el mercado de máquinas de computación. Está


máquina usó el primer terminal de video y tenía capacidad gráfica.

La respuesta del consorcio IBM no llegó hasta el año 1959 con el computador
IBM 7090, primer modelo de la famosa serie 7000, cuyo último miembro, el 7096 II
se construyó en 1964. Cada nuevo integrante de la serie 7000 tenía mayor capacidad
y menor precio que su antecesor. El modelo IBM 7090 tenía 32 Kbytes de memoria y
un tiempo de instrucción igual a 2.18 µs, mientras que el IBM 7094 II, con un acceso
a igual espacio de memoria, tardaba 1.5 µs en ejecutar una instrucción típica. El IBM
7093, introducido en el año 1961, usaba la técnica de segmentación para mejorar su
rendimiento

Fig. 1.13 El IBM 7093 fue el primer computador en usar segmentación.

Las máquinas de esta generación podían ejecutar los programas con mayor
eficiencia que sus antecesoras. Por ejemplo, el computador ATLAS desarrollado en
1962 en la universidad de Manchester usaba memoria virtual, segmentación e inte-
rrupciones.

En el año 1964, el ingeniero electrónico norteamericano Seymour Cray,


mientras trabajaba en Control Data Corporation (CDC) diseño los computadores
CDC 6600 y CDC 7600. Considerado el primer supercomputador comercial, el CDC
6600 usaba unidades segmentación y era una máquina de carga/almacenamiento que
Introducción al Computador 15

explotó el uso del paralelismo a nivel de unidades funcionales de la CPU. Su desem-


peño era superior al IBM 7094.

Fig. 1.14 Computadores CDC 6700 y CDC 6700.

El mayor rendimiento y confiabilidad las máquinas de esta generación de-


terminó una ampliación del espectro de aplicaciones de los computadores, aparecien-
do los primeros lenguajes de alto nivel para tareas específicas tales como: el FOR-
TRAN (Formula Translator), destinado para problemas de ingeniería y desarrollado
entre 1954 y 1957, para el IBM704, por un equipo de programadores dirigidos por
John Backus; y el COBOL ( Common Business-Oriented Language) para procesa-
miento de datos en el área financiera. En esta época también se inició el uso de cintas
y discos magnéticos

La complejidad y diversidad de las tareas a resolver por los computadores,


exigió un mejor aprovechamiento y administración del uso de la memoria y de los
tiempos de ejecución, surgiendo los sistemas operativos los cuales añadían cierto
grado de automatización al proceso de ejecución de los programas, controlando la
carga del programa fuente y los datos iniciales, la compilación, el uso de la librería
de subrutinas, y la ubicación en memoria del programa principal y los subprogramas
necesarios.

Con el refinamiento de los sistemas operativos se logró un verdadero aprove-


chamiento de los recursos ofrecidos por la máquina, se introdujo el modo de proce-
samiento por lotes, encargándose el sistema operativo de asignar los recursos a cada
tarea.

Este nuevo tipo de ejecución denominado multitarea permitía, por ejemplo,


que mientras el computador imprimía los resultados de la ejecución de la tarea X,
realizara los cálculos de la tarea Y, a la vez que almacenaba en la memoria los datos
de entrada de la tarea Z.
Introducción al Computador 16

La tercera generación: Los circuitos integrados

El ensamblaje de las tarjetas de circuitos digitales, módulos básicos que for-


maban las máquinas que usaban lógica de transistores, era en general una tarea com-
pleja y de costo elevado. El mantenimiento del producto final era un proceso tedioso
y difícil, al estar las distintas unidades de los computadores compuestas de miles de
transistores, resistencias, y capacitores.

Con la fabricación del primer CI en el año 1959, nace la novedosa tecnología


de la microelectrónica. El uso del CI en la industria de computadores a partir de 1965
señala el inicio de la aparición en el mercado de la tercera generación de computado-
res. Este dispositivo permitió la reducción del costo y de las dimensiones de las gran-
des maquinas merced a la utilización de componentes semiconductores integrados de
más velocidad, mayor fiabilidad, y menor consumo de potencia. El sistema 360 de
IBM es el exponente más destacado de esta generación.

El 360 fue introducido por IBM en 1965 como un modelo que incorporaba la
tecnología de circuitos integrados y que ofrecía una arquitectura más avanzada que
los integrantes de la serie 7000. Está máquina puede considerarse como la mayor
conquista de IBM al apuntalar a la empresa como líder definitivo de la comercializa-
ción de computadores con dominio de más del setenta por ciento del mercado. Este
computador fue de uso difundido en las principales universidades y centros de inves-
tigación durante la década del 60.

Fig. 1.15 El IBM 360. Primer computador con microprograma.

El diseño de esta máquina fue un proceso tan cuidadoso y planificado que la


arquitectura del sistema 360 aún la conservan los sistemas de cómputo de gran escala
Introducción al Computador 17

fabricados actualmente por IBM. En 1965 IBM liberó cinco modelos de la familia
del sistema/360, identificados como los modelos: 30, 40, 50, 65, y 75. Tal estrategia
permitió no solo adaptar la máquina a las necesidades del usuario, sino que ofreció la
posibilidad que al incrementarse los requerimientos de procesamiento del comprador,
éste pudiese, con una inversión razonable, adquirir un modelo más avanzado del sis-
tema.

El 360 fue diseñado de modo que un programa determinado pudiese ser ejecu-
tado por cualquiera de los modelos, no obstante existían diferencias sustanciales en
los recursos que ofrecía cada miembro de la familia, básicamente en la capacidad de
memoria, velocidad de procesamiento, número de buses y de puertos de E/S. El mo-
desto modelo 30 sólo podía obtener un byte en cada operación de acceso a una posi-
ción del espacio máximo de memoria de 64 Kbytes, mientras que el flamante modelo
75, con un área de memoria de 512 Kbyte, era capaz de transferir ocho bytes en forma
simultanea. De hecho el modelo 75 era cincuenta veces más rápido que el 30. En la
tabla 1.2 se detallan las características principales de los diferentes modelos de la
familia IBM/360.

Tabla 1.2. Características de los modelos del sistema IBM/360.


MODELO
CARATERÍSTICAS 30 40 50 65 75
Memoria Máxima (Kbytes) 64 256 256 512 512
Velocidad de acceso a memoria (Mbytes/s, 0.5 0.8 2.0 8.0 16.0
máx)
Tiempo de ciclo del procesador (µs) 1.0 0.625 0.5 0.25 0.2
Velocidad relativa 1 3.5 10 21 50
Número de buses de datos 3 3 4 6 6
Velocidad del bus de datos. (Kbytes/s, máx) 250 400 800 1250 1250

Además del concepto de microprograma, con el IBM 360 surgieron otras in-
novaciones en el campo de diseño de computadores. Por ejemplo el uso de circuitos
controladores de interrupciones y de acceso directo a memoria. En el año 1968 se
diseño el primer computador comercial donde se puso en práctica el concepto de
memoria cache, éste fue el modelo 360/85 de IBM.

A la par de aumentar la velocidad de ejecución y la confiabilidad de los com-


putadores de gran escala de la época, la incipiente tecnología de la microelectrónica
impulsó el diseño de un nuevo tipo de sistema procesador con menor tamaño, reque-
rimientos de energía reducido, y de fácil mantenimiento, en virtud de disponer de
una arquitectura menos compleja que la de las máquinas grandes pero que ofrecía una
gran capacidad de ejecución, tales máquinas se conocen como minicomputadores. El
prototipo de este tipo de computadores fue el PDP-8 fabricado por la empresa DEC
y cuyas dimensiones y cantidad de calor generado no exigían su ubicación en grandes
locales refrigerados.
Introducción al Computador 18

Los primeros minis estuvieron dedicados al cálculo de la acción de control en


sistemas de control de procesos y de máquinas en la industria, aplicaciones donde era
usual que el potencial de computo y los recursos ofrecidos por los minis superaran las
exigencias de velocidad de procesamiento y capacidad de almacenamiento necesarias
para la automatización del proceso industrial, lo cual representaba en cierta medida
un desperdicio de recursos tecnológicos.

Fig. 1.16 El PDP-8 podía colocarse sobre un escritorio.

La patente subutilización de estas máquinas en ciertas tareas de automatiza-


ción no determinó que dejaran de ser usados como controladores programables en la
industria, sino que más bien permitió que estas máquinas se manifestaran como lo
que realmente eran: un computador de propósito general a pequeña escala.

Para inicios de los años 70 se distinguen dos clases principales de aplicacio-


nes en las cuales se usaron los minicomputadores: en primer lugar la concepción del
mini, con su relativo bajo costo, como una máquina pequeña dirigida a aplicaciones
generales permitió que fuese utilizado por grupos pequeños de investigadores en
universidades y centros de investigación para la solución de problemas concretos de
ciencia e ingeniería. El PDP-8, por ejemplo, ocupaba un área reducida y su costo de
16 mil dólares era una fracción del precio de adquisición de los cientos de miles de
dólares correspondientes a un modelo del sistema 360. En segundo término, era co-
mún encontrar minicomputadores fabricados con propósito específico, actuando co-
mo el elemento clave en tareas de adquisición de datos, supervisión y control de sis-
temas industriales complejos. Con relación a la programación, IBM introdujo el pri-
mer sistema operativo OS/360 con multiprogramación. En el año 1970, Ken Thomp-
son y Dennis Ritchie desarrollaron el sistema operativo UNIX en los laboratorios Bell.
Los computadores de esta generación alcanzaron velocidades de hasta 1 x 106 ins-
trucciones por segundo.
Introducción al Computador 19

La cuarta Generación: el microprocesador.

A diferencia de las generaciones anteriores, la fecha de transición hacia la


cuarta generación no la distingue la introducción de un nuevo modelo de computador,
o el uso de una tecnología novedosa en la fabricación de éstos. Para muchos especia-
listas la transición hacia la cuarta generación de sistemas de computación ocurre en
los inicios de la década de los años 70 cuando aparece la tecnología LSI, como resul-
tado del sostenido incremento de la densidad de integración de circuitos digitales. La
aplicación de esta técnica de integración condujo a la fabricación de dispositivos
que contenían en un encapsulado desde miles a decenas de miles de interruptores
digitales.
La primera aplicación de la tecnología LSI fue el desarrollo de chips de me-
moria para sustituir a las voluminosas y lentas unidades de almacenamiento basadas
en núcleos magnéticos, tradicionalmente usadas en computadores. A partir de la apa-
rición del primer circuito integrado en 1959, un impresionante desarrollo en la tecno-
logía de la microelectrónica condujo en la década del 60, a duplicar cada año el nú-
mero de interruptores contenido en un CI. Este vertiginoso compás disminuyó en la
siguiente década, a la aún significativa cadencia de cuadriplicarlos cada tres años.

Gordon Moore, uno de los fundadores del consorcio INTEL, había predicho
este comportamiento para la fabricación de chips de memoria, vaticinio hoy conocido
como la famosa Ley de Moore. La figura 1.17 muestra una gráfica del crecimiento de
la capacidad en Kbits de los chips de memorias DRAM en función de la fecha de
introducción de los dispositivos LSI durante un tiempo de 20 años. Se observa que es
patente la validez del pronóstico de Moore, considerando que sólo el circuito integra-
do de 1 Mbits se negó a seguir la conducta de sus antecesores, al debutar un año antes
de lo previsto.

105

16M
4
10
4M
Capacidad en Kbits

1M
103
256K

102 64K

Ley de Moore
16K
DRAM
10
1976 1978 1980 1982 1984 1986 1988 1990 1992

Año de inicio de ventas

Fig. 1.17 Incremento de la capacidad de dispositivos de memoria dinámica con el tiempo


Introducción al Computador 20

En el curso de los siguientes veinte años, la industria del silicio se ha mante-


nido a este nivel. El perfeccionamiento en las técnicas de integración permitió la
construcción de sistemas procesadores más pequeños, con menor duración del ciclo
de instrucción, y costo más bajo. Aun cuando la introducción del CI marcó el inicio
de una era fructífera para la industria de fabricación de sistemas de computación al
permitir la disminución de los altos precios de adquisición de las grandes máquinas
de computo, y al penetrar con los minicomputadores en el sector industrial que hasta
esa fecha no disfrutaba de las ventajas inherentes al uso de procesadores, fue el año
de 1971 la fecha de ocurrencia de un suceso que no sólo constituyo una revolución en
la industria de la computación, sino que en pocos años cambió para siempre y en sen-
tido positivo el modo de vida de millones de personas en todo el mundo, se trata de la
invención del microprocesador por ingenieros de una modesta empresa de nombre
INTEL, hasta entonces fabricante de dispositivos de memoria.

Todo comenzó 20 años antes, en los años 50, cuando la necesidad presente de
disponer de equipos e instrumentos sofisticados y de alta precisión para actividades
relacionadas con la navegación en el espacio, impulsó a las empresas fabricantes de
semiconductores a la mejora de los componentes electrónicos de uso común para la
época. La carrera espacial exigía dispositivos de menor tamaño, con bajo consumo
de energía y más eficientes. Las investigaciones realizadas resultaron en el nacimien-
to la tecnología de la microelectrónica y el diseño y producción de circuitos integra-
dos con integración a muy grande escala (VLSI) capaces de contener hoy en día mi-
llones de transistores en un área reducida de silicio. El primer microprocesador Pen-
tium, por ejemplo, aloja cerca de tres millones de transistores en su encapsulado. En
al actualidad un procesador Pentium IV o un Power PC tienen cerca de 200 millones
de transistores.

Aun cuando, en principio, la carrera a la conquista del espacio produjo un no-


table desarrollo de la industria de la microelectrónica; la llegada del hombre a la luna
en 1969 y los resultados poco alentadores en lo que se refiere al aprovechamiento
científico y económico de los viajes espaciales, junto con los elevados costos que su-
ponía mantener un programa continuo de envío de astronautas a la exploración del
espacio; derivó en el curso de 1970 en una marcada disminución de los contratos de
investigación establecidos entre la NASA y las empresas fabricantes de CIs..

En búsqueda de colocar sus productos en un mercado de más amplio espectro,


las compañías de componentes electrónicos dirigieron su atención hacía el desarrollo
de máquinas de calcular electrónicas de bolsillo, abriendo de esta manera un mercado
potencial que significaba la introducción de cientos de miles de sus productos, como
una compensación a la pérdida del reducido, pero lucrativo, mercado de aplicaciones
militares y espaciales.

El desarrollo y producción del μP 4004 por la corporación INTEL fue el re-


sultado de contratos establecidos entre la empresa norteamericana con la compañía
japonesa Busicom, dedicada a desarrollos de sistema electrónicos de cálculo. En el
Introducción al Computador 21

año 1971 no existían los μPs y la empresa INTEL se dedicaba a la producción de


circuitos integrados de memoria. Este cliente japonés solicitó el diseño de dispositi-
vos integrados para cinco nuevos modelos de calculadoras de escritorio, tarea que
representaba para INTEL el desarrollo de doce CIs diferentes de propósitos específi-
cos. En lugar de esto, se realizó el diseño de un circuito programable para satisfacer
las necesidades de la empresa Busicom

Fig. 1.18 El primer microprocesador: El 4004 de Intel.

La invención de una CPU mono pastilla no fue el resultado de un proceso de


investigación planificado y desarrollado por INTEL, más bien debe considerarse que
el advenimiento del dispositivo fue un afortunado producto de las circunstancias. De
hecho el equipo de ingeniería de INTEL no tenía idea del potencial encerrado en el
diseño que realizaron. En realidad el μP 4004 era de potencia limitada e inadecuado
para el uso en el tratamiento de grandes cantidades de datos, al sólo tener un conjunto
de 45 instrucciones diferentes y un espacio máximo de memoria de 4 Kbytes. Fue
usado como CPU de sistemas controladores simples y en juegos de video.

A finales del año 1971, INTEL inicia la comercialización del primer µP de 8


bits, el cual fue bautizado con el nombre código 8008. El dispositivo fue presentado en
un encapsulado de 18 terminales en doble línea, donde alojaron los 3500 transistores
utilizados en el diseño. Con acceso hasta 16 Kbytes posiciones de memoria, 93 ins-
trucciones distintas y un ciclo de instrucción de 20 µs, disponía de potencia y veloci-
dad suficiente para ser usado en aplicaciones más avanzadas que el 4004, tales como
equipos periféricos y terminales de computadores.

Fig. 1.19 El microprocesador 8008 de Intel.


Introducción al Computador 22

El 8008 nace como resultado de un convenio con la compañía Display Termi-


nal Corporation para el desarrollo de un CI controlador de tubos de rayos catódicos.
Diseñado el dispositivo, fue rechazado por la empresa contratante aduciendo que si
bien el CI cumplía con la mayoría de las especificaciones, carecía de la velocidad ne-
cesaria para realizar eficientemente la tarea de presentación serial de caracteres. Ante
este aparente fracaso, INTEL liberó el circuito al mercado, obteniendo sorpresivamen-
te volúmenes de venta del chip, tan grandes como imprevistos; había nacido el micro-
procesador como un circuito LSI de uso estándar. A medida que se desarrollaban más
y más aplicaciones del µP 8008 surgieron problemas de ingeniería de complejidad
creciente susceptibles de ser resueltos con sistemas basados en microprocesador, pero
con requisitos técnicos imposibles de satisfacer con el repertorio de instrucciones y la
capacidad de memoria disponibles para el µP 8008.

Con la propiedad de un dispositivo en vías de convertirse en un estándar indus-


trial, la atención del equipo de ingeniería de INTEL se enfocó en el perfeccionamiento
este producto, presentando en el año 1974 el primogénito de la segunda generación de
microprocesadores, el 8080. Fabricado con 6000 transistores y tecnología PMOS, el
8080 era compatible por programa con el 8008. El desempeño del nuevo producto
superaba con creces el del 8008: además de disponer de un número mayor de instruc-
ciones, un espacio de memoria de 64 Kbytes, y ser 10 veces más rápido que su ante-
cesor, podía acoplarse directamente con componentes de la familia lógica TTL. Estos
atributos aceleraron la expansión del microprocesador y sellaron en forma definitiva el
inicio de la supremacía de la empresa como consorcio vanguardia en el desarrollo,
fabricación y comercialización de chips microprocesadores, posición que mantiene
actualmente.

Tabla 1.3. Microprocesadores de 8 bits.


FABRICANTE CÓDIGO

Signetics 2650
Motorola MC6800
Intel 8080
MOS technology 6502
Rockwell PPS-8
Fairchild F-8
National Semiconductor IMP-8

La mayoría de las compañías importantes que producían CIs se apresuraron en


desarrollar e introducir en el mercado un microprocesador propio, algunos de los cua-
les aun hoy se encuentra en venta. Una relación de los primeros µPs modernos de 8
bits, con los nombres códigos y la casa fabricante, se muestra en la tabla 1.3.

Cada nuevo producto presentado por la empresa INTEL exhibía mayor veloci-
dad, espacio de memoria aumentado y un repertorio de instrucciones más potente y
diverso; además de requerir cada vez menos componentes para diseñar y construir un
sistema µC completo a partir del µP.
Introducción al Computador 23

Para el diseño de su siguiente µP INTEL utiliza 20 mil transistores y tecnología


NMOS, introduciendo en año de 1977, el microprocesador 8085 como una versión
sutilmente mejorada del 8080. Con sólo dos nuevas instrucciones, igual capacidad de
almacenamiento y una leve disminución de la duración del ciclo de instrucción (de 2
µs a 1.3 µs), el mayor atractivo del 8085 se corresponde con la simplificación del nú-
mero de componentes necesarios para el desarrollo de un sistema mínimo.

Algunos elementos que aparecían, en sistemas basados en el 8080, como cir-


cuitos integrados externos al microprocesador, tales como el generador de reloj y el
controlador de sistema, se incluyeron en el encapsulado del 8085, incorporándose
además un canal de comunicación serie controlado por programa, además de cinco
niveles de interrupción por hardware. Las características del 8085 y circuitos asocia-
dos permitieron la construcción de un microcomputador con sólo tres circuitos inte-
grados, como indica la figura 1.20. Esto representó un avance significativo, si se con-
sidera que diseñar un sistema mínimo con el µP 8008 requería sesenta componentes,
y treinta con el 8080. A la tercera generación de microprocesadores pertenecen, ade-
más del 8085, el µP MC6802 de Motorola, y el Z80 de Zilog, todos procesadores de 8
bits.
Número de componentes para un sistema mínimo

Año del diseño del microcomputador

Fig. 1.20. Disminución en el tiempo del número de circuitos integrados necesarios para construir un
sistema µC básico.

Los microprocesadores de 8 bits empezaron a usarse en tareas de procesa-


miento de datos cuando los estudiantes de computación Stephen Wozniak y Steven
Jobs recurrieron al microprocesador R6500 para desarrollar, en año 1976, el primer
microcomputador de propósito general, al cual llamaron Apple I. Esta máquina fue el
modelo inicial de una fructífera empresa de fabricación de microcomputadores cono-
cida actualmente como Apple Computer Inc.
Introducción al Computador 24

Las ofertas de máquinas domésticas y de oficina se intensificaron con la apa-


rición de μCs de diferentes marcas y modelos tales como, el MITS Altair 8800
(8080), .Atari 400 (R6502B), PCS–80/30 (8085), TRS-80 (Z80) y el Apple II (6502),
entre otros. Las velocidades de ejecución de estos μCs no superaba los 3 MHz, estan-
do la capacidad de memoria limitada a 64 Kbytes.

Fig. 1.21 El microcomputador APPLE II.

La quinta Generación: Tecnología VLSI.

La identificación de la generación a la cual pertenece un sistema específico se


hizo cada vez más difícil a partir del cuarto escalón de la clasificación. Inicialmente la
pertenencia a una generación la fijaba el tipo de tecnología empleada en el hardware
de la máquina, con independencia del sistema operativo, potencia de los programas de
aplicación, o lenguajes posibles de ejecutar por el computador.

A medida que los computadores evolucionaron hacia máquinas de menores


dimensiones pero con alta potencia de procesamiento, el software devino en un factor
de primera línea para medir el desempeño de un sistema. Tal situación junto con la
aparición, cada vez con mayor frecuencia, de nuevos modelos provenientes de una
gran diversidad de fabricantes, ha atenuado las fronteras entre una generación y otra,
haciendo que tal clasificación sea de poca o ninguna utilidad. En este trabajo se supo-
ne que la actual y quinta generación se inicia con el desarrollo de la tecnología VLSI.

Las limitaciones naturales de los μPs de 8 bits florecieron con el incremento de


la complejidad de los programas de procesamiento de datos, tales como los adminis-
tradores de base de datos y los procesadores de palabras, cuyas funciones cada vez
más sofisticadas exigían una capacidad de memoria superior a 64 Kbytes; además del
hecho que operaciones aritméticas elementales como la multiplicación y división de-
bían ser realizadas por programas de usuario. Tales razones impulsaron el diseño de
Introducción al Computador 25

un microprocesador de mayor potencia de computo y capaz de soportar mayor capaci-


dad de memoria.

INTEL libera en abril de 1978 el 8086, un μP de 16 bits de gran potencia


construido con 29000 transistores y tecnología HMOS. En virtud de un conjunto de
instrucciones muy completo y versátil, y con la posibilidad de manejar hasta 1 Mbyte
de memoria, ofrecía tanta capacidad de procesamiento como la de un minicomputa-
dor de la época. El 8088, compatible con el 8086, fue lanzado en el año 1979, siendo
elegido por IBM como CPU del µC IBM PC original. Este dispositivo es catalogado
como un µP de 16 bits pero para reducir los costos de producción, el bus de datos
es de 8 bits. En realidad esto no era una gran limitación, debido a que los dispositi-
vos LSI de memoria y puertos podían aceptar/ofrecer sólo un byte a la vez.

El 8086 ejecuta una suma 3.25 veces más rápido que su antecesor el 8085,
merced a que contiene en su encapsulado dos µPs para fines específicos: la unidad de
ejecución (UE) y la unidad de conexión al bus (UCB), cada unidad dispone de su ban-
co de registros, su unidad aritmética y de control y operan en forma independiente.
Este modo de funcionamiento mejora en forma notable el proceso de búsqueda en
memoria y ejecución de las instrucciones dado que permite que ambas tareas se reali-
cen en forma simultanea. La UCB tiene como función buscar la instrucción en memo-
ria realizando un procedimiento de ordenación y tratamiento de colas garantizando
que la unidad de ejecución siempre tendrá disponible una instrucción para su ejecu-
ción sin necesidad de esperar que ésta se obtenga desde la memoria.

El 8086 y el 8088 pueden considerase los primeros μPs modernos, los cuales
fueron evolucionando hasta disponer de numerosos procesadores internos que ejecutan
tareas independientes con un comportamiento global que permite la ejecución de ins-
trucciones en forma paralela. Conviene resaltar que en los μPs de 8 bits mientras se
ejecutaba una instrucción no se realizaban operación de búsqueda en memoria.

Cuando en el año 1980 IBM introdujo el Computador Personal (PC) basado en


el procesador 8086 ejecutando a 4.77 MHz, se desató una vertiginosa carrera tecnoló-
gica que no solo derrumbó en forma impensable los precios de los µCs, sino que per-
mitió que en solo 20 años se disponga de maquinas con frecuencias de operación de
hasta 640 veces la del primer i86 y capaces de manejar hasta 64 Gbyte de memoria.

Para esta época el mercado de fabricación de µPs era compartido por INTEL
con varias empresas de semiconductores entre las que destacaban Motorola con la
serie 68000, y Zilog con el Z8000; hasta cuando IBM concedió a INTEL el contrato de
desarrollo de la arquitectura del PC, producto del cual se vendieron un millón de uni-
dades en los dos primeros años. Puede afirmarse con seguridad que la historia de la
computación personal tiene como actor principal a INTEL, no existe en la actualidad
desarrollo posible en la arquitectura o programación de PCs que no esté relacionada de
Introducción al Computador 26

alguna forma con los diseños de INTEL, empresa que representa un estándar en la
industria de la computación.

INTEL Corporation marcó el paso del desarrollo del µP con la introducción de


procesadores de 16 bits cada vez más avanzados como el 80186 y el 80286. El µP
80186 fue un dispositivo diseñado para aplicaciones de control y no se utilizó como
CPU de µCs, mientras que el 80286, introducido en febrero de 1982, fue el sucesor del
8086 y puede considerarse el siguiente escalón en el proceso de desarrollo de los µPs
de 16 bits para propósito general.

Los 134 mil transistores albergados en el interior del encapsulado del 80286
conforman un dispositivo procesador más avanzado que el 8086, destinado a operar en
ambientes multitareas y multiusuarios. Una unidad interna para administración de
memoria lo capacita para gobernar un máximo de 16 Mbytes de memoria física y 1
Gbyte de memoria virtual. La frecuencia máxima de operación de la última versión del
80286 fue de 16 MHz.

Durante la década de los 80 el dominio del gigante del silicio en el diseño de


μPs era indiscutible, como lo indica la introducción de nuevos procesadores a ritmo
acelerado. Cada producto estrenado revelaba un notable incremento del grado de inte-
gración del circuito integrado. En la tabla 1.4 se presentan las características de los
µPs INTEL. El número de transistores indicado corresponde a la primera versión del
modelo de microprocesador.
Tabla 1.4 Características de los microprocesadores de Intel.

Código Fecha de Frecuencia Memoria Transitores


Introducción MHz
4004 abr/1971 0.108 640 2.300
8008 abr/1972 0.108 16 K 3.500
8080 abr/1974 2 64 K 6.000
8086 jun/1978 5-10 1M 29.000
8088 jun/1978 5-8 1M 29.000
80286 feb/1982 8-16 16 M 134.000
80386 oct/1985 16-33 4G 275.000
80486 abr/1989 25-100 4G 1.200.000
Pentium mar/1993 60-233 4G 3.100.000
Pentium Pro mar/1995 150-200 64 G 5.500.000
Pentium II may/1997 233-400 64 G 7.500.000
Pentium III feb/1999 450-933 64 G 9.500.000
Pentium IV nov/2000 1400-x000 64 G 42.000.000

La curva de la figura 1.22 muestra el aumento del número de transistores con


las etapas de desarrollo de los µPs de INTEL, apreciándose la validez de la ley de
Moore.
Introducción al Computador 27

La empresa INTEL continuo su línea de diseño con la liberación de nuevos mi-


croprocesadores de 32 bits como el 80386 y el 80486 con velocidades máximas de 33
MHz y 120 MHz respectivamente y espacio de memoria de 4 Gbyte. El 80486 nació
en 1989 e incluía en el mismo encapsulado una CPU de 32 bits más avanzada que un
80386, un coprocesador matemático, y una memoria cache de 8 Kbytes, recursos que
garantizaban la ejecución 54 millones de instrucciones por segundo (MIPS) para el
modelo de 66 MHz, mejora notable si se considera que el 8086 original solo ejecutaba
2.5 MIPS.

Pentium
Pro

Pentium II
80486 Pentium
Transistores

80286
80386
8086
8088

8008 Ley de Moore


8080 µProcesadores
8004

.Año de inicio de ventas


Fig.1.22 Comparación entre el aumento del grado de integración de los µPs de INTEL y la Ley de
Moore.

En junio de 1989 y durante los siguientes 9 meses, un equipo de ingenieros de


INTEL bajo la coordinación de Vinoh Dham realiza el diseño de un nuevo CPU con
nombre código P-5, el Pentium o 80586. La fase de desarrollo del Pentium continuó
hasta el 22 de marzo de 1993, se fecha de entrega a los fabricantes de microcomputa-
dores de una versión de 66 MHz.

Una falla presentada en la ejecución de una versión del Pentium y difundida


ampliamente por todos los medios, incluyendo Internet, fue la razón por la cual IBM
cesó en el año 1995 la fructífera relación comercial mantenida durante 15 años con
INTEL, apelando a la nueva generación de procesadores Power PC, desarrollados en
conjunto por las empresas Motorola y Apple Computer, y usados en estaciones de tra-
bajo producidas por Hewllet Packard, IBM, y Sun Microsystems. En el año 1995 exis-
tían 1 millón de máquinas fabricadas por Sun Microsystems, y 100 millones de PCs o
compatibles.
Introducción al Computador 28

El Power PC es un microprocesador de arquitectura RISC (Reduced Instruction


Set Computing). Este término identifica a las máquinas diseñadas con una arquitectura
desarrollada a finales de los 70 por John Cocke, científico de IBM que laboraba en el
Centro de Investigaciones de Georgetown.

Con la introducción del Power PC la computación de conjunto reducido de


instrucciones entra en competencia en un mercado de alto volumen como el de compu-
tadores personales dominado por la computación de conjunto complejo de instruccio-
nes (CISC: Complex Instruction Set Computing), las descripción de la arquitectura
RISC y la discusión sobre sus ventajas o limitaciones con respecto a la CISC escapan
al alcance de este trabajo.

Aunque líder, INTEL no ha carecido de competidores en el lucrativo mercado


de microprocesadores. Desde la el indiscutible éxito comercial logrado con las prime-
ras versiones del 8086 y 8088, otras empresas fabricantes de circuitos integrados se
incorporaron al desarrollo y producción de μPs. El consorcio japonés NEC (Nipppon
Electric Company) realizó clones de ambos procesadores denominándolos V20 y V30
pero incrementando notablemente el rendimiento. En la actualidad existen diversos
fabricantes que ofrecen μPs competitivos con los fabricados por Intel, destacándose
Advance Micro Devices (AMD), Cyrix Corporation, Texas Instruments, NEC, NexGen
y SGS Thompson.

La disolución de la alianza INTEL-IBM no fue suficiente para despojar a IN-


TEL de la supremacía tecnológica que ha mantenido durante 30 años en la industria de
fabricación de microprocesadores de escritorio. A pesar de los esfuerzos de los com-
petidores por desplazar al gigante del silicio, los avances en el Pentium continuaron en
forma acelerada con la introducción en marzo y junio de 1995 de las versiones de 120
y 133 MHz.

Hasta 1999 el Pentium III de 550 MHz era el µP más poderoso de Intel, el
cual es 20 % más rápido que el μP Pentium II/450 MHz fabricado en el año 1998. Por
su parte AMD, la empresa competidora, tenía el AMD-K6 como su producto estrella,
lanzando posteriormente el AMD-K7 como opción ante el Pentium III. En los prime-
ros meses del siglo XXI era posible adquirir por la cantidad de medio millón de bolí-
vares un microcomputador con 64 Mbytes de memoria, construido alrededor de un
procesador Pentium III funcionando a la vertiginosa velocidad de 750 MHz. En la
actualidad, una máquina Pentium IV /3.0 GHz con 512 MBytes de DDR y demás peri-
féricos, cuesta aproximadamente 2 millones de bolívares con impresora incluida.

En realidad la falla encontrada en el Pentium solo diversificó la oferta de μPs,


en la actualidad la mayoría de los diseñadores de microcomputadores de escritorio
tienen más de un proveedor de chips permitiendo que los usuarios dispongan de inme-
diato de cualquier adelanto tecnológico producto de la feroz competencia en el mundo
del silicio, la cual en general resulta en una reducción de los precios.
Introducción al Computador 29

Para finalizar esta historia conviene resaltar que son numerosos los adelantos
tecnológicos en materia de computación no mencionados o discutidos en extensión en
este texto. Por ejemplo existen desarrollos importantes en procesamiento paralelo,
donde se ejecuta más de un programa en forma simultanea usando más de un micro-
procesador activo, en contraste al multiprocesamiento típico de los μPs modernos
donde existen unidades que actúan como procesadores independientes que permiten la
ejecución de un programa mientras que se realizan operaciones de transferencia de
entrada/salida en paralelo con el programa.

Problemas como procesamiento de imágenes requieren de una intensidad de


cómputo considerable. Si se considera el tratamiento de una secuencia de imágenes de
resolución media (512 pixels x 512 pixels) a una frecuencia de 30 cuadros/seg, en
colores (3 bites por pixel), se requieren una velocidad de 24 millones de bytes por
segundo. Un algoritmo simple puede requerir miles de operaciones por pixel, de modo
que el uso de computación paralela es inevitable para resolver esta clase de problemas.
Sin embargo entre los especialistas existe una tendencia a usar máquinas secuenciales
de alto poder aduciendo que si bien la arquitectura paralela ha logrado avances signi-
ficativos no ha ocurrido lo mismo con los algoritmos para procesamiento paralelo.

Otro punto digno de mencionar se relaciona con el dominio casi absoluto que
la arquitectura Von Neumann ha mantenido en el diseño de máquina de cómputo. Los
microprocesadores Intel ix86 usan tal arquitectura y de alguna manera comparten
muchas características de los computadores fabricados en las últimas cuatro décadas.

En aplicaciones de procesamiento digital de señales (DSP) se requiere la reali-


zación de cálculos repetidos que incluyen operaciones de suma y multiplicación, las
cuales conviene hacer a alta velocidad. Aunque los procesadores CISC tienen una ins-
trucción de multiplicación, desafortunadamente requiere varios ciclos de reloj para su
ejecución, debido a que se realiza a través de microprogramación. El procesamiento
de señales en tiempo real exige la realización de cierta cantidad de cálculo en un tiem-
po determinado, de acuerdo con la velocidad que son transferidos los datos a procesar.
De modo que los procesadores CISC no son adecuados para este tipo de cálculo, por la
lentitud con la cual realizan operaciones de multiplicación.

En la búsqueda de una arquitectura para procesadores DSP los diseñadores re-


currieron a la abandonada arquitectura Harvard que permitía la transferencia simultán-
ea de instrucciones y datos al disponer de espacios de memoria separado para datos y
programa. En al año 1980 la empresa American Microsystems Inc introdujo el primer
procesador DSP AMI S2811, al poco tiempo hicieron su aparición el Intel 2920 y el
NEC mPD7720, todos con arquitectura Harvard. En el año 1982 Texas Instruments
liberó el TMS 32010.
Una fuente actualizada sobre procesadores modernos es la WEB, los avances
tecnológicos son de tal magnitud, diversidad y velocidad que casi es necesario redefi-
nir el concepto de computador. Por ejemplo, existe una máquina japonesa constituida
Introducción al Computador 30

por 640 computadores interconectados, que ejecutan programas con el propósito de


simular las condiciones reales del clima del planeta tierra. Los fabricantes de este cí-
clope se refieren a éste como, el computador.
Organización del Computador 31

Organización del computador

En forma similar a como la aparición en el año 1980 del primer reloj de cuar-
zo desplazó el mecanismo tradicional de medición de tiempo basado en componentes
mecánicos, el procesamiento de información por medios electrónicos dejó muy atrás
las técnicas mecánicas usadas por el hombre para el manejo de información.

El computador es usado en todos los campos donde se requiere resolver pro-


blemas relacionados con el procesamiento de información. En general, la solución de
tales problemas exige la realización de las funciones mostradas en el diagrama de la
figura 2.1.

Datos

Adquirir Procesar Almacenar Presentar

Resultados

Fig. 2.1 Funciones de un sistema de procesamiento de información

La información debe ser: adquirida y detectada como datos originados del


mundo exterior al sistema en la forma de estados físicos convenientemente modifica-
dos; procesada, codificada, decodificada, evaluada, ordenada, asociada, o com-
binada para generar nuevas representaciones de información; almacenada en un
subsistema de memoria donde puede ser recuperada y usada; y presentada, los resul-
tados del procesamiento de los datos de entradas pueden mostrarse en forma apropia-
Organización del Computador 32

da para ser entendida por humanos o como comandos que permiten la realización de
algún trabajo.

En un sistema de procesamiento de información son vitales los elementos pe-


riféricos encargados de vincular al sistema con su entorno. Los captadores de entrada
o sensores y elementos asociados acondicionan la variable física al lenguaje entendi-
do por el computador, mientras que los periféricos de salida permiten presentar o
transmitir los resultados del procesamiento, todas estas funciones son controladas por
un programa almacenado en memoria.

2.1 ESTRUCTURA FUNCIONAL DEL COMPUTADOR

Un sistema capaz de realizar las funciones básicas de procesamiento de datos


representadas en la secuencia de bloque de la figura 2.1 es el computador, el cual de
hecho se define como un procesador de datos que ejecuta operaciones aritméticas y/o
lógicas sin que requiera comúnmente intervención humana durante la ejecución del
programa.

CCPPU
U SALIDAS

UNIDAD
LÓGICA Y
MEMORIA ARITMÉTICA

UNIDAD
DE
CONTROL
ENTRADAS

RELOJ

Fig. 2.2 Estructura simplificada de un computador.

Un computador es en esencia un sistema digital que resulta de la combinación


de una unidad secuencial sincrónica de control programable, una unidad para la eje-
cución de operaciones lógicas y aritméticas y una sección de memoria. El sistema es
capaz de realizar una tarea determinada por medio de una secuencia de micro opera-
ciones elementales determinada por la ejecución de un programa de micro instruccio-
nes, el cual no hace referencia a la memoria principal.

La unidad de control es programable y recibe un programa en forma de una


sucesión de instrucciones almacenadas con antelación en la memoria del sistema, las
Organización del Computador 33

cuales indican a la sección de control las micro operaciones que debe realizar para la
ejecución de cada instrucción particular. Modificar las especificaciones de funciona-
miento del computador solo requiere almacenar en la memoria una nueva secuencia
de instrucciones. En la literatura especializada se acostumbra agrupar la sección de
cálculo y la unidad de control en un bloque único al cual se denomina unidad central
de proceso o en forma simplificada CPU.

Un computador típico incluye los elementos propuestos en la estructura bási-


ca de la máquina de Von Newmann, cuyo diagrama en bloques se muestra en 2.1.
Aunque John Von Newmann propuso este esquema a mediados de siglo ha perdura-
do, aunque evolucionando sustancialmente en los últimos 50 años, como el modelo a
seguir por muchos de las máquinas de cómputo modernas. Como se observa en la
figura 2.2, los componentes básicos de un computador son:

La Unidad Lógica y Aritmética. (ALU)


• La Unidad Central de Proceso
(CPU)
La Unidad de Control. (CU)

• La Memoria

• La Unidad de Entrada/Salida. , y

• El Generador de Reloj.

2.1.1 La unidad central de proceso

Es la esencia del sistema, su función es controlar la interpretación y ejecución


de las instrucciones y todas las acciones que realice el computador bajo la dirección
del programa almacenado en memoria en forma de una secuencia de instrucciones.
Toda CPU está compuesta de la Unidad Lógica y Aritmética y la Unidad de Control

La ALU es la encargada del procesamiento de los datos de origen externo e in-


terno. Es la sección del computador donde se realiza la mayor parte de cómputos con
los datos bajo la conducción de la CU. Las operaciones aritméticas y lógicas requeri-
das por la instrucción son ejecutadas por la ALU, estas operaciones generalmente son
realizadas por medio de lógica programada, e incluyen: suma, sustracción, multipli-
cación y división; además, de las funciones lógicas: AND, OR, NOT, XOR y despla-
zamientos y rotaciones.

Los operandos necesarios así como el resultado son almacenados temporal-


mente en registros internos de la CPU capaces de conectarse a las entradas de la
Organización del Computador 34

ALU. Dentro de la CPU existen también un grupo de registros de propósito específico


cuyas funciones se expondrán más adelante.

Registros Direcciones

ALU Datos

Unidad
de control Control

Fig. 2.3 Diagrama general de la unidad central de proceso.

2.1.2 La unidad de control

Dirige la secuencia de operaciones del sistema. La CU controla la búsqueda,


transferencia a la CPU, decodificación y ejecución de las instrucciones del programa
almacenado en la memoria del sistema. De acuerdo con los resultados de la interpre-
tación de la instrucción, la CU envía señales de control internas que sincronizan la
transferencia de datos entre registros, y entre éstos y la ALU. Además, genera señales
de control externas dirigidas a las restantes unidades del sistema. El control del flujo
de datos por las líneas de interconexión del sistema, y la interpretación de las señales
de control que llegan a la CPU, son también responsabilidad de la CU.

2.1.3 La memoria

Contiene las instrucciones del programa que debe procesar la CPU, los datos
necesarios para la ejecución del programa y los resultados de la ejecución también
son almacenados en la memoria. Es responsabilidad de la CPU sincronizar la transfe-
rencia de datos desde y hacia la unidad de memoria del computador.

CPU

A10-A0
Memoria
D7-D0

R/W

(a) (b)
Fig. 2.4 a) Conexión del circuito l μP b) Información almacenada
Organización del Computador 35

En la figura 2.4.a se muestra un esquema simple de conexión de una memoria


de 1024 posiciones al CPU. El procesador entrega la dirección (A9-A0) de la celda de
memoria fuente o destino de la información a transferir, y coloca la línea de control
R/W en el estado lógico apropiado para leer (alto) o escribir (bajo) el dato en la me-
moria. El dato es transferido desde o hacia la CPU a través del bus bidireccional de
datos.

Una memoria puede concebirse como un arreglo de biestables organizados en


celdas de 1, 4, 8, ó 16 bits, cada una de las cuales tiene una dirección específica. La
figura 2.4.b es una representación de una memoria de 1024 (0000-1023) posiciones
de 8 bits. Existen distintos tipos de memoria de acuerdo con el tipo de acceso y la
tecnología usada en la fabricación. La memoria principal en computadores es del tipo
de acceso aleatorio (RAM), término que identifica a dispositivos de almacenamiento
en los cuales el tiempo de acceso a una posición determinada es independiente de la
localización del dato, de modo que el tiempo que el procesador debe esperar para
obtener información desde la memoria es el mismo para cada una de las 1024 posi-
ciones.

2.1.4 La unidad de entrada/salida

Representan el canal de comunicación del computador con el mundo exterior.


A través de las unidades de E/S se intercambia información con dispositivos periféri-
cos conectados al computador. La naturaleza de la información es variada. Los datos
y comandos provenientes de un teclado llegan a la CPU desde la unidad de entrada,
en forma de un código interpretable por la CPU. Los resultados de la ejecución de un
programa pueden ser dirigidos a una impresora por medio de una unidad de salida.

2.1.5 El generador de reloj

Constituye la base de tiempo maestra del sistema, siendo usado por la CU pa-
ra sincronizar la secuencia de operaciones del computador, generando todas las seña-
les necesarias para la transferencia interna y externa de información y para el funcio-
namiento de la ALU.

Como se observa en la figura 2.2, la comunicación entre la unidad central de


proceso y las restantes unidades del computador se realiza por líneas de interconexión
denominadas genéricamente buses, los cuales se distinguen por el tipo de información
que circula por éstos. Un bus es una representación de un grupo de líneas indepen-
dientes que en un diagrama funcional de un computador tienen funciones comunes.
Existen tres tipos de buses: direcciones, datos, y control. Por el primero circulan las
direcciones de la fuente o destino de la información que se transfiere, la cual se trans-
mite por el bus bidireccional de datos. El bus de control lo forman las señales necesa-
Organización del Computador 36

rias para el control de la máquina y del intercambio de información con los periféri-
cos, por ejemplo la entrada de reset y las salidas de lectura y escritura, forman parte
del bus de control.

La ejecución de un programa implica la participación de todas las unidades


del computador. La CPU busca las instrucciones en la memoria, las decodifica y ge-
nera las señales de control del sistema (UC), ejecuta, si el programa lo requiere, ope-
raciones aritméticas y/o lógicas (ALU). Los datos y resultados son transferidos a y
desde la CPU por las unidades de E/S. La señal de tiempo que sincroniza todo el pro-
ceso la suministra el reloj del sistema. Aunque el modo de operación de la máquina
de Von Newmann es de naturaleza secuencial, lo cual significa que el programa está
almacenado en forma ordenada en posiciones consecutivas de memoria, y así es eje-
cutado. La máquina puede alterar la secuencia de la ejecución, buscando la siguiente
instrucción en una posición de otra área de memoria. Esta capacidad, junto con el
concepto de programa almacenado constituyen los fundamentos de las sofisticadas
máquinas diseñadas y construidas en la actualidad.

2.2 LAS INSTRUCCIONES DEL COMPUTADOR

La ejecución de toda instrucción se realiza en dos fases fundamentales: bús-


queda y ejecución. Durante la fase de búsqueda el computador obtiene la instrucción
almacenada en memoria y la traslada a la CPU para su posterior decodificación.

Instrucción a la CPU
BÚSQUEDA EJECU-
Ejecución culminada CIÓN

Fig. 2.5 Fases de ejecución de una instrucción.

Al inicio de la fase de ejecución se procede a la decodificación de la instruc-


ción donde se informa a la unidad de control la secuencia de microinstrucciones que
debe realizar para la activación de las señales internas y externas que permiten la eje-
cución propiamente dicha. Como se observa en la figura 2.5 durante la fase de ejecu-
ción la instrucción va al interior del procesador, culminada la fase de ejecución se
inicia la búsqueda de la instrucción siguiente. El tiempo que el CPU dedica al proce-
samiento de una instrucción depende del tipo de instrucción. En el capítulo 4 se ana-
lizarán detalladamente las fases de ejecución de las instrucciones de un microproce-
sador.

La cadena de bits que constituye la instrucción porta información vital usada


por la unidad de control para realizar con propiedad las tareas fijadas por el programa
en ejecución. En un computador de 4 direcciones se requieren 80 bits por instrucción:
16 para el código de operación y 64 para las direcciones. Si bien no existen en la ac-
Organización del Computador 37

tualidad, ni existieron hace 40 años, limitaciones de orden técnico para fabricar un


computador de 4 direcciones, el gran número de bits/instrucción es inconveniente
debido a que es necesaria una CPU con estructura interna muy compleja para el pro-
cesamiento adecuado de la instrucción.

Para simplificar la estructura del procesador conviene disminuir el número de


bits por instrucción, lo cual es equivalente a reducir la cantidad de información que
contiene la instrucción de 4 direcciones. De modo que la única posibilidad es elimi-
nar algunas o todas las zonas del campo de dirección. No se considera la opción de
mantener cada instrucción en una posición de memoria, porque la memoria debería
tener celdas de 80 bits, lo cual exigiría que el bus de datos, los registros internos del
procesador, y la ALU fuesen de tal longitud. Entonces se supone que cada instruc-
ción ocupa 5 posiciones de una memoria de celdas de 16 bits y se asume que la CPU
es capaz de distinguir la dirección de inicio de cada instrucción.

D79 D0
Código de Dirección Dirección Dirección Dirección
Operación Operando 1 Operando 2 Resultado Instrucción
Siguiente (a)
D63 D0
Código de Dirección Dirección Dirección
Operación Operando 1 Operando 2 Resultado (b)
D47 D0
Código de Dirección Dirección
Operación Operando 1 Operando 2 (c)
D31 D0
Código de Dirección
Operación Operando (d)
D15 D0
Código de
Operación (e)

Fig. 2.6 Formato de instrucciones del computador.


(a) Cuatro direcciones. (b) Tres direcciones. (c) Dos direcciones.
(d) Una dirección. (e) Sin dirección

Para obtener un computador de tres direcciones con el formato de instrucción


de la figura 2.6.b, se considera que el programa a ejecutar el computador se almace-
na en memoria como una secuencia de instrucciones que ocupan posiciones adyacen-
tes, es posible entonces suprimir la zona del campo de direcciones que indica la ubi-
cación en la memoria de la próxima instrucción a ejecutar si se dota a la CPU de un
registro interno que se incremente en uno cada vez que se ejecute una instrucción o
parte de ésta, tal registro se denomina contador de programa.

Si es necesario romper la secuencia normal del programa para ejecutar una


instrucción en otra área de la memoria, el computador dispone de una instrucción de
salto o bifurcación en cuyo campo de dirección se especifica la dirección del salto.
El efecto de la ejecución de tal instrucción es sustituir el contenido del contador de
programa por el campo de dirección.
Organización del Computador 38

Para suprimir otros campos de la instrucción, debe incorporarse al procesador


registros internos que contengan el o los operandos que se requieren para ejecutar la
instrucción, y el resultado de ésta. Por supuesto, el lenguaje de máquina de la CPU
debe incluir instrucciones que permitan la transferencia previa de los operandos al
interior de la CPU y el resultado a la memoria o a un puerto de entrada/salida.

Fig. 2.6 Reducción del número de bits por instrucción.

Eliminando la zona de dirección del resultado se tiene un computador de dos


direcciones como se aprecia en la figura 2.5.c. Esto puede lograrse si el resultado se
almacena en la dirección que ocupa uno de los operandos, destruyendo el contenido
original (el operando) de la posición de memoria en cuestión. Si es imprescindible
salvar esta información el procesador debe disponer de algún medio de trasladar el
operando a otra localización de memoria. Lo común es que se realice una transferen-
cia indirecta a través de un registro interno de la CPU, una operación de lectura en
memoria mueve el operando al registro y una subsiguiente escritura en memoria lo
transporta a la nueva dirección. Queda claro que el computador de dos direcciones
debe tener al menos dos registros internos, el contador de programa y un registro
para almacenamiento temporal.

Como indica la figura 2.5.d, un computador es de una dirección si uno de los


operandos se transfiere previamente a un registro interno de modo que la instrucción
sólo contenga la dirección de memoria donde está el otro operando. Una instrucción
de transferencia de datos se encargará de trasladar un operando desde la memoria al
registro interno o Acumulador (A). Esta denominación se debe al hecho que el (A) no
sólo mantiene inicialmente uno de los operandos sino que además almacena el resul-
tado. Esto no significa mayor problema debido a que en memoria existe una copia
Organización del Computador 39

del operando original en A. El resultado se deposita en memoria por medio de una


instrucción de transferencia de datos desde el A hasta el dispositivo de almacena-
miento.

La reducción a una zona del campo de dirección de la instrucción fue uno de


los factores determinante para el desarrollo del microprocesador, como un dispositivo
programable cuya estructura interna incorpora todos los elementos de la CPU de un
computador en un circuito integrado, debido a que este formato garantiza el diseño
de la CPU más sencilla posible y por ende la de menor costo. Para culminar esta sec-
ción conviene destacar que las instrucciones que no hacen referencia a la memoria del
computador se denominan instrucciones sin dirección como se específica en la figura
2.5.e.

2.3 CLASIFICACIÓN DE LOS COMPUTADORES

Definir grupos que abarquen los distintos computadores es una tarea difícil.
Las máquinas de cómputo se fabrican en diferentes tamaños y bajo dos categorías, de
acuerdo con la naturaleza de la información que procesan.

La primera corresponde al Computador Analógico, el cual es un sistema elec-


trónico que procesa señales de tensión y corriente que representan variables físicas.
Esta máquina es construida en base a dispositivos amplificadores operacionales, los
cuales son capaces de ejecutar un gran número de operaciones matemáticas. El cam-
po de aplicación del computador análogo es reducido, fue utilizado en el pasado en
actividades militares relacionadas con afinación de la puntería de cañones y aviones
bombarderos, en el primer piloto automático para aeronaves, y en simulación de sis-
temas de control industrial. La imprecisión en los resultados inherente a un sistema
analógico, y el hecho que estas máquinas eran diseñadas para la ejecución de una
tarea y ninguna otra, produjo el rápido decaimiento y obsolescencia de esta tecnolo-
gía en la producción de computadores.

La otra categoría, corresponde al computador digital (a partir de aquí, llamado


computador), el cual emplea señales constituidas por patrones de unos y ceros para el
procesamiento de la información El uso de señales binarias garantiza resultados con
alta precisión en sistemas capaces de operar con gran números de bits, 32, 64 ó más.
Además, el increíble desarrollo de la tecnología de integración de circuitos digitales,
garantiza la construcción de máquinas con estructura más simple y eficiente que su
contraparte analógica.

Los expertos del área acostumbran a clasificar los computadores en tres gru-
pos principales: Computadores grandes o Mainframes, Minicomputadores o Estacio-
nes de Trabajo, y Microcomputadores, en función de sus dimensiones y velocidad de
operación. Tal clasificación es excesivamente amplia, y su validez está sujeta al desa-
rrollo altamente dinámico de la industria del computador. Una máquina clasificada
Organización del Computador 40

como minicomputador a principios de la década del 80, pudiese ser un juguete com-
parado con los microcomputadores de la actualidad.

Para obviar tal obstáculo se acepta que un Mainframe es un gran computador


comparado con un mini o un micro. Tal comparación no solo se refiere al espacio que
ocupa el sistema, sino que abarca un alto costo, impensable capacidad de manejo de
memoria, ultra alta velocidad de ejecución de las instrucciones garantizada por una
CPU formada por un número de procesadores operando en el modo de multiprocesa-
miento. Estas máquinas pueden funcionar en tiempo compartido, con cientos o miles
de usuarios conectados a través de terminales locales, o por el canal telefónico me-
diante el uso de modems, y generalmente son usadas por grandes corporaciones, cen-
tros importantes de investigación y universidades. Su uso se dirige a la solución de
problemas científicos que impliquen gran número de cálculos matemáticos.

Un Minicomputador tiene algunas características de los grandes computado-


res, en escala reducida, es un computador de propósito general con mayor potencia de
cómputo que un micro, pero mucho menos que la correspondiente a un supercompu-
tador. Pueden operar en tiempo compartido con un pequeño número de terminales
conectados, y son usados ampliamente en control de procesos industriales de cierta
complejidad.

Un Microcomputador es un computador de una dirección cuya CPU se conoce


como Microprocesador, su organización se ajusta al modelo de la figura 2.2. Compa-
rados con los mini tienen poca capacidad de cómputo, y solo pueden conectársele
algunos dispositivos periféricos. Los computadores personales se incluyen en esta
categoría.
Introducción al Microprocesador 41

Introducción al Microprocesador

En el capítulo que precede se describe en una forma sencilla la estructura y el


principio de funcionamiento del computador. En este capítulo, se presenta desde una
óptica funcional, la arquitectura interna de un microprocesador genérico justificando
la presencia de cada registro o unidad integrados en el dispositivo. Se considera nece-
sario que el estudiante conozca con cierto detalle la estructura interna del dispositivo
y se cree suficiente que el alumno pueda distinguir y comprender el modo de funcio-
namiento de los distintos grupos de circuitos lógicos que conforman al µP y que con-
tribuyen a realizar una tarea específica, tales circuitos se conocen como unidades fun-
cionales.

3.1 GENERALIDADES
En léxico de computación el término Organización distingue los componentes
del computador y el modo en el cual están interconectados con el propósito de ejecu-
tar el código almacenado en memoria, según las especificaciones fijadas por la arqui-
tectura de la máquina. La Arquitectura, por su parte, engloba aquellas propiedades del
sistema que son determinantes del modo en el cual se ejecutan las instrucciones del
programa. El conocimiento de las particularidades arquitectónicas del computador es
un recurso esencial para que el programador desarrolle el soporte lógico de las aplica-
ciones.

Atributos típicos de la arquitectura son:

• Conjunto de instrucciones,
• Longitud de palabra,
• Modos de direccionamiento y
• Técnicas de gestión de entrada y salida.
Introducción al Microprocesador 42

• Conjunto de instrucciones
• Longitud de palabra
• Modos de direccionamiento
• Técnicas de gestión de E/S

Fig. 3.1 Los atributos de la arquitectura son visibles para el programador.

Aquellos aspectos del sistema ocultos para quien escribe el código, constitu-
yen la organización. En la figura 3.2 puede observarse el diagrama funcional de una
tarjeta de video con información no perceptible por el programador. Este no requiere
conocer el tipo de tecnología usada para fabricar la memoria principal o de video,
tampoco el tipo de señales involucradas en el control de los distintos componentes del
sistema, o los pormenores de los circuitos de interconexión entre la CPU y los equi-
pos periféricos.

Fig. 3.2 Los detalles de la tarjeta de video y el modo de interconexión con el µP son transparentes
para el programador.

Ocurre a menudo que las máquinas ofrecidas por un fabricante determinado


tengan la misma arquitectura pero estén organizadas en forma diferente. Esto signifi-
Introducción al Microprocesador 43

ca que una serie de computadores ejecutan el mismo repertorio de instrucciones pero


difieren en la cantidad y la calidad de los recursos disponibles por el usuario.

Un diseñador de computadores tiene la responsabilidad de integrar los com-


ponentes físicos y lógicos que permiten a la máquina operar adecuadamente. En este
sentido, un diseñador lógico cumple funciones parecidas a un arquitecto, al disponer
de bloques en forma de μPs, circuitos o bancos de memorias, dispositivos controlado-
res, y líneas de interconexión los cuales deben organizarse en un sistema capaz de
realizar las funciones características de un microcomputador.

Los elementos que se combinan para constituir un μC pueden agruparse en


dos categorías: Hardware y Software. La parte de la máquina que no acepta modifi-
caciones, solo expansiones, constituye el hardware del sistema. Es el soporte físico, y
lo forman los circuitos integrados, los distintos componentes electrónicos, y la tarjeta
de circuito impreso que permite la interconexión eléctrica. El término software se
refiere a los algoritmos, instrucciones, y programas que dirigen el funcionamiento de
la máquina. Como soporte lógico, el software puede ser modificado de acuerdo con
las necesidades de la aplicación.

Es conocido que la CPU de un microcomputador es un circuito integrado


VLSI conocido como microprocesador, el cual es equivalente a la unidad central de
procesamiento de un computador de una dirección. Para que un chip sea considerado
un μP contener al menos las siguientes unidades: Registros internos, Unidad Lógica y
Aritmética y Unidad de Control, como ilustra el diagrama de la figura 3.3.

REGISTROS

ALU

UNIDAD DE
CONTROL

Fig. 3.3 Componentes básicos de un microprocesador

Un sistema microcomputador completo está constituido por la CPU, la memo-


ria y las unidades de E/S. El μP es diseñado para operar como un procesador secuen-
cial, controlando y ejecutando un conjunto específico de instrucciones almacenadas
Introducción al Microprocesador 44

en la memoria del μC. Para realizar esta tarea, un μP típico contiene: la unidad de
control, la unidad lógica y aritmética, y un grupo de registros para el almacenamiento
temporal de la información. Un registro denominado contador de programa (PC) es el
encargado del barrido del programa. Cada vez que el μP busca una instrucción en
memoria, el PC se incrementa en uno para apuntar a la siguiente instrucción.

Si en el encapsulado del circuito integrado se encuentran además de las unida-


des que conforman un μP, algún tipo de memoria y unidades de E/S como ilustra la
figura 3.4, se trata de un microcomputador monopastilla o simplemente Microcontro-
lador (μctrl). Estos dispositivos se diseñan para uso en aplicaciones específicas de
control a diferencia del μP, destinado aplicaciones de propósito general.

CPU PUERTOS

EPROM

RWM

TIMERS

Fig. 3.4 Microcomputador en una pastilla.

Los μCtrls de 8 bits son a menudo usado como controladores de teclado de


microcomputadores (un 8049 controlaba el teclado del PC compatible IBM), en surti-
dores de gasolina, hornos de microondas, receptores de TV y otros electrodomésticos,
en control de ascensores, controladores de tráfico urbano, y muchas otras aplicaciones
con complejidad media. Los dispositivos de 16 y 32 bits se encuentran en regulado-
res de sistemas de frenado antibloqueo de automóviles, en el control de motores de
inyección directa, en controladores inteligentes de discos, en sistemas de robots, en
equipos de audio y procesamiento de imágenes y en el control de manipuladores in-
dustriales.
La evolución de los μCtrls ha sido de tal magnitud y su uso tan extendido que
es posible encontrar dispositivos avanzados de 16/32 bits con estructura de multipro-
cesador resolviendo tareas de control complejas en sistemas distribuidos de control
industriales.
Introducción al Microprocesador 45

Es común que toda empresa fabricante de μPs produzca también μCtrls. Por
ejemplo, Motorola fabrica las series M680x y M68H11/12, Siemens ofrece los mode-
los C167 y C167CR, y National Semiconductor las series COPx00 y NS8050. Uno de
los fabricantes más populares es la empresa MICROCHIP, la cual ofrece una gran
diversidad de modelos adaptables para aplicaciones de baja, media y alta compleji-
dad. Los modelos de la serie PIC18xxx son los de más alto desempeño.

3.2 ARQUITECTURA INTERNA DEL MICROPROCESADOR

El camino habitual para introducir la arquitectura de μC en un curso básico de


microprocesadores, consiste en utilizar un diagrama funcional de la máquina especifi-
cando la tarea que desempeña cada elemento, en forma similar a como se presentó en
el capítulo 2 la teoría básica del computador. Un modo más eficaz y que permite al
estudiante comprender en forma rápida como se organizan los componentes de un μC
y que además justifica plenamente la presencia de cada unidad funcional en el interior
del μP, consiste en especificar una tarea de cálculo simple y desarrollar un diagrama
en bloques de una máquina capaz de ejecutarla.

Para iniciar el estudio del µP se usa un proceso de síntesis, desarrollado paso a


paso, de una máquina hipotética que ejecuta un conjunto mínimo de instrucciones. De
esta forma es posible establecer las unidades funcionales que se requieren para la eje-
cución de una instrucción típica, considerando que lo esencial es exponer en forma
muy general la función que cumple cada unidad del µP, más que detenerse en los
detalles de diseño de cada circuito. El desarrollo de la máquina teórica propuesta no
solo conduce a establecer los elementos internos constituyentes de la CPU, sino que a
su vez permite introducir los diferentes elementos que conforman la arquitectura de
un μC básico.

3.2.1 Proceso de síntesis de un microprocesador

Se propone la síntesis de una unidad central de procesamiento de ocho bits,


capaz de ejecutar programas usando el grupo de instrucciones que se especifican en
la tabla 3.1.

Tabla 3.1. Conjunto de Instrucciones y código de operación asociado.


Instrucción Código de operación Función
ADD 00 Suma
SUB 01 Substracción
IN 10 Entrada de dato
OUT 11 Salida de dato
Introducción al Microprocesador 46

En principio se requiere escribir un programa para sumar dos números enteros


N1 y N2. Los sumandos son obtenidos de un arreglo de ocho interruptores lógicos S0-
S7 conectados a la CPU y el resultado de la suma debe desplegarse usando ocho dio-
dos luminosos D0-D7, tal como ilustra la figura 3.5. El problema consiste en esta-
blecer los componentes de la caja negra de la figura 3.5, de modo que pueda ejecutar
un programa que lea dos números desde los interruptores, ejecute la operación arit-
mética y presente el resultado en los indicadores luminosos.

El conjunto de instrucciones del microprocesador

El número binario denominado código de operación (OC) en las instrucciones


de la tabla 3.1 corresponden a los dos bits de mayor peso del código de instrucción, el
cual tiene una longitud de 8 bits. Este arreglo de bits permite a la CPU distinguir la
instrucción y realizar la acción ordenada por ésta. Para simplificar la tarea del pro-
gramador, es usual que cada instrucción se identifique con una palabra, abreviatura o
siglas que en lenguaje inglés expresen la función que realiza la instrucción. Por ejem-
plo SBB r (Subtract Register with Borrow) produce que el contenido del registro r y
la bandera de acarreo sean restados del contenido del acumulador.

VCC

R9-R16
R1-R8 270 Ω
5.1 KΩ
D0-D7

S0-S7
?

3.5. Diagrama general del sistema propuesto.

En el μP hipotético, ADD ejecuta la operación de adición de dos números bi-


narios, mientras que SUB realiza la substracción. El par de instrucciones restantes IN
y OUT permiten la comunicación de la CPU con el mundo exterior para adquirir da-
tos y entregar resultados, respectivamente.

La unidad de cálculo
Para ejecutar las instrucciones ADD y SUB se requiere una Unidad Aritmé-
tica Lógica o ALU, la cual como se sabe es la parte de la CPU encargada de realizar
operaciones de este tipo.
Introducción al Microprocesador 47

Registro A Registro B

(A) (B)

Unidad
Lógica y
Aritmética

(A+B)

Fig. 3.6 La Unidad Lógica Aritmética, el Acumulador y el registro B de propósito general.

Debido a que ambas instrucciones involucran dos números binarios, se requie-


ren dos registros para almacenarlos: el acumulador (A) y un registro de propósito
general B. Ambos registros deben conectarse a las entradas a la ALU. El acumulador
es un registro esencial que actúa como fuente o destino de la información. Muchos
μPs presentan una arquitectura donde el resultado de toda operación ejecutada por la
ALU se almacene en el acumulador, como puede observarse en la figura 3.6. El medio
de comunicación entre los registros y la ALU, ambos de ocho bits, es el camino inter-
no de datos del µP. Cada línea de interconexión de la figura 3.6 representa los 8 bits
del bus interno del µP.


Periférico de entrada

Si se escribe un programa para realizar una operación con dos números bina-
rios de ocho bits, los operandos deben ser obtenidos desde el exterior del μP y carga-
dos en los registros de entrada a la ALU. La instrucción IN permite transferir datos
desde el periférico de entrada hasta el registro A conectado a la entrada izquierda de
la ALU. La ejecución de IN resulta en que el byte suministrado por el periférico de
entrada es copiado en el registro A, o:

(A) ← (Periférico)

Esta transferencia implica que la CPU debe tener un camino externo de datos
o bus de datos externo (D0-D7) para conectar el periférico al µP. En la figura 3.7 se
muestra el periférico1 de entrada conectado directamente al registro acumulador, en
la práctica la conexión entre dispositivos externos al sistema y la CPU se realiza me-
diante un registro externo.

El término entrada/salida (E/S) cubre toda transferencia o intercambio de da-


tos entre el µP y un dispositivo externo. Durante una operación de entrada, los da-
tos no son transferidos directamente desde el periférico al acumulador, sino que un
Introducción al Microprocesador 48

circuito digital, denominado en forma genérica puerto de entrada, sirve como medio
de interconexión entre el equipo externo y el bus de datos del µP. La realización de
una operación de salida la permite un puerto de salida.

Periférico 1 S0-S7

Registro A Registro B

(A) (B)

Unidad
Lógica y
Aritmética

(A+B)

Fig. 3.7 Un periférico de entrada permite introducir datos al μC.

A un μC se le conectan distintos dispositivos de entradas de acuerdo con la


aplicación a la cual está destinado, pero sólo uno de éstos puede comunicarse a la vez
con el µP. De modo que es necesario asignar una dirección a cada periférico para
seleccionarlo en el momento apropiado y así dejar abierta la posibilidad de expansión
de la máquina. En este caso, al puerto donde se conectan los interruptores se le asigna
la dirección 1.

Operación de
entrada

Operación de
salida

Fig. 3.8 Operaciones de E/S.


Introducción al Microprocesador 49

La estructura de bus único del μP impone ciertas reglas para el acoplamiento


de circuitos o equipos periféricos a los terminales de datos del procesador,

• En principio todo dispositivo de entrada que se conecte al bus de datos debe tener salidas de tres
estados para evitar la carga de las líneas de datos por parte de otros periféricos que no estén se-
leccionados. Dos puertos de entrada no pueden conectarse simultáneamente al bus sin que ocu-
rra un deterioro de la información transferida.

• Para puertos de salida tal consideración reviste importancia cuando varios equipos externos que
funcionan conjuntamente con el μP están conectados al bus, debido a que la carga tiene efecto
acumulativo.

En su forma más sencilla, un puerto de entrada puede realizarse usando un


buffer tri-estado y si se requiere capacidad de almacenamiento de la información que
llega al puerto, se usa un registro latch. La estructura de puerto de entrada básico se
presenta en la figura 3.9. El acoplador tri-estado de salida impide/permite el flujo de
información desde el puerto hacia el bus de datos del microprocesador. Cuando se usa
un registro de almacenamiento, es responsabilidad del dispositivo de entrada cargar el
dato correspondiente en el latch e indicar a la CPU que hay un byte listo para transfe-
rencia. A continuación, el µP activa el paso de información a través de los buffers
aplicando un pulso de habilitación SEL de nivel bajo el cual proviene del decodifica-
dor de puertos. La activación de la línea de selección de puertos, ocurre cuando se
está realizando una operación de lectura en el puerto como respuesta a la ejecución de
una instrucción IN.

BUS DE DATOS

D7

DISPOSITIVO BUFFER D6
REGISTRO
DE DE DE TRES
ENTRADA 8 BITS ESTADOS

D0

SEL

Fig. 3.9 Puerto de entrada para un sistema basado en microprocesador.

El puerto de entrada necesario para conectar los interruptores S0-S7 no requie-


re un registro latch porque el estado lógico de los bits de entrada es retenido por los
interruptores y desde luego no es necesario que el circuito de puerto de entrada tenga
capacidad de almacenamiento. Un circuito práctico para introducir los datos a la CPU
hipotético se presenta en la figura 3.10. Los interruptores se conectan al bus de datos
del µP por medio de ocho buffers de tres estados.
Introducción al Microprocesador 50

VCC

R1-R8

Puerto 01

CON1

S0 - S7

Fig. 3.10 Puerto de entrada al μP.


Introducción al Microprocesador 51

De este modo, la entrada de selección PE01 , activa en nivel bajo, habilita la


lectura y carga en el acumulador del estado lógico de S7-S0. El bus de datos del µP se
conecta al conector CON1.

Extendiendo el código de instrucción

Asignar la dirección 1 al dispositivo de entrada obliga a incorporar un ope-


rando a la instrucción IN para especificar el dispositivo origen de los datos. Esto sig-
nifica que el arreglo de 8 bits que define la instrucción contiene ahora el código de
operación y un operando que especifica la dirección del periférico, como se indica en
la figura 3.11.

Código de Código de
operación operando
Instrucción Operando D7 D6 D5 D4 D3 D2 D1 D0
IN Puerto 1 1 0 X X X X 0 1

Fig. 3.11. Un operando es necesario para la instrucción IN puerto.

Al ser el μC de ocho bits (un byte), el formato binario de la palabra de la ins-


trucción contiene igual número de bits. En este caso los bits D7 y D6 especifican el
OC, mientras que D1 y D0, corresponden al código de operando. Los bits D5-D2 se
definen posteriormente. La acción resultado de la ejecución de la instrucción IN 01,
es transferir al acumulador la palabra binaria presente en los interruptores del perifé-
rico 1 de entrada, esto es:

(A) ← (Puerto 1)

Periférico de salida

El dispositivo externo de salida lo conforma un arreglo de ocho diodos lumino-


sos que indican en formato binario el resultado de la operación ejecutada por la ALU.
En la figura 3.12 se ilustra la disposición de los LEDs en el conjunto del sistema mi-
crocomputador. Para conectar los indicadores luminosos al bus de datos del micro-
procesador es necesario un puerto de salida, al cual se le asigna la dirección 2. Como
consecuencia, la instrucción OUT 02 transferirá el contenido del registro A, igual al
resultado de la suma, a un periférico con dirección 2, esto es,

(Puerto 2) ← (A)

De modo que la instrucción de salida OUT también requiere un operando para


especificar la dirección del puerto al cual se conecta el periférico de salida. Como se
observa el la figura 3.13 se usan los dos bits de menor peso del código de la instruc-
ción.
Introducción al Microprocesador 52

Periférico 1 Periférico 2

IN OUT

(A)
Registro A Registro B

(A) (B)

Unidad
Lógica y
Aritmética

(A+B)

Fig. 3.12. Un periférico de salida permite visualizar el resultado de la operación.

Las características operacionales del periférico conectado al sistema determi-


na cuan complejo es el circuito de interconexión, pudiendo requerirse desde simples
registros y/o buffers de tres estados hasta circuitos LSI programables de propósito
general. Para el puerto de entrada fue suficiente con conectar los interruptores al bus
de datos del μP por medio de buffers de tres estados considerando que el estado lógi-
co de los bits de entrada es retenido por los interruptores.
Código de Código de
operación operando
Instrucción Operando D7 D6 D5 D4 D3 D2 D1 D0
OUT Puerto 2 1 1 X X X X 1 0

Fig. 3.13 Un operando es necesario para la instrucción OUT puerto.

Para seleccionar la lógica que realiza el puerto de salida es necesario conside-


rar que los datos enviados por el μP a un puerto determinado durante la ejecución de
una instrucción OUT puerto permanecen en el bus de datos un espacio muy corto de
tiempo, de modo que es necesario que información sea capturada por el circuito de
interconexión para que esté disponibles después que culmina la operación de escritura
en puerto.

En la práctica, un puerto de salida básico consiste de un simple registro de al-


macenamiento paralelo que realiza la conexión entre el bus de datos del microproce-
sador y el dispositivo de salida, como ilustra la figura 3.14.

El diagrama eléctrico del puerto de salida para la máquina bajo síntesis es el


de la figura 3.15, donde se observa que, durante la operación de escritura a puerto, la
activación de una señal de selección de puerto de salida 2 PS02 permite la carga del
Introducción al Microprocesador 54

contenido del bus de datos en el registro de salida y la presentación del resultado de la


suma.
BUS DE DATOS

D7

D6
REGISTRO DISPOSITIVO
DE DE
8 BITS SALIDA

D0
CLK

SEL

Fig. 3.14 Puerto de entrada para un sistema basado en microprocesador.

El conjunto extendido de instrucciones

Establecida la forma en la cual el µP obtiene los operandos desde los interrup-


tores lógicos y como presenta el resultado, es necesario considerar que la suma que
debe realizar la máquina requiere dos números N1 y N2 , los cuales deben cargarse en
los registros A y B conectados a las entradas de la ALU, para que ésta pueda ejecutar
la operación aritmética.

Un problema emergente se debe a que la instrucción IN puerto transfiere el


contenido del periférico 1 (N1) al registro A y no existe en el lenguaje de la máquina
una instrucción que permita trasladar N1 al registro B para proceder a leer el segundo
sumando N2. Proveer un mecanismo para mover el contenido de A al registro B, im-
plica introducir una nueva instrucción: MOV (mover). Aunque MOV carece de ope-
randos, se asume que su ejecución implica la transferencia del contenido de A hasta
B, esto es,

(B) ← (A)

Es claro que la ausencia de operandos en la nueva instrucción de transferen-


cia denominada MOV, se debe a que el único registro interno del µP que puede actuar
como destino, es el B. En caso de la existencia de más registros, debe añadirse el ope-
rando respectivo al código de la instrucción. Por ejemplo: MOV r copia el contenido
del A al registro r. Al incorporarse MOV al conjunto de instrucciones del μP, se
requieren ahora tres bits como mínimo para especificar el código de operación. La
tabla 3.2 presenta el conjunto expandido de instrucciones y los nuevos códigos de
operación.
Introducción al Microprocesador 55

VCC

R9-R16

D7-D0

Puerto 02

CON2

D7 Q7
D6 Q6
D5 Q5
D4 Q4
D3
Q3
D2
D1
Q2
D0 Q1
CLK Q0
OE

Fig. 3.15 Puerto de salida del μP


Introducción al Microprocesador 56

Tabla 3.2. Conjunto de instrucciones incluyendo MOV.


Código de operación
Instrucción Operando D7 D6 D5 D4 D3 D2 D1 D0
ADD 0 0 1 X X X X X
SUB 0 1 1 X X X X X
IN Puerto 1 1 0 1 X X X 0 1
OUT Puerto 2 1 1 1 X X X 1 0
MOV 0 1 0 X X X X X

Con el conjunto de instrucciones disponible es posible escribir un programa


que realice la suma de dos números. La secuencia de instrucciones siguiente realiza
esta tarea.

; Programa 1
in 1 ; (A) ←( Estados de S7-S0); El contenido de A es sustituido por el
estado de los interruptores.
mov ; (B) ←(A) El dato en B es reemplazado por el de A.
in 1 ; (A) ←( Estados de S7-S0)
add ; (A) ←(A + B)
; Se ejecuta la suma y el resultado se coloca en A.
out 2 ;(LEDs) ←(A)
; Se presenta el resultado de la suma.

El primer operando N1 es obtenido desde los interruptores y transferido al re-


gistro B, mientras que N2 se mantiene en el acumulador. La instrucción ADD ejecuta
la operación (A) Å (A) + (B) o (N1 + N2 ) Å (N2 ) + (N1) . El resultado de la suma se
envía al puerto de salida por medio de la instrucción out 2.

Formatos para representación de información

Antes de continuar con la síntesis de la máquina conviene realizar una pregun-


ta: ¿Cuál formato se usa para almacenar y procesar los datos dentro de un μC? Lo
común es agrupar los números, caracteres y cualquier otro tipo de información en un
arreglo de bits denominado Palabra. La longitud o número de bits que componen una
palabra varía de un sistema a otro. Un bit (0 ó 1) se define como la cantidad mínima
de información posible de expresar, mientras que una secuencia de 8 bits constituye
un byte, y dos bytes una palabra, como se especifica el patrón mostrado en la figura
3.16a.

Un formato de palabra doble (cuatro bytes) lo usan los microprocesadores fa-


bricados por INTEL: 386 y 486, mientras que los µPs Pentium usan palabras cuádru-
ples (ocho bytes). En la máquina bajo desarrollo y en el microprocesador INTEL
8085A, casos donde el ancho del bus de datos es de ocho bits, se considera una pala-
bra formada por un byte como se observa en la figura 3.16b.
Introducción al Microprocesador 57

Fig. 3.16. Formato de palabra: (a) μPs INTEL: 8086, 80186 y 80286. (b) μP de ocho bits 8085A.

Que un byte contenga ocho bits no es, en modo alguno, una elección realizada al
azar. El microcomputador debe comunicarse con distintos periféricos como teclados y
monitores, los cuales entregan y reciben información alfanumérica. El alfabeto, los nú-
meros, símbolos y algunos comandos forman un conjunto de aproximadamente 130
elementos, los cuales pueden representarse el código de 7 bits (27=128) ASCII estándar
(Standard Code for Information Interchange).

Tabla 3.3. El código ASCII estándar.


000 001 010 011 100 101 110 111
D6-D4 0 1 2 3 4 5 6 7
D3-D0

0000 0 NUL DEL SP 0 @ P ` p


0001 1 SOH DC1 ! 1 A Q a q
0010 2 STX DC2 " 2 B R b r
0011 3 ETX DC3 # 3 C S c s
0100 4 EOT DC4 $ 4 D T d t
0101 5 ENQ NAK % 5 E U e u
0110 6 ACK SYN & 6 F V f v
0111 7 BEL ETB ' 7 G W g w
1000 8 BS CAN ( 8 H X h x
1001 9 HT EM ) 9 I Y i y
1010 A LF SUB * : J Z j z
1011 B VT ESC + ; K [ k {
1100 C FF FS , < L \ l |
1101 D CR GS - = M ] m }
1110 E SO RS . > N ∩ n ~
1111 F SI US / ? O ⎯ o DEL

K → 7510 010010112 (4B16)


ETB → 2310 000101112 (1716) (End of Transmission Block)
Introducción al Microprocesador 58

El código estándar americano para intercambio de información es el más usado


en μC para representar caracteres alfabéticos y numéricos. Si se usa el bit D7 restante
para la prueba de error de paridad, es evidente que el ancho de 8 bits para el byte es una
excelente elección. En tareas de impresión en papel, el estado del bit D7 indica cuando se
imprime en modo texto (D7 = 0) o modo gráfico (D7 =1). Los 128 símbolos ASCII origi-
nales (0 –127) representan letras, dígitos, signos de puntuación, y caracteres de control.
Los valores desde 128 hasta 255 (80H-FFH) constituyen lo que se conoce como código
ASCII extendido que incluye signos internacionales, caracteres gráficos y símbolos espe-
ciales que permiten cierta capacidad gráfica cuando se usa el modo texto.

Para la presentación visual de información resultado de cómputos realizados por


el procesador, es común emplear el código BCD (números del 0 al 9), lo cual requiere
cuatro bits (un nibble), en la mayoría de los μPs existe una instrucción que realiza el
ajuste decimal del acumulador después de la ejecución de una suma. En la figura 3.16b
es apreciable que una secuencia de ocho bits o byte está formado por dos nibbles.

El código ASCII ha sido extensamente usado para representar información desde


los inicios de la computación. En la actualidad existen nuevos códigos que superan las
deficiencias características del ASCII. La empresa IBM, por ejemplo, desarrolló su pro-
pio estándar de codificación denominado EBCDIC, acrónimo de Extended Binary Coded
Decimal Interchange Code (Código Ampliado de Caracteres Decimales Codificados en
Binario para el Intercambio de la Información). Al utilizar 8 bits para la codificación es
posible representar 256 caracteres en lugar de los 128 caracteres del ASCII estándar. El
código EBCDIC es utilizado principalmente en los computadores desarrollados por IBM.

Un esquema de codificación más moderno lo constituye el UNICODE, el cual


utiliza 16 bits por carácter, permitiendo la representación de 65536 símbolos diferentes
en diversos idiomas.

La memoria del sistema

Aunque fue posible escribir un programa para la máquina hipotética, aun es ne-
cesario definir todos los componentes de la CPU y del microcomputador que permitan la
ejecución del código. Para realizar la suma de los dos números N1 y N2, la CPU debe
ejecutar el programa representado por la secuencia de instrucciones del programa.1. El
sistema solo dispone de dos registros internos, A y B, para almacenar datos, entonces
¿Desde donde el μP obtiene las instrucciones?

Una consideración de vital importancia en sistemas basados en μPs es el subsis-


tema de memoria. Tanto las instrucciones del programa como los datos deben estar al-
macenados en algún tipo de memoria, de donde puedan ser obtenidos en el momento
preciso para que el μP realice su función.

Aun cuando los μPs comerciales típicos contienen un banco de registros internos
el 8085A por ejemplo posee los registros de ocho bits: A, B, C, D, E, H y L; estos no
Introducción al Microprocesador 59

pueden usarse para almacenar las instrucciones, más bien están diseñados para el alma-
cenamiento temporal de información, además el número de registros internos es muy
reducido como para contener un programa. Por lo tanto es necesario conectar un circui-
to externo al μP que actúe como la memoria del sistema. Este nuevo componente de la
máquina puede observarse en el diagrama funcional de la figura 3.16.

Periférico 1 Periférico 2

IN OUT

(A)
Registro A Registro B

(A) (B)

Unidad Memoria
Lógica y
Aritmética

(A+B)

Fig. 3.16. La memoria contiene el programa.

Las memorias que se usan en la actualidad para el propósito especificado, son


circuitos integrados LSI diseñados para almacenar una gran cantidad de información en
un número específico de registros, generalmente con entradas y salidas comunes. Exis-
ten diversos tipos de memorias caracterizadas por: la forma de acceso de los datos, el
modo de almacenamiento y la tecnología empleada en su fabricación. Para el sistema en
síntesis, se supone que se usa un circuito integrado de memoria que permite el almace-
namiento del programa y su posterior recuperación. Por ahora el lector no debe preocu-
parse del modo en que el programa es cargado en la memoria y de cómo es transferido a
la CPU.

En un circuito integrado diseñado para almacenar información, es posible cargar


las instrucciones del programa o los datos necesarios para la ejecución del programa.
Cuando se realiza esta acción, se habla de una operación de escritura, mientras que la
obtención de la información contenida en una determinada celda implica una operación
de lectura de la memoria. Cada registro individual de la memoria se conoce como posi-
ción o celda memoria, siendo cada registro de uno, cuatro u ocho bits.

Cada celda tiene asignada una dirección específica, de modo que para lograr ac-
ceso a una determinada posición se requiere especificar la dirección correspondiente. La
Introducción al Microprocesador 60

figura 3.17 muestra el símbolo lógico de un dispositivo de memoria de lectura/escritura


y en la figura 3.18 se observan los componentes internos del circuito integrado.

Líneas de Líneas de E/S


Direcciones de Datos
n m

MEMORIA

Líneas de 2
Control

Fig. 3.17. Símbolo de un circuito de memoria.

Fig. 3. 18 Arquitectura interna de una memoria.


Introducción al Microprocesador 61

Las líneas de acceso típicas de un circuito de almacenamiento de lectura / escritu-


ra, son:

• n líneas de direcciones.
• m líneas de E/S de datos, y
• Algunas líneas de control.

Líneas de direcciones (A0-An-1) especifican la celda de memoria a la cual se


desea acceso. El número de posiciones disponibles en el circuito es P = 2n, la dirección
0 corresponde a la primera posición y la dirección 2n-1 identifica a la posición final. Para
tener acceso a P = N x 1 Kbytes posiciones se requieren:

n = log 2 (N) + 10 Líneas de direcciones.

Por ejemplo, un circuito de 8 Kbytes debe tener:

3
n = log 2 (2 ) + 10 = 13 Líneas de direcciones,

y un chip de 256 bytes (¼ Kbytes) requiere:

⎛ 1 ⎞
n = log 2 ⎜
2⎟
⎝2 ⎠
+ 10 = log 2 2 ( )
−2
+ 10 = 8 Líneas de direcciones.

Las líneas de E/S de datos (D0-D7) proveen el medio para la transferencia de in-
formación hacia y desde la memoria. El valor de m es variable en dispositivos comercia-
les, pudiendo ser, como se dijo, de 1, 4 u 8 bits. En el caso de la máquina hipotética con-
viene una memoria con 8 líneas de datos por ser el μP de tal ancho de palabra. Si se usan
chips con 4 líneas de E/S de datos, se requieren dos chips para el almacenamiento de las
instrucciones.

Las líneas de control son dos para la memoria de la figura 3.18: R/ W (Re-
ad/Write), cuyo nivel lógico especifica si se realiza una operación de lectura/escritura (1:
Lectura, 0: Escritura), y CS (Chip Select) que permite la selección del circuito. Un nivel
lógico alto en esta entrada, coloca en estado de alta impedancia las líneas de E/S de da-
tos.

El decodificador de direcciones en la figura 3.18 procesa la información conteni-


da en las líneas de direcciones para conectar la celda seleccionada a las líneas de entrada
y salida de datos El módulo de control gobierna los buffers bidireccionales de E/S fijan-
do el sentido del flujo de información durante una operación de acceso a la memoria.

Para describir el modo de funcionamiento del circuito de almacenamiento, consi-


dere la realización de una operación de lectura. Los pasos a seguir para esta tarea son:
Introducción al Microprocesador 62

1. Aplicar la dirección a las entradas A0 – An-1 .

2. Seleccionar la memoria colocando un nivel lógico bajo en la entrada CS .

3. Presentar un nivel lógico TTLalto en la línea R / W .

4. Transcurrido el tiempo de acceso, la memoria coloca el byte en las salidas de datos


D0 -D7.

A0-An-1 Dirección válida

CS

R/ W

D0-D7
Datos válidos

Fig. 3.19. Ciclo de lectura del circuito de memoria.

Una de las características que distinguen a un circuito de almacenamiento es la


capacidad de la memoria: Esta es:

N = 2n x m, donde:

N = Capacidad total en bits.


2n = Número de posiciones.
m = Ancho de la palabra o números de líneas de datos.

Así, la expresión 256 x 8 = 28 x 8 = 2048 bits, especifica un chip de 256 posicio-


nes organizadas en palabras de 8 bits. Para la máquina hipotética se elige un circuito con
capacidad de 512 x 8, cuyo símbolo se muestra en la figura 3.20.

A0 – A7 Líneas de direcciones
IO0 - IO7 E/S de datos
CE Seleccionar Chip
OE Habilitar Salida
WE Habilitar Escritura

MODO WE CE OE E/S

Lectura VIH VIL VIL O7 -O0


Escritura VIL VIL x I7 -I0
Inhibir VIH x VIH Z

Fig. 3.20. Circuito de memoria de lectura/escritura de la máquina hipotética.


Introducción al Microprocesador 63

El circuito integrado seleccionado para el sistema bajo síntesis tiene: 9 líneas de


direcciones A8 - A0 para proveer acceso a las 512 celdas de almacenamiento, 8 líneas
bidireccionales de datos Io7 -Io0 para la lectura y escritura de la información almacenada
y 3 líneas de control: CS , OE y WE . Para una operación de entrada de datos, la señal de
habilitación de escritura WE debe ponerse en nivel lógico cero, mientras que para leer
los datos almacenados se pone a cero la señal de habilitación de salidas OE . En ambos
casos la entrada de selección de chip CS debe estar en estado bajo. A la izquierda de la
figura 3.20 se presenta información sobre los modos de funcionamiento del circuito de
memoria.

La conexión del circuito de memoria al µP exige que la unidad de proceso tenga


al menos tanta líneas de direcciones como el circuito de memoria, ocho líneas de datos
y terminales para generación de comandos de control de lectura y escritura. Por ahora se
omite el esquema de interconexión entre el µP y la memoria y se continúa con la síntesis
del procesador.

Dirección Binario Nemónico


0 10100001 in 01
1 01000000 mov
2 10100001 in 01
3 00100000 add
4 11100010 out 02
5 xxxxxxxxx

511 xxxxxxxxx

Fig. 3.21. El programa 1 se carga en la memoria de la máquina. Los bits del código de instrucción aun no
definidos se suponen cero lógico.

El programa de suma del ejemplo 3.1 se carga en la memoria del sistema, mos-
trándose en la figura 3.21 una imagen de la forma en que la secuencia de instrucciones
en formato binario ocupa la memoria.

Ejecución de las instrucciones

El procesamiento de cada instrucción se realiza durante un ciclo de instrucción,


el cual consta de dos tiempos básicos como se mencionó en la sección 2.2, la fase de
búsqueda del código de operación en memoria y la de ejecución de la instrucción.

En la fase de búsqueda, el μP obtiene la instrucción desde la memoria, sin impor-


tar por los momentos como lo hace. La CPU debe entonces interpretar el código de la
instrucción para determinar la función a realizar. Esto implica que para almacenar el
código a descifrar, es necesario dotar a la CPU de un nuevo registro interno de 8 bits o
Registro de Instrucciones (IR)
Introducción al Microprocesador 64

add
sub Decodificador
in de Registro de Instrucción
out Instrucción Instrucción
mov

Fig. 3.22. La salida del registro de instrucciones es la entrada del decodificador de instrucciones.

La función lógica de interpretación o decodificación de la instrucción contenida


en el IR la realiza un Decodificador de Instrucciones (ID) conectado a la salida del IR,
como se observa en la figura 3.22. Este circuito usa la información almacenada en el IR
y especifica cual microprograma debe ser ejecutado para completar el procesamiento de
la instrucción.

En general puede decirse que la secuencia búsqueda-decodificación-ejecución,


consiste de una secuencia de microperaciones controlados por un Microprograma. Este
es un programa de microinstrucciones que no hacen referencia a la memoria principal, y
es diseñado en base a subcomandos los cuales son trasladados a comandos de máquina
por hardware. El μprograma para cada instrucción reside en la sección de decodifica-
ción, siendo ejecutado por las unidades de temporización y control del μP, aun no men-
cionadas.

Aunque existe una estrecha vinculación entre el conocimiento que tenga el pro-
gramador sobre el modo en que se ejecutan algunas instrucciones y la calidad, eficiencia,
y tiempo de desarrollo de un programa determinado, no se considera imprescindible rea-
lizar en este trabajo un análisis detallado del microprograma de control del μC y la for-
ma como las microinstrucciones generan las distintas señales internas y externas que
controlan la transferencia entre registros, la rotación del acumulador, el funcionamiento
de la ALU, y la comunicación con la memoria y los dispositivos de E/S; de hecho el tra-
tamiento de este tópico lo contemplan programas de estudio de asignaturas que el lector
cursará en el futuro.

De mayor provecho en esta sección introductoria es presentar en forma concep-


tual y muy simple el modo de funcionamiento del decodificador de instrucciones. Como
muestra la figura 3.22, el ID recibe la información almacenada en el IR y coloca en ni-
vel alto la salida que corresponde a la instrucción obtenida desde la memoria. Para ilus-
trar el modo de operación de la lógica de decodificación durante una transferencia entre
registros, se considera ahora el circuito de la figura 3.23. Se observa que si la instrucción
depositada en el registro de instrucciones es IN 01, la salida del decodificador etiquetada
in se activa, ocasionando que el estado de los interruptores lógicos en el periférico 01 se
transfiera al acumulador. En caso de ser OUT 02 la instrucción obtenida de la memoria,
la salida del decodificador con etiqueta out pasa a nivel lógico alto y los diodos lumino-
sos conectados al periférico 02 indicarán el estado lógico de los bits del registro acumu-
lador.
Introducción al Microprocesador 65

Interruptores Lógicos

in

Acumulador

out

Indicadores lógicos

Fig. 3.23. Las salidas del decodificador de instrucciones permiten la ejecución de la instrucción.

En la práctica, la lógica de control y demás componentes de un μP real es un


arreglo intrincado de puertas lógicas y biestables que requiere la intervención de nume-
rosas señales de control para ejecutar las diferentes instrucciones. El registro acumula-
dor, por ejemplo, es en realidad un registro de desplazamiento con cierta cantidad de
lógica asociada y entradas de reloj para permitir la realización varias operaciones, tales
como desplazamientos de su contenido hacia la derecha o izquierda, complemento y
otras funciones lógicas, además de interactuar con la ALU. No obstante, puede conside-
rarse que la función básica de transferencia paralela entre registros es ilustrada apropia-
damente con el sencillo ejemplo de la figura 3.23.

El generador de direcciones

La forma en que opera la unidad de memoria de programa de la máquina implica


que el μP debe generar direcciones para poder obtener cada una de las instrucciones del
programa almacenado. Para que la CPU pueda obtener, durante la fase de búsqueda, la
instrucción almacenada en la memoria debe suministrar al dispositivo de almacena-
miento la dirección de la celda que contiene la instrucción. Esta información debe man-
tenerse estable en las líneas de direcciones de la memoria hasta que culmine la operación
de acceso.

Como ilustra la figura 3.24 se introduce un registro interno de propósito especí-


fico denominado Registro de Dirección de Memoria (MAR), el cual retiene la direc-
ción de la instrucción cuya búsqueda progresa. La dirección debe permanecer en el bus
de direcciones al menos el tiempo de acceso del CI de memoria, para permitir que éste
coloque en el bus de datos la información que contiene la celda seleccionada. En gene-
ral para que el μP pueda establecer comunicación con cualquier dispositivo externo a la
CPU que tenga dirección asignada, sea memoria o periférico de E/S, se requiere el uso
del MAR, el cual es en realidad el origen del bus de direcciones
Introducción al Microprocesador 66

Registro de Dirección
de Memoria

Líneas de direcciones

add
sub Decodificador Registro Instrucción
in de de Memoria
out Líneas de datos
Instrucción Instrucción
mov

Fig. 3.24. El registro de direcciones de memoria contiene la dirección de búsqueda de la instrucción.

Resuelto el problema de generar dirección de la posición de memoria que ocupa


cada instrucción, existe otro detalle de interés. Se sabe que la ejecución del programa de
suma de dos números binarios requiere que la CPU tenga acceso a un rango de direccio-
nes comprendido entre las posiciones 0 y 4 de la memoria. Esto significa que el μP no
solo debe generar una dirección, sino que debe estar en capacidad de realizar una explo-
ración secuencial de la memoria para poder obtener todo el programa.

Reset
Contador de
Pulsos
Programa

Registro de Dirección
de Memoria

Líneas de direcciones

add
sub Decodificador Registro Instrucción
in de de Memoria
Líneas de datoss
out Instrucció Instrucción
mov

Fig. 3.25. El contador de programa permite el barrido de las direcciones que ocupa el programa.

Para generar las direcciones consecutivas que permitan la ejecución del progra-
ma, se usa un contador que se incremente en 1 cada vez que se ejecuta una instrucción,
de modo que en todo momento contenga la dirección de la siguiente instrucción a ejecu-
Introducción al Microprocesador 67

tar. Este nuevo componente interno de la CPU es el Contador de Programa (PC). Co-
mo se observa en la figura 3.25, la salida del PC se conecta al registro MAR para enviar
a la memoria la secuencia de direcciones de 0 a 4 donde reside el programa. Cuando se
inicia la fase de búsqueda de una instrucción, el µP carga en el MAR el contenido del PC
e incrementa a éste para apuntar a la siguiente posición de memoria. El MAR mantiene la
dirección aplicada a la memoria hasta el final de la fase de ejecución. La lógica de in-
cremento del contador de programa es mostrada en la figura 3.26.

Fig. 3.26. El contador de programa usa secuenciamiento implícito para actualizar su contenido

Los registros A y B de nuestra máquina son de 8 bits al igual que el registro de


instrucciones. Ahora es necesario establecer la longitud de los nuevos registros internos
del µP. Para establecer el número de bits del registro de memoria MAR y del contador de
programa PC, considere que para tener acceso a las 512 (29) posiciones de la memoria
SRWM seleccionada para el sistema, debe aplicarse una dirección de 9 bits a las líneas
de entrada de direcciones del dispositivo de almacenamiento. Dado que con 8 líneas de
direcciones solo es posible el acceso a todas las celdas de una memoria con capacidad de
28 = 256 posiciones, es patente la necesidad de un byte adicional para especificar todas
las direcciones. En realidad basta con un bit extra, pero como la máquina opera con for-
mato de 8 bits se usa un múltiplo de un este valor. Al usarse dos bytes para especificar
una dirección, se deduce que el contador de programa y el registro de direcciones de
memoria deben ser ambos de 16 bits. El hecho que el MAR tenga capacidad para alma-
cenar dos bytes le permite al μP tener acceso a 216 = 65536 posiciones de memoria, lo
cual es la capacidad de direccionamientos de los μP de 8 bits, incluyendo al 8085A.

Al PC no solo se aplican pulsos de reloj, sino que dispone de una entrada adicio-
nal de inicialización o RESET. Cuando esta señal es activada, el contenido del PC va a
cero, ejecutando el programa desde la dirección de inicio. En μC reales la línea de RE-
SET tiene otras funciones; por ejemplo: un programa en progreso que funcione mal pue-
de ser abortado por medio de esta señal; también cuando se aplica potencia a un μC ini-
cialmente desactivado, un circuito de autoreset permite la estabilización del μP hasta
Introducción al Microprocesador 68

tanto la línea de alimentación alcance un valor de tensión adecuado para la correcta ope-
ración del sistema, típicamente un 75 % del valor nominal de la fuente de energía del CI.

El microprocesador como máquina de estados

El procesamiento de una instrucción implica la ejecución de una secuencia de


operaciones, cada una de las cuales inician una o más microoperaciones a la vez, sincro-
nizadas por el reloj del μP. Cada ciclo del reloj del sistema es un estado Ti, y para com-
pletar cada ciclo de instrucción se requieren varios estados.

Fig. 3.27 Cada ciclo del reloj se denomina estado.

Toda secuencia de microinstrucciones es sincronizada por el reloj maestro del


μP, estando la ejecución de cada paso del microcódigo vinculada con un estado interno o
ciclo de reloj. En general la extensión del ciclo de instrucción varía de una instrucción a
otra, de acuerdo con la cantidad de microinstrucciones necesarias para completar el pro-
cesamiento de una instrucción en particular.

Por ejemplo, es claro que el tiempo que el CPU emplea en la ejecución de la


instrucción ADD es mayor que el que invierte en procesar la instrucción MOV, debido a
que ADD requiere un mayor número de operaciones internas para ser completada, o
expresado de otra manera, la ejecución de ADD exige más ciclos de reloj que los necesa-
rios para MOV. Para que el μP realice una suma gasta cuatro estados internos para bus-
car la instrucción en memoria, decodificarla, usar la ALU, y transferir el resultado al
registro acumulador; mientras que para completar MOV usa tres estados, porque después
de la decodificación es suficiente con realizar una transferencia desde el registro A hasta
el B.

Una ventaja de considerar al μP como una máquina secuencial cuyas funciones


están asociadas con el paso por cierto número de estados internos es que simplifica no-
tablemente la comprensión del modo de funcionamiento del procesador, al permitir re-
presentar con un diagrama de transición de estados las distintas operaciones que la má-
quina realiza durante la ejecución de una instrucción.

Para definir el diagrama de estado considere que al μP se le aplica un pulso de


reset que pone en cero el contador de programa. El ciclo de instrucción se inicia en el
instante que la CPU sale del estado TR de RESET. A continuación se describe los even-
tos que ocurren a partir del estado interno inicial T1 y en la figura 3.28 se representan
como un diagrama de transición de estados.
Introducción al Microprocesador 69

T1: El contenido del PC que corresponde a la dirección de memoria donde


está almacenado el código de operación se presenta en el bus de direc-
ciones y se almacena temporalmente en el MAR.
(bus de direcciones) ← (PC)

T2: La instrucción en la celda de memoria seleccionada por el MAR se


transfiere al registro de instrucciones y se decodifica.
(IR) ← (OC)

T3: Si el código de operación de la instrucción corresponde a IN, OUT o


MOV, se ejecuta la transferencia respectiva a, o entre registros.

T4: En el caso de una instrucción aritmética ADD o SUB, durante el estado


T4 se ejecuta la operación de la ALU, y se pasa a T3 para transferir el
resultado al registro acumulador.

reset TR

reset

T1

T2

instruc- IN OUT
T3
ción MOV

ADD SUB

T4

Fig. 3.28 Diagrama de transición de estados del μP.

La fase de búsqueda de la instrucción corresponde a los estados T1 y T2, mientras


que la decodificación del OC se realiza al final de T2. Dependiendo si la instrucción es
de transferencia de datos o aritmética se usan uno ó dos estados adicionales (T3 y T4)
para completar la ejecución. Conviene aclarar que en la mayoría de los μPs la fase de
búsqueda finaliza en el instante que el OC es almacenado en el IR, en tanto que la deco-
dificación se realiza al inicio de la fase de ejecución.

Para facilitar la comprensión del mecanismo que la CPU utiliza para el procesa-
miento del conjunto de instrucciones es usual utilizar el término ciclo de máquina como
Introducción al Microprocesador 70

medida de la duración de una determinada secuencia de estados durante los cuales el μP


completa una acción determinada. Por ejemplo, búsqueda de OC, lectura a puerto... ;
pudiendo decirse que el ciclo de una instrucción lo constituyen un número determinado
de estos ciclos. En el caso que nos ocupa, el ciclo de instrucción de MOV consta de dos
ciclos de máquinas M1 y M2 con diferentes duraciones, estando M1 formado por dos es-
tados (T1 y T2); y quedando claro que para toda instrucción M1 corresponde al ciclo de
máquina de búsqueda.

La unidad de control

Para el control de una máquina secuencial de estados es imperativa la introduc-


ción de dos nuevas redes lógica en el μP, estas son:

• Un Contador de Estados de 2 bits (4 estados).

• Un Decodificador de Estados.

Fig. 3.29 Contador de estados y decodificador de estados

En el diagrama de la figura 3.29 se aprecian los componentes incorporados a la


CPU. Esta unidad de control y temporización acepta: la salida activa del ID, el cual
identifica la instrucción cuya ejecución está en proceso; y la información proveniente del
contador de estados (sincronizado por el reloj del μP) para genera múltiples señales de
control aplicadas a todos los componentes internos de la CPU que intervienen en la eje-
cución de la instrucción.

Observe que las señales S0 y S1 están disponibles como terminales de salida del
μP, pudiendo ser usadas desde el exterior para registrar el progreso de la ejecución de
una determinada instrucción.
Introducción al Microprocesador 71

Periférico 1 Periférico 2

IN OUT

Registro A Registro B

(A) (B)

Unidad
Lógica y
Aritmética

(A+B)

Señales Internas
de Control

Registro y
Decodificador Decodificador
Instrucción
Memoria
de Estados de Instrucción

Contador
Reloj S1 S0 de Estados Registro de Dirección
de Memoria

S1 S0
Contador de Reset
Pulsos Programa

Fig. 3.30. Una red lógica de decodificación y control de la transición de estados sincronizada por un reloj
de frecuencia del orden de MHz garantiza un μP con gran velocidad de operación.

Además, la unidad de control es la responsable de entregar a dispositivos exter-


nos a la CPU las señales de control necesarias para sincronizar la operación de los res-
tantes elementos del sistema. Son necesarias dos señales de control RD (lectura) y WR
(escritura), ambas activas en nivel bajo, para indicar a la memoria o puerto de E/S que
el procesador esta en una operación de lectura o escritura de dato.

La operación eficiente de un sistema basado en μP depende en forma crítica de la


capacidad de la CPU para controlar los circuitos asociados al μC. El uso de RD y WR
para anunciar al sistema la realización de un ciclo de lectura o escritura, determina que el
espacio de direcciones disponible es común para la memoria y para los puertos de E/S
Introducción al Microprocesador 72

Por ejemplo, para trasladar un dato hacia un dispositivo externo el μP emite la


dirección a la cual desea tener acceso, digamos 0020H, coloca la información en el bus
de datos y pone la señal WR en estado bajo. Debido a que el μP reconoce sólo un área
de direcciones, no es capaz de distinguir si el destino de la información es posición 20H
de memoria o el puerto 20H de salida. Esta situación representa un problema crítico para
la operación del sistema debido a dos dispositivos no pueden ser seleccionados para el
uso simultaneo del bus de datos. En consecuencia, se hace necesario aumentar el número
de líneas del bus de control con una señal que separe el área de dirección de memoria del
espacio de dirección de E/S. Esta nueva línea de control se identifica como IO/M y su
estado lógico distingue cuando la operación de lectura o escritura es memoria o puerto.
En la figura 3.29 se observa que las tres nuevas salidas del μP se originan en la sección
del control.

Velocidad de procesamiento

La rapidez de procesamiento de las instrucciones esta vinculada con la frecuencia


del reloj maestro del μP. En la medida que la fclk sea más alta, con mayor velocidad se
realiza la ejecución debido a que la duración de cada estado será menor. Si una instruc-
ción especifica requiere 10 ciclos de reloj o estados internos para completar su ejecución
y la fclk es conocida, puede determinarse el tiempo que utiliza el μP para ejecutar la ins-
trucción. Para calcular el tiempo que el μP consume en la ejecución del programa 1 se
repite en la tabla 3.4 la secuencia del código indicando el número de estados requerido
para completar cada instrucción.

Tabla. 3.4 El programa 1 tiene 16


estados.
INSTRUCCIÓN ESTADOS

IN 01 3
MOV 3
IN 01 3
ADD 4
OUT 02 3

N° total de estados 16

Si la frecuencia de reloj de la máquina hipotética es, digamos fclk = 2 Mhz, cada


ciclo de reloj es de 500 ns. Como la duración de un estado es 500 nS, el programa tarda-
rá en ejecutarse un tiempo igual a 16 estados x 0.5 μS/estado = 8 μs. En otras palabras,
sumar dos números binarios de ocho bits gasta un tiempo de 8 μs.

De acuerdo con la tabla 3.4, la velocidad máxima con la cual el μP puede ejecu-
tar una instrucción es de 1.5 μs, en el caso de las instrucciones de transferencia de datos.
Las instrucciones aritméticas requieren 2 μs para su ejecución. De este modo que si en
Introducción al Microprocesador 73

una aplicación determinada es necesario calcular una suma en un tiempo inferior a 8 μS,
debe recurrirse a una CPU más rápida o bien incrementar la frecuencia del reloj maestro
sobre los 2 MHhz, debido a que la fclk impone el límite superior de la velocidad de pro-
cesamiento.

Disponiendo de la información de la duración de cada ciclo de instrucción es po-


sible usar el μP para realizar control de tiempo, al permitir al usuario programar lazos de
retardo del orden de μs, segundos, horas o años. Las rutinas de tiempo permiten, entre
otras aplicaciones, la generación de pulsos o señales periódicas con alta precisión gracias
al hecho que el generador de reloj usa un cristal externo como componente base del osci-
lador, garantizando un reloj maestro con frecuencia exacta y muy estable.

El límite inferior para el ancho de un pulso o el periodo de una señal periódica


está limitado por el la fclk. En aplicaciones de tiempo real generalmente se usa para con-
trol de tiempo un circuito LSI externo de propósito específico conocido como tempori-
zador de intervalos programable.

Comunicación con periféricos lentos.

A menos que sea forzado a permanecer en estado de RESET por acción externa,
el μP inicia la ejecución del programa procesando secuencialmente cada instrucción en
memoria a partir de la dirección 0. La rutina de suma requiere recibir desde el exterior
los números binarios a sumar, siendo evidente que 8 μs es un tiempo insuficiente en
extremo para introducir en forma manual los datos desde los interruptores lógicos. Esta
situación introduce un problema severo de sincronización entre la velocidad de opera-
ción del μP y los eventos externos a la CPU.

La solución se inicia con la introducción del concepto de Estado de Espera o


TWAIT, el cual no es más que un alargamiento del ciclo del reloj en espera de la respuesta
de dispositivos de memoria o periféricos lentos. El estado de espera puede trasladarse
al diagrama de estados del μP, como ilustra la figura 3.31. Observe en el nuevo diagra-
ma de transición de estados, que la transición hacia TWAIT depende de la prueba de la con-
dición ready, de modo que es necesario establecer algún medio para que el periférico
lento pueda controlar el estado de ready.

La solución es dotar al microprocesador de una línea de entrada identificada co-


mo READY, cuyo estado puede ser fijado desde el exterior de la unidad central de pro-
ceso. En el estado T2, el μP prueba el estado de esta entrada, si está en nivel lógico uno
pasa a T3 y se completa la ejecución de la instrucción en el modo acostumbrado. Si por
el contrario READY está en cero lógico, el μP entrará en un estado de espera TWAIT en el
cual permanece hasta que la entrada de control retorne a nivel alto. Así, la activación
externa de READY impide que el μP ejecute la instrucción en ejecución porque el estado
TWAIT se introduce al final del ciclo de búsqueda y antes que se inicie la fase de ejecu-
ción.
Introducción al Microprocesador 74

Fig.3.31. El diagrama de transición incluye un estado T5 = TWAIT para permitir la sincronización del μP
con dispositivos de E/S lentos.

Para permitir la introducción de los operandos de la suma se controla la entrada


READY con un interruptor S8 ubicado en el periférico 1, como muestra el circuito de la
figura 3.32. Suponiendo que S1S0 es ‘01’ cuando el µP esté en el estado T2, el flanco
posterior del reloj cargará uno en la salida Q del biestable U1, llevado la entrada REA-
DY a nivel bajo.

Si la instrucción en ejecución es IN u OUT, el procesador examinará la entrada


READY e introducirá estados de espera parando el proceso de ejecución. El usuario pro-
cederá a introducir el operando de la suma y a continuación activará el pulsador S8 para
regresar READY a nivel alto y completar la ejecución de la instrucción.

En todo microprocesador existe esta señal de control, en los fabricados por IN-
TEL (8, 16 y 32 bits) se denomina READY o RDY, en otros como el Z80 se denota
WAIT. En aplicaciones del mundo real, la línea READY se usa para permitir la interco-
nexión al µP de memorias o circuitos de E/S con tiempos de acceso de mayor duración
que el permitido por el µP para entregar el dato. Activando READY, el componente ex-
Introducción al Microprocesador 75

terno obliga a que la CPU dejar pasar, sin realizar operación alguna, un número de ente-
ro de periodos de reloj hasta cuando el dato esté disponible.

Fig. 3.32. Circuito para control de la entrada READY.

Conjunto extendido de instrucciones

La desventaja principal de la máquina propuesta está relacionada con el hecho


que ésta posee un número limitado de instrucciones. Para superar está situación existen
dos posibilidades: una, incorporar nuevas instrucciones, la otra, extender el alcance de
las existentes. Si por ejemplo, se modifica la instrucción MOV de modo que además de
transferir el contenido del registro A hasta registro B, pueda cumplir la acción inversa,
se obtiene una instrucción MOV más poderosa. La nueva MOV requiere dos operandos
para indicar el sentido de la transferencia, tales son el registro fuente (S) y el registro
destino (D). Los nemónicos de la nueva MOV son:

MOV A,B (A) ← (B)

MOV B,A (B) ← (A)

Ahora, tanto A como B pueden ser origen o destino de los datos. La instrucción
MOV original no necesitaba operandos debido a que la acción a ejecutar estaba implíci-
ta, esto es mover el contenido de A hasta B. El hecho que deba hacerse ahora referencia
a los registros internos de la CPU, indicando cual entrega y cual recibe datos, requiere
asignar algún código a los registros para identificarlos. Los códigos asignados a los re-
gistros son:
Introducción al Microprocesador 76

Tabla. 3.5. Código de 2 bits para iden-


tificar a los registros.
REGISTRO CÓDIGO
A 00
B 01

En la figura 3.33 se identifican las zonas del código de instrucción para los nue-
vos tipos de instrucciones para transferencia de datos entre registros, cuyo símbolo gené-
rico es MOV r1,r2.
010 ? DD SS
MOV B,A (B)←(A) 010?010 0
Código de operación 010
Operando destino 01
Operando fuente 00

MOV A,B (A)←(B) 010?0001


Código de operación 010
Operando destino 00
Operando fuente 01

Fig. 3.33. Códigos de instrucción para MOV r1,r2

El nuevo grupo de instrucciones con MOV completamente especificada, se


muestra en la tabla 3.6.

Tabla. 3.6. Conjunto de instrucciones con MOV mejorada.


Código de la instrucción
Instrucción Operando D7 D 6 D5 D4 D3 D2 D1 D0
ADD 0 0 1 0 0 0 0 0
SUB 0 1 1 0 0 0 0 0
IN Puerto 1 1 0 1 0 0 0 0 1
OUT Puerto 2 1 1 1 0 0 0 1 0
MOV B,A 0 1 0 0 0 1 0 0
MOV A,B 0 1 0 0 0 0 0 1

La escritura de programas eficientes está relacionada con los recursos que ofrece
la CPU, por ejemplo la cantidad de registros internos accesibles por el programador, y
por supuesto con la diversidad de instrucciones del μP. Si un procesador no dispone de
instrucciones de multiplicación, cuando se requiera realizar esta operación debe escri-
birse una rutina de producto en base a instrucciones de sumas y desplazamientos.

La máquina que se sintetiza, al ser un recurso didáctico, presenta serias deficien-


cia en lo relacionado con la cantidad de instrucciones disponibles. Aún cuando el obje-
tivo de esta sección no es obtener un µP real, conviene introducir nuevas instrucciones
para mostrar ciertos aspectos característicos de sistemas del mundo real. Para esto, su-
ponga que se desea realizar un programa que ejecute la suma de dos números binarios
Introducción al Microprocesador 77

obtenidos del teclado primitivo conectado al periférico 1 y luego al resultado obtenido


se le debe agregar una constante, digamos 2BH. Como este valor constante debe sumar-
se los datos de entradas, se introduce una nueva instrucción que cargue un dato de 8 bits
en el registro acumulador. De esta forma, esta constante puede ser sumada al resultado
de la operación precedente N1+N2. Tal instrucción está presente en el conjunto de ins-
trucciones de cualquier procesador y se denomina mover inmediatamente un dato, o
MVI dato.

MVI dato (A)←(dato) 110???00


Código de operación 110
Operando destino 00
Dato PC+1

Fig. 3.36. El operando dato de MVI dato se carga en la siguiente posición de memoria

La nueva instrucción de carga inmediato se usa en el siguiente programa para


realizar la suma N1 + N2 + 43.

Dirección Contenido de la memoria Comentario


Binario Nemónico

0 10100001 in 01 ; (A)←(int.)
1 01000100 mov b,a ; (B)←(A)
2 10100001 in 01 ; (A)←(int.)
3 00100000 add ; (A)←(A+B)
4 01000100 mov b,a ; (B)←(A)
5 11000000 mvi 2BH ; (A)←(43)
6 01001011
7 00100000 add ; (A)←(A+B)
8 11100010 out2 ; (LEDs)←(A)
9 xxxxxxxx

Fig. 3.37. Este programa introduce dos números a la CPU desde los interruptores, los suma y luego adi-
ciona una constante al resultado.

Cada una de las instrucciones del programa 1 ocupa una posición de memoria
como ilustra la figura 3.21, mientras que en el caso de la rutina anterior se aprecia con
claridad que MVI A, 43 usa las posiciones 5 y 6 de la memoria del sistema. De modo
que es una instrucción de dos bytes, el primero contiene el código de la instrucción com-
puesto del OC (110) y del código del registro destino (00); y el segundo byte correspon-
de al dato de 8 bits a ser almacenado en el acumulador. El decodificador de direcciones
se diseña para el reconocimiento de instrucciones multibyte, por lo cual al decodificar el
código de la instrucción MVI entregado por el IR, entiende que el contenido de la
próxima posición corresponde a un dato, no a una instrucción, y que debe ser cargado en
Introducción al Microprocesador 78

el registro acumulador. Desafortunadamente la inteligencia del decodificador de instruc-


ciones, como la de la mayoría de las personas y máquinas, tiene un límite.

¿Qué sucede cuando la CPU obtiene el byte almacenado en la posición 9 de la


memoria? Es evidente que no existe forma alguna de distinguir en una memoria si el
patrón de unos y ceros es un dato o una instrucción. En la posición 9 puede existir cual-
quier cosa, una instrucción no programada, inexistente o simplemente basura. Cuando el
PC se incremente hasta está dirección el μP intentará procesar esta información con re-
sultados imprevisibles. El problema es que no existe una instrucción que permita señalar
cuando finaliza el programa. Una solución parcial a esta dificultad es introducir una ins-
trucción de salto que permita alterar la ejecución secuencial del programa. Se trata de
cambiar el contenido del PC, de modo que cuando sea ejecutada produzca que el control
del programa sea bifurcado a otra instrucción, según las necesidades específicas del al-
goritmo programado.

Así, se introduce la instrucción JMP dirección, en la cual el operando corres-


ponde a una dirección. El resultado de la ejecución es un salto incondicional a la posi-
ción de memoria especificada por el operando dirección, el cual señala la localidad de
memoria que contiene la próxima instrucción que debe ser ejecutada.

JMP dirección PC ← (dirección)

DIRECCIÓN NEMÓNICO
0 in 01
1 mov b,a
2 in 01
3 add
4 mov b,a
5,6 mvi a,43
7 add
8 out 02
9,10,11 jmp 0000

Fig. 3.38. La instrucción de transferencia JMP permite al programa operar en un lazo.

Es pertinente aclarar el panorama oscurecido por la introducción de la instrucción


de salto en el programa de la figura 3.38. El operando que acompaña a JMP, la dirección
de salto, está formado por dos bytes, lo cual implica que JMP dirección es una instruc-
ción de tres bytes. El código de la instrucción lo especifica el primero de ellos, los dos
restantes señalan la dirección.

Un lector inquieto habrá entendido que JMP 0000 ha creado un lazo infinito, esto
significa que la máquina ejecuta el programa continuamente esperando por la introduc-
ción de operandos desde el teclado, sumando e indicando el resultado hasta que, como
una posibilidad, se le desconecte la alimentación. Aun aplicando al μP un pulso de RE-
SET, el lazo se mantiene. Este modo de operación es resultado del hecho que la unidad
Introducción al Microprocesador 79

de control de la máquina solo dispone de dos modos de operación: búsqueda y ejecu-


ción.

DIRECCIÓN CONTENIDO DE LA MEMORIA COMENTARIOS


Binario Nemónico
0 10100001 in 01 ; (A)←(Int.)
1 01000100 mov b,a ; (B)←(A)
2 10100001 in 01 ; (A)←(Int.)
3 00100000 add ; (A)←(A+B)
4 01000100 mov b,a ; (B)←(A)
5 11000000 mvi 43 ; (A)←(43)
6 00101011
7 00100000 add ; (A)←(A+B)
8 11100010 out 02 ; (LEDs)←(A)
9 10000000 jmp 0000 ; (PC) ←(0000)
A 00000000
B 00000000

Fig. 3.39. La instrucción JMP tiene como operando la dirección de la próxima instrucción a ejecutar.

Si se permite al μP tener un modo adicional de funcionamiento en el cual se de-


tenga toda operación, sería posible para la ejecución de un programa en cualquier punto.
La CPU entrará en el modo de HALT (parada), como respuesta a la ejecución de una
instrucción nueva con nemónico HLT, la cual carece de operandos. El modo HALT se
comprende mejor haciendo referencia al diagrama de transición de la figura 3.40, donde
se muestren los 3 modos de operación de la sección de control del μP.

reset

HALT

reset HLT

Búsqueda Ejecución

Fig. 3.40. Modos de operación del microprocesador

Con energía aplicada y liberado del estado de reset, la CPU busca y ejecuta la
secuencia de instrucciones en memoria, en caso que la instrucción obtenida corresponda
a HLT, el μP entrará es un estado de parada del cual solo saldrá al activarse la línea de
RESET. Sustituyendo la instrucción de salto a al dirección cero en el programa de la fi-
gura 3.39, se asegura que el μP cesará de funcionar cuando ejecute la instrucción HLT
almacenada en la dirección 9.
Introducción al Microprocesador 80

0 A1 in 1 ; (A)←(Int.)
1 44 mov b,a ; (B)←(A)
2 A1 in 1 ; (A)←(Int.)
3 20 add ; (A)←(A+B)
4 44 mov b,a ; (B)←(A)
5 B0 mvi a,43 ; (A)←(43)
6 2B
7 20 add ; (A)←(A+B)
8 E2 out 2 ; (LEDs)←(A)
9 00 hlt ; Parar

Fig. 3.41. Los códigos de instrucción son más fácil de manejar si se expresan en hexadecimal.

El conjunto de instrucciones del μP con los nuevos miembros MVI dato, JMP di-
rección y HLT es el de la tabla 3.7.

Tabla. 3.7. Conjunto de instrucciones del µP hipotético.


Instrucción Operando hex D7 D 6 D5 D4 D3 D2 D1 D0
ADD 20 0 0 1 0 0 0 0 0
SUB 60 0 1 1 0 0 0 0 0
IN Puerto 1 A1 1 0 1 0 0 0 0 1
OUT Puerto 2 E2 1 1 1 0 0 0 1 0
MOV B,A 44 0 1 0 0 0 1 0 0
MOV A,B 41 0 1 0 0 0 0 0 1
MVI dato C0 1 1 0 0 0 0 0 0
JMP dirección 80 1 0 0 0 0 0 0 0
HLT 00 0 0 0 0 0 0 0 0

Instrucciones no soportadas

En este punto ha finalizado la síntesis de la máquina hipotética y se supone que la


tabla 3.7 muestra el repertorio de instrucciones definitivo del µP. Esto sólo significa que
el diagrama de la figura 3.30 ilustra como se organizan los componentes de un µP típico
y que la tabla 3.7 presenta las instrucciones que permiten realizar la tarea especificada al
inicio de esta sección. En modo alguno estamos en presencia de una CPU completamen-
te funcional. Para completar la síntesis de la máquina de 8 bits se debe realizar la inter-
conexión del µP a la memoria y a los puertos de E/S. Antes de proceder a presentar el
diagrama final de la máquina se describen un tipo de instrucción que no pertenece al
juego de instrucciones del µP sintetizado pero que son de interés práctico.

Estas son las instrucciones de salto condicionales en las cuales la ruptura de la


secuencia del programa se ejecuta solo si se cumple una determinada condición previa.
En otras palabras la CPU solo cambia el contenido del PC en función del resultado de
una prueba que evalúa el cumplimiento de cierta condición. Si tal condición no es satis-
fecha el programa ejecuta la próxima instrucción en memoria.
Introducción al Microprocesador 81

Las banderas a probar son bits de un registro especial de la CPU denominado


registro de condición de estados o registro de banderas, el cual forma parte de la arqui-
tectura interna del μP y es accesible por el programador. Los bits de este registro son
activados por la ALU de acuerdo con el resultado producido por una determinada opera-
ción lógica o aritmética. La figura 3.42 muestra la conexión del registro de condiciones a
la ALU, y los bits de banderas típicos. Los cinco bits definidos para el registro banderas
son los mismos que se encuentran en el microprocesador 8085A.

Registro A Registro B

Unidad
Lógica y
Aritmética
Registro de banderas

Fig. 3.42. El registro de estados permite la ejecución de instrucciones condicionales.

Los estados que se asignan a las banderas están relacionados, como se dijo, con
el resultado de una operación aritmética o lógica, de modo que dependen del contenido
del acumulador después de la ejecución ADD o SUB, en este caso.

Tabla 3.8 Condiciones del registro de banderas.


BANDERA ESTADO Se produce si:
Acarreo CY = 1 Hay desborde desde el bit 7 del acumulador
Acarreo auxiliar AC = 1 Ocurre desborde desde el bit 3 de A
Signo S=1 A7 = 1
S=0 A7 = 0
Cero Z=1 (A) = 00000000
Z=0 (A) ≠ 00000000
Paridad P=1 El número de bits en 1 en A es par.
P=0 La suma de los bits en 1 en A es impar.

Debido a que cuando se describa la arquitectura del μP8085A se insistirá sobre


este tema, por ahora se limita el análisis a la función de la bandera de acarreo CY. Por
ejemplo, si se desea realizar la operación aritmética 19110 + 110 = 192 10, los valores bi-
narios en los registros conectados a las entradas a la ALU deben ser: (A) = 101111112 y
(B) = 000000012. La ejecución de la instrucción de suma ADD produce como resultado
(A) = 110000002. El lector puede verificar que no ocurre desborde del bit 7 del acumu-
lador, siendo la bandera CY =0.
Introducción al Microprocesador 82

Si la operación a realizar ahora es 19110 + 6610 = 25710, los registros de operan-


dos a las entradas de la ALU contendrán: (A) = 101111112 y (B) = 010000102. Luego
de ejecutar la instrucción ADD, el contenido del acumulador es (A) = 000000012, resul-
tado obviamente incorrecto. El problema estriba en que ADD ejecuta la suma de dos
números y almacena el resultado en los 8 bits del A, a pesar que la solución correcta al
problema contiene 9 bits.

1 0 1 1 1 1 1 1 A

+ 0 1 0 0 0 0 1 0 B

1 0 0 0 0 0 0 0 1

Recuerde que con un patrón de ocho unos y ceros, el mayor número de-
cimal que puede expresarse es (28 - 1) = 25510, mientras que el resultado correcto de la
suma es 25710: 1000000012 = 1x28 + 0x27 + 0x26 + 0x25 + 0x24+ 0x23 + 0x22 + 0x21 + 1x20 = 25710.
Al ocurrir un desborde del bit 7 del A, la ALU lo indica con CY =1. Las instrucciones
típicas de salto condicional y cuya ejecución depende de la bandera de acarreo son,

JC dirección Salto a dirección si CY =1

JNC dirección Salto a dirección si CY =0

Además de realizar operaciones aritméticas la ALU debe estar en capacidad de


ejecutar operaciones lógicas. Una instrucción lógica típica es ANA, la cual realiza la
función lógica AND, bit a bit, entre el registro B y el registro A. Si (A) = 11010011 y
(B) = 01100010, al ejecutar ANA, la ALU transfiere al acumulador (A) = 01000010.
Posteriormente se detallan aplicaciones de las instrucciones lógicas.

DIRECCIÓN
(hex)
0000 in 01 ; operando 1 al acumulador
0002 mov b,a ; (b) ←(a)
0003 in 01 ; operando 2 al acumulador
0004 add ; (a) ← (a) + (b)
0005 jc 0000 ; si cy = 1 se inicia el programa
0008 mov b,a ; si cy =0 , (b) ←(a), resultado parcial en b
0009 mvi a,43 ; (a) ← (43)
000B add ; (a) ← (b) + (43)
000C jc 0000 ; si cy = 1 se inicia el programa
000F out 02 ; si cy = 0 se presenta resultado final.
0010 hlt ; parar

Fig. 3.43. Programa que usa instrucciones de salto condicional

El programa de la figura 3.43, muestra en forma sencilla el uso de JC. El resulta-


do de la suma solo se presenta si no ocurre acarreo. Si CY = 1, el programa volverá al
inicio, a pedir el operando 1. Una suma de números binarios de 16 bits puede realizarse
usando a CY para que el acarreo resultante de la suma de dos bytes, se incluya en la adi-
Introducción al Microprocesador 83

ción de los dos bytes siguientes. Los códigos de las instrucciones ANA, JC y JNC no se
asignaron, observe que tres instrucciones adicionales incrementa a 11 el numero de ins-
trucciones que puede ejecutar la CPU, de modo que no es posible considerar que los 3
bits más significativos del código de instrucción representan el código de operación. Los
bits del OC deben extenderse a cuatro (D7-4).

Diagrama final del microprocesador sintetizado.

El diagrama funcional terminado de la máquina de 8 bits sintetizada se presenta en


la figura 3.44, donde se incluyen los buses de direcciones, de datos y el bus interno de la
CPU. Las instrucciones y datos provenientes de la memoria y la información que se
obtiene o se entrega a los periféricos de E/S, circulan por un bus de datos externo co-
mún. El μP mediante señales de control de lectura y escritura en memoria y puertos de-
termina el destino final de la información.

Fig. 3.44. Diagrama simplificado de un sistema μC = μP + Memoria + E/S


Introducción al Microprocesador 84

La arquitectura interna de la CPU de la figura 3.44 está compuesta por unidades


funcionales similares a las de una unidad central de procesamiento típica, mientras que
la máquina en conjunto constituye un verdadero μC al disponer de CPU, memoria y
puertos de E/S.

Las señales de entrada y salida al microprocesador.

Los componentes del microcomputador se comunican por medio de grupos de lí-


neas de interconexión o bus. Los μPs no usan el mismo principio de los computadores
grandes para la comunicación con el exterior. Para contribuir a la reducción del espacio
ocupado por el sistema, se utilizan canales de comunicación comunes para todas las uni-
dades. En un sistema con estructura de bus único sólo un dispositivo a la vez podrá
transferir información hacia o desde el CPU. Un intento de comunicación simultánea
creará conflictos y el inevitable deterioro de la información.

De acuerdo con la función que cumplen y con el tipo de información que condu-
cen, los buses son de tres tipos: Datos, Direcciones, y Control, y se caracterizan por: el
ancho del bus o número de líneas que lo forman, el sentido de conducción (unidirec-
cionales o bidireccionales), y el tipo de función que cumplen las señales que portan
(datos, direcciones o control). En la figura 3.45 se presentan los símbolos más usados
para representar un bus en diagramas eléctricos.

Conexión explicita Unidireccional Bidireccional

Fig. 3.45. Símbolos de líneas de interconexión

El Bus de Datos (D0-D7) es bidireccional pero no puede transmitir en ambos sen-


tidos simultáneamente. Es el canal que permite el flujo de información desde el μP
hacia la memoria y los puertos de E/S, y desde estos hacia el μP. El ancho del bus de
datos lo define generalmente (el 8088 es una excepción) el formato de las instrucciones
y datos que usa la máquina. Es común distinguir la arquitectura de la máquina señalando
el ancho de este bus, de modo que un μC de 8 bits contiene un μP con bus de datos con
igual número de bits.
Introducción al Microprocesador 85

El Bus de Direcciones (A0-A15) es unidireccional, solo conduce información


proveniente del μP, la cual indica la dirección de memoria o puerto de E/S, hacia donde
debe transferirse o desde donde se obtienen los datos que circulan por el bus de datos.
Como se mencionó el ancho del bus de direcciones define la capacidad de memoria de la
máquina. El μP tendrá acceso a un máximo de 216 (65536) posiciones de memoria, debi-
do a que el bus de direcciones es de 16 bits.

El bus de Control ( RD , WR , IO/M , RESET, y READY) lo conforman líneas de en-


trada o salida a la CPU y lo constituyen las señales que sincronizan las operaciones del
μP. Controla el sentido de la transferencia por el bus de datos, indicando si la transmi-
sión es hacia o desde la memoria o puerto de E/S. Generalmente está constituido de 10 ó
más líneas, dependiendo del procesador. La definición de la función que realiza cada
uno de los terminales del μP se especifica en la Tabla 3.9.

Tabla. 3.9 Funciones de las señales del μP de la figura 3.44.


VCC +5V
VSS Tierra
CLK Entrada de reloj al microprocesador
RESET Entrada que pone en cero el contador de programa.
A0-A15 Bus de direcciones del microprocesador.
D0-D7 Bus de datos de la CPU
Indica que el μP desea leer la localización de memoria o dispositivo de E/S
RD seleccionado. Además avisa que el bus de datos está disponible para realizar la
transferencia.

Señala una salida válida de datos en el bus de datos. Indica que la información
WR presente en el bus de datos ha de ser escrita en la posición de memoria o dispo-
sitivo de E/S seleccionado.
IO/M Distingue si la operación de lectura o escritura se realiza sobre la memoria o
puerto de E/S.
Si tiene nivel lógico alto durante la ejecución de las instrucciones IN puerto y
OUT puerto, indica que la memoria o dispositivo de E/S está listo para recibir o
transferir datos.
READY
Si presenta nivel bajo, el procesador esperará un número entero de ciclos de
reloj para que READY vaya a nivel alto y completar el ciclo de lectura o escri-
tura de E/S.

Los primeros microprocesadores de 8 bits (8080, Z80, y 6800) que dominaron el


mercado se fabricaban en un encapsulado de 40 terminales en dos líneas de 20 pines
cada una. Con la intención de realizar comparaciones entre el número y funciones de las
líneas de entrada y salida de un μP comercial del tipo de los mencionados, y el de la fi-
gura 3.44, se deja volar la imaginación y se procede a integrar el μP en un encapsulado
del tipo DIP 40.
Introducción al Microprocesador 86

Las 34 señales del μP se distribuyen en el encapsulado en forma arbitraria como se


muestra a la izquierda de la figura 3.46, los 6 terminales restantes del CI se consideran
no conectados. A la derecha se ofrece un diagrama de la CPU donde se agrupan las lí-
neas en los tres buses típicos de un μP.

BUS DE
BUS DE
CONTROL
DIRECCIONES

μP

BUS DE
DATOS

μP

Fig. 3.46 Configuración de terminales y buses del microprocesador.

Las 16 líneas de direcciones, las 8 de datos, las 2 de alimentación, y el reloj del


sistema están presentes en todos los μPs mencionados y ocupan 27 terminales del encap-
sulado. El bus de control está constituido por 7 señales, 2 de las cuales (RESET y READY )
se usan para el control de la CPU, mientras que las restantes ( IO/M , RD , WR ,S0 y S1)
está destinadas al control del sistema.

Se ha establecido que un μP de uso práctico debe contar con al menos 10 señales


de control para cumplir con todas las funciones relacionadas con para la operación de un
microcomputador. Esto significa que alguna señales de importancia están ausentes en el
μP desarrollado, debido a que en beneficio de la sencillez se han omitido ciertas entradas
y salidas. Para control de acceso directo a memoria y aceptación de interrupciones un μP
típico destina por lo menos 4 entradas. En general los μPs disponen de señales que cum-
plen funciones similares en formas diferentes. El Z80 por ejemplo usa 4 señales: RD ,
WR , IOREQ , y MREQ para las funciones que el μP de la figura 3.46 realiza con solo 3:
IO/ M , RD , y WR . Se puede concluir que el μP desarrollado en forma descriptiva dispo-
ne de la mayoría de las entradas y salidas que se encuentran en un μP comercial, excep-
tuando el control de interrupciones y DMA, tópicos a discutir más adelante.

3.2.2 EL SISTEMA MICROCOMPUTADOR

Considerando el modo de operación de un microcomputador práctico, son múlti-


ples las omisiones o simplificaciones que se han realizado a lo largo de esta sección in-
Introducción al Microprocesador 87

tentando exponer de modo sencillo el funcionamiento de las unidades internas del μP y


los dispositivos asociados.

En μCs reales los procedimientos descritos para el acceso a la memoria y a los


puertos del µP no son tan simples como los expuestos. Con relación a la operación con-
junta del μP y la memoria del sistema no se presentaron detalles sobre como el procesa-
dor selecciona la posición a la cual desea tener acceso.

Las direcciones de memoria

Sí el dispositivo de memoria SRWM de ½ Kbytes de la figura 3.20 se acopla di-


rectamente al μP, conectando las líneas de direcciones de la memoria a los terminales de
dirección correspondientes del μP, no sería posible la expansión futura de la memoria
del sistema. Un μP de 8 bits con 16 líneas de direcciones puede tener acceso hasta un
máximo de 65536 celdas, de modo que el uso de una memoria con 9 entradas de direc-
ciones acoplada directamente al sistema representa el desperdicio del 99.68 % de la ca-
pacidad de memoria del procesador.

A primera vista pudiese parecer que la solución estaría en usar circuitos integra-
dos con mayor capacidad de almacenamiento, pero antes conviene considerar que a pe-
sar que el procesador ve un espacio único para toda la memoria del sistema, lo usual es
que aun en aplicaciones simples sea necesario el uso de más de un chip para organizar el
subsistema de memoria. También es común que los puertos de E/S del sistema sean tra-
tados como posiciones de memoria con la finalidad de aprovechar la potencialidad del
relativo gran número de instrucciones del μP que hacen referencia ala memoria.

Un microcomputador requiere un área de memoria capaz de retener los datos aun


luego de retirarle la energía, este espacio contiene el programa almacenado y es conoci-
do como la memoria de solo lectura (ROM). Es común que el espacio de ROM se gene-
re usando un solo circuito integrado. En contraposición, para organizar la zona de me-
moria de lectura/escritura (RWM) usada para almacenamiento temporal de datos y resul-
tados, puede ser necesario un arreglo de paralelo o serie de dos o más dispositivos. Esto,
debido a que los circuitos disponibles no son de la capacidad que exige las especifica-
ciones del sistema en desarrollo, o bien porque la longitud de la palabra del CI es menor
a 8 bits.

Un CI de memoria de 8 Kbytes tienen 8192 celdas con direcciones físicas comu-


nes desde 0000H hasta 1FFFH. En una aplicación que requiera esta capacidad para la
ROM y para la RAM, se encuentra que las líneas A0-A12 del bus de direcciones del μP
estarán conectadas a las entradas correspondientes de ambos chips. Si no se provee al
sistema de algún medio para acoplar eléctricamente al bus de datos solo un dispositivo a
la vez, un intento de leer un dato en la localización 01FFH, o en cualquier otra, tendrá
resultados imprevisibles debido existen dos celdas con la misma dirección. La solución
práctica para que la CPU distinga y tenga acceso a solamente la dirección seleccionada
consiste en usar un decodificador de direcciones de memoria. Tal circuito digital sec-
Introducción al Microprocesador 88

ciona el espacio de 64 Kbytes en bloques de rango especificado y asigna cada una de las
particiones a la ROM y a la RWM del sistema de acuerdo con lo establecido en la fase de
diseño del sistema. Una representación gráfica de las zonas asignadas a cada dispositivo
o grupo de éstos se conoce como el mapa de memoria del sistema, mostrándose en a
figura 3.47 el correspondiente a un sistema que tiene 8 K de ROM y 4 K de RWM.

DIRECCIÓN DATOS

0000 0010000000000000
. .
. . 8 K ROM
. .
1FFF 1010111110110111
2000 0010000000000000
. .
. . 16 K libre
. .
5FFF 0101111111111111
6000 111111111110000
.
. . 4 K RWM
. .
6FFF 0101111111111111
7000 0101111111111111
. .
. . 36 K libre
. .
FFFF 111111111111111

Fig. 3.47 Localización del área de memoria ROM y RWM en el espacio de direcciones del μP

En la máquina hipotética no tenemos memoria ROM, sólo disponemos de una


memoria de 512 bytes con una pila interna para retener los datos del programa, sin im-
portar como éste es cargado en la memoria. A continuación se diseña el de decodificador
de memoria del sistema.

El objetivo es generar una señal de selección del chip de memoria llamada MEM
y activa en nivel bajo, cuando en el bus de direcciones esté un valor dentro del rango de
direcciones de la memoria y cuando se realice una operación de búsqueda. Como solo
existe un dispositivo de memoria de 512 bytes el diseño de un decodificador es directo.
En el rango de direcciones del dispositivo (0000H-01FFH) las líneas A9 hasta A15 están
siempre en estado bajo, como se puede observar en la zona más oscura de la tabla de la
tabla 3.10, y además durante la realización de una operación sobre la memoria la señal
de control IO/ M será cero lógico.
Introducción al Microprocesador 89

Esta combinación solo se presenta cuando el μP desea acceso a la RWM, por lo


cual puede usarse para generar la señal de selección de memoria MEM , la cual se aplica
a la entrada de habilitación CS del circuito integrado. La señal MEM responde a la la
ecuación lógica,

MEM = A 15 + A 14 + A 13 + A 12 + A 11 + A 10 + A 9 + IO/ M

Tabla. 3.10 Estados de las líneas de direcciones del μP en el espacio de 64 K.


Dirección A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0000H 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0001H 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

01FEH 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0
01FFH 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
0200H 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0201H 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1

FFFEH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
FFFFH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Se deduce por inspección que si cualquiera de las líneas de direcciones que inter-
vienen en la ecuación está en nivel alto, la dirección en el bus no corresponde a una po-
sición de la memoria del sistema permaneciendo MEM en estado alto, deshabilitando la
memoria. Así mismo cuando IO/ M esté en uno lógico, lo cual ocurre cuando el μP rea-
liza una operación de lectura/escritura sobre un puerto de E/S, el estado lógico de MEM
será uno. El circuito del decodificador de direcciones de memoria se muestra en la figura
3.48.

Fig. 3.48 decodificador de direcciones de la memoria RWM de 512 Bytes


Introducción al Microprocesador 90

Las direcciones de los puertos

El circuito decodificador de puertos debe generar dos señales: la primera PEO1


para habilitar los buffers que conectan los interruptores de entrada al bus de datos del µP
como ilustra la figura 3.10; la segunda PS02 para cargar en el registro paralelo de la fi-
gura 3.15 el resultado de la suma.

El circuito decodificador de direcciones de puertos tiene como tarea la identifica-


ción y seleccionar el circuito de puerto con el cual el μP intenta establecer comunicación
cuando ejecuta las instrucciones IN puerto 1 y OUT puerto 2. Como indica la tabla 3.2
los dos bits menos significativos del código de instrucción representan la dirección del
puerto. Durante una transferencia de datos hacia o desde un puerto la señal de control
IO/ M permanece en estado lógico alto, si la instrucción en ejecución es IN puerto 1 se
activa RD , mientras que si es OUT puerto 2 WR va a cero. En ambos casos el número
del puerto aparece en los bits A1 y A0 del bus de direcciones.

En la tabla 3.11 se resumen los estados de las señales que intervienen en un ciclo
de transferencia de datos al puerto de entrada 01 y al puerto de salida 02.

Tabla. 3.11 Estados de las señales de control del


μP durante una operación de E/S.
Operación IO/ M RD WR A1 A0
Entrada 1 0 1 0 1
Salida 1 1 0 1 0

Como en el sistema solo existen dos periféricos se pueden generar dos señales de
selección de puertos: PEO1 para el puerto de entrada 01 y PS02 para el puerto de salida
02. De la tabla 3.11 se deduce por simple inspección el circuito digital para obtener am-
bas señales.

Fig. 3.49 Circuito de selección de los puertos de E/S

El procedimiento usado para identificar los puertos se conoce como método de


selección lineal y limita a cuatro (2 de entrada y 2 de salida) el número de puertos posi-
bles de habilitar. Para extender a 8 puertos la capacidad de la estructura de E/S del μC se
usa un CI 74LS139, el cual contiene dos decodificadores binarios 2 a 4.
Introducción al Microprocesador 91

Tabla. 3.12 Tabla de estados del 74LS139


G B A Y3 Y2 Y1 Y0
1 x x 0 1 1 1
0 0 0 1 1 1 0
0 0 1 1 1 0 1
0 1 0 1 0 1 1
0 1 1 0 1 1 1

La tabla 3.12 indica que con la entrada G está en estado bajo la salida yk estará
en nivel bajo si el número entero representado por la entrada B A es igual a k. La figura
3.50 muestra el diagrama eléctrico del decodificador de 4 puertos de salida y 4 de entra-
da. Observe que las señales intermedias a las salidas de las puertas NAND ( IOR y IOW )
pueden usarse para la habilitación de puertos en una aplicación que incluya un periférico
de entrada y uno de salida.

Finalmente, la figura 3.51 ilustra el diagrama del circuito final del μC. Los puer-
tos de E/S del sistema final son decodificados usando el método de selección lineal

Fig. 3.50 Decodificador de 4 puertos de entrada y 4 de salida

3.3 ARQUITECTURA DE UN μP DE 8 BITS MÁS VERSÁTIL

El microprocesador hipotético puede considerarse una aproximación aceptable de un


μP debido a que contiene las unidades funcionales características de un μP típico de 8
bits. No obstante es conveniente aclarar que al ser usado como recurso didáctico para
introducir al estudiante en forma amigable y rápida en el mundo de los microprocesado-
res fue necesario simplificar el análisis e incluso omitir ciertos aspectos operativos fun-
damentales para el funcionamiento de dispositivos reales. El autor considera que esta
altura del texto el lector conoce los principios básicos sobre la arquitectura y funciona-
miento del microprocesador y la forma de combinarlos con otros dispositivos LSI para
ensamblar un microcomputador primitivo. El propósito de este capítulo, que se supone
cumplido, fue introducir en forma resumida la mayor cantidad de tópicos relacionados
Introducción al Microprocesador 92

Fig. 3.51 Microcomputador de 8 bits con 512 bytes de memoria RWM y 1 puerto de entrada y 1 de salida.
Introducción al Microprocesador 93

con el área sin tener que esperar el avance por capítulos para la introducción de nue-
vos conceptos.

En estas páginas iniciales se exponen principios elementales como el funcio-


namiento de la ALU y la forma en que establece comunicación con los registros inter-
nos, hasta conceptos algo más elaborados como la introducción de estados de espera.
A partir de aquí se reforzaran en forma sistemática y detallada los conceptos aprendi-
dos y se capacita al estudiante para el análisis y diseño de μCs ensamblados usando
circuitos integrados y dispositivos electrónicos comerciales.

El microprocesador hipotético presenta ciertas limitaciones ausentes en μP


comerciales. En primer lugar tiene solo dos registros internos: el acumulador usado
para contener un operando y el resultado en cualquier operación realizada por la ALU
y el registro B donde se almacena el segundo operando. Un μP real contiene uno o
más acumuladores y un banco de registros para propósito general usados para alma-
cenamiento temporal de datos y como operandos en la ejecución de instrucciones que
usen la ALU. Un número reducido de registros internos de uso general representa un
serio obstáculo para la escritura de programas eficientes debido a que estos registros
permiten a la ALU funcionar a gran velocidad ya que toda transferencia de datos tie-
ne lugar en el interior del μP, sin requerirse hacer referencia a la memoria externa.
Los microprocesadores modernos con arquitectura RISC tienen al menos 32 registros
internos. En segundo termino, solo se especificaron algunas señales para control de la
máquina como RESET y READY , y RD , WR , IO/M , S0 y S1 para control de los disposi-
tivos del sistema.

Fig. 3.52 Arquitectura de un microprocesador típico de 8 bits


Introducción al Microprocesador 94

En la figura 3.52 se presenta un diagrama funcional de un microprocesador de


8 bits con arquitectura similar a un μP comercial típico. Observe que exceptuando el
banco de registros y los registros buffers usados para conectar las líneas de datos y
direcciones al exterior del μP, todos los demás elementos están contenidos en la CPU
de la figura 3.52. De modo que el lector puede considerarlo como una simple exten-
sión de la CPU sintetizada en el capítulo anterior.

Aunque cada fabricante produce μPs con arquitectura ligeramente distintas, al


ser los principios de funcionamiento iguales para todo μP (de 8 bits), basta con fami-
liarizarse con el modo de operación de uno, para entender con facilidad el funciona-
miento de cualquier microprocesador.

El μP de la figura 3.52 tiene un acumulador y un banco de registros de 8 bits


para propósito general, denominados: B, C, D, E, F, y G. El registro de 16 bits
Apuntador de Pila (SP), mantiene la dirección tope de un área especial de memoria
administrada por programa, llamada el Stack (pila), la cual se describe posteriormen-
te.

El grupo de registros lo completa el Contador de Programa (PC), el Regis-


tro de Direcciones de Memoria (MAR), ambos de 16 bit, y un circuito lógico para
Incremento/Decremento de Direcciones, el cual permite el enlace automático de las
instrucciones del programa. Cada vez que se busca el contenido de una posición de
memoria, el contenido del PC y del MAR se incrementa en 1, apuntando a la si-
guiente posición de memoria. El MAR se conecta al exterior por medio de un regis-
tro buffer de 16 bits, el cual es el origen del Bus de Direcciones (A0 - A15). El Regis-
tro/Buffer de Datos está conectado al Bus Interno de Datos del μP, y sus salidas
son el Bus Externo de Datos (D0 - D7).

La Unidad Lógico Aritmética se observa a la derecha del esquema. Las en-


tradas a la ALU son el registro A y uno de los registros de uso general. Esto permite
la existencia de la instrucción ADD E, por ejemplo, la cual suma el contenido de los
registros A y E, y deposita el resultado de la operación en el acumulador. La conexión
de un registro determinado a la entrada de la ALU lo realiza un multiplexor omitido
en el diagrama. La ALU también controla el Registro de Condiciones o Banderas
(flags), el cual contiene las banderas Z, S, AC, P, y CY.

Analizar un microprocesador genérico es difícil. En párrafos anteriores se es-


tablece que procesador está compuesto de tres bloques fundamentales: un banco de
registros, la ALU, y la unidad de control. La sección de temporización y control lógi-
co es una unidad realizada por hardware, cuya función es sincronizar y controlar
todas las operaciones que se realizan dentro de la CPU. La unidad de control usa el
reloj del sistema para sincronizar la búsqueda y ejecución de las instrucciones, gene-
rando señales de control que gobiernan toda acción realizada por el μP. La sección
de control tiene como entradas:
Introducción al Microprocesador 95

• El reloj del sistema,

• Líneas externas de control para alterar o interrumpir la secuencia del pro-


grama, tales como RESET, READY , y otras aun no mencionadas, y

• Las salidas de la sección formada por el Decodificador de Instrucciones y el


Codificador de Ciclos de Máquina (llamado decodificador de estados en la
figura 3.44), que portan información sobre la instrucción bajo procesamien-
to, la cual es usada por la unidad de control para generar las señales exter-
nas para manejo de memoria y dispositivos de E/S, y señales internas para
el control de la ALU y la transferencia entre registros de la CPU, estando
toda operación sincronizada por el reloj maestro del sistema.

En general, es algo complejo separar los distintos elementos de la CPU en los


tres bloques básicos debido a la estrecha relación que existe entre ellos, no obstante
puede considerarse que el diagrama de la figura 3.52 reproduce en forma adecuada,
desde el punto de vista funcional, la estructura interna de un μP, y lo que es más im-
portante desde el punto de vista didáctico, no introduce contradicción alguna con los
resultados del proceso de síntesis de la máquina hipotética.

El bus interno de datos

Un elemento de vital importancia para distinguir la arquitectura de un μP es el núme-


ro de buses internos usados para la transferencia de datos entre los registros y la ALU.

Fig. 3.53 Arquitectura de bus doble

El diagrama de la figura 3.53 corresponde a una sección del μP PACE fabri-


cado por National Semiconductor. Este μP usa una estructura de bus doble. Uno de-
nominado bus de operandos conectado a las dos entradas de la ALU, el otro o bus de
resultados conecta la salida de la ALU con los registros internos donde se deposita el
resultado de la operación lógica o aritmética. Una arquitectura de este tipo mejora el
desempeño del μP porque aumenta la velocidad de ejecución debido a que los ope-
randos y el resultado de la operación se transfieren por vías diferentes. Si el bus de
Introducción al Microprocesador 96

operandos en la figura 3.53 se separa en dos buses de modo que a cada entrada de la
ALU se conecte un bus de datos independiente, se obtiene un μP con arquitectura de
bus triple. El esquema de tal sistema puede verse en la figura 3.54.

Fig. 3.54 Arquitectura de bus triple.

EL μP de la figura 3.52 usa un bus único conectado a las dos entradas de la


ALU. Al existir una sola vía para la transferencia de datos entre los registros y la
ALU, tanto los operandos como el resultado circulan por el bus interno aunque en
tiempos diferentes. Este modo de operación se destaca por su lentitud, mientras que el
principal beneficio que ofrece el uso de un bus simple es la poca complejidad de la
arquitectura del μP y la reducida área que ocupa las ramificaciones del bus interno
en la oblea de silicio, lo cual representa un verdadero ahorro de superficie de integra-
ción.

La baja velocidad de ejecución se debe a que para ejecutar la suma la ALU de-
be realizar tres transferencias en secuencia por el único bus disponible, dos desde los
registros que contienen los operandos hasta cada entrada de la ALU, y una para tras-
ladar el resultado al acumulador. Se supone que las empresas fabricantes de μPs eva-
luaron el compromiso entre la velocidad y el ahorro de superficie de integración y
optaron por esta última, porque la mayoría de los μPs usan un solo bus interno. Aun-
que esta arquitectura es sencilla y ocupa poco espacio en el área de silicio del CI,
presenta problemas de sincronización que afectan la operación de la ALU.

Para ilustrar esta situación considere que la ALU es un circuito combinatorio


de modo que responde de inmediato a cualquier cambio en sus entradas. Suponga que
se carga un valor en el acumulador, el cual está conectado a la entrada izquierda de la
ALU, y se ejecuta la instrucción SUB b. La unidad de control selecciona el registro B
y lo conecta por medio del bus interno a la entrada derecha de la ALU. Al ejecutar la
sustracción el resultado A-B debe cargarse en el acumulador. Cuando el resultado de
la operación aritmética se transfiere por medio del bus de datos hacia el A, el cual
debe estar habilitado, se originan dos problemas serios de sincronización en el interior
del μP. Primero, el resultado no solo se almacena en el A, sino que a través del bus
Introducción al Microprocesador 97

interno alcanza la entrada derecha de la ALU y pasado el retardo de propagación de


los circuitos que forman la ALU la salida de ésta entrega un resultado distinto a la a la
resta (A) - (B).

A Entradas falsas

ALU

Fig. 3.55 Ilustración del problema de sincronización. Las entradas a la ALU son falsas.

En segundo lugar, para hacer más crítico el problema, observe que aun cuando
el A aísla una entrada a la ALU del bus de datos, el hecho que la instrucción de resta
use al acumulador para almacenar el resultado, implica que en el instante que la suma
se deposite en el A, la entrada izquierda de la ALU tendrá un operando no deseado,
por lo cual contribuirá a la obtención de un nuevo y falso resultado.

Fig. 3.56 La CPU ejecuta dos transferencias simultáneas por distintas rutas.

La solución de ambos problemas se muestra en la figura 3.56 y consiste en


usar dos registros para almacenamiento temporal: uno denominado TEMP separa la
entrada derecha de la ALU del bus interno de datos, el otro es un acumulador tempo-
ral para aislar la entrada izquierda de la ALU del acumulador. Ambos registros TEMP
y ATEMP son de uso exclusivo del sistema y son transparentes para el programador.

Ahora, con un valor precargado en el acumulador se ejecuta la instrucción


SUB B: la existencia de los registros adicionales permite que el μP realice dos trans-
ferencias de datos simultáneas, una implica mover el contenido del registro B por el
bus de interno de datos hacia el registro temporal de la entrada derecha de la ALU. El
Introducción al Microprocesador 98

otro, transferir el dato en A al acumulador temporal, y de hecho a la entrada izquierda


de la ALU. Observe que en este flujo paralelo de datos no existe conflicto, dado que
usan diferentes caminos, como se aprecia en la figura 3.57.

Fig.3.57. Para completar la ejecución de SUB B, la salida de la ALU se lleva al acumulador.

3.4 ARQUITECTURA DE UN µCOMPUTADOR ESTÁNDAR


Con los diferentes conceptos introducidos es posible establecer el diagrama
funcional de un μC estándar, recordando que desde el punto de vista didáctico el ob-
jetivo es resolver problemas típicos del ambiente industrial usando la potencia del
μP, más que diseñar equipos de procesamiento de datos. En la figura 3.58 se presenta
el diagrama funcional simplificado de un computador basado en un μP.

El μP dispone de los buses de direcciones, datos, y control, y todo circuito


LSI necesario para una aplicación determinada se conecta a estos tres buses. La única
diferencia entre este esquema y el logrado a partir de la síntesis del μC, es que la
memoria del sistema aparece separada en dos bloques: uno corresponde a la Memoria
de Lectura/Escritura del sistema, o RWM (Read Write Memory), cuyo contenido
puede ser alterado por el usuario de la máquina. En un μC de propósito general el
programa es cargado en esta unidad por medio del teclado, o unidades de discos.
También contiene la información sobre los datos y los resultados de la ejecución del
programa. Este circuito es volátil, lo cual significa que retirarle la energía a la má-
quina, implica la pérdida de la información almacenada en el circuito de memoria.

La ROM (Read Only Memory) es la memoria de sólo lectura del sistema, ni el


usuario ni las instrucciones del computador pueden cambiar su contenido, estas me-
morias se programan durante el proceso de producción. y no es volátil. En μCs para
procesamiento general contiene rutinas para el arranque de la máquina, tales como
rutinas de prueba de memoria, de la fuente de alimentación, y de control de las unida-
des de E/S del sistema. En computadores personales compatibles con el modelo IBM,
una variante de la ROM denominada, almacena el BIOS (Basic Input Output Sys-
tem)de la máquina. A diferencia de las ROM, las EPROM pueden ser programadas,
borradas y reprogramadas, usando equipos de muy bajo costo. En sistemas pequeños
Introducción al Microprocesador 99

de propósito específico, caso en el que se diseña un μC para realizar una tarea especí-
fica, el programa de control escrito por el diseñador se almacena en una EPROM
(Erasable Programmable ROM) Si se requiere fabricar un gran números unidades,
se puede encargar un grupo de ROMs a compañías especializadas, las cuales las pro-
graman en durante el proceso de producción.

La presencia de la RWM en este tipo de μC no es obligada, si la aplicación no


requiere el almacenamiento temporal de datos, puede estar ausente. Esto implica que
el programador no puede hacer uso de la técnica de subrutinas en el desarrollo del
programa ni usar interrupciones. En cualquier caso, los requerimientos de memoria en
la solución de problemas de poca envergadura, es baja, y los circuitos de memoria no
son costosos. Posteriormente se analizaran con más detalle los diferentes tipos de
memoria y su modo conexión al sistema.

Conocido el funcionamiento de una CPU genérica y, por lo menos concep-


tualmente, el de la memoria del sistema, y el modo en que los buses del μP interco-
nectan las diferentes unidades, se considera conveniente presentar la arquitectura de
un μP real, el 8085A, de modo que el estudiante se traslade al mundo real de los mi-
croprocesadores.
Introducción al Microprocesador 100

Fig. 3.58. Arquitectura de un sistema estándar basado en microprocesador.


Arquitectura y Operación del Microprocesador 8085A 101

Arq ui t e c t ura y O p e ra c i ó n d e l μ P

4.1 GENERALIDADES

El 8085A de INTEL es un microprocesador de 8 bits para uso general cons-


truido usando tecnología NMOS. El dispositivo incorpora un generador de reloj in-
terno y es capaz de tener acceso hasta 64 Kbytes de memoria y 256/256 puertos de
E/S. Con este dispositivo puede realizarse un sistema microcomputador mínimo
usando solo 3 circuitos integrados, alimentados con una fuente de poder de +5 V.

La figura 4.1a es una imagen del área de integración de los 20000 transistores
MOS de canal N que componen el circuito del μP. El CI se presenta en un encapsu-
lado tipo DIP-40, mostrado en la figura 4.1b, el cual era el estándar industrial para la
fabricación de circuitos integrados VLSI, durante la década de los 70. El 8085A tiene
un ciclo de instrucción de 1.3 μs, estando disponibles en versiones más rápidas con
códigos 8085A-2, 8085AH, 8085AH-1 y 8085AH-2.

(a) (b)

Fig. 4.1 (a) Foto microscópica del μP8085A. (b) Encapsulado DIP-40
Arquitectura y Operación del Microprocesador 8085A 102

El μP puede ejecutar un conjunto de 74 instrucciones sincronizado por un re-


loj derivado de un oscilador interno, el cual usa un cristal externo de resonancia para-
lela y frecuencia máxima de 6.25 MHz. Esta señal base es dividida por 2 en el inter-
ior del dispositivo para producir el reloj interno que controla todas las operaciones
del 8085A. Una versión avanzada, el 8085A-2 puede operar a 5 MHz con un cristal
de 10 Mhz.

X1 Vcc
X2 HOLD
RESET OUT HLDA
SOD CLK OUT
SID RESET IN
TRAP READY
RST 7.5 IO/M
RST 6.5 S1
RST 5.5 RD
INTR 8085A WR
INTA ALE
AD0 S0
AD1 A15
AD2 A14
AD3 A13
AD4 A12
AD5 A11
AD6 A10
AD7 A9
Vss A8

Fig. 4.2. Disposición de los terminales del microprocesador 8085A

De los 40 terminales, 12 son entradas, 18 salidas, 8 son bidireccionales, y 2


están destinadas a la alimentación del circuito, como ilustra la figura 4.2. La fuente de
poder de +5 V, se aplica los terminales VCC (+) y VSS (-). El cristal de cuarzo se
aplica a la entradas X1-X2. El diagrama de la derecha en la figura 4.2 indica el senti-
do del flujo de información en los terminales del 8085.

Como ilustra la figura 4.2, el 8085 no presenta buses de datos y direcciones


separados. En este μP, mientras que el byte de orden alto de la dirección se presenta
en las líneas A8-A15, los 8 bits menos significativos de la dirección aparecen en los
mismos terminales (AD0-AD7) que el bus de datos. Las funciones de estos ocho pines
se presentan multiplexadas en el tiempo, encargándose la señal ALE (Address Latch
Enable) de indicar a dispositivos externos cuando la información presente correspon-
de a datos o direcciones.

La razón de la aparente complicación que representa el multiplexado de seña-


les está relacionada con el estado de la tecnología de fabricación de circuitos LSI en
la década de los 70. En esa época, como en la actualidad, durante el proceso de pro-
ducción los chips eran probados usando equipos especiales y costosos para garantizar
el correcto funcionamiento del producto final. En los inicios de los setenta, tales ins-
trumentos sólo podían verificar el funcionamiento de circuitos integrados en receptá-
culos de hasta 42 terminales. Esto no significa que treinta años atrás no se fabricaran
CI de más de 40 pines, se hacían de 64 pines, pero su prueba representaba un proceso
engorroso para el fabricante.
Arquitectura y Operación del Microprocesador 8085A 103

Aunque los µPs fabricados hasta ese momento residían en paquetes tipo DIP-
40, las innovaciones con las cuales INTEL acompañó el desarrollo de su nuevo pro-
ducto exigía un número mayor de entradas y salidas para cumplir con las especifica-
ciones del diseño. Si se considera que el 8085A requería 2 líneas para el cristal ex-
terno, 2 para la fuente de poder, 16 para el bus de direcciones, y 8 para el bus datos,
solo restan 12 terminales para el bus de control. Una docena de líneas de control no
permitía la integración de todas las funciones establecidas para el dispositivo, razón
por la cual INTEL recurre al multiplexado de las líneas de datos y direcciones del µP.

El μP 8085 fue diseñado para disminuir el número de componentes necesarios


para la construcción de un sistema microcomputador típico. Antes de la aparición en
el mercado de este µP, la construcción de una CPU completa (8080, por ejemplo)
requería el uso de al menos tres chips LSI: el μP propiamente dicho (8080), el gene-
rador de reloj (8224), y el controlador del sistema (8228), este último se encargaba de
separar el bus de control y el de datos, los cuales estaban multiplexados en este pro-
cesador. En el 8085A se integran las funciones de los circuitos 8224 y 8228, de mo-
do que basta con conectar un cristal a las entradas X1-X2, para disponer de una CPU
autónoma. A la par, se mantuvo la compatibilidad de programación con el 8080 y de
hardware con los componentes periféricos más utilizados en el desarrollo de aplica-
ciones de µPs.

Por supuesto un lector perspicaz pudiese alegar: Al estar multiplexado los da-
tos con las direcciones. ¿No se requiere incluir un latch, externo al μP, para separar
estas funciones, necesitándose por lo menos dos circuitos, uno LSI y otro MSI, para
la CPU? La respuesta es, si... es cierto. Pero, una de las bondades del 8085, radica en
los dispositivos LSI introducidos como periféricos para garantizar la integración del
sistema, estos son: el 8155/56 y el 8355/8755. Los nuevos componentes combinaban
funciones de memoria, puertos de E/S y temporizadores, a la vez que se conectaban
directamente a los buses multiplexados del µP. Como resultado de esta estrategia,
INTEL disminuyó desde quince (con el 8080) a tres (con el 8085) la cantidad de com-
ponentes necesarios para un µC mínimo.

El uso de cápsulas de 40 pines con estructura de buses multiplexados se man-


tuvo en los μPs de 16 bits 8086 (AD8-AD15) y 8088 (AD0-AD7). El 80186 y el
80188, también de 16 bits, usan 68 terminales, los μPs de 32 bits 386DX y 486DX
disponen de 132 y 168 pines respectivamente, mientras que el Pentium básico, con
arquitectura interna de 64 bits y diseño superescalar, ocupa una pastilla de 273 termi-
nales.

Aunque este procesador es un producto INTEL originalmente introducido en


el año 1977, es fabricado actualmente por varias empresas. Como segundas fuentes
de del 8085 se encuentran: Siemens, NEC, AMD, OKI, Hitachi, y Toshiba.
Arquitectura y Operación del Microprocesador 8085A 104

4.2 ESTRUCTURA FUNCIONAL DEL 8085A

Para entender como funciona un µP es necesario conocer los tipos de registros


internos del dispositivo y el modo en el cual se realiza la transferencia de datos entre
éstos. El conjunto de los registros y el repertorio de instrucciones son atributos de la
arquitectura de la máquina, y constituyen el modelo de programación por excelencia.
El conocimiento de la función de cada uno y una técnica apropiada de utilización
permiten la programación del µP. Con el propósito de introducir la arquitectura del
8085 y la manera en la cual se organizan las unidades funcionales en un microproce-
sador real, se reproduce en la figura 4.3 un diagrama de bloques del µP, tal como es
suministrado por INTEL en la hoja técnica del dispositivo.

INTA RST 5.5 TRAP


INTR RST 6.5 RST7.5 SID SOD

Control de Interrupciones Canal Serie

Bus Interno de Datos (8)

Acumulador Reg. Temp. Registro de


Instrucciones (8)
Flags

Decodificador de B (8) C (8)

Instrucciones D (8) E (8)


ALU y H (8) L (8)
Codificador de Apuntador de Pila
Ciclo de Máquina Contador de Programa (16)
GND ± Registro de Dir.
+5V
Buffer Dir Buffer Dir/Dat
Lógica de Control y Tiempo
Gen.
X1 Reloj CONTROL ESTADO DMA RESET A0 - A15 AD0 - AD7
X2
Bus De Bus de
CLK OUT S0 S1 IO/ M HLDA RESET OUT
READY
RD WR ALE
HOLD Direcciones Direcciones/Datos
RESET IN
Bus de Control

Fig.4.3. Diagrama funcional del 8085ª

En el 8085 están integradas todas las funciones de una unidad de procesa-


miento central capaz de ejecutar el conjunto de instrucciones del µP, además de un
grupo de funciones adicionales, tales como: la generación del reloj, la selección y
asignación de la prioridad de las interrupciones y el control del canal de comunica-
ción serie.

El circuito integrado µP 8085 contiene un número considerable de compo-


nentes digitales interconectados para formar unidades funcionales. Éstas pueden estar
Arquitectura y Operación del Microprocesador 8085A 105

constituidas por algunos elementos digitales o por arreglos complejos de puertas


lógicas, registros y biestables. En el diagrama de la figura 4.3 solo se muestran las los
bloques que ejecutan las funciones básicas del dispositivo, tales son:

• El conjunto del Registro de Instrucciones, el Decodificador de Instruccio-


nes y la lógica de Control y Tiempo, la cual conforman la Unidad de Con-
trol del microprocesador.

• El Banco de Registros de propósito general (B,C,D,E,H,L) de 8 bits. El


Apuntador de Pila (SP), el Contador de Programa (PC), y el registro de di-
recciones de memoria (MAR), de 16 bits.

• La Unidad Aritmética y Lógica (ALU), el Acumulador (A), el Registro


Temporal y las Banderas de Estado.

• El control de selección y asignación de prioridad de las interrupciones.

• El Control del Canal de Comunicación Serie.

• Los buffers de datos y datos/direcciones.

4.2.1 La unidad de control

Toda operación realizada por el 8085 durante la ejecución del programa de


instrucciones almacenado en memoria, ocurren como respuestas a señales de control
generadas por esta sección del microprocesador. El µP incorpora un generador inter-
no de reloj, el cual usa un cristal conectado a las entradas X1-X2 para fijar la fre-
cuencia de oscilación. La lógica de control utiliza esta base de tiempo maestra o reloj
del sistema para generar comandos de sincronismo para toda operación interna y ex-
terna realizada por el dispositivo. En esta sección también se libera una salida CLK
OUT, a la misma frecuencia del reloj interno, la cual puede ser usada como reloj de
componentes externos.

Como se observa en la figura 4.3, las entradas de la lógica de control y tiem-


po son los terminales del cristal de cuarzo, las salidas de la sección de decodificación
de instrucciones y codificación de ciclo de máquina, y señales externas generadas por
dispositivos externos a la CPU.

Las entradas externas a la lógica de control son tres: RESET IN , READY y


HOLD., éstas permiten a circuitos periféricos modificar el modo normal de funcio-
namiento del µP.
Arquitectura y Operación del Microprocesador 8085A 106

En el caso de RESET IN , si por un tiempo de al menos tres ciclos de reloj se


aplica un nivel lógico bajo a este terminal, la lógica de control inicializa el µP car-
gando cero en el contador de programa, en el registro de instrucciones y en varios bits
internos de control. La entrada al estado de reset es anunciada al exterior por la acti-
vación de la salida RESET OUT.

El terminal de entrada READY tiene como función permitir el intercambio de


información entre dispositivos periféricos lentos y el microprocesador. Si esta señal
es activada a cero durante una operación de acceso a memoria o puerto de E/S, signi-
fica que un dispositivo externo notifica que no está listo para transferir datos, de ma-
nera que solicita al µP que proceda a entrar en un estado de espera hasta cuando pue-
da transmitir o recibir la información. El 8085 saldrá del estado de espera cuando
READY retorne al nivel lógico alto.

La entrada restante de control (HOLD) es utilizada por componentes externos


para indicar al 8085 que requieren hacer uso exclusivo de los buses del sistema para
realizar una operación de acceso directo a la memoria. La activación de HOLD (nivel
lógico alto) implica una solicitud al CPU para que libere las líneas de datos y direc-
ciones una vez que culmine el ciclo de máquina en desarrollo. Este modo de opera-
ción es usado por circuitos controladores LSI para realizar transferencias de datos a
memoria sin intervención del µP.

La función HOLD es necesaria porque ninguna instrucción del µP permite el


intercambio directo de datos entre dispositivos externos, de modo que toda transfe-
rencia de información desde un periférico a memoria debe usar al 8085 como recep-
tor intermedio. Este modo de operación es demasiado lento para transmitir cantidades
masivas de datos desde un disco o tarjeta de video.

La lógica de control genera una salida HLDA para informar al dispositivo ex-
terno que acepta la solicitud de HOLD, y que procede a llevar a tercer estado el bus
de direcciones, el bus de datos/direcciones y algunas salidas de control. Una vez cul-
minada la transferencia, el periférico desactivada la señal HOLD y el 8085 recupera
el control de los buses.

El 8085 es un dispositivo microprogramado, lo cual significa que en su inter-


ior reside un µprograma encargado de trasladar la instrucción depositada en el IR a
una secuencia de microinstrucciones necesarias para realizar las funciones ordenadas
por el programa. El µprograma está almacenado en una memoria de solo lectura y no
es accesible al usuario

La figura 4.4 muestra al registro de instrucciones conectado al decodificador


de instrucciones, el cual identifica la instrucción en ejecución y selecciona el µpro-
grama correspondiente. El decodificador de instrucciones transfiere a la lógica de
control y tiempo el resultado de la interpretación de la instrucción.
Arquitectura y Operación del Microprocesador 8085A 107

Bus Interno de Datos

Registro de
Instrucciones

Buffer de
Decodificador de Dir/Datos
Instrucciones y
Codificador de
Ciclo de Máquina
Bus Dir/Datos

Lógica de
Señales Internas
Control y
de Control
Tiempo

E/S externas

Fig.4.4. Sección de decodificación y control del μP

Sincronizada por el reloj interno, la lógica de control y tiempo tiene la res-


ponsabilidad de ejecutar la secuencia de microinstrucciones que controla la búsqueda,
decodificación y ejecución de las líneas de código almacenadas en la memoria. Según
la naturaleza de la instrucción, la lógica de control emitirá señales internas destinadas
a sincronizar la transferencia de datos entre registros, o entre éstos y la ALU. Además,
se encarga de generar señales externas dirigidas al control de la memoria, puertos de
E/S y otros periféricos del sistema. La sincronización de la transferencia de datos por
las líneas de interconexión y la interpretación del estado de las entradas a la CPU, son
también responsabilidad de a lógica de control.

Las salidas externas del bloque de control son S1, S0, IO/M, RD, RW, ALE,
CLK OUT, RESET OUT y HLDA. Para entender las funciones de las seis primeras de
éstas, considere una operación de búsqueda en memoria. Durante el arranque del sis-
tema, una red de RESET automático pone a cero el contador de programa. Cuando el
µP sale del estado de RESET, la lógica de control genera las señales de estado
IO/M=0, S1=1, S0=1, anunciando que se dispone a realizar una operación de búsque-
da del código de operación de la instrucción almacenada en la posición 0000H.
Arquitectura y Operación del Microprocesador 8085A 108

El siguiente paso es transferir desde el contador de programa al buffer de da-


tos/direcciones los 8 bits de menor peso de las direcciones (A0-A7), mientras que el
byte de orden alto del PC (A8-A15) se carga en el buffer de direcciones. Simultánea-
mente la UC emite una señal de control ALE para indicar a lógica externa que el con-
tenido del bus multiplexado corresponde a direcciones.

Una vez que la dirección se estabiliza en el bus, la lógica de control envía a la


memoria un comando RD de lectura indicando que el código de operación debe ser
trasladado desde la memoria hasta el buffer de datos a través del bus externo de datos,
y de allí al registro de instrucciones para su posterior decodificación. Si la operación
fuese de escritura en memoria se hubiese generado un comando de escritura WR. A
continuación se incrementa en uno el PC para apuntar a la posición de la memoria
donde se almacena el siguiente byte de la instrucción o la próxima instrucción a eje-
cutar.
Si la instrucción en progreso contiene más de un byte, la UC ordenará uno o
dos accesos adicionales a la memoria hasta tanto toda la información relacionada con
la instrucción sea transferida al interior del µP. En este momento se inicia la ejecu-
ción propiamente dicha. De acuerdo con el tipo de instrucción, la UC generará todas
las señales internas y externas necesarias para la transferencia entre registros, uso de
la ALU, o acceso a memoria o puertos de E/S.

4.2.2 Los registros internos

La figura 4.3 indica que el 8085 tiene un grupo de registros de 8 y 16 bits, a


los cuales se tiene acceso por medio del bus interno de datos. Siete de estos registros
son direccionables y están a la disposición de programador. El acumulador (A) es un
registro especial de 8 bits asociado a la ALU, debido a que es usado por casi todas las
instrucciones aritméticas y lógicas. Los seis registros restantes (B,C,D,E,H,L), tam-
bién de 8 bits, son de propósito general y están disponibles para almacenamiento de
datos durante la ejecución del programa.

Para permitir la realización de algunas operaciones con operandos de 16 bits,


los registros de propósito general pueden ser usados como tres registros pares de 16
bits: BC, DE, y HL. El 8085 posee instrucciones que hacen referencia a registros pa-
res. Por ejemplo: LXI D, dato, cargará el dato de 16 bits especificado por el operan-
do de la instrucción en el registro par DE.

El uso adecuado de los registros internos resulta en la escritura de programas


eficientes y de rápida ejecución. Al existir 7 registros de 8 bits accesibles por el pro-
gramador, son necesarios sólo tres bits para identificarlos, de modo que las instruc-
ciones de transferencia entre registros y las aritméticas (exceptuando las de suma y
resta inmediata) son de un byte, al igual que en la máquina hipotética. Una instruc-
ción corta es procesada con rapidez debido a que el µP debe realizar un acceso único
a memoria en busca de la instrucción, y toda operación adicional es realizada dentro
de la propia CPU.
Arquitectura y Operación del Microprocesador 8085A 109

Una particularidad del arreglo de registros programables es que cuando se tra-


tan como registros pares, pueden almacenar la dirección de una posición de memoria
a la cual se puede transferir, o desde la cual se pueden obtener datos.
Bus interno de Datos

W Z
B C
D E
H L
MAR
PC

Buffer Buffer datos/


SP Direcciones Direcciones

A8-A15 AD0-AD7

Fig. 4.5. Registros que pueden alterar el contenido de registro de direcciones de memoria.

La figura 4.5 indica que existen cuatro fuentes posibles para cargar una direc-
ción específica en el registro de direcciones de memoria (MAR), el cual es de 16 bits.
Estas son: el PC, los registros de propósito general, el apuntador de pila SP y dos
registros W y Z de 8 bits no accesibles por el programador. EL generador por exce-
lencia de direcciones del μP es el contador de programa, el cual es un registro de 16
bits que mantiene la dirección de la próxima instrucción a ejecutar, o la dirección de
búsqueda del 2do o 3er byte de una instrucción multibyte en proceso. Al final de la
ejecución de una instrucción, o al concluir una búsqueda en memoria, el PC es in-
crementando automáticamente en 1 para apuntar a la siguiente posición de memoria.

Cuando el arreglo de registros de propósito general actúa como fuente de una


dirección, ésta debe ser cargada en el registro par por el programa. Instrucciones sub-
siguientes que hacen referencia a memoria utilizan esta información, por ejemplo:
LDAX D, transfiere al acumulador el contenido de la posición de memoria cuya di-
rección especifica el contenido del registro par DE.

El contenido del SP, otro registro de 16 bits, representa la dirección del tope
de un bloque de memoria con estructura LIFO manejado por programa, y en la cual
se pueden almacenar datos en forma temporal, recuperándolos oportunamente. La
utilidad de la zona de la pila es obvia si se considera que debido al número reducido
de registros del microprocesador la capacidad de almacenamiento interno de la CPU
puede agotarse rápidamente. Durante la ejecución de un programa determinado los
registros ocupados pueden ser liberados y los datos antiguos preservados usando la
pila como área de almacenamiento.

La dirección de la base de la pila se fija en el inicio del programa. Cuando se


ejecuta una instrucción que haga referencia a la pila, el SP es incrementado, o decre-
Arquitectura y Operación del Microprocesador 8085A 110

mentado, por la unidad de control. El SP también permite, como se explicará más


adelante, el manejo de subrutinas como técnica de programación.

En la figura 4.5 se observan dos registros de 8 bits, W y Z, de uso exclusivo


por la unidad de control del μP para el almacenamiento intermedio de datos o direc-
ciones durante la ejecución de una instrucción. Como ejemplo, durante la ejecución
de una instrucción de tres bytes, tal como JMP dirección, el μP busca en memoria el
primer byte correspondiente al código de operación de la instrucción, lo traslada al
IR, y lo interpreta; se incrementa el PC y se busca el segundo byte de la instrucción y
se deposita en Z, se vuelve a incrementar el PC en la búsqueda del tercer byte, el
cual se almacena en W. Concluida la fase de búsqueda, el registro par WZ contiene
la dirección de salto. Durante la ejecución de la instrucción, el contenido de WZ se
transfiere al registro de direcciones de memoria, y el contenido del PC es sustituido
por WZ+1, para apuntar a la próxima posición de memoria.

4.2.3 La unidad aritmética y lógica


La ALU ejecuta operaciones aritméticas o lógicas con números binarios de 8
bits. Si la función se realiza sobre dos operandos (puede ser sobre un operando), uno
estará almacenado en el acumulador y el otro en un registro de propósito general. El
resultado de cualquier operación siempre se deposita en el acumulador, destruyendo
el contenido anterior del registro. La ALU puede realizar las siguientes operaciones
aritméticas y lógicas: Suma y resta binaria, AND, OR, OR Exclusivo, y NOT, y rota-
ción del acumulador hacia la derecha o izquierda. La figura 4.6 presenta a la unidad
aritmética lógica del 8085 y sus registros de soporte.

A Reg.Temp.
Banderas

ALU

Fig. 4.6. La unidad aritmética lógica.

Se observa en la figura 4.6 el Registro de Estados o Banderas, de 5 bits, donde


la ALU deposita información vinculada con el resultado de una operación aritmética o
lógica. Las condiciones pueden ser probadas por programa.

S Z AC P CY

Fig. 4.7 Registro de condiciones de estado del 8085A


Arquitectura y Operación del Microprocesador 8085A 111

• La bandera de Acarreo (CY) es activada (1 lógico) cuando el resultado de una operación


aritmética produce un desborde del bit 7 del acumulador, en otras palabras CY =1 cuando el
resultado no puede ser expresado por 8 bits, como se expuso en párrafos anteriores. Si no
ocurre desborde, CY = 0.

• La condición de Acarreo Auxiliar (AC) indica con un nivel alto el desborde desde el bit 3
del acumulador. Es útil cuando se realizan operaciones BCD.

• El bit de Signo (S) se activa si el bit más significativo del resultado almacenado en A, es 1.
Es puesta por instrucciones que usan el bit 7 del acumulador como bit de signo. En estos
casos se permiten números entre -128 a + 127.

• La bandera de Cero (Z) es 1, si el resultado de operaciones lógicas o aritméticas es cero. Si


el resultado es distinto de cero, entonces Z = 0.

• El bit de Paridad (P) va a 1 si número de bits en 1 del registro acumulador, es par. Si es


impar, P = 0.

4.2.4 El bus interno de datos

El 8085A es un µP con estructura de bus único, lo cual significa que toda transfe-
rencia de información en el interior del dispositivo se realiza a través del bus interno
de datos de 8 bits. Las líneas internas de interconexión están separadas de los buses
externos por medio de dos buffers de almacenamiento de 8 bits, cuyas salidas son de
tres estados. Estos se denominan: buffer de direcciones y buffer de datos/direcciones.

Durante una operación de acceso a memoria o puerto de E/S, el µP debe usar


el bus de direcciones para distinguir el dispositivo con el cual desea comunicarse.
Para cargar el bus externo con una dirección, el µP transfiere el byte alto del registro
de direcciones de memoria al buffer de direcciones y el orden bajo del mismo registro
se carga en el buffer de datos/direcciones, el cual debe estar habilitado en modo de
salida. Debido a que el bus interno es de 8 bits, el µP debe realizar dos transferencias
internas para emitir los 16 bits de la dirección.

La dirección permanece estable sobre el bus por un tiempo equivalente a un


ciclo de reloj, permitiendo que alguna lógica externa retenga el estado de las ocho
líneas de menor peso de la dirección. Al final del ciclo de reloj, la unidad de control
lleva a tercer estado las salidas del buffer de datos/direcciones. Dependiendo del tipo
de operación a realizar con el dispositivo externo, las salidas del buffer permanecerán
flotantes para que el dato en el bus externo sea transferido al interior del µP durante
una operación de lectura, o abandonarán el tercer estado para que la CPU transmita el
dato hacia el exterior durante una operación de escritura.
Arquitectura y Operación del Microprocesador 8085A 112

Finalmente, en la figura 4.8 se muestran el control de interrupciones y el canal


de comunicación series, ambos conectados al bus interno de datos del 8085. Estos
tópicos serán discutidos con detalle en capítulos próximos.

Fig. 4.8. Funciones auxiliares integradas en el 8085

En la próximas dos páginas se presenta una relación completa de la definición


funcional de los terminales del microprocesador 8085A. Muchas de estas señales son
conocidas, otras adquirirán sentido a medida que el estudiante progrese en la lectura
de este trabajo.

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8085


VCC +5V
VSS Tierra

X1 -X2 Terminales de entrada para un cristal de cuarzo o una red LC o RC para activar el
reloj interno del microprocesador
CLK OUT Salida de la señal de reloj del μP para usar como reloj del sistema. La frecuencia
de CLK es la mitad de la de la señal en X1 X2.
Entrada que inicializa el contador de programa y los flip flops de habilitación de
RESET IN interrupción y HLDA. Los buses de datos y direcciones y las líneas de control
permanecen en tercer estado durante el proceso de RESET. Los contenidos de los
registros internos del procesador, incluyendo el de banderas, pueden ser alterados
por RESET.
RESET OUT Salida que indica que el procesador está siendo inicializado, puede utilizarse para
restablecer los demás componentes del sistema.
Bus de direcciones. Los 8 bits más significativos de las direcciones de memoria o
A8-A15 de dispositivos de E/S. Permanecen en tercer estado durante el proceso de RESET
o en los modos HOLD y HALT.
Bus de datos/direcciones multiplexado. Los 8 bits menos significativos de las
AD0-AD7 direcciones de memoria o dispositivos de E/S aparecen en el bus durante el primer
estado un ciclo de máquina. El bus de datos se presenta durante el 2do y 3er ciclo
de reloj.
Es una salida que indica si el contenido del bus AD0-AD7 corresponde a direccio-
ALE nes o datos. Se activa durante el primer ciclo de reloj de un ciclo de máquina y
permite usar un registro de 8 bits externo al procesador para memorizar la parte
baja del bus de direcciones. Nunca está en tercer estado.
Arquitectura y Operación del Microprocesador 8085A 113

Son salidas que indican si el ciclo de máquina 1 en progreso corresponde a: Bús-


S0,S1-IO/M queda del código de operación, escritura en memoria o en puerto de E/S, lectura
en memoria o en puerto de E/S, reconocimiento de interrupción o estado HALT.
Señal de lectura. Un nivel bajo en RD indica que el μP desea leer la memoria o
RD dispositivo de E/S seleccionado, y que el bus de datos está listo para la transferen-
cia de información. Permanece en tercer estado durante el proceso de RESET o en
los modos HOLD y HALT.
Señal de escritura. Un nivel lógico bajo en este terminal indica que el contenido
WR del bus de datos va a ser escrito en la memoria o dispositivo de E/S seleccionado,
y que el bus de datos está listo para la transferencia de información. Permanece en
tercer estado durante el proceso de RESET o en los modos HOLD y HALT.
Si tiene nivel lógico alto durante un ciclo de lectura o escritura, indica que la
READY memoria o dispositivo de E/S está listo para recibir o transferir datos. Si presenta
nivel bajo, el procesador esperará un número entero de ciclos de reloj para que
READY vaya a nivel alto y completar el ciclo de lectura o escritura. Se utiliza
cuando el sistema se comunica con periféricos lentos cuyos tiempos de acceso
sean superiores al periodo del dispositivo microprocesador.
Entrada que indica que otro procesador o controlador solicita el uso de los buses
HOLD de direcciones y datos. el CPU abandona el uso de estos buses una vez finalizado
el ciclo de máquina en progreso, poniendo en estado de alta impedancia las si-
guientes líneas: A8-A15, AD0-AD7, RD , WR , e IO / M .
Reconocimiento de HOLD. Salida que indica que el μP ha recibido una petición
HLDA de HOLD y que los buses entrarán en tercer estado. HLDA vuelve a nivel bajo
una vez que la solicitud de HOLD es removida.

Reconocimiento de interrupción. Después que una solicitud de interrupción ha


INTA sido aceptada, esta salida se usa, en lugar de RD, para activar el circuito que gene-
ra la interrupción.

TRAP Entrada de interrupción no enmascarable. Es la interrupción de más alta prioridad.


SID Entrada de datos en serie. Los datos en la entrada SID son cargados en el bit 7 del
acumulador se ejecuta una instrucción RIM.
SOD Salida de datos en serie. Usando la instrucción SIM, el estado del bit 7 del acu-
mulador es cargado en esta salida.

Tabla. 4.1. Tipos de ciclos de máquina y señales de estado


IO/M S1 S0 ESTADO
0 0 1 Escritura en memoria
0 1 0 Lectura de memoria
1 0 1 Escritura a puerto de E/S
1 1 0 Lectura de puerto de E/S
0 1 1 Búsqueda de OP
1 1 1 Reconocimiento de interrupción
Z 0 0 HALT
Z X X HOLD
Z X X RESET

1
Ver tabla 4.1.
Arquitectura y Operación del Microprocesador 8085A 114

4.3 CONSIDERACIONES DE TIEMPO PARA EL 8085A


En la sección 3.1 se trató al µP imaginario como una máquina de estado. Tal
discusión reveló aspectos de interés sobre el modo como la CPU ejecuta las instruc-
ciones y el tiempo invertido en ejecutar cada una. En el manual del usuario del
8085A se encuentra abundante información sobre aspectos relativos a la sincroniza-
ción de las señales del 8085 y sobre el número de ciclos de reloj necesarios para pro-
cesar cada instrucción. No obstante, el autor estima que una guía sobre el funciona-
miento de un µP no puede soslayar este tópico, por ser fundamental para comprender
la dinámica del proceso de búsqueda y ejecución de una instrucción.

Características del cristal

f = 2fclk

CL ≤ 30 pf, CS ≤ 7 pf, RS ≤ 75 Ω
L Ce Ci
Red LC de resonancia paralela
1
f =
2π L (C e + C i )

Con Ce ≥ 2Ci para un Δfmin ≈ 10 %


20 pf 10 KΩ Ci
Red RC de resonancia paralela

f = 3 Mhz
Fig. 4.9. Circuitos para fijar la frecuencia del reloj.

Toda operación realizada por el 8085A durante el procesamiento de una de-


terminada instrucción esta sincronizada por el reloj maestro del sistema, el cual puede
ser generado en el interior del dispositivo o suministrado por una fuente externa. Para
usar la opción de reloj interno, debe aplicarse a las entrada X1-X2 un cristal de cuar-
zo, una red RC, o un circuito sintonizado LC. En cualquier caso el valor de la fre-
cuencia de oscilación interna debe estar comprendido entre 1 MHz y 3.125 MHZ, a
menos que se use la versión 8085A-2, la cual soporta hasta 5 MHz. La figura 4.9
ilustra el modo de conexión para cada una de las posibilidades de uso del generador
interno.

Con el uso de un cristal de cuarzo se obtiene precisión y una gran estabilidad


del valor de la frecuencia del reloj. El oscilador LC funciona en forma adecuada para
frecuencias hasta 5 MHz. Si se elige está opción, la tolerancia de la frecuencia será de
10 %, la cual puede considerarse apropiada para algunas aplicaciones. En los casos
donde el µP no requiera realizar tareas que involucren medidas o control de tiempo
puede recurrirse a una red RC oscilando a 3 Mhz. En este último caso, el fabricante
no recomienda otro valor de frecuencia.
Arquitectura y Operación del Microprocesador 8085A 101

4.3.1 El ciclo de instrucción

Al igual que el µP del capítulo anterior, cuando se aplica potencia al procesa-


dor, éste inicia la ejecución de las instrucciones en la posición 0000H de la memoria,
esto se logra porque el sistema está provisto de una red para autoreset de la CPU. El
microprocesador buscará la primera instrucción en memoria y la ejecutará, procesan-
do todo el programa hasta su finalización. Este modo de operación se mantiene, a
menos que el μP sea forzado a entrar, por una instrucción HLT, en un estado de para-
da (HALT). Existen otros métodos para modificar el proceso de ejecución normal de
un programa, tales como las interrupciones o la petición de operación en modo
HOLD.

M1 M2 M3 M4
T1 T2 T3 T4 T1 T2 T3 T1 T2 T3 T1 T2 T3
Estado

CLK

Ciclo de Máquina
Ciclo de Instrucción

Fig. 4.10. Estados y ciclos de máquina del microprocesador.

El tiempo necesario para que el µP busque y ejecute una instrucción represen-


ta un ciclo de instrucción. Para completar la ejecución de una instrucción, el 8085A
debe realizar de 1 a 5 operaciones de lectura/escritura a memoria o puerto de E/S.
Cada uno de estos accesos a dispositivos externos a la CPU constituyen un ciclo de
máquina (Mi), los cuales se realizan internamente por medio de una secuencia de mi-
croinstrucciones almacenadas en ROM. Cada paso de esta secuencia comprende un
estado (Ti), necesitándose de 3 a 6 estados para completar un ciclo de máquina. Un
estado corresponde a un ciclo del reloj del sistema. En la figura 4.10 se muestra un
ciclo de instrucción de cuatro ciclos de máquina.

Los ciclos de máquina de posible aparición durante la ejecución de una ins-


trucción son:

• Búsqueda del código de operación


• Lectura de memoria
• Escritura de memoria.
• Lectura de puerto de E/S.
• Escritura en puerto de E/S
• Reconocimiento de interrupción.
Arquitectura y Operación del Microprocesador 8085A 102

• Modo de bus inactivo.


En el transcurso del primer estado cualquier ciclo de máquina, el microproce-
sador asigna los estados de las señales IO/M, S1, S0, para informar a dispositivos
periféricos el tipo de ciclo de máquina que se inicia. La tabla 4.2 muestra el estado
de las señales de estado y control para cada tipo de ciclo de máquina.

Tabla. 4.2. Ciclos de máquina del 8085A.


SEÑALES DE ESTADO SEÑALES DE CONTROL

IO/M S1 S0 CICLO DE MÁQUINA RD WR INTA


0 1 1 Búsqueda del código de operación 0 1 1
0 0 1 Escritura en memoria 1 0 1
0 1 0 Lectura en memoria 0 1 1
1 0 1 Escritura a puerto de E/S 1 0 1
1 1 0 Lectura de puerto de E/S 0 1 1
1 1 1 Reconocimiento de interrupción 1 1 0
0 1 0 Bus inactivo DAD 1 1 1
1 1 1 RST/TRAP 1 1 1
Z 0 0 HALT Z Z 1

Durante el ciclo de máquina de bus inactivo no se realizan operaciones con


memoria o puerto de E/S. Este tiempo es usado para operaciones internas con los
registros y la ALU.

El número de ciclos de máquina necesarios para completar la ejecución nor-


mal de una instrucción depende del total de operaciones de lectura o escritura que se
realice a la memoria o dispositivo de E/S y de la complejidad de la instrucción. Algu-
nas instrucciones de un byte, como INX rp, requieren un ciclo de máquina único para
obtener el OC de memoria y completar su ejecución; mientras que DAD rp, también
de un byte, se procesa durante tres ciclos de máquina. En este último caso, los ciclos
M2 y M3, ambos del tipo de bus inactivo, son utilizados por el µP para realizar opera-
ciones internas necesarias para completar la ejecución de la instrucción.

Considerando las instrucciones multybyte, por ejemplo JMP dirección, ésta


exige tres lecturas de la memoria o ciclos de máquina para obtener el código de ope-
ración, la dirección de salto y culminar la ejecución. En cualquier caso, ninguna ins-
trucción del 8085A requiere más de cinco ciclos de máquina. La fase de búsqueda del
código que identifica a toda instrucción se realiza durante el primer ciclo de máquina
M1. En cada ciclo se invierten tres estados, excepto el ciclo de búsqueda del código
de operación, el cual utiliza cuatro o seis ciclos de reloj.

Para ilustrar la secuencia de operaciones necesarias para la ejecución de una


instrucción, considere INX H, la cual produce que el contenido del registro par HL se
incremente en 1. En la figura 4.11 se observa el estado de los registros del µP antes
de ejecutar la instrucción. El contenido de IR (21H) corresponde al código de opera-
ción de la última instrucción ejecutada, LXI H,20FFH, usada para cargar en HL, el
dato de 16 bits 20FFH.
Arquitectura y Operación del Microprocesador 8085A 103

Fig. 4.11. Registros del CPU antes de ejecutar la instrucción INX H

Observe, en la figura 4.12, que una vez procesada la instrucción aritmética, el


registro par contiene el valor 2100H y el registro IR mantiene el código de opera-
ción,23H, de la instrucción INX rp.

Fig. 4.12 Estado interno del CPU después de la ejecución de INX H.

Las figuras mostradas son una copia de la salida del programa MICRO 85, el
cual simula en ambiente WINDOWS la operación de un microcomputador basado en
el µP8085. Esta es una herramienta de gran valor didáctico y práctico, pero nuestro
interés actual se centra en los detalles de la secuencia de operaciones internas que
conducen a la ejecución de una instrucción.
Arquitectura y Operación del Microprocesador 8085A 104

4.3.2 Secuencia de transición de estados


El diagrama de la figura 4.13 muestra la sucesión de eventos por los cuales
transita el 8085A durante el desarrollo de un ciclo de máquina.

RESET
RESET TR
RESET

HALT
T1
HALT HOLD·
READY INTVAL
READY
T2 TW THALT
READY HOLD INTVAL

BITHLDA = 1 BITHALT= 0
SI
HOLD = 1 BITHLDA = 1

no
BITINTA = 1
M1 CC=6 BITINTE = 0
SI
T3 T4 HOLD = 1

CC=4 no BITHLDA = 1

T6 T5

SI
BITHLDA = 1

no HOLD
THOLD
no ÚLTIMO
CICLO HOLD

SI BITHLDA = 0

no INT.
VÁLIDA
SI
SI HALT = 1

BITINTA = 1 no
BITINTE = 0

Fig. 4.13 Diagrama de transición de estados del µP 8085A

Para distinguir los modos de operación del µP, se analiza el diagrama de la


figura 4.13 considerando sólo aquellos sucesos que modifican la transición normal de
la ejecución entre los estados T1 y T6. Debe recordarse que durante un ciclo de má-
quina el µP pasa por tres estados, a menos que se trate del ciclo de búsqueda, el cual
tiene una duración de cuatro o seis estados.
Arquitectura y Operación del Microprocesador 8085A 105

Cuando el µP sale del estado de reset, después del arranque del sistema, ini-
cia en el estado T1 el ciclo de máquina M1 de búsqueda del código de operación. En
este análisis se considera que M1 es el único ciclo de máquina y consta de seis esta-
dos. En T2 se inspecciona el estado de la entrada READY. Si está en nivel lógico
alto, el µP transitará hacia T3 y luego a T4, porque el ciclo en desarrollo es M1. Si por
el contrario READY está en nivel bajo, el 8085A entrará en un estado de espera TW,
donde se mantendrá hasta cuando READY vuelva a nivel alto, instante en el cual pro-
cederá hasta los estados T3 y T4.

En el estado T4 el µP captura el estado de la línea HOLD y pone a 1 un bit in-


terno (BITHLDA), si la entrada HOLD está en 1. Si HOLD es cero el ciclo de máquina
se completa con los estados T5 y T6. Observe en el diagrama de la figura 4.13, que si
el ciclo M1 consta de 4 estados, la prueba de la línea HOLD se realiza, mientras el
reloj CLK =1 durante los estados T2 o TW. Esto también ocurre si el ciclo en desarro-
llo no es de búsqueda del código de operación, en cuyo caso finaliza en T3.

Después de T6, o de T4 si M1 es de 4 estados, se examina el bit de estado


HLDA, si está en 1 el 8085 entra en un estado THOLD en el próximo pulso de reloj; si
el resultado de la prueba del BITHLDA indica un nivel bajo y el ciclo en progreso es el
último o único ciclo de máquina de la instrucción, el µP verifica si hay interrupcio-
nes pendientes. Si no las hay, procederá al estado T1 del ciclo M1 de la próxima ins-
trucción, o del siguiente ciclo, en caso que la instrucción tenga más de uno. Si exis-
ten interrupciones diferidas, se carga uno en el bit de reconocimiento de interrupción
BITINTA, y se desactivan las interrupciones poniendo a cero el BITINTE de habilitación
de interrupciones. En el siguiente pulso de reloj, se inicia un ciclo de máquina de
reconocimiento de interrupción.

Una vez ejecutada la instrucción, cuando el µP sale del estado T6 y no exis-


ten solicitudes de interrupción, el 8085 se traslada estado T1 del ciclo de búsqueda
del código de operación de la siguiente instrucción. En T1 prueba un bit interno que,
cuando está en uno, indica que última instrucción ejecutada fue HLT. Si este es el
caso, el diagrama de la figura 4.13 indica que el µP entrará en un estado de parada
(HALT). Durante el modo de operación HALT, el 8085 permanece inactivo y los
terminales AD0-AD7, A8-A15, IO / M, RD y WR se mantienen flotantes.

El 8085A puede abandonar temporalmente THALT cuando la línea HOLD sea


puesta en alto por un dispositivo externo en solicitud de acceso directo a memoria
(DMA). El µP se trasladará al estado THOLD, atenderá la petición externa y retornará a
THALT cuando HOLD vuelva cero, señalando que finalizó la operación de DMA.

Solo por la ocurrencia de un evento externo, el 8085A podrá salir del estado
THALT e iniciar la ejecución de una nueva instrucción. Si se activa una interrupción
válida, el µP deshabilitará el sistema de interrupciones cargando cero en el BITINTE y
transitará hacia el estado T1del ciclo M1 de la próxima instrucción. En ausencia de
solicitud de interrupción, sólo un comando de RESET permitirá que el µP abandone
Arquitectura y Operación del Microprocesador 8085A 106

THALT. En este caso el sistema será reiniciado en TR y procederá a ejecutar la instruc-


ción en la dirección 0000H de la memoria, cuando la orden de RESET sea levantada.

Con el análisis previo, basado en el diagrama de estados de la figura 4.13, se


pretende mostrar los modos de operación del microprocesador 8085A, más que deta-
llar los sucesos que ocurren durante cada estado por el cual pasa la CPU. Debe que-
dar claro que si la última instrucción ejecutada no fue HLT y si además ningún peri-
férico: solicita estados de espera, entrada en el modo de operación HOLD o inte-
rrumpe al µP; éste se trasladará en forma libre desde el estado T1 hasta completar la
ejecución de la instrucción en el estado T4 o T6, si se trata de una instrucción con un
ciclo de máquina.

Si la búsqueda o la ejecución de la instrucción requieren más de una acceso a


la memoria, el primer ciclo M1 constará de cuatro o seis estados y los subsiguientes
de sólo tres. Tal situación la describe el diagrama de transición de la figura 4.14.

RESET

RESET TR

RESET

T1

T2

T3 T4

T6 T5

Fig. 4.14 Diagrama de transición de estados del µP 8085A sin considerar los estados THALT, THOLD,
TW, ni solicitudes de interrupción.

Retomando el caso de la instrucción INX H, cuyo ciclo de instrucción está


constituido por un ciclo de máquina de seis estados, a continuación se detallan todas
las operaciones, tanto externas como internas, realizadas por el 8085A durante cada
estado.

Se supone que la instrucción INX H, de un byte, se ejecuta inmediatamente


después que el µP sale del estado de RESET y que todo ciclo de máquina Mi se inicia
en el estado T1.
Arquitectura y Operación del Microprocesador 8085A 107

T1
Externas:
Al inicio de T1, el µP identifica el ciclo de máquina en progreso emitiendo
las señales, IO / M =0, S0=1 y S1=1. Para indicar a la memoria la direc-
ción de la posición donde se encuentra la instrucción, transfiere el conteni-
do del contador de programa al buffer de datos/direcciones y al buffer de
direcciones. Simultáneamente, el 8085A genera la señal ALE, activa en al-
to, para informar a dispositivos externos que el contenido del bus AD0-AD7
corresponde a los 8 bits de orden bajo de la dirección.
Internas:
Examina el flip flop de estado HALT.
T2
Externas:
El µP activa la señal RD de lectura y coloca en tercer estado las salidas del
buffer de datos/direcciones para permitir que el dispositivo de memoria
transfiera el código de operación de la instrucción INX H.
Internas
El contador de programa es incrementado. El estado de las entrada READY
es capturado en el flanco de subida de T2, si es bajo se introduce un estado
de espera. La entrada HOLD es examinada y si está en nivel alto se carga
uno en el BITHLDA.
T3
Externas:
El código de operación de la instrucción es cargado en el registro de ins-
trucciones del µP. RD pasa a nivel alto.
Internas:
El código de operación es pasado al decodificador de instrucciones.
T4
Externas:
Ninguna
Internas:
El código de operación es interpretado. En este punto el µP sabe que en el
próximo pulso debe transitar hacia el estado T5 por tratarse de la instruc-
ción INX H. Si el ciclo de búsqueda de la instrucción en ejecución tuviese
cuatro estados, al salir de T4, iniciaría un nuevo ciclo de máquina en T1.
Durante T4 de instrucciones de 4T, se examina el BITHLDA, si es uno los bu-
ses pasan a tercer estado, se activa a uno la salida HLDA y el µP entra en
un estado THOLD. Durante T4 de instrucciones de 6T, la entrada HOLD es
muestreada, y si está en uno el BITHLDA es cargado con uno.
T5-6
Externas:
Ninguna
Internas:
El registro HL es incrementado. Se detecta el estado del BITHLDA, si está en
uno el µP se traslada al estado THOLD en el próximo pulso de reloj.

La información de las operaciones externas realizadas en cada estado del ciclo


de máquina M1 durante el procesamiento de la instrucción INX H, se muestra como
un diagrama de tiempo en la figura 4.15.
Arquitectura y Operación del Microprocesador 8085A 108

M1 M1
SEÑAL
T1 T2 T3 T4 T5 T6 T1

CLK
S1,S0
IO / M IO / M = 0, S 1 = 1, S 0 = 1

A8-A15 PCH Indeterminado

AD0-AD7 PCL 23H

ALE

RD

Fig. 4.15 Ciclo de instrucción (Ciclo de máquina de búsqueda ) para la instrucción INX H (OC=23H).

En la mayoría de las instrucciones del 8085, el ciclo de búsqueda tiene cuatro


estados, de modo que como indica el diagrama de figura 4.14, al final del estado T4 la
transición ocurre hacia el estado T1 del ciclo de máquina siguiente. Las instrucciones
en las cuales se invierte 6 estados durante el ciclo de búsqueda son: CALL, CALL
condicional, DCX, INX, PCHL, PUSH, SPHL, y RET condicional. La función de
cada una se describirá oportunamente.

El 8085A requiere seis estados para completar la ejecución de la instrucción


INX rp. Si la frecuencia de la fundamental del cristal de cuarzo externo es 6.25 MHz,
cada estado interno tendrá una duración de 2000/6.25 ns o 320 ns. Esto significa que
para realizar la operación de incrementar cualquiera de los registros pares, el 8085A
invierte un tiempo de 6 estados x 320 ns/estados = 1.92 µs. La hoja técnica del µP
señala un ciclo de instrucción de 1.3 µs. En realidad esta información se refiere
tiempo que corresponde a la ejecución de las instrucciones de cuatro estados, 4x320
ns = 1.28 µs. Existen instrucciones de 18 estados, en cuya ejecución se invierte un
tiempo de 5.76 µs. Una versión más rápida, el 8085A-2 tiene un ciclo de instrucción
de 0.8 µs, operando a 5 MHz. También una versión CMOS de OKI semiconductor
liberada en 1998 y con código MSM80C85AHRS, opera a esta velocidad.

4.3.3 El estado de espera.

Si un periférico de E/S o un circuito de memoria son lentos comparados con


los tiempos estipulados para que el 8085A realice una operación de lectura o escritu-
ra, el dispositivo externo puede optar por solicitar al µP que pase a un estado de espe-
ra por un número entero de periodos de reloj, como indica la figura 4.16.
Arquitectura y Operación del Microprocesador 8085A 109

RESET

RESET TR
RESET

T1

READY
READY
T2 TW
READY

T3 T4
Fig. 4.16 Diagrama de transición de estados del µP 8085A considerando el estado TW.

T6 T5
En el caso de la instrucción INX H, la entrada al estado TW no modifica nin-
guna de las operaciones externas o internas realizadas durante el desarrollo del ciclo
de máquina, excepto que a la salida del estado T2 el µP no pasa a T3. En su lugar, al
estar la entrada READY activada en nivel bajo, la transición ocurre hacia un estado de
espera. Las actividades realizadas por el µP durante el estado TW son las siguientes:

T1;
...
T2;
...
TW
Externas:
Las líneas de direcciones, datos, y control mantienen los niveles existentes
durante T2.

Internas
Se muestrea la entrada READY en el flanco de subida del estado TW, si se mantiene en
nivel bajo se introduce otro estado de espera.
T3:
...
T4:
...
T5-6
:...

El diagrama de tiempos de la ejecución de la instrucción INX H con estado de


espera es el de la figura 4.17.
Arquitectura y Operación del Microprocesador 8085A 110

M1 M1
SEÑAL
T1 T2 T3 T4 T5 T6 T1

CLK

S1,S0
IO / M = 0, S 1 = 1, S 0 = 1
IO / M
A8-A15 PCH Indeterminado

AD0-AD7 PCL 23H

ALE

RD

READY

Fig. 4.17 Ciclo de instrucción (Ciclo de máquina de búsqueda) para INX H (OC=23H) con estado de
espera.

El estado de espera puede ser solicitado por dispositivos de memoria con


tiempo de acceso tacc mayor que el tiempo especificado para que el 8085A lea un dato
válido, después que la dirección está estabilizada en las líneas de direcciones. En la
figura 4.18 se muestra un ciclo de lectura de memoria, especificándose el tiempo tAD
(A0-15 valid to valid data in).

Fig. 4.18 Ciclo lectura en memoria.

El tiempo tAD es el lapso del cual dispone un dispositivo externo para cargar un
dato válido en el bus de datos, después que el 8085A presenta una dirección válida
en las líneas de direcciones.

El fabricante especifica un valor de tAD = 575 ns para un cristal de 6.25 MHz.


Si la memoria tiene un tiempo de acceso mayor que tAD, deberá solicitar al µP que
Arquitectura y Operación del Microprocesador 8085A 111

agregue uno o más estados de espera al ciclo de máquina en progreso. El valor de tAD
para cualquier frecuencia del cristal dentro del rango válido está dado por la expre-
sión (2.5+N).T-225 ns, donde N es el número de estados de espera. Por cada estado
de espera, el tiempo tAD tendrá un incremento efectivo de 320 ns, a la frecuencia es-
pecificada.

Aunque el concepto de estado de espera fue originalmente introducido para


sincronizar la transferencia de datos entre el µP y memorias o periféricos de veloci-
dad baja, es posible utilizarlo para detener el programa cada vez que se ejecute una
instrucción o un ciclo de máquina. Estos modos de operación son de gran utilidad en
la fase de desarrollo de un programa.

4.3.4 El modo de operación paso a paso


Debido a que el microprocesador 8085A debe operar con un reloj interno con
una frecuencia de al menos 500 KHz, no es posible ejecutar el programa suministrán-
dole pulsos de reloj a una cadencia lo suficientemente lenta como desearía un diseña-
dor en la fase de depuración de un programa. No obstante, si utilizando lógica externa
se introducen n estados de espera durante el ciclo de búsqueda del código de opera-
ción de cada instrucción del programa, este será ejecutado instrucción por instruc-
ción.
El circuito mostrado en la figura 4.19 permite llevar a la práctica el modo de
operación de ejecución de instrucciones por pasos. El funcionamiento del circuito de
paso simple se entiende mejor si se examina el diagrama de tiempos de la figura
4.20. El objetivo es detener la ejecución de un programa cada vez que se ejecuta una
instrucción, debiéndose pulsar el interruptor paso de la figura 4.18 para procesar la
instrucción siguiente.
Considere el inicio de la ejecución de un programa después de haber reinicia-
do el µP. Una vez que el 8085A sale del estado de RESET, procesa la primera ins-
trucción del programa hasta el estado T2 del ciclo de máquina M1 de búsqueda del
código de operación. Durante T1 el µP identifica el ciclo en progreso emitiendo las
señales de estado IO / M, S0 , y S1 . Por tratarse del ciclo de búsqueda, IO / M estará en
nivel lógico cero, mientras que S0 y S1 estarán en alto, de modo que la salida de la
puerta 74LS11 pasará a nivel alto. En el flanco descendente de la señal ALE, también
generada durante el estado T1, se carga uno en U2A y la entrada READY del 8085
conmutará a nivel lógico bajo.

Durante el flanco de subida del ciclo T2, el µP examina la línea READY y en


siguiente pulso de reloj entrará en un estado de espera TW. El µP cesará toda activi-
dad por la duración de N pulsos de reloj, hasta cuando se reciba un comando PS
(CLKU2B) de paso simple.
Arquitectura y Operación del Microprocesador 8085A 126

Fig. 4.19. Circuito para paso simple.


Arquitectura y Operación del Microprocesador 8085A 127

Fig. 4.20 Ejecución de una instrucción de un ciclo de máquina y cuatro estados usando el modo de
paso simple.

En la transición positiva de PS, el biestable U2B forzará un cero en U2A, oca-


sionando que la entrada READY regrese a uno. El µP realizará la transición hacia los
estados T3 y T4 de M1 y hacia los estados T1 y T2 de la siguiente instrucción, repitién-
dose el proceso descrito hasta la ejecución de la última instrucción del programa en
proceso.

4.3.5 Ciclos de lectura y escritura en memoria y puertos de E/S.

Para instrucciones de más de un byte, el 8085A debe realizar al menos un ci-


clo de máquina adicional al de búsqueda para obtener todos los bytes de la instruc-
ción y completar la ejecución.

Considere la figura 4.21, donde se presentan los estados y ciclos de máquina


necesarios para ejecutar la instrucción STA dirección. La ejecución de STA direc-
ción causa que los ocho bits almacenados en el acumulador sean copiados en la posi-
ción de memoria especificada por el operando dirección.

Para procesar esta instrucción, el 8085A deben obtener tres bytes desde la
memoria del sistema: el código de operación y los dos bytes que identifican la direc-
ción a la cual se debe realizar la transferencia.

Durante el ciclo de máquina M1, el microprocesador interpreta el código de


operación de la instrucción y detecta que debe realizar otro acceso a la memoria en
búsqueda de la dirección a la cual debe transferirse el contenido del registro acumu-
lador.
Arquitectura y Operación del Microprocesador 8085A 128

Fig. 4.21 Ciclos de instrucción de STA dirección.

Los ciclos de máquina M2 y M3, ambos del tipo de lectura en memoria, son
necesarios para obtener el operando dirección de STA, mientras que durante M4 se
escribe a memoria el byte en el acumulador. El µP invierte cuatro ciclos de máquinas
y un total de trece estados en procesar STA dirección.

Fig. 4.22 Ciclo de instrucción para OUT 01H (OC=32H).

Los ciclos de máquina de lectura o escritura pueden ser de acceso a memoria


o a un puerto de E/S. En el repertorio de instrucciones del 8085A existen sólo dos
instrucciones para comunicación con puertos: IN puerto y OUT puerto. La ejecución
de la instrucción de dos bytes OUT puerto, carga el contenido del acumulador en el
bus de datos, mientras que en las dieciséis líneas de direcciones se duplica el número
de ocho bits del operando puerto. Como resultado, la información en el registro A es
transferida al dispositivo de salida con la dirección especificada por puerto. En la
Arquitectura y Operación del Microprocesador 8085A 129

figura 4.22 se muestra el diagrama de tiempos de los ciclo de máquina de búsqueda y


ejecución de la instrucción OUT 01H. El ciclo de instrucción de OUT puerto lo
constituyen tres ciclos de máquina distintos, el primero de búsqueda de OC, seguido
de un ciclo de lectura en memoria para obtener la dirección del puerto, y finalmente
un ciclo de escritura a memoria para realizar la transferencia hacia el dispositivo ex-
terno. Cada ciclo de máquina es identificado por las señales de estado
IO / M, S1 , y S 0 , como puede apreciarse en la figura 4.22. Estas salidas son generadas
al inicio de cada ciclo y mantienen sus niveles durante el transcurso del ciclo de má-
quina.

Durante el ciclo de búsqueda M1, la dirección en el PC es cargada en las lí-


neas de direcciones y el PC es incrementado para apuntar al siguiente byte de la ins-
trucción. El µP activa la línea de lectura RD y el código de operación de OUT puer-
to (32H) es transferido desde la memoria hasta interior del µP, donde es decodificado.
A la salida de T4 , el 8085A ha interpretado el OC y está enterado que debe regresar a
la memoria y extraer el número del puerto. En el estado T1 de M2, la dirección PC+1
es presentada en el bus de direcciones, se activa de nuevo RD y entonces la memoria
coloca en el bus de datos el número del puerto (01H), la cual se almacena en el µP.
Finalizado el ciclo de máquina M2, toda la información relativa a la instrucción en
proceso está en poder del 8085A y solo resta mover el contenido de A hacia el puerto
01H para completar la ejecución.

Para que en el ciclo M3 de escritura a puerto se realice la transferencia del by-


te en el A hacia el exterior del µP, es necesario cargar la dirección de 8 bits del puerto
en las líneas de direcciones. Para convertir el número del puerto en una dirección de
16 bits se repite la dirección (0101H) y se carga en el bus, como se observa en la fi-
gura 4.22. Al inicio del estado T2 de M3, el µP activa la señal de escritura WR , y
carga en el bus externo de datos el contenido de A. Durante T3 se completa la transfe-
rencia hacia el periférico identificado por los 8 bits altos o bajos del bus de direccio-
nes.

4.4 LA SECUENCIA DE INICIO DEL 8085

Cuando se suministra potencia a una aplicación basada en el 8085A, es de im-


portancia vital para el funcionamiento adecuado del sistema, que el soporte físico de
la máquina garantice que el µP entre en un estado inicial definido, una vez que la
tensión de alimentación alcance su valor mínimo de operación y que la señal de reloj
se haya estabilizado. La entrada RESET IN del 8085A se usa con el propósito de
llevar a la CPU al estado inicial deseado, después del proceso de arranque; o para
restituir las condiciones iniciales, si el µP está bloqueado o funcionando en situación
de falla. En ambos casos es necesario aplicar un nivel bajo al terminal, y mantenerlo
por un tiempo mayor o igual a la duración de tres ciclos del reloj interno.
Arquitectura y Operación del Microprocesador 8085A 130

Como resultado de la aplicación de una señal válida a RESET IN , el µP en-


tra en el estado de RESET (TR) y ejecuta una secuencia interna Durante el proceso de
inicio se pone en cero el contador de programa y el registro de instrucciones y se in-
habilita el sistema de interrupciones del µP. Todos los bits de control y de estado aso-
ciados a las líneas HOLD, READY, HLDA, y SOD, y los bits de ciclos de máquina y
estados de máquina, son cargados con cero. La figura 4.23 muestra el diagrama de
tiempos de la secuencia de inicio.

M1 M1
SEÑAL
T1 T2 TR TR TR TR T1

CLK

RESET IN

RESET OUT

Fig. 4.23 Secuencia de RESET.

Un comando de RESET finaliza la ejecución del programa y lleva a tercer es-


tado los buses de direcciones y datos y las líneas de control. Las banderas de condi-
ción de estados y los registros internos del µP no son manipulados durante la secuen-
cia de inicio, pero no puede asegurarse que mantengan su contenido después de una
operación de RESET.

El nivel de la entrada RESET IN es examinado durante cada pulso del reloj.


Cuando un nivel bajo es detectado, el µP, entra en TR y activa a uno la salida
RESET OUT , tal como indica la figura 4.23, para notificar al exterior que el µP esta
siendo iniciado. RESET OUT es sincrónica con el reloj CLK y permanece activa
durante un número entero de ciclos de reloj. Esta salida puede usarse para el inicio de
circuitos externos del sistema.

Mientras RESET IN permanezca en cero transcurren nuevos TR y se continúa


examinando el nivel de RESET IN . Durante este tiempo se ejecuta la secuencia de
inicio. Cuando se detecta el regreso a nivel alto de la línea RESET IN , la salida
RESET OUT vuelve a cero y el 8085A entra en el estado T1 del ciclo de máquina
M1 de la primera instrucción del programa.

Cuando el µP sale del estado TR, el contador de programa contiene la direc-


ción 0000H, de modo que después de una operación de RESET la primera instrucción
Arquitectura y Operación del Microprocesador 8085A 131

será buscada en esta dirección. Por esta razón conviene que la memoria EPROM de
sistemas basados en el 8085A ocupe la zona inicial del espacio de direcciones del µP.
Es usual que esta área de la memoria contenga la identificación del sistema, rutinas
de detección de fallas y comandos para programar los periféricos y controladores
asociados al sistema.

Es obvio que si el dispositivo no es iniciado durante TR, la naturaleza aleato-


ria de los estados iniciales alcanzados por registros y flip flops internos afectaría en
forma severa el funcionamiento del sistema. La ejecución de la secuencia de inicio
permite cargar los componentes internos de la CPU con valores lógicos procedentes
para la búsqueda y ejecución de la primera instrucción del programa.

Existen otras situaciones en las cuales es necesario forzar el 8085A al estado


inicial. Por ejemplo, es común insertar una instrucción HLT en un programa para
suspender temporalmente la ejecución en espera de una solicitud de interrupción por
parte de un periférico. Si no ocurre la interrupción, una operación de RESET es el
único medio para sacar al µP del estado THALT.

6.125 MHz

+5V

R1 8085A
5.1 KΩ 1N914

RESET C1
10μf

Fig. 4.24 Circuito de RESET.

En las versiones CMOS del 8085A, por ejemplo MSM80C85A, existe una
forma de operación conocida como modo de consumo bajo (power down mode), du-
rante el cual el µP mantiene la información en memoria, pero se suspenden las activi-
dades internas a tal punto que el consumo de potencia global se reduce en forma apre-
ciable. Reiniciar el µP, es una de las opciones para salir del modo de bajo consumo.
Un circuito típico para generar la señal de RESET, tanto en modo automático como
manual, se presenta en la figura 4.24.

Al activarse la fuente de +5V, el capacitor C1 aplicará un nivel bajo en la en-


trada RESET IN , iniciándose el estado TR. A continuación C1 se carga a través del
resistor R1 con constante de tiempo τ = R1C1. El µP se mantendrá en TR hasta cuando
Arquitectura y Operación del Microprocesador 8085A 132

el voltaje en C1 alcance el valor mínimo reconocido como uno lógico por el circuito
disparador de Schmitt de la entrada RESET IN . Este es VIHR = 2.4 V.

En condiciones normales de operación, el capacitor C1 mantiene en nivel alto


la entrada de RESET. Si se acciona el pulsador de la figura 2.24, se lleva a nivel bajo
a RESET IN por algunos milisegundos, al final de este periodo se repite el proceso
de carga de C1. El diodo D1 permite la descarga rápida del C1 al desconectarse al
energía.

La duración de TR es fijada por el valor deτ, de modo que bastará con selec-
cionarla para que asegure el mantenimiento de RESET IN en cero por un tiempo
equivalente al menos al de tres ciclos del reloj. No obstante deben tenerse presente
dos condiciones de operación que obligan a prolongar el tiempo de RESET. Primero,
debe considerarse que el voltaje de alimentación requiere algunos milisegundos para
alcanzar un nivel del 95% de VCC, o 4.75 V, especificado en la hoja técnica del dispo-
sitivo como voltaje mínimo de operación.

En segundo lugar, INTEL especifica que no garantiza, por razones concernien-


tes a la tecnología de fabricación del dispositivo, el funcionamiento correcto del µP
hasta 10 ms después que la tensión de alimentación VCC se eleve a 4.75 V . En conse-
cuencia, conviene que durante el arranque se retarde la subida a nivel alto de la entra-
da RESET IN , por un tiempo mayor a t95 + 10 ms, donde t95 es el tiempo transcurrido
desde la activación de la fuente de poder hasta cuando VCC = 4.75 V.

Fig. 4.25 Salida de la fuente de poder y señal RESET IN durante el arranque del µP.

La figura 4.25 ilustra la situación descrita. Una vez estabilizado VCC en 4.75
V, se deja transcurrir un tiempo 10 ms + tR. En el inicio de tR el µP funciona en con-
diciones normales y la línea RESET IN está en cero. La rutina de inicio se ejecuta y
Arquitectura y Operación del Microprocesador 8085A 133

el µP entrará al último estado TR, durante el cual se detectara un nivel alto en


RESET IN , y el 8085A transitará al ciclo de búsqueda de la primera instrucción del
programa. En realidad no representa un problema crítico la selección de la constante
de tiempoτ. El valor de 51 ms seleccionado para τ en el circuito de la figura 4.24,
mantiene a RESET IN en cero (por debajo de 2.4 V) durante 33 largos ms, desde el
momento de accionarse el interruptor de la fuente de poder.

Con la descripción del circuito que hace posible el transito del 8085A hacia el
estado TR, culmina la discusión del tópico de análisis de tiempos iniciada en este ca-
pítulo. Los diagramas de tiempos correspondientes a los ciclos de máquina de reco-
nocimiento de interrupción y operación en el estado HOLD y HALT, se analizan en
capítulos posteriores.
El Microcomputador Básico 134

El Microcomputador Básico

Para el diseño de un sistema empotrado basado un microprocesador y destina-


do resolver un problema específico de control, es necesario organizar un sistema mi-
crocomputador alrededor del µP. Los recursos ofrecidos por el 8085A, tales como el
sistema de interrupciones y el canal de comunicación serie, además de la versatilidad
de los circuitos de soporte, distinguen al dispositivo como una CPU apropiada para
uso en aplicaciones de control susceptibles de realizar con máquinas de 8 bits.

Debido a que el 8085A es un microprocesador, no tiene memoria, puertos de


E/S, ni temporizadores internos. En un sistema de cómputo basado en el 8085, todas
estas funciones deben ser realizadas por circuitos externos conectados a los buses del
microprocesador.

El 8085A puede usarse para construir un microcomputador usando los circui-


tos de soporte del dispositivo, o interconectando el microprocesador a circuitos de
memoria y puertos de E/S estándares. La selección del tipo de componente a utilizar
está determinada por la capacidad de la memoria y el número de puertos de E/S re-
queridos por la aplicación.

5.1 SISTEMA MCS-85 MÍNIMO

Para establecer los componentes mínimos necesarios para construir un sistema


de control típico basado en µP, considere el problema simple de supervisar los niveles
de temperatura en ocho puntos de un proceso usando termopares como sensores. El
sistema debe permitir que los valores de temperatura adquiridos, así como las even-
tuales condiciones de alarma sean presentados en la pantalla de un terminal o sean
transmitidos por el canal de comunicación serie hacia un microcomputador de mayor
capacidad. Un diagrama de bloques de sistema se muestra en la figura 5.1
El Microcomputador Básico 135

D0-D7
Vi MUX A S/H CAD
S2 S1 S0
S/H
start eoc
sensores

interrupción
D0-D7
salida
CDA
µC
analógica 8085A

salida serie entrada serie

PC

Fig. 5.1 Sistema de adquisición de datos.

La adquisición, medición y control de temperatura es una aplicación suscepti-


ble de ser realizada con un µP de ocho bits. En otros casos, el diseñador debe asegu-
rarse que la capacidad de procesamiento y el espacio de memoria del sistema son
recursos suficientes para satisfacer las exigencias impuestas por el problema de con-
trol. De igual forma debe garantizarse que toda la restricción de tiempo inherente a la
adquisición de los datos y control de la planta puede ser superada por el µP.

Cada sensor del sistema de adquisición de datos de la figura 5.1 proporciona


como señal de salida una tensión analógica, cuya magnitud es una función no lineal
del valor de la temperatura en el punto de prueba. El multiplexor analógico (MUX)
selecciona una de las señales para ser enviada al convertidor analógico digital (CAD),
después de ser procesada por el amplificador de instrumentación (A) y el circuito de
muestreo y mantenimiento (S/H). Por medio de las entradas de selección S0-S2 del
MUX se determina cual de las tensiones de entrada va a ser muestreada y convertida
a digital.

El amplificador incrementa la amplitud y reduce el nivel de ruido del voltaje


análogo. El circuito S/H muestrea la tensión de entrada y la mantiene constante du-
rante el tiempo que dure la conversión. El proceso de conversión se inicia cuando es
activada la línea START del CAD, y el fin de la conversión lo señala el CAD por me-
dio de la salida EOC. El valor digital presente a la entrada del convertidor digital ana-
lógico (CDA) es convertido en una tensión análoga y entregado al proceso. En caso
que sea necesario disponer de otras salidas análogas, debe usarse un circuito demulti-
plexor análogo.
Los circuitos de CAD y CDA son conectados al 8085A, por medio de puertos
de E/S de dirección determinada. Como puede observarse en el diagrama de bloques
del sistema, el valor digital equivalente al voltaje análogo desconocido es cargado en
El Microcomputador Básico 136

el µP. Este lo convertirá a unidades de temperatura y posteriormente lo transmitirá,


por el canal de comunicación serie, hacia un terminal o computador central. El CDA,
conectado a un puerto de salida, recibe un valor digital desde el µP y lo envía al pro-
ceso en forma de una tensión análoga.

El 8085A presenta en las entradas S0-S2 del multiplexor, el número del canal,
para seleccionar cual de las ocho señales va a ser convertida. Simultáneamente ordena
al circuito S/H que inicie el muestreo de la señal. Transcurrido un tiempo igual al re-
tardo de los circuitos MUX, A, y S/H, el µP detendrá el proceso de muestreo po-
niendo al S/H en el modo de mantenimiento y activará la señal START dando lugar al
inicio de la conversión.

Una vez culminada la conversión, el CAD usará la salida EOC para interrum-
pir al procesador. Como respuesta, el µP cargará en memoria el byte resultado de la
conversión y procederá a procesar la siguiente entrada. Una vez adquiridas las ocho
señales de entradas son convertidas en unidades de temperatura y enviadas al canal
serie, reiniciándose el proceso.

Para conectar la sección de adquisición de datos al µP, son necesarios tres


puertos, uno de entrada (Puerto A) y dos de salida (Puertos B y C). La salida del CAD
se acopla al puerto A, el puerto B entrega un valor digital a las entradas de CDA y
cinco líneas del puerto C son utilizadas por el µP para el control del proceso de ad-
quisición. El la figura 5.2 se observa que las líneas PC4- PC2 se usan para la selección
del canal, mientras que PC1 controla el S/H y PC0 suministra la señal de inicio de con-
versión.
D0-D7: CAD

PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 Puerto A: Entrada

PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 Puerto B: Salida

D0-D7: CDA

PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 Puerto C: Salida

S2 S1 S0 S/H START

Fig. 5.2 Funciones de las líneas de los puertos de E/S.

Las funciones de memoria y puertos necesarios para el sistema de supervisión


pueden ser suplidas por los circuitos de soporte del 8085A: el 8155/56 integra en el
encapsulado 256 bytes de memoria RWM, 2 puertos programables de 8 bits, uno de 6
bits y un contador/temporizador programable de 14 bits. El 8355/8755 provee 2 Kby-
tes de memoria ROM/EPROM y dos puertos 8 bits.
El Microcomputador Básico 137

En ambos dispositivos está integrado el registro de 8 bits necesario para sepa-


rar los datos y direcciones del bus multiplexado. La figura 5.3 presenta el símbolo
lógico de ambos circuitos.

Fig. 5.3 Dispositivos compatibles directamente con el 8085A.

No se requieren componentes LSI adicionales para construir la tarjeta necesa-


ria para la aplicación. Una vez que la tensión de entrada desconocida es convertida a
digital, el CAD activará la salida EOC de fin de conversión. Esta señal conecta a una
de las entradas de interrupción del 8085A. Pueden usarse cualquiera de las líneas
RST 5.5, RST 6.5, RST 7.5 o TRAP.

El uso del sistema de interrupciones del µP para detectar el final del proceso
de conversión de una muestra de la tensión de entrada, simplifica el diseño del siste-
ma. Cuando un periférico aplica un nivel alto a cualquiera de estas entradas una vez
que el µP acepta la solicitud, el contenido del contador de programa es almacenado
en la pila y el control del programa es transferido a una posición determinada de la
memoria.

El programador debe tener la previsión que la primera la instrucción de la ru-


tina que carga en memoria y procesa el dato adquirido, resida en la dirección del sal-
to. Lo usual es que la dirección del vector de interrupción contenga una instrucción de
salto incondicional al inicio de la rutina de servicio.

El problema propone el uso del canal serie del 8085A para que el micropro-
cesador se comunique con un microcomputador de mayor capacidad o con un termi-
nal remoto. La adquisición y procesamiento local usando grupos de microcomputado-
res de 8 bits interconectados a un computador central es una estructura muy usada en
control de procesos. Para establecer la comunicación se utilizan la entrada SID y sali-
da SOD del canal serie del µP. En el 8085A se integra un circuito transmisor/receptor
El Microcomputador Básico 138

asincrónico primitivo, el cual ser programado apropiadamente para establecer el en-


lace.

Si el microcomputador o terminal está separado del sistema de adquisición por


una distancia superior a 2 metros, la transferencia no puede ser realizada conectando
directamente el transmisor al receptor. A esta distancia, los niveles lógicos de 0 y
+5V sufrirán un deterioro severo debido a la atenuación introducida por el cable, el
ancho de banda del canal y la velocidad de transmisión.

Una de las soluciones a este problema es utilizar la interfase RS232C, la cual


consiste en elevar los niveles lógicos desde 0 y 5 V a valores superiores, uno positivo
para representar el cero lógico y otro negativo para el uno lógico.

Computador 8085A

SID

1 ≥ 2.0 V 0 = +V 1 ≥ 2.0 V
0 ≤ 0.8 V 1 = -V 0 ≤ 0.8 V

SOD

Fig. 5.3 Interconexión RS232C

Los circuitos integrados LM1488 y LM1489 pueden usarse como dispositivos


de interconexión entre el µP y el canal RS232C. El transmisor (LM1488) requiere
alimentación de ±12V. Si no se dispone de fuentes de doble polaridad, debe utilizarse
el dispositivo MAX-232, este circuito además de realizar el cambio de tensión de las
señales de transmisión y recepción, también permite el uso de una fuente única al
elevar el voltaje de la fuente desde +5 V hasta ±12V.

Usando los circuitos de soporte del 8085A, se diseña un sistema mínimo para
el control de la adquisición y presentación de datos. El acoplamiento de la entrada y
salida serie al canal RS232C se realiza por medio de circuitos integrados de propósito
específico. Para la recepción de datos se usa el LM1489 y para la transmisión, el
LM1489.
El Microcomputador Básico 139

Fig. 5.4 Sistema microcomputador mínimo con circuitos de la familia MCS-85

El diagrama eléctrico final de la tarjeta es el de la figura 5.4. La selección de


los componentes y el cableado de la sección análoga del sistema de adquisición de la
figura 5.1, se realizará en un capítulo posterior. Por ahora observe que el µP configu-
rado ofrece recursos suficientes para satisfacer las exigencias del sistema de adquisi-
ción.

El programa de la aplicación reside en los 2 Kbytes de memoria EPROM de


U2, mientras que las líneas de salida del CAD se conectan al puerto A del componente
U3. Al puerto B del mismo componente se acopla el CDA y por las líneas PC0-PC4 del
puerto C de U3 se generan las señales de selección del canal del multiplexor analógi-
co, la entrada de control del circuito de muestreo y mantenimiento y la señal de inicio
de conversión.

Las funciones asignadas a los puertos determinan que el puerto A del 8156
debe ser programado como entrada y los puertos B y C como salidas. La programa-
ción se realiza cargando un patrón de bits específico en el registro interno de coman-
dos, mostrado en la figura 5.2, del 8156. Los puertos de U2 y el temporiza-
dor/contador de U3 no se usan en esta aplicación. La salida de fin de conversión se
aplica a la línea de interrupción RST 6.5 y la conexión de los circuitos de interco-
nexión RS232C es directa, solo se requiere que la fuente de poder del sistema tenga
tensiones de salida de ± 12 V.
El Microcomputador Básico 140

Las entradas de interrupción no usadas son llevadas a nivel bajo al igual que le
entrada HOLD. Debido a que el tiempo de acceso de la RAM del 8156 y de la
EPROM del 8755 es de 400ns, no se requieren estados de espera por lo cual se man-
tiene la entrada READY en nivel alto. El fabricante del 8085A recomienda llevar las
salidas WR y RD a +5V usando resistores, para evitar que cuando estén en tercer
estado se produzcan selecciones falsas de dispositivos. Esto no lo muestra el diagra-
ma de la figura 5.4. Aunque el modo de operación y de programación del 8155/56 y
del 8355/8755 se discute en el capitulo 9, en esta sección conviene establecer como
está distribuido el espacio de memoria del 8085A, según establece la interconexión de
los componentes en el diagrama eléctrico de la figura 5.4.

Como se explicó con anterioridad, durante una operación de escritura o lectu-


ra en memoria o puerto de E/S, el µP identifica la posición de memoria o el puerto en
acceso colocando su dirección sobre el bus de direcciones y activa la salida
WR o RD . Según el tipo de operación en progreso, escribirá un dato sobre el bus
AD0-AD7 o leerá el contenido del mismo. El nivel lógico de la salida IO / M determi-
na si el acceso se realiza a una dirección de memoria o a un puerto de E/S. El µP
completará la lectura o escritura con independencia que el origen o destino de la in-
formación sea el deseado por el programador.

Cuando varios circuitos de memoria son conectados al sistema, cada disposi-


tivo debe ser habilitado para una zona particular del espacio de memoria. El meca-
nismo usado para decodificar la memoria debe asegurar que no exista la posibilidad
que dos posiciones de memoria sean seleccionadas simultáneamente. En el caso del
sistema de supervisión y presentación de temperaturas, se tienen dos áreas de memo-
ria física: 2048 bytes correspondientes a la EPROM del circuito 8755 y 256 bytes de
la sección de memoria RWM del 8156.

La selección de los circuitos de memoria y puertos de E/S se realiza usando el


método de selección lineal. Para situar los 2 Kbytes de la EPROM en el espacio de
memoria de 64K del 8085A, se conecta la línea de dirección A11 a la entrada habilita-
ción CE1 mientras que la otra entrada de selección, CE 2 es forzada a uno lógico.
Debido a que el circuito 8755 es habilitado cuando CE1 = 0 y CE 2 = 1 , el 8755 será
seleccionado cada vez que la línea A11 esté en nivel bajo, como señala la tabla 5.1 de
decodificación de direcciones.

El proceso de adquisición se inicia una vez que el µC sale del estado de RE-
SET, después de aplicarse potencia a la tarjeta. Debido a que el programa reside en la
EPROM, cuando una dirección de los dos primeros Kbytes (0000H-07FFH) del espa-
cio de direcciones se presente el bus, debe habilitarse el 8355. Con el esquema selec-
cionado se satisface tal condición, pero en realidad el 8355 será seleccionado cada
vez que el bus contenga una dirección comprendida en los rangos 0-2K, 4-6K, 8-10K,
12-14K, 16-18K,...,60K-62K, lo cual representa 16 bloques de 2Kbytes, para un total
de 32 K.
El Microcomputador Básico 141

Tabla. 5.1 Espacio de memoria ocupado por las memorias EPROM y RWM
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
x x x x 0 0 0 0 0 0 0 0 0 0 0 0

EPROM x x x x 0 0 0 0 0 0 0 0 0 0 0 1
(2K) . . . . . . . . . . . . . . . .
x x x x 0 1 1 1 1 1 1 1 1 1 1 0
x x x x 0 1 1 1 1 1 1 1 1 1 1 1
x x x x 1 x x x 0 0 0 0 0 0 0 0
x x x x 1 x x x 0 0 0 0 0 0 0 1
RWM . . . . . . . . . . . . . . . .
(256 bytes)
x x x x 1 x x x 1 1 1 1 1 1 1 0
x x x x 1 x x x 1 1 1 1 1 1 1 1

Para cualquier dirección en esta zona, la línea A11 está en cero. Observe que
esto lo determina la condición indiferente de las líneas A12-A15. Si asignamos un nivel
bajo a estas líneas y se tiene la precaución que ningún otro dispositivo ocupe las di-
recciones señaladas se puede programar el µC suponiendo que el rango 0000H-
07FFH lo ocupa la EPROM.

El 8155 es seleccionado cuando la línea A11 está en nivel alto, lo cual ocurre
para los restantes 32K del espacio total de memoria. Considerando de nuevo como
cero la condición indiferente, la zona de memoria donde está situada la RWM está
comprendida desde 0800H hasta 08FFH. Como el µC está dedicado a una aplicación
específica, es suficiente con garantizar que no existirá conflicto entre las posiciones
de memoria de los dos circuitos existentes.

Al igual que ocurre con la sección de la memoria EPROM, los puertos de E/S
del 8755 solo podrán se seleccionados cuando la línea de direcciones A11 esté en ni-
vel bajo. El circuito 8755 tiene cuatro registros internos: el puerto A, el puerto B y
dos registros de programación, uno para cada puerto. La dirección particular de los
puertos la especifica las líneas del bus multiplexado AD0-AD1. En la tabla 5.2 se pre-
senta la asignación de direcciones para los registros de E/S del 8755.
Tabla. 5.2 Direcciones de puertos de E/S para el 8755
Dirección del Puerto de E/S
AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 Registro selccionado
x x x x x x 0 0 Puerto A de E/S
x x x x x x 0 1 Puerto B de E/S
x x x x x x 1 0 Registro de dirección de dato del puerto A
x x x x x x 1 1 Registro de dirección de dato del puerto B
El Microcomputador Básico 142

El estado lógico de la señal IO / M distingue cuando se solicita acceso a una


posición de memoria o a un puerto. El uso de IO / M también determina que la lectu-
ra o escritura en un registro de E/S solo pueda realizarse mediante la ejecución de
una instrucción IN puerto o OUT puerto. Cuando se ejecuta una de estas instruccio-
nes, el número del puerto es duplicado sobre las 16 líneas de direcciones. Debido a
que la línea de dirección A11 debe estar en cero, el operando puerto de IN y OUT debe
ser especificado como indica la figura 5.5. El estado lógico bajo del bit 3 del número
del puerto, garantiza que A11 estará en cero.

x x x x 0 x AD1 AD0

Fig. 5.5 Patrón de bits del número de puerto para el 8755

El circuito 8155 tiene seis registros internos, los cuales son tratados como
puertos de E/S. Cuatro de éstos corresponden a la sección de E/S del dispositivo: el
registro de comando para programar los puertos, los puertos de E/S: A, B y C, y dos
registros para programar el temporizador. Para el acceso a uno de estos registros la
salida A11 deberá estar en uno lógico y la dirección particular de los puertos la deter-
mina las líneas AD0-AD2, tal como indica la figura 5.6.

x x x x 1 AD2 AD1 AD0

Fig. 5.6 Patrón de bits del número de puerto para el 8156

La tabla de asignación de direcciones para la sección de E/S del 8155 se ofre-


ce en la tabla 5.3.

Tabla. 5.3 Direcciones de puertos de E/S para el 8156

Considerando una vez más como cero, las condiciones especificadas como in-
diferente en los patrones de bits de las figuras 5.5 y 5.6, se obtienen para los puertos
las direcciones especificadas por la tabla 5.4. Aunque los puertos de E/S del 8755 no
se usan en el sistema de adquisición, sus direcciones también se indican.
El Microcomputador Básico 143

Tabla. 5.4 Direcciones de los puertos de E/S


8755 Puerto A 00H
Puerto B 01H
DDR A 02H
DDR B 03H
8156 RC/S 08H
Puerto A 09H
Puerto B 0AH
Puerto C 0BH
T/C bajo 0CH
T/C alto 0DH

Se ha mostrado que el diseño un µC usando el 8085A y sus circuitos de sopor-


te, es una tarea sencilla. En realidad el trabajo se limita a conectar terminal a terminal
los 3 dispositivos. Si una aplicación exige mayores recursos que los ofrecidos por el
sistema mínimo, pueden usarse circuitos 8755 y 8156 adicionales y utilizar las líneas
de direcciones A12 hasta A15 para seleccionarlos.

Cuando se usa el método de selección lineal para habilitar varios dispositivos,


las áreas de memoria asignadas a cada uno de los chips no corresponden a bloques
contiguos, quedando como responsabilidad del programador reconocer las áreas vá-
lidas de memoria. Otra desventaja de la selección lineal es que limita el número de
circuitos posibles de conectar al µP, debido a secciona por la mitad el espacio dispo-
nible de memoria por cada línea de dirección usada como señal de habilitación. Este
obstáculo puede ser superado usando circuitos decodificadores, como sugiere la figu-
ra 5.7. El dispositivo 8155 cumple funciones iguales que el 8156, exceptuando el
hecho que el circuito es seleccionado aplicando un nivel bajo en la entrada de habili-
tación CE .

Otra posibilidad de expandir el sistema MCS-85 mínimo se muestra en la fi-


gura 5.8. El uso de los circuitos de soporte del 8085A se recomienda para sistemas
que requieran poca memoria. En la medida que se incrementen las exigencias de
memoria o de puertos de entrada y salida, deberán conectarse componentes adiciona-
les al microprocesador. Para aplicaciones que exijan capacidad de memoria mediana
o grande, puede ser preferible apelar al uso de dispositivos estándares. En tal situa-
ción deberá usarse un registro externo de 8 bits para demultiplexar el bus de direccio-
nes /datos.

5.2 INTERCONEXIÓN DEL 8085A CON DISPOSITIVOS CON-


VENCIONALES.

Los circuitos de soporte del 8085 simplifican en forma notable el diseño de un


sistema µC debido a que están diseñados específicamente para conectarse al bus mul-
tiplexado del µP. Cuando se considere necesario, es posible acoplar circuitos conven-
cionales de memoria o puertos al 8085A siempre que se separen las ocho líneas me-
El Microcomputador Básico 144

nos significativas de las direcciones del bus AD0-AD7. Una vez que se dispone de las
16 líneas de direcciones, cualquiera de las técnicas de selección expuestas en la sec-
ción anterior pueden ser utilizadas para la habilitación de componentes estándar.

Fig. 5.7 Sistema expandido con selección usando decodificadores 3 a 8


El Microcomputador Básico 145

Puerto A (8)

Puerto B (8)

Puerto A (8)

Puerto B (8)

Puerto A (8)

Puerto B (8)

Puerto A (8)

Puerto B (8)

Puerto C (6)

Puerto A (8)

Puerto B (8)

Puerto C (6)

Fig. 5.8 Sistema MCS-5 expandido.

El 8085A no tiene señales de control individuales para indicar a circuitos de


memoria o puertos que se dispone a iniciar una operación de lectura o escritura. Estas
funciones las cumple en conjunto las señales IO / M , WR y RD .

A0-A15
A8-A15

A0-A7

8085A
Puerto Puerto
ALE LACTH EPROM RWM de de
Entrada Salida

D0-AD7
MRD MWR IORD IOWR
RD
WR Decodificador
IO/M

Fig. 5.9 Sistema 8085 usando componentes externos convencionales


El Microcomputador Básico 146

Para el control del acceso a memoria y puertos convencionales, estas salidas


pueden combinarse para obtener señales de lectura y escritura correspondientes. En el
diagrama de bloques de la figura 5.9 se observa el modo de conexión del 8085A a
dispositivos externos estándar, destacándose el registro latch y una lógica para gene-
rar las salidas de lectura/escritura.

La demultiplexión del bus AD0-AD7 se realiza usando la salida ALE como se-
ñal de reloj de un registro convencional de 8 bits.

74LS373

ALE G

8085A Q0 - Q7 A0-A7

AD0-AD7 D0-D7

OC

D0-D7

Fig. 5.10 Demultiplexión del bus de direcciones/datos del 8085A.

Es conocido por el lector que la salida ALE es activada a nivel alto al inicio
del estado T1 de todo ciclo de máquina, como medio de notificar a dispositivos exter-
nos que el bus AD0-AD7 contiene información correspondiente a direcciones. De mo-
do que se puede por medio del lacth capturar los ocho bits menos significativos de la
dirección generada por el µP para que estén disponibles durante la duración de todo el
ciclo de máquina.

En la figura 5.10 se muestran las conexiones necesarias para realizar la demul-


tiplexión del bus. Las salidas Q0-Q7 del 74LS373 siguen el valor de las entradas co-
rrespondientes AD0-AD7, cuando la línea G está en nivel lógico alto, y capturan el
último valor de las entradas cuando G vuelve a cero. Conectando la salida ALE del µP
a la entrada G del registro se garantiza la retención de los ocho bits de menor peso de
la dirección.

Para generar las salidas de control para la lectura y escritura en dispositivos


convencionales de memoria y de puertos de E/S, se utiliza la lógica discreta de la
figura 5.11.
El Microcomputador Básico 147

Fig. 5.11 Decodificador de señales de lectura y escritura en memoria y E/S

El diagrama eléctrico del µP 8085A, listo para ser interconectado a circuitos


de memoria o de puertos de E/S convencionales se presenta en la figura 5.12. Debido
a que el objetivo es diseñar un sistema mínimo basado en el microprocesador 8085A
pero que use componentes externos estándar, y sea capaz de realizar las tareas de con-
trol del sistema de supervisión de temperatura de la figura 5.1, se deben seleccionar
los dispositivos de memoria y de E/S a utilizar. A continuación se procede a seleccio-
nar la memoria de programa y de datos y el circuito integrado de puertos de E/S.

5.2.1 La memoria de programa

Para almacenar el programa de control del sistema de supervisión de tempera-


tura, se requiere un circuito de memoria programable, que pueda ser eventualmente
borrada. La capacidad de almacenamiento del dispositivo debe ser de 2048 bytes y
con tiempo de acceso inferior a 575 ns. Las memorias EPROM son un tipo de ROM
que pueden ser programadas y borradas por el usuario.

En el mercado electrónico existe una extensa variedad de memorias EPROM,


disponibles para satisfacer exigencias de cualquiera aplicación. Las EPROM más
usadas en aplicaciones con µPs son la 2716, 2732, 2764, 27128, 27256,27512 y
271024 con capacidades desde 2Kbytes hasta 128 Kbytes y con velocidades desde
450 ns a 45 ns.

Para sustituir la sección de memoria EPROM del dispositivo 8755 se elige el


circuito integrado con código 2716, el cual es una EPROM con una capacidad de 2
Kbytes y un tiempo de acceso igual a 450 ns, para la versión más lenta. El dispositivo
se presenta en un encapsulado de 24 pines y en la figura 5.13 se presenta la distribu-
ción de terminales del circuito.
El Microcomputador Básico 148

Fig. 5.12 Unidad de proceso central de un microcomputador clásico


El Microcomputador Básico 149

A7 VCC
A6 A8
A5 A9
A4 VPP
A3 OE
A2 2716 A10
A1 2K x 8
CS/ PGM
A0 O7
O0 O6 A0 – A10 Direcciones
O1 O5 O0 - O7 Salida de Datos
O2 O4 OE Habilitar Salida

GND O3 CS / PGM Selección de chip/ Programar

Fig. 5.13 Distribución de terminales de la EPROM 2716.

El circuito integrado código 2716 tiene 11 líneas de direcciones (A0-A10) para


brindar acceso a las 2048 posiciones de la memoria, y 8 salidas de datos D0-D7. El
modo de operación lo establece las 2 entradas de control ( CS y OE ), de acuerdo con lo
indicado en la tabla 5.5.

Tabla. 5.5 Modos de operación de la EPROM 2716.


MODO OE CS / PGM VPP VCC SALIDAS
Deshabilitar VIH x +5 +5 Z
Lectura VIL VIL +5 +5 DATOSsalida
Espera x VIH +5 +5 Z
VIH
Programar VIH VIL +25 +5 DATOSentrada

Verificar Programa VIL VIL +25 +5 DATOSsalida


Inhibir Programa VIH VIL +25 +5 Z
VIL : TTLbajo 0.8 Vmáx VIH : TTLalto 2.0 Vmín Z: Alta Impedancia

La EPROM tiene dos entradas de alimentación: VCC y Vpp. En funcionamiento


normal, ambos terminales se conectan a +5 V. Durante el proceso de programación de
la memoria, el terminal Vpp debe estar a +25 V. Como ilustra la figura 5.14, para ob-
tener en las salidas D0-D7 el contenido de una posición de la 2716, los terminales de
habilitación de salida OE y de selección de chip CS deben estar en estado cero. Un
El Microcomputador Básico 150

nivel alto en cualquiera de estas entradas colocan las salidas de los buffers en estado
de alta impedancia.

Fig. 5.14 Estructura interna de la EPROM.

La entrada de selección de chip, CS , cumple una función doble de control.


Además del uso típico de seleccionar el circuito entre un grupo de dispositivos de
memoria con salidas conectadas a un bus común, la línea CS permite controlar la
potencia consumida por la 2716. Cuando CS es llevada al nivel lógico uno, y con
independencia del nivel de la entrada de habilitación de salida OE , se remueve la
alimentación de los componentes internos de la memoria, quedando sin energía el
decodificador de fila, los buffers de salida y el multiplexor de columna. Este modo de
operación se conoce como de consumo bajo o espera, y está caracterizado por un
gasto total de potencia que corresponde a una fracción (25%) de la necesaria para la
operación normal del chip.

Un ciclo de lectura de la 2716 se muestra en la figura 5.15. La entrada CS se


usa para seleccionar la memoria y OE para habilitar la presentación de los datos en
los terminales de salida. El proceso de lectura de la EPROM se inicia con la aplica-
ción de una dirección válida a las líneas A0-A10, a continuación se selecciona la me-
moria y se habilitan los buffers de salida llevando a cero las entradas CS y OE , res-
pectivamente. Transcurrido el tiempo de acceso, el dato almacenado en la posición
escogida se presenta en las líneas O0-O7.
El Microcomputador Básico 151

DIRECCIONES
Dirección valida

CS

tCE

OE
tOE

tACC tOF
SALIDAS Datos validos

Fig. 5.15 Ciclo de lectura de la EPROM 2716

Características AC

tACC Tiempo de acceso (Access Time) 450 ns máximo


Espacio de tiempo transcurrido entre la aplicación de una dirección estable y la aparición de
los datos en la salida de la memoria.

tCE Tiempo de habilitación de salida (Output Delay from CS ) 450 ns máximo


Retardo entre la aplicación de la señal de selección de chip CS y la salida de datos válidos

tOE Output enable to output float 120 ns máximo


Tiempo que transcurre desde la activación de la entrada OE hasta que existe un dato de
salida válido.

tDF Output enable high to output float 100 ns máximo


Tiempo desde la supresión de la entrada OE hasta cuando las salidas van a estado de alta
impedancia.

Como se observa en la figura 5.16, se usa selección lineal para situar la 2716
en la misma área de memoria que la ocupada por la sección de EPROM del 8755 del
µC de la figura 5.4. La línea de dirección A11 se conecta a CS y la salida de lectura
en memoria, MRD , se aplica a la entrada de habilitación de salidas OE .

5.2.2 La memoria de datos

Para suplir la zona de memoria volátil se usa una RWM estática 6116 de 2
Kbytes, en lugar de los 256 bytes del 8156.
El Microcomputador Básico 152

Fig. 5.16 EPROM 2716 decodificada para el rango 0000H-07FFH

A7 VCC
A6 A8
A5 A9
A4 WE
A3 OE
A2 6116 A10
A1 2K x 8 CS
A0 D7 A0 -A10 Direcciones
D0 D6 D0 - D7 E/S de Datos
D1 D5 CS Seleccionar Chip
D2 D4 OE Habilitar Salida
GND D3 WE Habilitar Escritura

Fig. 5.17 Distribución de terminales de la RWM 6116.

Tabla. 5.6 Modos de operación de la RWM 6116.


MODO WE CS OE D0 –D7
Lectura VIH VIL VIL DATOSsalida
Escritura VIL VIL x DATOSentrada
Deshabilitar VIH x VIH Z
Espera x VIH x Z
El Microcomputador Básico 153

La memoria estática 6116 dispone de 11 líneas de direcciones A0-A10 y 8 ter-


minales para E/S de datos, D0-D7. Las líneas de control CS y OE funcionan en forma
idéntica que en la EPROM 2716, mientras que la entrada WE es la señal de escritura
de datos. El tiempo de acceso de la versión más lenta del dispositivo es de 250 ns. El
ciclo de lectura de una celda de memoria de la RWM es similar al descrito para la
EPROM. Para explicar como se almacenan los datos en la memoria, se muestra en la
figura 5.18 el diagrama de tiempos de un ciclo de escritura.

Una operación de escritura se inicia con la aplicación en las líneas A0-A10 de


dirección de la posición donde se almacenará el dato, la cual debe permanecer estable
en A0-A10 durante un tiempo tAS, antes de la activación de las señales de control CS y
WE , para permitir que la memoria decodifique la nueva dirección. Si esta restricción
es violada, el dato en D0-D7 se almacena en una posición con dirección imposible de
predecir.

tWC
DIRECCIÓN

tCSW

CS

tAS tWP tAH

WE

tDS tDH
D0 - D7

Fig. 5.18 Ciclo de escritura de la RWM 6116

Cuando las entradas de selección y escritura van a nivel alto, la dirección debe
mantenerse válida durante un tiempo tAH. La duración del pulso bajo de la entrada de
selección de chip CS debe ser al menos tCSW para asegurar la selección de la celda
mientras que el ancho del pulso de escritura WE debe ser mayor o igual a tWP para
garantizar que la información se coloca en la dirección seleccionada .

Al colocarse el dato en los terminales de entrada, debe permanecer estable


cuando menos un tiempo tDS antes, y un intervalo tDH después, que las entradas de
selección de chip CS y habilitación de escritura WE sean removidas. La duración del
ciclo de escritura es tWC
El Microcomputador Básico 154

Características AC
tAS Tiempo de preparación de direcciones (Address Setup Time Before Write)
Intervalo durante el cual todas las líneas de direcciones deben mantenerse estables antes
que las entradas WE y CS ( ambas en cero lógico) sean aplicadas a la memoria.

tAH Tiempo de retención de direcciones (Address Hold Time After Write)


Lapso durante el cual la dirección debe permanecer válida después de desactivar a WE y
CS .

tCSW Tiempo de preparación de CS . (Chip Select Setup Before End of Write)


Duración mínima de la entrada de selección de chip.

tWP Ancho del pulso de escritura (Write Pulse Width)


Ancho mínimo del pulso WE .

tDS Tiempo de preparación del dato (Data Setup Time Before End of Write)
Espacio de tiempo que deben permanecer estables los datos en la entrada de la memoria
antes de la desactivación de las entradas de selección y escritura.

tDH Tiempo de retención del dato (Data Hold Time After End of Write)
Lapso que debe mantenerse válido el dato a la entrada de la memoria después de la remo-
ción de las entradas de selección y escritura.

Las especificaciones técnicas de las memorias SRWM distinguen entre dos


modos de ciclo de escritura:
1. Escritura bajo control de WE
2. " " " " CS .

El diagrama de tiempos mostrado en la figura 5.18 corresponde a la memoria


de lectura/escritura estática 6116 operando en modo 1. La diferencia la establece cual
de las dos señales, WE o CS , se activa de último y se remueve primero.

Para que la memoria RWM sea decodificada en las mismas direcciones que la
sección de RAM del 8156 de la figura 5.4, es suficiente con aplicar la a la entrada
CS , el complemento de la línea de direcciones A11. Las señales de lectura y escritura
MRD y MRW se conectan respectivamente a las entradas o OE y WE de la 6116,
como especifica la figura 5.19.

5.2.3 Los puertos de entrada y salida

Para conectar al 8085A la etapa de adquisición de datos de temperatura se uti-


lizaron la sección de E/S del 8156. Para cumplir las funciones de E/S de la CPU de la
figura 4.41, se usa un circuito programable para interconexión de periféricos del tipo
PPI 8255 (PPI: Programmable Peripheral Interface). El 8255 es un circuito LSI de
uso difundido y de bajo costo. A pesar que fue introducido en la década de los setenta
El Microcomputador Básico 155

como un componente de E/S para sistemas basados en el μP 8080 de INTEL, aun es


posible encontrarlo (no necesariamente como un 8255 discreto) en μCs basados en
procesadores modernos, cumpliendo funciones de puerto para la conexión de teclado
e impresora.

Fig. 5.19 RWM 6116 decodificada para las direcciones comprendidas entre 0800H-0FFFH

Una descripción con detalle del dispositivo y la presentación de aplicaciones


típicas, se realizará en el capítulo 9. Por ahora, interesa más bien entender como se
interconecta el PPI al 8085A y la forma en la cual es seleccionado por el µP. El 8255
tiene 24 líneas de E/S distribuidas en 3 puertos de 8 bits, los cuales los cuales pueden
ser programados como entradas o salidas en 2 grupos (A y B) de 12 líneas y puede
usarse en tres modos principales de operación. La configuración de los terminales y el
símbolo eléctrico del circuito programable para interconexión de periféricos 8255,
son los mostrados en la figura 5.20.

8255

Fig. 5.20 Distribución de terminales del PPI 8255


El Microcomputador Básico 156

El grupo A está formado por el puerto A:PA0-PA7 y por los cuatro bits de or-
den mayor del puerto C (PC4-PC7); el grupo B está compuesto por las ocho líneas del
puerto B: PB0-PB7 y los cuatro bits menos significativos del puerto C (PC0-PC3).
Además de los puertos el 8255 contiene un registro de comandos para la programa-
ción del dispositivo. Para que el 8085A pueda tener acceso a uno de los registros para
programar el dispositivo o usar uno de los puertos, la entrada de habilitación CS de-
be ponerse a nivel bajo. La selección del registro de comando o de un puerto de E/S
particular se realiza por medio de las entradas de dirección A0 y A1, según lo indica-
do por la tabla siguiente.

Tabla. 5.7 Direcciones de los registros internos del PPI 8255


Dirección del Puerto de E/S
Registro seleccionado
A7 A6 A5 A4 A3 A2 A1 A0
x x x x x x 0 0 Puerto A de E/S
x x x x x x 0 1 Puerto B de E/S
x x x x x x 1 0 Puerto C de E/S
x x x x x x 1 1 Registro de comando

El tipo de operación a realizar es determinado por la activación de una de las


entradas de control: RD o WR . Estas líneas de entrada deben conectarse, respectiva-
mente, a las salidas de control de lectura y escritura en puerto de E/S: IORD e IOWR
de la CPU de la figura 5.16. Las ocho líneas bidireccionales de datos (D0-D7) del
8255 se acoplan al bus de direcciones/datos AD0-AD7 y permanecerán en estado de
alta impedancia cuando CS no esté activa; o en caso que RD y WR estén ambas en
uno, independientemente del estado de CS . La tabla 5.8 muestra el modo básico de
operación del 8255.

Tabla. 5.8 Tabla de estados del PPI 8255


El Microcomputador Básico 157

La interconexión del 8255 al µP se realiza como indica la figura 5.21. Observe


que para seleccionar el circuito, se usa el complemento de la línea de direcciones A11.

Fig. 5.21 Conexión del PPI 8255 al µP 8085A

Cuando se aplica tensión para arrancar al sistema, la señal de salida de 8085A:


RESET OUT se activa en alto, y fuerza al 8255 a iniciarse con todos los puertos
programados como entrada. Si tal configuración no es la deseada para la aplicación,
el PPI debe ser reprogramado escribiendo un cierto patrón de bits en el registro de
comando. La selección lineal del 8255 usando la línea A11, establece las direcciones
de los puertos como especifica la figura 5.22.

A15 A14 A13 A12 A11 A10 A9 A8


Puerto A 08H
A7 A6 A5 A4 A3 A2 A1 A0 Puerto B 09H
Puerto C 0AH
x x x x 1 x A1 A0 Comando 0BH

Fig. 5.22 El PPI 8255 es seleccionado por medio de la línea de dirección A11.

Observe que para seleccionar el área de 2048 Kbytes de la memoria de lectu-


ra/escritura 6116 y al PPI 8255 se usa la misma señal ( A11 ). No obstante, las líneas
de datos de ambos dispositivos nunca se conectan simultáneamente al bus de direc-
ciones/datos AD0-AD7 del 8085A. Esto es posible porque el espacio de direcciones
de memoria está separado del correspondiente a los puertos de E/S. Durante una ope-
ración de lectura o escritura, el 8085A indica que la dirección en el bus se refiere a
una posición de memoria activando una de las señales: MRD o MRW ; mientras que
un acceso a un puerto de E/S es notificado por medio de les señales IORD o IOWR .

Durante una operación de lectura (escritura) de la memoria RWM, se selec-


ciona el chip 6116 y se activa en nivel bajo la señal MRD ( MRW ) para leer (escri-
El Microcomputador Básico 158

bir) la posición especificada por las líneas de direcciones A0-A10. Aun cuando está
operación pone un nivel cero en la entrada CS del 8255, el bus de datos (D0-D7) del
PPI permanece en tercer estado debido a que las entradas de control IORD e IOWR
están ambas en nivel alto. Esto puede ser verificado consultando la tabla 5.8 de fun-
cionamiento del 8255.

Una situación similar ocurre cuando se ejecuta una instrucción IN puerto


(OUT puerto). Con el 8255 habilitado, se activa la línea IORD ( IOWR ) para leer
(escribir) el registro de E/S del 8255 identificado por el estado de las líneas de direc-
ciones A0-A1. En este caso la memoria 6116 permanece inactiva porque las señales
MRD y MRW , ambas en uno, mantienen flotantes las líneas de datos (D0-D7) del
circuito. Si se desea mantener la memoria RWM en el modo de bajo consumo
( CS =1) cuando se habilite el 8255, puede usarse una de las líneas de direcciones A12-
A15 (en lugar de A11) para seleccionar el PPI.

En la figura 5.23 se presenta el diagrama final de la sección de memoria y


puertos de E/S, usando dispositivos convencionales, para el sistema de adquisición y
supervisión de datos de la figura 5.1,

5.3 DECODIFICACIÓN EXHAUSTIVA DE LAS DIRECCIONES

En la técnica de selección lineal, cada línea de bus de direcciones del µP se


utiliza para habilitar un componente particular del sistema. Este método usado hasta
ahora para decodificar las direcciones de los circuitos de memoria y puertos tiene
varias desventajas. En primer término, el número de dispositivos posibles de selec-
cionar está limitado por el número de líneas de dirección no usadas para acceder a
posiciones de memoria.

En el caso del µC de la figura 5.4 para el acceso a los 2 Kbytes de EPROM del
8755 son necesarios once líneas de direcciones, mientras que para los 256 bytes de la
RWM del 8156 bastan con sólo ocho líneas. Esto significa que de los dieciséis bits
del bus de direcciones, once (211=2048K) están destinadas para el acceso a las áreas
de EPROM y RAM. Es común que la mayoría de las aplicaciones requieran una zona
de EPROM de mayor capacidad que la de RWM.

Como indica la figura 5.24, las cinco líneas de direcciones A11-A15 pueden
usarse para seleccionar los componentes. La línea A11 selecciona la EPROM y la
RAM quedando los cuatro bits restantes para habilitar otras memorias o dispositivos
de E/S. A pesar del número reducido de dispositivos posibles de habilitar mediante
está técnica, es muy utilizada en sistemas pequeños por que no requiere de circuitos
decodificadores y disminuye el número total de componentes y el costo de construc-
ción del sistema.
El Microcomputador Básico 159

Fig. 5.23 Sección de memoria y E/S del µC de la figura 5.12.


El Microcomputador Básico 160

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

PUERTOS EPROM/RAM POSICIONES


DE E/S EPROM/RAM

Fig. 5.24 Esquema de selección lineal.

Otra desventaja asociada a esta técnica es que secciona por la mitad el espacio
total de 64K de memoria disponible, por cada bit individual de dirección usado como
señal de selección de chip. El uso de la línea A11 para seleccionar la EPROM del 8755
en el µC de la figura 5.4, divide el espacio de memoria en dos bloques de 32K cada
uno. Otra limitación de la selección lineal es que si se utiliza para habilitar varios
8755, dos por ejemplo, las zonas ocupadas por la sección de memoria de cada circuito
no son contiguas. La del primero estará asignada desde 0 a 2K y la del segundo desde
6K hasta 8K, como se deduce examinando el sistema de la figura 5.8. En estos casos,
es responsabilidad del programador reconocer las áreas válidas de memoria.

Al no utilizar todas las líneas de direcciones para decodificar la dirección de la


posición de memoria a la cual se desea acceso, la selección lineal resulta en una de-
codificación parcial del espacio de direcciones. Tal esquema es permitido como me-
dio de simplificar el decodificador, siempre y cuando el sistema no utilice todo el
espacio de memoria del µP. Una decodificación incompleta significa que una misma
posición de memoria puede ser seleccionada con direcciones diferentes. Recuerde que
se indicó en la sección 5.1 que aun cuando la EPROM está asignada a los primeros
2Kbytes (000H-07FFH), la sección de memoria del 8755 será seleccionada cada vez
que el bus contenga una dirección comprendida en los rangos 0-2K, 4-6K, 8-10K, 12-
14K,16-18K, ...,60K-62K. Estos bloques adicionales se conocen como zonas imagen
y su número puede ser calculado por la ecuación,

(n − j − k − l)
I=2

donde:
n: número de líneas del bus de direcciones.
j: número de entradas de direcciones de la memoria.
k: número de líneas de direcciones usadas en la decodificación externa, y
l: número de líneas comunes a la decodificación externa e interna.

En el caso en discusión, I=2(16-11-1-0) = 16. Las zonas imagen del bloque de 2K


de la EPROM del 8755 se muestran en el mapa de memoria de la figura 5.25, y co-
rresponden a las direcciones para las cuales la línea A11 está en cero.
El Microcomputador Básico 161

FFFFH

60K-62K

20K-22K

16K-18K

12K-14K

8K-10K

4K-6K

0-2K
0000H

Fig. 5.25 Ubicación del bloque de 2Kbytes en el espacio de 64 K de memoria.

Una decodificación completa de las direcciones es posible por el uso de cir-


cuitos decodificadores. Como resultado, una y solo una posición corresponderá al
contenido del bus en un momento determinado. A cada dispositivo componente del
sistema se le asigna con exclusividad una zona del espacio total de direcciones de
memoria. En el µC de la figura 3.51 se usaron puertas OR discretas para decodificar
en forma exhaustiva los 512 bytes de la memoria de lectura/escritura del microcom-
putador.

Ejemplo 5.1

Suponga que desea decodificar, usando lógica SSI, una memoria EPROM
2764 de 8Kbytes para el rango de direcciones 0000H—1FFFH. El estado de las líneas
del bus en el rango especificado es el mostrado en la tabla 5.9.

Tabla. 5.9 Direcciones del bloque de 8K de una memoria 2764


A15 A14 A13 A12 A11 A10 A9 A8 A 7 A6 A5 A 4 A 3 A 2 A1 A0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
El Microcomputador Básico 162

Para todas las direcciones en el área de la EPROM, las líneas A13-A15 están en
nivel bajo y durante una lectura en memoria la salida de control IO / M también esta-
rá en cero. De modo que utilizando estas condiciones y aplicando RD a la entrada de
habilitación de salidas OE de la 2732, se puede seleccionar la memoria, como sugiere
el circuito de la figura 5.26.

Fig. 5.26 Decodificador de direcciones de la EPROM 2764

Otra posibilidad para la decodificación de la 2764, es utilizar la señal de con-


trol de lectura en memoria MRD , en lugar de RD , para habilitar las salidas de la
EPROM. Haciendo esto, el circuito decodificador se simplifica como indica el dia-
grama eléctrico de la figura 5.27.

Fig. 5.27 Decodificador de direcciones de la EPROM 2764, usando MRD


El Microcomputador Básico 163

El decodificador de la figura 5.27 deja abierta la posibilidad que en una opera-


ción de acceso a puerto, la entrada de selección CE vaya a nivel lógico cero. Esto no
representa un problema, porque MRD estará en uno y las salidas de datos de la
EPROM permanecerán flotantes. El uso de lógica integrada en escala pequeña para
realizar el decodificador de direcciones no es una buena elección. Tal arreglo no es
práctico porque obliga a que cada componente tenga su propio decodificador con
puertas discretas, aumentando el costo del sistema. Más conveniente es usar circuitos
MSI como decodificadores de direcciones. Los más usados en aplicaciones con µP
son:

8205 1 de 8
74LS139 2a4
74LS138 3a8
74LS154 4a1
74LS155 2a4
74LS156 2a4

Ejemplo 5.2

Considere que para un sistema que requiere 32K de memoria EPROM se utili-
za un arreglo de ocho memorias EPROM 2732, cada una de las cuales contiene 4096
posiciones. Para seleccionar los dispositivos de memoria se usará un decodificador 3
a 8 del tipo 74LS138. La tabla de estados y la distribución de los terminales del cir-
cuito, muestran en la figura 5.28.

G1 G2A G2B C B A Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

0 x x x x x 1 1 1 1 1 1 1 1
x 1 x x x x 1 1 1 1 1 1 1 1 A Vcc
x x 1 x x x 1 1 1 1 1 1 1 1 B Y0
1 0 0 0 0 0 1 1 1 1 1 1 1 0 C
1 0 0 0 0 1 1 1 1 1 1 1 0 1 Y1
G2A Y2
1 0 0 0 1 0 1 1 1 1 1 0 1 1 74LS138
1 0 0 0 1 1 1 1 1 1 0 1 1 1 G2B Y3
1 0 0 1 0 0 1 1 1 0 1 1 1 1 G1 Y4
1 0 0 1 0 1 1 1 0 1 1 1 1 1 Y7 Y5
1 0 0 1 1 0 1 0 1 1 1 1 1 1
GND Y6
1 0 0 1 1 1 0 1 1 1 1 1 1 1

Fig. 5.28 Tabla de la verdad del decodificador 74LS138

Con un 74LS138 único es posible seleccionar hasta ocho dispositivos diferen-


tes de memoria o de puertos de entrada y salida. El circuito decodificador tiene ocho
salidas ( Y0 − Y7 ), activas en nivel bajo; tres entradas de selección de salidas (A,B y
C) y tres entradas de habilitación del circuito (G1, G 2A y G 2B ) Para que una salida
Yi esté en cero lógico, la entrada G1 debe estar en nivel alto y las entradas
G 2A y G 2B deben estar en nivel bajo.
El Microcomputador Básico 164

Por medio de las líneas A,B y C se especifica cual de las ocho salidas se acti-
vará. La EPROM 2732 funciona igual que la memoria 2716, pero tiene 12 líneas de
direcciones (A0-A11) para permitir el acceso a las 4096 posiciones del dispositivo. Las
direcciones ocupadas por cada chip 2732 son las indicadas por la tabla siguiente:
Tabla. 5.9 Cada 2732 ocupa un
bloque de 4K.
EPROM DIRECCIÓN
0 0000H-0FFFH
1 1000H-1FFFH
2 2000H-2FFFH
3 3000H-3FFFH
4 4000H-4FFFH
5 5000H-5FFFH
6 6000H-6FFFH
7 7000H-7FFFH

El estado de cada línea de direcciones para los 32Kbytes de memoria suplidos


por el arreglo de EPROM se presenta en la tabla 5.10. Para cada bloque se muestra la
dirección inicial y final.

Tabla. 5.10 Bloques de memoria de 4K asignados a cada una de las 2732.


A15 A14 A13 A12 A11 A10 A9 A8 A 7 A6 A5 A 4 A 3 A 2 A1 A0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
EPROM 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
EPROM 1
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

EPROM 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
. . . . . . . . . . . . . . . .
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
EPROM 7
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

El circuito decodificador de direcciones para las ocho 2732, es el presentado


en la figura 5.40. Observe que para todo el espacio de 32K, la línea de direcciones
A15 permanece en nivel bajo, mientras que los bits A12-A14 muestran una progresión
binaria desde una EPROM a la siguiente. Forzando la entrada G1 a nivel alto y conec-
tado la línea de dirección A15 a G 2A y la señal IO / M a G 2B , el decodificador será
habilitado cada vez que el bus de direcciones identifique una posición de memoria
El Microcomputador Básico 165

comprendida entre 0000H y 7FFFH. El bloque particular seleccionado lo establecen


las líneas A12-A14, las cuales se aplican a las entradas A, B y C del 74LS138.

Fig. 5.29 Un 74LS138 selecciona hasta 8 dispositivos de memoria.

El uso de la salida IO / M del µP para seleccionar el 74LS138 de la figura


5.40, garantiza que durante una operación de E/S todas las EPROM funcionarán en el
modo de bajo consumo, debido a que el circuito decodificador estará deshabilitado
( IO / M =1) con todas sus salidas en nivel alto. Conviene resaltar que la señal RD
pudo usarse, en lugar de MRD , para habilitar las salidas de la memoria EPROM se-
leccionada.

Ejemplo 5.3

Suponga que se tiene un sistema con 4 Kbytes de EPROM (2732), 2Kbytes de


RWM (6116) y un PPI 8255. Para seleccionar los componentes se debe usar un deco-
dificador doble 2 a 4 con código 74LS139. Este circuito fue usado en el capitulo 3
como decodificador de puertos. En la figura 5.30 se repite la tabla de funcionamiento
del chip.
Ga Vcc
Aa Gb
G B A Y3 Y2 Y1 Y0 Ba Ab
1 X x 1 1 1 1 Y0a Bb
0 0 0 1 1 1 0 74LS139
Y1a Y 0b
0 0 1 1 1 0 1 Y2a Y1b
0 1 0 1 0 1 1 Y3a Y 2b
0 1 1 0 1 1 1 GND Y3b

Fig. 5.30 Tabla de la verdad del decodificador 74LS139

Las direcciones se asignan a cada componente de acuerdo con lo indicado por


la figura 5.11.
El Microcomputador Básico 166

Tabla. 5.11 Direcciones para las secciones de memoria y E/S


DISPOSITIVO DIRECCIÓN
EPROM 2732 0000H-0FFFH
RAM 6116 1000H-17FFH
PUERTO A 8255 00H
PUERTO B 01H
PUERTO C 02H
REG. COMANDO 03H

La tabla de estado de las líneas de direcciones del sistema es la que sigue y el


circuito decodificador se muestra en la figura 5.31. Observe que se hace una decodifi-
cación parcial de la dirección de los puertos del 8255.
Tabla. 5.12 Tabla de direcciones para las secciones de memoria y E/S
A15 A14 A13 A12 A11 A10 A9 A8 A 7 A6 A5 A 4 A 3 A 2 A1 A0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
EPROM
. . . . . . . . . . . . . . . .
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

RWM
0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

Como señala la tabla 5.12, aunque la memoria 6116 tiene sólo 2Kbytes de ca-
pacidad, ocupa el área de 4 Kbytes en el rango direcciones comprendo desde 1000H
hasta 1FFFH. De modo que el usuario del sistema debe evitar programar accesos a las
direcciones no válidas de la memoria de lectura/escritura.

Ejemplo 5.4

En este ejemplo se discute el funcionamiento del decodificador de direcciones


de un µC comercial. El MPR-85 PLUS es un microcomputador de bajo costo pero
muy completo basado el 8085A, el cual es utilizado para realizar las prácticas del
Laboratorio de Sistemas de Microprocesadores en el Departamento de Electricidad.
El MPR-85 tiene en la tarjeta de circuito impreso, incorporados 16K de EPROM
(27128), 16K de RWM (2x6264), dos dispositivos 8155, dos PPI 8255 y un controla-
dor de teclado/display 8279. Además, se proveen señales de selección para expansio-
nes futuras de memoria y puertos de E/S.

El circuito para decodificación de las direcciones del microcomputador fue di-


señado usando dos decodificadores 2 a 4 del tipo 74LS156. En la tabla 5.13 se pre-
senta la asignación de direcciones para memoria y puertos, la cual fue reproducida del
manual de operación del MPR-85.
El Microcomputador Básico 167

Fig. 5.31 Circuito decodificador de direcciones y de puertos.


El Microcomputador Básico 168

El MPR-85 utiliza las señales de control MRD , MRW , IORD e IOWR para
tener acceso a la memoria y a los puertos de E/S. Como indica la tabla de direcciones
de la figura 5.45, los circuitos de memoria y puertos se seleccionan usando señales
comunes. Por ejemplo, la salida CS3 habilita los 8Kbytes de RWM en el rango
6000H-7FFFH y los puertos del 8279 en las direcciones 60H-7FH. Esto es posible
porque el espacio de direcciones de puertos está aislado del de memoria.
Tabla. 5.13 Direcciones para las secciones de memoria y E/S del MPR-85
MEMORIA DIRECCIÓN CS DIRECCIÓN PUERTOS
27128 (16K EPROM) 8255 N°2
MONITOR DEL SISTEMA 0000H-3FFFH CS0 00H-3FH EXPANSIÓN DE PUERTOS

8155 N°1
256 bytes de RWM 4000H-4FFFH CS1 40H-4FH 8155 N°1
8155 N°2
256 bytes de RWM 5000H-5FFFH CS2 50H-5FH 8155 N°2
6264/2764 8729
HASTA 8K DE RWM O 6000H-7FFFH 60H-7FH CONTROLADOR DE
CS3
EPROM TECLADO/DISPLAY
6264/2764
HASTA 8K DE RWM O 8000H-9FFFH CS4 80H-9FH 8255 N°1
EPROM
4K PARA EXPANSION A000H-AFFFH CS5 A0H-AFH EXPANSIÓN

2K PARA EXPANSION B000H-B7FFH CS6 B0H-BFH EXPANSIÓN

2K PARA EXPANSION B800H-BFFFH CS7 B8H-BFH EXPANSIÓN

El encapsulado del 74LS156 contiene dos decodificadores individuales, los


cuales operan como indica la tabla de la figura 5.32. El diagrama eléctrico de la sec-
ción de decodificación del MPR-85 es el presentado en la figura 5.33.

1G 1C B A Y3a Y 2a Y1a Y0a


1 x x x 1 1 1 1
X 0 x x 1 1 1 1
0 1 0 0 1 1 1 0 1C Vcc
0 1 0 1 1 1 0 1 1G 2C
0 1 1 0 1 0 1 1 B 2G
0 1 1 1 0 1 1 1 1Y3 A
74LS156
1Y 2 2 Y3
2C 2G B A Y3b Y 2b Y1b Y 0b
1Y1 2Y 2
1 x x x 1 1 1 1
1Y0 2Y1
X 1 x x 1 1 1 1
GND 2Y0
0 0 0 0 1 1 1 0
0 0 0 1 1 1 0 1
0 0 1 0 1 0 1 1
0 0 1 1 0 1 1 1

Fig. 5.32 Tabla de la verdad del decodificador 74LS15


El Microcomputador Básico 169

Fig. 5.33 Decodificador de direcciones del µC MPR-85.


El Microcomputador Básico 170

El decodificador marcado U1 en la figura 5.33, genera las señales de selección


de la EPROM 27128, de los 8155 N°1 y N°2 y de la memoria RWM 2764. Las co-
nexiones seleccionadas para el 74LS156 dividen en bloques de 4K, los primeros 32K
del espacio total de memoria. Esto puede verificarse en la tabla 5.14.

Tabla. 5.14 Direcciones para las secciones de memoria y E/S seleccionadas por U1.

A15 A14 A13 A12 A11 A10 A9 A8 A7 A 6 A 5 A 4 A 3 A2 A1 A 0


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
EPROM
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
4 X 4K
0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1

RWM
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
256 bytes 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
RWM
256 bytes 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
RWM 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
2 X 4K 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

En los primeros 16K del espacio de memoria del µP, las líneas de dirección
A15 y A14 (conectadas a 2G y 2C ) permanecen en nivel bajo, mientras que los bits
A13 y A12 (guiando las entradas B y A) varían desde 00 hasta 11 binario, desde un
bloque de 4K al siguiente. De acuerdo con lo especificado por la tabla de funciona-
miento, esto significa que cuando el contenido del bus de direcciones identifica a una
dirección entre de la EPROM entre 0000H y 3FFFH, una de las salidas 2Yi del de-
codificador 2 contenido en U1, estará en cero. Como las salidas del 74LS156 son a
colector abierto, uniendo las 4 salidas 2Yi se obtiene una función AND cableada,
cuya salida corresponde a CS0 .
El decodificador 1 de U1 tiene las entradas de habilitación: 1G y 1C , conecta-
das a las salidas de direcciones A15 y A14. Estas líneas estarán, respectivamente, en
cero y uno para cualquier dirección dentro del área ocupada por el quinto bloque de
4K (4000H-4FFFH). Como A13 y A12 están ambas en cero en este mismo rango, la
salida 1Y0 del decodificador se activará a nivel bajo. Esta señal se destina para selec-
cionar los 256 bytes de la memoria RWM 2764 y las sección de E/S del 8155 N°1.
El Microcomputador Básico 171

Observe que A13 y A12 varían desde el quinto bloque de 4 K al siguiente, activando
progresivamente las salidas 1Y1 , 1Y2 y 1Y3 . La primera sitúa el 8155 N°2 en la zona
de direcciones 5000H-5FFFH, mientras que las dos últimas salidas se conectan para
seleccionar los 8Kbytes (2 bloques de 4K) de la otra memoria RWM 6264.

Las señales de selección CS0 − CS3 operan sobre los primeros 32Kbytes del
espacio de memoria. Por medio de U2, se generan los comandos CS4 − CS7 , los cua-
les sitúan los componentes restantes del sistema dentro de los siguientes 16K (8000H-
BFFFH). La tabla 5.15 muestra las direcciones para U2.

Tabla. 5.15 Direcciones para las secciones de memoria y E/S seleccionadas por U2.
A15 A14 A13 A12 A11 A10 A9 A8 A7 A 6 A 5 A 4 A 3 A2 A1 A 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
RWM
1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
4 X 2K
1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1
1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
EXPANSIÓN 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1
4Kbytes 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
EXPANSIÓN 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
2Kbytes
1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1
EXPANSIÓN 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0
2Kbytes
1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1

El espacio de direcciones de la tabla anterior se presenta dividido en bloques


de 2K. Una dirección entre los primeros 8K genera el comando de selección CS4 ,
mediante el cableado de las cuatro salidas del decodificador 2 de U2. Observe que en
estos cuatro bloques de 2K, las líneas A12 y A11 (aplicadas a las entradas B y A)
muestran una progresión binaria de un bloque de 2K al próximo y que A13 (conectada
a la entrada de habilitación 2C ) permanece en nivel bajo. Finalmente, la combina-
ción lógica de las líneas de direcciones A15 y A14, realizada por las puertas U3A y
U3B, fuerzan a cero la otra entrada de habilitación 2G .

Para entender como se genera las señales CS5 − CS7 , basta con inspeccionar
la tabla de direcciones de la figura 5.49. Los 4K entre A000H y AFFFH son seleccio-
El Microcomputador Básico 172

nados por CS5 , la cual es generada por la AND implícita con entradas1Y0 y 1Y1 . Los
siguientes dos bloques de 2K se reservan para expansión y son seleccionados por
CS6 y CS7 . Los diseñadores del MPR-85 utilizaron 48Kbytes del total de 64Kbytes
posibles de manejar por el 8085A. Como indica la tabla 5.13, la salida de selección
CS0 también habilita un 8255 N° 2, al cual se le ha previsto en el circuito impreso
una base para expansión. Los puertos de este dispositivo están situados entre 00H y
3FH. De este rango de 64 bytes, se asigna al puerto de comando la dirección 00H y
las direcciones 01H, 02H y 03H a los puertos de E/S A, B, y C, respectivamente. Las
posiciones restantes dentro del rango se consideran inválidas. El modo como se asig-
nan las direcciones de todos los puertos, es la presentada en la tabla siguiente:

Tabla. 5.16 Direcciones de puertos de E/S


PUERTO FUNCIÓN DISPOSITIVO PUERTO FUNCIÓN DISPOSITIVO
00H PUERTO A 50H CONTROL
01H PUERTO B 51H PUERTO A
02H PUERTO C 8255 N° 2 52H PUERTO B
03H COMANDO 53H PUERTO C 8155 N° 2
04H-3FH no válidas 54H LSB TIMER
40H CONTROL 55H MSB DEL TIMER
41H PUERTO A 56H-5FH no válidas
42H PUERTO B 60H PUERTO DATOS
43H PUERTO C 8155 N° 1 61H PUERTO CONTROL 8279
44H LSB TIMER 62H-7FH no válidas
45H MSB DEL TIMER 80H PUERTO A
46H-4FH no válidas 81H PUERTO B
82H PUERTO C 8255 N° 2
83H COMANDO
84H-8FH no válidas
A0H-BFH --------------- EXPANSIÓN

Ejemplo 5.5

Para finalizar esta sección, se presenta un ejemplo final de decodificación de


puertos usando E/S aislada. Considere que se tienen dos PPI 8255A y un puerto de
salida realizado con un registro paralelo 74LS374. Las direcciones de los puertos se
muestran en la tabla 5.17 y el circuito en la figura 5.34.

Fig. 5.17 Tabla de direcciones de puertos.


8255 #1 Puerto A 20H
Puerto B 21H
Puerto C 22H
Comando 23H
8255 #2 Puerto A 24H
Puerto B 25H
Puerto C 26H
Comando 27H
74LS374 28H*
A1= A0 =0
El Microcomputador Básico 173

Fig. 5.34 Decodificación completa de 7 puertos usando un 74LS138.

El decodificador de la figura 5.34 realiza una decodificación exhaustiva de los


puertos de los 8255 y del registro paralelo.

5.4 PUERTOS DE E/S SELECCIONADOS COMO MEMORIA

El método usado hasta ahora para seleccionar los puertos de E/S, se basa en el
hecho que el espacio de direcciones de memoria está separado del espacio de puertos
de E/S. Durante una operación de lectura o escritura, el µP usa la señal IO / M para
notificar a los dispositivos externos cuando la dirección presente en el bus correspon-
de a una posición de memoria o a un puerto de E/S. Lo registros de puertos son dise-
ñados para responder a las señales de control IORD o IOWR y para ser selecciona-
dos por una señal CS de habilitación.

Este procedimiento de manejo de puertos se conoce como el método de e/s es-


tándar o de E/S aislada y sólo permite acceso a puertos por medio de las instrucciones
El Microcomputador Básico 174

IN puerto y OUT puerto. Usando está técnica, pueden controlarse hasta 512 registros
externos (256 de entrada y 256 de salida). Recuerde que en estas instrucciones la di-
rección del puerto la especifica el segundo byte de la instrucción, y el número máxi-
mo que puede representarse con ocho bits es 255. Otra limitación de esté método es
que sólo consiente transferencias entre el puerto seleccionado y el registro acumula-
dor. Una estrategia de acceso a puertos que permite superar la limitación del número
de puertos impuesta por el método estándar, es el método de E/S mapeada como
memoria. Esta técnica trata a los puertos como posiciones convencionales de memo-
ria, fusionando en un mapa único el espacio de direcciones de memoria y de puertos.
Por esta razón se hace innecesario el uso de decodificadores independientes para
memoria y E/S.

Una desventaja que se puede percibir de inmediato del mapeo de E/S como
memoria, es que reduce la cantidad de memoria disponible, debido a que una porción
de ésta es cedida para los puertos. Si el sistema tiene menos de 32Kbytes de memoria,
la línea A15 no es utilizada para identificar posiciones de memoria, de modo que des-
tinando este bit de dirección para distinguir entre un acceso a memoria (A15 = 0) y
una operación con puertos (A15 = 1), se dispondrá de 32K direcciones de E/S almace-
namiento, sin usar la memoria instalada.

El mapeo de E/S a memoria no solo aumenta el número de puertos del µC, si-
no que permite el uso para control de puertos de toda instrucción que haga referencia
a memoria. Esto simplifica la programación de las rutinas de manejo de periféricos.
Por ejemplo, ejecutando a instrucción MOV r, M se transfiere el contenido de un
puerto de entrada a cualquiera de los registros internos del µP; XRA M realiza la fun-
ción OR exclusivo entre dato en el puerto de entrada y el acumulador; LHLD direc-
ción transfiere los datos en dos puertos hacia los registros H y L; SHLD dirección
traslada los 16 bits en HL a dos puertos de salida; SUB M substrae el contenido de un
puerto de entrada del dato en el acumulador. Estos son sólo algunos pocos ejemplos
de instrucciones que usan la memoria.

La figura 5.35 ilustra como puede tratarse la sección de puertos de un 8755 y


de un 8255, como si fuesen localidades de memoria. Para el 8755, la línea A15 deter-
mina cuando el acceso se realiza a la sección de 2K de la memoria EPROM o los re-
gistros del circuito. Para acceder a un puerto basta con sumar 8000H a la dirección.
Por ejemplo si el puerto B del 8755 ha sido programado como salida y se desea mo-
ver a este puerto el contenido del acumulador, debe ejecutarse STA 8001H. Esta ins-
trucción transfiere el contenido del A en la posición de memoria especificada por el
operando de la instrucción. Pero como A15 está en nivel alto, el destino será el puerto
B (de dirección xxxxxx01) del 8755. Para el 8255 el procedimiento es el mismo. En
ambos casos, los periféricos responderán a las señales de control RD y WR .

Si el programador de un sistema sabe que no debe usar las instrucciones IN


puerto y OUT puerto, porque los registros externos son considerados posiciones de
memoria no es necesario decodificar las salida IO / M para tener acceso a los puertos.
El Microcomputador Básico 175

8755 DIRECCIÓN DE MEMORIA


0 x x x 0 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

DIRECCIÓN DE PUERTO
1 x x x 0 x x x x x x x x x A1 A0

8255 DIRECCIÓN DE PUERTO


1 0 0 0 x x x x x x x x x x A1 A0

Fig. 5.35 Los puertos de E/S del 8755 y del 8255 son tratados como posiciones de memoria.

En el siguiente ejemplo se presenta un decodificador de direcciones de un µC


usando el método de E/S mapeada en memoria.
El Microcomputador Básico 176

Ejemplo 5.6

El espacio de direcciones comprendido entre 0000H y 3FFFH es dividido en


bloques de 2K, como indica la tabla 5.18. Cada bloque es seleccionado por las líneas
A13, A12 y A11. Para habilitar el circuito 74LS138 se usan los las líneas de direcciones
A14 y A15, las cuales permanecen en cero en el rango especificado.

Fig. 5.36 El decodificador de direcciones permite al acceso a 16Kbytes de memoria.

Tabla. 5.18 Tabla de direcciones de cada bloque de 2K.


CS DIRECCIÓN DISPOSITIVO

CS0 0000H-07FFH EPROM

CS1 0800H-0FFFH RWM

CS2 1000H-17FFH TECLADO

CS3 1800H-1FFFH DISPLAY

CS4 2000H-27FFH ENTRADA

CS5 2800H-2FFFH SALIDA

CS6 3000H-37FFH OTRO

CS7 3800H-3FFFH OTRO

La selección del chip es completada por la salida de la puerta NAND, la cual


va a uno durante una operación de lectura o escritura. Cada salida del decodificador
es una señal de selección CS de dispositivos de memoria o de E/S. Las direcciones
correspondientes a cada salida del decodificador son las mostradas en la tabla 5.18.

Para finalizar esta sección, se presenta en la figura 5.38 el subsistema de me-


moria y puertos de un sistema 8085. Para el diseño del decodificador de puertos se
usa la técnica de mapeo a memoria. La 27256 es una EPROM de 32 Kbytes y es se-
leccionada por medio de la línea A15, lo cual sitúa el circuito en los primeros 32 Kby-
tes del espacio de direcciones del µP. Para activar las salidas O0-O7 de la memoria, se
conecta la señal de control de lectura RD a la entrada OE de habilitación de salidas
del dispositivo. Para seleccionar el grupo de tres memorias RWM 6116 y el 8255, se
usa un decodificador 74LS138. La conexión de la línea A15 a la entrada de selección
G1del decodificador, garantiza que este permanecerá deshabilitado, con todas sus
salidas en nivel alto, durante operaciones de lectura a la EPROM. Cualquier dirección
en el bus a partir de la posición 8000H, pondrá el bit A15 en uno habilitando el
El Microcomputador Básico 177

74LS138. Las líneas A14, A13 y A12 (conectadas C, A, y B) determinan cual de las
salidas del decodificador se activará, para seleccionar un área de 4K (la 6116 solo usa
2K) en el bloque superior de 32 K del espacio de direcciones. Las direcciones de ac-
tivación de las salidas del decodificador se muestran en la en la tabla 5.19 y el mapa
de direcciones de los componentes conectados al sistema en la figura 5.37.
Tabla. 5.19 Tabla de direcciones de cada bloque de 2K.
CS DIRECCIÓN DISPOSITIVO

CS0 8000H-87FFH 27256


CS1 9000H-97FFH 6116
CS2 A000H-A7FFH 6116
CS3 B000H-B7FFH 8255 PUERTO A B000H

CS4 C000H-C7FFH SIN USO PUERTO A B001H

CS5 D000H-D7FFH SIN USO PUERTO A B002H

CS6 E000H-E7FFH SIN USO COMANDO B003H

CS7 F000H-F7FFH SIN USO

DIRECCIÓN DATOS

0000H 0000 0000 0000 0000

. .
. . 32 K EPROM
. .
7FFFH 0111 1111 1111 1111

8000H 1000 0000 0000 0000

. . 2 K RWM
87FFH 1000 0111 1111 1111
. .
8FFFH 1000 1111 1111 1111

9000H 1001 0000 0000 0000

. . 2K RWM
97FFH 1001 0111 1111 1111
. .
9FFFH 1001 1111 1111 1111

A000H 1010 0000 0000 0000

. . 2K RWM
A7FFH 1010 0111 1111 1111.
. .
AFFFH 1010 1111 1111 1111

B000H 1011 0000 0000 0000

. . 8255
B7FFH 1011 0111 1111 1111
.
BFFFH 1011 1111 1111 1111

Fig. 5.37 Mapa de memoria para el sistema de la figura 5.38.


El Microcomputador Básico 178

Fig. 5.38 Decodificador de direcciones para 32K de EPROM, 6K de RWM y un PPI 8255
El Microcomputador Básico 179

5.5 DECODIFICADOR CON DISPOSITIVOS PROGRAMABLES


Además de usando puertas discretas y circuitos integrados MSI, el decodifica-
dor de direcciones puede realizarse usando algún tipo de dispositivo lógico progra-
mable (PLD). Estos componentes ahorran espacio en la tarjeta del circuito impreso,
su estructura es apropiada para el uso como decodificador y mantienen la confiden-
cialidad de la lógica programada. Para ilustrar las ventajas del uso de PLD, considere
el siguiente ejemplo.

Ejemplo 5.7

Bebe diseñarse un decodificador de direcciones para un subsistema de memo-


ria compuesto por 4 Kbytes de EPROM (1 x 4K), 8 Kbytes de EEPROM (1 x 8K) y
52 Kbytes de RWM (1 x 32K, 1 x 16K y 1x 4K). El espacio de memoria de la aplica-
ción es distribuido como indica el mapa de la figura 5.39.

En principio, se observa que el circuito de memoria conectado al sistema y


que tiene menor capacidad es el módulo de 4K (212), de modo que para el diseño del
decodificador se divide el espació de 64Kbytes de memoria en bloques de 4Kbytes.
Esto significa que se usan los bits de dirección A12-A15 para seleccionar el circuito
integrado al cual corresponde la dirección a la cual se desea acceso. La tabla 5.20
muestra el rango de direcciones en el cual se habilita cada salida del decodificador.

FFFFH

SRWM
F000H
EFFFH

SRWM
B000H
AFFFH
SRWM
3000H
2FFFH

EEPROM
1000H
0FFFH
EPROM

0000H

Fig. 5.39 Mapa de memoria para el sistema ejemplo de decodificador con PLD
El Microcomputador Básico 180

Tabla. 5.20 Tabla de estados del decodificador de direcciones con PLD.


A15 A14 A13 A12 CS0 CS1 CS2 CS3 CS4
0 0 0 0 0 1 1 1 1
0 0 0 1 1 0 1 1 1
0 0 1 0 1 0 1 1 1
0 0 1 1 1 1 0 1 1
0 1 0 0 1 1 0 1 1
0 1 0 1 1 1 0 1 1
0 1 1 0 1 1 0 1 1
0 1 1 1 1 1 0 1 1
1 0 0 0 1 1 0 1 1
1 0 0 1 1 1 0 1 1
1 0 1 0 1 1 0 1 1
1 0 1 1 1 1 1 0 1
1 1 0 0 1 1 1 0 1
1 1 0 1 1 1 1 0 1
1 1 1 0 1 1 1 0 1
1 1 1 1 1 1 1 1 0

Las ecuaciones lógicas de las señales de selección de chip obtenidas a partir


de la información suministrada por la tabla de estados, son:

CS 0 = A15 + A14 + A13 + A12

CS1 = A15 + A14 + A13 ⋅ A12 + A13 ⋅ A12

CS 2 = A15 ⋅ A14 + A15 ⋅ A13 ⋅ A12 + A15 ⋅ A14 ⋅ A12 + A15 ⋅ A14 ⋅ A13

CS 3 = A15 + A14 ⋅ A12 + A14 ⋅ A13 + A14 ⋅ A13 ⋅ A12

CS 4 = A15 + A14 + A13 + A12

El decodificador de direcciones realizado con circuitos 74LS138, se muestra


en la figura 5.41. Como alternativa para el diseño del decodificador especificado, las
ecuaciones del decodificador pueden programarse en un dispositivo PAL. Un circuito
programable comercial de amplio uso en aplicaciones combinatorias es el de código
PAL16L8. La figura 5.40 muestra el diagrama de distribución de terminales y en la
figura 5.42 se presenta la estructura interna del chip.

Fig. 5.40 Distribución de terminales para el circuito PAL16L8.


El Microcomputador Básico 181

Fig. 5.41 Decodificador de direcciones usando decodificadores convencionales.


El Microcomputador Básico 182

I1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

0
1
2
3
4
5
O1
6
7

I2
8
9
10
11
12
13 IO2
14
15

I3
16
17
18
19
20
21
IO3
22
23

I4
24
25
26
27
28
29 IO4
30
31

I5
32
33
34
35
36
37 IO5
38
39

I6
40
41
42
43
44
45 IO6
46
47

I7

48
49
50
51
52 IO7
53
54
55

I8
56
57
58
59
60
61
O8
62
63

I9 I10

Fig. 5.42 Diagrama lógico de la PAL16L8

La estructura interna de la PAL16L8 determina que el circuito integrado solo


puede ejecutar funciones lógicas cuyas ecuaciones tengan siete o menos términos de
El Microcomputador Básico 183

productos. Seis de los terminales de salida son bidireccionales de modo que pueden
ser usados como entradas.

Para propósitos de desarrollo del programa a grabar en la PAL puede usarse


cualquiera de los lenguajes compiladores existentes para descripción de hardware,
tales como: ABEL, VHDL, VERILOG, ORCAD/PLD, ONCUPL... y otros. A continua-
ción se presentan dos versiones de un programa escrito en lenguaje VHDL y que per-
miten generar el archivo de mapa de fusibles necesario para programar el decodifica-
dor de direcciones en una PAL16L8. El primer código describe, usando ecuaciones, la
estructura lógica del decodificador y el otro programa define el comportamiento fun-
cional del circuito. Si se usa la segunda opción no es necesario usar las técnicas con-
vencionales de diseño digital, debido a que no se requiere especificar las ecuaciones.
library ieee;
use ieee.std_logic_1164.all;

entity decdir is

port ( A12, A13,A14,A15: in std_logic;


CS0, CS1, CS2, CS3, CS4: out std_logic );
end decdir;

architecture rtl of decdir is


begin
CS0 <= A15 or A14 or A13 or A12;

CS1 <= A15 or A14 or(A13 and A12)or((not A13)and(not A12));

CS2<= (A15 and A14)or (A15 and A13 and A12)or((not A15)and (not A14) and(not A13))or ((not A15)and (not
A14) and (not A12));

CS3 <=(not A15)or((not A14)and(not A12))or((not A14)and(not A13))or(A14 and A13 and A12);

CS4 <= not(A15)or(not A14)or(not A13)or not(A12);


end rtl;

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity DECODIR is
port ( A : in STD_LOGIC_VECTOR (15 downto 12);
CS : out STD_LOGIC_VECTOR (4 downto 0) );

end DECODIR;

architecture BEHAVIOR of DECODIR is begin


process (A,CS)
begin
case A is
when "0000" => CS <= "11110";
when "0001" => CS <= "11101";
when "0010" => CS <= "11101";
when "1011" => CS <= "10111";
when "1100" => CS <= "10111";
when "1101" => CS <= "10111";
when "1110" => CS <= "10111";
when "1111" => CS <= "01111";
when others => CS <= "11011";
end case;
end process;
end BEHAVIOR;
El Microcomputador Básico 184

La herramienta usada para generar el archivo de programación de la PAL es


ORCAD EXPRESS 9.1. La información siguiente es generada por el software

************************************************************************
OrCAD Simple PLD Fitter tools
************************************************************************

OrCAD PLD FITTER x1.11 11/5/98 (Source file C:\Program Files\OrCAD\CAPTURE\EJEMPLOS\DECODER\Timed


\DECODER.jed)
Copyright (C) 1988-1998 OrCAD All Rights Reserved.

RESOLVED EXPRESSIONS (Reduction 2)

Signal name Row Terms

CS0' 9 A12' A13' A14' A15'

CS1' 17 A12' A13 A14' A15'


18 A12 A13' A14' A15'

CS2' 25 A12' A14' A15


26 A12 A13 A15'
27 A13' A14' A15
28 A14 A15'

CS3' 33 A12 A13 A14' A15


34 A12' A14 A15
35 A13' A14 A15

CS4' 41 A12 A13 A14 A15

SIGNAL ASSIGNMENT
Rows
Pin Signal name Column -------------- Activity
Beg Avail Used

1. A12 2 - - - High
2. A13 0 - - - High
3. A14 4 - - - High
4. A15 8 - - - High
5. - 12 - - -
6. - 16 - - -
7. - 20 - - -
8. - 24 - - -
9. - 28 - - -
11. - 30 - - -
12. - - 56 8 0 (Three-state)
13. - 26 48 8 0 (Three-state)
14. CS4 22 40 8 1 High (Three-state)
15. CS3 18 32 8 3 High (Three-state)
16. CS2 14 24 8 4 High (Three-state)
17. CS1 10 16 8 2 High (Three-state)
18. CS0 6 8 8 1 High (Three-state)
19. - - 0 8 0 (Three-state)
---- ----
64 11 (17%)

7. Checking for error conditions

NOTE (PLD0200) No fatal errors found in input file.


NOTE (PLD0201) No warnings.
El Microcomputador Básico 185

FUSE MAP FOR PAL16L8

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30

0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
32 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
64 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
96 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
128 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
160 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
192 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
224 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
256 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
288 -x -x -x -- -x -- -- -- -- -- -- -- -- -- -- --
320 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
352 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
384 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
416 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
448 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
480 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
512 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
544 -x x- -x -- -x -- -- -- -- -- -- -- -- -- -- --
576 x- -x -x -- -x -- -- -- -- -- -- -- -- -- -- --
608 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
640 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
672 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
704 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
736 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
768 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
800 x- x- -- -- -x -- -- -- -- -- -- -- -- -- -- --
832 -x -- -x -- x- -- -- -- -- -- -- -- -- -- -- --
864 -- -x -x -- x- -- -- -- -- -- -- -- -- -- -- --
896 -- -- x- -- -x -- -- -- -- -- -- -- -- -- -- --
928 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
960 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
992 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1024 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
1056 x- x- -x -- x- -- -- -- -- -- -- -- -- -- -- --
1088 -x -- x- -- x- -- -- -- -- -- -- -- -- -- -- --
1120 -- -x x- -- x- -- -- -- -- -- -- -- -- -- -- --
1152 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1184 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1216 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1248 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1280 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
1312 x- x- x- -- x- -- -- -- -- -- -- -- -- -- -- --
1344 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1376 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1408 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1440 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1472 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1504 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1536 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1568 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1600 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1632 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1664 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1696 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1728 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1760 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1792 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1824 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1856 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1888 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1920 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1952 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
1984 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
2016 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx

Legend: x fuse intact


El Microcomputador Básico 186

- fuse open

475 fuses open of 2048 total.

OrCAD PLD EXPRESS


Type: PAL16L8

*
QP20* QF2048* QV1024*
F0*
L0256 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 *
L0288 10 10 10 11 10 11 11 11 11 11 11 11 11 11 11 11 *
L0512 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 *
L0544 10 01 10 11 10 11 11 11 11 11 11 11 11 11 11 11 *
L0576 01 10 10 11 10 11 11 11 11 11 11 11 11 11 11 11 *
L0768 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 *
L0800 01 01 11 11 10 11 11 11 11 11 11 11 11 11 11 11 *
L0832 10 11 10 11 01 11 11 11 11 11 11 11 11 11 11 11 *
L0864 11 10 10 11 01 11 11 11 11 11 11 11 11 11 11 11 *
L0896 11 11 01 11 10 11 11 11 11 11 11 11 11 11 11 11 *
L1024 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 *
L1056 01 01 10 11 01 11 11 11 11 11 11 11 11 11 11 11 *
L1088 10 11 01 11 01 11 11 11 11 11 11 11 11 11 11 11 *
L1120 11 10 01 11 01 11 11 11 11 11 11 11 11 11 11 11 *
L1280 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 *
L1312 01 01 01 11 01 11 11 11 11 11 11 11 11 11 11 11 *
C3E74*

NOTE (PLD0202) 1/23/4 10:46 am (Friday)


NOTE (PLD0204) Elapsed time 4 seconds

En la figura 5.43 se muestra el circuito decodificador usando la PAL16L8 y en


la figura 5.44 se muestra el arreglo interno de fusibles para la salida CS0 del decodi-
ficador de direcciones.

Fig. 5.43 Decodificador de direcciones con PAL.

El decodificador de direcciones cuyo diagrama eléctrico se muestra en la fi-


gura 5.43 no discrimina entre accesos a memoria o a puertos de E/S, por lo cual de-
ben usarse las señales MRD y MWR para leer o escribir en el dispositivo de memoria
seleccionado.
El Microcomputador Básico 187

I1

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

I2

8
9 X X X X
10
11 IO2
12
13
14
15

I3

Fig.5.44. Patrón de fusibles para la salida CS0 del decodificador de direcciones.


El Microcomputador Básico 188

5.6 CONSIDERACIONES ADICIONALES SOBRE INTERCO-


NEXIÓN A LOS BUSES DEL 8085A
Todo circuito conectado a un terminal de salida del 8085A produce efectos
que pueden afectar eventualmente el funcionamiento normal del sistema microcom-
putador. En primer término, la carga total conectada a un pin de salida puede sobre-
cargar al terminal con consecuencias severas para el nivel lógico presente en la línea.
En segundo lugar, la lógica usada para decodificación introduce retardos en la propa-
gación de las señales, los cuales deben ser tomados en cuenta para el cálculo del
tiempo de acceso de los chips de memoria a conectar al sistema. En esta sección se
discuten brevemente ambos aspectos.

5.6.1 Carga máxima del bus del 8085A

Si el sistema está acoplado a muchos circuitos de memoria o si el µC va a ser


interconectado con distintos tipos de interfaces, debe dedicarse especial atención a la
capacidad de corriente de los terminales del µP. Una línea de salida del 8085A, cuan-
do está en nivel alto, es capaz de entregar una corriente máxima IOH de 400 µA, mien-
tras que un terminal de salida en cero puede admitir una corriente máxima IOL de 2
mA. Si estos valores máximos son respetados, el terminal mantendrá su nivel lógico.

Estas características eléctricas DC fijan cuantas entradas puede guiar cada


terminal de salida del µP, sin deterioro del nivel lógico de la línea. Como ejemplo de
algunas posibilidades, las siguientes cargas pueden conectarse directamente a un pin
de salida del 8085:

• 1 TTL + 1 LSTTL
• 5 LSTTL
• 10 ALSTTL.

Si en una aplicación determinada se exceden estos límites, será necesario el


uso de circuitos buffers para realizar la conexión de la señal sobrecargada. Lo usual es
conectar amplificadores de corriente a las líneas de direcciones y de datos, aunque en
ciertos casos puede ser necesario para alguna líneas de control, tales como RD , WR
e IO / M .

Para reforzar la capacidad de corriente del bus de direcciones/datos AD0-AD7,


puede usarse un circuito 74LS245, el cual está especialmente diseñado para acopla-
miento a buses bidireccionales de 8 bits. Como ilustra la figura 5.45, el circuito es
habilitado conectando la entrada G a cero. La dirección del flujo de datos es fijada
por la entrada de control de dirección DIR, a la cual se conecta la señal RD . El
74LS245 es capaz de suministrar una corriente de 15 mA (IOH) mientras que la co-
rriente IOL es de 24 mA.
El Microcomputador Básico 189

Fig. 5.45 Conexión de guiadores de bus al 8085A

Para incrementar la carga permisible por las líneas de la parte más significati-
va del bus de direcciones (A8-A15) se recurre a un 74LS244, el cual permanece per-
manentemente habilitado, al aplicarse un nivel bajo a las entradas de selección
1G y 2G . La capacidad de corriente en nivel bajo de las salidas del chip, son idénticas
a las del 74LS245.
El Microcomputador Básico 190

El 74LS373, usado para separar el byte bajo de direcciones del bus multi-
plexado AD0-AD7, puede entregar una corriente de 400 µA y drenar 8 ma. Esto hace
innecesario el uso de buffers adicionales para las líneas de direcciones A0-A7.

5.6.2 Selección de la memoria del sistema

Es importante escoger el dispositivo de memoria que, teniendo costo de ad-


quisición menor, cumpla con las restricciones de tiempo impuestas por el 8085A sin
que sea necesaria la introducción de estados de espera. En principio, considere un
ciclo de lectura típico para una memoria ROM o WRM, ilustrado en la figura 5.46

DIRECCIONES

CS
tCE

OE
tAC tOE
D0-D7 C
DATO

Fig. 5.46 Ciclo de lectura característico de una memoria ROM o RWM.

Los tiempos indicados son máximos y pueden considerarse como medidas de


la velocidad de la memoria. Estos lapsos se definieron para la EPROM 2716, como:

tACC retardo entre aplicación de una dirección estable y la salida del dato.
tCE retardo entre la selección del chip y la salida del datos.
tOE retardo entre la habilitación de lectura y la salida del dato.

Para la selección de la memoria los tiempos tACC, tCE y tOE deben comparase con
los lapsos permitidos por el µP para que el dispositivo externo coloque el dato en el
bus. Estos tiempos se muestran en la figura 5.47.

CLK

A8-A15
tAD
AD0-AD7 Dato

ALE

tRD
RD

Fig. 5.47 Ciclo de lectura del 8085A.


El Microcomputador Básico 191

Los tiempos a considerar son:

tAD: tiempo del cual dispone un dispone un dispositivo externo para cargar un dato válido en
el bus de datos, medido a partir de la presentación de una dirección válida en las líneas
de direcciones.

tRD: lapso permitido desde la activación de la señal RD , hasta la colocación de un dato váli-
do en el bus.

En la figura 5.48 se muestra un diagrama de conexión entre un 8085A y un


dispositivo de memoria. Se considera que las señales de control están acopladas por
medio de buffers.
DAD
8085A

SRWM

D0-D7
AD0-AD7 373 A0-A7

ALE A8-A15

DB DCS

A8-A15 CS

OE WR
IO / M

DB DL

WR

RD

Fig. 5.48 Sistema µC con acopladores de bus.

Para establecer la correspondencia entre los tiempos disponibles por la memo-


ria para la transferencia del dato y los retardos debidos a los componentes internos de
la memoria, deben tomarse en consideración los tiempos de propagación de la lógica
de decodificación y de los acopladores de bus.

Los tiempos de propagación a considerar son los siguientes:


El Microcomputador Básico 192

DB: retardo de los buffers de las líneas direcciones y control.


DAD “ de los acopladores del bus de datos.
DCS “ del decodificador de direcciones.
DL “ de la lógica de generación de OE y WR .

Para calcular el tiempo de acceso disponible por la memoria, se usa la expre-


sión:

t disponible por la memoria = t 8085 − ∑ D i

Como la señal de selección de circuito CS es generada directamente por lógi-


ca combinatoria cuyas entradas son las líneas de direcciones, los tiempos de interés
son tAD y tRD.

tAD memoria = [tAD 8085 + tCAPB] – [DB + DCS + DAD]

tRD memoria = [tRD 8085 + tCAPB] – [DB + DL + DAD]

Los valores especificados para tAD y tRD en la hoja de datos del fabricante del
8085, consideran una capacidad de carga CL máxima. El uso de buffers para acopla-
miento al bus, reduce notablemente esta carga capacitiva y mejora los tiempos de
transición de las señales. El termino tCAPB, con un valor típico de 15 ns, es un factor de
corrección para los datos y se denomina ganancia de transición por acoplamiento.

⎛5 ⎞
tAD memoria = [ ⎜ + N ⎟ T − 225 +15] – [DB + DCS + DAD] ns
⎝2 ⎠

⎛3 ⎞
tRD memoria = [ ⎜ + N ⎟ T − 180 + 15] – [DB + DL + DAD] ns
⎝ 2 ⎠

Sin estados de espera y fclk = 3.125 Mhz

tAD memoria = 590 – [DB + DCS + DAD] ns

tRD memoria = 315 – [DB + DL + DAD] ns

Los retardos no especificados se obtienen de la hoja de especificaciones de los


circuitos. Calculados los tiempos de acceso de la memoria, se comparan con los co-
rrespondientes al µP para establecer que existe compatibilidad. En caso contrario
existen dos opciones: si la diferencia es pequeña, se puede rediseñar la lógica para
evitar que se superen los retardos máximos; o se sustituyen las memorias por otras de
mayor velocidad.
El Microcomputador Básico 193

5.7 MEMORIAS EEPROM Y FLASH


Hasta hace pocos años, el dispositivo de memoria más usado para contener el
código de una aplicación de sistemas empotrados fue la EPROM. La desventaja prin-
cipal de estas memorias es que cuando era necesario actualizar el programa o los da-
tos, se debía retirar el circuito de memoria del circuito impreso, exponerla a la luz
ultravioleta para borrarla por completo, utilizar un quemador de EPROMs para regra-
barla y finalmente reinsertarla en la tarjeta de la aplicación. En sistemas que requerí-
an la actualización periódica de datos se usaba un dispositivo SRAM con una pila
auxiliar para retener la información en ausencia de la alimentación principal.

Un nuevo tipo de memoria conocida como flash, mantiene su contenido en


ausencia de energía y además permite actualizar el código y los datos con el disposi-
tivo conectado al sistema (ISP:In System Programming). Existe un amplio rango de
aplicaciones de sistemas empotrados donde las memorias flash son usadas para alma-
cenamiento información. Estas aplicaciones incluyen teléfonos celulares, control de
motores de automóviles, unidades de reconocimiento de voz independiente del
hablante y funciones activadas por voz. En estas dos últimas categorías, existe un
modo de programación del equipo en el cual el usuario programa comandos de voz
que deben ser almacenados en una memoria no volátil para ser recuperados poste-
riormente y comparados con la entrada de voz en cualquier momento. Estos patrones
de voz pueden ordenar el encendido o apagado de equipos o el marcado de un número
telefónico.

Las flash también se usan en sistemas que requieren preservar información en


caso de interrupción del suministro de potencia de la red. Durante tal evento el proce-
sador mueve el código y/o datos contenidos en una memoria volátil a la flash. Una
vez reintegrada la energía el sistema continúa en el estado presente antes de la inte-
rrupción.

Aunque las memoria tipo flash son de relativamente reciente aparición, estos
dispositivos pueden considerarse como una mejora del diseño de las PROM eléctri-
camente borrables o EEPROM (Electical Eraseable Programmable Read Only Me-
mory) inventadas al inicio de década de los ochenta. Un dispositivo EEPROM típico
puede borrarse en 10 ms y el ciclo de escritura tiene una duración de 10 ms. En una
EPROM estos lapsos son de 30 minutos y de 50 ms respectivamente. Otra ventaja
resaltante es que es posible rescribir el contenido de una o algunas posiciones, al con-
trario de las EPROMs que debe ser regrabadas totalmente aunque sólo deba modifi-
carse un byte.

Una memoria EEPROM con características muy mejoradas con respecto a las
primeras, es el circuito integrado de código X28C64 con capacidad de 8 K x 8 e in-
troducida por la empresa Xicor en el año 1991. El tiempo de acceso del dispositivo
esta comprendido entre 150 ns y 250 ns dependiendo de la versión y es tan sencilla de
utilizar como una memoria RWM. Aunque en las primeras EEPROM solo se podía
El Microcomputador Básico 194

escribir un byte a la vez, la X28C64 acepta la escritura de páginas de 64 bytes. En la


figura 5.49 se muestra el diagrama funcional de la memoria. Observe la similitud con
una RWM.

Fig. 5.49 Diagrama funcional de la X28C64

Una EEPROM tiene garantizado un número limitado de ciclos de escritura y


un tiempo máximo de retención de los datos almacenados. Una X28C64 retiene los
datos por 100 años y soporta 100 mil ciclos de grabado, lo cual significa que si el
diseño se hizo para 20 años pueden hacerse 13.7 reescrituras por día.

Debido a que en los sistemas empotrados no existen medios de almacena-


miento masivo como discos, las EEPROM son adecuadas para aquellas aplicaciones
que requieren la retención de información. Por el límite de ciclos de escritura y por su
lento tiempo de acceso, las memorias EEPROM han tenido un espectro limitado de
aplicaciones. Por años han sido utilizadas como memoria de canales en sintonizado-
res de televisión, como sustituto de arreglos de interruptores de configuración y para
almacenamiento de constantes de calibración

Existen EEPROMs de acceso serie como el chip ST93C56 con capacidad de


256 x 8 bits y un millón de ciclos de escritura la cual se presenta en un encapsulado
de 8 terminales la cual puede usarse para almacenar por largo tiempo pequeñas canti-
dades de datos. Por ejemplo el circuito ST93C56 puede usarse en un registrador de
llamas telefónicas para almacenar y retener el número y el tiempo de duración de las
llamadas realizadas en un periodo determinado. Para acceso a este tipo de memoria se
establece un lazo serie de comunicación con el dispositivo simulando un UART. La
memoria tiene una entrada de reloj que permite sincronizar el envío de comandos y
El Microcomputador Básico 195

datos al chip. En la actualidad, están disponibles EEPROMs para conexión I2C con
mayores capacidades. Por ejemplo la 24LC512 almacena hasta 64Kbytes.

Para interconectar una EEPROM a un sistema no se requieren técnicas distin-


tas a las explicadas antes. El chip se conecta como una memoria RWM convencional,
aplicándole el pulso de escritura WR o MWR , si es necesario. La sustitución de la me-
moria volátil SRAM de datos del sistema por una EEPROM no es una buena idea. El
tiempo de acceso de una SRAM esta entre 15 ns-25 ns mientras que el acceso a una
EEPROM puede durar entre 100 ns a 250 ns. Al contrario es una excelente idea lo que
hicieron los diseñadores del microprocesador PopCorn. En un sistema basado en este
procesador el código reside en una EEPROM/Flash y durante el arranque es cargado
en una memoria SRAM, de modo que se puede incrementar la frecuencia del reloj del
sistema sobre el valor requerido para ejecutar el código desde la memoria no volátil.

Una EEPROM/Flash puede sustituir a una EPROM para el almacenamiento


del código de la aplicación, pero si se usa ISP deben tomarse algunas previsiones y el
procedimiento de sustitución no es tan directo. En un sistema empotrado capaz de
realizar ISP se entiende que un computador anfitrión puede descargar código en la
memoria no volátil usando un canal de comunicación, usualmente un UART, o cual-
quier otro que soporte el sistema. El problema es si existe la posibilidad de borrar o
escribir sobre el mismo circuito integrado que contiene el código que se está ejecu-
tando. Si las rutinas de arranque del CPU y los algoritmos de programación (código
cargador de ISP) comparten la misma memoria EEPROM/Flash, esta no estará dis-
ponible durante ISP. En la práctica es virtualmente imposible realizar ISP de una
memoria bajo el control del procesador en un sistema empotrado que contenga sólo
una memoria EEPROM/Flash. El código ISP debe ejecutarse desde una memoria
independiente.

Aunque las tecnologías de fabricación de memorias EEPROM y flash son


convergentes, cada una de estas es diseñada con propósito diferente. Las memorias
flash fueron creadas originalmente como reemplazo de medios de almacenamiento
masivo como discos flexibles y duros. De modo que son diseñadas para capacidad
máxima, consumo de potencia mínimo y un gran número de ciclos de escritura. La
información cargada en una flash se escribe usualmente por bloques en lugar de por
bytes.

Las EEPROM se inventaron para mantener información de configuración o


para permitir reprogramar dispositivos integrados programables. Generalmente tienen
capacidades de kilobits en contraposición a los megabits de las memorias flash y son
escritas byte por byte o por páginas pequeñas. Normalmente, soportan pocos ciclos de
escrituras debido a que fueron diseñadas para ser actualizadas ocasionalmente en lu-
gar de estar sometidas a continuas actualizaciones. Algunos diseños de memorias no
volátiles modernas utilizan la más nueva tecnología de fabricación de flashs para pro-
porcionar a una vida más larga y mayores capacidades y densidad. Como resultado,
se obtienen chips con características semejantes a las EEPROM, atenuando de esta
El Microcomputador Básico 196

forma las distinciones entre las dos categorías. Por ejemplo las flash serie son desde
el punto de vista del sistema leídas y programadas byte por byte como una EEPROM
convencional.

Aunque la lectura de una memoria eléctricamente borrable se realiza como si


se tratase de una EPROM o SRWM convencional, cuando deben realizarse operacio-
nes como borrado, escritura de datos o protección de segmentos de memoria contra
reescrituras no autorizadas., el procesador debe usar el algoritmo de programación
proporcionado por el fabricante para el dispositivo. Bajo el control de este algoritmo
pueden enviarse comandos a la memoria para indicarle que debe permitir la entrada
de datos y toda tarea asociada con la programación. En la figura 5.50 se muestran dos
modelos de programación de una memoria flash.

Fig. 5.50 Algoritmos de programación

Es usual que versiones de microcontroladores de los principales fabricantes se


presenten con alguna cantidad de memoria flash interna para permitir el desarrollo de
prototipos. Si la empresa produce versiones del controlador con flash y con ROM, el
diseñador puede usar la versión con flash para el prototipo y la que contiene ROM
para la producción final de la aplicación. Un problema intrínseco es que el tiempo de
acceso de la flash puede afectar la velocidad del sistema integral.

Por otra parte, la capacidad de la flash integrada con el CPU es usualmente de


hasta 32 Kbytes, tamaño que puede considerarse adecuado para la mayoría de las
aplicaciones. No obstante, existen proyectos donde: o se usa compiladores C para
desarrollo del programa o por su naturaleza deban acceder a cantidades de memoria
muy superiores a la señalada. Por ejemplo, las cámaras digitales requieren muchos
megabytes para almacenar las imágenes y un sistema de reconocimiento de voz pue-
de necesitar ½ megabyte para retener los patrones de reconocimiento de voz. Tales
sistemas no pueden ser realizados con microcontroladores con memoria flash interna
debiendo usarse dispositivos de memoria externos para satisfacer las especificacio-
nes.
El Microcomputador Básico 197

Una memoria flash de 512 K x 8 bits es la Am29F040 el cual es un dispositivo


con acceso por sectores de 64 Kbytes y con tiempo de acceso máximo de 55 ns. La
figura 5.51 muestra el símbolo lógico del chip. Observe que la interconexión a un
sistema 8085A es directa, Por ejemplo pueden usarse 32 Kbytes conectando sólo las
líneas de direcciones A0-A14 y dejando las restantes desconectadas.

Fig. 5.51 Memoria flash Am0F040 de 4 Mbits.

5.8 BANCOS DE MEMORIA


Aunque algunos microcontroladores modernos pueden tener acceso a un espa-
cio de memoria externo de por ejemplo 2 Mbytes (PIC18C252), en los microprocesa-
dores típicos de 8 bits el ancho de 16 bits del bus de direcciones impone un límite de
64K bytes al número de posiciones que el procesador puede usar para almacenar có-
digo y datos. Por muchos años las aplicaciones de sistemas empotrados de media y
baja complejidad exigieron capacidades de memoria que estaban muy por debajo de
este tope. En ese tiempo, la frontera de los 64Kbytes parecía demasiado lejana para
ser rebasada por las aplicaciones con µPs.

En la actualidad, la existencia de compiladores C para la mayoría de los µPs y


µCtrls en el mercado, ha hecho posible el desarrollo de aplicaciones de tal compleji-
dad que hubiese sido una fantasía pensarlas en programarla en lenguaje ensamblador,
herramienta básica de trabajo para los programadores de sistemas empotrados hasta
hace pocos años. De hecho, los diseños modernos con µPs de complejidad media
pueden requerir desde 64 K hasta 256 Kbytes de espacio de memoria.

Pareciera que la solución ante esta situación es apelar a los modernos µCtrls o
a un µP de 16 bits como el 8088 o el 80188, con accesos a memoria de hasta 1 Mbyte.
Sin embargo, en el mundo real, no siempre la solución ante esta disyuntiva es tan
sencilla. Considere por ejemplo que se debe actualizar un sistema basado en un µP
antiguo de 8 bits. Si se elige la opción señalada posiblemente el programador se en-
El Microcomputador Básico 198

frentara al hecho de rescribir decenas de miles de líneas de código. El costo del desa-
rrollo del nuevo software puede ser tan alto que una decisión sabia puede ser mante-
ner el mismo CPU, aunque puede ocurrir que la actualización del código produzca un
programa de un tamaño tal que rebase la capacidad de direccionamiento del µP.

Por otro lado, existen aplicaciones cuyos requerimientos de diseño pueden ser
de tal magnitud que rebasen las capacidades de los microcontroladores disponible.
Estos usualmente tienen 6 puertos de E/S (48 líneas si no se usan algunos recursos
como el CAD y el UART) y si se usa memoria externa hay que sacrificar algunos de
estos para convertir al chip en un microprocesador. Por ejemplo, considere el desarro-
llo de un sistema que ejecuta operaciones de E/S sobre 80 dispositivos tales como
sensores, cámaras de TV, lasers, modem, motores y un espectrómetro de rayos X.
además el sistema debe ejecutar 12 experimentos cuyos resultados será vitales para el
avance de una determinada tecnología de punta. Suponga además que el código de la
aplicación para el control de E/S y los experimentos ocupa 16 Kbytes de PROM, 160
Kbytes de EEPROM y 576 Kbytes de RWM. Especificaciones adicionales indican que
el µP debe ser de bajo consumo e inmune a la radiación cósmica.

El párrafo anterior describe a un sistema empotrado de gran complejidad con


tales especificaciones que no pueden ser satisfechas por ningún microcontrolador
estándar, a menos que éste se configure para operar como microprocesador con me-
moria externa y circuitos programables para interconexión de E/S. Acepto que este es
un ejemplo extremo, pero este problema tuvo que resolverlo en Laboratorio de Pro-
pulsión de Jets (JPL) de la NASA durante la preparación de parte de la misión a Mar-
te lanzada el 4 de julio de 1997 y conocida como Pathfinder; específicamente durante
el diseño del sistema de control del vehículo autónomo explorador Sojouner

Los diseñadores del JPL seleccionaron el µP de 8 bits 80C85 (versión moder-


na del 8085) como CPU del sistema microcomputador de control del Sojouner. El
programa se organizó como un lazo único de control con soporte de interrupciones
para eventos ante los cuales el explorador debía reaccionar rápidamente. Esta arqui-
tectura del sistema de control responde al hecho que el vehículo no tenía suficiente
energía para hacer dos cosas a la vez. Por ejemplo no podía moverse activando los
motores de las ruedas y a la vez comunicarse usando el modem de radiofrecuencia.

Ante este modo de operación, la NASA no vislumbro ventaja alguna en el uso


de un sistema de control multitarea de tiempo real que más bien podría deteriorar el
funcionamiento del sistema. El 80C85 fue programado usando un compilador C de un
paquete de desarrollo adquirido por la NASA y algunas herramientas de software des-
cargadas de Internet. Este µP aparece frecuentemente en diseños de instrumentos y
controles en el área de navegación espacial. Muchas opiniones señalan que esto se
debe a la inmunidad del 80C85 ante los rayos cósmicos y a su bajo consumo de po-
tencia.

En todo caso tenemos dos situaciones, la segunda quizás algo extrema, en las
cuales el tamaño del programa de una aplicación basada en un µP de 8 bits, excede la
El Microcomputador Básico 199

capacidad del espacio de memoria accesible por el procesador. Debido a que el límite
de 64 Kbytes lo impone el hecho que el µP sólo tiene 16 líneas de direcciones, si se
suman bits extras de direcciones es posible aumentar la capacidad de acceso a memo-
ria. Estas nuevas líneas se conectan a los bits de direcciones de orden alto de los cir-
cuitos de memoria del sistema. Por ejemplo, usando lógica externa para generar los
bits A16 y A17, se incrementa el espacio de memoria a 256 Kbytes (218).

Al aumentar en dos las líneas de direcciones se tiene 256 Kbytes de memoria


física (real) y sólo 64 Kbytes de memoria lógica cuyas direcciones son generadas por
el procesador. Como indica la tabla 5.21, el espacio de memoria puede verse como 4
bancos de 64Kbytes cada uno con iguales direcciones lógicas pero direcciones reales
distintas. Cuando el programa hace referencia a una posición de la memoria, el estado
de los bits A17 y A16 establecerá a cual banco corresponde la dirección. En otras pala-
bras, cuando se haga referencia a una dirección de memoria lógica, el hardware ex-
terno de mapeo debe redirigir la llamada o salto una dirección física específica.

Tabla. 5.21. Direcciones físicas y lógicas y mapa de memoria


para un sistema con 256 Kbytes de EPROM.
DIRECCIÓN
Banco A17 A16 FÍSICA LÓGICA
0 0 0 00000-0FFFFH 0000-FFFFH
1 0 1 10000-1FFFFH 0000-FFFFH
2 1 0 20000-2FFFFH 0000-FFFFH
3 1 1 30000-3FFFFH 0000-FFFFH

Fig. 5.52 Direcciones físicas y lógicas y mapa de memoria para un sistema con 250 Kbytes de memo-
ria de programa.

Una dirección de 17 bits de la memoria sistema, puede especificarse como


B00:7FFFH o B10:7FFFH. Donde Bxx indica el banco al cual pertenece la posición
seleccionada y 7FFFH será la dirección de desplazamiento en el banco. Una dirección
física viene dada por la expresión:

0
Dir Física = (N banco × Tamaño del banco) + Desplazame int o
Para B10 : 7FFFH
Dir Física = (2 × 10000H) + 7FFFH
Dir Física = (2 × 10000H) + 7FFFH
Dir Física = 27FFFH
El Microcomputador Básico 200

No existe limitación alguna para diseñar un subsistema de memoria como el


descrito. Puede usarse dos bits de un puerto de salida para las líneas extras de direc-
ciones y código adicional para conmutar los bancos. No obstante, existen algunas
consideraciones de orden práctico que deben hacerse al momento de definir el mapa
de memoria de una aplicación real. En principio el sistema con el mapa de la figura
5.52 no tiene memoria de lectura/escritura y los programas típicos adquieren varia-
bles externas o generan valores locales que deben almacenarse en una memoria de
datos, la cual además soporta la pila del sistema permitiendo la codificación de subru-
tinas y la gestión de interrupciones.

De modo que para diseñar un sistema con bancos de memoria conmutados de-
be realizarse un análisis detenido de las necesidades de memoria de código y de datos
y decidir o cuál de estás es la que requiere el uso de bancos. Considere ahora el mapa
de memoria de la figura 5.53, el cual pertenece a un sistema con una memoria SRWM
de 32 Kbytes y un área de código de 32Kbytes que será mapeada a 4 páginas en un
dispositivo de 128 Kbytes. La memoria de datos, en este caso, es un área común (sin
bancos) que es visible desde cualquiera de los bancos.

Fig. 5.53 Mapa de memorias con cuatro bancos de EPROM.

La memoria de código consiste de un dispositivo EPROM MBM27C1000 de


128 Kbytes, el cual debe ser accedido como cuatro bancos de 32 Kbytes cada uno; y
una memoria volátil de 32 Kbytes tipo MBM6256AFP. Para el diseño del subsistema
de bancos de memoria, observe que del mapa de memoria de la figura 5.53 se deduce
que la línea de dirección A15 estará en nivel alto para cualquier posición dentro del
rango de la SRWM y en estado cero para cualquier dirección lógica de la EPROM. Es
posible entonces, usar esta línea de dirección (A15) para seleccionar la EPROM y su
complemento A 15 , para habilitar la memoria la SRWM.

Los bits A0-A14 del µP se conectan las entradas de direcciones de la EPROM y


de la SRWM. Para tener acceso a 128 Kbytes desde el espacio lógico de 32 Kbytes
asignado a código, se debe generar un bit de dirección adicional A’16 (217=128K) el
cual debe conectarse al terminal A16 de la EPROM. Pero como usamos la línea A15
del microprocesador para seleccionar los circuitos de memoria, también debemos
El Microcomputador Básico 201

generar una nueva línea A’15 para la EPROM, que se aplica a la entrada A15 de la
MBM27C1000.

La razón de esto es que cada vez que se tiene acceso a la EPROM, A15 estará
en cero, de modo que si la conectamos directamente al la memoria de código sólo se
tendrá acceso al banco 0. La tabla siguiente muestra el estado de los bits de selección
de banco XA16 - XA15, de las líneas de dirección de la EPROM A’16 - A’15 y del termi-
nal A15 del µP, para cualquier posición de la memoria de programa.

Tabla. 5.22 Tabla de estados de la memoria EPROM.


DIRECCIÓN
Banco XA16 XA15 A’16 A’15 A15 FÍSICA LÓGICA
0 0 0 0 0 0 00000-7FFFFH 0000-7FFFH
1 0 1 0 1 0 08000-0FFFFH 0000-7FFFH
2 1 0 1 0 0 10000-17FFFH 0000-7FFFH
3 1 1 1 1 0 18000-1FFFFH 0000-7FFFH

Para generar los nuevos bits de direcciones se usa un puerto de salida y algu-
nas puertas como se observa en el diagrama eléctrico de la figura 5.54. El puerto de
salida se realiza con un latch 74LS175, cuyas salidas son puestas a cero por la señal
RESET-OUT, durante el arranque del sistema. La memoria RAM es seleccionada con
direcciones lógicas entre 8000H y FFFFH. Cualquier dirección por debajo de este
rango, habilita el circuito mapeador externo y selecciona una posición de memoria en
una de las páginas de 32Kbytes, dependiendo del valor de XA15-16.

Cuando se diseña un subsistema de memoria usando la técnica de conmuta-


ción de bancos, deben realizarse previsiones para que ciertas áreas de memoria de
código y de datos no desaparezcan cuando se selecciona un banco. Esto significa que
el diseño debe hacerse para que exista una región de memoria de programa y otra de
memoria de datos que sean visibles desde cualquier banco. Estas zonas se denominan
áreas comunes de código o de datos. Algunos prefieren llamarlas área de código del
sistema o área de datos del sistema.

Por ejemplo, la sección de memoria asignada al área de la pila debe estar dis-
ponible para acceso desde cualquier banco para las llamadas y retornos a y desde sub-
rutinas. Es necesario, además, que exista alguna cantidad de memoria de programa
común donde debe cargarse por ejemplo las rutinas que controlan la conmutación de
los bancos. Las secciones de código mencionadas a continuación deben siempre resi-
dir en el área común:

• Vectores de reset y de interrupción: debido a que el reset e interrupción


del µP son eventos asincrónicos y pueden ocurrir cuando esté selecciona-
do cualquiera de los bancos de código, los vectores de reset y de interrup-
ciones deben residir en el área común.
El Microcomputador Básico 202

Fig. 5.54 Subsistema de memoria con bancos conmutados


El Microcomputador Básico 203

• Constantes y tablas: si un banco contiene valores constantes y tablas defi-


nidas por el código, debe garantizares que esa página sea seleccionada en
el momento que esta información sea invocada por el programa. En caso
contrario estas constantes y tablas deben almacenarse en el área común.

• Rutinas de conmutación de bancos: esta sección del programa así como la


tabla de saltos debe localizarse en el área común por ser necesarias para
todos los bancos.

• Funciones de bibliotecas: las rutinas de bibliotecas usadas por el compila-


dor en tiempo de ejecución deben cargarse en el área común.

Algunos ensambladores y compiladores C incorporan soporte para conmuta-


ción de bancos. Los programas enlazadores asociados generan automáticamente el
código y la información de mapeo necesaria para ejecutar programas con bancos. El
enlazador crea una tabla de saltos para todas las funciones almacenadas en el área de
bancos y que son llamadas desde el área común o de otros bancos. Normalmente el
vendedor del software entrega un pequeño módulo de código el cual realiza la con-
mutación a y desde bancos. Normalmente las instrucciones CALL, JMP, RET y sus
formas condicionales están sujetas a remapeo cuando se ejecutan. Algunos paquetes
de desarrollo no incluyen acceso a bancos de datos, por lo cual éstos deben ser mane-
jados por el programa.

La aplicación que usa la técnica de conmutación de bancos debe incluir el


módulo fuente que contiene el código que es invocado para la conmutación de los
bancos. Este archivo debe ser configurado para que se corresponda con la técnica de
conmutación usada por el hardware, especificando el número de bancos y como son
seleccionados. Por ejemplo debe especificarse el número del puerto de la lógica de
conmutación y el estado de los bits de selección para cada banco. El enlazador ade-
más tiene directivas de control para especificar la localización y tamaño de los bancos
y para asignar determinados módulos del programa al área de un banco o al área co-
mún.

Una omisión en el modo de operación del circuito de manejo de memoria de


la figura 5.54, es que no proporciona una sección para el área común de código en el
espacio de la EPROM. La solución es que debe indicarse en tiempo de compilación,
cuales módulos del programa deben residir en el área del sistema. El programa enla-
zador entonces copia el código y los datos almacenados en esta zona en cada banco,
de modo que el contenido de todos los bancos de EPROM es el mismo en el rango de
direcciones del área común.

Para evitar la duplicación del código común, debe rediseñarse el manejador de


memoria para asignar por hardware el área común. Para esto considere que el tamaño
de esta zona es 16 Kbytes (0000H-03FFFH) como ilustra el mapa de memoria de la
figura 5.55. El espacio de EPROM en el rango 40000H-7FFFH será redirigido a uno
El Microcomputador Básico 204

de ocho bancos de 16 Kbytes, usando para seleccionarlos tres bits XA14-16 de un puer-
to de salida.

Como muestra la figura 5.56 Las líneas de direcciones A0-A13 se conectan a


las entradas correspondientes de la EPROM. Cuando A15 es igual a cero se selecciona
la EPROM y se puede tener acceso a uno de ocho bancos de 16 Kbytes, dependiendo
del estado de los bits A14’, A15’ y A16’ que se conectan a las tres líneas orden alto de
las entradas de direcciones del dispositivo.

Fig. 5.55 Mapa de memorias con área común de código y siete bancos de EPROM.

Aunque algunos compiladores no soportan bancos para el área de datos no


existe razón alguna para que la técnica de conmutación de bancos sea aplicada a la
memoria SRWM del microcomputador. El proceso de diseño de un mapeador para la
RAM se realiza exactamente igual a como se hizo para la memoria de código.
El Microcomputador Básico 205

Fig. 5.56 Subsistema de memoria con área común de código.


Introducción a la Programación del 8085A 206

Programación del 8085

En el capítulo anterior se establecieron las bases mínimas para el diseño de un


sistema microcomputador mínimo. En este capítulo, se presenta el conjunto de ins-
trucciones del microprocesador 8085A, y se describe como usarlo para realizar proce-
samiento de información.

El µP ejecuta una secuencia de instrucciones de máquina que define las opera-


ciones a realizar. Basándose en las instrucciones, el µP puede realizar tres tareas bási-
cas:

1. Mover datos desde una posición de memoria a otra.

2. Usar la ALU para ejecutar operaciones matemáticas y lógicas.

3. Tomar decisiones, y basarse en los resultados para transferir el control del programa hacia
un nuevo conjunto de instrucciones.

Aunque es posible, y en ocasiones conveniente, el uso de lenguajes de alto ni-


vel para la escritura de los programas de aplicación, para introducir al lector en la
programación del 8085A se usará el lenguaje ensamblador. Para escribir programas
eficientes en ensamblador, el usuario debe conocer a la perfección:

• Las funciones de los registros y la forma en que están organizados en el interior del µP.

• El repertorio de instrucciones del µP y

• Los modos de direccionamiento.


Introducción a la Programación del 8085A 207

6.1 EL MODELO PARA PROGRAMACIÓN

Aunque un microcomputador construido alrededor del μP8085, o de cualquier


otro μP, comprende un número de unidades funcionales distintas y de complejidad
variable, las cuales están interconectadas a los buses del microprocesador; para pro-
gramar el sistema, es suficiente considerar inicialmente un modelo que represente los
recursos a la disposición del programador.

8085A

D0-D7 A0-A15

Fig. 6.1 Modelo del microcomputador para programación.

Los registros internos a los cuales se permite acceso al usuario constituyen el


modelo básico de programación del microprocesador. En la figura 6.1 se presenta un
diagrama de la estructura interna del µP y de los componentes externos asociados que
integran al µC. Los elementos del modelo se presentan tal como se perciben desde la
óptica de un programador. Los registros buffers de datos y de direcciones no forman
parte del modelo.

El modelo para programación está constituido por varios registros de 8 bits,


tales como el acumulador (A), el registro de banderas o de estado, y el banco de re-
Introducción a la Programación del 8085A 208

gistros de propósito general (B,C,D,E,H,L); y dos registros de 16 bits: el contador de


programa y el apuntador de pila. El microcomputador tiene una memoria para ins-
trucciones y datos con una capacidad de 64Kbytes y 512 puertos de E/S. Para efectos
de programación, la conexión real entre el μP, la memoria, y los puertos de E/S del
sistema pueden considerarse transparentes para el programador.

6.2 FORMATO DE LAS INSTRUCCIONES


Para ejecutar un programa, el microprocesador debe obtener el código ejecu-
table y trasladarlo en secuencia al registro de instrucciones del microprocesador. Las
instrucciones y los datos del programa son obtenidos desde la memoria del sistema.
Esta almacena la información en palabras con formato de ocho bits.

De acuerdo con su tipo, cada instrucción puede ocupar uno, dos o tres posi-
ciones en el interior del dispositivo de memoria. Por ejemplo, la instrucción aritméti-
ca ADD r, realiza la suma del contenido del registro r y el dato depositado en el
acumulador, cargando el resultado de la operación en el mismo registro acumulador.
Se requiere un byte para definir completamente la instrucción.

La instrucción MVI r, dato, mueve el valor especificado por el operando dato


al registro r, necesitándose dos bytes para especificar la instrucción. El primero para
el código de operación, y el otro para representar el dato a ser almacenado en el regis-
tro. Una instrucción JMP dirección produce un salto incondicional a la dirección es-
pecificada, y es una instrucción de tres bytes porque requiere dos palabras adicionales
al código de operación, para especificar la dirección del salto.

En la figura 6.2 se muestra el formato general para las instrucciones del 8085.

Instrucción de un
byte
Código de operación Instrucción de
dos bytes
Instrucción de
tres bytes
Dato o byte de una dirección de memoria

Byte de una dirección de memoria

Fig. 6.2 Formato de instrucciones del μP 8085.


Introducción a la Programación del 8085A 209

NOMENCLATURA PARA EL CONJUNTO DE INSTRUCCIONES:

Para facilitar la comprensión de las instrucciones del 8085 se presenta, en la


tabla 6.1, la simbología usada por la empresa INTEL para las instrucciones.

Tabla. 6.1. Nomenclatura de las instrucciones del 8085.


SÍMBOLO SIGNIFICADO
dirección Expresión binaria de 16 bits.
Dato Expresión binaria de 8 bits.
dato 16 Expresión binaria de 16 bits.
Puerto Dirección de 8 bits de un dispositivo de E/S
r,r1.r2 Uno de los registros: A, B, C, D, E, H, L
DDD, SSS Representación de 3 bits del código de operación donde algunos de los registros: A,
B, C, D, E, H, L es destino (D) o fuente (S) de información. (Vea tabla 2)
Rp Cada pareja de registros B-C, D-E, H-L. El registro B representa el par B-C, D al par
D-E, mientras que H representa al registro par H-L. (Vea tabla 3)
XX Código de las banderas en instrucciones de salto condicional. (vea tabla 4)
NNN Número binario entre 000 y 111.
N Número decimal entre 0 y 7.
Rh El byte alto de mayor peso de un registro par.
Rl El byte menos significativo de un registro par.
PCH y PCL Bytes de mayor y menor peso del contador de programa.
M Referencia a memoria
PSW Palabra de estado del programa. Consiste del contenido del acumulador más las ban-
deras de condición.

(a)

Registro DDD o Registro rp Condición CCC


SSS par (XX)

A 111 BC 00 NZ no cero (Z=0) 000


B 000 DE 01 Z cero (Z=1) 001
C 001 HL 10 NC sin acarreo (CY=0) 010
D 010 SP 11 C con acarreo (Z=1) 011
E 011 PO Paridad impar (P=0) 100
H 100 (c) PE paridad par (P=1) 101
L 101 P positivo (S=0) 110
M negativo (S=1) 111

(b) (d)
Introducción a la Programación del 8085A 210

6.3 MODOS DE DIRECCIONAMIENTO

Especifican la manera en que las instrucciones del microprocesador 8085A


obtienen los datos a los cuales hacen referencia. Un modo de direccionamiento parti-
cular establece el procedimiento utilizado por el microprocesador para obtener un
dato necesario para la ejecución de la instrucción. Este valor puede estar en la memo-
ria del sistema, en un registro o puede ser especificado por un operando de la propia
instrucción.

Por ejemplo, ADD r y ADD M son ambas instrucciones que ejecutan una
suma, con uno de los operandos almacenado en el acumulador. El modo en el cual la
instrucción obtiene el segundo elemento de la operación, establece una diferencia
entre estas dos instrucciones. En un caso, el valor es obtenido desde un registro r,
mientras que en el segundo caso se encuentra en la posición de memoria especificada
por el contenido del registro par HL.

Para la escritura de programas eficientes es necesario entender con claridad


los distintos modos de direccionamiento que puede utilizarse con cada instrucción del
µP. En general, la potencia de cómputo de un determinado µP está determinada por el
número de modos de direccionamientos disponibles.

Las instrucciones del 8085A tienen cuatro modos de obtener los datos:

• Direccionamiento directo.

• Direccionamiento por registro.

• Direccionamiento indirecto por registro.

• Direccionamiento inmediato.

6.3.1 Direccionamiento directo

La instrucción indica en forma explicita la dirección de la posición de memo-


ria donde está el dato. Este modo corresponde a instrucciones de tres bytes, donde el
segundo indica los 8 bits de menor peso de la dirección, mientras que el tercer byte
corresponde a los 8 bits de mayor peso de la dirección donde está el dato.

Suponga que una instrucción STA 2045H está almacenada en la dirección


2000H de la memoria del sistema. Esta instrucción realiza la operación de mover el
contenido del acumulador a la dirección de memoria especificada por los bytes 2 y 3
de la instrucción, esto es [(byte 3) (byte2)], ← (A).

La figura 6.3a muestra como se almacena la instrucción en memoria, y la figu-


ra 6.3b presenta el contenido del dispositivo de memoria después de ejecutarse la
instrucción.
Introducción a la Programación del 8085A 211

A MEMORIA

F3 2000H
2000H 32
32 STA
STA
2001H
2001H 45
45 45
45
PC
20 00 2002H
2002H 20
20 20
20
2003H
2003H

2045H
2045H xx
F3
2046H

(a)

MEMORIA
A
F3 2000H 32 STA
2001H 45 45
PC
20 03 2002H 20 20

2003H

2045H F3

2046H

(b)

Fig.6.3 Direccionamiento directo de una posición de memoria. (a) antes de la ejecución. (b) Después
de la ejecución

6.3.2 Direccionamiento Inmediato

La instrucción contiene en forma explícita el dato a utilizarse en la ejecución


de la instrucción. Este tipo de referencia a datos corresponde a instrucciones de dos y
tres bytes. Por ejemplo, la instrucción ANI dato, ejecuta una operación AND entre el
contenido del byte dos de la instrucción y el dato en el acumulador. El resultado de la
operación lógica se deposita en el acumulador. La bandera de acarreo y la de acarreo
auxiliar son puestas a cero, las otras son afectadas según el resultado.
Introducción a la Programación del 8085A 212

Suponga que el acumulador contiene el dato binario 110111112. El resultado


de ejecutar ANI 011010112, es:

1101 1111 (A)


0110 1011 (byte 2)

0100 1011 (A)

(S) = 0 , (Z) = 0, (P) = 1, (AC) = 0, (CY) = 0

A F MEMORIA
DF X X X X X E6
2000H
2000H 32 ANI
STA
2001H
2001H 6B
45 6B
45
PC
20 F3
00 2002H
2002H x
20
2003H

F3
2046H

Fig.6.4 Direccionamiento inmediato de un dato. Contenido del acumulador, el contador de programa,


la memoria, y el registro de condiciones, antes de ejecutar la instrucción.

A F MEMORIA
CF 0 0 0 1 0 E6
2000H 32 ANI
STA
PC 2001H
2001H 6B
45 6B
45
20 F3
02 2002H
2002H x
20
2003H

F3
2046H

Fig.6.5 Direccionamiento inmediato de un dato. Contenido del acumulador, el contador de programa,


la memoria y el registro de condiciones, luego de ejecutar la instrucción.
Introducción a la Programación del 8085A 213

6.3.3 Direccionamiento por registro

La instrucción especifica el registro r de 8 bits, o rp de 16 bits, donde se halla


el dato. La instrucción INX rp, es un ejemplo de este tipo de referencia a dato. Se trata
de una instrucción de un byte, cuya ejecución incrementa en 1 el contenido del regis-
tro par rp, esto significa (rh) (rl) ← ((rh) (rl) +1). Si el registro B contiene el dato
12H y el registro (C ) = 4FH, al ejecutarse la instrucción INX B, el contenido de BC
cambiará como muestra la figura 6.7.

B C
(B-C) 12 FF

(B-C) + 1 13 00

Fig. 6.6 Direccionamiento por registro.

6.3.4 Direccionamiento indirecto por registro

La dirección de memoria donde está el dato es especificada por el contenido


de un registro par. La instrucción ADC M suma el contenido de la posición de memo-
ria indiada por el registro par H-L más el bit de acarreo contenido del acumulador, el
cual contendrá el resultado de la operación. Esto es: (A) ← (A) + [(H)(L)] + (CY).

Si antes de ejecutar la instrucción:

(A) = 1F (CY) = 1 (H) = 20 (L) = 50 [2050] = 23

Después de ejecutar la instrucción:

(A) = 43 (H) = 20 (L) = 50 [2050] = 23

y el estado de las banderas será:

(S) = 0 (Z) = 0 (AC) = 1 (P) = 0 (CY) = 0

En las figuras 6.8 y 6.9 se presentan los contenidos de los registros y memo-
ria, antes y después de ejecutar la instrucción.
Introducción a la Programación del 8085A 214

MEMORIA
A F
1F X X X X 1 2000H
2000H 8E
32 ADC

2001H 45
x
H L
F3
20 F3
50 2002H 20
PC

F3
20 F3
00 2050H
23
F3
2046H
2045H

Fig.6.7 Direccionamiento indirecto por registro de un dato. Contenido del acumulador, el registro par
H-L, el contador de programa, la memoria y el registro de condiciones, antes de ejecutar la
instrucción.

MEMORIA
A F
2000H
2000H 8E
32 ADC
1F 0 0 1 0 0
2001H 45
x
H L
F3
20 F3
50 2002H 20
PC
F3
20 F3
01 2050H
23
F3
2046H
2045H

Fig.6.9 Direccionamiento indirecto por registro de un dato. Contenido del acumulador, el registro par
H-L, el contador de programa, la memoria y el registro de condiciones, luego de ejecutar la
instrucción.

6.4 EL CONJUNTO DE INSTRUCCIONES DEL 8085

El μp8085A puede ejecutar 246 operaciones distintas agrupadas en 74 instruc-


ciones generales, estás pueden distinguirse en los siguientes grupos:

• Transferencia de datos.
• Operaciones lógicas.
• Bifurcaciones.
• Instrucciones de manejo de pila (stack), E/S, y control de la máquina.
• Operaciones Aritméticas.
Introducción a la Programación del 8085A 215

6.4.1 Grupo de instrucciones para transferencia de datos

Permiten el movimiento de datos entre los distintos componentes del sistema


μcomputador. Transfieren información entre los registros internos del microprocesa-
dor, desde un registro hacia la memoria del sistema, o hacia los puertos de entrada y
salida, o bien desde la RWM o dispositivos de E/S, hacia un registro. Estas instruc-
ciones deben especificar la fuente donde se localizan los datos, y el destino donde
debe copiarse la información. Cuando se ejecuta una transferencia (mover), el conte-
nido del registro fuente permanece inalterable. Las instrucciones de este grupo no
afectan las banderas. En la tabla 6.2 se presentan las instrucciones del 8085A destina-
das a transferir datos.

Tabla. 6.2 Instrucciones para carga y movimiento de datos.


Instrucciones para transferencia de datos

MOV r1,r2 (r1) ← (r2) STA dirección [(dirección)]←(A)


(L) ←[(dirección)]
MOV r,M (r) ←[(H)(L)] LHLD dirección
(H) ←[(dirección+1)]
[(dirección)] ← (L)
MOV M,r [(H)(L)] ← (r) SHLD dirección
[(dirección+1)] ← (H)
MVI r,dato (r) ← (dato) LDAX rp (A) ← [(rp)]

MVI M,dato [(H)(L)] ← (dato) STAX rp [(rp)] ← (A)


(H) ↔ (D)
LXI rp,dato 16 (BC) ←dato 16 XCHG
(L) ↔ (E)
IN puerto (A) ← (puerto)
LDA dirección (A) ←[(dirección)]
OUT puerto (puerto) ← (A)

Los datos son transferidos entre registros o entre un registro y la memoria por
la instrucción MOV, esta se especifica de la siguiente forma, dependiendo del origen
y destino de los datos:

MOV r1,r2 (r1)←(r2)

Transfiere el contenido del un registro fuente r2 a al registro destino r1 , puede


especificarse cualquier registro interno de 8 bits.

MOV r,M (r)←[(H) (L)]

Mueve el contenido de la posición de memoria apuntada por el registro par


HL al registro r. El registro HL debe cargarse con la dirección de memoria cuyo con-
tenido se quiere transferir. Existen varios métodos para cargar la dirección, pero una
forma común es usar la instrucción:
Introducción a la Programación del 8085A 216

LXI rp, dirección (rl)←(byte 2); (rh)←(byte 3)

Esta instrucción de 3 bytes, carga el registro par rp con los bytes 2 y 3 de la


instrucción, por ejemplo: LXI H, 10FFH, carga el registro H con el byte 10H y L con
FFH.

Otra forma de cargar un registro o una posición de memoria es con la instruc-


ción MVI, mover inmediatamente.

MVI r ,dato (r)←(byte 2)

Carga el registro r de 8 bits con el dato especificado por el byte 2 de la ins-


trucción

MVI M,dato [(H)(L)]←(byte 2)

Permite copiar el dato especificado por el byte 2 de la instrucción en la posi-


ción de memoria con dirección indicada por el contenido del registro HL.

Las instrucciones LXI y MVI pueden usarse para cargar cualquier registro o
posición de memoria cambiando el operando destino, o el modo de direccionamiento.
Por ejemplo LXI B, dirección deposita en el registro par BC los bytes 2 y 3 de la ins-
trucción. La instrucción LXI SP, dirección carga el apuntador de stack con la direc-
ción del tope de la pila.

Algunas instrucciones para transferencia de datos con memoria no hacen refe-


rencia al registro par HL.

LDAX rp (A) ←[(rp)]

La información en la posición de memoria especificada por el contenido del


registro par rp es transferida al acumulador.

LHLD dirección (L) ←[(byte 3) (byte 2)]; (H) ←[(byte 3) (byte 2) +1]

El contenido de la dirección de memoria especificada por el byte 2 y 3 de la


instrucción es cargado en el registro L, y el contenido de la próxima posición de me-
moria es transferido al registro H.

LDA dirección (A) ←[(byte 3) (byte 2)]

El dato en la posición de memoria especificado por el byte 2 y 3 de la instruc-


ción es movido al acumulador.
Introducción a la Programación del 8085A 217

STAX rp [(rp)]←(A)

El byte almacenado en el registro acumulador es transferido a la posición de


memoria cuya dirección está especificada por el contenido del registro par rp.

SHLD dirección [(byte 3) (byte 2)]←(L); [(byte 3) (byte 2) +1]←(H)

Mueve el contenido del registro L a la posición de memoria señalada por los


bytes 2 y 3 de la instrucción. El contenido del registro H es transferido a la siguiente
posición de memoria.

STA dirección [(byte 3) (byte 2)] ←(A)

El contenido del acumulador es almacenado en la dirección de memoria espe-


cificada por los bytes 2 y 3 de la instrucción.

Las instrucciones LDA y STA proveen un medio para transferir inmediata-


mente datos entre el acumulador y la memoria. Usando estas instrucciones, esto pue-
de realizarse con tres bytes en lugar de los cuatro bytes necesarios para cargar el re-
gistro par HL con una dirección y mover datos desde o hacia la memoria.

Ejemplo 6.1

El código siguiente mueve el contenido de la dirección de memoria 451FH al


registro acumulador.

lda lxi h
1F 1F
45 45
mov a,m
3 bytes 4 bytes

XCHG (H) ↔ (D); (L) ↔ (E)

Intercambia los datos contenidos en los registros pares HL y DE:

La elección de las instrucciones que permiten la transferencia de información


entre el microprocesador y los dispositivos de entrada y salida, depende del tipo de
estructura que utilice el sistema para la decodificación de los puertos de E/S. Son po-
sibles dos esquemas:

• E/S estándar. (E/S aislada)


• E/S direccionada como memoria. (Mapeo de memoria)
Introducción a la Programación del 8085A 218

Posteriormente se analizaran en detalle los modos de selección más comunes


para dispositivos de E/S. En lo que se refiere al programador, basta con distinguir las
instrucciones que se pueden utilizar en cada caso.

Para el esquema E/S estándar se usan las instrucciones de dos bytes IN puerto
y OUT puerto. El primer byte de la instrucción contiene el código de operación y el
segundo la dirección del puerto que se desea seleccionar:

IN puerto (A)←(dato)

El byte colocado en el bus de datos por el puerto especificado por el segundo


byte de la instrucción, es depositado en el acumulador.

OUT puerto (dato)←(A)

El contenido del registro A es colocado en el bus de datos para ser transmitido


al puerto especificado por el segundo byte de la instrucción

Es obvio que como la dirección del puerto se especifica con un byte, solo es
posible el acceso a 512 puertos, 256 de entrada, y 256 de salida. Un puerto de entra-
da puede tener la misma dirección que uno de salida, las señales de control de lectura
y escritura en puerto realizarán la distinción.

Cuando se ejecuta una instrucción IN la señal de control de lectura, RD , se


activa para permitir la lectura del puerto, en el caso de la ejecución de una instrucción
OUT se activará la señal WR , de escritura en memoria o puerto de E/S. La línea
IO / M es puesta en alto para indicar que la transferencia es a un registro de E/S.
Además, el 8085A coloca la dirección del puerto sobre las ocho líneas de dirección de
menor peso A0-A7, duplicando esta información en las ocho líneas de mayor peso del
bus de direcciones A8-A15.

Cuando los puertos de entrada y salida son seleccionados como si se tratara de


posiciones de memoria, se pueden usar las instrucciones que hacen referencia a me-
moria para transferir datos a, o desde dispositivos de E/S. En este caso, el procesador
no puede distinguir entre un puerto tratado como memoria y una dirección de la me-
moria del sistema.

6.4.2 Grupo de instrucciones que ejecutan operaciones lógicas

El microprocesador 8085A posee un grupo de instrucciones que usan la uni-


dad lógica y aritmética para hacer posible la realización de operaciones lógicas, de
forma equivalente a como las puertas básicas digitales las ejecutan por hardware. La
única diferencia es que el microprocesador opera con datos de 8 bits. Las instruccio-
Introducción a la Programación del 8085A 219

nes de este grupo facilitan la manipulación y control de bits individuales de un regis-


tro o posición de memoria.

Tabla. 6.3 Instrucciones del grupo lógico.


Instrucciones lógicas

ANA r (A)←(A) ∧ ( r) CMC (CY )← (CY)

ANA M (A) ←(A) ∧ [(H)(L)] STC (CY) ← 1

ANI dato (A) ← (A) ∧ (dato) CMP r (A) - ( r)

ORA r (A) ← (A) ∨ ( r) CMP M (A) - [(H)(L)]

ORA M (A) ←( A) ∨ [(H)(L)] CPI dato (A) - (dato)


(An)←(An+1); (A7)←(A0)
ORI dato (A) ← (A) ∨ (dato) RRC
(CY) ← (A0)
(An+1)←(An); (A0)←(A7)
XRA r (A)←(A) ∀ (r) RLC
(CY) ← (A7)
(An)←(An+1); (CY)←(A0)
XRA M (A)←(A) ∀ [(H)(L)] RAR
(A7) ← (CY)
(An+1)←(An); (CY)←(A7)
XRI dato (A)←(A) ∀(dato) RAL
(A0) ← (CY)
CMA (A)←(A)

Cuando en una instrucción de este grupo intervienen dos operandos, como en


ANA r, que ejecuta una operación AND entre un registro y el acumulador, la opera-
ción se realiza simultáneamente entre los bits correspondientes de cada byte. En el
caso de la instrucción CMA de complemento, la operación de complementar se efec-
túa sobre los ocho bits del acumulador. En todas las instrucciones lógicas, exceptuan-
do aquellas que se refieren a la bandera de acarreo (CY), uno de los operandos está en
el acumulador. Cuando intervienen dos operandos, el otro puede estar: implícito en la
instrucción, en otro registro del microprocesador o en la memoria.

Las instrucciones de este grupo afectan todas las banderazas operaciones lógi-
cas posibles son: AND, OR, OR Exclusivo, Complemento, Comparación, y Despla-
zamientos.

Instrucciones que ejecutan la función AND

ANA r, ANA M y ANI dato realizan la función AND entre el acumulador y el


operando de referencia. Afectan todas las banderas de condiciones: CY es puesta a
cero y AC a 1. Los valores de P, S y Z son asignados de acuerdo con el resultado de
la operación.
ANA r (A)←(A) ∧ ( r)
Introducción a la Programación del 8085A 220

Realiza la función AND bit a bit entre el acumulador y el registro especifica-


do, el resultado se deposita en el acumulador.

Ejemplo: ANA C, con (A) = B6H y (C)=63H

10110110 (A) B6H


∧ 01100011 (C) 63H
00100010 (A) 22H

ANA M (A) ←(A) ∧ [(H)(L)]

Ejecuta la operación AND entre el acumulador y el contenido de la posición


de memoria apuntada por el registro par HL, el resultado se carga en el acumulador.

ANI dato (A) ←(A) ∧ (dato)

Realiza una función AND entre el segundo byte de la instrucción y el conteni-


do del acumulador. El resultado se almacena en el acumulador.

La utilidad de las instrucciones que ejecutan operaciones lógicas puede no ser


obvia. Por ejemplo, la función AND permite poner en cero algunos bits específicos de
una palabra, mientras que los restantes permanecen inalterables. Si es necesario bo-
rrar los bit 7 y 0 del A, basta con usar un byte de máscara (7EH) y ejecutar la instruc-
ción ANI 7EH.

10101001 (A) A9H xxxxxxxx (A) xxH


∧ 01111110 (C) 7EH ← máscara ∧ 01111110 (C) 7EH ← máscara
00101000 (A) 28H 0xxxxxx0

Instrucciones que ejecutan la función OR

Las instrucciones ORA r, ORA M y ORI dato, disponibles en el grupo de ins-


trucciones lógicas del microprocesador 8085A, ejecutan la función OR entre el acu-
mulador y el operando especificado. Al igual que en el caso anterior el segundo ope-
rando puede ser un registro de 8 bits, la memoria del sistema, o un dato contenido en
el segundo byte de la instrucción OR inmediato (ORI). Estas instrucciones afectan
todas las banderas: CY y AC son puestas a cero.

ORA r (A)←(A) ∨ ( r)

Realiza la función OR bit a bit entre el acumulador y el registro especificado,


el resultado se deposita en el acumulador.
Ejemplo: ORA B, con (A) = B6H y (B)=63H
Introducción a la Programación del 8085A 221

10110110 (A) B6H


∨ 01100011 (B) 63H
11110111 (A) F7H

ORA M (A) ←(A) ∨ [(H)(L)]

Ejecuta la operación OR entre el registro A y el contenido de la posición de


memoria apuntada por el registro par HL, el resultado se carga en el acumulador.

ORI dato (A) ←(A) ∨ (dato)

Produce la ejecución de una función OR entre el segundo byte de la instruc-


ción y el contenido del acumulador, el resultado se almacena en el acumulador.

Una aplicación inmediata de la función OR es poner a uno un bit de una pala-


bra de control, manteniendo el estado lógico de los demás bits. Como ejemplo, la
ejecución de la instrucción ORI 70H fuerza a uno el bit A6 del registro acumulador.
El programa que se ofrece a continuación muestra el uso de las instrucciones lógicas
AND y OR para la conversión de números codificados en ASCII al sistema BCD y
viceversa. Para convertir un carácter ASCII (37H) a su equivalente decimal (07H),
basta con poner a cero los bits A4-6 del valor ASCII. Esto se logra con la instrucción
AND 0FH. Para revertir el proceso, se retornan a uno el mismo grupo de bits, ejecu-
tando ORI 30H.

Ejemplo 6.2

El puerto de entrada 80H contiene el código ASCII de un digito decimal y en


el registro D está almacenado el equivalente binario de un número decimal. El pro-
grama debe leer el puerto de entrada, convertir el carácter ASCII a BCD y almacenar-
lo en la posición de memoria 0200H. El dígito decimal en D, debe ser convertido a
ASCII y escrito en el puerto de salida 90H.

in 80h ; Obtener carácter ASCII


ani 0fh ; Convertir a BCD
sta 0200h ; Almacenar en memoria
mov a,d ; Cargar en a el número decimal
ori 30h ; Convertir en ascii
out 90h ; Escribir a puerto
hlt

En aplicaciones de control es a menudo necesario probar el estado lógico de


uno o más bits de un registro o de una posición de memoria determinada. Considere
que el contenido del registro acumulador es A9H y se requiere detectar el estado del
bit A3.
10100001 (A) A9H 10101001 (A) A9H
∧ 00001000 (C) 08H ← máscara ∧ 00001000 (C) 08H ← máscara
Introducción a la Programación del 8085A 222

00000000 (A) 00H 00001000 (A) 08H


(Z) = 1 (Z) = 0

La forma más directa y sencilla de realizar esta tarea es usar un byte de masca-
ra específico, 08H en este caso, para ocultar todos los bits del A excepto el correspon-
diente a la prueba. Ejecutando la instrucción ANI 08H, se coloca la máscara. El resul-
tado de la prueba se indica mediante la bandera de cero (Z), la cual se activará sólo en
el caso que A3 sea igual a cero. El ejemplo 6.3 ilustra un método para realizar prueba
de bits.

Ejemplo 6.3

El programa detecta el estado del bit 4 de la posición de memoria con direc-


ción 300H. Si está en uno, se cargarán ceros en todos los bits de la posición 0500H.
Si por el contrario el bit 4 es cero, se pondrán a uno todos los bits de la misma celda
de la memoria.

lxi h,0300h ; Apunta la dirección del bit a probar


mov a,m ; Palabra de prueba al a
ani 10h ; Prueba de a4
jz uno ; Si cero, todos a uno
ani 00h ; Si uno, todos a cero
jmp mem
uno: ori ffh
mem: sta 0500h ;Actualiza indicador
hlt

Instrucciones que ejecutan la función OR EXCLUSIVO

El μP 8085A permite realizar las funciones: XRA r, XRA M y XRI dato. La


ejecución de cualquiera de estas instrucciones ponen a cero las banderas de acarreo y
de acarreo auxiliar, el resto de los bits de condiciones son afectados según el resulta-
do de la operación lógica.

Al ejecutar la instrucción OR exclusivo entre bits de igual valor lógico, se ob-


tiene como resultado un cero, mientras que entre bits distintos se produce uno. Esto
indica que si el dato en el acumulador coincide con el operando de la instrucción OR
exclusivo, el registro acumulador es cargado con cero y la bandera de cero (Z) es ac-
tivada a uno.

XRA r (A)←(A) ∀ (r)

La función OR exclusivo se ejecuta entre el acumulador y el registro r, el re-


sultado se deposita en el acumulador.

Ejemplo: XRA B, con (A) = B6H y (B)=63H


Introducción a la Programación del 8085A 223

10110110 (A) B6H


∀ 01100011 (B) 63H
11010101 (A) D5H

XRI M (A)←(A) ∀ [(H)(L)]

Realiza la operación OR exclusivo entre el contenido de A y el byte en la posi-


ción de memoria apuntada por el registro par HL., el resultado se carga en el A.

XRI dato (A)←(A) ∀ (dato)

Ejecuta una función OR exclusivo entre el segundo byte de la instrucción y el


contenido del acumulador, el resultado se almacena en el acumulador.

Para el programador, es una práctica habitual tener que cargar el registro acu-
mulador con cero. Esta operación puede ser realizada por la instrucción de dos bytes
MVI A,0. Una forma más eficiente para iniciar en cero el A es utilizar la instrucción
de un bytes XRA A, la cual además torna a cero las banderas de acarreo (CY) y aca-
rreo auxiliar (AC).

En forma similar a como se usó la función AND para poner bits a cero y la OR
para hacerlos uno, la operación OR exclusivo puede usarse para complementar bits.
Por ejemplo XRI F0H produce la inversión lógica de los cuatro bits de mayor orden
del registro acumulador.

1011 1110 (A) BEH


∀ 1111 0000 (B) F0H
0100 1110 (A) 4EH

El ejemplo 6.4 muestra el uso de la función OR exclusivo para prueba de byte.

Ejemplo 6.4

El programa lee una palabra de control del puerto 0BH y lo compara con una
copia del dato almacenada en la dirección 3000H de la memoria. Si son iguales, se
hace uno el bit 5 de la posición de memoria 3200H. Si los bytes comparados difieren,
se actualiza la copia de la palabra de control.

lda 3000h
mov c,a ; Copia de palabra de control en c
in 0ah ; Leer palabra de control
mov b,a
xra c ; Comparar con copia
jnz difer ;Son diferentes
Introducción a la Programación del 8085A 224

lda 3200h ; Son iguales


ori 20h ; Bit 5 a uno
sta 3200h
jmp fin
difer: mov a,b ; Actualizar copia en memoria
sta 3000h
fin: hlt

Observe que la actualización de la palabra de control ocurre únicamente si


hubo cambios en ésta.

Instrucciones que realizan complemento

Son dos instrucciones de un byte: complementar el acumulador, CMA, y


complementar la bandera de acarreo, CMC.

CMA (A)←( A )

El contenido de acumulador es complementado. El registro de banderas no


es modificado.

CMC (CY)←( CY )

Solo afecta la bandera de acarreo.

Existe otra instrucción que actúa directamente sobre el bit de acarreo:

STC (CY)←1

La bandera de acarreo es puesta a uno, las otras permanecen mantienen su


valor.

Instrucciones de comparación

La instrucción OR exclusivo (XRA) se usó en el ejemplo 6.4 para comprobar


si dos datos son iguales. Si se requiere comparar bytes e indicar si uno es mayor o
menor que el otro, no puede usarse XRA. La comparación de dos valores binarios en
términos de sus magnitudes relativas, puede ser realizada usando las instrucciones de
comparación, descritas a continuación.

CMP r, CMP M y CPI dato, comparan el contenido del acumulador con: el


de cualquier registro interno del μP (incluyendo al propio A), con el de una posición
de memoria, o con un dato inmediato. La comparación consiste en substraer el byte
Introducción a la Programación del 8085A 225

operando del contenido del acumulador. Todas las banderas son afectadas. Los bits Z
y CY son afectadas de acuerdo con el resultado de la comparación.

CMP r (A) - ( r)

Si (A) = (r), la bandera de cero Z es puesta a 1

Si (A) < (r) el bit de acarreo CY se hace 1.

CMP M (A) - [(H)(L)]

Si (A) = [(H)(L)] , Z = 1

Si (A) < (r) , CY= 1.

CPI dato (A) - (dato)

Si (A) = (dato), Z=1

Si (A) < (r), CY es 1.

En todas las instrucciones de comparación, el dato en el acumulador antes de


la ejecución de la instrucción, permanece invariable. Los valores de las banderas de
estado son asignados de acuerdo con el resultado de la comparación realizada.

Ejemplo 6.5

La instrucción de comparación CMP r es utilizada para resolver el problema


planteado en el ejemplo anterior. Es suficiente con sustituir la línea de código XRA C
del ejemplo 6.4, por la instrucción CMP C.

lda 3000h
mov c,a
in 0ah
mov b,a
cmp c
jnz difer
lda 3200h
ori 20h
sta 3200h
jmp fin
difer: mov a,b
sta 3000h
fin: hlt
Introducción a la Programación del 8085A 226

Ejemplo 6.6

Para la comparación de la magnitud de dos números se puede usar el siguiente


código.

.
.
.
cpi 50h
jz no50 ; Saltar si distinto a 50h
. ; Es igual a 50h
.
.
no50: jc men50 ; Saltar si menor de 50h
. ; Mayor que 50h
.
.
men50: . ; Es menor a 50h
.

Las instrucciones de comparación pueden usarse para determinar si un número


está dentro de un intervalo determinado. El programa del ejemplo 6.7, verifica si un
dato obtenido desde un puerto de entrada, corresponde al carácter ASCII de un dígito
decimal.

Ejemplo 6.7

Si el dato captado por el microprocesador desde el puerto de entrada con di-


rección 00H, es un dígito decimal, éste debe almacenarse en la posición de memoria
2000H. En caso contrario, el valor obtenido desde el puerto debe copiarse en el regis-
tro E.

lxi h,2000h
in 00h ; Leer dígito de puerto de entrada.
mov c,a ; Almacenar dígito en registro c.
cpi 30h ; Comparar con ascii ‘0’.
jm inval ; Si es < , no es un digito decimal.
cpi 40h ; Comparar con ascii ‘9’+1.
jm vali ; Si es <, el digito esta entre ‘0’ y ’9’.
inval: mov e,a ; Carácter no decimal al registro e.
jmp salir
vali : mov m,a ; Número decimal a memoria
salir: hlt

Para concluir la exposición sobre las instrucciones de comparación, se presen-


ta un ejemplo del uso del microprocesador 8085A en la solución de un problema
simple de control industrial.
Introducción a la Programación del 8085A 227

Ejemplo 6.8

Un 8085A debe supervisar en forma continua el valor de una variable analógi-


ca de un proceso industrial. Si la magnitud de la variable supera un valor de referen-
cia, debe generarse una alarma visual. En la figura 6.12 se ofrece un diagrama de blo-
ques del proceso.

Fin de conversión

A CAD µC 8085
Sensor

Amplificador
Selección
Inicio de conversión
Lectura del dato

Fig. 6.10 Supervisión de un proceso industrial.

El conversor de datos usado es el ADCC0804, el cual se presenta en un encap-


sulado de veinte terminales con todas las funciones necesarias para facilitar la co-
nexión al bus de un microprocesador. En la figura 6.11 se observa el símbolo del cir-
cuito y las funciones de los terminales.

Señal Función
DB0-DB7 Salidas digitales
VI+, VI- Entradas analógicas
CS Selección De circuito
RD Habilitación de salida
WR Iniciar conversión
INTR Fin de conversión
AGND Tierra analógica
VREF Tensión de referencia
CLK Entrada de reloj externo

Fig. 6.11 El convertidor A/D de 8 bits ADC0804.

El ADC0804 convierte el voltaje de entrada a un valor digital de 8 bits. Las


salidas DB0-DB7 son tri- estados. La resolución del CAD es de 19.6 mV. Las entradas
analógicas VI+ y VI- permiten la conversión de entradas diferenciales. Con entrada
Introducción a la Programación del 8085A 228

no diferencial, el voltaje a convertir se aplica a VI+ y VI- se conecta a la tierra analó-


gica AGND. Con el terminal VREF a circuito abierto, el rango de la señal de entrada
es 0-5V.

Posee un generador de reloj interno de frecuencia 1/(1.1RC), donde RC son


componentes externos conectados a los terminales CLKR y CLK. Con alimentación
de +5 V, la frecuencia de trabajo permitida está entre 100 KHz y 800 KHz. Puede
usarse un reloj externo conectado a la entrada CLK. En la figura 6.12 se muestran las
señales que intervienen en el proceso de adquisición de datos.

Inicio de Fin de Lectura


conversión conversión de datos

CS
WR

INTR

RD

DB0-7 Dato
tc

Fig. 6.12 Diagrama de tiempos del ADC0804.

Para habilitar al ADC0804, la entrada CS debe estar en cero. Con el disposi-


tivo seleccionado, la aplicación de un pulso de nivel bajo en la entrada WR pone al
CAD en operación y la señal INTR cambia a nivel alto. El proceso de conversión
propiamente dicho se inicia una vez que las señales CS y WR han regresado al nivel
alto. Al finalizar el proceso, INTR vuelve a cero, señalando que puede proceder a
leerse el dato habilitando las líneas de salida DB0-DB7 con la aplicación de un co-
mando de lectura en la línea RD .

La sección de adquisición de datos y generación de alarma del sistema super-


visor se muestra en la figura 6.13. Las salidas de datos del circuito convertidor
ADC0804 se conectan al bus AD0-AD7 del 8085 y las líneas de inicio de conversión y
de habilitación de salidas se aplican, respectivamente, a los terminales de control
WR y RD .

Los valores de los componentes externos, resistencia y capacitor fijan una fre-
cuencia de trabajo de 606KHz la cual está dentro de las especificaciones de funcio-
namiento del circuito. El decodificador de direcciones realiza una decodificación par-
cial situando al ADC0804 en el puerto 04H, y a la señal de fin de conversión ( INTR )
en 00H. El indicador luminoso se conecta a la salida Q de un circuito 74LS74 y se
Introducción a la Programación del 8085A 229

controla aplicando las entradas de selección de puerto ( CS2 y CS3 ) a las líneas
asincrónicas de puesta a uno ( PR ) y puesta a cero ( CL ).

Una operación de escritura al puerto con dirección 08H apagará al diodo indi-
cador durante la operación normal, mientras que la selección del puerto 0CH, lo ilu-
minará cuando el sistema funcione bajo falla. El contenido del bus de datos durante el
acceso a estos dos puertos es irrelevante.

Fig. 6.13 Sección de adquisición de datos e indicación de alarma.

El programa de control se muestra a continuación.

ctrl.: lda e200h ; Obtener valor de referencia


mov b,a ; almacenarlo en B.
out 8 ; Se asegura que el LED esté apagado
adc: out 4 ; Inicio de la conversión
esp: in 0 ; Se lee la línea INTR.
ani 80h ; Prueba de INTR
jnz esp ; Esperar hasta cuando sea cero.
in 4 ; Leer resultado de la conversión.
cmp b ; Comparar con la referencia.
jc adc ; Si es menor, adquirir nuevo valor
out 0ch ; Es mayor, activar led
adc1 out 4 ; Adquirir variable y esperar
esp1: in 0 ; que disminuya por debajo del
ani 80h ; valor de referencia.
jnz esp1
in 4
Introducción a la Programación del 8085A 230

cmp b
jnc adc1
jmp ctrl ; Reiniciar proceso.

Al inicio de la ejecución, se desactiva el diodo luminoso. A continuación una


operación de escritura en el puerto 4 da inicio al proceso de conversión. Para verificar
el fin de la conversión, se examina continuamente el contenido del puerto 0 hasta
cuando el bit D7 sea cero. En este momento se lee el dato de salida del CAD. Este
valor se compara con la referencia. Si es menor, se continúa adquiriendo valores de la
variable. Cuando la magnitud de la señal de entrada supera el valor de referencia se
activa la alarma. Con el diodo iluminado, se adquieren nuevos valores hasta cuando la
magnitud de la tensión de entrada cae bajo el nivel de referencia. Se apaga el diodo y
de inicia de nuevo el proceso de supervisión.

El programa del ejemplo 6.8 se mantiene en un lazo sin fin supervisando con-
tinuamente la variable del proceso. La redundancia de código mostrada por el pro-
grama se corregirá cuando se trate el tópico de subrutinas. También puede ordenarse
el apagado del diodo, aun cuando esté desactivado, al inicio del lazo de adquisición y
de este modo no será necesario lazos separados de adquisición para condiciones nor-
mal y bajo falla. Observe que las puertas OR en la figura 6.13 pueden suprimirse si en
el sistema no existe un puerto 0 de salida ni puertos 8 y 0CH de entrada. Esto debido
a que el 74LS139 selecciona el puerto sin discriminar si es de entrada o salida.

Fig. 6.14 Decodificador de puertos con PLD para la sección de adquisición de datos e indicación de
alarma.
Introducción a la Programación del 8085A 231

Como alternativa, en figura 6.14 se muestra el circuito de la figura 6.13 con


un decodificador de puertos que realiza una decodificación completa de las direccio-
nes de los puertos y además usa un solo chip.

El código a programar en el circuito PAL es el siguiente:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity DECDIR is
port (
IOM,RD,A7,A6,A5,A4,A3,A2,A1,A0: in STD_LOGIC;
CS0, CS1, CS2, CS3: out STD_LOGIC
);
end DECDIR;

architecture RTL of DECDIR is


begin
CS0 <= NOT(IOM)OR RD OR A0 OR A1 OR A2 OR A3 OR A4 OR A5 OR A6 OR A7;
CS1 <= NOT(IOM) OR A0 OR A1 OR NOT (A2) OR A3 OR A4 OR A5 OR A6 OR A7;
CS2<= NOT(IOM)OR NOT(RD) OR A0 OR A1 OR A2 OR NOT(A3) OR A4 OR A5 OR A6 OR A7;
CS3<= NOT(IOM)OR NOT(RD) OR A0 OR A1 OR NOT(A2) OR NOT(A3) OR A4 OR A5 OR A6
OR A7;
end RTL;

Instrucciones de rotación

Las instrucciones de este grupo desplazan el contenido del acumulador un bit


a la derecha, o a la izquierda. Son instrucciones de un byte, y su ejecución solo afecta
la bandera de acarreo.

RRC (An)←(An+1); (A7)←(A0); (CY) ← (A0)

La instrucción RRC, desplaza el contenido del A un bit hacia la derecha. El


bit menos significativo del A (A0) se transfiere al de mayor peso (A7) y al bit de aca-
rreo, como ilustra la figura 6.15.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig 6.15 Rotación del acumulador un bit hacia la derecha


Introducción a la Programación del 8085A 232

RLC (An+1)←(An); (A0)←(A7); (CY) ← (A7)

Realiza una rotación hacia la izquierda del contenido del acumulador. A7 se


transfiere hacia A0 y hacia la bandera de acarreo.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig. 6.16 Rotación del acumulador un bit hacia la izquierda

RAR (An)←(An+1); (CY)←(A0); (A7) ← (CY)

El contenido del acumulador se desplaza un bit hacia la derecha a través del


bit de acarreo. El bit A0 pasa a CY, y el bit de acarreo a A7.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig. 6.17 Rotación de un bit hacia la derecha a través de la bandera de acarreo.

RAL (An+1)←(An); (CY)←(A7); (A0) ← (CY)

El byte en el acumulador es desplazado un lugar hacia la izquierda a través del


bit de acarreo. El bit A7 ocupa el lugar del CY, y el contenido de la bandera de acarreo
se transfiere al bit A0.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig. 6.18 Rotación del acumulador un bit hacia la izquierda a través de CY.
Introducción a la Programación del 8085A 233

Ejemplo 6.9

Se requiere empaquetar los nibbles menos significativos de las posiciones de


memoria E400H y E4001H en la dirección E500H, como indica la figura 6.19.

Fig. 6.19 Después de ejecutar el programa, el dato en la posición E500H es 92H

lhld e400h ; Se cargan en h y l los datos en memoria


mov a,l ; Se mueve al acumulador el valor en e400h.
rlc ; Intercambio de nibbles del acumulador.
rlc
rlc
rlc
ani f0h ; Se pone a cero el nibble de orden menor y
mov b,a ; Se mueve al registro b
mov a,h ; Cargar el a con el dato en e401h
ani 0fh ; Se hace cero el nibble de mayor orden.
ora b ; Se empaquetan valores
sta e500h ; Resultado a posición e500h.
hlt

En este capítulo se ha intentado presentar programas útiles para el desarrollo


de aplicaciones prácticas de sistemas empotrados. Sin embargo, esta tarea es obstacu-
lizada por el hecho que aún no se ha presentado el repertorio completo de instruccio-
nes del 8085A. La potencialidad real de algunas instrucciones se revelará a medida
que se avance en la exposición.

Por ejemplo, las instrucciones de rotación combinadas en un programa con


instrucciones aritméticas, permiten realizar operaciones matemáticas diversas, algu-
nas de éstas son: multiplicación, división, cálculo de logaritmos y de funciones trigo-
nométricas.

En el siguiente ejercicio se muestra otra aplicación sencilla de las instruccio-


nes de rotación.
Introducción a la Programación del 8085A 234

Ejemplo 6.10

A los terminales del puerto de salida 20H están conectados 8 indicadores lu-
minosos (LED0-7), los cuales deben iluminarse de acuerdo con las siguientes condi-
ciones:

a. Los LEDs deben estar inicialmente apagados.

b. Si la línea 7 del puerto 40H está en:

0, active LED0, LED2, LED4 y LED6

1, active LED1, LED3, LED5 y LED7

c. Si el bit 0 del puerto de entrada 40H esta en cero no debe haber cambios en el estado de
los LEDs.

ori 0ffh ; Apagar los ocho LEDS


out 20h
orden: in 40h ; Obtener permiso para cambios
rrc
jnc orden ; Permiso negado
in 40h ; Obtener patrón de encendido
rlc
jc l1357
mvi a,0aah ; P40.7 = 0 >> LED0, LED2, LED4 y LED6
out 20h
jmp orden
l1357: mvi a,55h ; P40.7 = 1 >> LED1, LED3, LED5 y LED7
out 20h
jmp orden
hlt

6.4.3 Instrucciones para manejo de la pila


La pila o stack es una zona de almacenamiento cuya presencia es imprescin-
dible en todo computador debido a que es utilizada para asignar niveles de subrutinas
y de interrupciones. En algunos microprocesadores, la pila se encuentra en el interior
del CPU y en otros, forma parte de la memoria del sistema. Esta área de memoria es
una estructura LIFO (Last Input First Output), la cual acumula eventos en forma cro-
nológica. Esto significa que la primera información en entrar al stack ocupara la ba-
se, mientras que la más reciente estará en la cima de la pila.

En la figura 6.20 se observa un grupo de cilindros apilados. A cada pieza se le


asigna un número, según el orden de entrada a la pila. La operación de retirar un ele-
mento del snack, se denomina POP, mientras que la tarea de añadir un cilindro se
identifica como PUSH. En el caso de una memoria, un comando POP leerá la pila y
un comando PUSH escribirá a la pila.
Introducción a la Programación del 8085A 235

Como indica la figura 6.20, el primer elemento en dejar la pila es el número 6,


el cual fue el último cilindro colocado. La zona del stack puede corresponder a un
área de memoria física o puede ser establecida por programa. Una pila de hardware
ocupa un número determinado de registros de la CPU, lo cual garantiza una veloci-
dad alta de operación pero una capacidad de almacenamiento limitada.

5 PUSH

POP

6 6

5 5
4 4 4
3 3 3
2 2 2
1 1 1

Fig. 6.20 Representación conceptual de una memoria con estructura LIFO

La pila programada usa la memoria RWM del µC y está limitada sólo por la
capacidad de memoria del sistema. El contenido del registro apuntador de pila indica
siempre la dirección ocupada por el último dato en entrar a la pila El programador
selecciona la base de la pila en cualquier parte de la memoria RWM y el control de la
información almacenada es realizada en forma automática por el SP. En términos de
direcciones de memoria, la pila progresa hacia abajo y el tope de la pila corresponde a
la dirección del último elemento en entrar, señalada por el SP.

El 8085A usa una pila por programa y la manipulación de la pila se realiza por
medio de dos instrucciones especiales. La instrucción PUSH deposita el contenido de
un registro par en la parte superior de la pila, mientras que POP lee los dos últimos
bytes almacenados en el stack y los transfiere a un registro par. La tabla 6.4 detalla las
instrucciones de este grupo.

PUSH rp [(SP) - 1] ← (rh); [(SP) - 2] ← (rl); (SP)← (SP) -2

Los datos en el registro par rp son transferidos a la pila, como se indica. El SP


es disminuido en dos.

PUSH PSW [(SP) - 1] ← (A); [(SP) - 2] ← (PSW); (SP)← (SP) - 2

El contenido del A es movido a la posición de memoria inmediatamente infe-


rior a la apuntada por el SP. Las banderas de estados son empaquetadas como una
Introducción a la Programación del 8085A 236

palabra de estados denominada PSW (Program Status Word), la cual es copiada a la


posición cuya dirección es menor en dos unidades que el contenido del SP.

Tabla. 6.4 Instrucciones de salto y de manejo de subrutinas


Instrucciones para manejo de la pila

(CY) ← [(SP)]0
(P) ← [(SP)]2
[(SP) - 1] ← (rh) (AC) ← [(SP)]4
PUSH rp [(SP) - 2] ← (rl) POP PSW (Z) ← [(SP)]6
(SP)← (SP) -2 (S) ← [(SP)]7
(A) ← [(SP+1)]
(SP) ← (SP) + 2
[(SP) - 1] ← (A)
[(SP) - 2]0 ← (CY)
[(SP) - 2]2 ← (P)
(L) ← [(SP)]
[(SP) - 2]4 ← (AC)
PUSH PSW XTHL (H) ← [(SP)+1]
[(SP) - 2]6 ← (Z)
[(SP) - 2]7 ← (S)
[(SP) - 2]1,3,5 ← X
(SP)← (SP) - 2
(rh) ← [(SP)]
POP rp (rh) ← [(SP+1)] SPHL (SP) ← (H) (L)
(SP)← (SP) +2

POP rp (rh) ← [(SP)]; (rh) ← [(SP+1)]; (SP)← (SP) +2

Los datos en el registro par se transfieren a la pila, como indica la secuencia.

POP PSW (banderas) ← [(SP)]; (A) ← [(SP+1)]; (SP) ← (SP) + 2

Se restituyen las banderas desde la dirección de memoria apuntada por el SP.


El registro A es cargado con el dato en la posición de memoria con dirección mayor
en uno a la indicada por el SP. El SP es incrementado en dos.

XTHL (L) ↔ [(SP)]; (H) ↔ [(SP)+1]

El byte depositado en el registro L es intercambiado con el contenido de la po-


sición cuya dirección señala el SP. El dato en el registro H se intercambia con el byte
almacenado en la posición de memoria con dirección es mayor en uno que la indicada
por el SP.

SPHL (SP) ← (H) (L)

El contenido del registro par HL es copiado en el apuntador de pila.


Introducción a la Programación del 8085A 237

El manejo de la pila es sencillo. El programador solo debe asegurarse que ex-


trae la información desde el STACK en el orden correcto. También es recomendable
asignar el tope de la pila en las últimas direcciones de la memoria del sistema.
Usualmente se requieren pocas posiciones de memoria para la zona del stack, pero
conviene asegurarse que está área no sea sobrescrita por alguna instrucción del pro-
grama. En el ejemplo 6.11 se muestra lo que no debe hacerse al extraer datos desde la
pila.

Ejemplo 6.11

lxi sp,3000h ; Asignar el tope de la pila


push b ; Cargar bc en el stack
push d ; Transferir de a la pila
pop b ; Recuperar bc del stack.
pop d ; Restaurar de desde la pila
hlt

En el programa del ejemplo 6.1 no se consideró que el contenido del registro


par BC se trasladó a la pila antes que el del registro DE. El intento de recuperar pri-
mero a BC y luego a DE producirá un error de lógica durante la ejecución del pro-
grama. A continuación se describe la situación.

• LXI SP,3000H

PILA
X

X
B C
63 85 X 2FFCH

X 2FFDH
D E
41 24 X 2FFEH

SP X 2FFFH

3000 X 3000H

Fig. 6.21 Se carga el apuntador de pila con la dirección 3000H


Introducción a la Programación del 8085A 238

• PUSH B

PILA
X

X
B C
X
63 85
X 2FFDH
D E
41 24 85 2FFEH

SP 63 2FFFH

2FFE X 3000H
X

Fig. 6.22 El contenido del registro par BC se almacena en la pila

• PUSH D
PILA

B C 24 2FFCH
63 85
41 2FFDH
D E 85 2FFEH
41 24
63 2FFFH
SP
X 3000H
2FFC
X

Fig. 6.23 El dato de 16 bits en DE se mueve al stack


Introducción a la Programación del 8085A 239

• POP B

PILA
X

X
B C
41 24 24 2FFCH

41 2FFDH
D E
41 24 85 2FFEH

SP 63 2FFFH

2FFE X 3000H

Fig. 6.24El contenido de la pila se transfiere al registro par BC

• POP B

PILA
X

X
B C
41 24 24 2FFCH

41 2FFDH
D E
63 85 85 2FFEH

SP 63 2FFFH

3000 X 3000H

Fig. 6.25 El contenido de la pila se mueve al registro DE

Observe que como resultado de la ejecución del programa, se intercambiaron


los contenidos de los registros pares. Para mantener intacta la información en los re-
gistros BC y DE, primero se debió rescatar DE, el último que se almacenó. Si se
hubiese deseado intercambiar el contenido de los registros pares, el procedimiento
empleado en el ejemplo 6.9 puede ser utilizado.
Introducción a la Programación del 8085A 240

La pilas un área ideal para almacenamiento temporal y fácil recuperación de


variables de un programa. En el siguiente ejemplo se usa el stack para intercambiar
datos de dos posiciones de la memoria RWM.

Ejemplo 6.12

Utilizando la pila como medio de almacenamiento temporal, intercambie los


contenidos de las direcciones de memoria 2020H y 2021H

lxi sp,3000h
lda 2020h ; Cargar en el a el dato en 2000h
push psw ; Mover el byte en a hacia la pila
lda 2021h ; Cargar en a el dato en 3000h
sta 2020h ; Mover el a a la posición 2000h
pop psw ; Recuperar dato de la pila
sta 2021h ; Copiarlo en 3000h
hlt

6.4.4 Grupo de instrucciones para bifurcaciones

A menos que una instrucción de este grupo sea ejecutada, el flujo normal de
un programa consistirá en la ejecución de las instrucciones almacenadas en secuencia
en la memoria. La tabla 6.5 presenta las instrucciones de este tipo. El 8085A tiene
instrucciones que permiten cambiar el contenido del contador de programa, de modo
que la próxima instrucción sea buscada en una dirección de memoria especificada, en
lugar de en la posición siguiente.

La bifurcación del programa puede ser originada por un salto (JUMP) o una
llamada a subrutina (CALL). La alteración de la secuencia de ejecución puede ser
incondicional, cuando al ejecutarse la instrucción se modifica inmediatamente el con-
tenido del contador de programa; o condicional, la cual requiere la satisfacción de una
condición de bandera antes de producirse la ruptura de la secuencia.

Instrucciones que producen salto

Las instrucciones de este grupo son bien conocidas por lector, debido a que
fueron introducidas el capitulo 3 como soporte lógico del µP hipotético. Por tal razón,
han sido usadas en los programas de ejemplos anteriores. Para mantener la secuencia
de presentación del repertorio de instrucciones del 8085A, se trataran en forma breve
en esta sección.

Las instrucciones de salto ocupan tres bytes de la memoria del sistema. El


primero corresponde al código de operación y los dos siguientes especifican la direc-
ción de memoria hacia la cual se ejecutará el salto.
Introducción a la Programación del 8085A 241

Tabla. 6.5 Instrucciones de salto y de manejo de subrutinas


Instrucciones para bifurcaciones

(PCL) ← [(SP)]
JMP dirección (PC)←(byte3) (byte2) RET (PCH) ← [(SP) + 1]
(SP)←(SP) + 2
Si x es verdad
Si x es verdad (PCL) ← [(SP)]
Jx dirección Rx
(PC)←(byte3) (byte2) (PCH) ← [(SP) + 1]
(SP)←(SP) + 2
[(SP)-1]← (PCH) [(SP)-1]← (PCH)
[(SP)-2]← (PCL) [(SP)-2]← (PCL)
CALL dirección RST n
(SP)←(SP) -2 (SP) ← (SP) -2
(PC)←(byte3) (byte2) (PC) ← 8*n
Si x es verdad
[(SP)-1]← (PCH)
(PCL)← (L)
Cx dirección [(SP)-2]← (PCL) PCHL
(PCH)← (H)
(SP)←(SP) - 2
(PC)←(byte3) (byte2)

JMP dirección (PC)←(byte3) (byte2)

Realiza un salto incondicional a la dirección especificada por los bytes 2 y 3


de la instrucción.

Jx dirección IF x D (PC) ←(byte3) (byte2)

Se produce un salto a la dirección especificada por los bytes 3 y 3 de la ins-


trucción, si se satisface la condición especificada. Hay varios tipos de saltos condi-
cionales, los cuales prueban el estado de una bandera y el salto se produce únicamen-
te si la bandera es uno o si es cero. Los saltos condicionales son:

Tabla. 6.6 Instrucciones de salto condicionales


Instrucción Condición
Salto si la bandera de:
JZ cero es 1
JNZ cero es 0

JC acarreo es 1
JNC acarreo es 0

JPE paridad es 1
JPO paridad es 0

JM signo es 1
JP signo es 0
Introducción a la Programación del 8085A 242

El estado de las banderas se modifica por la ejecución de una instrucción arit-


mética o lógica. El programador debe asegurarse que la instrucción de la cual depen-
de el salto afecte la bandera, y que no sea modifica por instrucciones subsecuentes.

Instrucciones para manejo de subrutinas

El microprocesador 8085A no tiene instrucciones directas para realizar algu-


nas operaciones de uso común en ciertas aplicaciones. Por ejemplo, no es posible
programar las líneas:

TIME n ; Retardo de n milisegundos


DIV B ; (A) ← (B) ÷ (A)

Cuando se requiere realizar un retardo por programa, o una operación de divi-


sión, el programador debe especificar una secuencia de instrucciones que realice la
tarea. En una aplicación donde se realice control de tiempo es usual tener que generar
retardos de diferente duración en varios puntos de un programa y es posible que un
programa deba ejecutar en forma repetida operaciones de división. Una forma de
cumplir con estas tareas consiste repetir las líneas de código tantas veces como sea
necesario.

La repetición de líneas de código, conlleva un desperdicio de la memoria del


sistema, debido a que existe redundancia en el código objeto resultante. Una solución
más eficiente y que permite un ahorro de memoria, es codificar la rutina de retardo o
de división como una subrutina. Este término identifica a una secuencia de instruc-
ciones que realiza una tarea específica. Una subrutina es identificada por la dirección
(etiqueta) de memoria donde se encuentra la primera instrucción. La llamada a la sub-
rutina es realizada usando una instrucción CALL dirección o Cx dirección.

CALL dirección [(SP)-1]← (PCH); [(SP)-2]← (PCL); (SP)←(SP) -2 (PC)←(byte3) (byte2)

La dirección de la instrucción siguiente a CALL es transferida a la pila y el SP


es disminuido en dos. A continuación, se ejecuta un salto hacia la posición de memo-
ria cuya dirección es indicada por el operando de la instrucción.

Cx dirección IF x D (pila)← (PC); (SP)←(SP) -2 (PC)←(byte3) (byte2)

Si se satisface la condición, se realiza la llamada a subrutina. En caso contra-


rio se ejecuta la siguiente instrucción.
Introducción a la Programación del 8085A 243

RET (PCL) ← [(SP)]; (PCH) ← [(SP) + 1]; SP)←(SP) + 2

Los contenidos de las direcciones de memoria apuntada por el SP y la inme-


diatamente superior son cargadas en el contador de programa, como indica la secuen-
cia. El apuntador de pila es incrementado en dos.

Rx IF x D (PC) ← (pila) ← [(SP) + 1]; (SP)←(SP) + 2

Si la condición x es cierta, se realiza el retorno. De otra manera se ejecuta la


instrucción siguiente.

Una de las funciones de la pila de memoria es almacenar la dirección de la


próxima instrucción a ejecutarse, después que se produce una llamada a subrutina. La
instrucción CALL introduce la dirección de retorno en el stack, mientras que RET la
extrae de la pila. Este procedimiento es automático, de modo que la última línea de
código de toda subrutina debe ser una instrucción de retorno RET, o una de sus va-
riantes.

En la figura 6.26 se muestra como se altera el flujo de un programa durante la


ejecución de una subrutina, y en la figura 6.27 se observa el estado cronológico de la
pila durante el proceso. También se indica el contenido del contador de programa y
del apuntador de stack.

Programa principal

1001H ----

1002H ----
Subrutina
1003H ----
1ra instrucción
1004H CALL 2000H 2000H
---
1007H ----
---
----
---
---
RET

Fig. 6.26 Secuencia de llamada a subrutina y retorno al programa principal


Introducción a la Programación del 8085A 244

• Antes de ejecutar CALL 2000H

PC SP X
1004H 3000H X 3000H

X
Pila

• Después de ejecutar CALL 2000H

07
PC SP
10
2000H 2FFEH
X 3000H

Pila

• Después de ejecutar RET

07
PC SP
10
1007H 3000H X 3000H

X
Pila

Fig. 6.27 Contenido de la pila durante el llamado a subrutina


Introducción a la Programación del 8085A 245

El programa principal se ejecuta en secuencia hasta cuando ocurre la llamada


a subrutina CALL 2000H. En ese momento, el control del programa pasa a la direc-
ción 2000H donde se encuentra la primera instrucción del subprograma. Al finalizar
éste, una instrucción RET produce el retorno del control a la instrucción siguiente a la
llamada CALL en el programa principal.

Cuado se ejecuta un programa, puede presentarse el caso donde una subrutina,


previamente llamada desde el programa principal, requiera el servicio de una segunda
subrutina, ésta de una tercera, y así sucesivamente. Esta situación conoce como ani-
damiento de subrutinas. La dirección de retorno de cada subprograma se almacena
ordenadamente en la pila. La figura 6.28 ilustra el proceso usando dos subrutinas.

Programa principal
----
Subrutina 1
----
1ra instrucción 1200H
----
--- Subrutina 2
1000H CALL 1200H
--- 1ra instrucción 1300H
1003H ----
CALL 1300H 1210H ---
----
--- 1213H ---
RET ---
---
RET

Fig. 6.28 Desde el programa principal se llama a la subrutina 1, ésta llama a la subrutina 2.

• Antes de ejecutar CALL 1200H

PC SP X
1000H 3000H X 3000H

X
Pila

Fig. 6.29 Estado de la pila antes de la llamada a la subrutina 1


Introducción a la Programación del 8085A 246

• Después de ejecutar CALL 1200H 03 2FFEH

PC SP 10 2FFFH

1200H 2FFEH X 3000H

• Inmediatamente antes de ejecutar CALL 1300H Pila

03 2FFEH

PC SP 10 2FFFH
3000H
2010H 2FFEH X
X
Pila
• Inmediatamente después de ejecutar CALL 1300H
2FFCH
13
2FFDH
12
2FFEH
03
PC SP 10 2FFFH

1300H 2FFCH X 3000H

Pila
• Inmediatamente después del primer RET
13 2FFCH

12 2FFDH

03 2FFEH

PC SP 10 2FFFH

1213H 2FFEH X 3000H

X
Pila

• Inmediatamente después del segundo RET 07 2FFCH

10 2FFDH

X 2FFEH
PC SP
X 2FFFH
1007H 3000H
X 3000H

Pila
Fig. 6.30 Estado de la pila durante un anidamiento de subrutinas.
Introducción a la Programación del 8085A 247

Para que una subrutina realice la tarea para la cual fue escrita, se requiere que
el programador le suministre los datos o parámetros necesarios. Generalmente estos
datos se transfieren desde el programa principal, y una vez ejecutada la subrutina en-
tregará resultados hacia el programa principal. La transferencia puede realizarse por
medio de:

• Registros del microprocesador.


• Tabla de datos.
• La pila.
• Posiciones reservadas de memoria.

Si el número de parámetros que deben ser transferidos es pequeño, por ejem-


plo dos operandos para una rutina de multiplicación, pueden utilizarse los registros
internos. Estos se cargan con el multiplicando y el multiplicador, y luego se realiza la
llamada a subrutina. El producto puede volver al programa principal usando uno de
los mismos registros. Si los operandos superan el número de registros disponibles,
este método no es apropiado.

Cuando es necesario suministrar a una subrutina una gran cantidad de paráme-


tros, estos pueden residir en la memoria en forma de tabla de datos. Desde el progra-
ma principal se transferirá únicamente la dirección de inicio de la tabla de datos desde
la memoria

La pila de memoria puede utilizarse como medio para trasladar datos y resul-
tados entre el programa principal y la subrutina. Las instrucciones de carga de datos
PUSH y recuperación de información POP, se usan con este propósito. El hecho que
el stack contenga la dirección de retorno al programa principal, no representa proble-
ma alguno. Más bien, el uso de la pila tiene la ventaja que la subrutina es indepen-
diente de posiciones específicas de memoria, en forma similar a cuando se usan los
registros internos del µP.

Los datos también pueden obtenerse desde posiciones de memoria previamen-


te reservadas por el programa. Los resultados de la ejecución de la subrutina son de-
positados también en celdas de memoria previamente definidas.

Ejemplo 6.13

El programa que se presenta a continuación realiza la misma función que el


mostrado en el ejemplo 6.8. En este caso, las instrucciones para la conversión de da-
tos, para la lectura de las salidas del convertidor analógico-digital y para la compara-
ción del dato obtenido con la referencia, han sido codificadas como una subrutina
denominada ADC.

El programa principal realiza dos llamadas a esta subrutina, una en operación


normal y la otra cuando ocurre una falla.
Introducción a la Programación del 8085A 248

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
ctrl: lda e200h ; Obtener valor de referencia
mov a,b
out 08h ; Apagar LED
men: call adc ; Adquirir hasta que la variable supere
jc men ; El valor de referencia
out och ; Generar condición de alarma
may: call adc ; Adquirir hasta que cese la situación
jnc may ; de falla
jmp ctrl ; Reiniciar proceso.
;----------------------------------------------------------------------------------
; Subrutina de adquisición de datos
;----------------------------------------------------------------------------------
adc: out 04h ; Inicio de la conversión
esp: in 00h ; Se lee la línea intr.
ani 80h ; Prueba de INTR
jnz esp ; Esperar hasta cuando sea cero.
in 04h ; Leer resultado de la conversión.
cmp b ; Comparar con la referencia.
ret

Al inicio de la ejecución del programa, en condiciones normales de operación,


se lee la variable supervisada hasta que aumente sobre el punto de equilibrio. Al supe-
rarse el umbral, se activa el indicador luminoso y se inicia un nuevo proceso de ad-
quisición y comparación de datos, hasta cuando finalice la situación de alarma. Al
regresar la variable a un valor permitido, se inicia el proceso con la salida de alarma
desactivada.

La siguiente instrucción de este grupo es RST n, ésta es en realidad una ins-


trucción de interrupción. En el capítulo 8 se describirá como usar esta instrucción
durante una operación de interrupción.

RST n n: 0,1,2…,7 (pila) ← (PC); (SP)← (SP) –2; (PC) ← 8*n

El contenido del contador de programa es cargado en la pila. El registro SP es


decrementado en dos. La próxima instrucción del programa es buscada en la posición
de memoria cuya dirección es el resultado de multiplicar por ocho el operando de la
instrucción. Esta instrucción está destinada a ser usada durante el proceso de interrup-
ción del µP. Es equivalente a una llamada CALL dirección, pero solo ocupa un byte de
memoria, en lugar de tres bytes.

Cuando un dispositivo externo interrumpe al procesador activando la línea


INTR, el procesador detiene la ejecución del programa y espera que el periférico co-
Introducción a la Programación del 8085A 249

loque en el bus una instrucción RST n con la dirección de la rutina de servicio de in-
terrupción.

PCHL (PCL)← (L); (PCH)← (H)

Produce un salto a la posición de memoria cuya dirección es especificada por


el contenido del registro par HL

6.4.5 Grupo de instrucciones aritméticas

La mayoría de las tareas de cómputo realizadas por el 8085A exigen la ejecu-


ción de operaciones aritméticas como suma, sustracción, multiplicación y división.
Además para la realización de lazos de programación son necesarias instrucciones de
incremento y decremento del contenido de un registro usado como contador. Estas
últimas instrucciones, y las de suma y resta están disponibles en el repertorio de ins-
trucciones del µP. Para realizar cualquier otra operación matemática, debe escribirse
una rutina usando las instrucciones de suma y resta y la capacidad de rotación del
registro acumulador.

Las instrucciones de este grupo ejecutan operaciones con registros, y posicio-


nes de memoria y datos inmediatos de ocho bits, estando siempre uno de los operan-
dos en el acumulador, donde también se deposita el resultado. La mayoría de las ins-
trucciones aritméticas afectan las banderas.

Tabla. 6.7 Grupo de instrucciones aritméticas


Instrucciones aritméticas

INR r (r) ← (r) + (1) ADC M (A)←(A)+ [(H)(L)]+(CY)

INR M [(H)(L)] ← [(H)(L)] + (1) ACI dato (A) ← (A) + (dato) +(CY)

DCR r (r) ← (r) - (1) DAA Ajuste Decimal del A

DCR M [(H)(L)] ← [(H)(L)] - (1) SUB r (A)←(A) - ( r)

INX rP (rP) ← (rh) (rl) + (1) SUB M (A) ←(A) - [(H)(L)]

DCX rP (rP) ← (rh) (rl) - (1) SUI dato (A) ← (A) - (dato)

ADD r (A)←(A) + ( r) SBB r (A) ← (A) - (r) - (CY)

ADD M (A) ←(A) + [(H)(L)] SBB M (A)←(A)- [(H)(L)] - (CY)

ADI dato (A) ← (A) + (dato) SBI dato (A) ← (A) - (dato) - (CY)

ADC r (A)←(A)+ (r) + (CY) DAD rP (H) (L) ← (H) (L)+ (rh) (rl)
Introducción a la Programación del 8085A 250

Instrucciones de incremento y decremento

Las instrucciones que producen el incremento y el decremento en la unidad


de un registro o posición de memoria son de uso obligado para el establecimiento de
lazos de programación. Éstos permiten ejecutar N veces una secuencia de código es-
pecifica, hasta cuando una condición terminal es alcanzada. En su forma básica, un
lazo repite una serie de instrucciones, tantas veces como indique un contador cargado
antes de iniciar la iteración. En cada paso se disminuye o incrementa el contador has-
ta cuando llegue a cero o a un valor determinado. Una instrucción de salto condicio-
nal se encarga de decidir, de acuerdo con el estado del contador, la realización de una
nueva iteración o la salida del bucle.

(a) (b)

Fig. 6.31 Modos de establecer lazos de programación. a) REPEAT-UNTIL b) DO-WHILE

La figura 6.31 muestra los diagramas de flujo de dos formas de realizar un bu-
cle. La estructura lógica de la izquierda se conoce como REPEAT-UNTIL o iteración
al menos un paso. Esta última denominación es debida a que, la secuencia de código
se ejecuta y luego se examina la condición. Como contador puede usarse cualquiera
de los registros internos o una posición de memoria. El modo de conteo puede ser
Introducción a la Programación del 8085A 251

ascendente o descendente. El diagrama de la estructura REPEAT-UNTIL de la figura


6.35, usa el modo de conteo hacia abajo. Una instrucción condicional JNZ garantiza
la realización de un nuevo pasa hasta cuando el registro llegue a cero. Para disminuir
e incrementar un registro de 8 bits o un dato en memoria, se utilizan las instrucciones
DCR e INR.

INR r (r)←(r) + (1)


INR M [(H)(L)] ← [(H)(L)] + (1)

El dato especificado por el operando, es incrementado en uno.

DCR r (r)←(r) - (1)


DCR M [(H)(L)] ← [(H)(L)] - (1)

Resta uno del contenido del byte especificado

Las instrucciones INR y DCR afectan todas las banderas excepto el bit de aca-
rreo. Al conservar el estado de CY, pueden se utilizadas en rutinas aritméticas de pre-
cisión múltiple.

El ejemplo 6.14 es una muestra de un lazo de programación realizado con es-


tructura lógica al menos un paso.

Ejemplo 6.14

La tarea consiste en sumar el contenido de los valores almacenados en dos


bloques A y B de la memoria del sistema. El usuario suministra la dirección inicial de
cada bloque y el número de valores a sumar. El programa retorna la suma, en el blo-
que A.

lxi h,dira ; Dirección inicial bloque a


lxi b,dirb ; “ “ “ b
mvi e,num ; Número de valores a sumar
smem: ldax b ; Dato del bloque b al a
add m ; Sumar con dato del bloque a
mov m,a ; Resultado al bloque A
inr l ; Dirección siguiente de ambos
inr c ; bloques
dcr e ; Decremento del contador
jnz smem ; Repetir hasta contador igual 0
hlt

Al inicio del programa se introducen las direcciones de inicio de ambos blo-


ques de memoria, y el número de elementos de cada bloque. El lazo SMEM, se inicia
sumando las posiciones correspondientes de ambas áreas, hasta cuando el registro
contador llega a cero, momento cuando finaliza el lazo.
Introducción a la Programación del 8085A 252

El modo alterno para control de iteración es DO-WHILE o estructura quizás


ningún paso. En la figura 6.31 se observa que la decisión de control del lazo es reali-
zada al inicio del lazo, por lo cual existe la posibilidad que nunca se ejecute la se-
cuencia de código. Si se usa DO-WHILE para realizar N iteraciones, debe cargarse el
contador con el valor N+1, como indica el ejemplo 6.15

Ejemplo 6.15

Use una estructura DO-WHILE para resolver el problema planteado en el


ejemplo anterior.

lxi h,dira ; Dirección inicial bloque a


lxi b,dirb ; “ “ “ b
mvi e,num+1 ;Número de valores a sumar
smem: dcr e ; Decremento del contador
jz salir ; Si contador cero, salir
ldax b ; Dato del bloque b al A
add m ; Sumar con dato del bloque a
mov m,a ; Resultado al bloque a
inr l ; Dirección siguiente de ambos
inr c ; Bloques
jmp smem ; Repetir
salir: hlt

En este caso la consulta se realiza al inicio del lazo, observe que si carga el va-
lor 1 en el contador, no se ejecutará paso alguno. El primer decremento del contador,
lo hace cero y la instrucción de salto condicional forzará la salida de la rutina.

El uso de registros de 8 bits como contadores, limita el número posible de ite-


raciones a 256. En casos que sea necesario un número mayor de pasos en un bucle,
pueden usarse registros pares para el control de los pasos. El 8085A tiene instruccio-
nes para el incremento y decremento de registros pares. Estas son: INX y DCX.

INX rp (rp)←(rp) + (1)

Suma uno al registro par especificado

DCX r (rp)←(rp) - (1)

Substrae la unidad del registro par especificado.

Estas instrucciones, por desgracia, no afectan las banderas de µP. De modo


que para probar cuando el registro contador llega a cero, debe usarse otro método.

Considere ahora que el programa anterior deba sumar el contenido de un nú-


mero de posiciones de memoria superior a 256, por ejemplo 512. La solución se
muestra en el ejemplo 6.16.
Introducción a la Programación del 8085A 253

Ejemplo 6.16

Use una estructura REPEAT-UNTIL para sumar los contenidos de las posicio-
nes correspondientes de dos bloques de memoria de 512 bytes. La dirección inicial de
cada área de la memoria es: E200H y E800H

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
Lxi sp,tope ; Se inicia el apuntador de pila
lxi h,e200h
lxi b,e800h
lxi d,200h ; Se sumarán 512 valores
call smem
hlt
;----------------------------------------------------------------------------------
; Subrutina SMEM
;----------------------------------------------------------------------------------
smem: ldax b
add m
mov m,a
inx h
inx b
dcx d ; Decremento del contador
mov a,e ; Byte bajo del contador al a
ora d ; Se realiza un OR con el byte bajo
jnz smem ; Si z=1, el contador llegó a cero
ret

El programa principal carga las direcciones de inicio de cada zona de la me-


moria donde se encuentran los sumandos. El registro par DE se usa como contador de
las 512 posiciones a sumar. La subrutina SMEM realiza la suma y en cada paso com-
prueba si el contador llegó a cero. Para esto se ejecuta una función OR entre ambos
bytes del contador. El resultado será cero sólo cuando el contenido de los registros D
y E sean ambos cero.

No es imprescindible conocer con anterioridad el número de pasos que debe


transitar un bucle de programación. La salida o mantenimiento del lazo puede depen-
der de la ocurrencia de un evento y no del estado de un contador.

Ejemplo 6.17

Dada la dirección de inicio de una zona de la memoria, el programa debe leer


cada posición. Si el valor en una celda es mayor o igual a 16, debe sustituirse con
FFH. En caso que el dato sea menor que 16, debe escribirse el número 20H en la po-
sición de memoria bajo prueba. El proceso debe culminar cuando el dato leído sea
igual a 41H.
Introducción a la Programación del 8085A 254

lxi h,e200 ; Dirección de inicio en hl


prox: mov a,m ; Mover valor al a
cpi 41h ; Comparar con 41h
jz salir ; Si igual, salir
cpi 10h ; Comparar con 16
jc menor ; Si menor, escribir 20h
mvi m,ffh ; Si mayor o igual, escribir ffh
jmp seguir
menor: mvi m,20h
seguir: inx h ; Apuntar posición siguiente
jmp prox ; Leer valor siguiente
salir: hlt

El número de pasos que cumple el lazo depende de en cual posición se en-


cuentre el patrón 41H. Si es hallado en la primera celda examinada: E200H, el pro-
grama finalizará sin recorrer algún paso. Si 41H está almacenado en la posición con
dirección E9FFH, se leerán 2048 celdas y se realizarán las sustituciones correspon-
dientes.

Ejemplo 6.18

Se requiere llenar un área de memoria con un valor determinado. Los datos de


entrada son la dirección inicial y final de la zona de memoria y el dato a escribir.

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
lxi h,dinicio
lxi d,dfinal
inx d
mvi b,dato
call llenar
hlt
;----------------------------------------------------------------------------------
; Subrutina LLENAR
;----------------------------------------------------------------------------------
llenar: mov m,b
inx h
mov a,l
cmp e
jnz llenar
mov a,h
cmp d
jnz llenar
ret

El programa lee la posición de inicio: DINICIO, y sustituye su contenido, y el


de posiciones consecutivas, con el valor DATO. El proceso culmina cuando se ha
escrito la posición de memoria con dirección DFINAL.
Introducción a la Programación del 8085A 255

Instrucciones de suma

ADD r, ADD M y ADI dato suman el contenido del A y el operando de refe-


rencia. Las otras tres instrucciones de suma: ADC r, ADC M, y ACI dato suman el
operando y el bit de acarreo al byte en el acumulador. Afectan todas las banderas.

ADD r (A)←(A) + ( r)

Suma el acumulador y el registro especificado, el resultado se deposita en el


acumulador.

Ejemplo: ADD C, con (A) = 34H y (C)=76H

00110100 (A) 34H


+ 01110110 (C) 76H
10101010 (A) AAH

ADD M (A) ←(A) + [(H)(L)]

Ejecuta la suma entre el acumulador y el contenido de la posición de memoria


apuntada por el registro par HL, el resultado se carga en el acumulador.

ADI dato (A) ←(A) + (dato)

Realiza la suma entre el segundo byte de la instrucción y el dato en el A.

ADC r (A) ← (A) + ( r) + (CY)

Suma el dato en el acumulador, el contenido del registro especificado y la


bandera de acarreo. El resultado se deposita en el acumulador.

ADC M (A) ←(A) + [(H)(L)] + (CY)

Suma el dato en la posición de memoria, el acumulador y el bit de acarreo.

ACI dato (A) ←(A) + (dato) + (CY)

El bit de acarreo y el dato se suman al acumulador.


Introducción a la Programación del 8085A 256

Suma de números binarios

La instrucción de suma ADD realiza la operación de adición de dos números


de 8 bits, sin considerar el estado del bit de acarreo, pero activa a CY si ocurre des-
borde desde el bit 7 del acumulador. Las reglas para la suma binaria son como se in-
dica a continuación,

0+0=0 1+0=1
0+1=1 1 + 1 = 0, con acarreo igual a 1

El programa mostrado en el ejemplo 6.19, ejecuta la suma de dos números al-


macenados en posiciones consecutivas de memoria
Ejemplo 6.19

Dos valores obtenidos desde los puertos de entrada 00H y 04H, son almace-
nados en posiciones consecutivas de memoria, a partir de la dirección MEM. El pro-
grama principal llama a una subrutina SUMA, la cual realiza la suma de los valores
en memoria y devuelve el resultado en la posición con dirección MEM+2.

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
in 00h
sta mem
in 04h
sta mem+1
call suma
hlt
;----------------------------------------------------------------------------------
; Subrutina SUMA
;----------------------------------------------------------------------------------
suma:
lhld mem ; Cargar en hl los datos de la suma
mov a,h ; Mover dato en h al acumulador
add l ; Sumar con el otro dato en l
sta mem+2 ; Resultado a memoria
ret

Observe que los sumandos son pasados a la subrutina desde la memoria y el


resultado también es devuelto en la memoria. Para sumar ahora los contenidos de dos
posiciones de memoria no consecutivas, analice el ejemplo 6.20.

Ejemplo 6.20

Dos valores están almacenados en las posiciones de memoria no consecutivas


MEM1 y MEM2, El programa debe sumar los números y depositar el resultado en la
dirección de memoria RESULT.
Introducción a la Programación del 8085A 257

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
lxi h,mem1 ; En HL dirección del sumando 1
lxi b, mem2 ; En BC dirección del sumando 2
lxi d, resul ; En DE dirección del resultado.
call suma
hlt
;----------------------------------------------------------------------------------
; Subrutina SUMA
;----------------------------------------------------------------------------------
suma: ldax b ; Cargar en a sumando 1
add m ; Sumar con el otro operando
stax d ; Resultado a memoria
ret

En este caso las direcciones donde se encuentran los sumandos y donde debe
depositarse el resultado, son pasadas a la subrutina en los registros pares del
microprocesador. La pila de memoria también puede ser utilizada para transferir datos
a una subrutina. El ejemplo 6.21 ilustra el uso de esta zona de la memoria para el paso
de los operandos de una subrutina de suma.

Ejemplo 6.21

Escribir un programa que sume la penúltima entrada al stack con la palabra en


memoria cuya dirección está en el tope de la pila. Esta dirección debe contener el
resultado de la operación con el byte menos significativo del resultado en la dirección
más baja. Considere que el contenido de la memoria antes de ejecutar el programa es
el mostrado en la figura 6.32.

BA 0200H 4E 0200H

76 0201H A8 0201H

00 1FFCH 00 1FFCH

02 1FFDH 02 1FFDH

pila 94 1FFEH pila 94 1FFEH

31 1FFFH 31 1FFFH

X 2000H X 2000H

Antes Después

Fig. 6.32 Contenido de la memoria y de la zona de pila antes y después de ejecutar el programa.
Introducción a la Programación del 8085A 258

La operación a realizar es:

00110001 10010100 (3194H) Segunda entrada de la pila


+ 01110110 10111010 (76BAH) Contenido de la dirección 201H-200H
10101000 01001110 (A84EH)
1
CY

POP H ; Se obtiene dirección de sumando 2


POP B ; Sumando 1 a registro BC
MOV A,M ; Byte bajo de sumando 2 al A
ADD C ; Se suma a byte bajo de sumando 1
MOV M,A ; Resultado parcial a memoria
INX H ; Dirección de Byte alto de sumando 2
MOV A,M ; Byte alto de sumando 2 al A
ADC B ; Se suma al byte alto de sumando 1 y al CY
MOV M,A
HLT

Observe que el uso del la instrucción ADC, garantiza que el valor del acarreo
desde el bit 7 del acumulador después de la suma de los bytes menos significativos de
los sumandos de 16 bits, es tomado en cuenta y agregado a la suma de los bytes altos.
No se considera el acarreo desde el bit 7 del byte de orden alto.

Suma de números decimales

Los periféricos de entrada al microcomputador no siempre entregan los datos


numéricos al computador en código binario o ASCII. Un interruptor rotativo (Thumb-
wheel switch) de 1 polo y 10 posiciones, por ejemplo, produce una salida de 4 bits
con la información codificada en decimal. La lectura del puerto transferirá al acumu-
lador el número BCD. Si se usa un puerto para cada dígito, los valores pueden ser
almacenados en posiciones consecutivas de memoria para estar disponibles para pro-
cesamiento posterior.

En el caso de sistemas que presenten información de salida en indicadores de


siete segmentos, los resultados del tratamiento de los datos de entrada deben ser escri-
tos al puerto codificados en BCD. El procedimiento usual es convertir los datos de
entrada a binario natural, procesarlos y volverlos a convertir a BCD antes de transferir
los resultados. Si el procesamiento numérico de los datos consiste en operaciones
aritméticas simples, puede ser conveniente realizarlas directamente como operaciones
en BCD, sin necesidad de utilizar las rutinas de conversión de datos de BCD a binario
y de binario a BCD.

Aunque el 8085A no tiene instrucciones para ejecutar suma de números deci-


males. Para realizar este tipo de operación pueden sumarse los valores BCD usando
Introducción a la Programación del 8085A 259

la instrucción para suma binaria ADD, y realizar a continuación un ajuste decimal del
resultado en el acumulador. Para esta última operación, se usa la instrucción DAA.

DAA

Ensambla el byte en el acumulador como dos dígitos de cuatro bits codifica-


dos en decimal. Afecta todas las banderas y requiere el uso del bit de acarreo auxiliar,
AC. Para entender como funciona la instrucción considere la siguiente operación de
dos números BCD:

ADD C, con (A) = 3410 y (C)=7610

0011 0100 (A) 34H


+ 0111 0110 (C) 76H
1010 1010 (A) AAH

El resultado de la operación es incorrecto, porque ADD considera los valores


de entrada y la salida como binarios. La suma en decimal de 3410 y 7610 debe ser
11010.

Si ahora se ejecuta la instrucción de ajuste decimal,

DAA, con (A) = AAH

PASO 1

Si el nibble de orden bajo del acumulador es mayor que 9 o la bandera AC es uno, se suma 6
al acumulador. Como A es mayor que 9,

1010 1010 AAH


+ 0000 0110 06H
1011 0000 B0H
1
AC
PASO 2

Si el nibble de orden alto del acumulador es mayor que 9 o la bandera de acarreo es uno, se
suma 6 al nibble más significativo del acumulador. Debido a que B es mayor que 9,

1011 0000 B0H


+ 0110 0000 60H
1 0001 0000 1010
CY

La bandera de acarreo está activada a 1 y el dato en el acumulador es 1010, de


modo que el resultado es 11010, si se considera el estado del bit CY.
Introducción a la Programación del 8085A 260

Considere ahora la suma de los dígitos 710 y 810,

ADD C, con (A) = 0810 y (C)=0710

0000 1000
+ 0000 0111
0000 1111 (A) 0FH

El resultado de sumar 810 y 710 es 1510.


DAA, con (A) = 0FH

PASO 1

0000 1111 AAH


+ 0000 0110 06H
0001 0101 1510
1
AC

Como el nibble de orden alto del acumulador es menor que 9 y AC es cero,


es innecesario el paso 2, y el resultado en decimal corresponde al contenido
del A.

En realidad conviene realizar un par de observaciones sobre el modo en que el


µP realiza las operaciones internas durante la ejecución de DAA. Para esto suponga
que se tiene el valor 00H en el acumulador y uno en el bit de acarreo, como resultado
de la suma binaria 87H+79H=100H. Sí ahora se realiza el ajuste decimal del A.

DAA, con (A) = 00H (CY) = 1 (AC)=1

PASO 1

Como bandera AC es uno, se suma 6 al acumulador.

0000 0000 00H


+ 0000 0110 06H
0000 0110 06H

La bandera de acarreo CY permanece activada.

PASO 2

La bandera de acarreo es uno, por lo cual se suma 6 al nibble más significativo del registro
acumulador.

0000 0110 06H


+ 0110 0000 60H
0110 0110 6610
La bandera de acarreo CY se mantiene en uno.
Introducción a la Programación del 8085A 261

La bandera de acarreo está en 1 y el dato en el acumulador es 6610, de modo


que el resultado es 16610, si se considera el estado del bit CY. Las sumas internas del
paso 1 y 2 de DAA, pueden afectar la bandera de acarreo. Si durante el paso 1, ocurre
un desborde desde el bit A3, y este se propaga hasta salir del bit A7, efectivamente la
bandera CY se activará. Pero si está en uno como resultado de la suma binaria, la adi-
ción interna no la pondrá en cero. Durante el paso 2 ocurre algo similar. La suma de
06H a los cuatro bits de orden alto del A, puede llevar a uno a CY, pero no la inicia en
cero después de una suma sin acarreo. La preservación de la bandera CY de la suma
binaria, permite realizar operaciones de suma decimal mayores de dos dígitos.

Como dato curioso, ninguno de los simuladores del 8085A utilizados por el
autor para probar los ejemplos, ejecutaron la instrucción DAA en forma correcta. Se
probaron al menos una decena de simuladores.

Es necesario que el lector entienda que la instrucción DAA no convierte el da-


to en el registro acumulador a números decimales. Solo ensambla como dos dígitos
BCD el byte almacenado en el A, resultado de la suma de dos números decimales.
Esta es la única instrucción que requiere examinar la bandera de acarreo auxiliar para
realizar su función. DAA debe ser usada sólo con instrucciones que afecten este bit de
estado. Por ejemplo, suponga que se carga en el registro acumulador el valor 20H
usando la instrucción MVI A,20H. Si a continuación se ejecuta DAA, el contenido del
acumulador se mantiene en 20H. Si por el contrario, los registros A y B contienen los
valores decimales: A=1710 y B=0910, y se suman usando ADD B, se obtiene como
resultado A=20H y la bandera AC se pone a uno. Si ahora se realiza un ajuste decimal
del A, el dato en el A después de ejecutar DAA será 2610. Tenga en cuenta en cuenta
que 1710 + 0910 = 2610.

Ejemplo 6.22

Deben sumarse dos números decimales de 4 dígitos. Los operandos están al-
macenados en la memoria como indica la figura 6.33. Los 3 bytes del resultado, se
cargarán en las 2 posiciones de memoria ocupada por el operando 1, y en la siguiente.

48 E040H 15 E040H

E041H 33 E041H
37
01 E042H

E050H
67
95
E051H 67 E050H

Antes Después

Fig. 6.33 Contenido de la memoria antes y después de ejecutar el la suma 3748+9567.


Introducción a la Programación del 8085A 262

El procedimiento para realizar la operación y el programa de suma decimal, se


presentan a continuación:

Cargar cero en el bit de acarreo.


Sumar los dos dígitos menos significativos de los operandos:
Realizar el ajuste decimal del resultado.
Mover los dos dígitos del resultado a la memoria.
Sumar los dígitos restantes y la bandera de acarreo.
Si existe acarreo desde el bit 2*N, mover 1 a la memoria.

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
mvi b,2 ; Cargar contador de dígitos
lxi h,e040h ; HL apunta a sumando 1
lxi d,e050h ; DE apunta a sumando 2
call sumdec ; Realizar la suma
hlt
;----------------------------------------------------------------------------------
; Subrutina SUMDEC
;----------------------------------------------------------------------------------
sumdec: ana a ; Bit de acarreo a cero
sum: ldax d ; Dos dígitos de sum.1 al a
adc m ; Sumar a dos dígitos del sum2
daa ; Ajuste decimal
mov m,a ; Resultado parcial a memoria
dcr b ; Contador menos 1
jz acarr ; Al terminar, probar CY
inx h ; Siguientes dígitos de sum.2
inx d ; Siguientes dígitos de sum.1
jmp sum ; Continuar operación
acarr: rnc ; Retornar si cy es cero.
inx h ; Si CY=1, cargar la siguiente
mvi m,01 ; Posición de la memoria
ret

Fig. 6.34 Resultado de la suma de dos números de 6 dígitos


Introducción a la Programación del 8085A 263

La subrutina SUMDEC puede sumar valores decimales de 2N dígitos, con


N igual al valor inicial del contador. Por ejemplo para 6 cifras, debe cargarse 03H en
el registro B. El resultado de la operación se presenta como un valor de 2N+1 dígitos.
La figura 6.34 muestra el contenido de la memoria después de la ejecución de la suma
954.567 + 954.567. El código del programa a partir de E000H y el resultado de la
operación en E040H-E043H.

Una aplicación de las instrucciones aritméticas en la comprobación del fun-


cionamiento del sistema microcomputador, consiste en la prueba de la memoria
EPROM o ROM usando el método de verificación por suma total (checksum). La
prueba requiere que en el momento de la programación del chip, se grabe en la posi-
ción final un valor correspondiente al resultado de sumar los datos de todas las posi-
ciones de la memoria, excepto la que contiene la suma total. La operación de suma no
debe considerar el acarreo. En algunos casos se usa como se usa el complemento a
dos de la suma total.

Es usual que al arrancar un sistema, ejecute unas rutinas de diagnóstico que


incluye la prueba de la EPROM. La rutina obtiene la suma total y la compara con el
byte almacenado en la posición final de la memoria. Si los datos coinciden, es muy
probable que el dispositivo esté en buen estado. Una divergencia en los valores com-
parados, indica con certeza que la memoria está dañada. La confiabilidad de la prueba
es alta, a pesar que existe una pequeña probabilidad que una combinación de errores
en los datos programados hagan que el resultado coincida con la suma total.

Ejemplo 6.23

Escriba un programa de que permita probar el estado de una memoria ROM,


usando el método de verificación por suma total.

lxi d,dfin ; Obtener dirección final de la ROM


lxi h,dini ; Cargar dirección final en HL
mvi b,0 ; Suma se inicia en cero
cont: mov a,m ; Dato en memoria al acumulador
add b ; Agregar a suma acumulada
mov b,a ; Guardar resultado
inx h ; Apuntar dirección siguiente
mov a,e ; Comprobar si el contenido del
cmp l ; Registro par HL
jnz cont ; Corresponde a la
mov a,d ; Dirección de la
cmp h ; Útima posición de la memoria
jnz cont ; Si no esa sí, leer posición siguiente
mov a,b ; Mover al a, la suma total calculada
xra m ; Poner Z=1 si la ROM está buena
hlt

El programa coloca en uno la bandera de cero cuando la ROM esté en buen es-
tado.
Introducción a la Programación del 8085A 264

Instrucciones de sustracción

El 8085A tiene seis instrucciones dedicadas a realizar la operación de resta de


números binarios. SUB r, SUB M y SUI dato sustraen el contenido del acumulador y
el operando especificado. Las otras dos instrucciones de resta son: SBB r, SBB M, y
SBI dato sustraen el operando y la bandera de acarreo del byte en el A. Afectan todas
las banderas.

SUB r (A)←(A) - (r)

Resta el dato en el registro especificado del contenido del acumulador, en el


cual se deposita el resultado. La operación se realiza sumando al A el complemento a
dos del sustraendo, como se muestra a continuación.

Ejemplo: SBB C, con (A) = B4H y (C)=76H

10001001 -76H complemento a 1 del sustraendo


+ 00000001
10001010 8AH complemento a 2 del sustraendo

10110100 (A) B4H


+ 10001010 (C) 8AH
1 00111110 (A) 3EH
CY

La suma con complemento a dos no afecta el contenido del registro, pero acti-
va el bit de acarreo. La instrucción complementa a CY para usarse como bandera
de préstamo.

SUB M (A) ←(A) - [(H)(L)]

Ejecuta la sustracción del contenido de la posición de memoria apuntada por


el registro par HL, del dato en el acumulador.

SUI dato (A) ←(A) - (dato)

Resta inmediata del dato especificado del byte en el acumulador.

SBB r (A) ←(A) -(r) - (CY)

Sustrae el byte almacenado en el registro especificado y el bit de acarreo, del


contenido del acumulador. Al incorporar a la operación el bit CY, puede ser usado
para sustracciones multibyte. SBB opera como se indica a continuación:
Introducción a la Programación del 8085A 265

SSB C, con (A) = 10H, (C)=08H, (CY)=1

00001000 (C) 08H 00010000 (A) 10H


+ 00000001 (CY)01H + 11110111 (CY)F7H complemento a 2 (C+CY)
00001001 (C) 09H 00000111 (C) 07H

SBB agrega la bandera CY al sustraendo, obtiene el complemento a 2 del re-


sultado y lo suma al valor en el acumulador.

SBB M (A) ←(A) - (r) - (CY)

Resta el byte en la posición de memoria indicada por el registro par HL y el


bit de acarreo, del valor en el acumulador.

SBI dato (A) ←(A) - (dato) - (CY)

El dato especificado y la bandera de acarreo, son sustraídos del contenido del


acumulador.

Resta de números binarios

La programación de operaciones de sustracción de números binarios, se reali-


za en forma similar a como se procede para la suma. Para operandos de 8 bits se usa
la instrucción SUB o SUI, mientras que para restas de números de varios bytes se
recurre a SBB o SBI. Las reglas de la operación aritmética de substracción son,

0–0=0 1–0 =1
0 – 1 = 1, con préstamo igual a 1 1–1 =0

Ejemplo 6.24

Escribir una subrutina que realice la resta de dos valores de 32 bits. El mi-
nuendo y el sustraendo están almacenados en memoria como indica la figura 6.35.

2B 1000H C7 1000H
4A 1001H FC 1001H
sustraendo
23 1002H 22 1002H

23 1003H 23 1003H

2000H
F2 F2 2000H

46 2001H 46 2001H
minuendo
46 2002H 46 2002H
46 2003H 46 2003H

Fig. 6.35 Ubicación en la memoria del minuendo y el sustraendo.


Introducción a la Programación del 8085A 266

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
ora a ; Bit de acarreo a cero
mvi b,04 ; Cargar contador de bytes
lxi h,1000h ; HL apunta a sustraendo
lxi d,2000h ; DE apunta a minuendo
call resta ; Realizar operación
hlt
;----------------------------------------------------------------------------------
; Subrutina RESTA
;----------------------------------------------------------------------------------
resta: ldax d ; Minuendo al A
sbb m ; Restar sustraendo
mov m,a ; Resultado parcial a memoria
dcr b ; Contador menos 1
rz ; Retornar si z=1
inx h ; Byte siguiente del sustraendo
inx d ; Byte siguiente del minuendo
jmp resta ; Continuar operación

Un contador cargado por el programa principal, permite variar el número de


bytes de los operandos de la sustracción.

Resta de números decimales

La instrucción de ajuste decimal DAA no funciona sobre el resultado de la


resta de dos números decimales, de modo que para realizar operaciones de sustrac-
ción decimal debe representarse el minuendo como un valor decimal negativo y su-
marse al minuendo. Considere la operación simple de restar el número 1710 de 7810.

7810 7810
- 1710 + 8310
61 16110

El resultado de la operación a la derecha es 6110 si se descarta el desborde


ocurrido en el dígito de las decenas. Esto se debe a que el valor 8310 es el comple-
mento a diez del sustraendo 1710. Para obtener este complemento debe formarse el
complemento nuevo restando cada dígito del número nueve y sumársele al resultado
la unidad,

99
- 17 sustraendo
82 complemento nueve
+ 1
83 complemento diez

En operaciones con varios dígitos debe considerarse la bandera de préstamo.


En este caso el bit de acarreo en uno indica la ausencia de préstamo desde el sus-
traendo, debiéndose sumar el complemento a diez al próximo dígito. Si el bit de aca-
Introducción a la Programación del 8085A 267

rreo tiene un valor cero, indicando la ocurrencia de préstamo, debe usarse el com-
plemento a nueve en la siguiente operación.

Ejemplo:

982510
- 345210
637310

PASO 1

Obtener el complemento a diez del número 5210 y sumárselo a 2510

01001000 (48H) Complemento diez de 52


+ 00100101 (25H)
0←01101101 (6DH)

El bit de préstamo es cero

PASO 2

Realizar el ajuste decimal del resultado parcial

0110 1101 6DH


+ 0000 0110 06H
0111 0011 7310
1
AC

PASO 3

Obtener el complemento a nueve del número 3410 y sumárselo a 9810

01100101 (34H)
+ 10011000 (98H)
0←11111101 (FDH)

PASO 4

Realizar el ajuste decimal del resultado

1111 1101 FDH


+ 0000 0110 06H
0000 0011 1310
1
AC

0000 0011 FDH


+ 0110 0000 60H
0110 0011 6310
1
AC
Introducción a la Programación del 8085A 268

Ejemplo 6.25

El programa siguiente usa la subrutina RDEC para restar dos valores decima-
les de 2*N bits. El minuendo está almacenado el la dirección de memoria MINU y el
sustraendo en SUBST. En está última posición se carga el resultado de la operación.

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
lxi sp,dpila ; Se fija la base de la pila
lxi h,sustr ; Dirección del sustraendo a hl
lxi d,minu ; Dirección del minuendo a de
mvi b,n ; Contador de par de dígitos decimales
call rdec
hlt
;----------------------------------------------------------------------------------
; Subrutina RDEC
;----------------------------------------------------------------------------------
rdec: stc ; Acarreo en uno. no prestamo.
rep: mvi a,99h ; 9910 al acumulador
aci 0 ; Se suma el acarreo al a
sub m ; Complemento 10 del sustraendo
xchg ; HL apunta al minuendo
add m ; Suma del complemento al minuendo
daa ; Ajuste decimal del resultado
xchg ; HL apunta al sustraendo
mov m,a ; Resultado a memoria
dcr b ; Disminuir B
rz ; Retornar si B es cero
inx h ; Próximo byte (2 díg..) del sustraendo
inx d ; Próximo byte (2 díg..) del minuendo
jmp rep

Multiplicación de números binarios

El producto de dos números binario sin signo puede obtenerse por medio de
dos técnicas: sumas repetidas y sumas y desplazamientos. El primer método consiste
en sumar el multiplicando tantas veces como indique el multiplicador. Tal procedi-
miento tiene la desventaja de ser muy lento, pero si la velocidad de cómputo no es un
factor crítico puede ser utilizado.

Ejemplo 6.26

Debe usarse el método de suma repetidas para multiplicar dos números bina-
rios enteros de 8 bits. El operando multiplicador se carga en el registro C y el multi-
plicando en el registro E.
Introducción a la Programación del 8085A 269

mvi l,0 ; Resultado bajo a cero


mov h,l ; Resultado alto a cero
mov d,h ; Multiplicando alto en cero
mult: dad d ; Suma multiplicando a resultado
dcr c ; Decremento del multiplicador
jnz mult ; Si cero salir.
hlt

La rutina de multiplicación por sumas repetidas fue utilizada para computar el


producto 45H*64H = 1AF4H, requiriéndose 2417 estados para completar la opera-
ción. A una frecuencia de 3.125 MHz, esto representa un tiempo de 0.7 mS. El tiempo
de cómputo del programa varía con el valor del multiplicador.

La técnica de sumas y desplazamiento para multiplicar es mucho más rápida


y se realiza en forma similar a como se obtiene un producto usando lápiz y papel. Las
reglas de la multiplicación binaria son como se indica a continuación,

0*0=0 1*0 =0
0*1=0 1*1 =1

El producto final de la operación es la suma de una serie de productos parcia-


les. Existe un resultado parcial por cada bit del multiplicador. Si un dígito del multi-
plicador es igual a uno, el producto correspondiente es igual al multiplicando. En caso
que el bit sea cero, el producto parcial será cero. Cada producto intermedio estará
desplazado un lugar a la derecha con respecto al inmediatamente inferior.

Ejemplo:

11001101 (CDH) Multiplicando


11000111 (C7H) Multiplicador
11001101
11001101
11001101
00000000
00000000
00000000
11001101
11001101
1001111101011011 (9F5BH) Resultado de 16 bits

La multiplicación de números de 1 byte produce un resultado de 2 bytes. En


general, el número de bits del resultado es igual a la suma del número de bits de los
operandos. De modo que al multiplicar un valor de 8 bits por uno de 16 bits se ob-
tendrá un producto de 24 bits.

Cuando se programa el algoritmo de multiplicación es más conveniente sumar


cada producto parcial al ser formado, en vez de totalizarlos todos al final como se
realiza en forma manual.
Introducción a la Programación del 8085A 270

Para simplificar el programa se forman los productos parciales desde abajo


hacia arriba, lo cual es equivalente a procesar los bits del multiplicador de izquierda
a derecha, en contraposición a como se realiza con lápiz y papel. Antes de sumar un
producto parcial, se desplaza un lugar a la izquierda produciendo el mismo efecto
que si cada producto intermedio hubiese sido desplazado un lugar a la derecha con
respecto al de abajo.

Ejemplo 6.27

Escribir un programa para multiplicar dos valores binarios enteros de 8 bits.


Se supone que el registro C contiene el operando multiplicador y el E el multipli-
cando. El producto resultante se carga en el registro par HL.

mov h,c ; Multiplicador al registro h


mvi l,0 ; Se carga cero en byte bajo del resultado.
mov d,l ; Byte alto del multiplicando a cero
mvi b,8 ; Contador de bits
mul: dad h ; Bit msb del multiplicador al carry.
jnc nsu ; Si es 0,no sumar multiplicando a resultado
dad d ; Si es 1, sumar multiplicando a resultado
nsu: dcr b ; Disminuir contador de bits.
jnz mul ; Si b es no cero, procesar próximo bit del
hlt ; Multiplicador. si b cero, salir

Para probar cada bit del multiplicador, éste se carga en el registro H y se utili-
za la instrucción DAD H para rotar el registro HL. Cada ejecución de esta instrucción
tiene doble efecto. Si el bit 7 de H es uno, ocurrirá un desborde y la bandera de aca-
rreo se pone en uno, detectándose un bit uno del multiplicador. La prueba posterior
del bit de acarreo indica si debe sumarse el producto parcial, evitando la suma de los
productos intermedios en cero.

El segundo efecto de la instrucción es que produce el desplazamiento hacia la


izquierda del producto parcial, originalmente en L, el cual progresivamente ocupa los
16 bits de HL, a medida que los bits del operando multiplicador (en H) van siendo
procesados.

El µP 8085A invirtió 317 estados en calcular el producto 45H*64H = 1AF4H,


lo cual equivale a 0.1 mS. Aunque el tiempo necesario para completar una operación
de multiplicación varía con el valor del multiplicador, tal dependencia no es signifi-
cativa, debido a que solo se requiere realizar una suma (7 estados) por cada bit del
multiplicador en uno.

Para culminar el tema de multiplicación binaria de enteros sin signo, el ejem-


plo 6.28 presenta la lista de instrucciones de un programa que ejecuta una multiplica-
ción binaria con resultado de 24 bits.
Introducción a la Programación del 8085A 271

Ejemplo 6.28

En el siguiente programa realiza el producto de un multiplicando de 16 bits


(en el registro par DE) por un multiplicador de 8 bits (almacenado en el registro C).
El byte más significativo del producto se carga en C y los otros dos bytes en HL. Se
supone que los operandos se cargan en los registros correspondientes antes de ejecu-
tar el programa.

mul168: mov a,c ; Multiplicador al registro a


mvi b,8 ; Contador de bits del multiplicador
lxi h,0 ; Bytes 2 y 3 del resultado a cero
mul: dad h ; Desplazar resultado a la izquierda
ral ; Cargar bit del multiplicador en CY
jnc nsu ; Si bandera de acarreo es 0, no sumar
dad d ; Si cy es 1, sumar multiplicando
aci 0 ; Si hay desborde, sumar CY al a
nsu: dcr b ; Disminuir b
jnz mul ; Si B es no cero, próximo bit
mov c,a , Si B es 0, salir.
ret

El algoritmo de la multiplicación de 16 x 8 bits es similar al utilizado para


programar el producto de dos números de 8 bits. En este caso, para formar el resulta-
do de 24 bits, el producto parcial se desplaza desde el registro HL hacia el acumula-
dor a través del bit de acarreo. Rotando el A hacia la bandera de acarreo se prueban
los bits del multiplicador. Para considerar el desborde del bit más significativo del
registro par HL se usa la instrucción ACI 0, la cual suma el bit de acarreo al conteni-
do del acumulador.

División de números binarios


La operación de división se ejecuta usando las reglas de multiplicación y sus-
tracción, tal como se realiza en aritmética convencional. Por ejemplo, considere la
división A5H ÷ 12H,
Ejemplo:

1001 Cociente
Divisor 10010 10100101 Dividendo
10010
000101
00000
001010
00000
010101
10010
00011 Residuo

El resultado de la operación es 1001B (09H) y el residuo 11B (03H).


Introducción a la Programación del 8085A 272

La división es un poco más compleja de realizar que la multiplicación, pero


se basa en los mismos principios usados en la aritmética clásica. El procedimiento
para realizar la operación de división binaria, se expone a continuación,

1. Se seleccionan los bits del dividendo, iniciando por el más significativo. Mientras el
grupo de bits elegidos representen un valor menor que el divisor se colocan ceros en
el cociente.
2. Cuando los dígitos extraídos del dividendo forman un número que supera al divisor,
se coloca uno en el cociente y el divisor es restado del dividendo parcial. El resulta-
do constituye el primer residuo parcial.
3. En cada paso del proceso se toman bits adicionales del dividendo y se colocan en el
residuo parcial. El divisor es comparado con nuevo residuo parcial. Si el divisor es
menor o igual, se sustrae del residuo parcial y uno es colocado en el cociente. En ca-
so contrario, se pone cero en el cociente permaneciendo invariable el residuo par-
cial.
4. Después de cada paso el residuo parcial es desplazado un bit hacia la izquierda. El
proceso finaliza cuando se halla seleccionado el bits menos significativo del divi-
dendo

Ejemplo 6.29

Escribir una rutina para dividir dos valores binarios de 16 bits y producir un
cociente y un residuo de 16 bits. El registro par DE contiene el dividendo y el cocien-
te. El registro BC almacena el divisor y el residuo se carga en el registro HL.

div1616: mvi a,10h ; Contador de bits a 16


lxi h,0 ; HL en cero al inicio
div1: xchg ; CY Å msb del dividendo
dad h
xchg
jnc cy0 ; Bit del dividendo se carga en
dad h ; HL desde CY y HL se
inr l ; desplaza
jmp cont ; un bit
cy0: dad h ; hacia la izquierda
cont: inr e ; Uno al cociente
push psw ; Se salva el contador de bits
mov a,l ; Se resta el
sbb c ; Dividendo parcial
mov l,a ; Del divisor
mov a,h ; El resultado
sbb b ; Queda
mov h,a ; En HL
jnc div2 ; Si resultado es positivo, continuar
dcr e ; Si es negativo cero al cociente
dad b ; Restaurar residuo parcial
div2: pop psw ; Recuperar contador
dcr a
jnz div1 ; Siguiente bit del dividendo.
ret
Introducción a la Programación del 8085A 273

La programación del código de división se realizo en forma algo diferente al


algoritmo descrito. Al inicio del proceso, se coloca uno en el registro cociente y el
divisor se substrae del dividendo parcial cada vez que un nuevo bit del dividendo es
seleccionado. Si el resultado es negativo, se remueve el uno del cociente (se cambia
por cero) y se restaura el dividendo parcial, sumándole el dividendo al divisor. Al
obtenerse el primer uno válido en el cociente, el proceso continúa como se indicó.

Multiplicación y división de números decimales

Los algoritmos para multiplicar y dividir valores decimales son lentos y ocu-
pan mucha espacio de memoria. En muchos casos puede ser más conveniente utilizar
un método alternativo. Este, puede consistir en convertir los operandos decimales a
binario, ejecutar la operación en este al sistema de representación numérica y conver-
tir el resultado a BCD. La multiplicación decimal puede hacerse por el método de
sumas repetidas, mientras que para la división, puede acudirse al procedimiento de
restas repetidas.

Ejemplo 6.30

Este ejemplo ilustra el método de sumas para realizar el producto de un valor


BDC de 4 dígitos almacenado a partir de la posición de memoria MPNDO por un
número de dos dígitos decimales en la dirección MPDOR. A partir de ésta última po-
sición se obtiene el producto de 6 cifras BCD.

lxi sp,tope ; Se inicia el apuntador de pila


lxi h,mpdor ; Dirección del multiplicador
mov c,m ; Multiplicador al registro c
mvi m,0 ; Se inicia a suma en cero
rep: mvi b,3 ; Producto de 6 dígitos bcd
lxi h,mpdor ; Dirección del multiplicador
lxi d,mpndo ; Dirección del multiplicando
call sumdec ; Se realiza la suma
mov a,c ; Decremento
adi 99h ; del
daa ; contador
mov c,a ; BCD
jnz rep ; Si cero, salir
hlt

La rutina SUMDEC es llamada tantas veces como indique el multiplicador.


Tal valor viene expresado en BCD. Para utilizar una variable BCD como contador,
se suma 99H al valor del registro y se ajusta el resultado a decimal con DAA. Su-
ponga que el A contiene 15H, al sumarle 99H se obtiene AEH, y después del ajuste
decimal el A tendrá 14H y la bandera de acarreo se activará a 1. Si se desea incre-
mentar el contador BCD, debe sumarse 01H al A antes de realizar el ajuste decimal.
Introducción a la Programación del 8085A 274

La última instrucción aritmética del 8085A, aun no comentada, realiza la su-


ma de números de 16 bits. Esta es DAD rp.

DAD rP (H) (L) ← (H) (L)+ (rh) (rl)

Suma el dato de 16 bits almacenado en el registro par especificado, al conte-


nido del registro par HL. El resultado de la operación aritmética se carga en HL. Esta
instrucción solo afecta la bandera de acarreo. Los registros operandos permitidos
son: BC, DE, HL y el SP.

La instrucción DAD, además de permitir la suma de números de doble preci-


sión, puede ser usada para el desplazamiento hacia la izquierda de datos de 16 bits.
Las instrucciones de rotación del 8085A sólo actúan sobre valores de 8 bits almace-
nados en el acumulador. Cuando se requiere desplazar datos de 2 bytes, debe escri-
birse una rutina con tal propósito.

Ejemplo 6.31

Escribir un programa para rotar a la izquierda números de 16 bits,

;-----------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------------------------
lxi sp,tope ; Se inicia el apuntador de pila
lxi h,dato16 ; Valor a desplazar
mvi b,nrot ; Número de desplazamientos
ora a ; Bandera de acarreo acero
call rotar ;Rotar
hlt
;----------------------------------------------------------------------------------
; Subrutina ROTAR
;----------------------------------------------------------------------------------
rotar: mov a,l ; Byte bajo al acumulador
ral ; Rotar a la izquierda
mov l,a ; resultado parcial
mov a,h ; Byte alto al acumulador
ral ; Rotar a la izquierda
mov h,a ; resultado parcial
dcr b
jnz lazo ; próximo desplazamiento
ret

La subrutina ROTAR desplaza el dato en el registro par HL, NROT posicio-


nes hacia la izquierda. El procedimiento consiste en usar la bandera de acarreo como
paso intermedio para desplazar el bit 7 del registro L al bit 0 del registro H. Conside-
re que el dato de dos bytes es 34A7H y que debe desplazarse dos bits hacia la iz-
quierda. En la figura 6.36 se muestra el contenido del registro HL, después de cum-
plirse cada rotación.
Introducción a la Programación del 8085A 275

H CY L
0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 1 1

Estado inicial

0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0

Después de la primera rotación de L

0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0

Después de la primera rotación de H

0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0
Después de la segunda rotación de L

1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0
Después de la segunda rotación de H

Fig. 6.36 Desplazamiento de un número de 16 bits dos lugares hacia la izquierda.

Aunque en este caso no es necesario, antes de rotar el contenido del registro


H debe cargarse cero en la bandera de acarreo. Esto previene que un 1 se introduzca
en el bit 0 de L cuando el registro se rota hacia la izquierda. El resultado de rotar el
número 34A7H (1347910) es D29CH (5391610).

El lector puede verificar con facilidad que el desplazamiento de 34A7H, dos


lugares hacia la izquierda, ha multiplicado el número por cuatro. En general, el des-
plazamiento de un valor entero hacia la izquierda multiplica el número por 2, mien-
tras hacia la derecha, lo divide por 2. Por supuesto, debe considerarse si la operación
desplaza un uno desde el bit 7 del dato, en cuyo caso el resultado de la multiplicación
no puede representarse con un byte. Las operaciones de multiplicación y división por
números potencias de dos, son factibles de realizarse con desplazamientos hacia la
derecha o hacia la izquierda.

El uso de la instrucción DAD simplifica de modo considerable la tarea de ro-


tar hacia la izquierda valores de 16 bits, si se considera que la operación 2*X es
equivalente a X+X. La instrucción DAD H efectivamente desplaza el contenido del
registro par a HL, un bit hacia la izquierda. De modo que, una secuencia de cuatro
instrucciones DAD H, realizan la misma tarea que la subrutina rotar, con NROT = 4.
Introducción a la Programación del 8085A 276

6.5 ARITMÉTICA DE PUNTO FIJO O DE PUNTO FLOTANTE

Los números binarios pueden ser representados en el computador como un va-


lor entero o de punto flotante. Cada modo de representación tiene alguna ventaja que
en general depende del tipo de aplicación. Los µPs y Ctrls usan por defecto aritmética
entera para procesar los operandos. Para proveer representación en punto flotante en
sistemas empotrados lo usual es usar una librería matemática que se incorpora al có-
digo del proyecto. En cambio, los procesadores modernos incorporan en su interior
un coprocesador matemático que funciona en paralelo con el µP y puede realizar
además de las operaciones fundamentales, cálculos con funciones trigonométricas,
exponenciales y logarítmicas. En este caso, si el programa que se ejecuta usa el co-
procesador, el desempeño del sistema aumenta sustancialmente.

Las características básicas de los sistemas de representación numérica de pun-


to fijo y de punto flotante, son las siguientes:

¾ Punto fijo

• Los números son representados y manipulados como valores enteros.

• El rango de valores posibles de representar es menor.

• Requiere un código más complejo.

¾ Punto flotante

• Los números son representados por la combinación de una parte fraccional o mantisa y
una parte exponencial.

• Hardware adicional puede procesar estas partes.

• Tiene mayor costo y es más lento.

La representación en punto flotante puede usarse si los requisitos de memoria


y velocidad de la aplicación no se ve comprometida por el código adicional necesario.
El uso de hardware de punto flotante aumenta la velocidad pero incrementa los cos-
tos. En sistemas basados en microprocesadores lo usual es utilizar aritmética entera
para realizar las operaciones matemáticas y usar formatos especiales para representar
fracciones.

Como debe haber observado el lector, todas las operaciones matemáticas rea-
lizadas con el lenguaje de máquina del 8085, produce como resultado un número en-
tero. En algunas aplicaciones es común que el µP deba trabajar con números muy
grandes que no pueden ser representados con un byte. En estos casos, debe recurrirse
a la aritmética de precisión múltiple donde son necesarios 2 o más bytes para almace-
nar los operandos y resultados. En la sección anterior se mostraron diversos ejemplos
de operaciones matemáticas con entradas y salidas de números con varios dígitos.
También puede ser necesario que el µP realice alguna tarea que involucre la represen-
Introducción a la Programación del 8085A 277

tación de valores fraccionales. El equivalente binario de la fracción puede ser repre-


sentado por un número entero que ocupe uno o más bytes, separando las partes ente-
ras y decimal por un punto decimal imaginario. La exactitud de la representación es
variable. En ocasiones, la fracción puede ser representada en forma exacta en el sis-
tema binario.

Por ejemplo, el sen(30°) = ½ , puede almacenarse como sen(30°) = 5000, te-


niéndose en cuenta que para obtener el resultado correcto debe dividirse este valor
por 10000. Por el contrario, el número decimal sen(60°) = 0,866025403, no tendría
un equivalente binario exacto con este método. El valor decimal original, debe ser
truncado o redondeado para ser cargado en dos bytes: sen(60°) = 8660

También es posible que el rango de las variables procesadas durante una tarea
sea tan grande, que la representación binaria de los números enteros y fraccionales
como valores multibytes, exija una cantidad de memoria apreciable. No siempre la
precisión requerida del procesamiento, justifica el uso de números de precisión múlti-
ple. En estos casos, si se desea un ahorro de la memoria del sistema puede apelarse a
la representación de punto flotante. En este trabajo, no se discute este tópico, pudien-
do el lector consultar la literatura recomendada.

Suponga ahora que debe multiplicarse por 1.73 el valor DATO (9410) usando
números de punto fijo, almacenado en memoria. Como el número 1.73 no puede ser
representado, se multiplica por 100 y se ejecuta la operación entera:

(173 ⋅ DATO) (173 ⋅ 94) 16262


N= = = = 162
100 100 100

Expresado en números hexadecimales como,

(ADH ⋅ 5EH) 3F86H


N= = = A2H = 16210
64H 64H

Observe que el valor DATO (9410) es multiplicado efectivamente por el nú-


mero 1.73, (el resultado real es 162.62) aún cuando solo se usaron números enteros.
La precisión puede ser mejorada si se redondea el resultado.

Considere ahora que el µP debe medir y presentar el valor de una variable z,


la cual depende de un parámetro w, conocido. Para esto se debe resolver la ecuación:

z = 0.43 × w − 62

La ecuación es escalada multiplicándola por 100, para que los coeficientes del
polinomio puedan representarse con números enteros.
Introducción a la Programación del 8085A 278

z = 43 × w − 6200

Se usó el valor de 100 para escalar la ecuación porque conviene por la natura-
leza de la aplicación. Se trata de un instrumento que adquiere desde un conversor
A/D el valor de la muestra w, lo multiplica por 43 y luego le suma el complemento a
dos de 6200. El resultado z obtenido es entonces convertido a BCD. Aunque este
valor esta centuplicado no es necesario usar una rutina de división para dividirlo por
100, basta con activar el punto decimal en el tercer dígito BCD, contado a partir del
dígito del extremo derecho.

En aplicaciones de procesamiento digital de señales es usual el uso de hard-


ware de punto fijo, por lo limitado de la memoria disponible y las restricciones de
velocidad. Como los coeficientes de los filtros digitales son pequeños, los valores de
punto fijo deben ser escalados. En general, cuando se usa aritmética de punto fijo, los
números deben ser escalados para evitar condiciones de desborde errores altos de
cuantización.

El punto binario es el medio por el cual los números de punto fijo son esca-
dos. Es el programa quien determina la posición del punto binario. La ALU ejecuta
operaciones como suma y resta sin detectar el factor de escala. Las operaciones de
punto fijo con o sin signo son ejecutadas como si el punto binario estuviese a la dere-
cha del bit menos significativo. Los números en punto fijo pueden ser escalados por
tipos de datos cuyo escalamiento es definido por la posición por defecto del punto
decimal o se puede usar un tipo de datos en punto fijo con un escalamiento lineal
arbitrario.

Los tipos de datos de punto fijo son:

¾ Enteros

Para enteros con o sin signo el punto binario por defecto está colocado a la derecha del bit
menos significativo.

¾ Fracciones

Para fracciones sin signo, el punto binario por defecto está ubicado a la izquierda del bit
más significativo mientras para números con signo está a la derecha del bit más significa-
tivo.

¾ Números de punto fijo generalizados

No existe un punto binario por defecto.

Un tratamiento con detalle del tópico de representación de datos en punto fijo


y de las técnicas de escalamiento escapa al alcance de este trabajo. El lector interesa-
do debe consultar literatura relacionada. Como ejemplo, considere que se debe repre-
sentar el número fraccional 0.95 y -0.75 usando una palabra de 16 bits. Una notación
Introducción a la Programación del 8085A 279

utilizada en sistemas empotrados y apropiadas para este caso es el conocido formato


Qm,n, donde:

• Q indica que el número está en formato Q.

• m es el número de bits usado ara representar la porción entera en complemento dos del nú-
mero.

• n indica número de bits usado ara representar la porción fraccional en complemento dos del
número o el número de bits a la derecha del punto binario.

Por ejemplo un número de 16 bits con signo y con 15 bits a la derecha del
punto binario se expresa como Q0.15 o simplemente Q.15. Los valores indicados se
representan como:

0.9510
bn-1 bn-2 b0
0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1

-0.7510

1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Fig. 6.37 Notación en formato Q.15

Para encontrar la representación se multiplica el coeficiente por 215. Observe


que el valor del número puede ser encontrado con:

N = − b n −1 × 20 + b n − 2 × 2 −1 " + b1 × 2 − (n − 2) b 0 × 2− (n −1)

Una aplicación típica donde puede usarse el formato Q.15 es en un filtro digi-
tal. Este adquiere una muestra de una señal bipolar de entrada y la usa para resolver
una ecuación diferencia que describe el algoritmo de filtrado. A continuación, el valor
resultante del procesamiento de la muestra de entrada aplicado a las entradas de un
conversor D/A. El formato Q.15 se usa para representarse los coeficientes de la ecua-
ción del filtro. La notación Q.15 permite representar valores entre -1 y 0.99 con la
ventaja que al ser todos los números ≤.1 no puede ocurrir desborde durante las opera-
ciones de multiplicación.

Debido a que los cálculos se realizan usando aritmética de complemento dos,


los valores entregados por el conversor A/D deben ser trasladados a este formato.
Esto puede hacerse en forma sencilla si el circuito de entrada es diseñado para leer
los valores en formato binario desplazado. En esta representación al voltaje de entra-
da más negativo se le asigna el número 0, cero voltios lo representa el número 128 y
255 es asignado al voltaje más positivo.
Introducción a la Programación del 8085A 280

Debido a que los microcontroladores tienen un convertidor A/D de entrada


unipolar, la señal de entrada al filtro debe ser ajustada usando amplificadores opera-
cionales con la onda centrada en + 2.5 voltios con variación entre 0 y +5 voltios. El
valor de la muestra de entrada en binario desplazado es convertido a complemento
dos simplemente mediante la inversión lógica del bit más significativo de la palabra.
Una vez completados los cálculos de procesamiento de la señal, el número resultante
es convertido a binario desplazado complementando el bit de mayor peso y es envia-
do al conversor D/A.

Para efectos de los cálculos, los coeficientes en formato Q.15 se almacenan


en la memoria del sistema y las muestras de la señal de entrada se leen del CAD de 8
bits. La ecuación del filtro puede resolverse mediante sumas y productos, esto es los
coeficientes se multiplican con signo por valores de entrada y los productos parciales
son sumados con signo. El byte de entrada es multiplicado por 256 para obtener un
número de 16 bits el cual es multiplicado por el coeficiente que corresponda obte-
niéndose un número de 32 bits, lo cual implica un bit extra de signo que debe ser
suprimido. Los resultados parciales son sumados y el resultado final es truncado o
redondeado a un valor de 8 bits que va al conversor D/A y al circuito de acondicio-
namiento de salida.

Por ejemplo, suponga que la entrada del filtro es una forma de onda seno de
2.5 V de amplitud. Si se le inserta a la señal un nivel DC de +2.5 V, se obtiene la on-
da deseada con variación entre 0 y + 5 V. Suponga que para simplificar el ejemplo, la
onda de entrada debe ser multiplicada por el coeficiente +0.75 (6000H). Considere
que en un instante determinado, se adquiere desde el convertidor A/D una muestra de
valor FFH, la cual se pasa a complemento dos como 7FH y a un valor de 16 bits co-
mo 7F00H. Ahora se realiza la multiplicación con signo la cual da como resultado el
número de 32 bits 6000H ∗ 7F00H = 2FA00000H. Eliminando el bit de signo adicio-
nal se obtiene 5F400000H.

Truncando este valor a una longitud de 8 bits se tiene 5FH el cual es retorna-
do a binario desplazado como DFH. Este valor es aplicado al convertidor digital ana-
lógico produciendo un voltaje de + 4.355 V. Al restituir el nivel DC de la señal se
obtiene una tensión de + 1.855 V. Observe que el resultado de multiplicar la entrada
por 0.75 es una salida de + 1.875 V por lo tanto se ejecutó con éxito la operación
deseada.

En la práctica, programar este procedimiento para microcontroladores o mi-


croprocesadores, requiere arduos esfuerzos. Además, debe prestarse especial atención
a los efectos de usar palabras de longitud limitada para representar los números. Es-
tos efectos se relacionan con: cuantización de la señal en la conversión A/D, errores
por redondeo-truncado y cuantización de los coeficientes del filtro. Esto puede resul-
tar en desplazamiento de los polos y ceros de la función de transferencia del filtro, lo
cual puede causar variaciones en la ganancia, en las frecuencias de corte del filtro o
en la estabilidad del sistema.
Introducción a la Programación del 8085A 281

Lo recomendado es simular el algoritmo usando un programa de simulación


adecuado, para verificar el modelo del filtro con aritmética de punto fijo y palabras
de la longitud seleccionada. El paquete MATLAB y su herramienta para aritmética de
punto fijo, es una buena elección para el propósito señalado.

Cálculo de la raíz entera de un número binario

Las operaciones matemáticas posibles de ejecutarse usando aritmética de pun-


to fijo no se limitan a suma, resta, multiplicación y división. En realidad, cualquier
función matemática por compleja que sea, puede ser programada si se dispone del
algoritmo adecuado. Usando lenguaje de máquina puede calcularse el logaritmo, la
raíz cuadrada, el seno o cualquier otra función de una variable. Las limitaciones para
el cómputo de cualquiera de estas funciones las impone el tiempo de CPU exigido
por la aplicación. Según el caso, pueden utilizarse formulas especificas, algoritmos
de aproximación o tablas de consulta. Esta última técnica disminuye en forma nota-
ble el tiempo de CPU necesario para el cálculo de la función.

Considere ahora que debe calcularse la raíz cuadrada de un número entero N


usando aritmética de punto fijo. Una forma realizar esta operación es usando el mé-
todo de aproximaciones sucesivas de Newton-Raphson. Dado el valor entero y posi-
tivo N, si xn es una aproximación a la raíz de N, la expresión para obtener la aproxi-
mación siguiente xn+1, viene dada por,

1⎛ N ⎞
x n +1 = ⎜⎜ + x n ⎟⎟
2 ⎝ xn ⎠

El diagrama de flujo del algoritmo se presenta en la figura 6.37 y el programa


en el ejemplo 6.32.

Ejemplo 6.32

El siguiente programa realiza el cálculo de la raíz de un valor entero. El núme-


ro cuya raíz se pretende calcular es de 16 bits y se obtiene a desde la posición de me-
moria DMEM y DMEM+1. El resultado se carga en el registro DE.

raiz: lhld dmem ; x=N


inx h ; x =N+1
mov a,h ; x(n)=x/2, x(n)ÆBC
rrc ;.
mov b,a ;.
mov a,l ;.
rar ;.
mov c,a ;.
rep: lhld dmem ; nÆHL
xchg ; HL↔DE
call div1616 ; x(n+1)=n/x(n)Æ DE=DE/BC
mov h,b ; x(n+1)=x(n+1)+ x(n)
Introducción a la Programación del 8085A 282

mov l,c ;.
dad d ;.
inx h ; Redondear
mov a,h ; x(n+1)=x(n+1)/2
rar :.
mov d,a ;.
mov a,l ;.
rar ;.
mov e,a ;.
mov a,b ; Comparar x(n) con x(n+1)
cmp d ; BC DE
jnz cont ; Diferentes, x(n)=x(n+1)
mov a,c ;.
cmp e ;.
rz ; Iguales, raíz en DE y
; retornar
cont: mov b,d ; x(n)=x(n+1)
mov c,e ;.
jmp rep ; Siguiente aproximación

Fig. 6.37 Algoritmo para extracción de la raíz cuadrada de un número entero.


Introducción a la Programación del 8085A 283

Para algunos valores, el algoritmo de aproximación no funciona en forma


apropiada, entrando en un lazo sin fin para aproximaciones sucesivas que difieren
por uno. Esto puede corregirse detectando cuando xn-xn+ 1=1, y usando xn+1 como el
valor final de la raíz. Una forma más conveniente consiste en sumar 1 al valor que se
divide por 2 en la formula de aproximación, lo cual redondea el cociente evitando la
oscilación. Si se suprime la instrucción INX H en el lazo de aproximación y se eje-
cuta el programa con N=3, xn y xn+1 alternaran continuamente entre 1 y 2. Otro falla
ocurre cuando N=1, debido a que se obtiene cero como resultado. La instrucción
INX H al inicio del programa, selecciona N+1 como aproximación inicial a la raíz y
corrige el problema. La precisión del cálculo depende del valor del número N. La
tabla 6.8 presenta algunos resultados de la ejecución del programa, pudiendo obser-
varse que para valores grandes de N, la aproximación a la raíz cuadrada es mejor.

Tabla. 6.8 Resultados de rutina RAIZ.


N Raíz Raíz tcpu
programa calculador (ms)
3 2 1.7320 1.37
125 11 11.1803 3.47
300 17 17.3205 9.66
670 26 25.8844 4.15
1560 40 39.4968 4.79
7834 89 885099 5.57
16384 128 128.0000 6.04
30000 173 173.2051 7.64
64637 254 254.2381 7.07

El tiempo de CPU invertido en calcular la raíz es variable. Aunque la tabla


sugiere que se incrementa con el valor de N. Observe que el tCPU es mayor para
N=300 que para N=30000. Este tiempo depende en realidad del comportamiento de
la formula de aproximación. En el caso de N=300 se requieren 13 aproximaciones
para alcanzar el resultado, mientras que para N=30000, solo se realizan 11 estimacio-
nes antes obtenerse la raíz cuadrada.

Note que el error en el cálculo de la raíz de 3 es significativo. Si debe calcu-


larse el valor de y, para x =3, se obtendría,

y = 159 ⋅ x = 159 ⋅ 2 = 318 , en lugar del valor real: y = 159 ⋅ x = 159 ⋅1.73 = 275.4

El error en el resultado es inaceptable, gracias a la burda aproximación de 2,


al valor de la raíz cuadrada de 3. En la tabla se observa que la precisión del resultado
aumenta para los valores: x = 300 y x =30000. Si antes de extraer la raíz se multipli-
ca el valor de x por 10000, se ejecuta el producto y el resultado se divide por 100, se
tiene:

159 ⋅ 3 ⋅10 4
y= = 275
10 2
Introducción a la Programación del 8085A 284

El programa del ejemplo 6.33 realiza esta operación.

Ejemplo 6.33

lxi d,2710h ;1000010 a DE


mvi c,3 ;3 al registro C
call mul168 ;HL=3*10000
shld dmem ;30000 a memoria
call raiz ;DE=raiz(30000)
mvi c,9fh ;15910Æc
call mul24 ;HL=159*raiz(3000)
mvi c,64h ;10010Æc
xchg ;DEÅhl
call div1616 ;DE=159*raiz(3000)/100
hlt

6.6 INSTRUCCIONES ADICIONALES


Se han presentado 68 del conjunto general de 74 instrucciones del 8085A,
habiéndose utilizado la mayoría de estas en los ejemplos de programación. De las
instrucciones restantes, la función HLT es conocida por el lector. Las instrucciones
SIM, RIM, EI y DI se discutirán cuando se trate el tópico de interrupciones.

Tabla. 6.9 Instrucciones no comentadas


Instrucciones adicionales

HLT Parada EI Habilitar interrupción

SIM Poner máscara de interrupción DI Inhibir interrupción

RIM Leer máscara de interrupción NOP Ninguna operación

Durante la ejecución de la instrucción NOP no se realizan operaciones exter-


nas o internas, no afecta las banderas y requiere 4 estados. Usualmente se utiliza para
consumir tiempo en lazos de retardo

6.7 RUTINAS DE RETARDO


La realización de retardos por programa es una tarea obligada en muchas apli-
caciones con microprocesador. Por ejemplo, puede ser necesaria la generación de un
pulso de ancho determinado o de una forma de onda periódica para un dispositivo de
externo conectado a un puerto de salida. También, la supresión del rebote por contac-
to de un interruptor en un puerto de entrada puede ser lograda con un lazo de retardo.
Introducción a la Programación del 8085A 285

Además, estas rutinas son apropiadas para establecer tiempos de espera para la entra-
da o salida de información durante la ejecución de un programa.

El hecho que el tiempo de ejecución de cada instrucción sea conocido deja


abierta la posibilidad de utilizar el μP para realizar funciones de control de tiempo o
temporización. Los lazos que usan un registro contador para control de la repetición,
son adecuados para esta tarea. Si se requiere establecer un retardo de una duración
determinada, basta calcular el tiempo empleado por el procesador para ejecutar un
paso por el lazo y cargar el registro con el valor que permitirá obtener el tiempo de
espera deseado.

6.7.1 El lazo de retardo básico

Considere que se usa el registro B como contador y se ejecuta un lazo N ve-


ces, con la siguiente secuencia de instrucciones
.
ESTADOS
MVI B,N
LAZO: DCR B 4
JNZ LAZO 7/10

La instrucción DCR requiere 4 estados y JNZ 10 estados cuando se produce


el salto y 7, en caso contrario. El lazo será ejecutado N veces, los primeros N-1 pasos
tendrán una duración de 4 +10 = 14 estados cada uno y el lazo final, sólo 7 + 4 = 11
estados. De modo que el retardo total es,

TD = [( N − 1) ⋅14 + 11]⋅ Treloj (7.1)

Para una frecuencia de operación interna de 3.125 MHz, un estado tiene una
duración igual a Treloj = 0.32 µs. De modo que el tiempo necesario para ejecutar el
lazo y salir puede calcularse conociendo el número de estados que emplea el ciclo de
instrucción de DCR y JNZ. Esta información es suministrada en el manual del usua-
rio por el fabricante del dispositivo procesador.

TD = [( N − 1) ⋅14 + 11]⋅
1
TD = ( N − 1) ⋅ 4.48 µs + 3.52 µs
3.125 MHz

El mayor número que puede representarse con un byte es 25510. Sustituyendo


este valor en la ecuación 7.1 se tiene,

TD max = ( 255 − 1) ⋅ 4.48 µs + 3.52 µs = 1141.44 µS

Esta cantidad es el valor máximo del retardo que puede generarse con la ruti-
na. La ecuación 7.1 también indica que el tiempo de espera mínimo obtenible es de
3.52 µs, cuando N = 1. Observe además que el retardo máximo puede ser incrementa-
Introducción a la Programación del 8085A 286

do si se carga el registro B con cero, debido a que el primer decremento lo llevará


hasta 255.

Establecido como calcular el tiempo de retardo de un lazo de programación


conociendo el valor del módulo del contador, conviene formular el proceso inverso.
Para un tiempo de retardo especificado. ¿Cuál valor debe asignarse a la variable N,
para obtenerlo? Por supuesto la respuesta es directa, basta despejar N de la ecuación
7.1, resultando,

TD − 11 ⋅ Treloj
N= +1 (7.2)
14 ⋅ Treloj

La formula 7.2 puede ser generalizada, si se toma en cuenta que el término


14⋅Treloj es la duración de un paso a través del lazo y 14⋅Treloj corresponde a la dura-
ción del paso final.

TD − Tpaso
N= +1
Tfinal

En la práctica el programa de retardo se realiza como una subrutina, cargando


el registro contador desde el programa principal, como se indica a continuación,

.
mvi b,n
call retad
.
.
.
hlt

retad: dcr b
jnz retad
ret

En tal caso, la ecuación de retardo varía al incluirse los 38 estados consumidos


por las instrucciones CALL (18) y RET (10). La nueva formula de retardo es,

TD = [( N − 1) ⋅ 14 + 39 ] ⋅ Treloj

Ejemplo 6.34

Considere que se desea generar por programa un pulso de nivel alto con una
duración de tp = 70 μS. El bit 4 del puerto 01 se usará como salida del pulso.
Introducción a la Programación del 8085A 287

Estados
xra a ; El acumulador a cero
out 01 ; Bit 4 del puerto p01 a cero.
mvi b,n ; Cargar contador de lazo
mvi a,10h ; Bit a4= 1
out 01 ; Pulso a nivel alto.
lazo: dcr b ; Decremente contador 4
jnz lazo ; Si (b) ≠ 0, repita el lazo. 7/10
xra a ; Si (b) = 0 haga (a) = 0 4
out 01 ; Pulso cae a cero. 10

Al inicio del programa se carga cero en el acumulador y se asegura que la lí-


nea 4 del puerto 1 esté en nivel bajo. Las siguientes dos instrucciones conmutan el bit
4 de P0.1 a nivel alto, antes de entrar al lazo. Se mantiene el pulso en alto por tp y las
dos últimas instrucciones proveen el flanco de bajada de la onda.
Se sabe que cada paso por el lazo dura 14 estados. Cuando el registro B llega
a cero, JNZ no produce salto y dura solo 7 estados. Esto implica una duración del
paso final hasta que se escribe en el puerto, de: 4 + 7 + 4XRA + 10OUT = 25 estados.
Usando la ecuación se calcula el valor a cargar en el registro B, para obtener el ancho
de pulso deseado, como resultado se obtiene N = 14.84. Debido a que N debe ser un
número entero, seleccionando N = 14 se obtiene un tiempo de retardo igual a 66.24
μS y de 70.72 µs con N= 15.
Existen situaciones donde la duración del pulso a generar es un parámetro crí-
tico, esto significa que debe obtenerse un ancho de pulso lo más cercano posible a los
70 μS. Para esto se selecciona para el entero inmediatamente inferior y se alarga la
duración del retardo usando instrucciones que no realicen función, pero que consu-
man tiempo. El ajuste del tiempo puede hacerse usando instrucciones NOP fuera del
lazo. Seleccionando N =14, y agregando tres NOP al programa del ejemplo, se obtie-
ne la rutina,

estados
xra a
out 01
mvi b,0eh
mvi a,10h
out 01
lazo: dcr b 4
jnz lazo 7/10
nop 4
nop 4
nop 4
xra a 4
out 01 10

La duración del paso final es 4 + 7 + 3⋅4NOP + 4XRA + 10OUT = 37 estados. El


ancho de pulso será:

t P = [(14 − 1) ⋅14 + 37]⋅ 0.32 μs = 70.08 μs


Introducción a la Programación del 8085A 288

Dependerá de la habilidad y paciencia del programador lograr el ajuste nece-


sario. Es obvio que podría usarse cualquier instrucción distinta a NOP para alargar el
retardo. Por ejemplo, el programa del ejemplo 6.32 puede ser modificado para gene-
rar un pulso de 50 µs, Cargando N = 8 en el registro B y usando dos instrucciones
DAD H y una LDA DMEM para el ajuste del tiempo.

Estados
xra a
out 01
mvi b,8
mvi a,10h
out 01
lazo: dcr b 4
jnz lazo 7/10
dad h 10
dad h 10
lda dmem 13
xra a 4
out 01 10

La generación por programa de una señal cuadrada a una frecuencia especifi-


cada requiere alternar de alto a bajo por tiempos iguales, el estado de una línea de un
puerto de salida. Un circuito de interconexión externo fijará la magnitud y polaridad
de los niveles de tensión de la forma de onda.

Ejemplo 6.35

Escribir un programa para generar un tren de pulsos de ciclo de trabajo 50 % y


frecuencia 500 Hz, en todas las líneas de salida del puerto 20H.

estados
tpul: out 20h ; (a)Æ (puerto 20h) 10
cma ; Complementar el (a) 4
mvi b,dbh ; argar contador de lazo 7
lazo: dcr b ; Decremente contador 4
jnz lazo ; Si (b) ≠ 0, repita el lazo 7/10
lxi d,0 ; Epere 10
lxi d,0 ; Epere 10
mvi e,0 ; Epere 7
nop ; Epere 4
jmp tpul ; Cambiar nivel del pulso 10

Un semiciclo de la señal cuadrada tiene una duración de,

= [10 + 4 + 7 + ( 219 − 1) ⋅14 + 4 + 7 + 10 + 10 + 7 + 4 + 10]⋅ 0.32 µs = 1000 µs


T
2

f = 500 Hz
Introducción a la Programación del 8085A 289

La frecuencia de la onda es igual a 500 Hz como especifica el problema. Por


supuesto, la rutina del ejemplo 6.31 representa un lazo sin fin durante el cual se gene-
ra continuamente la onda cuadrada.

6.7.2 Retardos de mayor duración

Si el ancho tp del pulso generado en el ejemplo 6.33 debe extenderse hasta 500
ms, es imposible lograrlo con el uso del registro B como contador de lazo. El lapso de
retardo máximo posible con un registro de ocho bits, para una frecuencia de reloj in-
terna de 3.125 MHz, es de aproximadamente 1.14 ms. Si se utiliza una pareja de re-
gistros de ocho bits como un registro único de 16 bits, y la instrucción de decremento
de registro par DCX rp será posible repetir el bucle 65536 veces, si se asigna el valor
cero a N.

Debe considerarse que la instrucción DCX rp no afecta las banderas, por lo


cual debe usarse un método diferente al usual, para detectar cuando el registro par
llegue a cero. El lazo de espera usando un contador de 16 bits se muestra a continua-
ción,

estados
retad: dcx b 6
mov a,b 4
ora c 4
jnz retad 7/10
ret 10

Antes de ejecutar la subrutina de retardo, el registro par BC debe cargarse con


el valor de N usando la instrucción LXI rp,dato16. La instrucción DCX B decrementa
en 1 el registro de 16 bits BC. Desafortunadamente, DCX rp, no afecta la bandera de
cero Z. Una solución para determinar cuando el contador alcanza cero, e indicarlo con
Z=1, es cargar el acumulador con el contenido de B, lo cual corresponde al byte de
orden alto del registro contador, ejecutar una función OR exclusivo con el registro C
como operando. La bandera de cero será activada, solo cuando se cumpla que (B) =
(C) = 00H. La ecuación de retardo con el contador de 16 bits está expresada por,

TD = [ (N − 1) ⋅ 24 + 49] ⋅ 0.32 µs

El cual tendrá un valor máximo a la frecuencia especificada, de

TDmax = [ (65536 − 1) ⋅ 24 + 49] ⋅ 0.32 µs = 503.32 ms

Ejemplo 6.36

Usando una rutina de retardo, debe generarse un pulso de ancho 500 ms en la


línea 7 del puerto de salida B0H.
Introducción a la Programación del 8085A 290

estados
lxi b,n ; cargar contador de lazo
mvi a,10h ; bit a7 = 1
out b0h ; pulso a nivel alto.
lazo: dcx b ; decremento registro par bc 6
mov a,b ; byte alto del contador al a. 4
ora c ; or entre b y c. 4
jnz lazo ; salto si contador es cero 7/10
lxi d,0 ; esperar 10
lxi d,0 ; esperar 10
lxi d,0 ; esperar 10
mvi d,0 ; esperar 7
nop : esperar 4
xra a ; (a) = 0 4
out 01 ; pulso a nivel bajo. 10

Como es usual debe calcularse el valor de N a cargar en el contador para obte-


ner la duración deseada para la señal. La única diferencia entre este programa y el
usado par generar el pulso de ancho 70 ms es el procedimiento usado para registrar el
final de la cuenta. De modo que se escribe la expresión del retardo, como,

TD = [( N − 1) ⋅ 24 + 35]⋅ 0.32 µs

TD = ( N − 1) ⋅ 7.68 µs + 11.2 µs

El valor correspondiente de N es igual a,

TD − 11.2
N= = 65102.7
7.68

Seleccionando N = 6510210 (FE4EH) y ajustando el tiempo con instrucciones


no funcionales, se obtiene un ancho de pulso de,

TD = ( N − 1) ⋅ 7.68 µs + 11.2 µs + 41 ⋅ 0.32 µs = 500 ms

El pulso permanece en nivel alto por 1562500 estados, lo cual corresponde en


forma exacta a 500 ms.

Un tiempo de 0.5 s pudiese ser demasiado corto para las necesidades de algu-
nas aplicaciones. Por ejemplo, un controlador de tráfico urbano basado en µP, requie-
re retardos mayores para establecer los lapsos de encendido de la luces del semáforo.
Para lograr tiempos de espera largos puede usarse un bucle externo para repetir n ve-
ces el retraso logrado con la pareja de registros.

estados
mvi d,20h ; Contador externo en 32
ext: lxi b,fe50h ; Contador interno para 0.5 s 7
int: dcx b ; 6
mov a,b ; 4
Introducción a la Programación del 8085A 291

ora c ;. 4
jnz int ; Fin de lazo interno 7/10
dcr d ; 6
jnz ext ; Fin de lazo externo 7/10

La rutina provee un retardo de 16 segundos. Durante 50000541 estados. El re-


tardo interno es 0.5 segundos y se repite 32 veces. Al usar un contador de 8 bits para
control de la repetición del lazo interno, con este programa pueden obtenerse tiempos
de hasta aproximadamente 2 minutos. La rutina del ejemplo 6.37 permite retardos
mayores.

Ejemplo 6.37

Escribir una rutina de retardo para alcanzar tiempos de espera del orden de
horas.

Para un lapso de 9 horas, basta con repetir 65535 veces el lazo interno de 0.5
segundos del programa anterior. Para lo cual es necesario sustituir el contador que
controla el lazo externo por un contador con registro par. En lugar de usar el registro
D, se usa DE. Esto puede ser realizado como ejercicio. En este caso se prefiere usar
un procedimiento algo diferente, pero que igual utiliza dos contadores de 16 bits.

lxi d,n1
lxi b,n2
cont: dcx b
mov a,b
ora c
jnz cont
dcx d
mov a,d
ora e
jnz conT

El retardo máximo obtenible con este programa es de 9 horas a la frecuencia


de 3.125 MHz. Todos los ejemplos de código de retardos han supuesto esta frecuen-
cia de operación. Si se usa una versión del 8085 de 5 MHz, los tiempos de espera se
reducen al disminuir la duración de un estado a 0.2 µs. La técnica de control de tiem-
po por programa, puede usarse además para generar formas de ondas más complejas,
audio e incluso música. Examine el ejemplo siguiente donde se usa un programa para
generar el sonido del timbre de un teléfono.

Ejemplo 6.38

Se desea generar una señal que simule el tono de timbre telefónico. Esta for-
ma de onda se obtiene liberando durante 1 segundo 8 tonos de 320 Hz, seguidos por
12 tonos de 480 Hz y al final 2 segundos de silencio.
Introducción a la Programación del 8085A 292

Para resolver el problema se escribe una rutina denominada tono que genera
el número de tonos indicado por el registro L, con la frecuencia especificada por el
registro D. Observe que 8 ciclos de 320 Hz corresponden a un tiempo de 25 ms y 12
tonos de 480 Hz transcurren en este mismo lapso, de modo que se requieren 50 ms
para una combinación (8 tonos320Hz+12 tonos480Hz) de los ciclos de distinta frecuen-
cia. Para lograr el lapso de segundo se repiten 20 veces la combinación de 50 ms. Al
final se pone la salida del puerto a cero y se esperan 2 segundos antes de reiniciar la
transmisión de una nueva combinación de tonos.

;--------------------------------------------------------------------------------------------------------------------------
; Programa principal
;------------------------------------------------------------------- ------------------------------------------------------
lazo: mvi e,20 ; Se repiten veinte veces los tonos
; de 320 Hz y de 480 Hz
seguir: mvi l,8 ; Son 8 tonos de 320 Hz
mvi d,0dcH ; D = 0DCH para 320 Hz
call tono ; Generar 8 tonos de 320 Hz
mvi l,12 ; Son 12 tonos de 480Hz
mvi d,92h ; D = 92h para 480Hz
call tono ; Generar 12 tonos de 480Hz
dcr e ; Contador=Contador-1
jnz seguir ; No cero, seguir generando
xra a ; Lista las 20 veces, A a cero
out 0 ; Puerto de salida a cero
call ret2s ; Esperar 2 segundos de silencio
jmp lazo ; Repetir por siempre
;--------------------------------------------------------------------------------------------------------------------------
; Subrutina TONO
;------------------------------------------------------------------- ------------------------------------------------------
tono: mov h,l ; Mover a H el número de ciclos
tt: mvi c,2 ; Son dos semiciclos por tono
t1: out 0 ; Contenido del acumulador a puerto 0
cma ; Complementar acumulador
mov b,d ; Mover B frecuencia deseada
t2: dcr b ; Generar hasta contador de ciclos=0
nop
nop
jnz t2
dcr c
jnz t1
dcr h
jnz tt
nop
ret ; Retornar
;--------------------------------------------------------------------------------------------------------------------------
; Subrutina RET2S
;------------------------------------------------------------------- ------------------------------------------------------
ret2s: mvi d,5 ; Lazo interno se repite 5 veces
ret2_1: lxi b,0cb72h
ret2_2: dcx b
mov a,c
ora b
jnz ret2_2
Introducción a la Programación del 8085A 293

dcr d
jnz ret2_1
ret

Los semiciclos del tono generado tienen una duración ligeramente distinta:

Semciclo1 = ((B − 1) × 22 + 61) * 0.32µs Semciclo 2 = ((B − 1) × 22 + 69) * 0.32µs

B = 220 = 0DCH →= f = 319.98 Hz


B = 146 = 92H →= f = 480.03 Hz

La figura 6.38 muestra la conexión del parlante a la línea 0 del puerto de sali-
da 0.

Fig. 6.38 El transistor 2N2905 provee la corriente necesaria para activar la corneta de 8 Ω/0.125W.

El retardo de la rutina ret_2s viene dado por

{ [ ] }
Re tardo ret _ 2s = 0.32 µs × 18 + 7 + 10 + (D − 1) × (B − 1) × 24 + 21 + 4 + 10 + 1 + (B − 1) × 24 + 21 + 11 + 10

Re tardo ret _ 2s = 0.32 µs × 6249977 = 1.99999264 seg


Desarrollo y Simulación de Programas 294

Desarrollo y Simulación de Programas

La habilidad para escribir programas para microprocesadores proviene de la


comprensión que se tenga del conjunto de instrucciones del μP, de lo que cada una
de éstas hace, y fundamentalmente de la experiencia de quien programa. A diferencia
de la elaboración de programas en lenguajes de alto nivel, como C, ADA o Pascal, el
programador de microprocesadores debe conocer la arquitectura de la máquina en la
cual se ejecutará la rutina, debiendo entender como las instrucciones afectan al hard-
ware.

Para desarrollar una aplicación basada en µP se requiere que el equipo de di-


seño incluya personal con conocimientos de electrónica digital y de programación. En
este tipo de sistemas es usual que el desarrollo del código ejecutable represente una
inversión de tiempo y dinero superior al costo del diseño del soporte físico del siste-
ma. El reto principal a enfrentar por el programador es la selección del lenguaje de
programación del microprocesador. De hecho, el costo del desarrollo del soporte lógi-
co de la aplicación y la eficiencia del funcionamiento del producto final están deter-
minados por el lenguaje utilizado para programar el microprocesador.

7.1 EL LENGUAJE DE PROGRAMACIÓN


Para desarrollar un programa ejecutable por un microprocesador existen dos
opciones, usar: lenguaje de máquina o lenguaje de alto nivel. Los códigos en lenguaje
de máquina son los que puede ejecutar directamente el microprocesador, los escritos
en ensamblador, C o Pascal deben ser traducidos a código de máquina antes de ser
ejecutados.
Desarrollo y Simulación de Programas 295

El término lenguaje de máquina usualmente se asigna a la secuencia binaria de


instrucciones que ejecuta la CPU, mientras que lenguaje ensamblador identifica a la
representación simbólica del código binario de las instrucciones del procesador.

Un programa en lenguaje de máquina es una secuencia de instrucciones y da-


tos en binario, y es el código que la máquina entiende y ejecuta. Programar en código
ejecutable exige un conocimiento completo del conjunto de instrucciones del μP y de
la arquitectura de la máquina, debido a que cada instrucción en este lenguaje es una
indicación directa al hardware para que ejecute una operación.

Programar en código de máquina conduce a un control total sobre los recursos


que ofrece el sistema μC, a un manejo óptimo la memoria del sistema, además de
producir programas con alta velocidad de ejecución. La forma más primitiva de pro-
gramación en lenguaje de máquina implica la escritura de cada código de operación,
dirección o dato usando el sistema binario.

Tabla. 7.1 Código para generación de pulsos


Dirección Binario Hex Ensamblador

0200H 11010011 D3H OUT


0201H 00100000 01H 20
0202H 00101111 2FH CMA
0203H 00000110 06H MVI B
0204H 01000100 DBH DB
0205H 00000101 05H DCR B
0206H 11000010 C2H JNZ
0207H 00000101 05H 05
0208H 00000010 02H 02
0209H 00010001 11H LXI D
020AH 00000000 00H 00
020BH 00000000 00H 00
020CH 00010001 11H LXI D
020DH 00000000 00H 00
020EH 00000000 00H 00
020FH 00011110 1EH MVI E
0210H 00000000 00H 00
0211H 00000000 00H NOP
0212H 11000011 C3H JMP
0213H 00000000 00H 00
0214H 00000010 02H 02

La segunda columna de la lista de la tabla 7.1 es una representación en binario


de la rutina del ejemplo 6.34 del capítulo 6, la cual ha sido cargada en memoria a par-
tir de la dirección 200H. Inspeccionando esta secuencia de bytes es difícil determinar
que genera un tren de pulsos en las líneas del puerto de salida 20H. De hecho, la na-
turaleza binaria de los programas escritos en código de máquina implica gran dificul-
tad para escribirlos, entenderlos y modificarlos.
Desarrollo y Simulación de Programas 296

Una forma simple de facilitar el arduo camino que significa desarrollar pro-
gramas en lenguaje de máquina, consiste en usar el sistema de numeración hexadeci-
mal para la codificación de las instrucciones, tal como ilustra la columna tres de la
tabla 7.1. Aunque esto resulta en una versión simplificada del programa en binario, la
complejidad para entenderlo persiste. Algunos μC de uso didáctico aceptan la entrada
de instrucciones directamente en hexadecimal, por teclado o terminal, encargándose
el programa monitor de realizar la conversión a binario de las instrucciones, almace-
narlas en memoria y ejecutarlas.

El lenguaje de máquina no fue diseñado pensando en la comunicación con


humanos, y esto no es una falla del diseñador del μP. En realidad el código de máqui-
na permite expresar algoritmos de forma que puedan ser decodificados o interpreta-
dos por la unidad de control del µP.

La programación directa en código de máquina no debiera considerarse como


opción para el desarrollo del programa de aplicaciones basadas en µP, debido a las
considerables dificultades que supone escribir los códigos de operación y los datos
usando los sistemas de representación binario o hexadecimal. Para aprovechar las
ventajas de programar el µP usando su conjunto de instrucciones, es posible usar el
lenguaje simbólico o lenguaje ensamblador, constituido por los nemónicos de los có-
digos de operación de cada instrucción. Observe que con cierta destreza, es posible
deducir la función del programa con la información que se obtiene de la inspección
de la columna cuatro de la tabla 7.1.

7.1.1 Traducción de programas

Como recursos útiles para la escritura del software del sistema, existen pro-
gramas traductores que permiten realizar la conversión desde un archivo fuente en
lenguaje simbólico o de alto nivel, al código objeto ejecutable por la CPU. Un traduc-
tor es un programa que convierte secuencias de instrucciones de una forma a otra. Los
traductores abarcan interpretadores, ensambladores y compiladores y permiten al
programador expresar un algoritmo (instrucciones y datos) en un lenguaje adecuado
para la comprensión por parte de seres humanos.

Los traductores pueden distinguirse en dos grupos principales de acuerdo a la


operación que ejecutan al analizar el programa fuente, estos son:

• Interpretadores.

• Generadores.

Los interpretadores ejecutan directamente la operación resultante del proceso


de análisis del programa fuente. Para cada posible operación existirá una subrutina
para realizarla. Son programas fáciles de escribir pero son de lenta ejecución debido a
Desarrollo y Simulación de Programas 297

que toda instrucción del archivo fuente es analizada cada vez que ejecuta el progra-
ma, lo cual significa que la traducción es simultánea a la ejecución. En contraposi-
ción, los generadores crean un código objeto posible de ejecutarse en un tiempo pos-
terior a al conversión del programa fuente. En general, el término generador se aplica
a programas orientados a la máquina, como los ensambladores, mientras que los
orientados al usuario (C, Pascal, ADA) se les denomina compiladores. El código re-
sultado de la interpretación del programa fuente es de gran tamaño, debido a que debe
mantenerse en memoria no sólo la rutina a procesar sino también el programa kernel
encargado de interpretar y ejecutar el programa de usuario. Esta opción puede ser útil
para propósitos didácticos o puede ser usada durante el desarrollo del programa. Para
µPs de 8 bits existen interpretadores como el FORTH, BASIC y algún interpretador
C. Este tipo de traductor no se considera en este trabajo.

Fig. 7.1 Métodos de traducción de programas en un computador

Aunque los interpretadores no se recomiendan como una opción viable para el


desarrollo de programas para µPs, esto no significa que la técnica de interpretación no
sea utilizada. En realidad ambos métodos de traducción son ampliamente usados.
Como puede observarse en la figura 7.1, un interpretador por hardware se encarga de
Desarrollo y Simulación de Programas 298

trasladar las instrucciones en lenguaje de máquina a las acciones internas que resultan
en la ejecución del programa. También un interpretador traslada las instrucciones del
sistema de operativo a código de máquina.

La figura 7.1 muestra el uso de los métodos de compilación e interpretación


en un computador. El objetivo de la traducción es entregar como salida un programa
en el lenguaje de la máquina Los programas escritos en lenguaje ensamblador son
traducidos por el programa ensamblador a código de máquina. La compilación de un
programa fuente escrito en un lenguaje de alto nivel, produce como salida otro pro-
grama en lenguaje ensamblador, o directamente en código de máquina. En el primer,
caso debe usarse un ensamblador para la traducción final. Los programas del sistema
operativo son traducidos a lenguaje de máquina por un interpretador. Un interpretador
microprogramado se encarga de realizar la traducción desde el lenguaje de la máquina
a las operaciones internas que conducen a la ejecución de cada instrucción.

7.1.2 Lenguaje ensamblador o de alto nivel

Descartada la opción de programar el µP usando directamente el código nu-


mérico de máquina, la elección del lenguaje de soporte se reduce a dos posibilidades:
lenguaje ensamblador o de alto nivel. Este escenario se basa en que todo µP tiene al
menos una versión de ensamblador; y se supone la existencia de algún compilador
para el microprocesador usado en la aplicación.

Esta disyuntiva es un tema tradicional de discusión entre los programadores


de computadores, y es más polémico aun entre los diseñadores de sistemas empotra-
dos. En esta sección, no se pretende intervenir en tal controversia. Nuestro objetivo
no es seleccionar el mejor lenguaje para desarrollar soluciones basadas en µP, más
bien consiste en elegir el lenguaje más apropiado para escribir los programas inclui-
dos en una guía introductoria de sistemas microprocesadores. El interés es establecer,
¿Cuál lenguaje debe usarse en un curso de introducción a la programación de µPs?

El lenguaje de alto nivel más utilizado en la actualidad para programar µCtrls,


es el C. Existen compiladores C para todos los microcontroladores existentes en el
mercado y para microprocesadores de 8 bits como el Z80 y el 8085, entre otros. Una
encuesta realizada el año pasado entre los usuarios del sitio WEB
http://www.8052.com, reveló que el 52 % de los programadores de la familia de
µCtrls 8051 utilizan el lenguaje ensamblador, mientras que un 35 % programa en C.
El grupo restante, usa otros compiladores. Dada el extenso uso de la familia MCS-51
en aplicaciones industriales, es de suponer que esta proporción se mantiene para otros
dispositivos usados en sistemas empotrados.

El traductor denominado ensamblador se encarga de la conversión a lenguaje


de máquina del programa fuente escrito con los nemónicos que identifican a cada
instrucción de la máquina. Constituye un recurso que en la práctica, automatiza la
programación en código de máquina. En su forma más simple, los ensambladores
Desarrollo y Simulación de Programas 299

traducen cada instrucción del archivo fuente en una instrucción en código objeto, con
una correspondencia 1:1. Ensambladores más elaborados, realizan la traslación del
programa fuente de forma que éste puede ser enlazado con otros programas, antes de
la ejecución.

Además de admitir la utilización de nemónicos para identificar las instruccio-


nes, se pueden usar etiquetas para las direcciones, y los datos pueden ser expresados
en formatos diferentes al sistema binario. Estas posibilidades simplifican mucho el
desarrollo de un programa, mientras preserva las ventajas inherentes al uso de código
de máquina. Con ensamblador, pueden realizarse programas de miles de líneas de
código con un eficiente uso de la memoria y un aprovechamiento máximo de la po-
tencia del microprocesador. El programador mantiene un control total sobre la má-
quina, esto se debe a que las instrucciones hacen referencia explícita a la arquitectura
de computador. Por tal razón, es usual calificar el ensamblador como un lenguaje de
bajo nivel.

La separación entre el ensamblador y el lenguaje nativo del µP es sutil, la úni-


ca diferencia con el lenguaje de máquina es que los códigos de operación, operandos
y direcciones pueden representarse simbólicamente. Es una tradición suponer que un
programa escrito en ensamblador por un programador experimentado, produce un
código de menor tamaño y de más rápida ejecución que su equivalente realizado con
un interpretador o con lenguaje de alto nivel. No obstante, en modo alguno el ensam-
blador constituye la panacea para el desarrollo del soporte lógico del sistema. La es-
critura de un software extenso y complejo puede representar una tarea de larga dura-
ción y alto costo, mientras que el código resultante es difícil de entender, de mantener
y es no portátil por naturaleza.

Desde los inicios del desarrollo de los µPs han existidos compiladores de len-
guajes de alto nivel, como FORTRAN, COBOL o ALGOL, ejecutables en sistemas
basados en los µPs más populares. No obstante, el propósito de tales compiladores
era permitir el uso del µP como CPU de un microcomputador de propósito general
destinado al procesamiento de datos, siendo inapropiados para desarrollar programas
para proyectos de control.

Las primeras empresas en introducir lenguajes de alto nivel dedicados al desa-


rrollo del software de aplicaciones específicas, fueron INTEL y MOTOROLA con los
compiladores PLM80 para la familia 8080 y MPL para el µP 6800. Esta tendencia ha
proseguido hasta la fecha. Las compañías fabricantes de dispositivos y otras empresas
de diseño de software ofrecen compiladores destinados a ser usados como recurso de
primera línea en la fase de diseño de aplicaciones.

La programación en lenguaje de alto nivel reduce significativamente el tiempo


de desarrollo y produce programas más fáciles de entender y de mantener que sus
equivalentes en ensamblador. En general, el código resultante de la compilación es de
mayor tamaño y de ejecución más lenta que el generado por el ensamblador. El uso
de compiladores ofrece cierto grado de portabilidad. Un programa escrito un µP en
Desarrollo y Simulación de Programas 300

lenguaje C, puede ser usado para otro dispositivo si se compila con el traductor co-
rrespondiente. La salida de un compilador puede ser un archivo en lenguaje ensam-
blador, el cual debe ser traducido a código de máquina; o puede entregar en forma
directa el código ejecutable, a expensas de la simplicidad del traductor y de la veloci-
dad de compilación.

En esta breve discusión se han establecido de modo muy general que las ven-
tajas del ensamblador sobre los compiladores son dos: produce un código que requie-
re menos memoria para almacenarse y el programa es de ejecución rápida. Si estas
dos cualidades del ensamblador fuesen irrefutables, no existiría ninguna duda sobre
cual lenguaje emplear para el desarrollo de sistemas empotrados. Esto debido a que
en este tipo de aplicaciones se dispone de recursos limitados, principalmente memoria
y es usual que el sistema este sometido a restricciones de tiempo críticas.

Lo cierto es, que lo afirmado en el párrafo anterior sobre el rendimiento del


ensamblador relativo a los compiladores, ha sido devastadoramente cierto hasta hace
algunos años. En nuestros días, el panorama se ha visto modificado con la aparición
de compiladores más sofisticados. Los diseñadores de los nuevos lenguajes de alto
nivel para sistemas empotrados, han introducido técnicas de optimización en la com-
pilación, las cuales toman en consideración la limitación de recursos inherentes a ta-
les aplicaciones. Estos traductores novedosos, permiten que el usuario seleccione si
debe intentarse que el código a generar sea optimizado para reducir el tamaño o para
aumentar la velocidad de ejecución.

En los compiladores actuales se incorpora a la estructura del traductor una


sección que optimiza el código intermedio reorganizando las estructuras de lazo y
optimizando la evaluación de expresiones. La etapa final de la compilación es el ge-
nerador de código que produce el programa objeto en lenguaje de máquina. La nueva
generación de compiladores ha reducido en forma notoria la distancia existente entre
el código producto del ensamblaje y el obtenido por compilación. Esto significa que
actualmente es posible obtener, usando lenguajes de alto nivel, programas de tamaño
relativamente pequeños.

Una consideración de interés en esta discusión es la productividad del pro-


gramador. Está demostrado que un programador produce un determinado número de
líneas de código en el tiempo, independientemente del lenguaje de programación uti-
lizado. Debido a que una línea de un archivo fuente de alto nivel corresponde a n (3 a
10) instrucciones en ensamblador, la eficiencia de un programador en un lenguaje
compilado supera en n veces la de aquel que usa ensamblador. Además, los progra-
mas en alto nivel son sencillos de comprender y simples de mantener, incluso por
personal distintos a los autores del programa. Entonces, la pregunta es: se justifica
programar en ensamblador.

La respuesta es: si... sin duda alguna. Antes de alegar alguna razón, es preciso
destacar como un hecho que un buen programador en ensamblador es capaz de afinar
un programa, o una sección de éste, de forma tal que se obtenga el código más rápido
Desarrollo y Simulación de Programas 301

posible. En algunos casos, puede que esto implique un trabajo excesivo y que no se
justifique el esfuerzo y tiempo dedicado en perfeccionar el código.

En otros proyectos, principalmente durante el desarrollo de sistemas empotra-


dos, existe la posibilidad que la velocidad de ejecución del código de la aplicación
constituya un factor crítico para el desempeño del sistema. Es común que en estas
aplicaciones. Algunas acciones de control en tiempo real sean realizadas por el pro-
grama. Es obvio, que programando en ensamblador tiene un absoluto conocimiento y
control sobre el tiempo de ejecución de las instrucciones y lazos, siendo más sencillo
la realización de retardos precisos o la generación de eventos de duración específica.
La programación en lenguaje de alto nivel hace difícil el seguimiento de la duración
de la ejecución de procedimientos e instrucciones. Esto introduce cierta vaguedad en
la posible respuesta del programa a eventos externos en tiempos especificados como
críticos.

Otro factor que justifica programar en ensamblador se relaciona con el apro-


vechamiento de la capacidad de la memoria EPROM (EEPROM) de la aplicación. Si
este recurso está muy limitado, un buen programa en ensamblador puede reducir la
capacidad necesaria para almacenar los programas y los datos. A pesar de la habilidad
del compilador para optimizar el código para tamaño y velocidad, estos traductores
no siempre son capaces de determinar cuando una sección del código puede ser susti-
tuida por una simple instrucción. Un programador en código de máquina, a diferencia
del compilador, entiende el algoritmo en desarrollo y conoce la estructura y la más
recóndita instrucción del programa, en tal forma que es capaz de lograr que seccio-
nes de código sean más eficientes, como recompensa a una buena dosis de coraje y a
un gran esfuerzo.

Pareciera que la opción apropiada es recurrir a la programación en lenguaje de


alto nivel cuando, para una aplicación específica, el tiempo de ejecución de las tareas
no sea un factor determinante y en caso contrario, utilizar lenguaje ensamblador. En
realidad existe una tercera posibilidad que representa una solución más conveniente
para programar el sistema. Esta consiste, en utilizar una técnica mixta que explote la
potencia de ambos lenguajes. Con este método, casi todo el programa se escribe en
lenguaje de alto nivel y las rutinas de tiempo crítico se programan en ensamblador.

La eficiencia de la utilización de la técnica mixta está basada en el principio


de localidad de las referencias. Este establece que durante la ejecución de un progra-
ma el procesador hace referencias frecuentes a un conjunto de instrucciones almace-
nadas en un área pequeña de la memoria. Esto es cierto para espacios cortos de tiem-
po, en lapsos largos puede cambiar la secuencia de código que se repite, pero la vali-
dez del principio se mantiene. En síntesis, el µP invertirá la mayor parte del tiempo de
ejecución en procesar una pequeña sección del código. Si el 90% del tCPU se invierte
en ejecutar el 10% del programa, esta parte del código se programa en ensamblador.
El 90% restante del programa, responsable del 10% del tCPU, se escribe en lenguaje de
alto nivel.
Desarrollo y Simulación de Programas 302

Lo usual es que durante el desarrollo del software, el programa integro se es-


cribe en lenguaje de alto nivel. El programa se ejecuta y se detectan las secciones de
código a las cuales se dedica el mayor tCPU, y se reprograma en ensamblador. Como
resultado se obtiene un programa con velocidad de ejecución comparable al escrito en
ensamblador y con costo de desarrollo mucho menor.

Parece evidente que pese a las desventajas inherentes a la programación en


lenguaje ensamblador, es necesario que el estudiante conozca el lenguaje. Las razones
son varias y algunas han sido mencionadas. Para cerrar esta discusión se mencionan
tres:

• Una mejora en la velocidad de ejecución en el código crítico de una aplicación puede ser la
única opción para la viabilidad del proyecto. De modo que el programador debe estar en ca-
pacidad de escribir esta sección del programa en ensamblador.

• La segunda razón se apoya en que las rutinas de librería de los lenguajes de alto nivel deben
escribirse en ensamblador.

• Finalmente, la salida del compilador puede ser un programa en ensamblador, lo cual signifi-
ca que para que comprender el funcionamiento de los compiladores debe estudiarse el en-
samblador.

Al ser el material que se presenta, una guía para el aprendizaje de los funda-
mentos de sistemas de microprocesadores, el uso del lenguaje ensamblador es una
necesidad ineludible. El tipo de problemas a resolver usando el µP, usualmente tienen
restricciones de tiempo y el código a desarrollar no es necesariamente muy extenso.
Usando el ensamblador, el estudiante se mantendrá en contacto continuo con la arqui-
tectura de la CPU y se enfrentará a la programación directa de circuitos programables
de interconexión de E/S.

La forma en que el programador en ensamblador debe manipular los registros


del µP, la memoria del sistema y los dispositivos de E/S permitirán al estudiante ad-
quirir una base sólida en programación de µPs, además de hacer más fácil la tarea de
programar en lenguajes de mayor nivel y de capacitarlo para la escritura de rutinas
para la librería del compilador. Para finalizar la discusión sobre el nivel del lenguaje a
utilizar para programar el µP, considere el ejemplo 6.33. Este ejercicio presenta un
código escrito en ensamblador para calcular el valor de y, por medio de la expresión:

159 ⋅ 30000
y = 159 ⋅ x = y = 159 ⋅ 3 =
100

El algoritmo usado para hallar la raíz cuadrada de N es:

1⎛ N ⎞
x n +1 = ⎜ + xn ⎟
2 ⎝ xn ⎠
Desarrollo y Simulación de Programas 303

El programa principal MAIN y las subrutinas MUL168, DIV1616 y RAÍZ es-


critas en ensamblador comprenden aproximadamente 79 líneas de código. El archivo
ejecutable ocupa 118 bytes de memoria. Una versión de este programa fue realizada
usando el compilador MICRO-C para el 8085 y se muestra a continuación.

Ejemplo 6.33 escrito en lenguaje C

int N,x,xn,y;
main ()
{ x=3*10000;
N=x;
xn=(x+1)>>1;
while (x != xn)
{ x=xn;
xn=(N/x+x+1)>>1;
}
y=(159*x)/100;
}

Como se observa se requieren sólo diez líneas de código, pero el archivo ge-
nerado por el compilador C ocupa 471 posiciones de memoria. Esto significa que el
uso de MICRO-C genera un código objeto con cuatro veces el tamaño que el resultan-
te de usar el ensamblador.

7.1.3 El formato HEX-INTEL

Las opciones de compilación, ensamblaje y enlazado de las herramientas para


desarrollo de programas para microprocesadores, permiten seleccionar el formato del
archivo que contiene el código que va a ser grabado en EPROM. Uno de los más usa-
dos es el formato HEX INTEL. Este estándar, permite que el proceso de programación
se realice en un PC y que el código sea cargado en la tarjeta prototipo y ejecutado
desde la memoria RAM. También el archivo en formato HEX INTEL puede ser con-
vertido a binario y cargado en un simulador del µP o en un grabador de EPROM. Un
programa en formato HEX, es un archivo ASCII el cual contiene un registro por línea.
Un ejemplo se muestra a continuación,

:10000000213F00460548237E23BEDA120056772B97
:10001000722305C207000D41C21C0076214000C3B7
:020020000700D7
:0A003F0009082345677D889099F5B4
:00000001FF

Fig. 7.2 Archivo HEX INTEL


Desarrollo y Simulación de Programas 304

Cada uno de los registros del archivo de la figura 7.2 tiene el formato indicado
en la tabla 7.2. Aislando los campos de la línea tres del archivo ejemplo, se obtiene:

:020020000700D7
: Marcador de registro.
02 Longitud del registro. Dos bytes de datos.
0020 Dirección de carga 0020H, 0021H.
00 Tipo de registro: datos.
0700 Datos.
D7 Byte para verificación por suma total.

La línea se inicia con el carácter dos puntos, señalando que corresponde a un


registro en el formato HEX INTEL. Los siguientes dos caracteres (02H) indican que la
línea contiene 2 bytes de datos, los cuales deben ser cargados a partir de la dirección
0020H. El próximo par de caracteres: 00H, informa que la línea es un registro de da-
tos. El primer byte de dato es 07H y el último es 00H. Los últimos dos caracteres
D7H son el checksum de la línea. Para calcular el byte de verificación se realiza la
suma hexadecimal:

02 + 00 + 20 + 00 + 07 + 00 = 29H

El complemento dos de 29H es D7H


29H + D7H = 0

Tabla. 7.2 Formato HEX INTEL.

CARÁCTER DESCRIPCIÓN

1 Marcador de registro: El primer carácter de una línea siempre es ‘:’ para identificar el
inicio de un registro.

2-3 Longitud de registro: El número de bytes de datos expresado con dos dígitos hexadecima-
les. No incluye los nueve primeros ni los dos últimos caracteres de la línea.

4-7 Dirección: Este campo indica la dirección de memoria donde se cargaran los datos. Se
expresa con cuatro dígitos hex (0000H-FFFFH)

8-9 Tipo de registro: Estos dos caracteres identifican el tipo de registro para la línea. Los más
comunes son:
00 Registro de datos
01 Registro de fin de archivo
02 Registro de direcciones de segmento extendido

10Æ Datos: A partir del décimo carácter se encuentran los bytes de datos útiles. Esta es la
información a cargar en la EPROM o en la memoria del simulador o emulador. Se repre-
senta como dos dígitos hex.

Dos últimos Checksum: Este campo es la verificación por suma total para la línea. Se obtiene calcu-
lando el complemento dos de la suma sin acarreo de todos los bytes anteriores de la línea
exceptuando el marcador de registro (:)
Desarrollo y Simulación de Programas 305

En la figura 7.3 se muestra el archivo HEX generado por el ensamblador para


el programa del ejemplo 6.32 y la figura 7.4 presenta la salida de compilador C para
el mismo programa.

:0E0000001110270E03CD1700CD4F000E9FCD1F
:09000E0017000E64EBCD2B007607
:0E0017007906080E00616C298FD22500198928
:0600250005C21E004FC9D8
:0E002B003E10210000EB29EBD23B00292CC334
:0E0039003C00291CF57D996F7C9867D2490028
:080047001D09F13DC23000C9A2
:0E004F002230087C0F477D1F4F2A3008EBCD72
:0E005D002B00606919237C1F577D1F5F78BA46
:0B006B00C2710079BBC8424BC35800B3
:00000001FF

Fig. 7.3 Salida del ensamblador para el programa del ejemplo 6.33.

:20400000310060AF32E341CD6A41CF396EC9E56069C139716069C9397E23666FC9E5606982
:20402000C1397123706069C9EB5E23562BEBC9EB7323722BEBC97E23666FC97D02037C023E
:20404000C97D079F67C9EB4E23462378B1CA5E407E23BBC258407EBA23C24740C5C97E2365
:20406000666FE92B7C2F677D2F6FC97CB5210000C023C979956F789C67C9D5EB2100007B46
:204080000FD2854009A77A1F577B1F5FB2CA9A4079174F781747B1C27F40D1C9CDA24060FB
:2040A00069C9D5EB2100003E1132D741A779174F7817473AD7413DCAD84032D7417D176F3A
:2040C0007C1767BADAAC407DC2CF40BBDAAC40936F7C9A6737C3AD40D1C979A56F78A46787
:2040E000C979B56F78B467C979AD6F78AC67C97CB5CAFF40A7781F47791F4F2DC2F44060EC
:2041000069C97CB5CA1241A779174F7817472DC207416069C9CD5F41C82BC9CD5F41C02B79
:20412000C9E56069C1CD4F41D82BC9CD4F41D8C82BC9CD4F41D02BC9E56069C1CD5F41D858
:204140002BC9CD5F41D8C82BC9CD5F41D02BC978ACF25F41210100A0FA5D41B5C937C97833
:20416000BCC2664179BD210100C921307522DD412ADD4122DB412ADD41444D210100094425
:204180004D210100CDEF4022DF412ADF4122DD417CB5CAC0412ADF4122DD412ADB41444D8B
:2041A0002ADD41CD9C40444D2ADD4109444D21010009444D210100CDEF4022DF41C38A41F1
:1741C0002ADD41444D219F00CD7A40444D216400CD9C4022E141C9FC
:00000001FF

Fig. 7.4 Salida del compilador MICRO-C 8085 para la versión en C del ejemplo 6.33.

Es notable que el tamaño del código generado por el compilador C sea mucho
mayor que el correspondiente en ensamblador. En realidad el compilador MICRO-C
tiene algunas deficiencias. Compiladores C para el 8085, con costo elevado, utilizan
técnicas de optimización que disminuyen el tamaño del código de salida.

Aunque los compiladores modernos y las nuevas arquitecturas de los micro-


controladores intentan día a día que el archivo de salida ocupe menos espacio en me-
moria, y además se ejecute a mayor velocidad, puede considerarse que los ensambla-
dores se mantienen como líderes en la competencia de generar código pequeño y de
velocidad alta. El autor comparó, usando una rutina de prueba, el código generado
por el ensamblador y el compilador C de un microcontrolador MCS-51. A pesar que el
traductor C se ofrece como un compilador moderno, se mantuvo la diferencia de ta-
maño entre los archivos generados por ambas herramientas.
Desarrollo y Simulación de Programas 306

7.2 ESTRUCTURA DEL PROGRAMA

Para realizar el proceso de representar un algoritmo como un programa capaz


de realizarlo, el programador debe prestar especial atención al uso de técnicas que
faciliten el desarrollo de diagramas de flujo y de programas. Entre estas técnicas se
consideran,

1. Programación modular. El programa está compuesto por procedimientos o módulos cada


uno de los cuales realiza una función específica. Cada módulo puede ser escrito, codifica-
do y probado en forma independiente.

2. Diseño hacia abajo. Al inicio se define la función global del programa (módulo principal)
como un conjunto de subfunciones generales (módulos específicos). A continuación el di-
seño continúa en descenso hasta cuando cada subfunción es definida y los módulos son
programados.

3. Código estructurado. Para escribir el programa se usan sólo ciertas estructuras lógicas de
programación. Tales formas lógicas pueden constituir lazos de código o estructuras condi-
cionales

7.2.1 Programación modular

Consiste en seccionar el programa en rutinas, las cuales pueden ser escritas y


probadas por separado para posteriormente ser integradas en un programa capaz de
resolver el problema propuesto originalmente. Cada uno de los módulos en los cuales
se divide el programa debe tener una entrada y una salida, y debe realizar una función
única, la cual debe ser independiente de las que realizan los otros bloques del pro-
grama. La comunicación entre módulos debe ser mínima.

Los módulos se programan usando procedimientos. Dependiendo de la com-


plejidad de la tarea que realice un módulo específico, éste puede contener más de un
procedimiento. Esta técnica simplifica en forma notable el proceso de diseño y el
mantenimiento ulterior de los programas. El desarrollo de un programa extenso y
complejo se facilita si el código es separado en bloques funcionales que contengan un
número relativamente pequeño de instrucciones. No existen reglas totales para la pro-
gramación modular con relación al número de líneas que debe tener un módulo para
formar parte de un programa eficiente. Sólo deben cumplirse con tres reglas básicas
al escribir cada módulo. Este debe,

1. Realizar una función única.

2. Contener todas las instrucciones necesarias para llevarla a cabo.

3. Tener una entrada y una salida


Desarrollo y Simulación de Programas 307

La técnica de programación modular disminuye el tiempo de desarrollo de un


programa, al separar la función global del código en tareas pequeñas realizadas por
subprogramas cortos, mas simples de escribir y de depurar que un programa extenso.
Las unidades de código pueden ser escritas por más de un programador y en forma
independiente.

Debido a que las fallas de posible aparición durante el proceso de depuración


de un programa son especificas de cada módulo, éstas son fáciles de encontrar y co-
rregir. Una vez verificados los módulos en forma independiente, éstos son enlazados
y relocalizados para formar un bloque único de código, el cual puede ser cargado en
memoria y ejecutado.

Otra ventaja de la programación modular es patente cuando un programa des-


arrollado y en operación debe ser modificado. Esto puede responder a que un proce-
dimiento particular debe ser reformado o que nuevos módulos deben ser incluidos. En
ambos casos, los cambios necesarios pueden realizarse sin afectar al resto de los ar-
chivos del programa. Finalmente, la programación de rutinas funcionales permite
establecer una biblioteca de procedimientos factibles de ser usados en programas fu-
turos.

Los beneficios obtenibles por el diseñador con la utilización de la técnica de


programación modular son de tal proporción, que ésta técnica ha sido adoptada como
un recurso de presencia obligada durante el proceso de diseño y escritura del software
de soporte de aplicaciones basadas en microcontroladores y microprocesadores. No
obstante, pueden señalarse algunos puntos débiles del uso de módulos, pero que en
modo alguno pueden considerarse desventajas significativas.

La programación modular requiere de sostén extra de programas para desarro-


llo. Los procedimientos individuales deben ser relocalizables y debe disponerse de
un programa enlazador (linker). La cesión del control del programa a los módulos
consume tiempo de CPU y memoria. Además, es necesario escribir rutinas para de-
puración de los módulos, los cuales son verificados antes de la prueba del programa
final.

7.2.2 Diseño hacia abajo

Este método de diseño descendente permite organizar el programa como un


conjunto de bloques de código relacionados en forma jerárquica. Un módulo particu-
lar está constituido usualmente por un procedimiento, pero no siempre es de este mo-
do. En la práctica cualquiera sección de código que realice una función específica,
puede ser un módulo.

Cada rectángulo del diagrama de tres niveles de la figura 7.5 corresponde a un


módulo del programa. En el nivel superior se encuentra el programa principal, el cual
para realizar la tarea llama a 10, 20 y 30, ubicados en el nivel 1. La subtarea ejecutada
Desarrollo y Simulación de Programas 308

por el módulo 10 requiere que éste llame a 11, 12 y 13; mientras que 20 usa a 21 y 22.
El módulo 30 no llama a ningún procedimiento.

Fig. 7.5 Organización jerárquica de los módulos

Una vez establecida la tarea que debe realizar el programa, como resultado de
la suma de pequeñas subtareas propuestas en forma general, el proceso continúa con
la progresiva sustitución de cada proposición con secuencias específicas de código.
1. La primera fase del diseño consiste en escribir y depurar el módulo principal, el cual incluirá las
llamadas necesarias a los módulos restantes del programa. Para la prueba, cada rutina puede
substituirse por un código auxiliar que entregue la misma respuesta que debería entregar el sub-
programa codificado y verificado.

2. Durante la segunda fase, cada módulo es codificado y depurado. Una vez verificado un módulo,
el código auxiliar correspondiente es sustituido por el código operativo.

3. Codificados todos los módulos, se prueba el programa final.

La ventaja más resaltante del método de diseño en descenso es que no requiere


codificar y probar todos los módulos y posteriormente realizar la prueba del progra-
ma. Esta técnica convierte el proceso de desarrollo de un programa en una serie de
etapas donde se mezclan la escritura y depuración de secciones de código. Existen
algunos defectos que pueden afectar negativamente los resultados obtenibles al apli-
car esta técnica. Es obvio que la escritura de los programas auxiliares puede ser una
labor compleja y en casos extremos, imposible de realizar.

El módulo principal debe se cuidadosamente definido, escrito y depurado.


Cualquier error en el diseño o escritura de esta sección causará resultados fatales en la
eficiencia u operatividad del programa desarrollado.

7.2.3 Código estructurado

El uso de programación estructurada como método de desarrollo de progra-


mas es una vía para eludir el uso indiscriminado de instrucciones tipo GO TO, debido
Desarrollo y Simulación de Programas 309

a que este comando de bifurcación resulta en el desarrollo de programas confusos y


difíciles de analizar. Para escribir un programa eficiente no se requieren estructuras
complejas de control. La aplicación práctica de teoremas de estructura ha verificado
que un programa con cualquier grado de complejidad puede ser desarrollado sin el
uso de instrucciones GO TO concibiéndolo en términos de tres estructuras lógicas de
control básicas: secuencial, condicional y lazos. Considerando las variantes de las
estructuras condicionales y lazo, se tienen cinco tipos comunes de formas lógicas
simples, ampliamente usadas en lenguajes de programación de alto nivel. Estas son:

1. SECUENCIAL
2. IF-THEN/ELSE.
3. CASE.
4. WHILE-DO.
5. REPEAT-UNTIL.

La programación estructurada requiere un lenguaje en el cual las estructuras


de control puedan ser codificadas. En la práctica, existe cierta dificultad para pro-
gramar en forma estructurada usando lenguaje ensamblador, debido a que la cons-
trucción de lazos y proposiciones CASE en este lenguaje, implica el uso de instruc-
ciones de salto. A pesar que es imposible alcanzar el nivel de estructuración posible
en lenguajes de alto nivel, es factible el uso de código estructurado en programas en
ensamblador.

Toda sección de código que realice una tarea representada por la realización
de una acción especifica y distinguible, tendrá una entrada y una salida y las instruc-
ciones se ejecutarán tal como están almacenadas consecutivamente en memoria. Una
tarea o proceso puede consistir de: una operación de lectura de un puerto de entrada
para adquirir datos provenientes de un convertidor análogo digital, la carga inmediata
de un valor en el acumulador o de una secuencia de código que programe convenien-
temente los dispositivos de E/S conectados al sistema.

También representa un proceso: un programa completo o una sección de este


que resuelva un problema matemático o ejecute algún tipo de procesamiento de datos.
En cualquier caso, el procesamiento se inicia en la entrada de la rutina, ejecutándose
cada instrucción hasta la finalización del programa.

Estructura secuencial

Las instrucciones del programa son ejecutadas en el orden que aparecen en el


listado o lo que es igual se procesan instrucciones almacenadas en posiciones sucesi-
vas de memoria. En la figura 7.6 se muestra la secuencia de ejecución de tres proce-
sos.
Desarrollo y Simulación de Programas 310

Fig. 7.6 Estructura secuencial.

Los procesos individuales pueden tener un nivel de complejidad interna varia-


ble. Una tarea particular puede ser realizada por una instrucción simple o puede ser
necesaria una secuencia larga o compleja de instrucciones para programarse la tarea.
Si cada proceso corresponde a una instrucción, el programa completo descrito por la
figura 7.5, constará de tres instrucciones.

En las otras estructuras de programación, una proposición fija las condiciones


que se requieren para el control de la dirección de ejecución del programa. Cuando se
ejecuta la proposición, se prueba una condición y se transfiere el control hacia una de
dos vías, de acuerdo con el resultado de la prueba. Dependiendo de la estructura bási-
ca, la transferencia puede producir dos acciones: en un caso, el resultado de la prueba
conduce a la ejecución de un proceso determinado, o la salida del módulo; en el otro,
se selecciona uno de dos más procesos posibles. En ambos modos la culminación de
la ejecución del código implica la salida de la rutina.

La utilización de éstas estructuras lógicas simplifica el desarrollo de progra-


mas, al sentar las base de la técnica de programación estructurada, en la cual un con-
junto de módulos, con una entrada y una salida, se combinan para formar algoritmos
lógicos más complejos, los cuales también disponen de solo una entrada y una salida.
El resultado es el desarrollo de programas más eficientes, fáciles de entender y de
modificar.
Desarrollo y Simulación de Programas 311

Estructura IF-THEN/ELSE

Un elemento de decisión es usado para aprobar la ejecución de un proceso o


para seleccionar entre la ejecución de uno de dos procesos. En el primer caso la es-
tructura se reduce a IF-THEN. La forma general de la proposición es,

IF condición 1 THEN proceso 1


ELSE proceso 2

En la figura 7.7 se muestra el algoritmo de esta estructura de código y en el


ejemplo 7.1 se presenta el listado de n programa que usa la estructura lógica IF-
THEN/ELSE.

(a) (b)

Fig. 7.7 Estructuras de control: a) IF THEN. b) IF-THEN/ELSE

Ejemplo 7.1

Usando la estructura lógica IF-THEN/ELSE, escriba un programa para activar


la bandera de acarreo e iluminar un LED conectado al bit 7 del puerto de salida 20H,
si el dato en el puerto de entrada 20H corresponde al caracter ASCII ‘R’. En caso
contrario el indicador de acarreo debe ser 0 y se activará un LED conectado al bit 3
del mismo puerto de salida.
Desarrollo y Simulación de Programas 312

En la figura 7.8 se muestra el diagrama de flujo del código y a continuación el


listado del programa.

in 20h ; Lee el puerto 20h.


cpi 52h ;Compara el contenido de a con ‘r’.
jnz noesr ; Salto si el caracter no es ‘r’.
stc ; Cy=1.
mvi a, 80h ; Bit 7 del a a 1.
jmp led ; Salto a escribir en puerto 20h.
noesr: stc ; Cy=1.
cmc ; Se complementa cy
mvi a, 08 ; Bit 3 del a a 1.
led: out 20h ; Se escribe en puerto de salida 20h.
hlt

Fig. 7.8 Diagrama de flujo del programa del ejemplo 7.1

Una vez realizada la lectura del puerto 20H se compara el valor en el registro
acumulador con el código 52H. El elemento de decisión es el estado del bit de cero Z,
el cual es probado con una instrucción JZ de salto condicional, para determinar la
secuencia de instrucciones a ejecutarse, entre dos posibilidades. Observe que al reali-
zarse la tarea correspondiente se produce la salida del programa.
Desarrollo y Simulación de Programas 313

Estructura CASE

Es usual que un programa deba seleccionar la realización de una tarea dentro


de un grupo de opciones. Para codificar una estructura de selección múltiple existen
dos caminos: el primero es utilizar varias proposiciones IF-THEN y una IF-
THEN/ELSE, de la forma,

IF condición 1 THEN proceso 1


IF condición 2 THEN proceso 2
IF condición 1 THEN proceso 3
.
.
.
ELSE proceso n

Fig. 7.9 Selección múltiple

Se ejecutará el proceso correspondiente a la condición que sea verdadera. Una


vez realizada la tarea seleccionada se sale del programa. Si ninguna condición es ver-
dadera se ejecuta el último proceso. Este tipo de selección puede complicar innecesa-
riamente un programa. La estructura CASE es la segunda vía disponible para selec-
ción múltiple. La proposición CASE permite que el valor de una variable entera entre
0 y n, determine cual de varios procesos debe ser ejecutado. El valor índice puede ser
Desarrollo y Simulación de Programas 314

resultado de la evaluación de una expresión o puede ser suministrado por un periféri-


co. La forma de la proposición CASE es,

CASE variable
proceso 0
proceso 1
.
.
.
proceso n

Fig. 7.10 Estructura CASE

Para el caso igual a i se ejecuta el proceso i, al culminar la ejecución de la ta-


rea seleccionada, el control abandona la rutina. Si el valor índice es mayor que n, el
comportamiento de la proposición CASE es impredecible, auque puede programarse
algún código de protección contra tal eventualidad.

Suponga ahora que desee escribir una rutina con estructura CASE para ejecu-
tar uno de cuatro procesos diferentes, según indique un número binario almacenado
en el registro E, este dígito puede ser: 0, 1, 2, ó 3. Para codificar la proposición CASE
se usará una tabla de saltos almacenada en memoria, la cual contiene las direcciones
de inicio de los cuatro procesos. Los dos primeros bytes de la lista contienen la direc-
ción de inicio de la rutina correspondiente al proceso 0, y así sucesivamente. Los
Desarrollo y Simulación de Programas 315

elementos de la tabla ocupan 8 bytes de memoria. Conocido el proceso a ejecutar se


debe encontrar la dirección del proceso en la tabla.

Para el acceso a la tabla se programa un modo de direccionamiento conocido


como base más desplazamiento, donde la base representa la dirección de inicio del
arreglo de datos, mientras que el desplazamiento señala la ubicación relativa en el
arreglo de un elemento de 16 bits. Si llamamos i el número del proceso a ejecutar, su
dirección en la tabla estará a partir de la posición de memoria base + 2*i, como indi-
ca la tabla 7.3.
Tabla 7.3 Ubicación de las direcciones de salto
Dirección en la tabla
Proceso Byte alto Byte bajo
0 base+1 base
1 base +3 base+2
2 base +5 base+4
3 base +7 base+6

Observe que si nos ubicamos en el inicio de la tabla, bastará desplazarse dos


veces el valor del número binario de entrada, para apuntar la dirección de inicio del
proceso. Esto significa que si el número es 3, basta con ir a la dirección base+6 para
encontrar el byte de orden bajo de la dirección de salto.

Ejemplo 7.2

Escribir un programa con estructura CASE utilizando una tabla de saltos. El


número de la tarea a ejecutar se encuentra el registro E de 8 bits.

Conviene utilizar direccionamiento indirecto por registro para acceder a la ta-


bla. La posición del elemento seleccionado en la tabla está almacenada en el registro
par HL. Para crear la dirección se carga la base del arreglo en HL y se le suma dos
veces el valor del número del proceso, obteniéndose la dirección en HL. Con este
registro apuntando la posición deseada se transfiere desde la memoria hasta el regis-
tro DE la dirección de la posición de que contiene la rutina. Esta información se
transfiere a HL y finalmente al contador de programa, haciéndose efectiva la ejecu-
ción del proceso.

mvi d,0; ; Byte alto del desplazamiento de la tabla a cero.


lxi h, tabla ; Cargar hl con la base de la tabla.
dad d ; Sumar el desplazamiento a la base de la tabla.
dad d ; Sumar de nuevo
mov e,m ; El byte bajo de la dirección de salto en e.
inx h ; HL apunta a dirección siguiente.
mov d,m ; El byte alto de la dirección de salto en d.
xchg ; Intercambiar los contenidos de hl y de.
pchl ; Saltar al proceso.
Desarrollo y Simulación de Programas 316

Para garantizar que la estructura CASE tenga una entrada y una salida, cada
rutina de proceso debe asegurar que una vez ejecutado, el control de programa vaya a
la misma dirección de la memoria. Aunque las dos últimas estructuras de control se
discuten en el capitulo 6, para mantener la continuidad, se repiten aquí.

Estructura DO-WHILE

Las instrucciones de salto permiten el establecimiento de lazos de programa-


ción, en los cuales un grupo de instrucciones se ejecutan repetidamente mientras una
instrucción de salto condicional se encarga de controlar la repetición y salida del lazo.

Fig. 7.11 Estructura DO-WHILE.

En esta estructura la condición al inicio del lazo es repetidamente evaluada, y


el resultado de la prueba indicará si se debe ejecutar el lazo o salir de este. Cuando se
utiliza un contador podría concebirse como ejecute el proceso mientras el contador
sea distinto de cero. En tanto esta condición sea cierta, la tarea se realizará repetida-
mente. Cuando el contador llegue a cero, la condición será falsa y se saldrá del pro-
grama.

Ejemplo 7.3

Este programa transfiere un bloque de 16 datos desde una zona de memoria


con dirección de inicio en DORG, hasta otra área con dirección de inicio DDES. En
este caso el lazo debe repetirse 16 veces para lograr la transferencia del bloque de
datos de 16 bytes. Pero, debido a que el contador se decrementa antes de la ejecución
del primer lazo, el contador debe cargarse con un valor N, siendo (N-1) el número de
veces que debe repetirse el lazo.
Desarrollo y Simulación de Programas 317

lxi h,dorg ; Cargar en hl la dirección de inicio del bloque origen.


lxi d,ddes ; Cargar en de la dirección de inicio del bloque desti no
mvi b,17 ; Inicializar el contador de número de datos a mover.
lazo: dcr b ; Disminuir contador.
jz salir ; Si el último dato fue transferido, salir de la rutina.
mov a,m ; Leer un dato desde el bloque origen.
stax d ; Transferir el dato al bloque destino.
inr l ; Incrementar apuntador de bloque origen.
inr e ; Incrementar apuntador de bloque destino
jmp lazo
salir:

Estructura REPEAT-UNTIL

En este tipo de proposición, el control entra al lazo y el proceso es ejecutado


incondicionalmente, posteriormente se prueba la condición y dependiendo del resul-
tado se repite el lazo o se abandona este. A diferencia de la estructura DO-WHILE en
la cual es posible que el lazo nunca se ejecute, en REPEAT-UNTIL se ejecuta por lo
menos una vez.

Fig. 7.12 Estructura REPEAT-UNTIL

En el caso que se use un registro como contador para el control del lazo, la
proposición puede concebirse como: repita el proceso hasta cuando el contador al-
cance cero. Mientras la condición sea falsa, se ejecuta la tarea. Cuando sea verdadera
Desarrollo y Simulación de Programas 318

se sale del programa. El ejemplo 7.4 muestra el código del ejemplo 7.3 usando la es-
tructura REPEAT-UNTIL.

Ejemplo 7.4

lxi h,dorg ; Cargar en hl la dirección de inicio del bloque origen.


lxi d,ddes ;Cargar en de la dirección de inicio del bloque desti no
mvi b,16 ; Inicializar el contador de número de datos a mover.
lazo: mov a,m ; Leer un dato desde el bloque origen
stax d ; Transferir el dato al bloque destino.
inx h ; Incrementar apuntador de bloque origen
inx d ; Incrementar apuntador de bloque destino
dcr b ; Decrementar contador.
jnz lazo ; Si el último dato fue transferido, salir de la rutina.

No siempre estas dos últimas estructuras de programación requieren un con-


tador para el control de repetición del lazo, es posible mantener activo el lazo hasta la
ocurrencia de un evento externo, como la introducción de un caracter por un puerto, o
la lectura de un dato de control almacenado en memoria.

Ejemplo 7.5

Considere que un grupo de datos numéricos almacenados en una tabla en me-


moria deben ser transferidos al puerto de salida 1. El final del arreglo de datos es in-
dicado con el código del caracter ASCII ‘P’ (parar). Una rutina que realiza esta tarea
se escribe a continuación.

lxi h,tabla ; Cargar en hl dirección de inicio de la tabla.


lazo: mov a,m ; Mover al acumulador el contenido de m.
cpi 80h ; Comparar el dato en a con el caracter ‘p’.
jz salir ; Si es ‘p’, salir.
out 01 ; Si no es ‘p’, escribir en puerto de salida.
inx h ; Incremente hl.
jmp lazo ; Repetir lazo.
salir:

Es obvio que el número de veces que el lazo se repite es desconocido, dado


que es fijado por la localización del caracter ‘P’ en memoria.

7.3 EL LENGUAJE ENSAMBLADOR

El ensamblador permite representar en forma simbólica el lenguaje de máqui-


na del procesador, facilitando la escritura o lectura de un programa. Cada µP viene
con su propio ensamblador, aunque es usual que segundas fuentes provean otras ver-
siones del lenguaje para un mismo µP. Aunque la sintaxis y potencia del traductor
Desarrollo y Simulación de Programas 319

puede variar de una versión a otra, existen ciertas características comunes. Por ejem-
plo todo buen ensamblador permite,

• Usar una secuencia de caracteres alfanuméricos (TPULSO, LAZO, LAZO1) para el mane-
jo simbólico de direcciones.

• Definir constantes en bases distintas: 255, FFH, 377Q, 11111111B, representan el mismo
número en decimal, hexadecimal, octal y binario respectivamente.

• La asignación de direcciones de memoria usando expresiones aritméticas.

• Reservar áreas de la memoria para el almacenamiento del programa y los resultados.

• El uso de seudo-instrucciones o directivas para controlar el proceso de ensamblaje.

Tales características resultan en el incremento de la productividad del progra-


mador al evitarse los errores inherentes a la representación de instrucciones, direccio-
nes y datos en binario, y simplifica el proceso de modificación y documentación de
los programas. Una de las desventajas del lenguaje ensamblador es que al estar ínti-
mamente relacionado con la estructura de la máquina, cada microprocesador deberá
disponer de su propio ensamblador.

7.3.1 El proceso de ensamblaje

En su forma más simple un ensamblador lee un archivo fuente escrito siguien-


do la sintaxis del traductor. El nombre del archivo es elegido por el usuario y su ex-
tensión es fijada por el diseñador del traductor. Por ejemplo: nombre.asm, nom-
bre.a85 y nombre.scr, son archivos típicos de entrada para ensambladores del µP
8085A.

Como muestra la figura 7.13, el traductor procesa el programa fuente y lo tra-


duce a código objeto. El archivo objeto contiene el código ejecutable con todos las
referencias simbólicas de códigos de operación, datos y direcciones convenientemen-
te convertidas a binario. Cuando el ensamblador traduce el programa fuente también
incorpora en el archivo binario generado información adicional además de la versión
en lenguaje de máquina del código. Esta información permite control de la carga en
memoria del código ejecutable.

Lo usual es que el archivo objeto tenga un formato adecuado para ser cargado
en un grabador de EPROM o EEPROM, en la memoria de un equipo emulador del µP
o para ser entrada de un programa simulador del µP. En cualquier de estos casos el
código objeto generado por el ensamblador puede ser probado y depurado.

El ensamblador genera además un archivo texto o programa lista que contiene


una combinación del programa fuente y el código de máquina generado, indicando las
direcciones de memoria utilizadas para almacenamiento del programa, y mensajes de
posibles errores cometidos en la escritura del texto fuente. Opcionalmente, algunos
Desarrollo y Simulación de Programas 320

ensambladores entregan otro archivo texto denominado referencia cruzada, el cual


ofrece una herramienta de diagnóstico para el desarrollo de programas, al contener
información sobre los símbolos usados, su clase, dirección y líneas del programa
donde aparecen. El archivo lista se identifica como nombre.lst o nombre.prn, y la
referencia cruzada como nombre.crf.

Fig.7.13 Salidas del proceso de ensamblaje

Al inicio del ensamblaje, el programa ensamblador activa un contador de loca-


lizaciones (LC), el cual se inicia por defecto en la dirección 0000H. Este contador se
incrementa a medida que se procesa cada instrucción del programa fuente para indi-
car al ensamblador la posición de memoria donde se ensamblará la siguiente instruc-
ción. El contenido del LC puede ser modificado por el comando ORG dirección. Al
final del proceso de traducción, el archivo objeto contiene todas las direcciones de
carga del código especificadas pudiendo ser cargado directamente en memoria. Este
tipo de archivo se conoce como archivo objeto absoluto. El proceso descrito supone
la existencia de un solo archivo fuente. En el momento de la traducción el ensambla-
dor conoce las direcciones de memoria donde se cargarán todas las etiquetas del pro-
grama. Una dirección puede expresarse como un número: 0100H, o con una etiqueta
como DIRM. El ensamblador se encarga de determinar el valor absoluto de la direc-
ción y lo asigna a la etiqueta, manteniendo un registro en una tabla de símbolos.

7.3.2 Proceso de ensamblaje de un programa modular

El ensamblador genera un código objeto absoluto cuando en el programa


fuente todas las direcciones se declaran en forma absoluta. Esto requiere que el pro-
gramador conozca y defina las direcciones de carga en memoria de las instrucciones
de datos del programa. Este modo de programación es ineficiente porque especificar
la dirección de carga del código en memoria impide la ejecución del programa en otra
área de memoria y el desarrollo de programas en forma modular. La función del en-
samblador que permite superar estas limitaciones se denomina relocalización y capa-
cita al programador par codificar un programa o partes de éste sin desvelarse por la
Desarrollo y Simulación de Programas 321

ubicación en memoria del código objeto final. El uso de la relocalización genera un


código reubicable, el cual es un software cuya dirección de carga puede cambiar. El
código puede ser movido en el espacio de direcciones del µP y ejecutado en más de
una dirección. Un programa relocalizable puede ejecutarse en la dirección cero en un
caso, y en 2000H en otro.

Para ilustrar una de las ventajas de la relocalización de código considere que


subsistema de memoria de una aplicación con µP está compuesto por una combina-
ción de memoria EPROM y RWM, con direcciones lógicas determinadas. Es claro que
el programa final a ejecutar en el hardware debe hacer referencia a estas direcciones.
No obstante, es común que en la fase de desarrollo y depuración del software se usen
recursos como equipos emuladores o simuladores con un espacio de direcciones de
memoria distinto al de la tarjeta de la aplicación. La relocalización permite la prueba
del programa en cualquier dirección y posteriormente la reubicación del código a las
direcciones correspondientes al hardware desarrollado.

Además, la aplicación de la técnica de programación modular en el desarrollo


de programas con ensamblador es posible gracias a la relocalización de código. Esta
función hace posible el ensamblaje y depuración de los módulos independientes, los
cuales serán posteriormente enlazados para formar un programa único ejecutable. Los
ensambladores son diseñados para permitir el uso de programación modular, pudien-
do el programador estar en capacidad de diseñar, codificar, y probar en paralelo mó-
dulos distintos del programa y limitar las modificaciones necesarias a un modulo es-
pecifico en lugar de hacerlo al programa completo.

En la etapa inicial de desarrollo del programa, las tareas a realizar son defini-
das y divididas en rutinas. El programa constará de varios archivos o módulos, los
cuales son escritos y ensamblados independientemente. Además, el programa puede
requerir el uso de algún código contenido en una biblioteca de programas, el cual
debe ser incorporado durante el proceso de traducción al archivo binario ejecutable
final. Un módulo de entrada tiene un nombre asignado por el usuario y puede conte-
ner uno o más segmentos o segmentos parciales.

Un segmento es una sección de código o de datos en memoria generada a par-


tir de código o datos del archivo fuente, y puede ser absoluto o relocalizable. Un
programa ejecutable consistirá de un módulo único que es una combinación de los
segmentos absolutos y relocalizables de los módulos de entrada.

Un segmento absoluto identifica una sección de código con su dirección de


carga completamente especificada, estos se usan para definir código cuya dirección
nunca cambiará. Los segmentos absolutos normalmente se usan (aún en módulos que
contengan segmentos relocalizables) para puertos mapeados en memoria o para car-
gar código en direcciones fijas usadas por el procesador, por ejemplo rutinas de inicio
o vectores de interrupción.
Desarrollo y Simulación de Programas 322

Los segmentos relativos contienen código cuya dirección de carga en memoria


aun no está definida. Un segmento relocalizable tiene nombre, tipo y otros atributos.
Los segmentos que tengan el mismo nombre pero procedan de diferentes módulos
son considerados parte del mismo segmento y son denominados segmentos parciales.
Estos son combinados por el por el programa enlazador. Los segmentos absolutos no
tienen atributos y no pueden combinarse con otros segmentos.

Los segmentos se definen al inicio del programa. El ensamblador AVMAC85


asigna un contador de posiciones para cada segmento. Cuando un segmento definido
es activado, su LC es puesto a cero (en segmentos absolutos, ORG dirección puede
modificar el LC) y toda instrucción o dato subsiguiente es asignado a este bloque de
memoria. La activación de un nuevo segmento inicia un nuevo LC y desactiva el
segmento en curso.

El símbolo ($) hace referencia al valor del LC en el segmento activo. El LC


apunta al espacio de direcciones dentro del segmento y su contenido representa una
dirección lógica para segmentos absolutos o un desplazamiento para segmentos relo-
calizables. Las direcciones lógicas identifican posiciones reales de memoria usadas
por el microprocesador cuando requiere acceso a instrucciones o datos del programa
en el espacio de memoria del microcomputador. Para segmentos relocalizables la
dirección inicial de carga puesta por el ensamblador siempre es cero y el LC se in-
crementa a medida que se agregan líneas de código.

Una etiqueta en la primer byte de la sección de código relocalizable se le asig-


na la dirección cero. De modo que cualquier línea dentro del segmento estará en una
dirección que representa un desplazamiento con relación a la localización final de
carga del segmento. Cuando los segmentos relativos son vinculados por el enlazador
se le asigna su dirección real de carga y todas las etiquetas relativas son resueltas.

El proceso de traducción de los archivos de entrada que componen cada pro-


grama fuente se describe a continuación:

1. Durante el primer paso el ensamblador examina cada programa fuente y agrupa las refe-
rencias simbólicas en una tabla.

2. En el segundo paso, el ensamblador genera un código el cual no está totalmente en códi-


go de máquina. Más bien es un código muy cercano al lenguaje de máquina, denominado
código relocalizable, al cual llamaremos código objeto.

3. Un programa denominado enlazador/relocalizador se encargará de procesar los distintos


módulos objetos para formar un programa único ejecutable.

En la figura 7.14 un diagrama de bloques ilustra el proceso de generación de


un programa objeto absoluto a partir de varios módulos de entrada.
Desarrollo y Simulación de Programas 323

Fig.7.14 Secuencia de traducción de un programa modular

Después que el diseño del programa es completado, se escriben los distintos


módulos fuente y se traducen uno a uno a código objeto usando el ensamblador. Este
genera un archivo objeto de tipo relocalizable, si al menos uno de los segmentos del
respectivo módulo fuente es de este tipo, en caso contrario el código objeto resultante
para ese módulo particular será absoluto. Opcionalmente, el traductor entregará los
resultados del ensamblaje en un archivo texto o listado del programa por cada módulo
de entrada.

El programa objeto contiene las instrucciones del código en lenguaje de má-


quina y los datos a ser cargados en memoria y ejecutados, además incorpora coman-
dos de control adicionales que dirigen el proceso de carga. Para un módulo particular,
el ensamblador puede producir un programa objeto en código relocalizable, pero si el
módulo contiene solo segmentos absolutos, el archivo objeto producto del ensamblaje
será código absoluto. Este puede ser cargado en memoria sin pasar por el programa
enlazador/relocalizador.

El archivo mapa es un fichero ASCII donde se registra información sobre el


proceso de enlace de los archivos objeto con códigos relocalizables y absolutos. Al
final del ensamblaje de todos los módulos del programa, el programa enlazador pro-
cesa el archivo en módulo objeto. La función del enlazador/relocalizador es asignar
direcciones de memoria absolutas a todos los segmentos relocalizables, combinando
segmentos del mismo nombre y tipo.

Además el enlazador resuelve todas las referencias entre módulos. Las salidas
del linker son: Un programa objeto en código absoluto listo para ejecutar y un pro-
grama lista que muestra los resultados del proceso de enlazado y reubicación. Por
ejemplo se indican los segmentos del programa especificando el tipo las direcciones
de inicio y final, además de las direcciones de carga en memoria de cada módulo del
programa.
Desarrollo y Simulación de Programas 324

Fig. 7.15 Proceso de desarrollo de un programa


Desarrollo y Simulación de Programas 325

La figura 7.15 muestra, que el código absoluto de salida puede ser programa-
do en una memoria no volátil y ejecutado por el μP. Por ejemplo en un grupo de
ROMs programadas por máscara en la fábrica, o en una PROM, EPROM o EEPROM
programada por el usuario. El emulador en la figura 7.15 es una herramienta especia-
lizada para la depuración de programas para sistemas basados en microprocesadores.
Lo común y deseable es que el desarrollo del programa, desde el diseño, ensamblaje,
prueba y depuración, hasta la grabación en memoria sean realizado usando equipos
microcomputadores de propósito específico, denominados Sistemas de Desarrollo
(SD), los cuales incluyen todas las herramientas necesaria para el diseño y desarrollo
de programas . Es común que cada fabricante de µPs ofrezca un SD adecuado para el
diseño de aplicaciones generales que usen el dispositivo que producen.

Algunos μC de bajo costo como el MPR-85 requieren que el código objeto ab-
soluto esté en formato hexadecimal para proceder a su ejecución. En este caso, se
requiere el uso de un programa para convertir desde código objeto a formato hexade-
cimal. En realidad, algunos enlazadores entregan directamente un archivo ejecutable
en formato hex...

7.3.3 Lenguaje ensamblador para el 8085

Para un proceso de ensamblaje exitoso es necesario que el archivo texto que


contiene el código fuente cumpla estrictamente con ciertas reglas de codificación,
propias de cada ensamblador. Existen muchos ensambladores para el µP 8085A, los
cuales pueden presentar diferencias en la sintaxis del lenguaje. No obstante existen
algunas características comunes a todos los ensambladores que permiten la descrip-
ción de los aspectos resaltantes del lenguaje usando una versión específica. En esta
sección se presenta el ensamblador original (ASM80) diseñado por la empresa INTEL
para el 8085A, el cual es descrito con detalle en el 8080/8085 Assembly Language
Programming Manual. El uso de otra versión del lenguaje usualmente implica modi-
ficaciones menores en el programa fuente.

Un programa fuente escrito en lenguaje ensamblador consiste de una secuen-


cia de líneas que suministran al ensamblador la información necesaria para ejecutar
el proceso de traducción. El ensamblador reconoce tres tipos de líneas fuentes:

• Instrucciones en nemónicos que serán traducidas a código de máquina. Este tipo de línea
genera código ejecutable.

• Directivas generales de ensamblador para especificar la estructura del programa y definir


los tipos y alcance de los símbolos usados. Por ejemplo, especifican el valor de inicio del
contador de localizaciones, señalan el final del programa, permiten reservar direcciones o
cargar datos en memoria. También se usan para definir y activar segmentos o para definir
si un símbolo tiene un alcance local o global.

• Directivas de control de ensamblador para fijar el modo de ensamblaje. Por ejemplo,


usando una de estas directivas puede especificarse el nombre de un archivo en ensambla-
Desarrollo y Simulación de Programas 326

dor que debe ser incluido como parte del programa que está siendo traducido. También
puede establecerse los archivos de salida a generarse, el ancho o longitud de la página y el
título del programa.

Formato de línea

El formato de una línea del programa fuente consta de cuatro campos, separa-
dos al menos por un espacio en blanco.

CAMPO 1 CAMPO 2 CAMPO 3 CAMPO 4

Etiqueta Código de operación Operando(s) ; Comentarios

Fig. 7.16 Formato de línea del ensamblador

• El campo de etiqueta identifica en forma simbólica la posición de memoria donde se lo-


caliza la instrucción que es ensamblada y debe finalizar con dos puntos (:). Es opcional, y
puede consistir de uno a seis caracteres alfanuméricos, pero el primer caracter debe ser al-
fabético o uno de los caracteres especiales ‘?’ o ‘@’. El ensamblador indicará error si una
etiqueta es definida más de una vez en el programa.

• El campo de código de operación Puede contener el nemónico de una instrucción del μP


que debe ser ensamblada o una directiva de ensamblador para ser ejecutada.

• El campo de operando especifica explícitamente o identificando el lugar de origen de los


datos o dato que usará la instrucción definida en el campo de código de operación. Este
campo estará vacío para instrucciones que no requieran operandos, STC por ejemplo, o
puede contener dos operandos cuando deba especificarse el destino de los datos, como en
MOV A,B. El operando puede ser un registro, una referencia a memoria, un dato, o una
dirección.

• El campo de comentarios expone la función la operación que ejecuta la instrucción. Es


opcional y en una línea fuente puede existir solo este campo. Un caracter (;) marca el ini-
cio del comentario.

Etiqueta Código de operación Operando(s) ; Comentarios


; ********************Esto es una sección del ejemplo 6.32*********************

LAZO: DCX B ;Decremento registro par BC


MOV A,B ;Byte alto del contador al A.
ORA C ; OR entre B y C.

Fig.7.17 Ejemplos de líneas fuente válidas. La primera línea solo tiene campo de comentario.
Desarrollo y Simulación de Programas 327

Conjunto de caracteres

Los siguientes caracteres son reconocidos por el ensamblador:

a) Las letras del alfabeto Inglés. Desde la A hasta la Z.

b) Los dígitos del 0 al 9

c) Los caracteres especiales + - * / , ( ) ‘ & ...

d) Cualquier caracter del código ASCII que forma parte de una constante encerrada entre
apóstrofes (‘R’ , ‘abef’), o que forme parte de un comentario.

Delimitadores

Son caracteres especiales usados para indicar la finalización de una línea o pa-
ra separación entre campos.

Tabla.7.4 Delimitadores legales en el asm80/85


CARACTER USO
b Uno o más espacios en blanco Separador de campo.
, Coma Separador de operandos.
; Punto y coma Inicio de comentario
: Dos puntos Último caracter de la etiqueta
‘’ Dos apóstrofes Delimita cadena de caracteres.
() Dos paréntesis Delimita una expresión.

Especificación de operandos

Cuando existen dos operandos, el primero identifica el destino del resultado,


mientras que el segundo señala el origen del dato. Los tipos de operandos posibles
son:

• Registro.
• Registro par.
• Dato inmediato.
• Dirección de 16 bits.

Los operandos pueden especificarse de distintas formas:

Hexadecimal

Una cantidad hexadecimal iniciada con un dígito del 0 al 9, y que finalice con
la letra H.

EJEMPLO
00H 23C5H 0DFH 0FFFCH
Desarrollo y Simulación de Programas 328

Octal

Un número octal seguido por la letra Q u O.

EJEMPLO
45Q 1234Q 230Q 7600Q

Binario

Cualquier cantidad en binaria seguida por la letra B.

EJEMPLO
11010100B

Constante ASCII

Un caracter encerrado entre apóstrofes define una constante ASCII.

EJEMPLO
MVI A,‘G’ ; Carga el A con el valor 47H,
;correspondiente al código en
;ASCII del caracter G.

Valores asignados a etiquetas

Las directivas SET y EQU permiten asignar valores a etiquetas. Si DATO tie-
ne asignado el valor 0DH, puede ser usada como operando, de modo que las siguien-
tes instrucciones son equivalentes:

EJEMPLO
SUI 0DH
SUI DATO

Etiquetas de instrucciones o datos

El ensamblador asigna a las etiquetas usadas para identificar líneas de pro-


grama, el valor de la dirección del primer byte de la instrucción. A partir de la decla-
ración de la etiqueta, cualquier instrucción del código fuente puede utilizar esta eti-
queta como operando.

EJEMPLO
LAZO2: DCX B
MOV A,B
ORA C
JNZ LAZO2 ; Salto a instrucción en lazo2 si Z=0.
Desarrollo y Simulación de Programas 329

Expresiones

Cualquier de los operandos anteriores pueden se usados conjuntamente con


operadores, para formar expresiones utilizables como operandos en una instrucción.

EJEMPLO
SUI 2*DATO
MVI A,DATO + 5

Referencia al contador de posiciones

El ensamblador usa un contador para mantener un seguimiento de las direc-


ciones de las instrucciones en lenguaje de máquina. Debido a que estas direcciones en
última instancia especifican posiciones de la memoria principal, el contador es deno-
minado contador de posiciones (Location counter (LC)). Antes del ensamblaje el LC
es puesto a cero. Luego que cada línea fuente ha sido examinada en el primer paso, el
LC es incrementado en un valor igual al número de bytes de cada instrucción. Existe
una directiva de ensamblador, ORG, la cual permite inicializar el LC en una dirección
diferente a cero.

El caracter especial $ hace referencia al contenido actual del contador de posi-


ciones, y puede formar parte de un operando.

EJEMPLO
SALTO: JMP $-5 ; Salto a la dirección 5 bytes
; atrás del primer byte de esta
; instrucción.

Símbolos reservados

Los símbolos utilizables en el lenguaje ensamblador tienen el formato especi-


ficado para las etiquetas. Existen ciertos símbolos que no pueden ser definidos como
símbolos de usuario debido a que tienen un significado específico para el ensambla-
dor. Por ejemplo, los nemónicos de las instrucciones y las directivas son símbolos
reservados por el ensamblador. Los operandos de la tabla 7.5 tampoco pueden usarse
como símbolos de usuario.

Definición de símbolos

Un símbolo global es aquel que mantiene su significado a lo largo del progra-


ma. Si una dirección especifica de una instrucción se le asigna el símbolo SALTO1,
se puede hacer referencia a este símbolo desde cualquier parte del programa. Un sím-
Desarrollo y Simulación de Programas 330

bolo global solo puede definirse una vez en el programa, de lo contrario habrá una
indicación de error.

Tabla. 7.5 Símbolos de operandos reservados por el ensamblador.


SÍMBOLO SIGNIFICADO
$ Referencia al contador de posiciones
A Acumulador
B Registro B o registro par BC
C Registro C
D Registro D o registro par DE
E Registro D
H Registro H o registro par HL
L Registro L
SP Registro apuntador de pila
PSW Palabra de estado del programa.
Corresponde al contenido del acumulador y del registro banderas.
M Referencia a memoria usando la dirección almacenada en HL

Cuando se desarrolla un programa, es común que exista una secuencia de ins-


trucciones que es ejecutada a menudo cambiando únicamente ciertos parámetros. Para
estos casos el ensamblador ofrece la posibilidad de definir una rutina denominada
MACRO que puede ser tratada como una entidad. Cada vez que el macro sea llamado
desde el programa principal pueden ser reemplazados un grupo de parámetros por
otros. La posibilidad de usar macros evita la codificación repetida un grupo de ins-
trucciones (con parámetros distintos) a lo largo del programa.

Un símbolo local tiene significado solamente dentro de un macro o en una


llamada a macro, su nombre deriva del hecho que son locales al macro. Si un nombre
dentro de un macro es definido como global, al realizar la segunda llamada al macro
se recibirá un mensaje de error indicando la duplicación de un símbolo global. Si el
valor de un símbolo es constante durante el proceso de ensamblaje se dice que es un
símbolo permanente, en caso contrario se habla de símbolo redefinible.

Los programas relocalizables son ensamblados con referencia a la posición de


memoria 0, siendo posteriormente relocalizados a otra área de memoria. Un símbolo
absoluto mantiene constante su dirección durante el proceso de reubicación, mientras
que un símbolo relocalizable la cambia. Un símbolo relocalizable externo es usado
en un módulo, pero definido en otro.

Un símbolo relocalizable público es definido en un módulo pero puede se


usado por otro módulo. Estos dos últimos tipos de símbolos son de utilidad cuando se
usa un enlazador/relocalizador para enlazar módulos de programas relocalizables y
producir un sólo programa. El ensamblador tiene directivas que permiten definir el
tipo de símbolo.
Desarrollo y Simulación de Programas 331

Evaluación de expresiones

Una expresión puede ser absoluta o relocalizable, y contiene símbolos, núme-


ros y operadores. El ensamblador trata a las expresiones como valores de 16 bits. El
número 10H, por ejemplo, se representa internamente como 0010H. Los operadores
válidos en el ensamblador permiten la ejecución de operaciones:

1. Aritméticas
2. De desplazamiento
3. Lógicas
4. De comparación
5. De aislamiento de byte.

Operadores aritméticos:
Los operadores aritméticos son los siguientes:

+ Suma.
- Resta.
* Multiplicación.
/ División sin residuo. (13/2 = 6).
MOD Módulo. El resultado es el residuo de una división (13 MOD 2=1).

Operadores de desplazamiento :

Los operadores de desplazamiento son dos:

y SHR x Desplace operando y a la derecha, x posiciones de bit.


y SHL x Desplace operando y a la izquierda, x posiciones de bit.

EJEMPLO
Si (VALOR) = 10010110 = (150)10

La ejecución de la instrucción afectará al operador VALOR:

VALOR SHR 2

(VALOR) = 00100101 = (37)10.

Observe que al desplazar un número binario a al derecha, éste queda dividi-


do por 2. Si el desplazamiento ocurre hacia la izquierda el efecto será la multiplica-
ción del número por 2.

Operadores lógicos:

Los operadores lógicos reconocidos por el ensamblador son: NOT (comple-


mento), AND, OR y XOR. Estos operadores se usan extensamente en conjunto con la
Desarrollo y Simulación de Programas 332

directiva de ensamblaje condicional IF. Actúan solamente sobre el bit 0 del resultado
de la operación.

EJEMPLO
Si el símbolo DIR está definido como 07D3, la instrucción:

LXI H,NOT DIR +1 producirá (H)(L) = (11111000) (00101011)

Operadores de comparación:

La operación de comparación produce un resultado booleano Si la evalua-


ción de la expresión es cierta, el valor del resultado es todos los bits en 1, cuando es
falso será todos bits en cero. Al igual que los operadores lógicos, los de comparación
se usan en directivas IF.

Los operandos para comparación son:

EQ Igual
EN Desigual
LT Menor que
LE Menor o igual
GT Mayor que
GE Menor o igual
NUL Usado para pruebas de omisión de parámetros en macros.

Operadores de aislamiento de byte:

Cuando se requiere obtener un número de 8 bits desde una expresión, o si se


desea obtener un byte de una dirección, se usan los operadores:

HIGH Obtiene el byte más significativo de un valor de


16 bits.
LOW Obtiene el byte menos significativo de un valor
de16 bits

Aquí finaliza una breve introducción a la sintaxis del lenguaje ensamblador. El


lector habrá notado que todos los programas fuente que se han presentado en este
trabajo están escritos en ensamblador.

Traducción de un archivo fuente

Antes de presentar las directivas de ensamblador más usadas conviene realizar


la traducción de un programa ejemplo para mostrar como el programa traductor reali-
Desarrollo y Simulación de Programas 333

za el procesamiento del archivo fuente. Con este objetivo inspeccione el programa del
ejemplo 7.6 en el cual se aplican algunos de los conceptos expuestos en esta sección.

Ejemplo 7.6

El objetivo del programa es leer 16 caracteres ASCII del puerto de entrada 0 y


determinar si corresponden a dígitos válidos del sistema de numeración hexadecimal.
Cada vez que un dato se presente en el puerto 0, el bit 0 del puerto 02 se pone en ni-
vel alto.

Si el digito en el puerto pertenece al conjunto:

{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F’}

debe almacenarse en un bloque de memoria con inicio en 1000H. Si la prueba falla,


el valor debe escribirse en el puerto de salida 01H. La tabla 7.6 muestra los códigos
ASCII para los números hexadecimales.

Tabla. 7.6 Código ASCII de dígitos hex.


CARACTER ASCII (hex)
0 30
1 31
2 32
3 33
4 34
5 35
6 36
7 37
8 38
9 39
A 41
B 42
C 43
D 44
E 45
F 46

El algoritmo para identificar un número hexadecimal es simple. Basta con


examinar el valor del caracter obtenido del puerto de entrada, el cual está almacenado
en el acumulador. Si se cumple que:

30H ≤ (A) ≤ 39H ó 41H ≤ (A) ≤ 46H, El caracter es un dígito hexadecimal.

El listado del programa que resuelve el problema planteado, se muestra a con-


tinuación.
Desarrollo y Simulación de Programas 334

Etiqueta Código de Operando(s) Comentarios


operación
LXI H,1000H ; Dirección de almacenamiento de digitos hex.
MVI B,17 ; Cargar contador de digitos .
LAZO: DCR B ; Decrementar contador de digitos.
JZ SALIR ; Salir si se evaluó último digito.
BIT01: IN 02H ; Leer la palabra de control en el puerto 02.
ANI 01H ; Probar si el bit 0 está en nivel alto.
JZ BIT01 ; Si es cero, saltar a esperar que pase a 1.
IN 00H ; Leer digiro de puerto de entrada.
CPI '0' ; Comparar con ASCII ‘0’.
JM INVAL ; Si es menor , no es un digito hexadecimal.
CPI '9'+1 ; Comparar con ASCII ‘9’+1.
JM VALI ; Si es menor, el digito esta entre ‘0’-’9’.
CPI 'A' ; Comparar con ASCII ‘A’.
JM INVAL ; Si es menor no es un digito hexadecimal.
CPI 'F '+1 ; comparar con ASCII ‘F’+1.
JP INVAL ; Si es mayor, inválido.Debe estar entre ‘A’-’F’.
VALI: MOV M,A ; Mover a memoria el digito hex en el reg. (C).
INX H
JMP BIT10 ; Apuntar a próxima dirección de memoria.
INVAL: OUT 01H ; Escribir en puerto de salida valor no hex.
BIT10: IN 02H ; Leer la palabra de control en el puerto 02.
ANI 01H ; Probar si el bit 0 está en nivel bajo.
JNZ BIT10 ; Si es uno, saltar a esperar que pase a 0.
JMP LAZO ; Saltar a leer nuevo valor.
SALIR: HLT ; Salir al leer los 16 valores del puerto.

El camino más adecuado para comprender como se lleva a cabo un proceso de


ensamble de un programa, es realizándolo manualmente. El procedimiento lógico
pareciera ser realizar un barrido del programa en un paso y traducirlo de acuerdo con
la sintaxis del lenguaje ensamblador. Para esto se asigna una dirección de memoria al
código de operación de la primera instrucción, la cual es el origen del programa, y se
incrementa de acuerdo al número de bytes que tenga cada instrucción. Se elije la di-
rección 0000H como dirección de inicio del programa anterior. Cada etiqueta que se
encuentre debe registrarse en una tabla de símbolos, asignándole el valor del primer
byte de la instrucción que esté en la línea donde se halla la etiqueta.

Línea Dirección Mnemónico Código Objeto Longitud


Bytes
1 0000H LXI H,1000H 210010 3
2 0003H MVI B,17 0611 2
3 0005H LAZO: DCR B 05 1
4 0006H JZ SALIR CA???? 3
5 0009H IN 02H DB02 2
. . . . .
. . . . .
. . . . .

TABLA DE SÍMBOLOS
LAZO 0005
SALIR ????

Fig.7.18 Ensamblaje parcial del programa del ejemplo 7.6 usando un solo paso.
Desarrollo y Simulación de Programas 335

Como se observa en la figura 7.18, no existe problema alguno para ensamblar


las primeras 3 líneas del programa.

Línea 1: LXI H,1000H

Inicio del programa, dirección 0000H. El código objeto generado corresponde


al código de operación de la instrucción (21H) y a la dirección a almacenarse en el
registro par HL (1000). Las direcciones siempre se almacenan ubicando el byte de
menor orden en una posición de memoria y el byte de mayor orden en la siguiente. La
instrucción en la línea 1 ocupará 3 bytes de la memoria a partir de la posición 1000H.

Línea 2: MVI B,17H

El contador de posiciones se ha incrementado en 3 bytes. El código de opera-


ción de la instrucción (06H) se almacena en la posición 0003H y el dato a mover al
registro B (11H=1710) ocupará la posición siguiente. La instrucción requiere 2 bytes
para su almacenamiento.

Línea 3: LAZO: DCR B

(LC) = 0005H ((LC)+2) Código de operación = 05 1 byte

En esta línea se encuentra una etiqueta, y debe asignársele un valor igual a la


dirección del primer byte de la instrucción. Esto es:

LAZO = 0005H

Cuando se avance en el análisis de las líneas del programa, cualquier referen-


cia a SALTO, corresponde a la dirección de memoria 0005H. Este valor queda regis-
trado en la tabla de símbolos.

Línea 4: JZ SALIR

(LC) = 0006H Código de operación = CA???? 3 bytes

En esta línea existe una instrucción de salto condicional (Salto si Z=1) a una
referencia denominada SALIR. Al tratar de ensamblar la línea 4, nos encontramos
que no conocemos el valor del símbolo SALIR, al no estar incluido en la tabla de
símbolos debido a que aparece posteriormente al final del programa. En consecuen-
cia, no es posible ensamblar la línea 4 por completo. Una situación similar ocurrirá
cuando se pretendan ensamblar las líneas 8, 10, 12, y 14. Las etiquetas INVAL y VA-
LI son indefinidas. Es obvio que con este procedimiento, al llegar al final del progra-
ma, quedaran algunas líneas ensambladas en forma incompleta por lo cual se requeri-
rá realizar un segundo paso por el programa para completar el proceso. Al final de
este segundo paso el programa quedará completamente ensamblado. La mayoría de
los ensambladores son de dos pasos pero no es el descrito, el camino que se usa para
Desarrollo y Simulación de Programas 336

realizar el análisis de las líneas del programa. Un procedimiento más eficiente es el


siguiente:

• Paso I:

Se localizan las direcciones de memoria que corresponden al código de operación de cada


instrucción y se ubican en la columna de direcciones, creándose una tabla que contiene to-
das las etiquetas que denoten posiciones de memoria.

• Paso II:

En el segundo paso se examina cada instrucción nuevamente, esta vez se traduce cada códi-
go de operación al valor hexadecimal que representa la operación en lenguaje de máquina,
y el mnemónico se sustituye por el código de máquina equivalente. Esta información se co-
loca en la columna de código objeto. Si una instrucción es de dos bytes o más, y el operan-
do está definido en forma simbólica, se examina la tabla de símbolos creada en el primer
paso para asignar el código hexadecimal correspondiente al operando simbólico.

En las figuras 7.19 y 7.20 se muestran los resultados de realizar cada paso
con el programa ejemplo.

Línea Dirección Nemónico Código Objeto Longitud (Bytes)


1 0000 LXI H,1000H 3
2 0003 MVI B,17 2
3 0005 LAZO: DCR B 1
4 0006 JZ SALIR 3
5 0009 BIT01: IN 02H 2
6 000B ANI 01 2
7 000D JZ BIT01 3
8 0010 IN 00H 2
9 0012 CPI ‘0’ 2
10 0014 JM INVAL 3
11 0017 CPI ‘9’+1 2
12 0019 JM VALI 3
13 001C CPI ‘A’ 2
14 001E JM INVAL 3
15 0021 CPI ‘F’+1 2
16 0023 JP INV 3
17 0026 VALI: MOV M,A 1
18 0027 INX H 1
29 0028 JMP BIT10 3
20 002B INVAL: OUT 01H 2
21 002D BIT10: IN 02 2
22 002F ANI 01 2
23 0031 JNZ BIT10 3
24 0034 JMP LAZO 3
25 0037 SALIR: HLT 1
TABLA DE SIMBOLOS:

LAZO 0005 BIT01 0009 VALI 0026

INVAL 002B BIT10 002D SALIR 0037

Fig.7.19 Resultado del proceso de ensamblaje a mano. Paso I.


Desarrollo y Simulación de Programas 337

Línea Dirección Nemónico Código Objeto Longitud (Bytes)


1 0000 LXI H,1000H 210010 3
2 0003 MVI B,17 0611 2
3 0005 LAZO: DCR B 05 1
4 0006 JZ SALIR CA3700 3
5 0009 BIT01: IN 02H DB02 2
6 000B ANI 01 E601 2
7 000D JZ BIT01 CA0900 3
8 0010 IN 00H DB00 2
9 0012 CPI ‘0’ FE30 2
10 0014 JM INVAL FA2B00 3
11 0017 CPI ‘9’+1 FE3A 2
12 0019 JM VALI FA2600 3
13 001C CPI ‘A’ FE41 2
14 001E JM INVAL FA2B00 3
15 0021 CPI ‘F’+1 FE47 2
16 0023 JP INV F22B00 3
17 0026 VALI: MOV M,A 77 1
18 0027 INX H 23 1
29 0028 JMP BIT10 C32D00 3
20 002B INVAL: OUT 01H D301 2
21 002D BIT10: IN 02 DB02 2
22 002F ANI 01 E601 2
23 0031 JNZ BIT10 C22D00 3
24 0034 JMP LAZO C30500 3
25 0037 SALIR: HLT 76 1

TABLA DE SIMBOLOS:

LAZO 0005 BIT01 0009 VALI 0026

INVAL 002B BIT10 002D SALIR 0037

Fig.7.20 Resultado del proceso de ensamblaje a mano. Paso II.


Desarrollo y Simulación de Programas 338

La figura 7.21 muestra el resultado de ensamblar el programa del ejemplo 7.6,


usando el programa ensamblador ASM80 de INTEL, ejecutable en ambiente MSDOS.

ASM80 EJEM76.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1

LOC OBJ LINE SOURCE STATEMENT


0000 210010 1 LXI H,1000H
0003 0611 2 MVI B,17
0005 05 3 LAZO: DCR B
0006 CA3700 4 JZ SALIR
0009 DB02 5 BIT01: IN 02H
000B E601 6 ANI 01H
000D CA0900 7 JZ BIT01
0010 DB00 8 IN 00H
0012 FE30 9 CPI '0'
0014 FA2B00 10 JM INVAL
0017 FE3A 11 CPI '9'+1
0019 FA2600 12 JM VALI
001C FE41 13 CPI 'A'
001E FA2B00 14 JM INVAL
0021 FE47 15 CPI 'F'+1
0023 F22B00 16 JP INVAL
0026 77 17 VALI: MOV M,A
0027 23 18 INX H
0028 C32D00 19 JMP BIT10
002B D301 20 INVAL: OUT 01H
002D DB02 21 BIT10: IN 02H
002F E601 22 ANI 01H
0031 C22D00 23 JNZ BIT10
0034 C30500 24 JMP LAZO
0037 76 25 SALIR: HLT
END

PUBLIC SYMBOLS

EXTERNAL SYMBOLS

USER SYMBOLS
BIT01 A 0009 BIT10 A 002D INVAL A 002B LAZO A 0005 SALIR A 0037 VALI A 0026

ASSEMBLY COMPLETE, NO ERRORS

Fig. 7.21. Salida del macro ensamblador ASM80/85


Desarrollo y Simulación de Programas 339

En la figura 7.22 se presenta la salida del ensamblador ASM85, incorporado


en el programa SID85. Este ofrece la mayoría de las funciones realizadas por ensam-
bladores comerciales. Observe la generación automática de una lista de referencia
cruzada.

1 0000 21 00 10 LXI H,1000H


2 0003 06 11 MVI B,17
3 0005 05 LAZO: DCR B
4 0006 CA 39 00 JZ SALIR
5 0009 DB 02 BIT01: IN 02H
6 000B E6 01 ANI 01H
7 000D CA 09 00 JZ BIT01
8 0010 DB 00 IN 00H
9 0012 FE 30 CPI 30H
10 0014 FA 2C 00 JM INVAL
11 0017 FE 40 CPI 3AH
12 0019 FA 27 00 JM VALI
13 001C FE 41 CPI 41H
14 001E FA 2C 00 JM INVAL
15 0021 FE 47 CPI 47H
16 0023 F2 2C 00 JP INVAL
17 0026 77 VALI: MOV M,A
18 0027 23 INX H
19 0028 C3 2F 00 JMP BIT10
20 002B D3 01 INVAL: OUT 01H
21 002D DB 02 BIT10: IN 02H
22 002F E6 01 ANI 01H
23 0031 C2 2F 00 JNZ BIT10
24 0034C3 05 00 JMP LAZO
25 0037 76 SALIR: HLT

Etiquetas Definidas
===================
LAZO 0005 SALIR 0037 BIT01 0009
INVAL 002B VALI 0026 BIT10 002D

Referencia Cruzada
==================
LAZO #3 24
SALIR 4 #25
BIT01 #5 7
INVAL 10 14 16 #20
VALI 12 #17

Fig.7.22. Salida del ensamblador cruzado del programa SID85.

El procedimiento de ensamblaje manual realizado, no es más que un ejercicio


didáctico. Para el desarrollo de los programas asignados en el curso se debe usar un
programa ensamblador comercial. Todos los programas simuladores suministrados a
los estudiantes tienen un ensamblador el cual compila y carga en memoria el archivo
binario. También la herramienta MICROIDE tiene un ensamblador (ASM85). Estos
Desarrollo y Simulación de Programas 340

ensambladores en general son de desempeño limitado y no permiten el uso de macros


ni generan código relocalizable. Entre los programas de trabajo del curso se encuentra
el paquete ISISII de INTEL, el cual incluye el ensamblador ASM80 y el enlazador
LINK80. Otro recurso al alcance del estudiante de sistemas de microprocesadores es
el software distribuido por la empresa AVOCET y dirigido al desarrollo de programas
para el 8085A. Este conjunto de programas incluye un ensamblador (AVMAC85) con
capacidad para procesar macros, un enlazador/relocalizador (AVLINK) y otros pro-
gramas asociados.

Directivas generales del ensamblador

El ensamblador reconoce un grupo de órdenes de ensamblaje que no pertene-


cen al conjunto de instrucciones del procesador y que no generan código de máquina.
Estas se denominan pseudos-instrucciones y pueden usarse para controlar el proceso
de ensamblaje, reservar áreas de memoria, almacenar datos y resultados, ignorar o
ensamblar líneas de código, definir variables de trabajo y fijar las direcciones de ini-
cio y final del código generado por el ensamblador. Las directivas reconocidas por el
ensamblador son:

Tabla. 7.7 Directivas de control de ensamblaje.


ORG Define la dirección de inicio del programa o de un área de datos.
END Señala el final de un programa en lenguaje ensamblador.
EQU Define constantes numéricas.
SET Asigna un valor numérico a un símbolo.
IF Inicio de ensamblaje condicional.
ENDIF Fin de ensamblaje condicional.
DB Define bytes de datos.
DW Define palabra de datos.
DS Reserva áreas de memoria para almacenamiento de datos.

Las directivas se ubican en el campo de operación, pudiendo ser precedidas


por una etiqueta y/o seguidas por un comentario. Todas las pseudos-operaciones re-
quieren un argumento, exceptuando a END y ENDIF.

ORG

Fija el inicio de las direcciones absolutas del programa o área de datos, al po-
ner el contador de posiciones LC al valor especificado por el operando expresión.
Tiene la forma:

etiqueta: ORG expresión ;comentario

Los campos de etiqueta y comentario son opcionales. Expresión es un valor


de 16 bits, o una expresión que al ser evaluada produce un valor de 16 bits (una di-
rección). Un programa puede tener varias declaraciones ORG si se requiere ensam-
blar secciones del programa en direcciones diferentes. Si se usa una expresión en lu-
Desarrollo y Simulación de Programas 341

gar de un valor absoluto, en el campo de expresión, la etiqueta usada debe ser defini-
da en líneas anteriores. Si no existe una directiva ORG antes de la primera instrucción
del programa, éste se ensamblará con inicio en la dirección 0000H.

END

Señala el punto de culminación del programa y que el proceso de ensamblaje


debe detenerse. Sólo debe existir una directiva END y debe estar al final del texto del
programa.

El formato de esta directiva es:

etiqueta: END

Un ejemplo del uso conjunto de las instrucciones ORG y END es el siguiente:

ORG 0500H ; inicio del programa


.
.
.
.
ORG 1000H ; área de datos
.
.
.
END

EQU

Sirve para facilitar la lectura del programa. Esta directiva asigna un valor nu-
mérico a un nombre. Tiene la forma:

nombre: EQU expresión

El valor de expresión es asignado al nombre especificado en el campo de eti-


queta. Por ejemplo, si el valor de inicio de un área de datos es 2000H. La asignación:

DIRDAT EQU 2000H

permite a cualquier instrucción hacer referencia al comienzo del bloque de datos,


usando el nombre DIRDAT. En consecuencia las instrucciones siguientes, son equiva-
lentes:

LXI H, 2000H LXI H, DIRDAT


Desarrollo y Simulación de Programas 342

El valor asignado a un símbolo por una directiva EQU no puede ser cambiado
por otra declaración EQU. Algunos ensambladores no requieren los dos puntos al
final de la etiqueta.

SET

Es idéntica a la directiva EQU, exceptuando el hecho que una asignación SET


posterior puede cambiar el valor de nombre. De modo que el valor de un identifica-
dor fijado por una asignación EQU es válido para todo el programa, mientras que el
definido por un comando SET es válido hasta la próxima directiva SET que contenga
el nombre.

IF y ENDIF

Permiten incluir o excluir partes de un programa durante el proceso de ensam-


blaje. El formato de esta directiva es:

etiqueta: IF expresión

instrucción 1
instrucción 2
.
.
.
instrucción n
ELSE
.
.
.
ENDIF

El programa ensamblador evalúa la expresión que acompaña a la declaración


IF, y si el bit 0 del resultado es un valor lógico uno (evaluado como 0FFFFH), las
instrucciones entre la directiva IF y el próximo ELSE o ENDIF son ensambladas, en
este caso las instrucciones de la 1 a la n. Si el resultado es cero (0H) las n instruccio-
nes son ignoradas.

Toda declaración IF debe estar asociada a un ENDIF. La directiva ELSE es


opcional y solo una puede aparecer en un bloque IF-ENDIF. Si existe ELSE, cuando
la prueba de IF resulte cero las declaraciones entre ELSE y ENDIF se ensamblaran; si
el bit 0 es uno lógico, serán ignoradas.

Los bloques de código acotados por directivas IF-ENDIF se usan con frecuen-
cia en la fase de prueba y depuración de programas. Suponga que se tiene un progra-
ma que contiene un lazo cuya ejecución es controlada por un valor desconocido car-
gado desde un puerto de entrada en la posición de memoria MEM. Se desea saber
Desarrollo y Simulación de Programas 343

cuantas veces se repite en lazo en algún momento. La rutina mostrada a continuación


puede usarse con ese propósito.

SI EQU -1
NO EQU 0
PRUEBA EQU SI
MEM EQU 2000H

LHLD MEM
LXI B,0
LAZO: DCX H
IF PRUEBA
INX B
ENDIF
JNZ LAZO
END

Al final de la ejecución del programa el registro par BC contendrá el número


de veces que el lazo se repite. El código objeto resultado de ensamblar la rutina es el
siguiente,
ASM80 IF.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1

LOC OBJ LINE SOURCE STATEMENT


FFFF 1 SI EQU -1
0000 2 NO EQU 0
FFFF 3 PRUEBA EQU SI
2000 4 MEM EQU 2000H
5
0000 2A0020 6 LHLD MEM
0003 010000 7 LXI B,0
0006 2B 8 LAZO: DCX H
9 IF PRUEBA
0007 03 10 INX B
11 ENDIF
0008 C20600 12 JNZ LAZO
13 END

PUBLIC SYMBOLS

EXTERNAL SYMBOLS

USER SYMBOLS
LAZO A 0006 MEM A 2000 NO A 0000 PRUEBA A FFFF SI A FFFF

ASSEMBLY COMPLETE, NO ERRORS

Observe que la directiva EQU ubicada en la línea 3 se usa para asignar al sím-
bolo PRUEBA el valor 0FFFFH. La evaluación del bit 0 de prueba produce uno lógi-
co, ensamblándose la instrucción INX B, dentro del bloque IF-ENDIF. Una vez que el
programa ha sido depurado simplemente se le fija el valor NO al identificador
Desarrollo y Simulación de Programas 344

PRUEBA. Cuando se ensambla de nuevo la rutina, no se ensambla el código respon-


sable de registrar el número de veces que se ejecuta el lazo. Esto, debido a que el va-
lor de PRUEBA es 0 (NO).

ASM80 IF.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1

LOC OBJ LINE SOURCE STATEMENT


FFFF 1 SI EQU -1
0000 2 NO EQU 0
0000 3 PRUEBA EQU NO
2000 4 MEM EQU 2000H
5
0000 2A0020 6 LHLD MEM
0003 010000 7 LXI B,0
0006 2B 8 LAZO: DCX H
9 IF PRUEBA
10 INX B
11 ENDIF
0007 C20600 12 JNZ LAZO
13 END

PUBLIC SYMBOL

EXTERNAL SYMBOLS

USER SYMBOLS
LAZO A 0006 MEM A 2000 NO A 0000 PRUEBA A 0000 SI
A FFFF

ASSEMBLY COMPLETE, NO ERRORS

La utilidad del uso del ensamblaje condicional en la fase de desarrollo del


software de una aplicación se hace patente cuando se diseña una tarjeta de control con
la opción de seleccionar, entre varias opciones, los sensores de entrada y los actuado-
res de salida. En este caso el programa de aplicación, incluyendo el bloque de código
del programa que realiza el algoritmo de control, es el mismo para cualquiera de las
posibilidades. La diferencia estará en el código de los sensores y actuadores. Si exis-
ten 3 tipos de sensores y 4 de actuadores, será necesario escribir 12 programas para
cubrir todas las opciones. El uso bloques IF-ENDIF permite la escritura de un solo
programa, con todas las rutinas de entrada y salida sujetas a ensamblaje condicional.
Cuando deba programarse una tarjeta particular se selecciona las rutinas correspon-
dientes al sensor y al actuador elegido por el usuario.

DB

La directiva DB (Definición de byte) carga una serie de posiciones consecuti-


vas de memoria con valores de ocho bits. Se escribe como:

etiqueta DB lista de expresiones o cadenas de caracteres


Desarrollo y Simulación de Programas