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 345

El campo etiqueta es opcional, si existe se le asigna el valor del contador de


posiciones, y en esa dirección se almacena el primer byte especificado por la directiva
DB. Los símbolos en expresión deben definirse previamente. La lista puede incluir
hasta 8 elementos separados por comas. Para facilitar la lectura de la lista pueden
usarse varias declaraciones DB. Algunos ejemplos se muestran a continuación,
Código objeto
LISTA: DB 1, 0C5H, 1000B 01C508

LISTA: DB 1 01C508
DB 0C5H
DB 1000B

MEM: DB ‘R.A.M’ 522E412E4D

MULT: DB 2*8,4*8 1020

Observe en la figura 7.23 la forma en la cual se almacena la cadena ‘R.A.M’


en memoria:

Dirección Contenido

MEM 01010010 52 R

MEM+1 00101110 2E .

MEM+2 01000001 41 A

MEM+3 00101110 2E .

MEM+4 01001101 4D M

Fig. 7.23 La cadena R.A.M ocupa 5 bytes consecutivos de la memoria a partir de la dirección MEM.

DW

La directiva definición de palabra es similar a DB, con la única diferencia que


almacena valores de 16 bits de la lista de expresiones como direcciones de memoria.

etiqueta DW lista de expresiónes o cadenas de caracteres

Si la evaluación de una expresión resulta en un número de ocho bits, este re-


sultado corresponde al byte de bajo del resultado, mientras que el byte alto será 00H.
Algunos ejemplos del uso correcto de la directiva de definición de palabra, se mues-
tran a continuación. El símbolo POS1 es definido en un programa como 2064H:
Desarrollo y Simulación de Programas 346

Código objeto
DIR: DW POS1 6420

TEMP: DW 0DH 0D00

ABCD: DW ‘AB’,’C’ 42414300

Si el contador de posiciones es igual a 0300H cuando se alcanza el símbolo


DIR, los datos se almacenarán en la unidad de memoria del sistema en la forma que
se muestra en la figura 7.24.

Dirección Contenido
DIR: 0300H 01100100 64H

301H 00100000 20H

TEMP: 0302H 00001101 0DH

0303H 00101110 00H

ABC: 0304H 01000010 42H

0305H 01000001 41H

0306H 01000011 43H

0307H 00000000 00H

Fig.7.24. Forma de almacenamiento de los datos y direcciones de las etiquetas.

DS

Es una directiva usada para reservar posiciones de memoria para almacena-


miento de datos generados por el programa. La sintaxis de DS es:

etiqueta DS expresión

El ensamblador evalúa la expresión y reserva el número de bytes de memoria


especificado por el resultado. Los símbolos en expresión deben definirse con antela-
ción a la declaración DS. La directiva DS no genera datos, el contenido de las posi-
ciones de memoria reservadas es impredecible al inicio de la ejecución del programa.
DS reserva la memoria incrementado el LC al valor definido por expresión.

RESULT: DS 20 ;Reserva 20 bytes a partir de RESULT.


Desarrollo y Simulación de Programas 347

Los comandos anteriores son algunas directivas generales del ensamblador.


Las usadas en relocalización de código se explican más adelante y las directivas de
control no se discuten en este trabajo. Para demostrar el uso de algunas de las directi-
vas cuya unción se describió, considere el ejemplo 7.7.

Ejemplo 7.7

Escribir una rutina con el propósito de encontrar los valores máximo y mínimo
de una tabla de 16 números almacenada en la memoria a partir de la dirección 0300H.
El programa debe cargarse en la dirección 0200H.

ORG 0200H ; Inicio del programa.


NUM EQU 010H ; Número de elementos de la tabla.

MENOR: LXI H,TABLA ;Cargar dirección de inicio de la tabla HL.


MVI B,NUM ;Cargar contador de números.
MOV A,M ;Mover al acumulador el primer número.
LAZO1: INX H ;Apuntar al próximo elemento en la tabla.
DCR B ;Decrementar contador de elementos de la lista.
JZ MENOR ;Si (B)=0, el mínimo está en el acumulador.
;Almacenarlo en memoria y buscar el mayor.
CMP M ;Comparar un valor con el posible mínimo
;cargado en el acumulador.
JC LAZO1 ;Si elemento es mayor, comparar con el
;próximo.
MOV A,M ;Si es menor, es el nuevo mínimo. Cargar en A.
JMP LAZO1 ;Comparar el nuevo mínimo con el siguiente valor.
MENOR: STA MIN ;Almacenar el valor mínimo de la tabla.
LXI H,TABLA ;Al inicio de la tabla en búsqueda del mayor.
MOV A,M ;Primer valor al acumulador.
MVI B,NUM ;Inicializar contador de elementos.
LAZO2: INX H ;Apuntar a próximo valor.
DCR B ;Decrementar contador.
JZ MAYOR ;Si (B)=0, almacenar máximo en memoria y salir.
CMP M ;Comparar elemento de la tabla con el potencial
;máximo depositado en el acumulador.
JNC LAZO2 ;Si valor en la tabla es menor, comparar con el
;siguiente.
MOV A,M ;Si es mayor, sustituir el anterior
JMP LAZO2 ;Comparar nuevo máximo con próximo en la tabla.
MAYOR: STA MAX ;Almacenar en memoria el máximo.
HLT ;Parar.

ORG 0300H ;Inicio del área de datos

MIN: DS 1 ; Posición para almacenar el mínimo.


MAX: DS 1 ; Posición para almacenar el máximo.
TABLA: DB 64H,45,23Q,60H,90H,3H,24H,15H
DB 20H,15,34H,80H,50H,2H,101011B,30
END
Desarrollo y Simulación de Programas 348

Dos declaraciones ORG fijan los inicios de las áreas de programas y datos. La
tabla de valores se introduce usando directivas DB. Las direcciones para depositar los
valores máximo y mínimo se reservan usando la directiva DS. Observe que los datos
de la tabla se representan en los sistemas numéricos: hexadecimal, octal, binario y
decimal.

Primero se halla el valor mínimo y luego el máximo. El proceso se inicia


asumiendo que el primer elemento es el mínimo. Este se compara con los datos si-
guientes y mientras sea menor permanecerá como mínimo. Cuando un elemento sea
mayor que el próximo, éste último pasa a ser el nuevo mínimo y se procede a compa-
rarlo con el que sigue. Cuando el registro B contador de elementos llegue a cero, el
mínimo estará en el acumulador. El procedimiento para encontrar el mayor es similar
como se deduce del listado del programa.

La salida del ensamblador para el archivo del ejemplo se muestra a continua-


ción.

ASM80 EJEM2.SRC
ISIS-II 8080/8085A MACRO ASSEMBLER, V4.1 MODULE PAGE 1

LOC OBJ LINE SOURCE STATEMENT


0200 1 ORG 0200H
0010 2 NUM EQU 010H
3
0200 210203 4 LXI H,TABLA
0203 0610 5 MVI B,NUM
0205 7E 6 MOV A,M
0206 23 7 LAZO1: INX H
0207 05 8 DCR B
0208 CA1302 9 JZ MENOR
020B BE 10 CMP M
020C DA0602 11 JC LAZO1
020F 7E 12 MOV A,M
0210 C30602 13 JMP LAZO1
0213 320003 14 MENOR: STA MIN
0216 210203 15 LXI H,TABLA
0219 7E 16 MOV A,M
021A 0610 17 MVI B,NUM
021C 23 18 LAZO2: INX H
021D 05 19 DCR B
021E CA2902 20 JZ MAYOR
0221 BE 21 CMP M
0222 D21C02 22 JNC LAZO2
0225 7E 23 MOV A,M
0226 C31C02 24 JMP LAZO2
0229 320103 25 MAYOR: STA MAX
022C 76 26 HLT
27
0300 28 ORG 0300H
29
0300 30 MIN: DS 1
Desarrollo y Simulación de Programas 349

0301 31 MAX: DS 1
0302 64 32 TABLA: DB 64H,45,23Q,60H,90H,3H,24H,15H
0303 2D
0304 13
0305 60
0306 90
0307 03
0308 24
0309 15
33
030A 20 34 DB 20H,15,34H,80H,50H,2H,101011B,30
030B 0F
030C 34
030D 80
030E 50
030F 02
0310 2B
0311 1E
35
36 END

PUBLIC SYMBOLS

EXTERNAL SYMBOLS

ISIS-II 8080/8085A MACRO ASSEMBLER, V4.1 MODULE PAGE 2

USER SYMBOLS

LAZO1 A 0206 LAZO2 A 021C MAX A 0301 MENOR A 0213


MIN A 0300 NUM A 0010

MAYOR A 0229 TABLA A 0302

ASSEMBLY COMPLETE, NO ERRORS

Para cargar los elementos de la tabla se usan dos directivas DB. Observe que
el ensamblador carga los datos a partir de la dirección 0300H seleccionada por la se-
gunda directiva ORG en la línea 28.

Directivas generales para relocalización de código

Todo lo expuesto en páginas anteriores sobre la sintaxis del lenguaje ensam-


blador para el 8085A es válido para un gran número de las versiones disponibles del
traductor y ofrecidas por segundas fuentes. Esto significa que un programa escrito
para ser traducido por el ASM80 de INTEL puede ser usado como entrada de otro en-
Desarrollo y Simulación de Programas 350

samblador realizando pequeñas modificaciones al código fuente. Por ejemplo, algu-


nos programas ensambladores en lugar de usar la nomenclatura: 02BH para represen-
tar el número 4310 en hexadecimal, utilizan: 0x02B, H02B, o simplemente 02B. Co-
mo otro ejemplo, los símbolos %IF y %ENDIF sustituyen a las directivas IF y EN-
DIF.

A diferencia de lo establecido en el párrafo anterior para la sintaxis del traduc-


tor, el número y tipo de directivas generales usadas para controlar la generación de
código relocalizable y el posterior enlazado de los módulos objetos, si presenta dife-
rencias representativas de una versión de ensamblador a otra. En esta sección se dis-
cuten las directivas para relocalización del Macroensamblador AVMAC85, resaltando
que todo lo expuesto en páginas anteriores sobre el lenguaje ensamblador es válido
para el AVMAC85. Para ilustrar el uso de este traductor, considere que prueba.asm es
el nombre de un archivo fuente. La sintaxis del comando necesario para ensamblar el
programa fuente, es la siguiente:

C:\avmac85 prueba

Como resultado se obtienen dos archivos:


prueba.obj archivo objeto
prueba.prn. archivo de listado

Aunque el programa fuente conste de un módulo de entrada único y sólo con-


tenga segmentos absolutos, el archivo objeto puede ser procesado por AVLINK por
medio del comando:

C:\avlink nombre=prueba.obj

Como salida se obtiene un archivo en formato HEX INTEL llamado: nom-


bre.hex.

El programa enlazador/relocalizador denominado AVLINK, puede procesar va-


rios módulos con segmentos reubicables y crear un archivo único ejecutable, a partir
de los segmentos de cada archivo fuente. La sintaxis del enlazador se detalla en la
figura 7.25. Aunque parece engorroso especificar por línea de comando, las órdenes
necesarias para configurar y ejecutar el enlazador, más adelante se explicará como es
posible automatizar el proceso de ensamblar y enlazar los archivos de un programa
fuente.

El AVMAC85 puede distinguir dos tipos de directivas para relocalización de


código: aquellas usadas para definir y seleccionar los segmentos del programa (DEF-
SEG y SEG) y las usadas para dirigir el enlazado del código objeto relocalizable (PU-
BLIC y EXTERN).

En la tabla 7.8 se especifican las directivas de ensamblador usadas para relo-


calización del código.
Desarrollo y Simulación de Programas 351

Fig.7.25. Pantalla de ayuda del programa AVLINK.

Tabla. 7.8. Directivas para relocalización de código.


DEFSEG Asigna el nombre de un segmento.
SEG Activa el segmento.
PUBLIC Define un símbolo público.
EXTERN Define un símbolo externo.

El código es ensamblado y enlazado para ejecutarse en direcciones lógicas. El


hecho que las direcciones del µP sean cantidades de 16 bits limita el tamaño de los
segmentos a un valor menor o igual 64K. Los distintos segmentos usados por el pro-
gramador en una aplicación determinada deben definirse al inicio del programa. La
selección de un segmento previamente definido causa que toda instrucción o dato
subsiguiente sea ensamblado en esa área de memoria. Los segmentos se usan para
definir la posición en memoria del código, datos constantes y datos que pueden ser
modificados.

A continuación se presentan las directivas usadas para la definición y activa-


ción de segmentos.

DEFSEG

La sintaxis de esta directiva es,

DEFSEG nombre , atributos

Define un segmento de usuario denominado nombre. Si no se especifican atri-


butos, el segmento es relocalizable y de clase CODE. El punto de carga del nuevo
Desarrollo y Simulación de Programas 352

segmento es puesto a cero. Los segmentos son por defecto relocalizables y concate-
nables. Esto significa que tal sección de código o datos se concatena (uno se inicia
donde termina el otro) con otros segmentos del mismo nombre, incluso si residen en
módulos distintos.

DEFSEG define el segmento pero no lo activa. Aunque los atributos son de-
clarados en el archivo fuente esta información no es usada por el ensamblador. En
realidad la definición de los atributos de un segmento es prorrogada hasta el momento
del enlazado. Los atributos permitidos son los siguientes y deberán estar separados
por comas,
START= expresión

Asigna la dirección lógica de inicio del segmento. Si éste es absoluto, actúa como una direc-
tiva ORG. En caso contrario, START indica al enlazador la dirección de origen del segmento
relocalizable. Este atributo se usa para aquellos segmentos reubicables que solo pueden ser
cargados en direcciones determinadas. Puede ser usado para indicar que el código debe car-
garse en EPROM o EEPROM y que los resultados deben almacenarse en la zona de RWM.
La información de START es usada por el enlazador/relocalizador y puede ser modificada en
el momento del enlace, como se observa en las opciones del AVLINK en la figura 7.28.

ALIGN= valor

Fija el alineamiento del segmento. Cuando el segmento es enlazado por AVLINK, el atributo
START= es ajustado para que se inicie en valor, donde éste debe ser una potencia de dos. Si
valor no es potencia de dos, el alineamiento ocurre en la dirección representada por la poten-
cia de dos inmediatamente inferior a valor.

CLASS= clase

Es opcional y asigna el nombre de la clase del segmento. Si el atributo CLASS es omitido, la


clase CODE se fija por defecto.
Las clases válidas son:
CODE Ubica al segmento en la clase CODE. Este es un segmento relocalizable de memoria.
DATA Coloca al segmento en la clase DATA. Este es un segmento relocalizable de memoria
IOSPACE Pone al segmento en la clase IOSPACE. Este es un segmento relocalizable del espacio
de entrada/salida del procesador.

Debido a que los chips microcontroladores tienen una arquitectura con área determinadas de
memoria interna, las clases son vitales para especificar la clase de espacio de memoria donde
residirá el segmento. En el caso del AVMAC85, éste no parece distinguir entre las clases
CODE y DATA, en el sentido que no agrupa segmentos de la misma clase. El ensamblador si
diferencia los segmentos de memoria 'M' (CODE y DATA) de aquellos de entrada/salida 'I'
(IOSPACE). Esta discriminación hace posible definir segmentos M e I en el mismo rango de
direcciones, debido a que corresponden a posiciones lógicas pertenecientes a espacios distin-
tos. Aunque en la figura 7.28 se indica que existen opciones de AVLINK para fijar la direc-
ción de inicio y final de los segmentos pertenecientes a una clase, las pruebas realizadas no
tuvieron éxito.

ABSOLUTE

Establece que el segmento es absoluto. Asignar este atributo hace posible el uso de ORG di-
rección en el cuerpo del segmento, recuerde que si no declara atributos al definir un segmen-
to, éste será relocalizable por defecto y el uso de la directiva ORG causará la emisión de un
Desarrollo y Simulación de Programas 353

mensaje de error. El comando ORG dirección puede utilizarse en un segmento relocalizable


pero únicamente si éste tiene el atributo START= y pertenece por entero a un módulo.

OVERLAID

Este atributo sólo puede ser usado para segmentos del mismo nombre en más de un módulo.
Si el segmento tiene START=, la condición OVERLAID permite el uso de la directiva gene-
ral ORG dirección, aunque el segmento resida en varios módulos. Además el atributo indica
que secciones del programa con el mismo nombre pueden ocupar direcciones que se solapan
en el espacio de direcciones lógicas aunque permanecen en direcciones físicas diferentes. Esto
permite el uso de bancos de memoria conmutados durante la ejecución.

BLOCK= expresión

Fija el valor máximo permitido para el segmento. Si esta restricción es violada, AVLINK ge-
nera un mensaje de error.

Ejemplos:

DEFSEG PROG, CLASS=CODE, START=0

DEFSEG LAB, BLOCK=8000h, CLASS=CODE

DEFSEG ABS, ABSOLUTE, START=40H

DEFSEG SOLP, OVERLAID

DEFSEG DATO, ALIGN=80H

SEG

Activa el segmento llamado nombre definido previamente con la directiva


DEFSEG. Su sintaxis tiene la forma,

SEG nombre

Toda instrucción o dato declarado a continuación se ensamblará en este seg-


mento, hasta que el bloque sea desactivado por otra directiva SEG que seleccione un
nuevo segmento. Cada clase tiene un segmento predefinido por el ensamblador, los
cuales son de uso opcional por el programador. La directiva SEG puede activar a los
bloques predefinidos con nombres: CODE, DATA e IOSPACE sin requerir el uso de
DEFSEG para estos segmentos.

Ejemplos:

DEFSEG PROG, CLASS=CODE, START=0


SEG PROG
lxi sp,stack
xra a
.
.
.
Desarrollo y Simulación de Programas 354

SEG CODE
lxi sp,stack
xra a
.
.
.
DEFSEG DATOS, CLASS=DATA, START=2000H
SEG DATOS
DB 1,2,3,4,5,6,7,8

SEG DATA
DB 1,2,3,4,5,6,7,8

DEFSEG ABS, ABSOLUTE


SEG ABS
ORG 300H
DB 'UDO 2003'

ORG 500H
DB 'Prueba final'

Observe que los segmentos CODE y DATA no fueron definidos antes de su


selección. El segmente CODE es ensamblado a partir de la dirección cero y una vez
terminado se ensambla el bloque DATA. En el momento del enlace puede definirse la
dirección de carga de un segmento usando la opción AVLINK: -PS (nombre_seg, dir).

Las directivas restantes: PUBLIC y EXTERN, usadas en relocalización de có-


digo, hacen posible la comunicación entre los diferentes módulos que componen un
programa. Una rutina contenida en un módulo determinado puede ser llamada desde
otro módulo y una etiqueta de direcciones o datos puede ser usada por el código loca-
lizado en un archivo fuente, aunque ésta sea definida en otro.

PUBLIC

Declara que el operando etiqueta tiene un alcance publico. Puede especificarse


más de una etiqueta, en cuyo caso deben separarse por comas.

PUBLIC etiqueta

El símbolo etiqueta deberá estar definido en el módulo donde se declara como


público y estará disponible para uso de los otros módulos del programa. Sólo puede
existir una directiva PUBLIC para una etiqueta. Un símbolo externo no puede defi-
nirse como público.

EXTERN

Especifica que el operando etiqueta tiene un alcance externo. Puede especifi-


carse varias etiquetas separadas por comas.

EXTERN etiqueta
Desarrollo y Simulación de Programas 355

Hace posible el uso en un módulo de una etiqueta aunque esté definida en


otro módulo. El símbolo etiqueta deberá ser declarado como público en el módulo
donde es definido o en caso contrario AVLINK emitirá un mensaje de error.

Si en un mismo archivo fuente o en módulos diferentes se define una etiqueta


más de una vez, se produce una indicación de error por definiciones múltiples de un
mismo identificador. Una solución a este obstáculo es el uso de procedimientos, los
cuales permite el uso de símbolos locales conocidos sólo dentro del procedimiento.
Esto significa que una etiqueta local puede ser usada en otra sección del programa sin
causar error. Un procedimiento es una forma de escribir una subrutina. Las siguientes
directivas definen un procedimiento,

PROC y ENDPROC

El inicio de un procedimiento denominado nombre, lo marca la directiva


PROC.

nombre PROC ; inicio procedimiento nombre

Considere que los siguientes procedimientos pertenecen a un mismo progra-


ma. El uso de la etiqueta data dos veces no causa mensaje de error debido a que toda
identificador cuyo nombre va precedido por (..) sólo es conocido entre la directiva
PROC anterior y la directiva ENDPROC posterior. El símbolo data tiene alcance lo-
cal al ser precedido por dos puntos contiguos.

ylog PROC
..data ds 10H ; Primera definición del identificador: data
ENDPROC

yln PROC ; Segunda definición del identificador: data


..data ds 10H
ENDPROC

El ejemplo siguiente muestra el uso de procedimientos y símbolos locales.

Ejemplo 7.8

Debe escribirse un programa que examine el contenido del acumulador y si:

(A) = 'M' (HL) Å (C) • (E)

(A) ≠ 'M' (H) Å (C) ÷ (E) (L)Åresiduo


Desarrollo y Simulación de Programas 356

Las operaciones aritméticas se realizan con operandos de 8 bits y deben usarse


procedimientos para cada una. La multiplicación se hará por sumas sucesivas y la
división por restas sucesivas.

stack: equ 07ffh

lxi sp,stack
cpi 'M' ; Compare A con ASCII M
jnz salto ; Si igual, multiplique
call mul
hlt
salto: call div ; Si no igual, divida
hlt

; Multiplicación por sumas sucesivas (HL)Å (C)*(E)

mul PROC
lxi h,0 ;Resultado cero al inicio
mov b,h ;Operando de 8 bits, B a cero
..salto: dad b ;HL = HL + BC
dcr e
jnz ..salto ;Repetir las veces que indique el multiplicador
ret
mul ENDPROC
; División por restas sucesivas (H)Å(C)/(E) (L)Åresiduo

div PROC
mvi h,0
mov a,c
..salto: sub e
cmp e
inr h
jnc ..salto
mov l,a
ret
div ENDPROC
END

El programa supone que los operandos son cargados en los registros B (multi-
plicando o dividendo) y en C (multiplicador o divisor). El resultado de 16 bits del
producto se almacena en el registro par HL. El cociente de 8 bits se deposita en L y
el residuo en E. Observe que la etiqueta salto se define dos veces, pero al ser un sím-
bolo local no hay indicación de error.

A continuación se presenta un ejemplo que muestra los pasos a seguir para


programar una tarea en forma modular e ilustra el proceso de ensamblaje, enlazado y
relocalización de distintos segmentos contenidos en módulos diferentes.
Desarrollo y Simulación de Programas 357

Ejemplo 7.9

La tarea a programar consiste en adquirir dieciséis valores hexadecimales del


puerto de entrada con dirección 8 y almacenarlos en posiciones consecutivas de la
memoria RWM del sistema. Estos datos representan ocho números de 16 bits, a cada
uno de los cuales debe extraérsele la raíz cuadrada. Los resultados de cada operación
deben cargarse en la memoria RWM. Suponga que el sistema tiene de 2Kbytes de
EPROM con inicio en cero y ¼ de Kbytes de RWM a partir de 0800H. Cada vez que
un nuevo dato esté disponible para lectura el bit 7 del puerto de entrada 9 se pone a
nivel alto

. El diagrama eléctrico de los puertos del sistema se muestra en la figura 7.26.


El puerto 8 consiste de un registro latch del tipo 74LS373 y el puerto de entrada 9 se
realiza con un buffer de tres estados 74LS125. Cuando el dispositivo externo coloca
un dato en las entradas D0-D7 del puerto 8, el flanco positivo de la señal CLK lo trans-
fiere a la salida de los flip-flops internos del latch.

Estas salidas siguen el valor de las entradas hasta que el flanco negativo de
CLK retiene el último dato. Esta última transición también carga un estado lógico alto
en la salida Q del biestable 74LS74 anunciando la presencia de un nuevo valor de
entrada. En este momento el pulso CLK ha desaparecido, la indicación de dato listo el
dato está activa y la información ha sido cargada por el periférico en el interior del
registro. Este mantiene sus salidas en tercer estado porque la entrada OC de habilita-
ción de salida está en nivel alto.

El programa se mantiene leyendo continuamente el puerto 9 hasta detectar que


esté en nivel alto, en cuyo caso leerá el valor en el puerto de entrada 8. Observe que
cada vez que se carga un dato en el µP desde el registro latch, la salida Q del flip-flop
D se pone a cero y se mantiene en este estado hasta cuando el periférico coloque un
nuevo dato.

La figura 7.28 muestra los resultados de la simulación del circuito de puertos


usando la herramienta ORCAD/PSPICE. En t =0, el periférico coloca el dato
10101010 a la entrada del 74LS373 y activa el pulso CLK en t =5 uS. El puerto 0 se
lee en t =10.45 uS y el puerto 8 en t =15.43 uS. Las líneas triples indican estado de
alta impedancia.

Las tareas a realizar por el programa se distribuirán en cinco módulos en ar-


chivos particulares. Estos son:

PRPAL.ASM: Programa principal.


ENTSAL.ASM: Rutina de manejo de datos y resultados
ADAT.ASM: Rutina de adquisición de datos.
RAIZ.ASM: Extrae la raíz cuadrada entera de un número de dos bytes.
DIV1616.ASM: Código usado por RAIZ.
Desarrollo y Simulación de Programas 358

Fig.7.26. Puertos de entrada para el ejemplo 7.9.

Fig.7.27. Diagrama estructurado del programa del ejemplo 7.8


Desarrollo y Simulación de Programas 359

Fig. 7.28 Salidas de la simulación con ORCAD/PSPICE para el circuito de la figura 7.26.
Desarrollo y Simulación de Programas 360

Los módulos se organizan en forma jerárquica como se ilustra la figura 7.27.


En el programa principal se define la pila y todas las constantes. El programa PPRAL
llama a la rutina ENTSAL la cual almacena en memoria los datos de entradas adqui-
ridos por el subprograma ADAT. A continuación ENTSAL extrae un número de 16
bits desde la memoria y llama al módulo RAIZ, el cual a su vez usa la rutina
DIV1616 para extraer la raíz cuadrada del valor. Finalmente la rutina ENTSAL carga
el resultado en la memoria del sistema.

El código fuente de cada módulo del programa se presenta a continuación:

$title(Procesamiento de tabla de valores)


$subtitle(Cálculo de raiz cuadrada)
;Modulo de programa principal

public p8,pb9,tabl,sqrt,temp1
extern entsal
;---------------------------------------------------------------------------------------------------------------------------------

i_stack equ 08F0H ; Inicio de la pila


i_rwm equ 0800H ; Dirección de inicio de RWM
ndatos equ 10H ; número de datos de entrada
;---------------------------------------------------------------------------------------------------------------------------------
; Definición de segmentos
defseg puertos,start=8, class=iospace ; Dirección de puertos de entrada
defseg stack, start=i_stack ; La pila reside en la RWM
defseg datos, class=data, start=i_rwm ; 256 bytes de RWM a partir de 0800H
defseg progr, class=code, start=0 ; 2k de EPROM desde 0000H
;---------------------------------------------------------------------------------------------------------------------------------
; Puertos de entrada del sistema
seg puertos
p8 ds 1
p9 ds 1
;---------------------------------------------------------------------------------------------------------------------------------
; Los 16 bytes últimos de RWM soportan el stack.

seg stack
ds 10H
;---------------------------------------------------------------------------------------------------------------------------------
t_stack:equ $-1 ; Base de la pila

; Segmento de datos en RWM

seg datos
tabl ds 10H
sqrt ds 10H
temp1 ds 2
;---------------------------------------------------------------------------------------------------------------------------------
; Segmento de código en EPROM

seg progr
lxi sp,t_stack ;Se carga el apuntador de pila
mvi b,ndatos ;Contador de valores de entrada
lxi h,tabl ;Dirección del elemento 1 de la tabla de valores
call entsal ;Se inicia proceso
hlt ;Fin de programa
end
;---------------------------------------------------------------------------------------------------------------------------------
Desarrollo y Simulación de Programas 361

$title(Entrada de datos y salida de resultados)


;Modulo ENTSAL

public entsal,noper
extern adat,raiz,tabl,sqrt

noper equ 8 ;Son 8 números de 2 bytes

defseg progr
seg progr

entsal: call adat ;Obtiene los 16 valores desde el puerto 8


mvi a,noper ;Contador de números de 16 bits
lxi b,sqrt ;Dirección de los resultados en BC

lxi h,tabl ;Dirección de los datos en HL


prox: push psw
mov e,m
inx h
mov d,m
push h
push d
xchg
push b
call raiz ;Se extrae la raíz del contenido de HL
mov a,e ;resultado en DE
pop b
stax b ;Se almacena byte bajo del resultado.
inr c
mov a,d
stax b ;Se almacena byte alto del resultado
inr c ;BC apunta al número siguiente
pop d
pop h
pop psw
dcr a
inx h ;Apunta a próximo dato
jnz prox ;Terminar si se procesaron todos los valores.
ret
end

;---------------------------------------------------------------------------
; Los datos desde el puerto se cargan en memoria en posiciones
; consecutivas y representan 8 valores de 16 ;bits.
; Datos de entrada: Puerto 08
; Bit de control: Línea 7 del puerto 09
;---------------------------------------------------------------------------
$title(adquisición de datos)
;Modulo ADAT

public adat
extern p8,p9
defseg adatos
seg adatos
adat: in p9
ani 80H
jz adat
in p8
mov m,a
inx h
dcr b
jnz adat
ret
end
Desarrollo y Simulación de Programas 362

$title(Cálculo de raìz cuadrada) $title(División entera 16x16)


;Modulo RAIZ ;Modulo DIV1616

public raiz public div1616


extern div1616,temp1 defseg progr
defseg progr seg progr
seg progr div1616: mvi a,10H
raiz: shld temp1 lxi h,0
mov a,h div161: xchg
rrc dad h
mov a,l xchg
rar jnc yyy
mov c,a dad h
rep: lhld temp1 inr l
xchg jmp www
call div1616 yyy: dad h
mov h,b www: inr e
mov l,c push psw
dad d mov a,l
inx h sbb c
mov a,h mov l,a
rar mov a,h
mov d,a sbb b
mov a,l mov h,a
rar jnc div162
mov e,a dcr e
mov a,b dad b
cmp d div162: pop psw
jnz cont dcr a
mov a,c jnz div161
cmp e ret
rz end
cont: mov b,d
mov c,e
jmp rep
end

Para generar el archivo ejecutable denominado ejem78.hex, se ejecuta la si-


guiente secuencia de comandos:

avmac85 prpal.asm
avmac85 calc.asm
avmac85 adat.asm
avmac85 raiz.asm
avmac85 div1616.asm
avlink ejem78=prpal.obj calc.obj adat.obj raiz.obj div1616

El programa ejemplo consta de cuatro segmentos definidos en el programa


principal, tres de los cuales son de memoria (progr, stack y datos) y el restante (puer-
tos) es de espacio de E/S. El segmento progr contiene el código del programa y se
origina en la dirección de inicio de la EPROM. Segmentos parciales del mismo nom-
bre se activan en cada módulo y son tratados por el enlazador como un segmento úni-
co de código.

El bloque stack corresponde al apila del sistema y se ubica en las posiciones


finales de la memoria RWM. El segmento datos reserva 32 posiciones de RWM para
los datos adquiridos y los resultados y 2 localidades para variables temporales. Fi-
nalmente, puertos define las direcciones de los puertos de entrada.
Desarrollo y Simulación de Programas 363

Cada archivo fuente se ensambla en forma independiente, generándose un


módulo objeto. Debido a que las direcciones reales no se conocen en el momento del
ensamblaje, el archivo objeto no contiene direcciones absolutas. El listado siguiente,
es la salida con extensión prn (lista) producto del ensamblaje del módulo entsal.asm.
Observe que por ser relocalizable el código dentro del módulo, las direcciones aún no
están definidas.

1 public entsal,noper
2 extern adat,raiz,tabl,sqrt
3
=0008 4 noper equ 8 ;Son 8 números de 2 bytes
5
6 defseg progr
7 seg progr
8
0000& CD 0000* 9 entsal: call adat ;Obtiene los 16 valores desde el puerto 8
0003& 3E 08 10 mvi a,noper ;Contador de números de 16 bits
0005& 01 0000* 11 lxi b,sqrt ;Dirección de los resultados en BC
0008& 21 0000* 12 lxi h,tabl ;Dirección de los datos en HL
000B& F5 13 prox: push psw
000C& 5E 14 mov e,m
000D& 23 15 inx h
000E& 56 16 mov d,m
000F& E5 17 push h
0010& D5 18 push d
0011& EB 19 xchg
0012& C5 20 push b
0013& CD 0000* 21 call raiz ;Se extrae la ramz del contenido de HL
0016& 7B 22 mov a,e ;resultado en DE
0017& C1 23 pop b
0018& 02 24 stax b ;Se almacena byte bajo del resultado.
0019& 0C 25 inr c
001A& 7A 26 mov a,d
001B& 02 27 stax b ;Se almacena byte alto del resultado
001C& 0C 28 inr c ;BC apunta al nzmero siguiente
001D& D1 29 pop d
001E& E1 30 pop h
001F& F1 31 pop psw
0020& 3D 32 dcr a
0021& 23 33 inx h ;Apunta a prsximo dato
0022& C2 000B& 34 jnz prox ;Terminar si se procesaron todos los valores.
0025& C9 35 ret
36 end

El programa enlazador/relocalizador usa la información suministrada por las


directivas de relocalización declaradas en el cuerpo del programa para generar un mó-
dulo ejecutable con direcciones completamente definidas. Cuando el enlazador av-
link.exe se ejecuta activando la opción –sm, se genera en forma adicional un archivo
ASCII con extensión map que contiene información detallada sobre el proceso de
enlazado. En la página que sigue se muestra el contenido de este archivo.

Observe que los módulos predefinidos por el ensamblador (CODE, DATA e


IOSPACE) no se usan. Modificando el programa principal se puede variar el número
de valores a procesar y el área de almacenamiento de datos y resultados. Además, si
en lugar de extraer la raíz cuadrada se requiere realizar alguna otra operación sobre
los datos, se deben sustituir los módulos correspondientes y las nuevas rutinas deben
ser llamadas desde ENTSAL.
Desarrollo y Simulación de Programas 364

AVLINK ---- LOAD MAP


For: Avocet 8085/Z80 Assembler v2.02, #01235

RELOCATED SEGMENTS - CLASS 'I'

SEGMENT NAME START STOP LENGTH ovl/cat def/undef


PUERTOS 0008 0009 0002 Concat Defined

RELOCATED SEGMENTS - CLASS 'M'

SEGMENT NAME START STOP LENGTH ovl/cat def/undef


PROGR 0000 007b 007c Concat Defined
ADATOS 007c 008b 0010 Concat Defined
DATOS 0800 0821 0022 Concat Defined
STACK 08f0 08ff 0010 Concat Defined

ZERO LENGTH SEGMENTS

SEGMENT START
CODE 0000
DATA 0000
IOSPACE 0000

SYMBOLS -- CLASS 'I'

SYMBOL NAME START SYMBOL'S SEGMENT def/undef


P8 0008 PUERTOS Defined
P9 0009 PUERTOS Defined

SYMBOLS -- CLASS 'M'

SYMBOL NAME START SYMBOL'S SEGMENT def/undef


ENTSAL 000c PROGR Defined
RAIZ 0032 PROGR Defined
DIV1616 0058 PROGR Defined
ADAT 007c ADATOS Defined
TABL 0800 DATOS Defined
SQRT 0810 DATOS Defined
TEMP1 0820 DATOS Defined

SYMBOLS -- CLASS 'N'

SYMBOL NAME START SYMBOL'S SEGMENT def/undef


NOPER 0008 ABSOLUTE Defined

No Transfer Address.

MODULE DATA --------

MODULE: prpal NUMBER OF SEGMENTS: 7

SEGMENT NAME OFFSET STOP LENGTH


CODE 0000 0000 0000
DATA 0000 0000 0000
IOSPACE 0000 0000 0000
PUERTOS 0000 0001 0002
STACK 0000 000f 0010
DATOS 0000 0021 0022
PROGR 0000 000b 000c

MODULE: entsal NUMBER OF SEGMENTS: 4

SEGMENT NAME OFFSET STOP LENGTH


CODE 0000 0000 0000
DATA 0000 0000 0000
IOSPACE 0000 0000 0000
PROGR 000c 0031 0026
Desarrollo y Simulación de Programas 365

MODULE: adat NUMBER OF SEGMENTS: 4

SEGMENT NAME OFFSET STOP LENGTH


CODE 0000 0000 0000
DATA 0000 0000 0000
IOSPACE 0000 0000 0000
ADATOS 0000 000f 0010

MODULE: raiz NUMBER OF SEGMENTS: 4

SEGMENT NAME OFFSET STOP LENGTH


CODE 0000 0000 0000
DATA 0000 0000 0000
IOSPACE 0000 0000 0000
PROGR 0032 0057 0026

MODULE: div1616 NUMBER OF SEGMENTS: 4

SEGMENT NAME OFFSET STOP LENGTH


CODE 0000 0000 0000
DATA 0000 0000 0000
IOSPACE 0000 0000 0000
PROGR 0058 007b 0024

7.4 HERRAMIENTAS PARA DESARROLLO DE PROGRAMAS

La realización de un proyecto de una aplicación basada en μPs transciende el


simple uso de un ensamblador. En el diseño de sistemas de cierta envergadura es casi
obligatoria la presencia de un sistema de desarrollo, el cual por su costo elevado rara
vez está a la disposición de quienes asisten a un curso básico de sistemas de μP. Una
solución común para superar este obstáculo es desarrollar el programa usando un µC
de propósito general, un PC por ejemplo, dotado con las herramientas de programa-
ción mínimas necesarias, estas son: editor de textos, ensamblador cruzado, enlaza-
dor/relocalizador y un simulador del µP. En la figura 7.29 se muestra un diagrama de
flujo de los pasos a seguir para el diseño de programas usando estos recursos.

Un sistema de desarrollo y emulador profesional para el 8085A puede costar


la astronómica cifra de $6000, aunque es posible adquirir sistemas de bajo costo con
menos prestaciones por menos de una décima parte del precio señalado. Aunque en la
actualidad pueden obtenerse en INTERNET más de veinte simuladores para el 8085A,
con ejecución en plataformas Linux y Windows, la situación hace diez años era bien
diferente ya que el estudiante de Sistemas de Microprocesadores no disponía de si-
mulador alguno.

Para solventar este problema se desarrolló en el año 1995, el Sistema Integral


de Desarrollo para el Microprocesador 8085 (SID85), realizado como tesis de grado
por el Ing. César García, egresado de nuestra Universidad. El SID85 ofrece en un
ambiente orientado a ventanas los siguientes recursos:
Desarrollo y Simulación de Programas 366

Fig.7.29 Fases del desarrollo del programa


Desarrollo y Simulación de Programas 367

• Editor de texto.

• Ensamblador cruzado (ASM85).

• Simulador del μP8085A (SIM85).

• Conexión con el microcomputador MPR85.

El SID85 representó, sin duda alguna, un recurso de gran valor para la ense-
ñanza de μPs y para el desarrollo de aplicaciones. Un programa puede ser creado y
modificado, simulado en modo de corrida libre o paso a paso, ofreciendo capacidad
de edición de registros, memoria y puertos de E/S. El SID85 permite la simulación de
interrupciones de hardware y de las líneas de comunicación serie. Una tarjeta para
desarrollo MPR85 conectada al puerto paralelo del PC, habilita la prueba en tiempo
real del programa bajo desarrollo.

Si se toma en cuenta que un programa objeto creado y depurado con el SID85


está listo para ser grabado en EPROM, es justo decir que se dispone de un sistema de
desarrollo de bajo costo. Es obvio que la utilización del SID85 garantiza que la gra-
bación de la memoria EPROM solo se realiza una vez, cuando el programa pasa la
prueba de la simulación y de la ejecución en tiempo real. Información adicional sobre
el SID85 puede obtenerse en el informe del trabajo de grado.

Para ilustrar el uso de nuestro primer simulador, se usa el SID85 con el pro-
grama del ejemplo 7.6. El la figura 7.30 se muestra la pantalla de inicio del programa.

Fig.7.30 Presentación del SID85


Desarrollo y Simulación de Programas 368

Fig.7.31 Editor del SID85

Al ensamblar el archivo ejem7_6.asm, se generan: ejem7_6.lst y ejem7_6.obj.


El procedimiento para realizar la simulación, es el siguiente:

1. Se carga el archivo ejem7_6.obj en la dirección de memoria 0000H. El código objeto


ocupa 55 bytes consecutivos de la RAM 1 del sistema, como muestra la figura 7.32.

Fig7.32 Editor de memoria del SID85 mostrando como se almacena en la RAM el código objeto del
ejemplo 7.6.

1
Hasta 4 K en el SIM85, con posibilidad de extenderse a 64 K
Desarrollo y Simulación de Programas 369

2. Se activa el editor de registros de la figura 7.33a para almacenar en el contador de pro-


grama la dirección de inicio del programa a ejecutar. En este caso no existe necesidad de
cambiar el contenido del PC, debido a que apunta a la dirección 0000H.

(a)

(b)

Fig.7.33 (a) Registros internos del µP b) Ventana de selección modo de ejecución.


Desarrollo y Simulación de Programas 370

3. Debido a que para lograr su propósito, la rutina del ejemplo 7.6 se hace referencia a la
memoria (dirección 1000H) y a los puertos de E/S (00, 01 y 02), se activan los editores de
memoria y puertos en las direcciones señaladas, como ilustran las figuras 7.34 y 7.35.

Fig 7.34. Bloque de memoria 1000H-1077H, mostrando los resultados de la simulación.

Fig. 7.35 Editor de puertos del SID85

La simulación debe ejecutarse paso a paso. El periférico conectado al puerto


de entrada señala al μP, con un pulso de control en el bit 0 del puerto 02H, que en el
puerto 00H existe un caracter válido para lectura.

Para probar el programa se edita el puerto de entrada 00H y se escribe el pri-


mer caracter. El pulso de habilitación se simula escribiendo la palabra de control 01H
(subida del pulso) en el puerto 02H, se activa el paso a paso hasta que el caracter sea
Desarrollo y Simulación de Programas 371

almacenado en memoria, si es un dígito válido, o escrito al puerto 01H, en caso de no


ser un caracter hexadecimal. Para la lectura de un nuevo caracter, el pulso de control
debe ir primero a cero (bajada del pulso), escribiendo 00H en el puerto 02H, antes de
que se registre el nuevo caracter. El proceso continúa hasta que sean escritos los 16
dígitos, y el control sea transferido al sistema.

Si la ejecución se hace en modo de corrida libre (RUN), el sistema entrará en


un lazo, esperando que el pulso de control suba a nivel alto. Debido a que en modo
RUN no es posible editar los puertos no es posible simular activar/desactivar el bit de
control.

Es posible escribir una rutina, en forma de programa principal, que transfiera


los 16 caracteres en forma automática hacia el puerto, y a la vez emule el pulso de
control. Cada vez que un caracter se presente al puerto, se llamaría a una subrutina
que se encargaría de distinguir los dígitos y escribirlos a memoria o puerto. Esta for-
ma requiere la realización de algunas modificaciones en el programa del ejemplo 7.6,
y solo sería un recurso para la depuración del programa. Recuerde que en el mundo
real la entrada del dato es controlada por el dispositivo de entrada, no por el procesa-
dor.

7.4.1 Programas para simulación del microprocesador 8085

El sistema integrado para desarrollo SID85 no es la única ni la mejor herra-


mienta disponible para desarrollar programas para el microprocesador 8085. Este
programa fue escrito por un estudiante del curso de Sistemas de Microprocesadores
dado la necesidad de disponer de un sistema de desarrollo de bajo costo para realizar
las asignaciones de la asignatura. En su momento y aun ahora el SID85 puede cumplir
tal función.

Versiones de evaluación, más o menos funcionales, de ambientes integrados


para desarrollo de código, y programas de uso público para simulación del 8085 pue-
den ser descargados de Internet.

El autor ha evaluado dos decenas de estos programas y se ha verificado su


funcionamiento. La mayoría operan en forma correcta aunque algunos fallas en la
ejecución de instrucciones específicas. Tales errores han sido participados a los auto-
res de los simuladores y en ciertos casos éstos han realizados las correcciones corres-
pondientes. Algunos de estos programas trascienden a la simple simulación de la eje-
cución de las instrucciones del CPU y se presentan como simuladores de un micro-
computador basado en el 8085, usando periféricos comerciales, teclado y pantalla de
visualización. Estos permiten el desarrollo de los programas de la aplicación en un
entorno muy similar al real.

En la figura 7.36 se muestran los iconos de 16 simuladores, todos contenidos


en el disco compacto entregado al inicio del curso.
Desarrollo y Simulación de Programas 372

8085 Instruction Set Simulator 8085 Simulator Ide 8085 Virtual Kit 8085-Simulator [SW]

Micro 3 AVSIM85 (DOS) Micro85 8085 Simulator

Microprocessor 8085 Simulator MPS85-KIT SID85 (DOS) Sim8085

Simulator Vsim Win85 WSIM85

Fig. 7.36 Algunos de los simuladores en el CD de trabajo.

La selección del simulador a usar depende estrechamente de las necesidades


de la aplicación. Si el usuario desea verificar la ejecución de un programa y examinar
el contenido de los registros, memoria y puertos de E/S; puede usar cualquiera de los
programas de la figura 7.36, La única excepción son: el 8085 Simulator y el MPS85-
KIT, los cuales sólo soportan puertos mapeados como memoria (no reconocen las
instrucciones IN/OUT). Si se desea simular la operación de periféricos comerciales
como el PPI 8255, módulo LCD, teclado para entrada de datos, transmisor/receptor
universal UART 8251, un controlador de teclado/display 8279; será necesario esco-
ger el WSIM85 como herramienta de simulación

Este trabajo no dispone de espacio para presentar en forma detallada el fun-


cionamiento de los programas. Todos disponen de algún tipo de ayuda y de ejemplos
para orientar a quien se inicia A continuación se presentan las características dignas
de resaltar de aquellos simuladores que se consideran de mayor utilidad para el cur-
so. Se recomienda al estudiante visitar la WEB periódicamente, en busca de nuevas
herramientas y de las actualizaciones de las versiones disponibles.

MICRO 85

Es una aplicación de ambiente WINDOWS que simula la operación de una tar-


jeta de evaluación comercial denominada MICRO 85. Puede editarse la memoria y
los registros incluyendo el de máscara de interrupción y el de banderas. Ofrece sopor-
te para interrupciones, pero no emula las líneas SID y SOD para comunicación serie.

El ambiente gráfico es muy amigable y los programas una vez ensamblados se


cargan automáticamente en memoria. Permite la ejecución del código en modo de
Desarrollo y Simulación de Programas 373

corrida libre y paso a paso. El ensamblador es limitado y el programa no corre en


ambientes Windows 2000, Millenium o XP.

Fig. 7.37 Editor de textos y contenido de la memoria 6264.

Las siguientes funciones de la tarjeta MICRO85, son simuladas por el pro-


grama.

• CPU 8085.
• Memoria RAM 6264 de 8K.
• Un PPI 8255.

Mapa de memoria

E000H-FFFFH RAM

Mapa de E/S

08H – 0BH PPI8255

Interrupciones

Los vectores de interrupción han sido cambiados según se indica:

TRAP 0024H ÆFFB0H


RST7.5 003CHÆFFB3H
RST6.5 0034H ÆFFB6H
Desarrollo y Simulación de Programas 374

RST5.5 002CHÆFFB9H
INTR Ejecuta una de las RST n
RST 0 0000HÆ0000H
RST 1 0008HÆFFCBH
RST 2 0010HÆFFC8H
RST 3 0018HÆFFC5H
RST 4 0020HÆFFC2H
RST 5 0028HÆFFBFH
RST 6 0030HÆFFCBH
RST 7 0038HÆFFCEH

En la figura 7.37 se observa el editor de textos y la ventana de memoria RAM.


Una vez escrito el programa fuente se pulsa el botón ensamblar y el programa es tra-
ducido y cargado en RAM.

Fig. 7.38 Registros internos del 8085 y sistema de interrupciones.

El contenido de los registros puede ser modificado en la ventana del CPU,


mostrada en la figura 7.38. El circuito para interconexión de E/S 8255 puede ser pro-
gramado en la ventana del PPI de la figura 7.39 o directamente por programa. El con-
tenido de los puertos de entradas también puede ser modificado.

Fig. 7.39 Puertos de Entrada y salida.


Desarrollo y Simulación de Programas 375

El ensamblador no contiene todas las funciones de un programa comercial pe-


ro en general, el simulador puede ser de alguna utilidad.

WSIM85

Es quizás el más útil de todos los simuladores del 8085. Es capaz de simular el
CPU y diversos dispositivos periféricos y el ensamblador es aceptable. La versión de
evaluación acepta programas hasta 256 bytes de tamaño. Desafortunadamente el ar-
chivo fuente debe ser ensamblado por un programa externo. Acepta archivos en for-
matos HEX y binario.

La aplicación WSIM85 tiene una opción de configuración que permite definir


el mapa de la memoria EPROM/RAM del sistema y los periféricos conectados al
8085. Los recursos disponibles son:

• Para especificar el tipo y capacidad de la memoria disponible, pueden definirse hasta 4


bancos de RAM/EPROM definiendo las direcciones de inicio y fin de cada banco.

• Pueden definirse las direcciones de los puertos de los controladores de periféricos a conec-
tarse al µP. Los módulos posibles de interconectar al 8085 son:

8279 Controlador programable de teclado/display.


8155 RAM + E/S + Temporizador.
8255 Interconexión programable de E/S
8251 Transmisor receptor universal.
8253 Temporizador programable.
LCD Módulo de cristal líquido

Las ventanas principales del WSIM85 se muestran en la figura 7.40 Se observa


la ventana de código, los registros internos, la memoria y de los módulos de E/S co-
nectados en la aplicación. Excepto el código todos estos elementos pueden ser modi-
ficados con un click del ratón. Cada controlador tiene su ventana de dialogo para
definir su modo de operación. Por ejemplo la figura 7.41 corresponde al 8279 pu-
diéndose especificar la dirección del puerto y la entrada de interrupción del 8085 a la
cual se conecta la salida de interrupción del 8279. También es posible definir los có-
digos de siete segmentos para los caracteres de acuerdo con el tipo de indicador utili-
zado.

Las opciones de este simulador son diversas y no pueden exponerse con deta-
lle en este trabajo. Se recomienda al estudiante el uso de esta herramienta por ser de
suma utilidad. La ayuda es aceptable y ofrece programas ejemplos. El programa en
memoria puede ejecutarse en corrida libre o en modo paso a paso. Acepta la inserción
de puntos de ruptura durante la corrida lo cual hace más fácil la depuración del códi-
go. Ofrece soporte para el sistema de interrupciones del microprocesador pero no
simula los terminales SID y SOD para comunicación serie.
Desarrollo y Simulación de Programas 376

Fig. 7.40 Entorno gráfico de WSIM85

Fig. 7.41 Ventana de configuración del controlador de teclado/display 8279


Desarrollo y Simulación de Programas 377

El autor escribió un programa mon85.asm para el control de un microcompu-


tador (µPro 85) con teclado y pantalla de 6 dígitos. El µC puede usar el teclado para
examinar y modificar la memoria RWM y los registros del 8085 y además se puede
ejecutar programas previamente cargados en la tarjeta. El código fue simulado en el
WSIM85. El resultado fue realmente un éxito que permitió desarrollar el software
para una aplicación real sin tener que construir el prototipo.

Otra ventaja de esta herramienta que supera el obstáculo del uso obligado de
un ensamblador externo, la representa el hecho que al aceptar la carga de archivos de
entrada desde la línea de comando, puede incorporase a un Entorno Integrado para
Desarrollo o IDE (Integrated Development Environment). El proceso de edición, en-
samblaje y enlazado se realiza con los recursos del IDE y al final se invoca el
WSIM85 para simular el archivo ejecutable.

MICRO3

Aunque este programa no simula controladores de periféricos comerciales su


modo de operación es de gran ayuda desde el punto de vista del seguimiento de la
ejecución del programa. El editor de instrucciones no es muy amigable pero tiene un
teclado de código que facilita la escritura del programa. Una vez introducido el pro-
grama se pulsa el botón RUN y el archivo fuente es ensamblado y el código objeto
es cargado en memoria. Como todos los simuladores el programa pude ser ejecutado
por pasos o en corrida libre. No soporta interrupciones ni los terminales para comuni-
cación serie. No tiene editor de memoria pero se pueden definir y modificar hasta
cuatro puertos de E/S.

Para controlar la ejecución del programa se pueden insertar puntos de ruptura


accionando el ratón sobre la instrucción correspondiente. Cuando el programa es eje-
cutado se presenta una ventana denominada simulador con la historia de las últimas
25 instrucciones ejecutadas, mostrando para cada una el contenido de los registros
internos, de las banderas y de los puertos de E/S. La figura 7.42 muestra la ventana de
código, el teclado de instrucciones y la ventana del simulador.

8085 Virtual Kit

Este recurso es un verdadero modelo de programación de una tarjeta real de


evaluación y entrenamiento para el microprocesador 8085A. Este software intenta
simular un sistema microprocesador con hardware real.

Por ejemplo el controlador de teclado/display opera en forma similar al 8279.


Posee un teclado totalmente funcional y 6 indicadores de siete segmentos para pre-
sentar información como ilustra la figura 7.43.
Desarrollo y Simulación de Programas 378

Fig. 7.42 Ventanas del simulador MICRO3.


Desarrollo y Simulación de Programas 379

Fig. 7.43 Ventana principal del 8085 Virtual Kit.

El SDA 85 tiene las siguientes características:

• Editor de textos excelente.


• Modela hardware similar al real.
• Programa monitor incorporado con posibilidad de modificación.
• Simulación de teclado e indicadores visuales.
• Soporte para interrupciones y comunicación serie.
• Ejecución de programas paso a paso.
• En el modo trace se visualiza la ejecución de instrucciones en el programa fuente.

Al no tener editor de memoria, sólo puede examinarse/modificarse la memoria


de datos desde el teclado pero los programas a ejecutar se cargan automáticamente en
RAM. Posee un editor de puertos pero los registros sólo pueden modificarse por pro-
grama, lo cual es una desventaja severa.

El programa monitor mon85.asm fue modificado y usado como monitor del


8085 Virtual Kit, funcionando en forma correcta. El archivo no solo incorpora el
examen/modificación de memoria y la ejecución de programas, sino que se incluye la
opción de examen/modificación de registros, función no realizada por la versión ori-
ginal del 8085 Virtual Kit.
Desarrollo y Simulación de Programas 380

8085 Simulador IDE

Este programa constituye una herramienta de gran valor para el desarrollo de


software de aplicaciones basadas en el microprocesador 8085. En un ambiente gráfico
integra un compilador BASIC, ensamblador, simulador del µP, depurador y desen-
samblador. Las características del programa son:

• Editor de texto y ensamblador integrado.


• Acepta la entrada de archivos con extensiones .obj y .hex.
• Editor de memoria.
• Módulo de dispositivos periféricos.
• Módulos externos.
• Editor de puertos.
• Administrador de puntos de ruptura.
• Compilador BASIC.
• Desensamblador.
• Registrador visual de la simulación.

La figura 7.44 muestra la ventana principal del programa donde se ob-


servan los registros internos incluyendo el registro de banderas (todos editables), la
última y la siguiente instrucción a ejecutar, el número de estados del programa, el
contador de instrucciones, las líneas de comunicación serie y las interrupciones del
microprocesador.

Fig. 7.44 Ambiente de trabajo del 8085 Simulator IDE.


Desarrollo y Simulación de Programas 381

Fig. 7.45 Editores de memoria y puertos.

Este programa se recomienda porque es muy completo y facilita la simulación


de código. El contenido de cualquier posición de memoria o de un puerto puede ser
modificado en el curso de la simulación. La figura 7.45 muestra los editores corres-
pondientes. Además el usuario dispone de un módulo de dispositivos periféricos,
mostrado en la figura 7.46, con indicadores luminosos conectados a las líneas de cua-
Desarrollo y Simulación de Programas 382

tro puertos de E/S y una ventana de un terminal ASCII de salida de información. La


herramienta módulos externos permite establecer una interconexión entre el modelo
de simulación y hasta 5 módulos externos diseñados como aplicaciones clien-
te/servidor. El controlador LCD de la figura 7.47 es un ejemplo de este tipo de re-
curso. La figura 7.48 presenta la ventana del administrador de puntos de rupturas,
mediante el cual se pueden fijar puntos de parada durante la ejecución del programa
en modo de corrida libre. Aunque se puede fijar la velocidad de ejecución del código
de entre cinco opciones, puede ser preferible usar este administrador debido a que
permite realizar la simulación por pasos, con un tamaño de paso variable y elegido
por el usuario.

Fig. 7.46 Módulo de dispositivos periféricos

Fig. 7.47 Módulo de pantalla de cristal líquido


Desarrollo y Simulación de Programas 383

Fig. 7.48 Administrador de puntos de parada

Otras herramientas como el compilador BASIC y el desensamblador son co-


mentadas en la ayuda del 8085 Simulator IDE.

VSim Simulador

Este es un programa limitado y sin mayores pretensiones. La ventana de traba-


jo se muestra en la figura 7.49 donde se observa los registros de internos y las bande-
ras, los controles para la simulación y el editor de memoria. También se dispone de
un editor de puertos. No se modela el sistema de interrupciones del µP ni los termina-
les SID y SOD para entrada y salida serie.

Pese a sus carencias, para aplicaciones que requieran simular entradas usando
interruptores lógicos y salidas a indicadores luminosos conectados a puertos del sis-
tema, puede simplificar el trabajo usar el panel de LED & Switch del VSim, mostrado
en la figura 7.50.
Desarrollo y Simulación de Programas 384

Fig. 7.49 Ventana principal del VSim.

Fig. 7.50 Módulo de interruptores y LEDs del VSim.


Desarrollo y Simulación de Programas 385

8085 Emulator (Win85)

El programa Win85 no tiene editor de textos ni ensamblador incorporado. La


memoria y los registros internos sólo pueden ser modificados por programa y única-
mente se dispone de un puerto de entrada y uno de salida. Soporta interrupciones y no
modela las el canal de comunicación serie.

A pesar de estas carencias, los periféricos conectados al sistema y los ejem-


plos que vienen con el software son de tal calidad que hacen que Win85 sea de uso
obligado para quienes siguen un curso introductorio de µPs con el 8085A. La figura
7.51 muestra los recursos que acompañan al emulador.

Fig. 7.51 Herramientas del Win85.

En la parte superior izquierda de la figura se observa la ventana principal del


simulador donde se despliega el contenido de los registros internos y de banderas del
µP. Además se muestra el estado de las interrupciones, el registro de máscara de inte-
rrupciones, la frecuencia del reloj y el número de estados. Para ver el contenido de la
memoria existen dos ventanas de memoria y otra para la pila del sistema.
Desarrollo y Simulación de Programas 386

El parte superior derecha de la figura 7.51 se muestra la ventana de dispositi-


vos periféricos con los puertos e interrupciones asociadas. Se distinguen:

• Puertos básicos de E/S


• Teclado
• Monitor de puertos
• Módulo LCD con capacidad gráfica tipo Seiko G1216B1N000

Tanto el teclado como el módulo LCD pueden usarse en los programas de


usuario. La lectura del puerto de teclado carga el valor de la tecla pulsada en el acu-
mulador. Ejemplos del manejo conjunto del teclado/LCD son suministrados por el
autor como algunos buenos esfuerzos de programación en ensamblador del 8085A
como los juegos PacMan y Tetris, y otras animaciones sencillas.

Fig. 7.52 Salidas de las simulaciones de PacMan.bin y Runner.bin en Win85

8085 Simulador y Sim8085

Estos dos programas son útiles para ejecutar las funciones básicas de simula-
ción de las instrucciones del microprocesador. El Sim8085 posee editor de memoria y
puertos y el 8085 Simulator carece de esta última herramienta, además no reconoce
las instrucciones IN y OUT de modo que sólo permite puertos mapeados como me-
moria.

El Sim8085 incorpora un asistente en forma de teclado para escritura de códi-


go y un diseñador de rutinas de retardo. Ninguno de estos programas simula el siste-
ma de interrupciones ni los terminales SID y SOD para interconexión con periféricos
serie. Las ventanas principales de ambos programas se muestran a continuación en la
figura 7.53.

Todos los programas en este trabajo han sido probados usando algunos de los
simuladores de la figura 7.36 y ejecutados en el Sistema de Evaluación MPR85
PLUS. Es necesario que el estudiante seleccione la herramienta de su preferencia y
Desarrollo y Simulación de Programas 387

Fig. 7.53 Ventanas principales del 8085 Simulator y del Sim8085

la use para simular el mayor número de programas posibles hasta obtener un comple-
to conocimiento de los recursos que ofrece el simulador. La mayoría de las asignacio-
Desarrollo y Simulación de Programas 388

nes del curso deben desarrollarse en un ambiente de simulación y posteriormente de-


ben ser probadas con hardware real. De modo que el cursante debe explorar exhausti-
vamente su simulador hasta lograr una confianza total en los resultados que éste en-
trega.

Es conveniente destacar que la naturaleza interactiva de muchas simulaciones


hace que la presentación de ejemplos de éstas no sea muy ilustrativa. Cuando se con-
sidere necesario se realizaran observaciones sobre simulaciones realizadas por el au-
tor. A continuación se presentan resultados obtenidos de la simulación de algunos
ejemplos seleccionados. Así, la figura 7.54 muestra los resultados de simular la eje-
cución del programa del ejemplo 7.7 usando el SID85. Debido a que este simulador le
asigna a la directiva DS una función distinta a la descrita en este trabajo, el código
debe ser modificado sustituyendo las directivas DS por:

MIN: DB 0
MAX: DB 0

Esto asigna a MIN la dirección 0300H y a MAX 0301H. Cada posición es


cargada al inicio con cero. El resultado es el mismo que usar DS.

Fig. 7.54 Resultados de simular el programa del ejemplo 7.7.

Observe la lista de valores a partir de la posición de memoria 0302H, el valor


mínimo en 0300H, y el máximo en 0301H. El acumulador contiene el máximo, el
cual fue el último número escrito en memoria, mientras que el registro par HL apunta
al final de la tabla. El contador de programa contiene la dirección de la próxima ins-
trucción.
Desarrollo y Simulación de Programas 389

El programa también fue simulado usando WSIM85. Como la versión de eva-


luación acepta archivos menores de 256 bytes detectando cuando el código se carga
sobre la dirección 0100H, se fijó el área de código a partir de 0020H y la de datos se
inicia en 0080H. El ensamblador de WSIM85 tampoco reconoce la directiva DS.

Fig. 7.55 Al inicio las posiciones 0080H y 0081H están en cero.

Fig. 7.56 Después de simular en programa contienen el mínimo y el máximo de la tabla de valores
que se inicia en 0082H.
Desarrollo y Simulación de Programas 390

Este simulador presenta un problema adicional para ejecutar el programa del


ejemplo 7.7. Los datos a cargar en memoria por medio de DB deben estar expresados
en hexadecimal o decimal. El ensamblador de WSIM85 no acepta los bytes de DB en
octal o binario, por lo cual debe hacerse la modificación correspondiente en el pro-
grama fuente. Otra posibilidad es usar otro ensamblador y convertirlo a hex intel an-
tes de cargarlo en WSIM85. Las figuras 7.55 y 7.56 muestran la ventana gráfica de
WSIM85 antes y después de ejecutar el programa.

A continuación, el programa del ejemplo 7.9 se simula a usando el 8085 Simu-


lator Ide. Previamente se generó el archivo ejecutable Ejem_78.hex, el cual se carga
en la memoria del simulador como muestra la figura 7.57

Fig. 7.57 El archivo Ejem_78.hex se carga en la memoria del simulador.

Fig. 7.58 Cuadro de dialogo para entrada de dato a puerto.

Con el programa en ejecución, cada ver que ocurra una lectura a puerto se
despliega la ventana de la figura 7.58 (si esta opción está habilitada) de modo que
pueda cargarse el valor adecuado en el puerto. Esto hace muy sencilla la simulación
Desarrollo y Simulación de Programas 391

del código al facilitar la entrada de los 8 valores de 16 bits en el puerto P8 y el estado


de la señal de control en la línea P9.7. El resultado de la simulación se almacena en
memoria a partir de la dirección 0810H, como ilustra la figura 7.59.

Fig. 7.59 Editor de memoria con las entradas y salidas del ejemplo 7.8

Ejemplo 7.10

Escribir un programa que calcule el periodo de la señal aplicada a la línea 0


del puerto 10H. La frecuencia de la onda está comprendida entre 0.1 Hz y 1 KHz. El
código debe escribirse para ser simulado en el 8085 Virtual Kit, en cuya pantalla de-
berá presentarse la medida con el formato de la figura 7.60.

Fig. 7.60 Medida del periodo de una onda.

El periodo de la señal de entrada está en el rango 1 ms ≤ Ti ≤ 10000 ms, de


modo que bastará determinar cuantos milisegundos transcurren entre una transición
positiva de la onda y el siguiente flanco de subida.
Desarrollo y Simulación de Programas 392

El único problema es que el simulador no presenta el carácter ‘m’, .por lo cual


debe hacerse una pequeña modificación al monitor del programa para desplegar las
unidades de medida. Basta con agregar al mapa de caracteres del monitor del SDA 85
la línea db 37h como se indica en el siguiente listado.
;-----------------------------------------------------------
;--------------------- Character Map -----------------------
org 0700h
CharMap:
db 3fh ; map for '0'
db 06h
db 5bh
db 4fh
db 66h
db 6dh
db 7dh
db 07h
db 7fh
db 67h
db 77h
db 7ch
db 39h
db 5eh
db 79h
db 71h ;'F' 0fh
db 1110110b ;'H' 10h
db 0111000b ;'L' 11h
db 1110011b ;'P' 12h
db 0110000b ;'I' 13h
db 1010000b ;'R' 14h
db 0000000b ;' ' -blank 15h
db 0111110b ;'U' 16h
db 1000000b ;'-' 17h
db 37h ;'m' 24

;----------------------- END CharMap -----------------------

El uso de un contador hexadecimal para registrar el número de milisegundos


del periodo de la señal bajo medida, implica que el registro contador contendrá un
valor hex para indicar el periodo. Este valor debe ser convertido a BCD antes de pre-
sentar. Otra posibilidad es usar un contador con incremento en decimal.

Usando la primera opción, se requiere seleccionar un algoritmo para la con-


versión de binario a BCD. Existen muchos de éstos. En este caso se usa el siguiente:

bin_bcd:
acum_bcd = 0
contador = precisión
repetir
bin = 2 x bin
bcd = 2 x bcd + acarreo
contador = contador -1
hasta contador = 0
fin bin_bcd

Este algoritmo calcula el valor BCD de un número, como se hace con lápiz y
papel.
Desarrollo y Simulación de Programas 393

El listado de programa para medida y presentación del período de la onda se


muestra a continuación:

;------------------------------------------------------------------------------- -----------------------------------------
; Ejemplo 7.10
;------------------------------------------------------------------------------- -----------------------------------------
;Subrutinas de monitor
output equ ADDR 05fcH ; Presenta cadena alfanumérica en pantalla
updad equ ADDR 06bcH ; Presenta contenido de memoria en pantalla
;------------------------------------------------------------------------------- -----------------------------------------
dir_dec equ addr 0fff7h ; Dirección presentada por UPDAD
dir_bin equ addr 0f000h
tope_pila equ addr 8700h
puerto equ byte 10h ; Señal en P10.0
nbytes_dec equ byte 2
nbytes_bin equ byte 2

org 8000h
;------------------------------------------------------------------------------- -----------------------------------------
; Unidades de medida (ms)
;------------------------------------------------------------------------------- -----------------------------------------
unid: db 5
db 24
;------------------------------------------------------------------------------- -----------------------------------------
; Programa principal
;------------------------------------------------------------------------------- -----------------------------------------
org 8100h
lxi sp,tope_pila
lxi h,unid
mvi a,01h
mvi b,00h
call output ; Se ppresenta 'Ms' en pantalla sin pd
bit10: in puerto
ani 1 ; Esperar que señal pase a nivel bajo
jnz bit10
bit01: in puerto ; Detectar flanco positivo de la onda
ani 1
jz bit01
lxi d,0 ; Contador de milisegundos a cero
de10: call medir ; Detecta fin de semiperiodo y continúa medida
jnz de10
de01: call medir ; Mide hasta transición positiva
jz de01
xchg
shld dir_bin ; En DE periodo de la señal
call bin_bcd ; Convierte medida a BCD
call updad ; Presenta medida en campo de direcciones
hlt
;------------------------------------------------------------------------------- -----------------------------------------
; Incrementa en 1 el registro BC entre transiciones positivas
;------------------------------------------------------------------------------- -----------------------------------------
medir: inx d ; Incrementa medida en 1 ms
call retard ; Retardo de 1ms
in puerto
Desarrollo y Simulación de Programas 394

ani 1
ret
;------------------------------------------------------------------------------- -----------------------------------------
; Retardo de 1 ms a f = 2.85 Mhz
;------------------------------------------------------------------------------- -----------------------------------------
retard: mvi b,0cbh
retad1: dcr b
jnz retad1
ret
;------------------------------------------------------------------------------- -----------------------------------------
; Conversión multidígito de binario a BCD.
;------------------------------------------------------------------------------- -----------------------------------------
bin_bcd: mvi c,nbytes_dec ; 4 dígitos BCD
mvi d,nbytes_bin ; 16 bits binarios.
; bcd_acum = 0
lxi h,dir_dec
xra a
mov b,c
llenar: mov m,a
inx h
dcr b
jnz llenar
; contador = 8*nbytes_dec
; contador = 16 en este caso
mov a,d
ral
ral
ral
mov e,a
; repetir
;bin = 2 * bin
cont: lxi h,dir_bin
mov b,d
dsplzm: mov a,m
ral
mov m,a
inx h
dcr b
jnz dsplzm
;bcd = 2 * bcd + acarreo
lxi h,dir_dec
mov b,c
decadj: mov a,m
adc a
daa
mov m,a
inx h
dcr b
jnz decadj
dcr e
; hasta que contador = 0
jnz cont
ret
;------------------------------------------------------------------------------- -----------------------------------------
Desarrollo y Simulación de Programas 395

El código fue simulado y funcionó en forma correcta. Para presentar las uni-
dades de medida y valor del período en la pantalla del SDA 85 se usaron las rutinas de
usuario OUTPUT y UPDAD, respectivamente. Consulte la ayuda del programa para
más detalles. Los resultados de la simulación se presentan en la figura 7.61. Para si-
mular se usó la herramienta trace del 8085 Virtual Kit.

Fig. 7.61 Medida del periodo de una señal.

Como puede observar el lector, aunque el programa del ejemplo anterior cons-
ta de varias subrutinas, éste fue escrito como un solo módulo despreciando el disfrute
de los beneficios de la programación modular. Esto se debe a que el ensamblador del
simulador no procesa código relocalizable y no se puede usar un ensamblador externo
por que no carga un archivo binario o hex desde la línea de comando.

Esta situación se repite en otros simuladores, por lo cual el usuario debe adap-
tar cada programa a la sintaxis del ensamblador usado. Los dos obstáculos son inde-
seables: es necesario programar en forma modular y usar un programa ensamblador
de potencia tal que simplifique en forma resaltante la escritura del programa.

Una solución al problema planteado es utilizar un verdadero sistema de desa-


rrollo de programas. Los recursos modernos para el desarrollo de programas para
sistemas empotrados usando microprocesadores microcontroladores se presentan
incorporados a una aplicación WINDOWS o LINUX identificada como Entorno Inte-
grado para Desarrollo o IDE (Integrated Development Environment), la cual incluye
editor, ensamblador, compilador C y muchos otros recursos que simplifican la escritu-
ra de programas usando técnica modular .
Desarrollo y Simulación de Programas 396

7.4.2 Sistema integrado para desarrollo de programas

Una aplicación IDE estándar contiene al menos:

• Editor de texto.
• Macroensamblador.
• Compilador ANSI C.
• Biblioteca de programas.
• Enlazador/Relocalizador.
• Simulador

Un diagrama que ilustra los recursos de una aplicación IDE estándar, se mues-
tra en la figura 7.62.

EDITOR DE TEXTO

COMPILADOR MACRO
ANSI C ENSAMBLADOR

BIBLIOTECA
S.O.
BIBLIOTECA
TIEMPO
ESTANDAR CPU
REAL

ENLAZADOR/RELOCALIZADOR

GRABADOR
DEPURADOR
DE EPROM

SIMULADOR EMULADOR

Fig. 7.62 Funciones típicas de un entorno integrado para desarrollo de programas

El proceso de desarrollo del programa se inicia cuando se escribe en C o en


ensamblador, usando el editor de texto, los archivos fuente del programa principal y
de las subrutinas de la aplicación. Estos módulos aparecen como archivos indepen-
dientes y son organizados como un proyecto que contiene todos los módulos fuente y
de biblioteca necesarios para construir el programa de la aplicación. Activando la
función: construir proyecto, se compilan los archivos en C o se ensambla los progra-
mas en ensamblador. El enlazador relocalizador a continuación resuelve todas las
Desarrollo y Simulación de Programas 397

direcciones relativas de memoria generando un código objeto absoluto. Las salidas


del enlazador es son: un archivo binario que contiene el código ejecutable o una ver-
sión en formato HEX INTEL y un archivo ASCII que contiene información relativa al
proceso de traducción.

El programa ejecutable puede ser simulado en el microcomputador, cargado


en un equipo emulador de microprocesadores o en una memoria EPROM. Algunas
IDE ofrecen recursos adicionales como un sistema operativo de tiempo real apropiado
para aplicaciones que involucran tareas de tiempo crítico. El lector dispone de una
IDE denominada MICROIDE dirigida a diversos microprocesadores y microcontrola-
dores. Esta tiene todas las funciones descritas, pero desafortunadamente la versión de
evaluación para el 8085 no contiene simulador, pero es posible incorpóraselo. Con
esta herramienta se puede programar en forma modular y el código final puede ser
ejecutado en un simulador asociado o cargado en un emulador o grabador de
EPROM.

En el Laboratorio de Microprocesadores existen 5 microcomputadores de bajo


costo para desarrollo aplicaciones con el 8085, denominados MPR-85 PLUS. Esta
herramienta dispone de todos los recursos necesarios para la prueba del hardware de
prototipos y la verificación del programa. Para construir, con los pocos recursos dis-
ponibles, un sistema de desarrollo básico pero funcional, se usa un computador per-
sonal, el macroensamblador AVMAC85, el paquete de programación MicroIde, y al-
gunos simuladores seleccionados. Con el IDE en marcha, el usuario puede usar un
ensamblador/relocalizador profesional para escribir los módulos de su programa, si-
mular el código en un simulador, descargar el programa en la memoria del MPR85-
PLUS, verificar su operación y finalmente grabar la memoria EPROM.

La aplicación Micro-IDE de Bipom, en el CD de trabajo, es una versión de


evaluación con las siguientes características:

1. Permite el desarrollo de programas en forma modular con el compilador C: MICROC-85.

2. Para programación en ensamblador utiliza el ASM85, el cual no procesa macros ni código


relocalizable, haciendo imposible la programación modular.

3. Limita el tamaño del código a 500 líneas.

4. No incorpora un simulador para la versión correspondiente al 8085.

5. Dispone de un terminal por medio del cual se puede conectar al MPR-85.

6. Se puede incorporar nuevas herramientas de desarrollo de programa como macroensam-


bladores y enlazadores.

Para que el estudiante utilice un entorno para desarrollo de programa que sea
más profesional y eficiente que el ofrecido por el software MICROIDE, se hace uso
de las opciones de configuración de la misma aplicación IDE para:
Desarrollo y Simulación de Programas 398

a) Sustituir el ensamblador original por un Macroensamblador AVMAC85 con capacidad para


procesar código relocalizable; e incorporar el enlazador/relocalizador correspondiente
(AVLINK).

b) Añadir al menú de herramientas dos programas simuladores/depuradores: WSIM85 y


WIN85. Esto permite cargar en el simulador el archivo generado por el proceso de ensam-
blaje.

El proceso para configurar el entorno de desarrollo usa una herramienta in-


cluida en el paquete de software MICROIDE denominada Toolkit configurator. Con
este recurso es posible:

• Incorporar el ensamblador AVMAC85 como opción para el desarrollo de proyectos.

• Especificar la forma en que el programa enlazador AVLINK debe procesar los archivos ob-
jetos generados por el ensamblador.

• Convertir el archivo con extensión .hex generado por AVLINK a un archivo binario que
pueda ser cargado en el simulador WIN85. El programa WSIM85 acepta como entradas ar-
chivos en formato HEX-INTEL o en binario.

Configurando MICROIDE

1. Ejecute el programa Toolkit Configurator de MICRO-IDE.

Fig.7.63. Ventana principal del Toolkit Configurator de MICRO-IDE


Desarrollo y Simulación de Programas 399

2. Seleccione la opción: Add New Toolkit

Fig.7.64. Se agrega un nuevo ensamblador

3. En la ventana de dialogo de la figura 7.64 escriba el nombre de la nueva herra-


mienta.

4. Escriba los comandos necesarios para el ensamblaje de los módulos del programa,
el enlace y la conversión a binario del archivo .HEX resultado de la compilación.

Fig.7.65. Configuración de la nueva herramienta


Desarrollo y Simulación de Programas 400

El comando {TOOLKITDIR}\avmac85 {SOURCEFILES} procesa uno o más


archivos fuente (con extensión ASM) y los ensambla a uno o más archivos con exten-
sión OBJ. El enlazador AVLINK procesa el (los) archivos .OBJ y genera un archivo
único (SIMUL.HEX) con el código ejecutable. Este archivo está en formato HEX-
INTEL. Una vez obtenido el módulo ejecutable (SIMUL.HEX), se convierte a binario
(SIMUL.BIN) usando la herramienta HEX2BIN. El simulador WSIM85 acepta como
entrada ambos tipos de archivos, pero WIN85 solo simula archivos binarios.

NOTA
Cuando cree en Micro-IDE un nuevo proyecto (con cualquier nombre) puede seleccionar como lengua-
je ensamblador el AVMAC85. Al construir el proyecto obtendrá siempre un archivo SIMUL.HEX. Este
nombre común no es problema, si cada proyecto reside en su carpeta particular.

Creando un nuevo proyecto:

1. Del menú Projects seleccione New project

Fig.7.66. Creación del proyecto Ejemplo1

2. Indique la carpeta (el programa la creará) donde residirá el proyecto dentro del
directorio de trabajo …\EXAMPLES. La carpeta puede tener el mismo nombre del
proyecto.

3. Seleccione la herramienta (Toolkit).


Desarrollo y Simulación de Programas 401

Fig.7.67. El proyecto Ejemplo1 está vacío.

4. Usando el menú Projects\Add files to project adjunte los archivos al proyecto.


Estos deben residir en la carpeta Ejemplo1.

Fig. 7.68. Se suman los archivos.asm a Ejemplo1.

Completado el procedimiento, el proyecto está listo para compilación y enla-


zado como ilustra la figura 7.69.
Desarrollo y Simulación de Programas 402

Fig.7.69. El proyecto está listo para procesarse.

Es de suponer que con la configuración del AVMAC85 y del AVLINK realizada


con el Toolkit Configurator, no es necesario realizar ajustes adicionales. No obstante
examinemos Project\Settings:

Fig.7.70. Seleccione Generic Serial Loader.

Al seleccionar un cargador es posible transferir al MPR85 (Por un puerto serie


del PC) el archivo SIMUL.HEX.
Desarrollo y Simulación de Programas 403

Fig.7.71. El directorio de trabajo puede ser también {ROOTDIR}\microc.

Fig.7.72. La extensión del archivo objeto debe marcarse como obj.

El comando {TOOLKITDIR}\avmac85 {SOURCEFILES} procesa uno o más


archivos fuente (.ASM) y los ensambla a uno o más archivos con extensión OBJ.
Desarrollo y Simulación de Programas 404

Fig.7.73. Ventana del enlazador

El enlazador AVLINK procesa el (los) archivos .OBJ, salidas del AVMAC85 y


genera un archivo único (SIMUL.HEX) con el código ejecutable. Este archivo está en
formato HEX-INTEL. Las opciones son:
–sy Activa la generación de un archivo de símbolos y
–sp Incluye información de símbolos en el archivo .map
generado por AVLINK.

Fig.7.74. Marque simul.hex como archivo de salida. Se pone por defecto nombre_proyecto.hex

Una vez obtenido el módulo ejecutable SIMUL.HEX se convierte a binario


(SIMUL.BIN) usando la herramienta HEX2BIN. Finalmente use Build\Build Simul.hex
para generar el archivo ejecutable.
Desarrollo y Simulación de Programas 405

Fig.7.75. Proceso de generación del archivo ejecutable

Incorporando los simuladores

1. Seleccione Tool\Add Tool .

Fig.7.76. Configure el simulador Wsim85 como herramienta de usuario.


Desarrollo y Simulación de Programas 406

2. . Seleccione Tool\Add Tool y agregue los programas de simulación. El simulador


WSIM85 acepta como entrada archivos .hex o .bin

Fig.7.77. El simulador Win85 requirió el auxilio de un archivo .bat para ejecutarse

El contenido del archivo win85.bat consiste de la línea:


c:\avocet\win85\win85 simul.bin

Los programas avmac85.exe, avlink.exe, hex2bin.exe y win85.bat deben resi-


dir en el directorio: C:\bipom\devtools\microc.

Comunicación entre el µC MPR85 y MICRO-IDE

Micro-IDE tiene una herramienta Terminal que permite la comunicación entre


el PC y el microcomputador MPR85. Para la descarga de archivos se usa la herra-
mienta Loader esta permite, una vez puesto el MPR85 en el modo de recepción de
archivo, descargar el programa SIMUL.HEX en un área de memoria del MPR-85
PLUS para su posterior ejecución. También es posible que el microcomputador MPR-
85 PLUS transfiera un archivo HEX hacia el PC.
Desarrollo y Simulación de Programas 407

Fig.7.78. Ahora se tiene acceso a dos simuladores

1. Para configurar Terminal use Tools\Options\Terminal

Fig.7.79. El puerto serie del MPR85 se conecta al COM1 del PC.


Desarrollo y Simulación de Programas 408

En este caso la velocidad de transmisión del canal serie del MPR85 debe ajus-
tarse a 9600 baudios.

2. Para configurar Loader use Tools\Options\Loader. La configuración del cargador


es similar a la de Terminal.

Fig.7.80. Seleccione dos bits de parada.

Los cargadores disponibles en Micro-IDE no están destinados para la transfe-


rencia de archivos en el MPR85. Se usó El Generic Serial Loader. Aunque este indi-
ca un error al tratar de poner al MPR85 en modo RUN, realiza la transferencia del
archivo en forma correcta.

Fig.7.81. Cargadores para download.


Desarrollo y Simulación de Programas 409

7.5 MACROS

Cuando se escribe un programa es común encontrar que un conjunto de ins-


trucciones se repiten con frecuencia variando únicamente algunos de los parámetros.
En estos casos puede ser conveniente usar una instrucción macro para simplificar el
desarrollo del programa. Un macro es una instrucción que puede ser llamada dentro
de un código, obteniéndose como resultado la sustitución de cada llamada por una
expansión de código equivalente a una secuencia de instrucciones. El uso de macros
reduce las líneas de código del programa y permite la creación de librerías de que
pueden ser usadas en cualquier programa.

Suponga que necesita generar un retardo por software con una duración de
cinco segundos y posteriormente en otro punto del programa se requiere un tiempo de
espera de veinte segundos. Las rutinas capaces de generar el lapso de retardo tienen el
mismo código excepto por el parámetro tiempo retardo. En lugar de escribir dos ruti-
nas, el diseñador puede utilizar un macro definiendo en cada llamada el tiempo de-
seado. Las aplicaciones de macro son diversas, recomendándose su uso cuando el
número de instrucciones que componen el macro son pocas. Los programas ensam-
bladores con capacidad para procesar macros se denominan Macroensambladores.
Usted dispone de copias de dos traductores de este tipo: el isis-ii 8080/8085 macroas-
sembler y el avmac85. Los macros deben definirse en el programa antes de ser invo-
cados. Con este propósito el ensamblador acepta las siguientes directivas relacionadas
con tal definición:
Tabla. 7.9. Directivas para control de macros.
MACRO Definición de macro.
ENDM Fin de cuerpo del macro.
LOCAL Asigna a símbolo alcance local.
REPT Repetir bloque.
IRP Repetir indefinidamente.
IRPC Repetir caracter indefinidamente.
EXITM Salida del macro antes de ENDM.

Las pseudo instrucciones anteriores corresponden al isis-ii 8080/8085 ma-


croassembler. Si usa el avmac85, a éstas las precedes el carácter % (%MACRO, por
ejemplo). La definición del cuerpo de un macro se inicia con la directiva de ensam-
blador MACRO a la cual se le asigna: el nombre para llamar el macro y una lista de
parámetros a ser reemplazados durante la expansión del macro. El formato es el si-
guiente:

nombre MACRO lista de parámetros falsos


{
cuerpo
del
macro
}
ENDM
Desarrollo y Simulación de Programas 410

Si los símbolos que aparecen dentro del cuerpo del macro tienen alcance glo-
bal, toda llamada al macro, excepto la primera, causará error por duplicación de defi-
niciones de símbolos. A un identificador o etiqueta puede asignársele un alcance limi-
tado (dentro del cuerpo del macro) usando la directiva LOCAL, la cual asigna un va-
lor único para el símbolo cada vez que el macro es llamado y expandido.

Si se desea copiar un grupo de líneas de código dentro de un macro, pueden


usarse las directivas: REPT: repeat block, IRP: Indefinite repeat e IRPC: Indefinite
repeat caracter 1 .

Una vez que el macro es definido puede ser llamad cualquier número de veces
en un programa. La llamada consiste del nombre del macro y la lista de parámetros
reales que reemplazaron a los falsos durante la expansión del macro. Durante el pro-
ceso de ensamblaje cada llamada a un macro es sustituida por el código en el cuerpo
del macro y los parámetros falsos son reemplazados por los verdaderos. El ensambla-
dor deberá encontrar la definición del macro antes de la primera llamada o generará
un mensaje de error.

Como ejemplo, suponga que en un programa se leen repetidamente datos en


puertos de entrada y se cargan en los registros internos del microprocesador. Sabemos
que los valores en puertos son cargados en el registro acumulador y después debe
usarse otra instrucción para copiarlos en otro registro interno. El macro PUERTOreg
carga directamente en cualquier registro distinto al acumulador, la información pre-
sente en un puerto de entrada.

Pdato EQU 80H


;-----------------------------------------------------------------------
Definición de macro PUERTOreg
;-----------------------------------------------------------------------
PUERTOreg %MACRO r,PUERTO
IN PUERTO
MOV r,A
%ENDM
;-----------------------------------------------------------------------

Las siguientes instrucciones de llamadas al macro cargarán en el registro B el


contenido del puerto 80H, en C el de 81H, en D el de 82H y en E el de 83H.
;------------------------------------------------------------------------
PUERTOreg B,Pdato
PUERTOreg C,Pdato+1
PUERTOreg D,Pdato+2
PUERTOreg E,Pdato+3
;-----------------------------------------------------------------------

1
Estas directivas no se discuten. El interesado puede recurrir al manual del isis-ii 8080/8085
Desarrollo y Simulación de Programas 411

La sintaxis del código corresponde al avmac85. El siguiente ejemplo ilustra


el uso del isis-ii 8080/8085, este último programa muestra claramente en el archivo
de salida .lst, la expansión del macro. Observe el cambio en la sintaxis.

Ejemplo 7.11

Usando el programa isis-ii 8080/8085 obtenga el archivo .lst para el macro


PUERTOreg.
$MACROFILE
; ejem_711.src
;-----------------------------------------------------------
; Puerto de entrada
;-----------------------------------------------------------
Pdato EQU 80H
;-----------------------------------------------------------
; Definición de macro
;-----------------------------------------------------------
PUERTOreg MACRO r,PUERTO
IN PUERTO
MOV r,A
ENDM

PUERTOreg B,Pdato
PUERTOreg C,Pdato+1
PUERTOreg D,Pdato+2
PUERTOreg E,Pdato+3
END

Ejecute la secuencia de comandos:

C:\ISIS_II\isim85.exe
- attach :f0:=c:
-asm80 ejem_711.src

y obtendrá el archivo ejem_710.lst, cuyo contenido se muestra a continuación:

ASM80 Ejem_7110.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1

LOC OBJ LINE SOURCE STATEMENT


1 $MACROFILE
0080 2 Pdato EQU 80H
3
4 PUERTOreg MACRO r,PUERTO
- 5 IN PUERTO
- 6 MOV r,A
7 ENDM
8
Desarrollo y Simulación de Programas 412

9 PUERTOreg B,Pdato
0000 DB80 10+ IN Pdato
0002 47 11+ MOV B,A
12 PUERTOreg C,Pdato+1
0003 DB81 13+ IN Pdato+1
0005 4F 14+ MOV C,A
15 PUERTOreg D,Pdato+2
0006 DB82 16+ IN Pdato+2
0008 57 17+ MOV D,A
18 PUERTOreg E,Pdato+3
0009 DB83 19+ IN Pdato+3
000B 5F 20+ MOV E,A
21 END

PUBLIC SYMBOLS

EXTERNAL SYMBOLS

USER SYMBOLS
PDATO A 0080 PUERTO + 0000

ASSEMBLY COMPLETE, NO ERRORS

Observe la declaración inicial $MACROFILE. Esta es un control de ensam-


blaje del sistema operativo ISIS-II y señala que el archivo fuente contiene macros.
Esto no es necesario si usa el avmac85. El hecho que el macro PUERTOreg sea lla-
mado cuatro veces implica que este será expandido, con parámetros distintos, igual
número de veces. Las instrucciones que resultan de la expansión se muestran con el
caracter (+) al final del número de línea. Es apreciable además que la definición de
macro no genera código objeto.

Como otro ejemplo de aplicaciones de macros, considere el problema de con-


trol de tráfico urbano suministrado como asignación y cuya intersección se repite en
la figura 7.84. El sistema de control se diseña de modo que las luces se controlen por
medio del byte escrito en el puerto de salida 10H. El nibble de orden alto controla las
luces en dirección NS, mientras que el de orden bajo se usa para las luces en direc-
ción EO, de acuerdo a la siguiente secuencia.

Tabla. 7.10. Estados de las luces.


P10.7 P106 P10.7 P10.4 Estado de las luces P10.3 P10.2 P10.1 P10.0
Norte-Sur Este-Oeste
0 0 0 0 Apagadas 0 0 0 0
0 0 0 1 Rojo 0 0 0 1
0 0 1 0 Ámbar 0 0 1 0
0 0 1 1 Verde 0 0 1 1
Desarrollo y Simulación de Programas 413

Fig.7.82.Intersección vial simple

En la figura 7.83 se muestra un flujo grama para el ciclo principal de cambio


de luces, considerando la presencia de vehículos en ambas avenidas.

INICIO

ns en verde ns en rojo
A
eo en rojo eo en verde

esperar esperar
20 15
segundos segundos

ns en amarillo eo en amarillo

esperar esperar
5 5
segundos segundos

Fig. 7.83 Secuencia para el cambio de luces con circulación continua de en ambas direcciones.
Desarrollo y Simulación de Programas 414

El código presentado a continuación usa macros para resolver el problema de


control de una intersección básica.
;-------------------------------------------------------------------------------------------------------------
; Iniciar secuencia
;-------------------------------------------------------------------------------------------------------------
ciclo: PONluz ns,verde ; Permitir paso en dirección norte-sur
PONluz eo,roja ; Prohibir circulación en dirección este-oeste
ESPERAR 20 ; Esperar 20 segundos
;-------------------------------------------------------------------------------------------------------------
; Cambiar luces
;-------------------------------------------------------------------------------------------------------------
PONluz ns,ambar
ESPERAR 5
PONluz ns,roja
PONluz eo,verde
ESPERAR 15
;-------------------------------------------------------------------------------------------------------------
; Cambio para repetir ciclo luces
;-------------------------------------------------------------------------------------------------------------
PONluz eo,ambar
ESPERAR 5
REPETIR ciclo

Como ilustración se programa el macro PONluz dir,color. El macro ESPERAR


se omite por tratarse de una asignación.

;-------------------------------------------------------------------------------------------------------------
;Control de trafico
;-------------------------------------------------------------------------------------------------------------
luz equ 10h
nsbits equ 4
eobits equ 0
noluz equ 0
rojo equ 1
ambar equ 2
verde equ 3
;-------------------------------------------------------------------------------------------------------------
; Macro PONluz dir,color
;-------------------------------------------------------------------------------------------------------------
PONluz MACRO dir,color
mvi a,color shl dir&bits
out luz
ENDM
;-------------------------------------------------------------------------------------------------------------
; Macro ESPERAR segundos
;---------------------------------------------------------------------------------------------------------------
ESPERAR MACRO segundos
{ Cuerpo
del
macro }
ENDM
Desarrollo y Simulación de Programas 415

;-------------------------------------------------------------------------------------------------------------
; Macro REPETIR destino
;-------------------------------------------------------------------------------------------------------------
REPETIR MACRO destino
jmp destino
ENDM

En la declaración mvi a,color shl dir&bitss la cadena dir es sustituida por ns


(nsbitss) o eo (eobitss) según la dirección sea norte-sur o este-oeste.

7.6 TABLAS DE CONSULTA (LOOKUP TABLES)

Es usual que el microprocesador sea usado para convertir datos desde un


dominio a otro. En un dominio todas las unidades son iguales, por ejemplo todas las
velocidades en Km/h o todas las temperaturas en °C. Si se requiere convertir una ca-
dena de caracteres ASCII a binario, el µP solo debe realizar una operación de enmas-
caramiento, seguida de una rotación y una suma. Para convertir de grados Centígra-
dos a Fahrenheit, basta con que el procesador realice una multiplicación y una suma:

°F = 9/5 x °C + 32 °C = 5/9 x (°F – 32)

En estos casos el proceso de conversión entre dominios se reduce a aplicar


una función matemática conocida. En otros, el procedimiento no es directo. Observe
la tabla 7.11, donde se muestra la relación existente entre un dígito hexadecimal y el
código usado con un indicador de 7 segmentos de cátodo común. Note la complejidad
de la relación.
Fig. 7.11 Código de 7 segmentos
Dígito binario Código 7-Segmentos
Binario hex
gfedcba

0000 0111111 3FH


0001 0000110 06H
0010 1011011 5BH
0011 1001111 4FH
0100 1100110 66H
0101 1101101 6DH
0110 1111101 7DH
0111 0000111 07H
1000 1111111 7FH
1001 1100111 67H
1010 1110111 77H
1011 1111100 7CH
1100 0111001 39H
1101 1011110 5EH
1110 1111001 79H
1111 1110001 71H
Desarrollo y Simulación de Programas 416

Fig. 7.84 Código de 7 segmentos para un indicador con cátodo común

El bits D6 corresponde al segmento g y D0 al segmento a. El bits más signifi-


cativo D7 se asume cero. Un nivel uno activará el segmento y un cero lo apagará. En
lugar de intentar encontrar una expresión de la relación entre el número binario y el
patrón de siete segmentos, se recurre a una tabla de consulta para realizar la conver-
sión. La tabla contendrá el arreglo de unos y ceros que se requieren para presentar
todos los números. Una rutina capaz de realizar la conversión desde binario a siete
segmentos es la siguiente.

org 100h
lxi sp,300h
lxi h,150h
mvi b,255 ; B contiene el dígito a convertir
dig: inr b
mov a,b
cpi 16 ; Si dígito ‘F’ parar
jz salir
call bin7seg ; Convertir digito a 7 segmentos
mov m,a ; Guardar código en memoria
inr l
jmp dig
salir: hlt

bin7seg: push h
lxi h,tabla
add l
mov l,a
mov a,m
pop h
ret
; -----------------------------------------------------------------------------------
; Tabla de conversión
; -----------------------------------------------------------------------------------
; la tabla se inicia en la dirección 200h
org 200H
db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db 7fh,67h,77h,7ch,39h,5eh,79h,71h
end
Desarrollo y Simulación de Programas 417

El programa carga en forma secuencial, iniciando en cero, en el registro B los


dígitos hexadecimales, encuentra el código siete segmentos correspondientes y lo
almacena en memoria a partir de la dirección 150H. En la práctica esta conversión se
realiza para presentar información BCD en pantallas con dispositivos de 7 segmentos
conectados a puertos del sistema. Un simulador llamado Simulador de 8085 y creado
en el Departamento de Arquitectura y tecnología de Computadores de la Universidad
de Granada en España permite simular el programa de conversión. En la figura 7.85
se muestra el hardware para presentación.

Fig. 7.85 Visualizadores del simulador conectados a los puertos 00H-07H.

El programa de conversión usa el indicador más la derecha de la figura 7.85,


el cual está conectado al puerto de salida 9. Los dígitos desde 0 hasta F se presentan
en el display y al final el programa se detiene. La simulación del código fue realizada
en forma correcta. En la práctica se requiere un lapso de al menos un segundo entre
presentaciones. Esto no es necesario para la simulación porque usando el menú Op-
ciones\De ejecución de la barra de herramientas del programa de emulación, puede
ajustarse al velocidad del µP para hacer visible la presentación de los dígitos. La figu-
ra 7.86 muestra la ventana principal del programa durante la simulación.

El Simulador de 8085 no fue presentado en la sección 7.4, pero es una herra-


mienta útil para la simulación de programa. El sistema emulado tiene puertos de en-
trada con interruptores y teclado y puertos de salida con LEDs e indicadores de siete y
de quince segmentos, además ofrece pantallas de texto y gráficas monocromáticas y a
colores, asociadas con áreas específicas de memoria. Esta herramienta es fácil de usar
y es acompañada con manual de usuario, guía para el ensamblador y algunos ejem-
plos.
Desarrollo y Simulación de Programas 418

Fig. 7.86 Ventana del simulador.


Desarrollo y Simulación de Programas 419

La técnica de tablas de búsqueda puede usarse en aplicaciones donde una con-


versión deba realizarse en el menor tiempo posible, o para realizar conversiones
cuando no exista una relación analítica conocida entre los datos a convertir. Por ejem-
plo es usual el uso de tablas en lugar de series para el cálculo de funciones como se-
no, coseno o tangente de un ángulo, el logaritmo natural de un número o conversión
entre códigos.

Si una tabla de consulta se utiliza para determinar el seno y coseno de un án-


gulo, está puede tener 90, 180 ó 360 entradas, esto depende de la complejidad de la
subrutina que realice el acceso a la tabla, de la velocidad a la cual debe ejecutarse la
conversión, de la cantidad de memoria disponible para almacenar los datos de la tabla
y de la precisión deseada para el resultado. Si la tabla de datos tiene 90 entradas, cada
elemento representará el seno de un ángulo entre 0 y 90 grados o entre 0 y 360 gra-
dos con una diferencia de 4 grados entre entradas. Con una tabla de búsqueda de 90
entradas que representen el seno de ángulos entre 0 y 90 grados, puede determinarse
el seno y coseno de cualquier ángulo. Esto implica llevar todos los ángulos a sus co-
rrespondientes en el primer cuadrante y asignar el signo del seno y coseno.

Aunque la relación entre grados centígrados y grados Fahrenheit es bien co-


nocida, el tiempo para que el µP convierta de una temperatura a otra usando rutinas
que ejecuten cálculos matemáticos, puede ser demasiado largo en algunas aplicacio-
nes. En estos casos el uso de tablas puede imprimir velocidad al proceso de conver-
sión.

Ejemplo 7.12

Se requieren dos rutinas que usen tablas de consulta para realizar la conver-
sión desde grados Centígrados a Fahrenheit y viceversa. El rango es entre 0 °C y 100
°C y debe evaluarse la temperatura con un grado de diferencia.

La siguiente rutina realiza la conversión del valor en °C cargado en el acumu-


lador a °F y lo almacena en la dirección 150h. Se usa una tabla de 101 entradas.

; Conversión de Centigrados a Fahrenheit


;----------------------------------------------------------------------------------------------------------------
tempf equ 150h
org 100h
lxi sp,200h
call gcaf
sta temp
hlt
;----------------------------------------------------------------------------------------------------------------
gcaf: lxi h,tabla
add l
mov l,a
mov a,m
ret
Desarrollo y Simulación de Programas 420

org 200h
tabla: db 32,34,36,37,39,41,43,45,46,48,50,52
db 54,55,57,59,61,63,64,66,68,70,72,73
db 75,77,79,81,82,84,86,88,90,91,93,95
db 97,99,100,102,104,106,108,109,111,113,115,117
db 118,120,122,124,126,127,129,131,133,135,136,138
db 140,142,144,145,147,149,151,153,154,156,158,160
db 162,163,165,167,169,171,172,174,176,178,180,181
db 183,185,187,189,190,192,194,196,198,199,201,203
db 205,207,208,210,212
end

;----------------------------------------------------------------------------------------------------------------

Para convertir desde °F a °C, se usa una tabla de 181entradas (212-32+1) la


temperatura de entrada en Fahrenheit no se suma simplemente a la dirección base
como en el caso anterior, es necesario restar al contenido del acumulador el valor 32.
Observe el código a continuación.

; Conversión de Fahrenheit a Centigrados


;----------------------------------------------------------------------------------------------------------------
tempc equ 150h
org 100h
lxi sp,300h
call gfac
sta tempc
hlt
gfac: lxi h,tabla
sui 32
add l
mov l,a
mov a,m
ret

org 200h

tabla: db 0,1,1,2,2,3,3,4,4,5,6,6
db 7,7,8,8,9,9,10,11,11,12,12,13
db 13,14,14,15,16,16,17,17,18,18,19,19
db 20,21,21,22,22,23,23,24,24,25,26,26
db 27,27,28,28,29,29,30,31,31,32,32,33
db 33,34,34,35,36,36,37,37,38,38,39,39
db 40,41,41,42,42,43,43,44,44,45,46,46
db 47,47,48,48,49,49,50,51,51,52,52,53
db 53,54,54,55,56,56,57,57,58,58,59,59
db 60,61,61,62,62,63,63,64,64,65,66,66
db 67,67,68,68,69,69,70,71,71,72,72,73
db 73,74,74,75,76,76,77,77,78,78,79,79
db 80,81,81,82,82,83,83,84,84,85,86,86
db 87,87,88,88,89,89,90,91,91,92,92,93
db 93,94,94,95,96,96,97,97,98,98,99,99
db 100
end
;----------------------------------------------------------------------------------------------------------------
Desarrollo y Simulación de Programas 421

Ejemplo 7.13

Un programa debe calcular el seno y el coseno de un ángulo θ en el rango de


0 a 360°. El valor de θ se carga en el registro BC y el sen(θ) y el cos(θ) deben salvar-
se en los registros de 16 bits BC y DE, respectivamente. El signo del sen/cos lo indi-
cará el bit más significativo del registro par B/D.
Use una tabla de consulta que registre, con incrementos de un grado, los valo-
res del seno o coseno del ángulo para θ en el cuadrante I.
Por ejemplo:
5000 → sen (30°) 8660 → sen (60°)
Para determinar el valor del seno y el coseno se usará una tabla de búsqueda
con 91 entradas, la cual contiene el seno de los ángulos entre 0° y 90° multiplicados
por 10000. Para encontrar el coseno de θ se usa la relación trigonométrica de ángulos
complementarios:
cos(θ) = sen (90 D − θ)

Además es necesario trasladar los ángulos en el rango 90° < θ ≤ 360° hacia el
primer cuadrante. La tabla siguiente muestra las relaciones necesarias y el signo de
las funciones para cada cuadrante.
Tabla. 7.12. Signos de sen y cos por cuadrantes.
Cuadrante Relación sen(θ) cos(θ)
I θ + +
II θ =180 - θ + -
III θ = θ - 180 - -
IV θ =360 - θ - +

El código consta de un programa principal el cual determina el cuadrante en


el cual se ubica el ángulo, realiza la traslación si es necesario y llama una rutina calc
la cual encuentra el seno y el coseno deθ. También se llama a dos subrutinas senneg y
cosneg que colocan el signo negativo a las funciones cuando corresponda.

;---------------------------------------------------------------------------------------------------------------------------
; Programa principal
;---------------------------------------------------------------------------------------------------------------------------
defseg prog
seg prog
; ángulo en grados en registro BC
sencos: lxi sp,0200h
lxi h,tbsenx
mov a,b ; byte de orden alto del ángulo a B
cpi 1 ; ángulo es mayor de 255 grados
Desarrollo y Simulación de Programas 422

jz III_IV ; si, ubicar el cuadrante entre el 3 ó 4


mov a,c ; ángulo no mayor de 255 grados
cpi 90 ; ¿teta está en cuadrante 1?
jnc cuad23 ; si, extraer seno de la tabla
call calc
jmp salir
cuad23: cpi 180 ; no, probar si está en cuadrante 2 ó 3
jnc III ; si, está en cuadrante 3, pasar a cuadrante 1
mvi a,180 ; no, está en el cuadrante 2...
sub c ; pasar a cuadrante 1
call calc ; extraer seno de la tabla
call cosneg ; coseno negativo
jmp salir
III: sui 180 ; de cuadrante 3 al 1
call calc ; extraer seno de la tabla
call senneg ; seno negativo
call cosneg ; coseno negativo
jmp salir
III_IV: mov a,c ; si, en el cuadrante 3 o 4
cpi 14 ; probar entre cuadrantes 3 ó 4
jnc IV ; teta está en el cuadrante 4
adi 76 ; teta en el 3, pasar al cuadrante 1
call calc ; extraer seno/cos de la tabla
call senneg ; seno negativo
call cosneg ; coseno negativo
jmp salir
IV: mvi a,104 ; pasar de cuadrante 4 al 1
sub c
call calc
call senneg ; seno negativo
salir: hlt

;----------------------------------------------------------------------------------------------------------------
; Subrutina CALC de búsqueda en la tabla
;----------------------------------------------------------------------------------------------------------------
calc: mvi b,2
mov c,a
ccos: add a ; extraer seno/cos de la tabla
add l
mov l,a
mov e,m
inx h
mov d,m
dcr b
jz retor
push d
mvi a,90
sub c
lxi h,tbsenx
jmp ccos
retor: pop b ; BC contiene el senx y DE el cosx
ret
Desarrollo y Simulación de Programas 423

;---------------------------------------------------------------------------------------------------------------------------
; Subrutina SENNEG para colocar el signo negativo al seno
;---------------------------------------------------------------------------------------------------------------------------
senneg: mov a,b ; seno negativo
cpi 0
jz oks
ori 80h
mov b,a
oks: ret

;---------------------------------------------------------------------------------------------------------------------------
; Subrutina COSNEG para colocar el signo negativo al coseno
;---------------------------------------------------------------------------------------------------------------------------
cosneg: mov a,d ; coseno negativo
cpi 0
jz okc
ori 80h
mov d,a
okc: ret

defseg datos,start=100H
seg datos
;---------------------------------------------------------------------------------------------------------------------------
; Tabla de senos.
;---------------------------------------------------------------------------------------------------------------------------
tbsenx: dw 0000,0175,0349,0523,0698,0872,1045,1219,1392,1564
dw 1736,1908,2079,2250,2419,2588,2756,2924,3090,3256
dw 3420,3584,3746,3907,4067,4226,4384,4540,4695,4848
dw 5000,5150,5299,5446,5592,5736,5878,6018,6157,6293
dw 6428,6561,6691,6820,6947,7071,7193,7314,7431,7547
dw 7660,7771,7880,7986,8090,8192,8290,8387,8480,8572
dw 8660,8746,8829,8910,8988,9063,9135,9205,9272,9336
dw 9397,9455,9511,9563,9613,9659,9703,9744,9781,9816
dw 9848,9877,9903,9925,9945,9962,9976,9986,9994,9998
dw 10000
end

Interpolación

En algún caso puede ser necesario usar tablas de consulta reducidas y recurrir
a la técnica de interpolación para determinar la función para valores que no son en-
tradas de la tabla. En general el uso de interpolación mejora la precisión de la deter-
minación de la función.

Cuando la relación entre dos variables es marcadamente no lineal, la curva


puede ser aproximada por una secuencia de segmentos de líneas rectas. En aquellas
regiones de curvatura moderada los segmentos de líneas pueden ser más largos. Co-
nocido entonces un valor para la variable independiente, el valor de la función puede
ser encontrado por interpolación lineal sobre el segmento correspondiente.
Desarrollo y Simulación de Programas 424

Fig. 7.87 El valor de y para la entrada x puede calcularse por interpolación

Para un valor x cualquiera de la variable independiente, la salida correspon-


diente puede calcularse de,

y i − y i −1
y= × ( x − x i −1 ) + y i −1
x i − x i −1

Usando interpolación en la tabla del ejemplo anterior mejora la precisión a


0.1°, suficiente para la mayoría de los problemas de triangulación en navegación.
Suponga que un intervalo de un grado es suficientemente cercano para considerar un
comportamiento lineal y desea determinar el seno de 60.25 grados. Como el valor de
la función para 60 y 61 grados, entonces:

sen (61D ) − sen (60 D )


y= D D
( x − 60 D ) + sen (60 D )
61 − 60

[ ]
y = sen (61D ) − sen (60 D ) × (60.25 D − 60 D ) + sen (60 D )

y = 0.8681739796

y calc = 0.8681989814

Error = 2.4834 × 10 −5

Al contrastar el valor dado por la interpolación y el obtenido de una calculado-


ra, se obtiene un error despreciable. El proceso implica una multiplicación y una divi-
Desarrollo y Simulación de Programas 425

sión y conviene redondear el cociente después de la división. El redondeo en el siste-


ma binario se realiza de igual forma que en el decimal. Se examina el bit más signifi-
cativo de la parte fraccionaria y si es igual a uno se lleva el valor al inmediato supe-
rior. Para hacer visible la parte fraccionaria se multiplica el numerador por dos y se
ejecuta la división. Si el bit menos significativo del cociente es uno, se divide el resul-
tado por dos y se incrementa en uno. Si este bit es cero sólo se realiza la división por
dos.

En aplicaciones de instrumentación que usan transductores con relación no li-


neal entre la entrada y el voltaje equivalente, la variable x corresponde a la salida de
un convertidor analógico digital mientras que la variable dependiente y puede ser
temperatura o cualquier otra magnitud física. El uso de una tabla de búsqueda con
interpolación es el procedimiento a usar para convertir a °C la tensión a la salida del
sensor. El código para interpolación no conlleva complicación alguna y su escritura se
deja al estudiante como ejercicio.
Técnicas de gestión de Entrada y Salida 426

écnicas de Gestión de E/S


TTé

Un funcionamiento adecuado de un sistema basado en μP está íntimamente re-


lacionado con el diseño del soporte físico y lógico que controla la comunicación entre
la CPU y los dispositivos de E/S conectados al sistema. Se precisa garantizar que una
operación de lectura o escritura de E/S resulte en la recepción o en la transmisión a
través del bus de datos de la información correcta en el instante justo. Una selección
inadecuada del circuito de interconexión que permite que el procesador pueda comu-
nicarse con el mundo exterior, o de la técnica usada en la rutina de transferencia, pue-
de degradar significativamente el comportamiento del sistema durante el proceso de
comunicación. Debido a que es común que el μP debe intercambiar grandes cantida-
des de información con varios periféricos que operan a distintas velocidades veloci-
dad, múltiples consideraciones debe realizar el técnico, para el diseño de la sección
de E/S de una aplicación específica.

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


mina cuan complejo es el circuito de interconexión, pudiendo requerirse desde sim-
ples registros y/o buffers de tres estados hasta circuitos LSI programables de propósi-
to general. En este último caso, se le exige a la estructura de E/S cierta versatilidad,
que incluye desde la posibilidad de programación de los registros de entrada y salida
o de bits específicos de cada puerto hasta la capacidad de establecer diálogos bajo
control de interrupciones generadas por el periférico. Los términos dispositivos para
Interconexión Periférica Programable (PPI), Adaptador para Interconexión Periférica
(PIA), Adaptador para Interconexión Versátil (VIA), y Unidad de E/S programable
(PIO), identifican algunos de los componentes integrados programables de E/S ofre-
cidos por empresas fabricantes de circuitos digitales.

El desarrollo del programa que controla el acceso al periférico es una fase del
diseño que requiere tanta atención como la selección del circuito de puerto, esto debi-
do a que en algunas aplicaciones no solo es necesario seleccionar el puerto y ordenar
Técnicas de gestión de Entrada y Salida 427

la transferencia, sino que se requiere algún tipo de control del propio periférico co-
nectado al puerto.

Si se adopta la estrategia de realizar la mayor parte de las funciones de con-


trol de la comunicación por programa, se reduce el número de circuitos necesarios
para construir el puerto, pero es necesaria una gran cantidad de líneas de código para
escribir las rutinas de control. En este caso, es vital verificar que el μP es capaz de
manejar esta carga computacional. La cantidad de tiempo que el CPU destina a pro-
cesar la información proveniente del exterior y la velocidad con la cual el periférico
requiere la entrega de los resultados, son también factores que pueden hacer inapro-
piada la selección de una solución por programa para el control de la comunicación.
El uso de dispositivos programables para interconexión periférica simplifica en forma
significativa la complejidad del programa debido a que muchas de las funciones de
control son realizadas por el circuito integrado, el cual es capaz de admitir y procesar
señales de interrupción generadas por el periférico cuando necesita servicio de parte
del CPU.

Una aplicación de simple en extremo donde el proceso de comunicación se


reduce a la transmisión/recepción incondicional de un byte portador de algún tipo de
información significativa, puede ayudar a entender lo establecido en el párrafo ante-
rior. Suponga que por medio de un arreglo de 8 interruptores lógicos se introduce
información al μC, con los datos se realiza algún tipo de cálculo y se entrega el re-
sultado a un puerto de salida donde se conectan 8 indicadores luminosos.

La selección de los circuitos de interconexión en este caso es directa: para el


puerto de entrada es suficiente con conectar los interruptores al bus de datos del μP
por medio de un CI de tres estados del tipo 74LS244, considerando que no es necesa-
rio que el circuito de puerto tenga capacidad de almacenamiento. Para el puerto de
salida, debido a que los datos enviados por el μP a un puerto determinado permane-
cen en el bus de datos un espacio muy corto de tiempo, los periféricos de salida ge-
neralmente exigen que la información sea retenida por el circuito de interconexión
después que culmina la operación de escritura en puerto. En el caso que se discute,
para presentar y mantener el resultado numérico en los diodos luminosos el puerto de
salida puede consistir en un registro de almacenamiento paralelo como el 74LS373.

La ausencia en el ejemplo de condiciones para la transferencia se refiere a que


no es necesario el establecimiento de algún tipo de conversación o dialogo entre el μP
y el puerto antes, durante o después de la transferencia. El código necesario para el
manejo del puerto de entrada se reduce al uso de la instrucción IN puerto. Cuando
ésta se ejecute el decodificador de direcciones del sistema activará la señal de selec-
ción del puerto conectada a las entradas de control del 74LS244, y el estado de los
interruptores se transferirá al acumulador a través del bus de datos. En el caso del
puerto de salida, cuando se ejecuta una instrucción OUT puerto el contenido del
acumulador pasa bus de datos y a la entrada del 74LS373. La línea de habilitación
Técnicas de gestión de Entrada y Salida 428

del chip proveniente del circuito de decodificación del sistema y conectada al reloj
del CI se encarga de transferir la información a la salida del registro, manteniéndose
el estado de los diodos hasta que sean cambiados por una nueva operación de escritu-
ra. El intercambio de datos entre el μP y un puerto no siempre es tan sencillo como
ilustra el ejemplo anterior, en el caso de periféricos cuyo modo de funcionamiento es
relativamente complejo, es fundamental establecer un protocolo de comunicación
para sincronizar la transferencia de datos entre el μP y los dispositivos, e incluso en-
tre periféricos y otras unidades del sistema. En tales casos, puedes ser necesario que
el μP detecte si un dispositivo determinado está en disposición de transmitir o recibir
datos, y además debe sincronizar la transferencia correcta de la información. Un caso
típico en donde la transferencia de datos está sujeta a condiciones impuestas por el
periférico, es cuando la comunicación se realiza con periféricos lentos, que no son
capaces de mantener el intercambio de datos a la alta velocidad impuesta por la fre-
cuencia de operación del µP.

Una vez seleccionado el hardware que conforma el puerto y realizada la co-


nexión a los buses del sistema, se requiere establecer la estrategia a usar para la ges-
tión de la información que el μP envía a o recibe desde los puertos de E/S. No siem-
pre la información que entra o sale del sistema es compatible con el tipo de señal
comprensible por el microprocesador o por el dispositivo de E/S. En estos casos el
puerto debe proveer elementos que permitan la adaptación. Tales elementos pueden
consistir de circuitos desplazadores de nivel para aumentar, disminuir o cambiar la
polaridad de la tensión de entrada o salida de acuerdo con las características eléctricas
del sistema o del periférico. Puede ser necesario también el uso de convertidores ana-
lógico digital y digital analógico para modificar la naturaleza de la señal de entrada o
salida.

Es posible también que la información acceda a un puerto a una velocidad y lo


abandone a otra. Una memoria RWM, por ejemplo, puede operar en forma rápida y
soportar una velocidad alta. Pero las unidades controladoras de discos flexibles son,
por su naturaleza electromecánica, lentas e incapaces de entregar o aceptar datos a
frecuencias elevadas como a la que funciona el μP. En estos casos la estructura de
E/S debe proveer algún tipo de almacenamiento intermedio para el intercambio co-
rrecto de información entre el puerto y el sistema.

Algunos periféricos requieren establecer un dialogo con el sistema. En este ti-


po de comunicación asincrónica, el μP y el dispositivo externo deberán indicarse uno
a otro, por medio de un protocolo de enlace, cuando la información está lista para ser
transferida, y cuando el receptor está listo para recibir datos. Por ejemplo, si el siste-
ma está enviando 8 bits de datos en paralelo a una impresora, inicialmente carga el
puerto y avisa al dispositivo de salida que los datos están listos. La impresora lee el
puerto de control, e indica al procesador que está disponible para recibir más datos,
el μP cargará el puerto con el próximo dato y el proceso se repite. El μP puede entre-
gar a la impresora más caracteres por segundo, que los que ésta puede imprimir, el
dialogo adapta la velocidad del μP a la de la impresora. Es obvio que si la impresora
Técnicas de gestión de Entrada y Salida 429

no imprime la palabra recibida desde el sistema antes que arribe el próximo dato,
habrá pérdida de información.

Un puerto de E/S deberá estar en capacidad de recibir señales relativamente


deterioradas y de enviar señales de suficiente amplitud para que lleguen al periférico
destino sin degeneración apreciable. De modo que el puerto de E/S debe ser capaz de
cambiar la amplitud de las señales de control e información para cumplir con los re-
quisitos del μP, y de los periféricos remotos. El uso de buffers garantiza que los dis-
positivos conectados a los buses del sistema no signifiquen una carga excesiva cuan-
do el dispositivo está activo. Esto es particularmente importante cuando varios puer-
tos de salida son conectados al bus de datos, debido a la carga acumulativa que impli-
ca esta situación. Como dos puertos de entrada no pueden manejar simultáneamente
el bus, los buffers de entrada ser tri-estados.

Finalmente, un problema serio durante la transmisión de señales es la interfe-


rencia por ruido, el cual puede ser debido a fuentes externas, a líneas de potencia si-
tuadas en la proximidad del sistema, o a electricidad estática. Es importante que el
puerto este en capacidad de limpiar la señales que entran al sistema, el uso de ampli-
ficadores con histéresis, permiten ejecutar esta función.

En conclusión, la conexión de un periférico al µC requiere:

• El uso de un puerto de E/S, y dependiendo de la naturaleza de las señales aceptadas o en-


tregadas por el dispositivo externo, puede ser necesario un circuito de interconexión para
acondicionar las señales que entran o salen del CPU.

• Una técnica de gestión apropiada.

Existen tres técnicas principales de gestión para establecer comunicación entre


un periférico y el µP, éstas son:

1. E/S por programa.

2. E/S usando interrupciones.

3. Acceso directo a memoria (DMA)

8.1 ENTRADA Y SALIDA POR PROGRAMA


La entrada y salida de datos de los dispositivos de E/S están sincronizadas por
el programa en ejecución. Toda transferencia de información entre el µP y un puerto
es consecuencia de la ejecución de una instrucción de E/S. Existen dos modos de rea-
lizar la E/S por programa: en la primera, el µP lee o escribe en el puerto sin consultar
la disponibilidad del periférico para aceptar o recibir los datos. Ejemplos de esta mo-
dalidad es la lectura de un arreglo de interruptores, la activación de un indicador lu-
minoso o la generación de una palabra de configuración para un circuito de E/S pro-
Técnicas de gestión de Entrada y Salida 430

gramable. En estos casos es responsabilidad del programa realizar todas las operacio-
nes necesarias para una correcta entrada o salida de datos. Por ejemplo, si se presenta
información numérica en una pantalla multiplexada de indicadores de 7 segmentos,
será responsabilidad del código transmitir los datos a la velocidad adecuada para que
éstos sean visibles. La puesta en práctica del modo de gestión requiere circuitos de
poca complejidad y al ser una técnica sincrónica, se sabe el momento exacto en el
cual la. CPU atiende al periférico y el tiempo usado en ejecutar la rutina de servicio.

El siguiente ejemplo usa E/S por programa en el primer modo para comunicar
al µprocesador con dispositivos externos

Ejemplo 8.1

En la figura 8.2 se muestra un arreglo de ocho interruptores lógicos conectado


al puerto de entrada 16 y un indicador de siete segmentos en el puerto de salida 17. Se
deben escribir dos programas que:

1. Cuando un interruptor sea presionado y liberado, se presente en el indica-


dor el número del pulsador.
2. Muestre el número de veces que S5 es activado. El programa debe parar la
décima vez.
Tome en consideración el efecto de rebote de los pulsadores.

Un dispositivo de entrada de uso común en aplicaciones de control, son inter-


ruptores mecánicos como los mostrados en la figura 8.1. Cuando éstos se incluyen en
un diseño debe prestarse especial cuidado al efecto de rebote de contactos

(a) (b)

Fig. 8.1. (a) Interruptor deslizante. (b) Pulsador.

Considerando una escala microscópica, la superficie de los contactos no es li-


sa sino que está formada por elevaciones y depresiones y minúsculos promontorios
originados por las chispas de las continuas conmutaciones. Los interruptores usual-
mente son diseñados para que al ser activados, un contacto se ubique sobre el otro.
Esta acción libera partículas microscópicas de oxido y corrosión de modo que ocu-
rren muchos cierres y aperturas de contactos antes que el interruptor se establezca en
la condición de cerrado. En interruptores que usen resortes, el impacto mecánico de la
tensión de esta parte puede producir rebotes antes que el contacto real ocurra.
Técnicas de gestión de Entrada y Salida 431

Fig.8.2 Puertos de E/S para el ejemplo 8.1.


Técnicas de gestión de Entrada y Salida 432

Es claro que si los interruptores son usados como entradas en circuitos digita-
les se requiere un contacto limpio sin los indeseables rebotes que sugieren que el dis-
positivo ha sido accionado varias veces en lugar de una vez. La forma de onda gene-
rada durante el accionamiento de un interruptor convencional, se presenta en la figura
8.3. Durante el cierre del pulsador ocurren rebotes intermitentes durante 5-25 ms y en
la apertura este tiempo se reduce a 2-8 ms. La duración indicada para el rebote es un
estimado y depende fuertemente de la calidad y tiempo de uso del dispositivo. En
pulsadores de costo elevado se usan contactos con un baño de oro para disminuir el
oxido y la corrosión.

Fig. 8.3. Efecto del rebote de contactos en un interruptor mecánico.

El uso de pulsadores o teclas de bajo costo en aplicaciones de microprocesa-


dores es factible siempre y cuando se tomen medidas para suprimir el efecto de rebo-
te. En la práctica la intermitencia de contactos pude ser eliminada con circuitos o por
programa. Si se tiene un interruptor SPDT, el circuito de la figura 8.4 es ideal para
esta función.

Fig.8.4. Un biestable con puertas NAND suprime el efecto de rebote en un interruptor SPDT.
Técnicas de gestión de Entrada y Salida 433

En el flanco de caída del primer rebote, la salida D0 es llevada a uno o cero


dependiendo de la posición del interruptor. Cualquier rebote posterior no tiene efecto
sobre la salida.

En pulsadores e interruptores del tipo SPST, el circuito de la figura 8.4 no


puede ser utilizado. Para eliminar la acción de rebote en estos dispositivos pueden
usarse varios métodos, el primero de los cuales se muestra en la figura 8.5.

Fig.8.5. Supresión del rebote de un pulsador.

El capacitor en la figura 8.5 está normalmente cargado a 5 V produciendo un


nivel lógico alto en D0. Cuando el pulsador es activado, el capacitor es conectado a
tierra a través del resistor de 390Ω. La constante de tiempo del circuito RC se elige de
tal manera que los pulsos de rebote no afecten significativamente el proceso de des-
carga como ilustra la parte izquierda de la figura 8.7, de modo que D0 cae a estado
bajo. La apertura del pulsador inicia de nuevo la carga del capacitor como muestra la
figura 8.7. Observe que el cierre y apertura del interruptor sólo ocurre una vez. La
figura 8.7 superpone la señal de rebote, con duración de 5 ms, a la onda real en el
terminal D0. La duración y la separación de los pulsos de rebote corresponden a un
interruptor real.

Otro método de eliminación de la intermitencia en los contactos es usar un


multivibrador monoestable que produzca un pulso con una duración mayor al tiempo
de rebote. Un chip circuito integrado del tipo 74LS121 puede usarse con tal propósi-
to.

Finalmente, un circuito antirebote práctico puede construirse combinando una


red RC y un disparador de Schmitt, como ilustra la figura 8.6. En este caso la salida es
el complemento lógico de la entrada: cuando el interruptor está liberado, la salida es
Técnicas de gestión de Entrada y Salida 434

cero lógico y al ser presionado sube a estado uno. Cuando el pulsador es activado el
voltaje del capacitor se descarga rápidamente. Cuando esta tensión cae por debajo del
umbral inferior de histéresis VT-, la salida conmuta a nivel alto hasta cuando el inter-
ruptor es desactivado. En este momento el capacitor vuelve a cargarse y cuando el
voltaje sube por encima de VT+, la salida del 74LS14 cae a cero lógico. La salida es
un pulso en nivel alto, totalmente limpio.

Fig.8.6. Circuito antirebote con disparador de Schmitt.

La eliminación de la acción de rebote por hardware se recomienda cuando


existen pocos interruptores en la aplicación. Para muchos pulsadores o un teclado es
preferible usar el programa para suprimir el rebote de contactos. El código necesario
es una rutina que retardo que espere hasta cuando los contactos del interruptor han
dejado de rebotar. Para resolver el ejemplo 8.1 se usará esta técnica. A continuación
se presenta la solución al primer apartado del ejemplo 8.1.

Solución parte 1:

Esta parte del ejemplo 7.8 pide que luego de activado un interruptor se espere
su liberación para presentar el número del pulsador en el indicador. Si el rebote al
cierre no es suprimido, el µP tomará el rebote como la desactivación del dispositivo
y lo identificará sin esperar la apertura real.

El programa se realizó suponiendo que no ocurren cierres simultáneos de dos


o más de los ocho interruptores. El diagrama de flujo para el código del ejemplo pue-
de verse en la figura 8.8.

Se supone una duración de 10 ms para el transitorio del rebote de contactos.


Debido a que el número con el cual se identifica el interruptor es un valor binario,
éste debe convertirse al código adecuado para presentarse en el indicador de siete
segmentos antes de ser escrito en el puerto de salida 17. El código consta del progra-
ma principal y dos subrutinas: una para el retardo de 10 ms y la otra para la conver-
sión, como se aprecia en la figura 8.9.
Técnicas de gestión de Entrada y Salida 435

Fig.8.7. Formas de ondas resultado de la simulación del circuito antirebote de la figura 8.5. En t=0 se cierra/abre el interruptor el cual estaba abier-
to/cerrado en t=0-.
Técnicas de gestión de Entrada y Salida 436

Fig.8.8. Flujograma para identificar el interruptor activado y presentar su número, una vez liberado.
Técnicas de gestión de Entrada y Salida 437

Fig.8.9. Ventana principal de Microide con el proyecto del ejemplo 8.1

;-------------------------------------------------------------------------------------------------------
; Ejemplo 8.1
;-------------------------------------------------------------------------------------------------------
; Programa principal
;-------------------------------------------------------------------------------------------------------
defseg progr, start=0
defseg p8255,start=16, class=iospace
;------------------------------------------------------------------------------------------------------
extern ret_10ms,bin_7seg
tope_pila equ 0300h
;-----------------------------------------------------------------------------------------------------
seg p8255
pa: ds 1
pb: ds 2
pctrl: ds 1
;------------------------------------------------------------------------------------------------------
seg progr
lxi sp,tope_pila
mvi a,95h
out pctrl ; programar 8255
mvi a,255
out pb ; apagar indicador
esper_cierre: in pa ; esperar cierre de un interruptor
cpi 0ffh
Técnicas de gestión de Entrada y Salida 438

jz esper_cierre ; ninguno cerrado, esperar


call ret_10ms ; alguno cerrado, retardar 10 ms
mvi b,0ffh ; identificar interruptor
otro: inr b
rar
jc otro ; probar otro pulsador
esper_apert: in 10h ; esperar apertura para presentar número
cpi 0ffh ;
jnz esper_apert ;
mov a,b ; número al acumulador
call bin_7seg ; convertir a 7 segmentos
cma ; el indicador es ánodo común
out pb ; presentar número
hlt ; salir
end
;------------------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------------------
; Rutina de retardo
;------------------------------------------------------------------------------------------------------

public ret_10ms
defseg retardo
seg retardo
ret_10ms: push psw
lxi d,502h
ret1: dcx d
mov a,e
ora d
jnz ret1
pop psw
ret
end

;------------------------------------------------------------------------------------------------------
; Rutina de conversión de binario a siete segmentos
;------------------------------------------------------------------------------------------------------
public bin_7seg
defseg convers
seg convers

bin_7seg: lxi h,tabla


add l
mov l,a
mov a,m
ret
;------------------------------------------------------------------------------------------------------
; tabla de conversión
;------------------------------------------------------------------------------------------------------
tabla: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db 7fh,67h,77h,7ch,39h,5eh,79h,71h
end
Técnicas de gestión de Entrada y Salida 439

El código programa un PPI8255 en la dirección 10H con el puerto A como en-


trada y el puerto B como salida. El ejemplo se simuló con WSIM85 y funcionó bien.

Fig.8.10. Simulación del ejemplo 8.1 parte 1 con el interruptor S4 activado.

Solución parte 2:

En la parte anterior se debía esperar la liberación del interruptor para proceder


a parar al programa, lo cual sucedía con el primer rebote de apertura. En este caso se
desea registrar el número de veces que el interruptor 5 es presionado, esto significa
que es necesario también eliminar los rebotes durante la desactivación. De otro modo,
estos serían contabilizados como cierres/aperturas.

El diagrama de flujo para el programa se presenta en la figura 8.11 y a conti-


nuación se muestra el código para el programa principal. La programación de la sub-
rutina de retardo y la de conversión de binario a siete segmentos fue realizada en la
parte anterior del ejemplo.
Técnicas de gestión de Entrada y Salida 440

Fig.8.11. Flujograma para presentar el número de veces que el interruptor S5 es activado.

defseg progr, start=0


defseg p8255,start=16, class=iospace

extern ret_10ms,bin_7seg
tope_pila equ 0300h

seg p8255
pa: ds 1
pb: ds 2
pctrl: ds 1
Técnicas de gestión de Entrada y Salida 441

seg progr
lxi sp,tope_pila
mvi a,95h
out pctrl
mvi a,not(3fh)
out pb ; indicador a cero
mvi b,0 ; contador inicia en cero
esper_cierre: in pa ; esperar cierre de un interruptor
cpi 0ffh
jz esper_cierre ; ninguno cerrado, esperar
call ret_10ms ; alguno cerrado, retardar 10 ms
inr b
mov a,b
cpi 10
jz salir
mov a,b ; número al acumulador
call bin_7seg ; convertir a 7 segmentos
cma ; indicador es ánodo común
out pb ; presentar número
esper_apert: in 10h ; esperar apertura para presentar número
cpi 0ffh ;
jnz esper_apert ;
call ret_10ms
jmp esper_cierre ; esperar siguiente cierre
salir: hlt
end

Retomando lo dicho sobre la existencia de dos modos de realizar E/S por pro-
grama, se tiene que la segunda modalidad es la de consultas sucesivas o polling cuan-
do el µP pregunta periódicamente a cada periférico si requiere atención. Si la res-
puesta es negativa, el µP consultará al siguiente dispositivo de E/S, permaneciendo en
el lazo hasta cuando se le solicite servicio. Para preguntar al puerto, se debe examinar
un bit de estado activado por el periférico cuando necesita atención. Si existen varios
dispositivos de E/S, cada uno deberá generar su propio bit de estado. La lógica nece-
saria para poner en práctica esta modalidad es sencilla, pero al ser una comunicación
asincrónica, se gasta tiempo de CPU en forma innecesaria debido a que para garanti-
zar el funcionamiento del sistema, el lazo de consulta debe ejecutarse en intervalos
regulares aunque los periféricos no requieran servicio.

En la figura 8.12 se repite el circuito de la figura 7.30, el cual constituye un


ejemplo de E/S programada con consulta. En este caso el µP examina la línea P8.7 y si
está en nivel alto, lee el contenido del puerto P7. En otras palabras el periférico sube a
uno el terminal P8.7 para anunciar la presencia de un nuevo dato en la entrada del
puerto 8. Una vez que el µP lee el puerto, desactiva el bit de condición.

El código para la transferencia se presentó en el ejemplo 7.8. Considere ahora


que se tienen ocho puertos de entrada P0-P7, cada uno con su bit de estados particular
en la línea correspondiente del puerto P8. Por ejemplo el terminal P8.5 corresponde al
Técnicas de gestión de Entrada y Salida 442

puerto de entrada P5. El µP debe leer el puerto P8 y examinar los bits individuales
para determinar en cual puerto se ha cargado un nuevo dato.

El siguiente código permite ejecutar la rutina de servicio correspondiente a los


puertos que requieran atención.

conslt_suc: in 8 ; leer bits de estados


rar ; bit 0 a la bandera de acarreo
cc rut_0 ; leer nuevo dato en puerto 0 si bit 0 es uno
rar
cc rut_1
rar
cc rut_2
rar
cc rut_3
rar
cc rut_4
rar
cc rut_5
rar
cc rut_6
rar ; bit 7 a la bandera de acarreo
cc rut_7 ; leer nuevo dato en puerto 7 si bit 7 es uno
ret

Fig.8.12. Entrada de datos usando un bit de condición.


Técnicas de gestión de Entrada y Salida 443

8.2 ENTRADA Y SALIDA USANDO INTERRUPCIONES


El método de E/S por programa es adecuado para atender periféricos muy len-
tos como interruptores e indicadores visuales, los cuales pueden ser registrados o ac-
tualizados en cualquier momento. Otros dispositivos de E/S con mayor velocidad co-
mo: teclados, impresoras y sistemas de adquisición de datos, deben ser atendidos
cuando estén disponibles para transmitir o recibir información. En estos casos, el pro-
grama estará a la expectativa por la activación de una bandera de condición que noti-
fique que el periférico está libre. El tiempo de espera desperdicia tiempo de CPU y
requiere más líneas de código para su realización.

Suponga que el periférico de la figura 7.30 tarda un segundo en transmitir los


16 valores. El lazo en la rutina ADAT del ejemplo 7.8 que examina la bandera de
estado tiene una duración de 8.64 µs/paso.
adat: in p9
ani 80H
jz adat

El ancho de banda del periférico nos sugiere que el examen de la bandera ten-
drá éxito cada 62.5 ms. No obstante la verificación ocurrirá 115741 veces cada se-
gundo, lo cual equivale a 7234 veces antes de la transmisión de cada carácter. La pér-
dida de tiempo es del 99.99 %, debido a que el tiempo útil es de 138.24 µs por cada
segundo.

La solución a este problema es el uso de la técnica de interrupciones. Una in-


terrupción es una solicitud realizada al microprocesador por parte de un periférico
para solicitar servicio. Todo µP tiene al menos una entrada INTR para este propósito
y una salida INTA de reconocimiento de interrupción. La figura 8.13 muestra como el
puerto de bit de estado de la figura 8.12 puede ser eliminado para que en respuesta a
una interrupción el µP lea el dato cargado en el puerto de entrada por el dispositivo
externo.

Fig.8.13. Entrada de datos usando una interrupción.


Técnicas de gestión de Entrada y Salida 444

Cuando el µP recibe una interrupción puede tomar dos acciones: parar la eje-
cución del programa en progreso y ejecutar una rutina de servicio a la interrupción
para luego regresar al programa principal; o ignorar la petición si la interrupción está
deshabilitada. La entrada INTR puede ser sensible a flanco o a nivel, en el primer
caso cuando se presenta el flanco correspondiente en la entrada INTR se registra el
evento activando un bit interno del procesador hasta cuando el CPU reconozca la
interrupción. De modo que la señal de solicitud no tiene porque permanecer en uno
lógico. En el otro caso, la señal debe permanecer aplicada con un nivel estable hasta
cuando la interrupción sea aceptada. Si INTR es sensible a nivel, debe usarse un latch
para memorizar la petición de interrupción como ilustra la figura 8.14.

Fig.8.14. Entrada de datos usando una entrada INTR sensible a nivel.

Fig.8.15. Proceso de atención a una interrupción.


Técnicas de gestión de Entrada y Salida 445

Una interrupción, como todo evento asincrónico, puede producirse en cual-


quier momento durante la ejecución de un programa. Cuando ocurre, se completa la
instrucción que está en ejecución, el µP acepta la petición y transfiere el control a una
rutina de servicio de interrupción (RSI) la cual salva las variables para preservar las
operaciones a reanudarse y atiende al periférico que originó la llamada. Una vez
completada la RSI, el control se transfiere de nuevo al programa principal. La figura
8.15 muestra como se interrumpe el procesamiento normal de un programa y se re-
anuda una vez ejecutada la RSI. Las tareas que siguen a una interrupción son las si-
guientes:

• Culmina la ejecución de la instrucción en curso.


• Se activa la señal de reconocimiento de interrupción.
• El contenido del contador de programa se almacena en la pila.
• El PC se carga con la dirección de la primera instrucción de la RSI.
• Se ejecuta la rutina de servicio.
• Se recupera el contenido del PC guardado en la pila.

Considere de nuevo el caso del periférico que transmite 16 bytes por segundo.
Si la transferencia se ejecuta por medio de una interrupción, el procesador será inte-
rrumpido 16 veces cada segundo y ejecutará la rutina de servicio para leer y cargar en
memoria el valor. Si la duración del código en la RSI es digamos 15 µs, para poder
transmitir y almacenar en memoria los 16 valores se invierte un tiempo de CPU de
aproximadamente 240µs, en contraste con el tiempo de más de un segundo que re-
quiere el µP para examinar la bandera de estado, leer el puerto y almacenar los valo-
res cuando se usa el método de polling.

Las interrupciones que pueden ser inhabilitadas por el programa, se dice que
son enmascarables, mientras que aquellas que el sistema no puede suspender son no
enmascarables. Existen instrucciones específicas del microprocesador para la habili-
tación o no de una interrupción particular o de todo el sistema de interrupciones.
Cuando una señal es aplicada a una entrada de interrupción vectorizada, se le sumi-
nistra internamente al procesador la dirección a la cual se debe transferir el control
del programa. En el caso de interrupciones no vectorizadas, el µP espera que una ló-
gica externa provea tal dirección.

8.2.1 El sistema de interrupciones del 8085A

El µP 8085A tiene cinco de entradas de interrupción: TRAP, RST 7.5, RST


6.5, RST 5.5 e INTR. Todas son enmascarables excepto TRAP, la cual no puede ser
deshabilitada por el sistema. Las interrupciones TRAP, RST 7.5, RST 6.5 y RST 5.5
son vectorizadas, de modo que cuando son activadas y están habilitadas, se genera
una instrucción RST n.x interna que suministra la dirección de salto. En el caso de
activación de la línea INTR, el µP espera que en respuesta a la conmutación de la
salida INTA , alguna lógica externa coloque en el bus de datos una instrucción CALL
dirección o preferiblemente una RST n.
Técnicas de gestión de Entrada y Salida 446

El terminal INTR es sensible a nivel, de modo para activar esta interrupción


debe aplicarse un 1 lógico a la entrada y mantenerse hasta cuando la interrupción sea
reconocida. El vector de interrupción de la entrada INTR debe suministrarse exter-
namente.

Fig.8.16. Entradas de interrupción y salida de reconocimiento de interrupción

La entrada TRAP tiene prioridad máxima y es sensible a flanco y a nivel, lo


cual significa que el flanco de subida de la señal aplicada dispara el proceso de inte-
rrupción, pero la entrada deberá ser mantenida en uno hasta cuando la solicitud sea
reconocida.

La línea RST 7.5 es disparada por el flanco anterior de la señal presentada a


esta entrada. Debido a que el µP registra la ocurrencia del flanco cargando uno en un
bit interno, no es necesario mantener a RST 7.5 en alto. Cuando la interrupción es
atendida la bandera vuelve a cero. Las restantes entradas: RST 6.5 y RST 5.5 son
sensibles a nivel alto, como INTR.

El 8085 tiene varias instrucciones destinadas a ser usadas con las interrupcio-
nes. Estas son: EI, DI, SIM, RIM y la conocida RST n.

Tabla. 8.1 Instrucciones asociadas al sistema de interrupciones.


Instrucciones asociadas con interrupciones

EI Habilitar interrupción SIM Poner máscara de interrupción

DI Inhibir interrupción RIM Leer máscara de interrupción


Técnicas de gestión de Entrada y Salida 447

EI

Habilita las interrupciones del microprocesador después de la ejecución de la


siguiente instrucción. EI pone en uno la bandera de habilitación de interrupción o
BITINTE, autorizando todas las interrupciones enmascarables.

DI

Pone en 0 la bandera de habilitación de interrupción o BITINTE, deshabilitando


todas las interrupciones enmascarables, inmediatamente después la ejecución de DI.

Cuando una señal es aplicada a la entrada TRAP, la interrupción es atendida


de inmediato independientemente que el sistema de interrupciones esté deshabilitado
con DI. Para que una solicitud de interrupción realizada en la línea INTR sea atendida
basta con que la entrada esté habilitada por medio de la instrucción EI. Por el contra-
rio, las entradas RST 7.5, RST 6.5 y RST 5.5 disponen de un mecanismo de enmas-
caramiento que permite la autorización o no de cada entrada en forma independiente.
Para que una de estas entradas sea habilitada se debe desenmascarar la interrupción
correspondiente usando la instrucción SIM y posteriormente se debe ejecutar la ins-
trucción EI.

Tabla. 8.2 Características de las interrupciones del 8085A.


Entrada Prioridad Habilitación Disparo Vector de interrupción
TRAP 1 Ninguna Flanco y nivel 0024H
2 SIM
RST5.5 Nivel 002CH
EI
3 SIM
RST6.5 Nivel 0034H
EI
4 SIM
RST7.5 Flanco anterior 003CH
EI
INTR 5 EI Nivel Externo
(CALL dir o RST n)

El espacio de direcciones entre 0000H y 0040H debe preservarse para el ma-


nejo de interrupciones. Observe que entre los vectores de las interrupciones existe un
espacio de ocho posiciones de memoria, lo cual es suficiente para contener una ins-
trucción de salto a la RSI. Las rara nomenclatura de las interrupciones RST n.x se
debe a que su vector se encuentra en el punto medio entre la RST n anterior y la sub-
siguiente. Por ejemplo RST 6 tiene como vector 0030H (8 x 6) y 38H (7 x 8) es el de
RST 7, de modo que a RST6.5 le corresponde 34H (6.5 x 8).

Como se expuso en el capítulo 4, la presencia de una interrupción es detecta-


da por el µP durante el flanco negativo del pulso de reloj anterior al fin de la instruc-
ción durante la cual la interrupción es activada. Esto permite la culminación de la
Técnicas de gestión de Entrada y Salida 448

ejecución de la instrucción en curso antes de atender la interrupción. Si el µP está en


el estado HALT el muestreo se realiza en cada ciclo de reloj.

En la figura 8.17 se muestra un diagrama de transición simplificado de la ope-


ración del 8085. Observe que al final del último ciclo de máquina de la instrucción
en ejecución se pregunta si hay alguna interrupción pendiente que esté habilitada y/o
desenmascarada. Si la respuesta es negativa el µP buscará la siguiente instrucción. Si
existen solicitudes diferidas, se desactivan las interrupciones poniendo a cero el
BITINTE de habilitación y se reconoce la petición cargando uno en el bit de recono-
cimiento de interrupción BITINTA, y. En el siguiente pulso de reloj, se inicia un ciclo
de máquina de reconocimiento de interrupción o INA, si e trata de INTR o un ciclo
de máquina del tipo de bus inactivo o BI, en el caso de TRAP y RST.

Fig.8.17. Diagrama de transición de estados simplificado del 8085A.

El ciclo de máquina INA es similar al ciclo de búsqueda excepto que IO / M


va a nivel alto y se activa INTA en lugar de RD . Durante el ciclo de máquina BI se
Técnicas de gestión de Entrada y Salida 449

genera la instrucción RST interna que suministra el vector de interrupción para las
entradas TRAP y RST.

Cuando una interrupción es reconocida, se deshabilita el sistema de interrup-


ciones al ponerse a cero el BITINTE. También en un evento de RESET son puestos a
cero el BITINTE, el bit interno de reconocimiento de flanco del RST 7.5 y TRAP y se
colocan (ponen a 1) las máscaras de interrupción a RST 7.5, RST 6.5 y RST 5.5.
Usualmente un flip flop de habilitación se pone a uno para permitir la interrupción
mientras que un flip flop de máscara se pone a cero para desenmascarar la interrup-
ción.

Interrupciones disparadas por la entrada INTR

Estando habilitada INTR por medio de la instrucción EI, el proceso de inte-


rrupción se inicia cuando el periférico pone en alto la entrada. A continuación se des-
habilitan las interrupciones poniendo a cero el BITINTE y el µP inicia un ciclo de má-
quina tipo de reconocimiento de interrupción con S1 = 1 , S 2 = 1 , IO / M = 1 y la línea
INTA activada a nivel bajo. Durante el ciclo INA no se incrementa el contador de
programa, el cual contiene la dirección de la instrucción que sigue a la que estaba en
ejecución en el momento de producirse la interrupción. Mientras INTA esté en nivel
bajo, el µP esperará que el dispositivo que interrumpe coloque en el bus de datos el
código de operación de la próxima instrucción a ejecutar. Tal instrucción debe sumi-
nistrar a la CPU la dirección de inicio de la rutina de servicio de interrupción. Tam-
bién debe almacenar en la pila el contenido del contador de programa para que el
programa pueda reasumir, una vez finalizada la RSI, las operaciones que estaba reali-
zando antes de producirse la interrupción. Para esta función, sólo dos instrucciones
son factibles de usar: CALL dirección y RST n.

La instrucción RST n requiere menos lógica externa para esta tarea que la
CALL. El código de instrucción de RST n es:

D7 D6 D5 D4 D3 D2 D1 D0
1 1 N N N 1 1 1

Donde NNN es el valor de n en binario. La ejecución de RST n carga en la pila


el contenido del PC y carga en el PC el valor 0000000000NNN000 ó 8 x n, el cual es
la dirección de la primera instrucción de la RSI o de una instrucción de salto a ésta.

Tabla.8.3. Vectores de interrupción para las instrucciones RST n.


Instrucción Vector de interrupción Instrucción Vector de interrupción
RST0 0000H RST4 0020H
RST1 0008H RST5 0028H
RST2 0010H RST6 0030H
RST3 0018H RST7 0038H
Técnicas de gestión de Entrada y Salida 450

Un circuito que permite cargar en el bus de datos cualquiera de las instruccio-


nes RST n cuando la línea INTA esté en nivel cero se muestra en la figura 8.18. La
lógica consiste de ocho buffers de tres estados del tipo 74LS244 y tres interruptores
lógicos. El interruptor S permite seleccionar la instrucción RST n (n: 0-7) y la señal
INTA habilita los buffers de modo que la instrucción RST n programada pase al bus
de datos del µP.

Fig.8.18. Interconexión de una RST n al 8085.

Debido a que la instrucción RESTART sólo salva en la pila el contenido del


contador de programa, es responsabilidad del programador incluir al inicio de la RSI
las instrucciones PUSH necesarias para preservar el contenido de los registros que
van a ser modificados, los cuales deben ser recuperadas con POP al culminar la RSI.
La rutina de servicio de interrupción debe terminar con una instrucción RET para
Técnicas de gestión de Entrada y Salida 451

reasumir el programa principal y ésta debe estar precedida por una EI para habilitar
de nuevo las interrupciones enmascarables, las cuales fueron inhibidas por el proceso
de interrupción previo.

A continuación se expone un ejemplo del modo de operación de un puerto de


entrada con interrupción.

Ejemplo 8.2

La figura 8.19 muestra el diagrama eléctrico de un circuito de conversión ana-


lógico digital ADC0804 conectado al microprocesador 8085. Cuando el dispositivo
finaliza el proceso de conversión de una muestra de la entrada analógica Ve, activa a
nivel bajo la salida de fin de conversión del conversor A/D INTR , e interrumpe al
procesador al aplicar un nivel alto a la entrada de interrupción INTR. El latch mantie-
ne a INTR en uno hasta cuando el CPU reconoce la interrupción, instante cuando la
salida INTA inicia a cero el biestable. Se debe escribir un programa que maneje el
puerto del ADC y cargue 16 datos partir de la dirección de memoria 2000H.

;-----------------------------------------------------------------------------------------------------------
; Ejemplo 8.2
;-----------------------------------------------------------------------------------------------------------
jmp inicio
org 28H
; vector de interrupción de RST 5
rst5: jmp leer_dato ; salto a rutina de servicio de interrupción
org 100h
inicio: lxi h,dat ; inicio de zona de almacenamiento de datos
mvi b,17 ; contador de datos
ret_int: lxi sp,b_stack
dcr b
jz proceso
out puerto_adc ; iniciar conversión
ei ; habilitar interrupciones
hlt ; esperar interrupción

proceso: ; procesamiento de los


; datos adquiridos
;.
;.
;.
leer_dato: in puerto_adc ; leer valor desde ADC
mov m,a ; cargar dato en memoria
inx h ; próxima posición
jmp ret_int ; muestra siguiente
end

En las aplicaciones usuales de interrupciones, el µP está ejecutando una sec-


ción de código y en cualquier momento es interrumpido por un periférico. Luego de
atender al dispositivo externo, el procesador retorna a ejecutar el programa que proce-
Técnicas de gestión de Entrada y Salida 452

saba antes de ser interrumpido. En este ejemplo, la CPU inicia el proceso de conver-
sión y a continuación espera, sin realizar ninguna acción, por una interrupción. El µP
sólo espera por la interrupción y no se requiere código de consulta de una bandera de
estado ni una línea de puerto adicional para el bit de estado.

Al inicio, el programa coloca en el registro par HL, la dirección de carga del


primer dato e inicia en 17 el contador de datos adquiridos. A continuación, carga el
apuntador de pila y prueba si el dato anterior fue el último. Si lo es, ejecutará un códi-
go no mostrado para procesar la información obtenida. En caso contrario, se inicia el
proceso de conversión de una muestra, habilitando las interrupciones con EI y se lleva
al µP a un estado de parada, en espera de la interrupción de fin de conversión. Cuando
la línea INTR del conversor cae a cero, se ejecuta una instrucción RST 5 y el control
salta a la rutina de lectura del CAD.

Fig.8.19.El ADC0804 interrumpe al µP al final de cada conversión.

La RSI no finaliza con un RET porque el µP retornaría a la siguiente instruc-


ción después de HLT y lo que se requiere es adquirir la siguiente muestra o procesar
los datos adquiridos. El retorno se realiza a restaurar el valor del apuntador de pila y
probar el contador de datos.
Técnicas de gestión de Entrada y Salida 453

El programa fue simulado con WIN85, como ilustra la figura 8.21. La mayoría
de los simuladores detienen la ejecución del programa al ejecutar HLT y no simulan el
modo de parada. WIN85, por el contrario, si lo emula, permaneciendo en estado HALT
del cual puede ser sacado con una interrupción o con un pulso de RESET.

Interrupciones disparadas por las entradas RST

Cuando el µP reconoce una interrupción provocada por la aplicación de una


señal en las entradas TRAP, RST 7.5, RST 6.5 o RST 5.5, transita a un ciclo de má-
quina de bus inactivo durante el cual se genera una instrucción RST n.x interna, la cual
provee el vector de interrupción. Durante el ciclo BI no se incrementa el contador de
programa. La sólo ejecución de la instrucción EI, no habilita las entradas de interrup-
ción RST. Es necesario que previamente se desenmascare la interrupción, usando la
instrucción SIM (Set Interrupt Mask).

SIM

Esta instrucción permite que el contenido del acumulador sea usado como indi-
ca la figura 8.20 para programar el registro interno de máscara de interrupciones.

D7 D6 D5 D4 D3 D2 D1 D0
SOD SOE X R7.5 MSE M7.5 M6.5 M5.5

Máscaras de
interrupción

Habilitación de
puesta de más-
caras.

Reset RST7.5

Sin uso

Habilitación
de salida serie

Salida serie
de datos
Fig.8.20.El registro de máscaras de interrupción como es puesto por la instrucción SIM.
Técnicas de gestión de Entrada y Salida 454

Fig.8.21.Ventana principal de WIN85 mostrando los resultados de la simulación.


Técnicas de gestión de Entrada y Salida 455

Un 1 debe ser cargado en el bit 3 del acumulador para poder poner/quitar la


máscara de cualquiera de las entradas de interrupciones RST. Un 1/0 en los bits D0-2
deberá poner/quitar la máscara de la entrada correspondiente. Quitando la máscara se
habilita la interrupción correspondiente. Si el bit 4 del acumulador es puesto a 1 antes
de ejecutar SIM, se pone en cero el flip flop interno de RST7.5. La salida de este bies-
table es puesta a 1 cuando se presenta un flaco positivo a la entrada RST7.5 indepen-
dientemente de que la entrada está enmascarada. Este biestable también es puesto en
cero cuando se reconoce la interrupción o después de un RESET. La instrucción SIM
también carga el bit 7 del acumulador en la salida SOD si el bit 6 está en 1.

La última instrucción asociada al sistema de interrupciones es RIM (Read In-


terrupt Mask), la cual carga en el acumulador el estado del bit de validación de inte-
rrupciones, el estado de las máscaras RST y las interrupciones pendientes.

RIM

Carga en el acumulador con las máscaras de las entradas RST, las interrupcio-
nes solicitadas y aún no atendidas, la bandera de habilitación de interrupciones y el
estado de la línea SID de entrada serie como indica la figura 8.22.

D7 D6 D5 D4 D3 D2 D1 D0
SID I7.5 I6.5 I5.5 IE M7.5 M6.5 M5.5

Máscaras de
interrupción

Bandera de ha-
bilitación de in-
terrupciones

Interrupciones
pendientes

Entrada serie
de datos

Fig.8.22.El registro de máscaras de interrupción como es leído por la instrucción RIM.


Técnicas de gestión de Entrada y Salida 456

Cuando las interrupciones están pendientes, pero enmascaradas, puede usarse


la instrucción RIM para dar servicio a o a los periféricos que solicitan atención. Si la
entrada es RST 7.5 debe ponerse a 1 el bit 4 del acumulador por medio de SIM, antes
que sea detectada una nueva solicitud.

Ejemplo 8.3

La figura 8.23 muestra un pulsador conectado a la entrada de interrupción RST


7.5. Escriba un programa que cargue el puerto de salida 20H el número de veces que el
pulsador S1 es presionado.
+5V

2.2k

S1
220
RST7.5

74LS14
10µF

Fig.8.23.El pulsador S1 dispara la interrupción RST7.5.

;----------------------------------------------------------------------------------------------
; Ejemplo 8.3
;----------------------------------------------------------------------------------------------
defseg prog, absolute, start=0
seg prog
jmp inicio ;a inicio del programa
;----------------------------------------------------------------------------------------------
; Rutina de servicio de interrupción
;----------------------------------------------------------------------------------------------
org 3ch ; vector de RST7.5
inr a ; Se incrementa contador de pulsaciones
out 20h ; salida al puerto 20H
ei ; Se vuelven a habilitar las interrupciones
ret ; retorno desde interrupción
;---------------------------------------------------------------------------------------------
; Programa principal
;---------------------------------------------------------------------------------------------
org 0100h
inicio: lxi sp,b_stack
mvi a,0bh ; desenmascara RST7.5
sim
ei ; habilita sistema de interrupciones
xra a ; el contador se inicia en cero
out 20h
esper: jmp esper ; espera por interrupción
end
Técnicas de gestión de Entrada y Salida 457

Para habilitar la entrada de interrupción es necesario quitar la máscara de inte-


rrupción con la secuencia,
mvi a, 00001011b
sim
ei

El bit 3 en uno permite manipular los bits de máscara. El bit 2 en cero quita la
máscara a RST 7.5, mientras que los bits 1 y 0 en uno mantienen RST 6.5 y RST 5.5
enmascaradas. Para completar la habilitación de las interrupciones se ejecuta EI. An-
tes del retorno de la RSI se rehabilita el sistema de interrupciones con EI.

El programa fue simulado con WIN85. Observe en la figura 8.24 que el simu-
lador muestra el contenido del puerto directamente en decimal. En la práctica debe
usarse una instrucción DAA después del incremento del acumulador para que la
cuenta sea en BCD.

Ejemplo 8.4

Debe repetirse el ejemplo anterior, pero con la entrada RST 7.5 enmascarada.
Use la instrucción RIM para detectar una solicitud e interrupción.

;---------------------------------------------------------------------------------------------------------------
; Ejemplo 8.4
;---------------------------------------------------------------------------------------------------------------
defseg prog, absolute, start=0
seg prog
org 0100h
mvi b,0
contar: rim ; leer registro de máscaras de interrupciones
ani 40h ; ocultar todos los bits excepto el de RST7.5 pendiente
jz contar ; no hay interrupción pendiente, esperar
inr b ; se activo el pulsador y se incrementa contador.
mov a,b ;
out 20h ; salida al puerto 20H
mvi a,10h ; se inicia flip flop que indica flanco detectado en entrada
sim ; RST7.5
jmp contar ; a esperar por interrupción
end
;---------------------------------------------------------------------------------------------------------------

En este caso las interrupciones no se habilitan, de modo que las solicitudes al


µP son ignoradas. Sin embargo, usando RIM puede detectarse si se ha realizado una
petición en cualquiera de las entradas RST. Cuando esto ocurre puede brindarse aten-
ción al dispositivo en una forma similar a la técnica de consultas. Debido a que el flip
flop interno de RST 7.5 es puesto a 1 cuando se aplica un flanco positivo a esta en-
trada, el programador debe llevar a cero este bit usando SIM para que una nueva so-
licitud pueda ser detectada. Si las interrupciones hubiesen estado habilitadas la salida
de este biestable volvería a cero, al ser reconocida la interrupción.
Técnicas de gestión de Entrada y Salida 458

Fig.8.24.La instrucción RIM permite atender a periféricos cuando el sistema de interrupciones está deshabilitado.
Técnicas de gestión de Entrada y Salida 459

Ejemplo 8.5

Escribir un código que permita ver en la pantalla del SDA 85, el número de
veces que la tecla Rst 7.5 es presionada.

Fig.8.25.Teclado y pantalla del SDA 85.

• El monitor del SDA 85 tiene en la dirección ROM:003CH un salto a la posición de memoria


RAM:0FFB1H. En esta última dirección debe estar la primera instrucción de la RSI.

• La subrutina UPDDT (06D3H) presenta en el campo de datos de la pantalla el byte almacenado


en la dirección 0FFF9H.

En un µC como el SDA 85 lo usual es que el controlador de teclado suprima


en forma automática el rebote de contactos de cada una de las teclas. En este caso, el
pulsador Rst 7.5 está conectado directamente a la entrada de interrupción RST 7.5, de
modo que se produce efecto de rebote, al ser pulsado. Como consecuencia, si se pre-
siona está tecla una sola vez se generarán múltiples peticiones de interrupción. El
programa de este ejemplo debe garantizar que se produce una solicitud de interrup-
ción por cada activación de la tecla Rst7.5.

La solución es que la rutina de servicio de interrupción espere 30 ms (dura-


ción del rebote), a continuación suprima toda interrupción pendiente y finalmente
proceda a incrementar el contador.
;---------------------------------------------------------------------------------------------------------------
; Ejemplo 8.5
;---------------------------------------------------------------------------------------------------------------
upddt equ addr 06d3h ; dirección de rutina UPDDT
cont equ addr 0fff9h ; dirección cuyo contenido muestra UPDDT
;---------------------------------------------------------------------------------------------------------------
; Programa principal
;---------------------------------------------------------------------------------------------------------------
org 4000h
lxi sp,4800h
mvi a,0bh ; quitar mascara a RST7.5
sim
ei ; habilitar interrupciones
Técnicas de gestión de Entrada y Salida 460

mvi a,0 ; contador se inicia en vero


sta cont
mvi b,00h ; sin punto decimal
call upddt ; presentar contador en campo de datos
ocup: jmp ocup ; esperar por interrupción

;---------------------------------------------------------------------------------------------------------------
; Subrutina de servicio de interrupción.
;---------------------------------------------------------------------------------------------------------------
rst7.5: call rebot ; Suprimir rebote
mvi b,00h ; sin punto decimal
lda cont ; contador al acumulador
inr a ; incrementar contador
daa ; cuenta en decimal
sta cont ; presentar contador
call upddt
rim
ei ; rehabilitar interrupciones
ret
;---------------------------------------------------------------------------------------------------------------
; Eliminar rebote de tecla Rst7.5
;---------------------------------------------------------------------------------------------------------------
rebot: call ret30ms ;Esperar 30 ms
mvi a,10h ;Suprimir interrupciones no deseadas
sim ;Limpiando el FF RST 7.5
mvi a,0bh
sim ;Desenmascarar RST7.5
ret
;---------------------------------------------------------------------------------------------------------------
; Retardo de 30 ms
;---------------------------------------------------------------------------------------------------------------
ret30ms: lxi d,0deah
ret30: dcx d
mov a,e
ora d
jnz ret30
ret
;---------------------------------------------------------------------------------------------------------------
; Vector de interrupción RST 7.5
;---------------------------------------------------------------------------------------------------------------
org 0ffb1h
jmp rst7.5
;---------------------------------------------------------------------------------------------------------------

Si el efecto de contactos no es eliminado, el contador se incrementará por


cuatro cada vez que se pulse la tecla Rst7.5.

Las interrupciones normalmente están asociadas al funcionamiento de circui-


tos de control de tiempo o temporizadores y en casos donde el µP intercambia datos
con un periférico o con otro procesador. Estos tópicos se tratan más adelante. Para
finalizar el capítulo se presenta un ejemplo que involucra tres eventos, dos de los
cuales son controlados por interrupción.
Técnicas de gestión de Entrada y Salida 461

Fig.8.26 La tecla Rst 7.5 se presionó treinta y seis veces.


Técnicas de gestión de Entrada y Salida 462

Ejemplo 8.6

El microcomputador SDA 85 del simulador 8085 Virtual Kit debe ser conver-
tido en un reloj de tiempo real. Esto es que debe presentar la hora del día en su panta-
lla de acuerdo con el formato de la figura 8.27.

Fig.8.27.Formato del reloj de 24 horas.

El funcionamiento del programa debe ser como se indica a continuación:

1. El reloj presentará continuamente la hora del día en un formato de 24 horas.

2. Pulsando la tecla <RST7.5> del teclado del microcomputador se genera una interrupción
que permite ajustar la hora como se indica.

3. Pulsando la tecla <END> se modifican los minutos.

4. Tecleando de nuevo <END> se presenta la nueva hora.

Como base de tiempo se usará una rutina de retardo de 1 segundo. En la prác-


tica se prefiere aplicar la señal de un oscilador externo de frecuencia estable a una de
las entradas de interrupción, para generar el retardo base de 1 segundo. Pero el simu-
lador no permite aplicar tal señal a la entrada RST 6.5, al estar conectada a una tecla
con efecto de rebote.
Técnicas de gestión de Entrada y Salida 463

Para escribir el programa de reloj digital se usan las rutinas de usuario mos-
tradas en la tabla 8.4.

Tabla.8.4.Rutinas de monitor del SDA 85.


Rutina Dirección Descripción
OUTPUT 05FCH Presenta en pantalla la cadena de caracteres apuntada por
HL. Si (A)=0 se usa el campo de direcciones. Si (A)=1
se usa el campo de datos. Si (B)=0 se muestra el punto
decimal. Si (B)=1 sin punto decimal.
RDKBD 0634H Espera la pulsación de una tecla y retorna en el A el
código de la tecla.
La interrupción RST5.5 debe ser desenmascarada.
06BCH El contenido de las direcciones de memoria FFF7H y
UPDAD FFF8H se presenta en el campo de direcciones de la
pantalla. El registro B controla el punto decimal.
UPDDT 06D3H El byte en la posición FFF9H se presenta en el campo de
datos de la pantalla. El registro B controla el punto deci-
mal.

El programa ejecutará un programa principal el cual mide y presenta horas,


minutos y segundos. Una interrupción RST 7.5 ejecutará una rutina de servicio que
permite modificar las horas y los minutos. Esta rutina debe desenmascarar la entrada
RST 5.5, para poder leer el teclado.

El programa usa tres contadores en memoria para presentar la hora. Cada vez
que transcurre un segundo, se incrementa el primer contador (SEG). Cuando SEG
alcance 60, se pone a cero y se suma uno al contador de minutos (MIN) y cuando
MIN llegue a 60, se lleva a cero y se incrementa en uno el contador de horas (HOR).
Cuando HOR indique 24, se pone en cero y se reinicia la cuenta. Para simplificar el
programa las posiciones de memoria que se usan como contadores son:

MIN 0FFF7H
HOR 0FFF8H
SEG 0FFF9H

Observe que SEG corresponde a la posición cuyo contenido UPDDT presen-


ta en el campo de datos y MIN y HOR son las direcciones cuyos bytes UPDAD
muestra en el campo de direcciones. El vector de RST7.5 (003CH) contiene un salto a
la posición de memoria RAM: FFB1H. Aquí se inserta un salto a la rutina de servicio
pon_hm.

Los diagramas de flujo del programa principal y de la rutina de servicio de in-


terrupción RST 7.5 se muestran en las figuras 8.28 y 8.29 y el listado del código a
continuación.
Técnicas de gestión de Entrada y Salida 464

Fig.8.28. Diagrama de flujo del programa principal


Técnicas de gestión de Entrada y Salida 465

Fig.8.29. Rutina de servicio RST 7.5.


Técnicas de gestión de Entrada y Salida 466

;***************************************************************************
; Programa reloj digital
;***************************************************************************

output equ addr 5fch


rdkbd equ addr 634h
updad equ addr 6bch
upddt equ addr 6d3h
seg: equ addr 0fff9h
hor: equ addr 0fff8h
min: equ addr 0fff7h

;***************************************************************************
; Programa principal
;***************************************************************************
.code

org 4000h
xra a
sta seg ; inicio en 00:00:00
sta min
sta hor
inicio: lxi sp, 5000h
mvi a,0bh ; desenmascarar interrupción RST7.5
sim
ei ; habilitar interrupciones
call upddt ; presentar segundos
call updad ; presesentar horas-minutos
call ret1s ; esperar un segundo
mvi b,2 ; contador para control de seg-min
lxi h,seg ; apuntar segundos
inc_min: mov a,m ; cargar en acumulador seg/min anterior
inr a ; incrementar seg/min
daa ; cuenta en decimal
mov m,a ; actualizar seg/min
cpi 60h ; comparar con 60
jc inicio ; si menor presentar hh:min:seg
mvi m,0 ; si mayor seg/min a cero
dcx h
dcx h ; apuntar min
dcr b
jnz inc_min ; incrementar minutos
inx h ; apuntar hora
inx h
inx h
mov a,m ; cargar hora anterior en el acumulador
inr a ; incrementar hora
daa ; contador decimal
mov m,a ; actualizar hora
cpi 24h ; comparar con 24
jc inicio ; si menor presentar hh:min:seg
mvi m,0 ; si mayor hor a cero
jmp inicio ; presentar hh:min:seg
;***************************************************************************
Técnicas de gestión de Entrada y Salida 467

;***************************************************************************
; Rutina de servicio RST7.5.
;***************************************************************************
pon_hm: push psw ; salvar registros
push b
push d
push h
mvi a,0eh ;desenmascarar RST5.5 (RDKBD)
sim
lxi h,msj_h ; presentar mensaje HorA
xra a ; en campo
call output ; de direcciones
lda hor ; cargar hora anterior en acumulador
may24: call hm ; modificar hora
cpi 24h ; comparar con 24
jnc may24 ; si mayor o igual modificar hora
sta hor ; si menor actualizar hora
lxi h,msj_m ; presentar mensaje Minu
xra a ; en campo
call output ; de direcciones
lda min ; cargar minuto anterior en acumulador
may60: call hm ; modificar minuto
cpi 60h ; comparar con 60
jnc may60 ; si mayor o igual modificar minutos
sta min ; si menor actualizar minutos
xra a ; empezar en cero segundos
sta seg
mvi a,10h ; se suprime efecto del rebote
sim ; Eliminando interrupciones pendientes
pop h ; recuperar registros
pop d
pop b
pop psw
ei
ret
;***************************************************************************
; Modifica horas/minutos
;***************************************************************************
hm: sta seg
call upddt ; presentar Hora/Minuto en campo de datos
noend: call rdkbd ; leer teclado
cpi 0ah ; determinar si valor es decimal
jc form_2d ; si es decimal: dar formato de dos dígitos
cpi 10h ; no es decimal, comparar con tecla <END>
jz listo ; es <END>, cargar valor en campo de datos en A
jmp noend ; no es <END>, leer teclado
form_2d: mov b,a ; en registro B última entrada desde teclado
lda seg ; al acumulador valor anterior de hor/min
add a ; desplazar 4 bits a la izquierda
add a
add a
add a
ora b ; combinar con última entrada desde teclado
jmp hm ; próximo dígito
listo: lda seg ; retornar con nuevo valor de Hora/Minuto en A
Técnicas de gestión de Entrada y Salida 468

ret
;***************************************************************************
; Rutina de retardo de 1 segundo
;***************************************************************************
ret1s: push b
push d
push psw
mvi b,3
ret2: lxi d,09aeah
ret1: dcx d
mov a,e
ora d
jnz ret1
dcr b
jnz ret2
pop psw
pop d
pop b
ret
;***************************************************************************
; Mensajes
;***************************************************************************
msj_h: db 10 ;A
db 25 ;r
db 27 ;o
db 16 ;H

msj_m: db 28 ;u
db 26 ;n
db 29 ;i
db 24 ;M
;***************************************************************************
; Vector de interrupción RST7.5
;***************************************************************************
org 0ffb1h
jmp pon_hm ; salto a rutina de servicio

El programa anterior fue simulado usando el 8085 Virtual Kit y funcionó co-
mo se esperaba. Otra solución para el ejemplo del reloj es usar una base de tiempo
externa. La señal maestra puede también derivarse de la red de 60 Hz como ilustra el
circuito de la figura 8.31 y se aplica a la entrada de interrupción RST6.5. El circuito
no está aislado de la línea de potencia. La onda seno es rectificada y aplicada a un
disparador de Schmitt obteniéndose una señal de variación rápida, frecuencia 60 Hz y
nivel TTL. El código para ésta versión del reloj fue escrito para el microcomputador
real MPR-85 PLUS, debido a las dificultades presentes para la simulación. Este µC es
una tarjeta de desarrollo de bajo costo pero de gran utilidad. Las rutinas de usuario se
ejecutan usando la secuencia de código:

mvi a,n ; n es el número de la rutina de monitor


rst 7
Técnicas de gestión de Entrada y Salida 469

Fig.8.30. El SDA 85 ejecutando el programa de reloj digital.


Técnicas de gestión de Entrada y Salida 470

Fig.8.31. La salida del circuito se aplica a las entradas RST 6.5 y SID del 8085A.

Para escribir el programa de reloj para el MPR-85 PLUS se usan las rutinas de
usuario mostradas en la tabla 8.5.

Tabla.8.5.Rutinas de monitor del MPR-85 PLUS.


Rutina Descripción
Presenta en pantalla el caracter cuyo código de 7-
segmentos esté cargado en el registro C. El número del
9 indicador donde se presentará el carácter lo indica el
valor en el registro B.

L0 L1 L2 L3 L4 L5
El contenido del registro par HL o L se presenta en pan-
talla.

C=(00)ÆL en campo de datos.


10 C=(10)ÆL en campo de datos con punto decimal

C=(01)ÆHL en campo de direcciones.


C=(11)ÆHL en campo de direcciones con punto decimal

Espera la pulsación de una tecla y retorna en el A la


12
posición de la tecla.

Debido a que la entrada RST 6.5 es sensible a nivel, la subrutina de servicio


espera que el pulso de solicitud conmute a nivel bajo antes de habilitar las interrup-
ciones y retornar desde la rutina de servicio a esta entrada. Esto se logra examinando
la entrada SID por medio de la instrucción RIM. Se usan 4 posiciones consecutivas
de memoria como contadores:

RED 1/60
SEG segundos
MIN minutos
HOR horas
Técnicas de gestión de Entrada y Salida 471

Cada vez que se ejecuta la subrutina de la interrupción RST6.5 se incrementa


el primer contador (RED) y este se usa para dividir la frecuencia de la red por 60, de
modo que cuando RED llegue 60 se incremente en 1 el contador de segundos (SEG),
iniciándose la cuenta.

La interrupciones generan un salto al área de memoria 4000H-40FFH, la cual


está reservada por el programa monitor El vector de RST6.5 (0034H) contiene un
salto a la RAM: 4004H., aquí se inserta un salto a la rutina de servicio medir. El vec-
tor de RST7.5 (003CH) provee un salto a la dirección de memoria RAM: 4006H,
desde donde se transfiere el control del programa a salto a la rutina de servicio
pon_hm.

El programa se carga en la RAM de usuario a partir de la dirección 6002H.


Para simplificar el código se escribe una rutina escrb_cad, la cual presenta en pantalla
la cadena de caracteres apuntada por el registro par HL: si B = (00), en el campo de
direcciones y si B = (01), en el campo de datos. El listado de la rutina se muestra a
continuación:

;--------------------------------------------
; Rutina ESCRB_CAD
;--------------------------------------------

escrb_cad: push b
push d
push psw
mov a,b
ani 1
jnz camp_dat
mvi b,0
mvi d,4
jmp escr
camp_dat: mvi b,4
mvi d,6
escr: mov c,m
mvi a,9
rst 7
inx h
inr b
mov a,b
cmp d
jnz escr
pop psw
pop d
pop b
ret

Del manual de usuario del MPR-85 se extrajeron los códigos de los caracteres
a presentar, estos son:

A 77H H 76H I 13H M 37H


n 54H O 3FH r 50H U 3EH
Técnicas de gestión de Entrada y Salida 472

El programa del reloj digital es el siguiente:


;*************************************************************************
; Programa reloj digital para MPR-85 PLUS
;*************************************************************************
flecha equ ; Tecla (↓)
¿A equ 77h ; Letra A
H equ 76h ; Letra H
I equ 13h ; Letra I
M equ 37h ; Letra M
n equ 54h ; Letra n
0 equ 3fH ; Letra O (cero)
r equ 50h ; Letra r
U equ 3eh ; Letra U
;*************************************************************************
; Vectores de interrupción
;*************************************************************************
org 4004 h
jmp medir ; salto a rutina de servicio para medir tiempo
org 4006 h
jmp pon_hm ; A rutina de servicio RST7.5 para ajustar hor/min
;*************************************************************************
;*************************************************************************
; Programa principal
;*************************************************************************
org 6002h
inicio: lxi sp,6500h
mvi a,8 ; Se desenmascaran las interrupciones
sim
ei ; Se habilitan las interrupciones
phm: lhld seg ; A registro L contador de segundos
mvi c,0 ; Se presentan segundos en campo de datos
mvi a,0ah
rst 7
lhld min ; cargar en minutos en L y horas en H
mvi c,1 ; Presentar en campo de direcciones
mvi a,0ah
rst 7
jmp inicio ; Presentar hh:mm:ss
;*************************************************************************

;*************************************************************************
; Rutina de servicio RST6.5
;*************************************************************************
medir: push h ; Salvar registros
push d
push b
push psw
mvi b,3 ; Se repite el mismo lazo para red, seg y min
lxi h,red ; Apuntar a contador red
seguir: mov a,m ; Cargar en A: red/seg/min
inr a ; Incrementar contador
daa ; Cuenta en decimal
mov m,a ; Actualizar: red, seg, min
cpi 60h ; Comparar con 60
Técnicas de gestión de Entrada y Salida 473

jc sal ; Si menor presentar hh:mm:ss


mvi m,0 ; Si llego a 60, cargar 0 en: red/seg/min
inx h ; Apuntar contador siguiente
dcr b ; Decrementar contador de lazo
jnz seguir ; No es cero, seguir con:seg/min
mov a,m ; Es cero, al A contador de horas
inr a ; incrementar hora
daa ; Cuenta en decimal
mov m,a ; Actualizar hora
cpi 24h ; Comparar con 24
jc sal ; Si menor presentar hh:mm:ss
mvi m,0 ; Si es 60, cargar cero en hora
sal: rim ; Esperar que RST6.5 sea cero
ana a ; habilitar interrupciones
jm sal
pop psw ; Recuperar registros
pop b
pop d
pop h
ei ; Habilitar interrupciones
ret ; Retornar
;***************************************************************************
; Los contadores se inician en cero

red: db 0 ; Contador 1/60


seg: db 0 ; Contador de segundos
min: db 0 ; Contador de minutos
hor: db 0 ; Contador de horas
temp: ds 1 ; Almacén temporal
;*************************************************************************
; Rutina de servicio RST7.5
;*************************************************************************
pon_hm: push psw ; Salvar registros
push b
push d
push h
mvi a,0eh ; Se enmascaran las interrupciones
sim
lxi h,msj_h ; Apuntar a mensaje HorA
mvi b,0 ; Se usará campo de direcciones
call escrb_cad ; Imprimir mensaje HorA
lda hor ; Contador hor al acumulador
may24: call hm ; Modificar hora
cpi 24h ; Comparar hora con 24
jnc may24 ; Es mayor, modificar hora
sta hor ; Es menor, actualizar hora
lxi h,msj_m ; Apuntar a mensaje MinU
mvi b,0 ; Se usará campo de direcciones
call escrb_cad ; Imprimir mensaje MinU
lda min ; Contador min al acumulador
may60: call hm ; Modificar minutos
cpi 60h ; comparar con 60
jnc may60 ; Es mayor, modificar minutos
sta min ; Es menor, actualizar minutos
xra a ; Acumulador a cero
Técnicas de gestión de Entrada y Salida 474

sta red ; Contadores red y seg a cero


sta seg
pop h ; Recuperar registros
pop d
pop b
pop psw
ei ; Habilitar interrupciones
ret
hm: push h ; Salvar registros
push b
push d
otro: sta temp ; Salvar hor/min
mvi c,0 ; Se presentar hor/min
mvi a,0ah ; en campo de
rst 7 ; datos
esper: mvi a,12 ; Esperar tecla
rst 7
cpi 0ah ; Comparar con diez
jc men_diez ; Es un dígito decimal
cpi flecha ; Es mayor que 9, comparar con flecha
jz es_flecha ; Es flecha, listo
jmp esper ; No es flecha, ni dígito decimal, leer teclado
men_diez: mov b,a ; Preservar ultimo dígito decimal
lda temp ; Cargar en A hor/min anterior
add a ; Suprimir dígito de más peso
add a
add a
add a
ora b ; Insertar nuevo dígito decimal
jmp otro ; Siguiente valor
es_flecha: lda temp ; Nueva hor/min al acumulador
pop d ; Recuperar registros
pop b
pop h
ret ; Retornar con nueva hor/min en el A
;**************************************************************************
; Mensajes
;**************************************************************************
msj_h: db ?H,o,r,?A
msj_m: db ?M,i,n,u
;*************************************************************************

En esta sección se han mostrados las ventajas de la técnica de interrupciones


para gestión de entrada y salida. El procesador responde en forma rápida a las solici-
tudes. Se gasta menos tiempo en examinar bits de estados y puede eliminar la necesi-
dad de rutinas de retardo. La desventaja principal de las interrupciones es que al ser
un evento de naturaleza asincrónica no se puede precisar el momento cuando ocu-
rren, lo cual hace que los programas de las aplicaciones sean difíciles de depurar. Las
rutinas de servicio de interrupción deben tener código extra para asegurar la preser-
vación de los registros y banderas de estado con independencia del momento que
ocurra la interrupción. Puede ser complicado establecer cuando una determinada in-
terrupción debe estar habilitada. Si la velocidad de transferencia es muy alta, el uso
Técnicas de gestión de Entrada y Salida 475

de interrupciones puede ser ineficiente o imposible de realizar. Finalmente, en algu-


nos casos puede requerirse circuitos adicionales para el control de las interrupciones.

8.2.2 El controlador de interrupciones 8259A

En aplicaciones complejas que requieran el uso de un número de entradas de


interrupciones superior a las del procesador, puede usarse un circuito LSI controlador
de interrupciones 8259A, el cual se encarga de administrar hasta ocho líneas de soli-
citudes de interrupción e informar al procesador, aplicando su salida INT a la entrada
INTR del µP, cuando un periférico necesita servicio. Es posible conectar varios
8259A en cascada para aumentar el número de fuentes de interrupción hasta 64. Las
cuatro funciones más relevantes del controlador son:

• Recibe solicitudes de interrupción de 8 fuentes.


• Asigna las prioridades y controla la cola de solicitudes simultáneas.
• Pone la máscara a interrupciones por solicitud del programa.
• Genera una señal de interrupción aplicada a la entrada INTR y cuando la salida INTA del
µP se activa, coloca sobre el bus de datos una instrucción CALL dirección, con la dirección
programada por el usuario.

Hasta los PC diseñados con microprocesadores 80486, el sistema incluía al


menos dos 8259A en cascada para controlar la única entrada de interrupción INTR
del procesador. La otra entrada de interrupción NMI es similar a TRAP. A partir del
Pentium se incorporó dentro del chip un controlador local de interrupciones APIC
(Advanced Programmable Interrupt Controller) compatible con el 8259A. La figura
8.32 muestra el diagrama funcional y la distribución de terminales del 8259A.

Fig.8.32. El controlador de interrupciones 8259A.


Técnicas de gestión de Entrada y Salida 476

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8259A


VCC +5V
GND Tierra
Un nivel bajo en este terminal permite la comunicación entre el µP y el 8259A.
CS
WR Cuando CS está activo, un cero en esta entrada autoriza al 8259A para aceptar comandos desde el
µP.

RD Cuando CS está activo, un cero en esta entrada habilita al 8259A para colocar información de estado
en el bus de datos del sistema.
D0-D7 Es el bus de datos bidireccional por medio del cual se transfieren comandos, información de estados y
los vectores de interrupción.
Líneas de cascada que permiten controlar una estructura multinivel de 8259s. Son salidas para el
CAS0-CAS2 dispositivo maestro y entradas para los esclavos.
Terminal con doble función. Cuando se usa en sistemas grandes que requieren el uso de buffers en el
SP/ EN bus de datos, puede ser usado como salida EN para habilitar los buffers. Cuando se usa el modo sin
buffers es una entrada SP de identificación de maestro ( SP =1) o de esclavo ( SP =0).
Salida usada para interrumpir al µP. Se activa a nivel alto cuando se realiza una solicitud válida de
INT interrupción. Debe conectarse a la entrada de interrupción del CPU.
Son líneas de solicitudes de interrupción. En el modo de disparo por flanco, se conmuta la entrada de
IR0-IR7 cero a uno y se mantiene en uno hasta cuando se reconozca la solicitud. En el modo de disparo por
nivel sólo se requiere mantener un nivel alto en la línea IR.
Entrada de reconocimiento de interrupción. Habilita al 8259ª para cargar en el bus de datos el vector de
INTA
interrupción por medio de una secuencia de pulsos INTA suministrados por el µP.
A0
En conjunto con las entradas CS , WR y RD conforman un código que permite al µP escribir
comandos y leer información de estado de los registros del controlador. Usualmente se conecta a la
salida A0 del 8085A.

Interconexión con el sistema 8085A.

El 8259A se conecta fácilmente a un sistema 8085A como ilustra la figura


8.33. El controlador se conecta al puerto 40H y la entrada SP/ EN se lleva a nivel alto
para indicar que el dispositivo es un maestro.

Los pasos de la secuencia de interrupción son los siguientes:

• Uno o varias de las líneas IR0-7 conmutan a nivel alto, activando el bit correspondiente
en el registro de solicitud de interrupción IRR (Interrupt Request Register). Este re-
gistro almacena todos los niveles de interrupción que han solicitado servicio.

• Si es procedente el 8259A genera una señal activa en alto en la salida INT para inte-
rrumpir al µP.

• El CPU reconoce la solicitud y activa la salida INTA .

• Al recibir el pulso INTA , el bit de más alta prioridad del registro ISR (In Service Re-
gister) es puesto. El ISR almacena todos los niveles de interrupción que están siendo
atendidos. Simultáneamente el bit correspondiente del IRR es llevado a cero. Tam-
bién, el 8259A carga en el bus de datos el código de una instrucción CALL dirección.

• La instrucción CALL libera dos pulsos INTA adicionales, el primero de los cuales
causa que el controlador coloque en el bus de datos el byte menos significativo de la
Técnicas de gestión de Entrada y Salida 477

dirección preprogramada de la rutina de servicio de interrupción. El segundo INTA


permite la carga de los ocho bits de orden alto de la dirección de la RSI.

• Con esto se completa la carga de los tres bytes de la instrucción CALL dirección. Si el
controlador funciona en el modo de fin automático de interrupción (AEOI), el bit ISR
es cargado con cero al final del tercer pulso INTA . En caso contrario, el bit del ISR
permanecerá en uno hasta cuando un comando EOI sea ejecutado al final de la se-
cuencia de interrupción.

Fig.8.33. Interconexión de un controlador de interrupciones 8259A con el µP 8085A.

Direcciones de las rutinas de servicio

El 8259A suministra la dirección de la rutina de servicio sincronizados por los


pulsos INTA generados por el µP, como se expone a continuación:

• Primer pulso INTA :

El código de operación CDH de la instrucción CALL dirección es cargado sobre el bus de


datos. El contenido de AD0-7 será el siguiente.

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0


1 1 0 0 1 1 0 1

Fig.8.34. Primer byte del vector de interrupción.


Técnicas de gestión de Entrada y Salida 478

• Segundo pulso INTA :

Durante este evento se coloca en el bus de datos los ocho bits de menos peso de la rutina
de servicio. Los ocho niveles de interrupción generarán CALLs a 8 posiciones de memoria
igualmente espaciadas.

Fig.8.35. Segundo byte del vector de interrupción

El número de bytes de espaciamiento entre los vectores de interrupción puede ser selec-
cionado por programa entre 4 u 8.

Si el intervalo seleccionado es de 4, los bits de dirección A5-A7 son programados por el


usuario mientras que A0-A4 son insertados por el controlador. Cuando el intervalo es 8,
A6-A7 son programados por el usuario mientras que A0-A5 son implantados por el 8259A.
La figura 8.40 muestra los bits a programar del byte bajo de la dirección de la RSI, De
acuerdo con el intervalo seleccionado.

• Tercer pulso INTA :

El byte de orden alto de la dirección de la RSI se carga en el bus de datos. Este byte es
programado previamente por el usuario en la secuencia de inicio.

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0


A15 A14 A13 A12 A11 A10 A9 A8

Fig.8.36 Tercer byte del vector de interrupción.

El diagrama de tiempos de la secuencia de INTA se muestra en la figura 8.37.

Varios controladores 8259A pueden conectarse en cascada para aumentar el


número de fuentes de interrupción. Con nueve chips se arma una estructura de 64
Técnicas de gestión de Entrada y Salida 479

fuentes de interrupción. En este caso la salida INT del maestro se conecta a la entrada
INTR del µP y las salidas INT de cada esclavo se aplican a entradas IR específicas
del maestro. De este modo cualquier petición de interrupción proveniente desde un
esclavo es primero notificada al maestro, el cual se encarga de iniciar la secuencia de
interrupción. Si los 8259s están correctamente programados, durante el primer pulso
el maestro debe colocar el código de operación la instrucción CALL en el bus de da-
tos y depositar en las líneas C0-C2 la identificación del esclavo que realizó la solicitud
de interrupción. El control es tomado entonces por el esclavo, el cual se encarga de
cargar en el bus de datos el vector de interrupción correspondiente.

Fig.8.37 La señal INTA sincroniza la carga sobre el bus de datos de la instrucción CALL dir

Programación del 8259A

Al contrario de otros dispositivos LSI de E/S, el 8259A debe ser programado


antes de ser utilizado. Esto se logra usando las palabras de órdenes de inicio ICWs
(Initialization Command Words), las cuales consisten de una secuencia de 2 a 4 bytes
que se cargan en el dispositivo bajo la sincronización de WR . Una vez inicializado
por las ICWS, el 8259A entra, por defecto, en operación en un modo denominado
completamente jerarquizado en el cual se asigna la mayor prioridad a la entrada IR0 y
menor prioridad a IR7. Este esquema de prioridades alcanza a los chips conectados en
cascada.

Un nuevo modo de operación puede asignarse al controlador en funciona-


miento por medio de las palabras de órdenes de operación OCWs (Operacional
Command Words). Estos modos son:

1. Modo completamente jerarquizado:

A IR0 se la asigna la mayor prioridad y a IR7, la menor.


Técnicas de gestión de Entrada y Salida 480

2. Modo con prioridad igual rotante:

Todos los dispositivos tienen la misma prioridad, a la interrupción en ejecución se le asig-


na la menor prioridad una vez culminada la ejecución de su RSI.

3. Modo con prioridad especificada rotante:

La prioridad puede ser asignada una vez ejecutada la RSI.


4. Modo básico de máscara:

Cualquiera de las ocho entradas IR pueden ser enmascaradas.

5. Modo especial de máscara:

Permite que una interrupción de prioridad más baja interrumpa una interrupción de una
prioridad más alta

6. Modo de consulta:

En este modo la línea de salida INT no se utiliza. En lugar un puerto de estado que puede
ser consultado proporciona a una indicación de cual interrupción ha ocurrido.

Palabras de órdenes de inicio

En la figura 8.39 se presentan los formatos de las cuatro palabras de órde-


nes de inicio. Las dos primeras ICW1 – ICW2 son obligatorias mientras que las otras
son opcionales.

Palabras ICW1 e ICW2

Cuando una orden es dada al controlador con A0 igual cero y D4 en uno, como
ilustra la figura 8.38, se interpreta como ICW1, la cual arranca la secuencia de inicio.

Fig.8.38 Formato de ICW1 e ICW2.


Técnicas de gestión de Entrada y Salida 481

Fig.8.39 Formatos de palabra de los comandos de inicialización.


Técnicas de gestión de Entrada y Salida 482

El bit ADI selecciona el espaciamiento entre las instrucciones CALL genera-


das por cada solicitud de interrupción. Un valor de 1 selecciona un intervalo de cuatro
posiciones de memoria y un valor 0 de ocho localizaciones. Los bits A5-7 fijan el va-
lor del byte bajo del vector de interrupción según indica la tabla de la figura 8.35. El
byte alto de la dirección de salto A8-15 es programado por el usuario por medio de
ICW2, la cual se aplica con A0 igual a 1. LTIM en 1 deshabilita la lógica de detección
de flanco y las entradas IR serán disparadas por nivel. Si SNGL está en 1, existe un
solo 8259A y no será necesario programar la palabra de inicio ICW3, la cual define el
modo de cascada cuando SNLG es 0. El bit IC4 de ICW1 se pone a 0 cuando no es
necesario usar ICW4, en caso contrario debe ir a 1.

Ejemplo:
ICW1 = 16H = 00010110
ICW2 = 10H = 00010000

Vectores de interrupción a partir de 1000H (IR0).


Disparo por flanco.
Intervalo de 4.
Un solo chip
Sin ICW4.

Después de programar esta secuencia, el 8259A puede ser usado en una estructura de un con-
trolador operando en el modo completamente jerarquizado.

Palabra ICW3

Es aceptada cuando existe más de un controlador en la estructura de interrup-


ción, lo cual significa que fue programado en el modo cascada (ICW1, SNGL es 0).
La función de los bits de ICW3 varía si el controlador a programar es el maestro o un
esclavo.

Si el dispositivo es un maestro, porque el terminal SP / EN es llevado a uno o


en el modo con acoplador cuando M/S = 1 en ICW4, los bits S0-7 permiten indicar
cuales entradas IR del maestro tiene salidas INT de esclavos conectadas a éstas. Si un
esclavo se conecta a la entrada IR5, entonces el bit S5 debe ser puesto a 1. Si el dispo-
sitivo es un esclavo, porque el terminal SP / EN es llevado a 0 en el modo con aco-
plador cuando M/S = 0 en ICW4, los bits ID0-2 identifican al esclavo. Para el ejemplo
anterior, ID2 = 1, ID1 = 0, ID0 = 1 para establecer que este esclavo está conectado a la
entrada IR5 del maestro.

Palabra ICW4

Procede si el bit IC4 de ICW1 fue programado como 1. Esta palabra permite
seleccionar varios modos de operación. La función de los bits son las siguientes:
Técnicas de gestión de Entrada y Salida 483

µPM: Es puesto a 0 para uso en sistemas 80/85. En 1 selecciona el modo MCS-86-88.

AEOI: Cuando está en 1 selecciona el modo de fin automático de interrupción. Cuando es


puesto a 0, un comando EOI (End Of Interrupt) debe ejecutarse al final de la RSI.
Estos son comandos aplicados con palabras OWCs para notificar al 8259A la cul-
minación de la rutina de servicio de interrupción.

M/S: Se usa en conjunto con el modo con acoplador. Este modo se utiliza en sistemas
grandes donde se requiere acopladores bidireccionales para el bus de datos. En
ese caso el terminal SP / EN se usa para habilitar los acopladores y M/S se usa
para establecer cuando el controlador es un maestro o un esclavo. Cuando M/S es
1, el 8259A opera como maestro y como esclavo cuando M/S es 0. Si no se pro-
grama el modo con acoplador, el estado de este bit no es considerado.

BUF: Si este bit es puesto a 1 se programa el modo con acoplador y el terminal


SP / EN se usa para habilitar los acopladores bidireccionales. Si por el contrario,
BUF es puesto a 0 no se selecciona el modo con acoplador y SP / EN establece si
el dispositivo opera como maestro o esclavo. En el caso que no se use ICW4 tam-
bién SP / EN define operación como maestro o esclavo.

SFNM: Permite tener una verdadera estructura completamente jerarquizada entre las en-
tradas IR de los esclavos cuando se opera en cascada. Si este bit es 1 se selecciona
un modo especial completamente jerarquizado, si es 0 este modo no es selecciona-
do. Sólo el maestro deberá ser programado en este modo. La necesidad de este
modo especial se debe a que si un esclavo recibe una interrupción de mayor priori-
dad que aquella que está siendo atendida (generada a través del mismo esclavo),
está no será reconocida por el maestro. Esto se debe a que el bit ISR de la interrup-
ción servida está en 1, ignorándose toda solicitud de igual o mayor prioridad. De
modo que la petición de mayor prioridad no será atendida hasta que el bit ISR res-
pectivo sea puesto a cero por un comando EOI ejecutado al final de la RSI de me-
nor prioridad. Usando el modo especial completamente jerarquizado el maestro so-
lo ignorará solicitudes de menor prioridad que la que esté en servicio y responderá
a solicitudes de igual o mayor prioridad. Así, si un esclavo recibe una solicitud de
mayor prioridad que la atendida, esta será procesada.

Palabras de órdenes de operación

Luego que el 8259A es iniciado por la secuencia de ICWs, estará listo para
operación en el modo completamente jerarquizado. En cualquier momento este modo
puede ser cambiado por medio de tres OCWs. La figura 8.40 muestra los formatos de
las palabras OCWs disponibles.

Palabra OCW1

Se usa para activar/desactivar los bits de máscaras del registro de máscara de


interrupción IMR. Los bits Mi de OCW1 se usan para controlar la máscara de las en-
tradas IR. Si Mi es 1, la entrada IR correspondiente es deshabilitada. Si Mi es cero el
canal IRi es habilitada.
Técnicas de gestión de Entrada y Salida 484

Fig.8.40 Formatos de palabra de los comandos de operación.


Técnicas de gestión de Entrada y Salida 485

Fig.8.41 Formato de OCW1.

Palabra OCW2
Permitir definir por medio de los bits R, SL y EOI las operaciones de fin e in-
terrupción, rotación automática y rotación específica. Comandos asociados y las mo-
dalidades de estas operaciones (exceptuando ICW4, AEOI) se seleccionan usando una
combinación de los bits de OCW2.

Fig.8.42 Formato de OCW2.

La definición de los bits de OCW2 son las siguientes:

L0-L2: Especifican, cuando el bit SL está en 1, el nivel de interrupción (0-7) para la opera-
ción seleccionada por R, SL y EOI,.

EOI: Se usa para toda orden de final de interrupción (excepto el modo AEOI). Cuando
está en 1, una forma del comando de fin de interrupción será ejecutado dependien-
do del estado de R y SL. Si EOI es 0, no se ejecutará una orden de fin de interrup-
ción.

SL: Especifica un nivel de interrupción para una operación determinada. Cuando es 1,


los bits L0-2 son habilitados y la operación seleccionada por los bits EOI y R será
ejecutada sobre el nivel de interrupción indicado. Cuando SL es 0, los bits L0-2 son
deshabilitados.

R: Controla las operaciones de rotación del 8259A. Si R está en 1, una forma de rota-
ción de prioridad será ejecutada dependiendo del estado de los bits SL y EOI. Si R
es cero no se ejecuta la rotación.

Palabra OCW3

Es usada para determinar el estado del proceso de interrupción y para selec-


cionar el modo especial de enmascaramiento. La función de cada bit de OWC3 se
indica a continuación:

Fig.8.43 Formato de OCW3.


Técnicas de gestión de Entrada y Salida 486

RIS: Se usa para especificar el registro comando a leer entre el ISR (cuando RIS está en
1) y el IRR (cuando RIS es 0). El estado del bit RIS se considera si el bit RR es 1.

RR: Cuando es puesto a 1 indica que el registro comando indicado por el bit RIS se va a
leer. Si es 0, no se leerá el registro comando.

P: Un nivel 1 en este bit ejecuta un comando de consulta. En el modo de consulta el


CPU deshabilita su entrada de interrupción. El servicio al dispositivo es realizado
por programa por medio de un comando de consulta, en el cual se habilita al si-
guiente pulso de RD (por medio de una instrucción IN puerto) para leer el valor
BCD de la solicitud de mayor prioridad y poner a 1 el bit ISR correspondiente. Pa-
ra operar en el modo de consulta una palabra OCW3 deberá ser escrita previo a ca-
da lectura

SMM: Se usa para habilitar el modo especial de máscara. Si SMM está en 1, selecciona el
modo especial de máscara, si está en 0 no lo selecciona. El estado de SMM sólo se
considera si el bit ESMM está en 1.

ESMM: Habilita (cuando está en 1) o deshabilita (cuando es 0) al bit EMM.

Para completar la presentación del modo de programación se describen algu-


nos modos asociados con las OWCs.

Modo completamente jerarquizado

Este es el modo de operación en el cual entra por defecto el 8259A después de


la secuencia de inicio programada usando las ICWs. Las prioridades de las ocho en-
tradas IR son asignadas desde la más alta a IR0 hasta la más baja a IR7. Cuando una
interrupción es reconocida, la solicitud de mayor prioridad es determinada desde el
IRR y su rutina de servicio es ejecutada. Además, el bit correspondiente del registro
ISR es activado para señalar la rutina en servicio. Este bit permanecerá activado hasta
cuando un comando EOI de fin de interrupción sea ejecutado. Mientras el bit del ISR
esté habilitado, solicitudes de servicio de igual o menor prioridad no serán atendidas.
Una petición de mayor prioridad generará una interrupción y la ejecución de la rutina
de servicio asociada si se ha ejecutado una instrucción EI en la RSI que estaba siendo
procesada antes de ocurrir la interrupción de mayor prioridad.

Considere que en el modo totalmente jerarquizado ocurre una interrupción en


la entrada IR5 durante la ejecución del programa principal. Si las interrupciones están
habilitadas se ejecutará la rutina de servicio RSI5. Durante la ejecución de RSI5 se
produce una solicitud en la entrada IR4 y se mantiene hasta ser reconocida. Como IR4
tiene mayor prioridad que IR5, generará una interrupción en la línea INTR, la cual
será reconocida después de la ejecución de EI en la rutina RSI5.

Cuando la solicitud en IR5 es reconocida, el bit ISR5 es activado. Al recono-


cerse la petición en IR4 se activara además ISR4, debido a que ninguna de las dos ruti-
nas de servicio se ha completado. Un comando EOI al final de RSI4 deberá desactivar
el bit ISR4 para notificar al controlador que la rutina servida ha culminado. La ins-
Técnicas de gestión de Entrada y Salida 487

trucción final RET en RSI4 transfiere el control del programa a la rutina RSI5. En
este momento el único bit del registro ISR que permanece activado es el ISR4, el cual
será desactivado por el comando EOI al final de RSI5, cuya instrucción RET retornará
el programa al programa principal. Esta forma de operación indica que en el modo
totalmente jerárquico, el más reciente nivel reconocido y atendido siempre es el de
mayor prioridad.

Fin de interrupción

Al completarse una RSI, el 8259A debe ser notificado para que actualice el re-
gistro ISR. Esto se realiza con un seguimiento de cuales niveles de interrupción están
en proceso y su prioridad relativa. Existen tres tipos de comandos EOI:
1. Comando EOI no especifico.
2. Comando EOI especifico.
3. Modo EOI automático.
Comando EOI no especifico:

Con este comando el programa indica al 8259A cuando la rutina de servicio


ha culminado sin especificar el nivel de de la interrupción. El controlador deberá de-
terminar el nivel de la interrupción y desactivará el bit ISR correspondiente. El co-
mando EOI no específico sólo debe ser usado cuando el último nivel reconocido y
servido sea el de mayor prioridad. Cuando el 8259A recibe este comando desactiva
el bit ISR de mayor prioridad para indicar la finalización de la rutina de mayor priori-
dad entre las que están siendo atendidas. De modo que si se opera en el modo total-
mente jerárquico el comando EOI no específico puede ser utilizado.
Ejemplo:
OCW2 = 20H = 0 0 1 0 0 0 0 0

Comando EOI especifico:

Contrario al anterior, este comando notifica cuando la RSI de un nivel deter-


minado ha culminado. Es decir, este comando indica el bit del registro ISR que debe
ser desactivado. Esta orden se usa en situaciones cuando el controlador no puede
determinar el bit ISR que debe ser borrado. Por ejemplo, si la rutina RSI en ejecución
cambia las prioridades de los niveles de interrupción y existen otras RSI atendidas, un
EOI no específico puede desactivar el bit ISR incorrecto.

Ejemplo:
OCW2 = 3xH = 0 0 1 1 0 L2 L1 L0
Técnicas de gestión de Entrada y Salida 488

Modo EOI automático:

Cuando AEOI e 1 en ICW4, se operará en el modo AEOI. La programación de


este modo elimina la necesidad de que el programa notifique la culminación de la
rutina servida. En su lugar el controlador ejecuta un comando EOI no específico en el
flanco de subida del tercer pulso de la señal INTA (modo 80/85). Este comando sólo
debe usarse cuando no se requiere una estructura multinivel jerarquizada. Considere
que el bit ISR de la rutina en servicio es desactivado inmediatamente después de su
reconocimiento de modo que no que da indicación en el ISR de cual RSI está en eje-
cución. Si en este momento ocurre una interrupción, está será atendida independien-
temente de su prioridad.

Rotación automática-Prioridad igual:

Este modo es útil en aplicaciones donde los periféricos atendidos tienen la


igual prioridad. Después que un dispositivo es atendido, no se le dará servicio de
nuevo hasta cuando, en el peor caso, al resto de igual prioridad, hayan sido asistidos.
Esto se logra asignándole la menor prioridad al último periférico atendido. Existen
dos formas de rotación automático de acuerdo con su combinación con el comando
EOI, estas son: Rotar en comando EOI no específico y Rotar en modo EOI automáti-
co.

Rotar en comando EOI no específico:

Cuando este modo es programado el bit ISR de más prioridad es desactivado, como
lo hace un comando EOI no especifico, y al nivel IR se le asigna la menor prioridad.
Las prioridades de los otros IR son rotadas para ajustarse al modo completamente
jerarquizado con base en la prioridad más baja que fue asignada. Si están en servicio
las rutinas RSI5 (prioridad 5) y RS3 (prioridad 3) y en RS3 se ejecuta un comando ro-
tar en EOI no especifico entonces el bit ISR3 es desactivado y a IR3 se le asigna la
prioridad más baja quedando ISR4 como el nivel de mayor prioridad.

Rotar en modo EOI automático:

Es similar al anterior, con la diferencia que la rotación de prioridad se realiza


de manera automática pasado el tercer pulso de INTA (modo 80/85) de una secuen-
cia de interrupción. Se puede entrar en este modo fijando en la palabra OCW2 los bits
R SL EOI = 1 0 0 y salir del modo con R SL EOI = 01 0 0.

Rotación específica (Prioridad específica)

El programa puede modificar las prioridades asignando la más baja. Las res-
tantes se asignarán automáticamente: si IRi es la de menor prioridad, entonces IRi+1
será la de mayor prioridad. El comando poner prioridad se programa usando OCW2
por medio de los bits R SL EOI sobre el nivel indicado por L2 L1 L0.
Técnicas de gestión de Entrada y Salida 489

Ejemplo:

OCW2 = 6xH = 0 1 1 0 0 L2 L1 L0

Esta horma es independiente del comando EOI también seleccionado por


OCW2. Si se desea modificar loa prioridad durante un comando EOI se puede usar el
comando rotar en comando EOI específico:

Ejemplo:

OCW2 = 7xH = 0 1 1 1 0 L2 L1 L0

Ejemplo 8.7

Escribir el código de inicio y la tabla de saltos (inicio en 1000H) de una es-


tructura con un controlador 8259A para ocho niveles de interrupción. El sistema se
interconecta como muestra la figura 8.33. Deben usarse las palabras ICW1, ICW2 y
OCW2.

;----------------------------------------------------------------------------------------------------------------
; Ejemplo 8.7
;----------------------------------------------------------------------------------------------------------------
p8259_A0_0 equ 40H ; puerto del 8259A con A0=0
p8259_A0_1 equ 41H ; puerto del 8259A con A0=1
icw1 equ 16h ; palabra de orden de inicio
; ICW1: A7,A6,A5=0; disparo por flanco;
; intervalo de 4, un solo chip y sin ICW4
icw2 equ 10h ; ICW2: A15-A8=10H. Dirección IR0=1000H
ocw2 equ 20h ; Comando EOI no especifico
;----------------------------------------------------------------------------------------------------------------
; Programa principal
;----------------------------------------------------------------------------------------------------------------
lxi sp,tope_pila ; pila en RWM
call inic_8259 ; programar secuencia de inicio del 8259.
; modo totalmente jerarquizado
ei
.
.
.
; continúa programa principal
.
.
.
;----------------------------------------------------------------------------------------------------------------
; Rutina de inicialización del 8259A
;----------------------------------------------------------------------------------------------------------------
inic_8259: mvi a, icw1
out p8259_A0_0 ; Escribir ICW1
mvi a, icw2
out p8259_A0_1 ; Escribir ICW2
ret
;----------------------------------------------------------------------------------------------------------------
Técnicas de gestión de Entrada y Salida 490

Fig.8.44 Cascada de 8259As.


Técnicas de gestión de Entrada y Salida 491

;----------------------------------------------------------------------------------------------------------------
; Rutina RSI0
;----------------------------------------------------------------------------------------------------------------
RSI0: push .. ; Preservar registros
push ..
.
.
.
ei ; rehabilitar interrupciones
mvi a,ocw2
out p8259_A0_0 ; Programar EOI no específico
pop .. ; Restaurar registros
pop ..
ret ; Retornar desde interrupción
;----------------------------------------------------------------------------------------------------------------

; Se escribe una rutina para cada RSI

;----------------------------------------------------------------------------------------------------------------
;Tabla de vectores de interrupción
; ---------------------------------------------------------------------------------------------------------------
org 1000h

jmp RSI0 ; salto a RSI de IR0


nop

jmp RSI1
nop

jmp RSI2
nop

jmp RSI3
nop

jmp RSI4
nop

jmp RSI5
nop

jmp RSI6
nop

jmp RSI7
nop
;----------------------------------------------------------------------------------------------------------------

El 8259A se programa para que el vector de interrupción de IR0 esté en la di-


rección 1000h y los vectores de interrupción estén espaciados 4 posiciones de memo-
ria. La tabla de saltos se inicia en 1000H y contiene un salto para cada RSI, ocupando
32 bytes de memoria. La estructura funciona por defecto en el modo completamente
jerarquizado de modo que se utiliza un EOI no específico para indicar el fin de la
Técnicas de gestión de Entrada y Salida 492

RSI. Al inicio se habilita el sistema de interrupciones y cada RSI debe habilitarlo de


nuevo.

En la figura 8.44 se presenta una estructura de interrupciones con 22 niveles.


Un maestro U1 y dos esclavos U2-3 están conectados en cascada. El terminal SP / EN
del maestro se conecta a 5 voltios y los pines SP / EN de loa esclavos se llevan a tie-
rra. La salida INT de cada esclavo se aplica a una entrada IR del maestro. Las líneas
de control de cascada CAS0-2 del maestro actúan como salidas y se conectan a los
terminales correspondientes en los esclavos, donde son entradas. La salida INT del
maestro va a la entrada de interrupción INTR del µP y cada 8259A recibe la señal
INTA .

Cada controlador debe recibir su propia secuencia de inicio. Para la programa-


ción del modo en cascada se usa la palabra ICW3 en el maestro para indicar cuales de
las líneas IR del maestro reciben solicitudes desde la salida INT de los esclavos. A los
esclavos se les debe ser identificado con el código de la entrada IR del maestro al cual
está conectada su salida INT. La única consideración que se debe tener en estructura
donde las IR del maestro no sólo reciben solicitudes de interrupción desde los escla-
vos sino que algunas IR aceptan peticiones directamente desde periféricos es que la
entrada IR0 desde el maestro no debe usarse para solicitudes desde esclavos. Esto
debido a que cuando una entrada IR sin esclavo recibe una solicitud, las líneas CAS0-2
no se activarán permaneciendo el direccionamiento por defecto para IR0 (esclavo
IR0). Si un esclavo es conectado a IR0, cuando se genere una interrupción sobre una
línea sin esclavo, pueden presentarse fallas. La programación de la rutina de inicio y
la tabla de saltos para el arreglo de la figura 8.48 se deja al lector como ejercicio.

8.3 ACCESO DIRECTO A MEMORIA


El DMA es una técnica de entrada y salida en la cual un dispositivo LSI de
propósito específico, denominado controlador de DMA, ejecuta toda la operación.
Durante una operación de acceso directo a memoria, el microprocesador cede el con-
trol de los buses al controlador, el cual transfiere los datos directamente entre el peri-
férico y el subsistema de memoria. Para que el controlador transmita bloques de datos
deberá suministrar direcciones y señales de control. Por ejemplo, la dirección de me-
moria inicial y el número de palabras ha enviar, así como el inicio y final de la opera-
ción.

El hecho que el controlador de DMA ejecuta todas las tareas de la transferen-


cia de datos sin intervención del procesador (el hardware sustituye al programa),
siendo el tiempo de acceso del circuito de memoria la única restricción para la velo-
cidad a la cual se ejecuta la operación; convierten a esta técnica en el modo más rápi-
do de ejecutar operaciones de E/S. Las operaciones de DMA no se realizan de una
sola vez, más bien el controlador sustrae ciclos de reloj al CPU hasta completar la
Técnicas de gestión de Entrada y Salida 493

transmisión. Usualmente el controlador dispone de varios canales para atender más de


un periférico.

Las tareas del controlador durante una operación de DMA son:

• Solicitar al procesador el inicio del DMA.


• Realizar el control de los buses del sistema de modo que no obstaculicen el funcionamiento
del µP.
• Indicar la ubicación y tamaño de los datos a transferir.
• Señalar el final de la operación

El método DMA más sencillo consiste en usar los ciclos de reloj cuando el µP
no realiza accesos a la memoria. Esta técnica se conoce como robo de ciclos (Cycle
stealing) y la CPU puede usar los buses del sistema sin notificar al µP. Pero esta mo-
dalidad puede requerir circuitos adicionales para detectar los estados internos durante
los cuales la CPU no accede a la memoria. Además este tipo de operaciones de DMA
son ocasionales y el tamaño de la transferencia es variable. Un modo más eficiente de
realizar DMA es solicitar al µP que ceda al controlador el control de los buses. En un
sistema 8085, esto se logra aplicando un nivel alto en la entrada HOLD. Después de
finalizar el ciclo de máquina en progreso, la CPU atenderá la solicitud poniendo en
estado de alta impedancia las líneas A8-A15, AD0-AD7, RD , WR , e IO / M y sube a
nivel alto la salida HLDA para indicar al controlador de DMA que reconoce la peti-
ción de DMA. El terminal HLDA se mantiene en alto durante toda la operación.

Fig.8.45 Controlador de DMA 8237 de INTEL.


Técnicas de gestión de Entrada y Salida 494

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8237

CLK Reloj.
CS Entrada de selección de chip.
RESET Inicia los registros de comando, estado, solicitud y los temporales; pone a cero la bande-
ra last/first y el contador de registro de modo; el registro de máscara se asigna para igno-
rar las solicitudes. El 8237 queda en Ciclo Inactivo.
READY Entrada de solicitud de estados de espera
HLDA Reconocimiento de solicitud de DMA.
DREQ0-3: Líneas asincrónicas para solicitud de DMA. En el modo de prioridad fija, DREQ0 tiene
la mayor y DREQ3 la menor. Los periféricos solicitan el servicio de DMA en estas lí-
neas y esperan a bajarlas hasta el correspondiente DACK. La polaridad de DREQ es
programable. Las líneas no usadas deben ser enmascaradas.
DB0-7 Bus de datos. Durante los ciclos de DMA, los 8 bits más significativos de la dirección
son cargados en el bus de datos con objeto de ser almacenados en un latch externo con-
trolado por ADSTB. En las operaciones memoria-memoria, el bus de datos recibe y
envía los bytes a transferir.
IOR I En el ciclo inactivo es una entrada empleada por la CPU para leer los registros de con-
trol; en el ciclo activo actúa como línea de salida para que el 8237 controle la lectura de
datos de los periféricos.
IOW En el ciclo inactivo es una entrada empleada por la CPU para escribir los registros del
8237; en el ciclo activo actúa como línea de salida para que el 8237 controle la escritura
de datos en los periféricos.
EOP End Of Process. Línea bidireccional que informa de la finalización del servicio DMA. El
8237 permite que un ente exterior fuerce el final de un servicio bajando esta línea. El
propio 8237 genera un pulso en ella cuando se alcanza un TC (Terminal Count, fin de
cuenta) en algún canal, salvo en el modo memoria-memoria del canal 0 (en ese caso, la
señal se produce al alcanzarse el TC del canal 1). Esta patilla está conectada en el inter-
ior del chip a un transistor en colector abierto, por lo que requiere una resistencia exter-
na. Cuando llega una señal -EOP, el 8237 finaliza el servicio aunque en el modo de auto-
inicialización los registros base volverán a ser escritos en los registros en curso del canal
implicado. El canal resulta enmascarado salvo en el caso del modo de autoinicialización.
A0-.A3 Líneas bidireccionales triestado de direcciones. En el ciclo inactivo son entradas emplea-
das para direccionar los registros internos a leer o escribir. En el ciclo activo, son salidas
y proveen los 4 bits menos significativos de la dirección.

A4-A7 Salidas de los 4 bits de mayor peso de la dirección durante el ciclo activo.
HRQ Línea de salida para solicitar, durante una operación DMA, el control de los buses al µP.
DACK0-3 Notifica a los dispositivos de E/S que ha sido atendida su solicitud. El nivel de operación
de esta línea es programable. RESET las baja.
AEN Habilita el latch de 8 bits que guarda la parte alta de la dirección. Sirve también para
inhibir el acceso al bus por parte de otras fuentes.
ADSTB Línea que controla la carga de la parte alta de la dirección en el latch externo.
MEMR Salida USADA para acceder a la memoria durante la lectura o las transferencias memo-
ria-memoria.
MEMW Salida parra acceder a la memoria durante la escritura o las transferencias memoria-
memoria.

Un dispositivo DMA compatible con sistemas basados en el 8085A es el 8237,


el cual es un controlador de 4 canales, programables en tres modos, con posibilidad
Técnicas de gestión de Entrada y Salida 495

de conexión de varios chips en cascada. El 8237 realiza también transferencias me-


moria-memoria, incluyendo llenar un bloque de la memoria con un dato. La interco-
nexión con el µP, los modos de funcionamiento y la programación del controlador
DMA 8237 no se tratarán en este trabajo. Para mayor información usar la hoja técnica
del fabricante.
Dispositivos de E/S Programables 496

Dispositivos de E/S Programables

En este capítulo se presentarán aplicaciones prácticas que usan dispositivos


programables para interconexión de E/S. El modo de operación de tales circuitos es
programado al inicio del código y puede ser modificado en cualquier momento. El
uso de estos chips simplifica el circuito de interconexión y reduce el número de líneas
del programa de control.

En el interior del encapsulado de los dispositivos microcontroladores moder-


nos se integra un grupo de circuitos programables los cuales realizan las funciones
mínimas necesarias para resolver una tarea típica de control de complejidad baja. Es-
tas funciones son: E/S digital, control de tiempo, conversión D/A y modulación por
ancho de pulso. En contraposición, para que un microprocesador pueda ser usado en
aplicaciones de control es necesario interconectar a la CPU circuitos LSI externos
para que realicen las distintas tareas bajo la dirección del µP. También en caso que
los recursos de un microcontrolador no sean suficientes para una aplicación determi-
nada, es necesario convertir el µctrl en un microprocesador y conectarle hardware
externo.

Aunque estos dispositivos externos pueden ser simples acopladores de tres es-
tados o registros paralelos, el desarrollo de la tecnología del µP introdujo desde hace
30 años un grupo de dispositivos programables para interconexión de E/S, los cuales
pueden realizar en forma eficiente cualquier tarea que involucre gestión de E/S. Aun-
que cada fabricante de semiconductores (Intel, Motorola y Zilog entre otros) introdu-
jo su propio grupo de chips programables durante la década de los setenta. En este
capítulo se prestará atención a los circuitos programables diseñados originalmente por
INTEL para la serie MCS-80/85, adoptados luego por los sistemas MCS-86/88 y que
han sido incorporados, bien sea dentro del µP o en el conjunto de chips, a los moder-
nos sistemas Pentium.
Dispositivos de E/S Programables 497

El circuito de interconexión de E/S paralela PPI 8255A, el controlador de inte-


rrupciones PIC 8259A, el USART 8251, el temporizador programable 8253/54 o ver-
siones avanzadas de estos componentes son ejemplos de dispositivos que cumplen
funciones en sistemas PCs modernos y que son compatibles con sistemas basados en
el 8085A. El avance en la tecnología de fabricación de circuitos integrados ha hecho
obsoletos a muchos de estos chips (controladores de CRT y de discos). No obstante
algunos componentes como el USART 8251A y el PPI 8255A mantienen hoy en día
toda su funcionalidad y son usados en aplicaciones con µPs como controladores de
periféricos. En el caso del controlador de interrupciones, las funciones del PIC8259A
se incorporaron al µP Pentium como una unidad funcional interna. En este capítulo se
discutirá el uso de estos chips en ejemplos del mundo real.

9.1 CIRCUITO PARA INTERCONEXIÓN DE PERIFÉRICOS 8255

EL PPI 8255A (Peripheral Interface Programmable) fue diseñado original-


mente para µPs INTEL, pero ha siso usado en aplicaciones realizadas con la mayoría
de los microprocesadores existentes. El 8255A ofrece 24 terminales de E/S las cuales
pueden programarse en dos grupos (A y B) de 12 líneas. El dispositivo puede operar
en tres modos diferentes (0, 1 y 2). La figura 9.1 muestra el diagrama de bloques y la
distribución de terminales del 8255A.

8255

Fig.9.1. El PPI 8255A.


Dispositivos de E/S Programables 498

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8255A

VCC +5V
GND Tierra
Un nivel bajo en este terminal permite la comunicación entre el µP y el 8255A.
CS
Esta entrada se activa a cero durante una operación de escritura del µP.
WR
Entrada activa en cero durante una operación de lectura del µP.
RD
D0-D7 Es el bus de datos bidireccional y tres estados por medio del cual se transfieren comandos y/o datos
entre el PPI y el µP.
RESET Un nivel alto en esta entrada inicia el registro de control con todos los puertos en el modo de entrada.
A0 –A1
En conjunto con las entradas CS , WR y RD controlan el acceso a uno de los tres puertos de E/S o
al registro de control. Usualmente se conectan a las salidas A0-1 del 8085A.
PA0-PA7 Puerto A: Ocho bits de un latch de salida, buffer y un latch de entrada.
PB0-PB7 Puerto C : Ocho bits de un latch de salida , buffer y un latch de entrada.
PC0-PC7 Puerto C: Ocho bits de un latch de salida, y buffer de entrada. Puede usarse como dos puertos de 4
bits.

Al grupo A pertenecen el puerto A: PA0-PA7 y los cuatro bits más significati-


vos del puerto C (PC4-PC7); el grupo B agrupa las ocho líneas del puerto B: PB0-PB7
y los cuatro bits de orden bajo del puerto C (PC0-PC3). Además de los puertos, el
8255A contiene un registro de comandos para la programació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 debe ponerse a nivel bajo. La
selección del registro de comando o de un puerto de E/S particular, se realiza por me-
dio de las entradas de dirección A0 y A1, según lo indicado por la tabla 9.1.
Tabla. 9.1 Direcciones de los registros internos del PPI 82550
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 puede conectarse a los termi-
nales de igual nombre del µP o a las salidas de control de lectura y escritura en puer-
to de E/S: IORD e IOWR , de acuerdo con el modo que se decodifica la dirección del
dispositivo. Las ocho líneas de datos D0-D7 van 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 de
estados del funcionamiento básico del 8255, se ofrece en la tabla 9.2.

El modo en el cual el PPI se interconecta con la CPU se muestra en la figura


5.21, donde se usa selección lineal para habilitar el 8255A. Cuando al sistema se le
Dispositivos de E/S Programables 499

aplica energía, la línea RESET OUT del µP sube a nivel alto y obliga al 8255A 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 pa-
trón de bits en el registro de comando.

Tabla. 9.2 Operación del PPI 8255A.

9.1.1 Puertos de entrada y salida

El 8255A tiene tres puertos A, B, C de ocho bits, pudiendo dividirse el puerto


C en dos registros de E/S de cuatro bits cada uno. Los cuatro puertos se organizan
como dos grupos A y B, donde cada grupo es formado por un puerto de ocho bits y
otro de cuatro líneas. Como ilustra la figura 9.1, el grupo A está compuesto por el
puerto A y el nibble más alto del puerto C. Al grupo B lo forma el puerto B y los cua-
tro bits de orden bajo del puerto C.
Grupo A: PA0-7 + PC4-7
Grupo B: PB0-7 + PC0-3

La función de las líneas de cada grupo la fija una palabra de control que se
carga en el registro de comando (A0-1=112), para operación en tres modos diferentes.

9.1.2 Modos de operación del 8255A

El código de la aplicación puede programar los grupos A y B del 8255A para


que funcione en uno de tres modos de operación. Estos son:

1. Modo 0 E/S normal.


2. Modo 1 E/S con protocolo de enlace.
3. Modo 2 Transferencia bidireccional.
Dispositivos de E/S Programables 500

Modo 0

Los terminales de los puertos A, B y C pueden programarse como entradas o


salidas con retención (sólo las salidas) de los datos. El puerto C puede usarse como
dos puertos de 4 bits, con posibilidad de activar/desactivar cualquiera de las líneas
individualmente. Son posibles 16 configuraciones diferentes de E/S en este modo.

Modo 1
La transferencia desde/hacia los puertos A y B es controlada por un protocolo
de enlace usando las líneas del puerto C. Los grupos A y B pueden ser programados
en forma independiente para usar el puerto de ocho bits para transferencias controla-
das por las cuatros líneas del puerto C del grupo correspondiente. El puerto A y B
puede ser entrada o salida, ambas con retención de datos. Los terminales del puerto C
respectivo se usan como señales de control o de estado del puerto de ocho bits.

Modo 2
El puerto A puede programarse para transmisión o recepción de datos sobre
las mismas líneas. Tanto las entradas como las salidas son retenidas y se usan cinco
líneas del puerto para controlar y examinar el estado de la transferencia a través del
puerto A.

9.1.3 Programación del 8255A

La palabra escrita en el registro de control es decodificada por la lógica inter-


na del dispositivo para establecer cual de dos funciones posibles será realizada. Estas
son:

1. Definición de modo de operación.


2. Activación/desactivación de bits del puerto C.

Cuando el bit más significativo (D7) de la palabra de control es uno, esta se


interpreta como un byte de definición de modo de operación. El formato de esta pala-
bra se muestra en la figura 9.2

Se puede configurar al componente para operación en un modo o en una com-


binación de estos. La figura 9.3 muestra un ejemplo de selección de modo. En este
caso los grupos A y B se configuran como entradas/salidas en el modo 0. Si la direc-
ción del puerto de control es 0BH y la palabra de control es 91H, el siguiente código
realizará la programación de chip.

pctrl_8255 equ 0bh ; Dirección del registro de control

mvi a,10010001b ; Dalabra de control al acumulador


out pctrl_8255 ; Se programa el dispositivo
Dispositivos de E/S Programables 501

Fig. 9.2 Palabra de definición del modo de operación.

Fig. 9.3 Ejemplo de configuración en modo 0.


Dispositivos de E/S Programables 502

Cuando el bit D7 de la palabra de control es cero lógico, los circuitos internos


del PPI la entienden como una orden de activación/desactivación de uno de los bits
del puerto C. El formato de este comando se muestra en la figura 9.4. Esta función se
denomina bit set/reset, y permite poner a uno o a cero cualquiera de las líneas del
puerto C.

Fig. 9.4 Formato de la palabra de control para activar/desactivar un bit del puerto C.

Suponga que se desea generar un pulso de nivel alto en el terminal 2 del puer-
to C. El siguiente programa realizará la tarea.

;----------------------------------------------------------------------------------------------
pctrl_8255 equ 0bh ; Dirección del registro de control.

; Pulso se inicia en cero

mvi a,00000100b ; Palabra de control al acumulador


out pctrl_8255 ; Bit 2 a cero, al inicio.

; Poner bit a nivel alto

mvi a,00000101b ; Palabra de control al acumulador


out pctrl_8255 ; Bit 2 a uno.

; Poner bit a nivel bajo

mvi a,00000100b ; Palabra de control al acumulador


out pctrl_8255 ; Bit 2 a cero al final del pulso.
;----------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 503

9.1.4 Aplicaciones del 8255

A continuación se presentan un grupo de ejemplos prácticos que ilustran el


uso del PPI 8255A en sus diferentes modos de operación.

Operación en el modo 0
La primera aplicación del modo 0 consiste en la interconexión de un teclado al
sistema usando un 8255A y la rutina de lectura del teclado.

Ejemplo 9.1

Se debe escribir un programa para la lectura del teclado numérico de la figura


9.5. Cuando se pulse una tecla, debe retornarse su valor en el registro acumulador.

(a) (b)

Fig. 9.5 Teclado numérico. a) Aspecto mecánico. b) Símbolo eléctrico.

El teclado de la figura 9.5 se usa para introducir al µC información numérica


en representación hexadecimal. El periférico de entrada está formado por 16 pulsado-
res conectados en una matriz 4 x 4. La presión de un pulsador conectará la fila donde
se encuentra la tecla, con la columna correspondiente.

Las funciones que debe realizar el programa de control de teclado son:

• Detectar la pulsación de una tecla.


• Suprimir los rebotes de contactos.
• Identificar la tecla.
• Generar el código correspondiente.
• En forma opcional: proteger al sistema contra pulsaciones simultáneas de teclas distintas.

Para conectar el teclado, se usa el puerto C del 8255 funcionando en modo 0.


Las filas del se conectan a los terminales PC0-3 y las columnas a las líneas PC4-7, co-
mo indica la figura 9.6. Tanto las filas como las columnas se fuerzan a +5 V por me-
dio de resistores.
Dispositivos de E/S Programables 504

Fig. 9.6 Un PPI 8255 funciona como puerto para el teclado.


Dispositivos de E/S Programables 505

El programa esperará en un lazo hasta que ocurra la pulsación de una tecla. La


activación de un pulsador conectará la fila donde éste se ubica con la columna corres-
pondiente. A cada elemento de la matriz le corresponde un número para indicar su
ubicación y un código que representa el valor de la tecla.

Las teclas se numeran: 0Æ0, 1Æ1,…FÆF. De modo que para este caso, el có-
digo de la tecla se corresponde con su número. Por ejemplo la tecla 6 (número 6) es-
tará en la fila 1 columna 2. El algoritmo para determinar el valor de una tecla consis-
te en identificar la fila y la columna de la tecla presionada. El número (posición en la
matriz) del pulsador viene dado por:

D D D
N = N de la Fila × Número de Columnas + N de la Columna

La tecla de valor 6 tendrá como número 1 x 4 + 2 = 6. En este caso el nú-


mero corresponde con el valor. Si el teclado tiene teclas de función será necesario el
uso de una tabla, a la cual se entra con el número de la tecla para encontrar el valor
correspondiente.

Identificación de la fila:

• PCbajo: Entrada
• PCalto: Salida

Fig. 9.7 Identificación de la fila.

Se escribe el patrón de bits 0000 en el puerto PCalto y se procede a leer en el


puerto PCbajo: 1101. El bit 1 estará en nivel bajo debido a que la tecla 6 fue pulsada.
Dispositivos de E/S Programables 506

El valor en el acumulador permite identificar la fila a la cual pertenece el pul-


sador activado.

Identificación de la columna:

• PCbajo: Salida
• PCalto: Entrada

Fig. 9.8 Identificación de la columna.

Se escribe el patrón 0000 en el puerto PCbajo y se lee en el puerto PCalto: 1011.


El bit 2 estará en cero debido a que la tecla 6 fue pulsada. Una vez identificadas la fila
y la columna puede calcularse el número del pulsador como se describe en la página
previa.

En la figura 9.9 se muestra el diagrama de flujo del programa tecla, el cual es-
pera por la presión de una tecla y suprime el efecto del rebote del interruptor o una
activación falsa por ruido. Si ocurre una pulsación válida, se procede a determinar el
número del pulsador como se indicó. El código de la rutina Tecla se presenta a conti-
nuación y considera que el 8255 de la figura 9.6 se decodifica en la dirección 0. La
posición de la tecla pulsada es cargada en el registro acumulador.

El teclado del ejemplo 9.1 solo permite introducir al sistema números del có-
digo hexadecimal. En la práctica, es usual que las aplicaciones requieran teclados con
pulsadores de función. Por ejemplo una tecla puede validar un número previamente
introducido. Otras pueden permitir: el borrado de la pantalla, el desplazamiento en un
menú de opciones, la ejecución de un programa, especificar la dirección de giro de un
motor o calcular la raíz cuadrada del valor cargado previamente.
Dispositivos de E/S Programables 507

Fig. 9.9 Rutina tecla para detectar activación, eliminar rebote e identificar pulsador.
Dispositivos de E/S Programables 508

;---------------------------------------------------------------------------------------------------------------------------
; Rutina de lectura de teclado 4x4
;---------------------------------------------------------------------------------------------------------------------------
palb_ctrl1 equ 91h
palb_ctrl2 equ 8ah
pc_8255 equ 2
pctrl_8255 equ 3
;---------------------------------------------------------------------------------------------------------------------------

tecla: mvi a,palb_ctrl1 ;PCL:entrada, PCH:salida


out pctrl_8255
mvi a,0fh ; Nibble alto del acumulador a cero
out pc_8255 ; Todas las columnas a cero
leer: in pc_8255 ; Leer filas
ani 0fh ; Poner mascara
cpi 0fh
jnz leer ; Si tecla pulsada, leer
call r20ms ; Teclas liberadas, esperar 20 ms
releer: in pc_8255 ; Leer filas
ani 0fh ; Poner mascara
cpi 0fh ; Detectar tecla pulsada
jz releer ; Tecla no pulsada, leer puerto
call r20ms ; Tecla pulsada, esperar 20 ms
in pc_8255 ; Detectar error por ruido
ani 0fh
cpi 0fh ; Detectar pulsación falsa
jz releer ; Si ruido, leer puerto
mov c,a ; Cargar patrón de filas en C
mvi a,palb_ctrl2 ; PCL:salida, PCH:entrada
out pctrl_8255
mvi a,0f0h ; Todas las filas en cero
out pc_8255
in pc_8255 ; Patrón de columnas en A

; Identificar columna

mvi b,3 ; Contador de columnas a 3


iden_c: ral ; Desplazar a la izquierda
jnc fila ; Si CY=0, en B numero de columna
dcr b ; Si CY=1, restar 1 a contador de colum.
jmp iden_c ; Volver a desplazar

; Identificar fila

fila: mov a,c ; Patrón de filas en acumulador


mvi c,0 ; Contador de filas a cero
iden_f: rar ; Desplazar a la derecha
jnc listo ; Si CY=0, en C numero de fila
inr c ; Si CY=1, incrementar contador de filas
jmp iden_f ; Desplazar
listo: mov a,c ; Numero de fila al acumulador
ral ; Numero de la fila x 4
ral
ora b ; Sumar número de columna
ret ; Número de tecla en registro A
Dispositivos de E/S Programables 509

El ejemplo que sigue describe el modo de interconexión al sistema y el pro-


grama de control de un teclado con teclas cuyas funciones son especificadas por el
diseñador.

Ejemplo 9.2

La figura 9.10 presenta un teclado de 20 teclas arregladas en una matriz de 4x5


con cuatro pulsadores de función. Escriba una rutina que lea el teclado y cargue el
código de la tecla en el registro acumulador.

Fig. 9.10 Matriz de 20 teclas con cuatro funciones.

Debido a la distribución de los pulsadores en la matriz, el número que indica


la posición no corresponde con el valor que debe retornar la tecla. Por ejemplo la te-
cla número 4 es F4 y la número 5 tiene el valor 4. Esto determina que una vez deter-
minada la posición del elemento en la matriz, debe usarse una tabla de búsqueda para
encontrar el código correspondiente. También deben usarse cuatro líneas del puerto A
para las filas y cinco del puerto B para las columnas. El siguiente código realiza la
tarea solicitada en el ejemplo.

;---------------------------------------------------------------------------------------------------------------------------
; Sección de programa principal que llama a rutina tecla.
; Con el número del pulsador entra en una tabla de consulta y encuentra el código de la tecla activada y
; lo retorna en el registro acumulador.
;---------------------------------------------------------------------------------------------------------------------------
tope_pila equ 300h
;---------------------------------------------------------------------------------------------------------------------------
lxi sp,tope_pila
call tecla
lxi h,cod_tecla
add l
mov l,a
mov a,m
.
.
.
Dispositivos de E/S Programables 510

;---------------------------------------------------------------------------------------------------------------------------
; Tabla de código de tecla
;---------------------------------------------------------------------------------------------------------------------------

cod_tecla: db 00h ; tecla 0


db 01h ; tecla 1
db 02h ; tecla 2
db 03h ; tecla 3
db 10h ; tecla f1
db 04h ; tecla 4
db 05h ; tecla 5
db 06h ; tecla 6
db 07h ; tecla 7
db 11h ; tecla f2
db 08h ; tecla 8
db 09h ; tecla 9
db 0ah ; tecla a
db 0bh ; tecla b
db 12h ; tecla f3
db 0ch ; tecla c
db 0dh ; tecla d
db 0eh ; tecla e
db 0fh ; tecla f
db 13h ; tecla f4
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de lectura de teclado 4x5. Retorna número de tecla en el acumulador
;---------------------------------------------------------------------------------------------------------------------------
palb_ctrl1 equ 91h
palb_ctrl2 equ 8ah
pa_8255 equ 0
pb_8255 equ 1
pctrl_8255 equ 3
;---------------------------------------------------------------------------------------------------------------------------
tecla: mvi a, palb_ctrl1
out pctrl_8255
xra a
out pb_8255
leer: in pa_8255
ani 1fh
cpi 1fh
jnz leer
call r20ms
releer: in in pa_8255
ani 1fh
cpi 1fh
jz releer
call r20ms
in pa_8255
ani 1fh
cpi 1fh
jz releer
mov c,a
mvi a, palb_ctrl2
out pctrl_8255
xra a
Dispositivos de E/S Programables 511

out pa_8255
in pb_8255
mvi b,0
iden_c: rar
jnc fila
inr b
jmp iden_c
fila: mov a,c
mvi c,0
iden_f: rar
jnc listo
inr c
jmp iden_f
listo: mov a,c
ral ;Numero de la fila x 5
ral
add c
add b ;Sumar número de columna
ret

Observe que a las cuatro teclas de función se les asigna códigos arbitrarios y
diferentes a los dígitos del sistema hexadecimal. Por ejemplo 10H para F1, 11H para
F2, 12H para F3 y 13H para F4. Estos valores permiten al programador conocer cual
función fue seleccionada en cualquier momento.

Es usual que una aplicación basada en µPs requiera además de periféricos de


entrada algún tipo de dispositivo para exhibición de información. Los sistemas de
bajo costo usan módulos LCD o indicadores de siete segmentos. Aún cuando las pan-
tallas LCD de 2 a 4 íneas han disminuido en costo y no requieren refrescar continua-
mente los datos presentados, los visualizadores con diodos 7-segmentos son de uso
difundido en el medio industrial sobre todo cuando la luz ambiental es deficiente.
Puede considerarse que la presentación con dispositivos tipo LEDs permanecerá du-
rante muchos años como una opción válida para el despliegue de información en sis-
temas e instrumentos electrónicos de bajo costo. El ejemplo siguiente ilustra el uso de
tales indicadores para exposición de información alfanumérica.

Ejemplo 9.3

La figura 9.11 muestra un circuito visualizador de ocho dígitos con indicadores


de siete segmentos tipo ánodo común, conectados a un PPI 82C55. Para minimizar el
número de líneas de interconexión se usa la técnica de multiplexado de los datos a
presentar. Se debe escribir una rutina para el control de exhibidor, mostrando en la
pantalla el mensaje: Udo 2005.

Al multiplexar en el tiempo, cada indicador es seleccionado durante un lapso


determinado, pero debido a la persistencia de la imagen en la retina humana, éste apa-
renta estar continuamente activado. Los segmentos de todos los LEDs se conectan en
ocho líneas comunes y cada dígito se activa a una frecuencia fmux.
Dispositivos de E/S Programables 512

Fig. 9.11. Circuito de presentación con ocho caracteres alfanuméricos.


Dispositivos de E/S Programables 513

Para una presentación con parpadeo mínimo, la frecuencia de multiplexado


debe estar comprendida entre 100 Hz y 1.5 KHz. Esto significa que si los N indicado-
res se activan en intervalos Tx de 500 µs, la frecuencia fmux será igual:
1
f mux =
Tx × N
1000
f mux = = 250 Hz
0.5 × 8

El circuito debe estar sincronizado. Esto significa que debe cargarse en el


puerto A del 82C55 (funcionando en modo 0) el complemento del código de 7 seg-
mentos del caracter a presentar en un LED y simultáneamente debe aplicarse un nivel
bajo, por medio de una línea del puerto B, en la base del transistor que aplica energía
al indicador correspondiente. Este proceso se repite para cada dígito, a una frecuencia
Nfmux.

Como se observa en la figura 9.11, el puerto A del 82C55 se usa para activar
los segmentos. Para proveer la corriente necesaria para los segmentos se usa un cir-
cuito amplificador ULN2003 el cual puede manejar con comodidad corrientes de sa-
lida de hasta 500 mA. Debido a que el chip solo tiene siete pares darlington, se usa un
transistor discreto Q2N222A para el punto decimal. La selección de dígitos se logra
activando con un nivel bajo en el terminal correspondiente del puerto B, uno de los
transistores PNP Q2N4405.

La selección de la corriente que debe circular por cada segmento para garanti-
zar una brillantez adecuada ante el observador, depende de distintos factores físicos y
humanos. La distancia de observación, el ángulo de visión, la altura del carácter, la
iluminación ambiental y la razón de contraste entre el indicador y el color del fondo
ambiental son algunos de los parámetros a considerar para fijar el valor adecuado de
la corriente por segmento. En nuestro caso se considera que, de acuerdo con las espe-
cificaciones del fabricante del indicador, una intensidad de If =10 mA por segmento
garantizará un brillo aceptable. La corriente If es provista por los amplificadores del
ULN2003 y por el transistor Q2N222A. La corriente que circula por el circuito de
colector de los transistores Q2N4405 de manejo de dígito será igual a kIf con k igual
al número de segmentos iluminados en el indicador correspondiente.

Debido a que cada LED permanece apagado la mayor parte del tiempo, la co-
rriente promedio que circula por un segmento será mucho menor que 10 mA y en
consecuencia la iluminación percibida por el observador será deficiente. Para com-
pensar el efecto del multiplexado sobre el nivel de corriente directa, se calcula la re-
sistencia Rp de modo el pico de corriente en el segmento produzca una intensidad
promedio de 10 mA. La corriente que circula en promedio durante un periodo de mul-
tiplexado es:

T I pico
If = N ×I
pico =
T N
Dispositivos de E/S Programables 514

Esto indica que para obtener un nivel de iluminación equivalente a la que pro-
duciría una corriente de 10 mA en condiciones de corriente continua, el pico de co-
rriente debe ser igual a 80 mA, para una pantalla de ocho dígitos. Esto es:

I pico = N × I f

Para calcular el valor del resistor limitador de corriente Rp se usa el circuito de


la figura 9.12 que muestra la trayectoria de la corriente por un segmento de un indi-
cador.

Fig. 9.12 Circuito equivalente para el cálculo de Rp.

El transistor Q1 de la figura 9.12 conduce por la aplicación de un nivel bajo en


su base. Esta tensión proviene de una línea del puerto B. El transistor Q2 del par dar-
lington del ULN2003 está activado cerrando el camino de la corriente a través del
segmento a. Para iluminar un segmento, se aplica un nivel alto a la entrada del
ULN2003. El valor del resistor de 510 Ω en la base de Q1 se calcula para que cuando
todos los segmentos del indicador estén activados, circule una ICQ1 = 8x80 mA= 640
mA. El VCESATQ1, bajo estas condiciones, es de aproximadamente 600 mV, mientras
que la tensión de saturación de Q2 a una corriente de 80 mA, es de 0.8 V. Con estos
valores se calcula Rp:

5V − VCEsatQ1 − VF − VCEsatQ 2 (5 − 0.6 − 2.4 − 0.8)V


RP = = = 15 Ω
I pico 80 mA
Dispositivos de E/S Programables 515

La resistencia en la base del transistor que maneja el punto decimal se calcula


de modo que una tensión de 4.6 V en la línea PA7 produzca una intensidad de 80 mA
en el circuito de colector del Q2N2222 con una tensión colector-emisor de 0.8 V.

El programa de control para el circuito de la figura 9.11 se muestra a conti-


nuación. Este presenta el mensaje especificado con una frecuencia de multiplexado de
250 Hz. La presentación se inicia por el indicador del extremo derecho.

;----------------------------------------------------------------------------------------------------------------
; Este programa presenta el mensaje Udo 2005 en
; una pantalla de indicadores de 7-segmentos.
;----------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------
i_stack equ 8fbh ; Inicio de la pila
num_dig equ 8
plbr_ctrl equ 80h
;----------------------------------------------------------------------------------------------------------------
; Definición de segmentos
defseg puertos,start=0, class=iospace ; 8255 en dirección 0
defseg stack, start=i_stack ; La pila reside en la RWM
defseg progr, class=code, start=0
;----------------------------------------------------------------------------------------------------------------
; Puertos del 8255
seg puertos
pa_8255 ds 1 ; Salidas a segmentos
pb_8255 ds 2 ; Selección de dígitos
pctrl_8255 ds 1 ; Puerto de control
;----------------------------------------------------------------------------------------------------------------

; Los 8 bytes últimos de RWM soportan el stack.


seg stack
ds 8
t_stack:equ $-1 ; Base de la pila
;----------------------------------------------------------------------------------------------------------------
; Segmento de código en EPROM
seg progr
lxi sp,t_stack ; Se inicia el apuntador de pila
mvi a,plbr_ctrl ; Palabra de control del 8255
out pctrl_8255 ; Se programan puertos A y B como salidas
rep: lxi h,msj ; Registro par H apunta a primer caracter del mensaje
call visual ; Presentar mensaje
jmp rep ; Repetir por siempre
;----------------------------------------------------------------------------------------------------------------
; Rutina visual
;----------------------------------------------------------------------------------------------------------------
visual: mvi b,num_dig ; Registro B es el contador de dígitos
mvi a,0feh ; Primero se activa el dígito 0
mov c,a ; Salvar patrón de selección de indicador
pres: out pb_8255 ; Activar dígito n
mov a,m ; Al registro acumulador primer caracter del mensaje
xchg ; Salvar dirección del mensaje en registro par DE
Dispositivos de E/S Programables 516

lxi h,cod_7seg ; HL apunta al inicio de la tabla de códigos 7-segmentos


add l ; Sumar desplazamiento
mov l,a
mov a,m ; Código de 7-seg al registro acumulador
out pa_8255 ; Sacar por puerto A
xchg ; Recuperar dirección de caracter del mensaje
call r500us ; Esperar 500 µs
mov a,c ; Recuperar patrón de selección de dígito
rlc ; Se activará el dígito siguiente
mov c,a ; Guardar patrón
inr l ; Apuntar siguiente caracter del mensaje
dcr b ; Contador de caracteres menos 1
jnz pres ; Si no cero, siguiente caracter
ret ; Retornar si caracter final.
;----------------------------------------------------------------------------------------------------------------
; Mensaje
;----------------------------------------------------------------------------------------------------------------
msj: db u,?d,o,espac,dos,cero,cero,cinco
;----------------------------------------------------------------------------------------------------------------
; Tabla de códigos de siete segmentos
;----------------------------------------------------------------------------------------------------------------
cod_7Seg:
cero equ $-cod_7Seg
db 0f3h
db 60h
dos equ $-cod_7Seg
db 0b5h
db 0f4h
cuatro equ $-cod_7Seg
db 66h
cinco equ $-cod_7Seg
S equ $-cod_7Seg
db 0d6h
db 0d7h
db 70h
ocho equ $-cod_7Seg
db 0f7h
db 7eh
?A equ $-cod_7Seg
db 77h
?B equ $-cod_7Seg
db 0c7h
?C equ $-cod_7Seg
db 93h
?d equ $-cod_7Seg
db 0e5h
?E equ $-cod_7Seg
db 97h
F equ $-cod_7Seg
db 17h
g equ $-cod_7Seg
db 0f6h
?H equ $-cod_7Seg
db 67h
?L equ $-cod_7Seg
Dispositivos de E/S Programables 517

db 85h
?M equ $-cod_7Seg
db 0e6h
n equ $-cod_7Seg
db 45h
i equ $-cod_7Seg
db 20h
J equ $-cod_7Seg
db 0e1h
o equ $-cod_7Seg
db 0e4h
P equ $-cod_7Seg
db 37h
q equ $-cod_7Seg
db 76h
r equ $-cod_7Seg
db 05h
t equ $-cod_7Seg
db 44h
u equ $-cod_7Seg
db 0Eh
¿ equ $-cod_7Seg
db 0a3h
_ equ $-cod_7Seg
db 80H
espac equ $-cod_7Seg
db 00h
end
;----------------------------------------------------------------------------------------------------------------

Ejemplo 9.4

En este ejemplo se mide y presenta el valor de una tensión continua positiva


en el rango de 0 a +5 V. Se construirá y programará un convertidor análogo digital
por aproximaciones sucesivas (AS). El método de AS usa un conversor digital analó-
gico y un comparador como ilustra la figura 9.13. El proceso de conversión se realiza
en un número de pasos igual al de bits (en este caso ocho) que tenga el CDA.

Fig. 9.13. Convertidor A/D por aproximaciones sucesivas.


Dispositivos de E/S Programables 518

Algoritmo:

Al inicio del proceso de conversión se aplica a las entradas del CDA un valor
digital con el bit más significativo puesto a nivel alto y los bits restantes a cero y se
lee la salida del comparador. Un nivel lógico 1/0 indica que la señal de entrada es
mayor/menor que la generada por el CDA. El valor lógico de la salida del compara-
dor se asigna en la siguiente etapa al bit que se procesa. A continuación se repite el
proceso con el siguiente bit y así sucesivamente hasta el menos significativo. El prin-
cipio de AS está basado en un método de ensayo y error que aproxima el valor de la
señal de entrada a la mitad superior e inferior del rango de representación de cada
etapa. En la figura 9.15 se presenta el diagrama de transiciones para un convertidor
análogo digital por aproximaciones sucesivas de cuatro bits. Las señales Vo y Vr re-
presentan las salidas del circuito comparador y del conversor digital análogo respecti-
vamente. La primera sólo puede tomar valores 1 ó 0, según la tensión de entrada sea
mayor o menor que la generada por el CDA y la segunda es la tensión generada por
este conversor.

Fig.9.14. Circuito del convertidor A/D por aproximaciones sucesivas.

Existen convertidores analógico digital del tipo descrito presentados como un


chip en el cual el controlador se realiza por hardware y se integra al encapsulado. En
este caso se usa el µP como controlador, conectando un DAC0808 al puerto de salida
B (01H) de un 8255A y examinando la salida del comparador LM311 por el bit 7 del
puerto de entrada C (02H), como ilustra la figura 9.14. El PPI 8255A funcionará en
modo 0 y no se muestra en el diagrama.

EL convertidor D/A tiene una resolución de 8 bits y se configura para entregar


una corriente de salida IOUT desde 0 hasta IFS cuando las entradas A8-1 van desde 00
hasta FFH. El amplificador operacional LM741 a la salida del CDA es un conversor
de corriente a voltaje y provee una tensión de salida igual a:

VS = I OUT × 5.6K

VREF 5
VS = n
× A base10 = × A base10
2 256
Dispositivos de E/S Programables 519

Fig. 9.15. Diagrama de transiciones para un CAD por aproximaciones sucesivas.

Los objetivos de este ejemplo son:

1 Escribir un programa en ensamblador para obtener el valor binario de la


tensión analógica de entrada Vi usando el µP para resolver el algoritmo de
aproximaciones sucesivas.

2 Desarrollar una rutina que convierta el valor binario de Vi en tres dígitos


BCD y los almacene en memoria.

3 Realizar un programa que permita presentar el valor BCD de tres dígitos en


el circuito de exposición visual de la figura 9.16.
Dispositivos de E/S Programables 520

Fig. 9.16. Pantalla de tres dígitos con indicadores tipo cátodo común.

El módulo de presentación está formado por un display que contiene tres indi-
cadores de 7 segmentos cátodo común y es especialmente fabricado para uso con la
técnica de multiplexado. El circuito usa un decodificador CMOS 4511 para generar el
código de 7 segmentos. La frecuencia de multiplexado debe ser 333.33 Hz (1000/3).

Solución:

El programa de control para el voltímetro de corriente continua del ejemplo


consta de 4 módulos, estos son:

• Programa principal

Configura el 8255A para operar en el modo 0 con los puertos A y B como salidas y el puer-
to C como entrada.

Llama a la rutina ADC, la cual realiza el algoritmo de consultas sucesivas y retorna el valor
digital de la muestra.

Convierte el valor del voltaje de entrada desde binario a BCD y lo almacena en memoria.
Para la conversión a decimal se usa el hecho que dada la salida A del convertidor A/D, el va-
lor del voltaje de entrada es:
5
Vi = × A base10
256

En representación hexadecimal se tiene:


5
Vi = × A base16
100H
Dispositivos de E/S Programables 521

Si el resultado de la conversión es 25510 = FFH, entonces el valor del voltaje es:

5
Vi = × 255 = 4.98 Volt
256

Un número de 8 bits, al ser multiplicado por 5 ó por 10 siempre producirá un resultado (su-
puesto de 12 bits) cuyo dígito más significativo es un número BCD. De modo que bastará
ejecutar el producto 5 x FFH = 4FBH para obtener el primer dígito BCD (4) del resultado.
El valor FBH es el residuo después de la división por 256. En realidad esta última operación
no se realiza sino que el remanente FBH se multiplica por diez, resultando 9CEH. La divi-
sión entera de este valor por 256 entrega el dígito BCD (9) de las décimas de voltios y un
residuo de C0H. Repitiendo el proceso con el nuevo residuo resulta el valor 80CH y se ob-
tienen las centesimas (8) de voltios. Con este algoritmo sencillo puede convertirse el dato
entregado por el ADC a un voltaje en BCD.

• Rutina ADC

Realiza el algoritmo de aproximaciones sucesivas y retorna en el registro acumulador la re-


presentación digital del voltaje Vi de entrada. Esta técnica pone a 1 el bit más significativo
del puerto conectado al convertidor D/A, de modo que la salida del DAC tendrá la tensión
de media escala. Este nivel es comparado con el valor del voltaje desconocido de entrada. Si
el voltaje de prueba a la salida del CDA es demasiado bajo, el bit es puesto a 1 permanen-
temente y se prueba el bit menos significativo siguiente. En caso contrario, el bit más signi-
ficativo es puesto a cero y se procede con el próximo. Este proceso continúa tratándose to-
dos los bits de izquierda a derecha, hasta el último.

• Rutina POR5

Multiplica por 5 el contenido del registro L y retorna el resultado en el registro par HL.
También es llamada para ejecutar el producto por 10. En este caso el valor de 16 bits retor-
nado por el programa POR5, se desplaza un bit hacia la izquierda.

• Rutina VISUAL

Es llamada por el programa principal para presentar el valor de la tensión almacenado en


BCD en la memoria del sistema. Una subrutina RET1MS genera el retardo de 1ms para fijar
la frecuencia de multiplexado deseada. Para disminuir el parpadeo del dígito menos signifi-
cativo, el periodo de muestreo del voltaje de entrada se ajusta aproximadamente a 1 segun-
do. La rutina de retardo forma parte del mismo módulo que VISUAL.

A continuación se presentan el contenido de cada módulo, en el mismo or-


den como se describieron:
;--------------------------------------------------------------------------------------------------------------
$title(Voltímetro DC)
; Modulo de programa principal
;--------------------------------------------------------------------------------------------------------------
public pa_8255,pb_8255,pc_8255,temp,num_dig
extern adc,por5,visual
;--------------------------------------------------------------------------------------------------------------
i_stack equ 8500H ; Inicio de la pila
i_rwm equ 8000H ; Dirección de inicio de RWM para datos
num_dig equ 3 ; Número de indicadores LEDs
plbr_ctrl equ 89H ; PA y PB: Salidas PC: Entradas
;--------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 522

; Definición de segmentos
defseg puertos,start=0, class=iospace ; 8255 en dirección 0
defseg stack, start=i_stack ; La pila reside en la RWM
defseg datos, class=data, start=i_rwm ; Datos a partir de 8000H
defseg progr, class=code, start=6002H ; Primera posición de RWM de
; usuario en el MPR-85 PLUS
;--------------------------------------------------------------------------------------------------------------
; Puertos del 8255
seg puertos
pa_8255 ds 1 ; Salida de datos BCD y selección de indicadores
pb_8255 ds 1 ; Salida a convertidor D/A
pc_8255 ds 1 ; Línea PC0 = P2.0, salida del comparador
p_ctrl ds 1 ; Puerto de control del 8255
;--------------------------------------------------------------------------------------------------------------
; Los 16 bytes últimos de RWM soportan el stack.
seg stack
ds 10H
t_stack:equ $-1 ; Base de la pila
;--------------------------------------------------------------------------------------------------------------
; Segmento de datos en RWM
seg datos
temp ds 3 ; Dirección de almacenamiento de valor medido
;--------------------------------------------------------------------------------------------------------------
; Segmento de código cargado en RWM de usuario del MPR-85 PLUS
seg progr
lxi sp,t_stack ; Se carga el apuntador de pila
mvi a,plbr_ctrl ; Palabra de control al A
out p_ctrl ; Se programa el 8255
prpal: call adc ; Adquirir muestra de la entrada
mov l,a ; Valor digital de muestra al registro L
call por5 ; Se inicia conversión de binario a BCD
mov a,h ; Dígito más significativo al A
sta temp ; Dígito más significativo a memoria
call por5 ; Remanente se multiplica por 10 (x5)
dad h ; Resultado se multiplica x2
mov a,h ; Dígito siguiente al A
sta temp+1 ; Dígito siguiente a memoria
call por5 ; Nuevo residuo x10 (x5)
dad h ; Resultado x2
mov a,h ; Dígito menos significativo al A
sta temp+2 ; Dígito menos significativo a memoria
call visual ; Presentar resultado de la medida
jmp prpal ; Buscar muestra siguiente
end
;--------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------
;Rutina ADC
;--------------------------------------------------------------------------------------------------------------
public adc
extern pb_8255,pc_8255
defseg progr
seg progr
adc: lxi b,8000h ; Patrón de media escala en B, registro C a cero
mov a,b ; Salvar patrón de media escala.
Dispositivos de E/S Programables 523

prob: ora c ; Sumar valor anterior de prueba


out pb_8255 ; Valor de prueba al convertidor D/A
in pc_8255 ; Se lee salida del comparador. Tp-->0
ani 1 ; Se pone máscara
jz alto ; Saltar si valor de prueba es mayor que el
; desconocido
mov a,b ; Recuperar valor de prueba actual
ora c ; Formar el total hasta ahora
mov c,a ; Salvar total
alto: mov a,b ; Recuperar último valor de prueba
rar ; Desplazar hacia próximo bit menos significativo
mov b,a ; Guardar nuevo patrón
jnc prob ; Si acarreo es 1, es el último bit
mov a,c ; Valor de tensión al registro A
ret
end
;--------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------
; Rutina POR5
;--------------------------------------------------------------------------------------------------------------
public por5
defseg progr
seg progr
por5: mvi h,0 ; Byte alto de nultiplicando a cero
mov d,h ; Multiplicando a registro par DE
mov e,l
dad h ; Multiplicando x2
dad h ; Multiplicando x2
dad d ; Sumar multiplicando.
; mulx2 + mul x2 + mul = mulx5
ret
end
;--------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------------------------
; Rutina VISUAL
;--------------------------------------------------------------------------------------------------------------
public visual
extern temp,pa_8255,num_dig
defseg progr
seg progr

visual: lxi d,327


rep: push d ; Salvar contador de 16 bits
mvi b,num_dig ; Número de dígitos al registro B
lxi h,temp ; Apuntar digito 1 en memoria
mvi c,40h ; Patrón de selección de LED 1
precib: mov a,m ; Dígito n en BCD (D0-D3) al acumulador
ora c ; Agregar al acumulador (D4-D6) patrón
; de selección de indicador
out pa_8255 ; Salida de código BCD y selección de display
call f_mux ; Presentar durante 1/(3 x fmux)
mov a,c ; Patrón de selección actual al A
rar ; Rotar hacia la derecha
Dispositivos de E/S Programables 524

mov c,a ; Patrón de selección de dígito siguiente a C


inx h ; Apuntar dirección del caracter siguiente
dcr b ; Contador de dígitos -1
jnz precib ; No es el último dígito, continuar
pop d ; Último dígito, recuperar contador
dcx d ; Contador menos uno
mov a,d ; Probar si alcanzó cero
ora e
jnz rep ; No es cero, seguir presentando muestra
ret ; Es 0, retornar en búsqueda de muestra siguiente
;--------------------------------------------------------------------------------------------------------------
; Rutina de retardo
;--------------------------------------------------------------------------------------------------------------
f_mux: lxi d,80H
fmux: dcx d
mov a,d
ora e
jnz fmux
ret
end
;--------------------------------------------------------------------------------------------------------------

Fig. 9.17. Ventana principal de MICRO-IDE con el proyecto del ejemplo 9.4.

Los circuitos de la figuras 9.14 y 916 fueron construidos e interconectados al


µC MPR85-PLUS. Los módulos del proyecto fueron compilados y enlazados usando
la herramienta Micro-IDE. El programa ejecutable resultante fue descargado por el
Dispositivos de E/S Programables 525

puerto serie del PC en la memoria del MPR-85 PLUS. El diseño fue probado y funcio-
nó en forma correcta, presentado en pantalla el valor del voltaje fijado en el potenció-
metro. Contrastando la lectura con la de un voltímetro comercial, no se aprecia error
alguno. Este ejemplo fue un ejercicio didáctico donde se mostró como pueden usarse
circuitos integrados CDA de bajo costo para que, con apoyo de código, puedan reali-
zarse funciones más complejas como la conversión analógica digital. En la práctica los
voltímetros se construyen con CAD de doble pendiente, los cuales vienen integrados
en chips multifunción. Por ejemplo, además de la conversión proveen salidas en BCD e
incluso señales y temporización para la pantalla multiplexada.

El modo 0 del PPI 8255A también puede usarse para el control de periféricos
que requieran un protocolo de enlace sin uso de interrupciones. El ejemplo siguiente
ilustra el uso del PPI para la interconexión de un sistema 8085A a una impresora para-
lela.

Ejemplo 9.5

Realizar la interconexión de una impresora CENTRONICS a un µP8085A


usando un 8255A funcionando en el modo cero. Escribir una rutina para enviar al
periférico el carácter cuyo código ASCII se encuentra en el registro B.

CENTRONICS es un estándar usado por muchos años para enviar datos desde
un µC hacia una impresora paralela. Su uso es tan extendido que la mayoría de las
impresoras hasta hace dos años usaban este protocolo. Las impresoras modernas ofre-
cen además un puerto USB. EL puerto paralelo puede realizarse con un 8255A bajo el
control del programa de transferencia. La figura 9.18 muestra un diagrama de tiempos
de una transferencia CENTRONICS y en la figura 9.19 se indican las funciones de las
líneas del bus y su ubicación en el conector CANON DB-25.

Fig. 9.18. Transferencia de un carácter a una impresora usando el protocolo de enlace CENTRONICS.
Dispositivos de E/S Programables 526

Terminal Señal E/S 1 Función


Salida normalmente en nivel alto. Es
1 S puesta a cero por el µC durante 1 µs para
STB : DATASTROBE notificar que se envió un dato.
Salidas de los ocho bits de datos. Deben
2-9 DATA 0 – DATA 7 S ser estables al menos 0.5 µs antes y des-
pués del pulso STB .
Señal activa en bajo generada por la im-
10 E presora cuando está lista para recibir un
ACK : ACKNOWLEDGE nuevo carácter. Es generada cuando la
línea BUSY va a nivel bajo.
Entrada OCUPADA que indica la disponi-
11 BUSY E bilidad de la impresora. Está en nivel alto
cuando ésta no puede recibir datos.
Entrada que cuando está en nivel alto
12 PO: PAPER OUT E notifica que no hay papel en la bandeja de
la impresora.
Indica el estado de la impresora. Cuando
13 SLCT: SELECT E está en línea, la señal conmuta a uno
lógico.
ON LINE:
• Al energizar la impresora.
• Cuando se aplica un RESET .
• Al presionar el interruptor ON LINE.
OFF LINE:
• Impresora sin papel.
• Cubierta exterior abierta
• La impresora es colocada en OFF LINE.
Salida que indica con un nivel bajo si a
14 S cada comando de retorno de carro (CR) le
AFD : AUTOFEED XT seguirá uno de alimentación de línea (LF).
Activa en bajo por la ocurrencia de un
15 E error. Condiciones de error son:
ERROR
• Ausencia de papel en la bandeja.
• Impresora en OFF LINE.
• Estado de sobrecarga.
• Cubierta exterior abierta
16 S En cero inicializa la impresora. Detiene el
RESET equipo y borra el buffer de datos.
S Cuando es cero se selecciona la impresora.
17 SL Si está en nivel alto la transferencia de
datos no es aceptada.
18-25 TIERRA –

Fig. 9.19. Conector CANON DB25 hembra y descripción de las señales del estándar CENTRONICS.

1
Entrada/Salida con respecto al microcomputador
Dispositivos de E/S Programables 527

Nota:
La tarjeta de impresora debe tener resistores conectados a +5V en todas las entradas.

Fig. 9.20 Puerto de impresora


Dispositivos de E/S Programables 528

El protocolo CENTRONICS trasmite en paralelo los datos a imprimir y ade-


más presenta varias señales para que el µP controle la transferencia, y un grupo de
líneas de salida desde la impresora indican en cualquier momento el estado del perifé-
rico.

Como ilustra el diagrama de tiempos de la figura 9.18, el código ASCII del ca-
rácter a imprimir es presentado por el µP en las líneas de datos DATA0-7 y entonces se
examina la entrada BUSY para verificar, si está en cero lógico, que la impresora esté
disponible. En este caso, el procesador coloca en nivel bajo la salida STB durante al
menos 1 µs, para sincronizar la transferencia del dato. La impresora lee el dato durante
el flanco positivo de STB . Si la línea BUSY está en alto, porque la impresora está
ocupada, el µP permanecerá en espera hasta cuando BUSY retorne a cero. Cuando la
impresora ha aceptado un carácter, activa a cero durante 5 µs la señal de reconocimien-
to ACK .

Debido a que ACK es disparada en el flanco posterior de BUSY, puede ser


tratada como una notificación de lista para recibir un nuevo dato, al igual que BUSY.
Esto significa que durante la transferencia de datos a la impresora, ACK puede ser
ignorada y el programa sólo tiene que examinar si la impresora está libre, colocar el
dato y generar la señal STB .

El puerto de conexión a la impresora se muestra en la figura 9.20 Los bits del


carácter a imprimir se entregan por el PA del 8255A, el cual debe ser configurado para
operación en el modo 0. La salida BUSY de la impresora se aplica a la línea PC0 del
puerto de entrada C, y por el terminal PC4 se genera la señal de sincronización STB .
Se utilizan buffers de colector abierto en todas las salidas del 8255A. Los resistores de
colector se encuentran en el circuito de entrada a la impresora.

;----------------------------------------------------------------------------------------------------------------
; Rutina SAL_IMPR de salida a impresora

; Imprime bloque a partir de dirección 2000h


; Carácter de escape
; NULL Æ 0
;----------------------------------------------------------------------------------------------------------------
inic_blq equ 2000h ; Dirección de primer caracter a imprimir
pa_8255 equ 80h ; Puerto A
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
plbr_ctrl equ 83h ; Palabra de control. modo 0, PA:salida
; PCL:entrada, PCH:salida
stb_cero equ 8 ; Activar STB
stb_uno equ 9 ; Desactivar STB
escap equ 0 ; Caracter de escape.
;----------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 529

mvi a,plbr_ctrl
out pctrl_8255 ; Se programa 8255A
mvi a,stb_uno
out pctrl_8255 ; STB se pone a uno
lxi h, inic_blq ; Apuntar primer caracter a imprimir
prox: mov b,m ; Caracter de memoria a registro B
mov a,b ; Examinar caracter
cpi escap ; ¿Es el byte de escape?
jz cont ; Si, continuar programa principal
call sal_impr ; No, Imprimir byte en registro B
inr l ; Apuntar siguiente caracter
jmp prox ; Continuar impresión
cont: ;.
;.
;.
sal_impr: in pc_8255 ; Leer estado de BUSY
ani 1 ; Poner máscara
jnz sal_impr ; Si BUSY es alto, esperar
mov a,b ; BUSY es cero
out pa_8255 ; Enviar caracter a impresora
mvi a,stb_cero
out pctrl_8255 ; Poner señal STB en cero
mvi a,stb_uno
out pctrl_8255 ; Desactivar línea STB
ret
;----------------------------------------------------------------------------------------------------------------

El código anterior imprime un bloque de memoria de una página máximo y


continúa ejecutando el código de usuario. El carácter NULL señala el final del bloque a
imprimir. La rutina de salida a impresora examina el estado de la línea BUSY. Si está
en nivel alto, se mantiene la prueba hasta cuando BUSY retorne a cero. En este mo-
mento, conmuta a cero lógico la línea STB , la cual se mantiene en bajo por un tiempo
superior a 1 µs, instante cuando se retorna al programa principal.

Con el ejercicio 9.5 finalizan los ejemplos de operación del 8255A en modo
cero. Lo presentado es una muestra pequeña que en modo alguno agota las posibilida-
des del uso práctico del modo cero en combinación con el programa para control de
periféricos. Este modo puede usarse para el control de motores por paso o servomoto-
res o para el control de de la potencia suministrada a cargas de corriente alterna.

Operación en el modo 1
El último ejemplo del modo 0, fue una muestra de una operación de entrada y
salida con un periférico que requiere un protocolo de enlace para realizar las transfe-
rencias. El modo 1 de operación está especialmente diseñado para la realización de
transmisiones y recepciones de información, usando señales de dialogo generadas por
el microprocesador y por el equipo de E/S. En este caso, la transferencia desde/hacia
Dispositivos de E/S Programables 530

los puertos A y B es controlado por un protocolo de enlace, realizado usando los termi-
nales del puerto C.

Como se expuso en páginas anteriores ambos grupos A y B pueden progra-


marse para funcionamiento en este modo, como se indica a continuación:

• Grupos A y B.

• Cada grupo con un puerto de 8 bits de datos y puerto de 4 bits de control/datos.

• Los puertos de 8 bits (PA y PB) pueden ser entradas o salidas, ambas con retención.

• El puerto de 4 bits (PCH y PCL) se usa para control/estado del puerto de datos de 8 bits.

Modo 1: Entrada

La figura 9.21muestra los formatos de la palabra de entrada para la configura-


ción de los grupos A y B para operación en el modo 1. Observe que tanto el puerto A
como el B se programan como entradas, si ambos grupos operan en modo 1. Tres bits
de PCH o de PCL se usan para controlar la transferencia de datos desde el periférico
hacia el sistema a través de los puertos PA y PB, respectivamente. Las dos líneas res-
tantes, PC6-7, del puerto C quedan disponibles para ser usadas como líneas de E/S.

Fig. 9.21 Formatos de palabra de control para operación en el modo 1 de entrada.


Dispositivos de E/S Programables 531

Aunque en este caso se considera que ambos grupos se configuran en el modo


1 de entrada, en la práctica pueden programarse una combinación de modo 1, en cuyo
caso uno de los grupos se programa como entrada y el otro como salida. La función
de las señales de control y el diagrama de tiempo de una transferencia de entrada en
el modo 1 se muestra en la figura 9.22.
Cuando se activa esta entrada el dato entregado por el periférico es cargado en el
STB Strobe Input registro latch del puerto de entrada.

Salida que notifica la presencia de un dato en el registro de entrada. Es una señal


de reconocimiento activada como respuesta a la entrada STB y es llevada a cero
IBF Input Buffer Full
cuando el µP lee el puerto.

Salida puesta a 1 cuando STB retorna a nivel alto, IBF es uno y el bit INTE está
en 1. Regresa a 0 cuando el puerto es leído por el µP. Este modo de operación
INTR Interrupt Request permite que con solo cargar un dato en el puerto, un periférico interrumpa al
CPU.
Las interrupciones deben estar habilitadas por:
INTE A: bit set/reset de PC4
INTE B: bit set/reset de PC2
PC7 y PC6 Líneas disponibles para E/S.

Fig. 9.22. Entrada en modo 1.

El modo 1 de operación permite que el dato desde el periférico se almacene en


el puerto A o en el puerto B hasta cuando el µP pueda leerlo. Al inicio de la transfe-
rencia, el periférico coloca el dato en los terminales del puerto de entrada y pone en
nivel bajo al línea STB para cargar el byte en el registro de entrada. A continuación,
una señal de reconocimiento IBF se pone en alto para indicar la presencia de un dato
en el latch de entrada. Al retornar STB a uno lógico, se dispara la señal INTR de so-
licitud de interrupción, si las interrupciones están habilitadas.

El µP puede detectar cuando el periférico transmite un dato, mediante un pro-


grama que examine el estado de IBF o al ser interrumpido por INTR. El flanco de
Dispositivos de E/S Programables 532

subida de RD desactiva la señal IBF, mientras que el flanco de caída de RD remue-


ve la solicitud de interrupción. Observe que en el modo de interrupción, la solicitud
es realizada con sólo cargar el dato en el registro de entrada.

Ejemplo 9.6

Escriba una rutina para leer un dato desde un dispositivo de entrada. Cada vez
que el periférico coloca un byte en las líneas del puerto de entrada, genera un pulso
negativo.

Esta situación es apropiada para el uso del modo 1. Como ilustra el diagrama
simplificado de la figura 9.23, las salidas de datos se aplican al PB configurado como
entrada y la señal de sincronización DATO LISTO se conecta al terminal PC2 o STB B .

Fig. 9.23 Entrada en modo 1.

Si el periférico es un teclado, este entregará al puerto B el código ASCII y una


señal de habilitación a PC2 cada vez que una tecla es presionada. Los circuitos elec-
trónicos asociados al teclado, detectan la prsión de la tecla, la identifican, le asignan
el código correspondiente, suprimen el efecto de los rebotes de contactos y protegen
contra la pulsación simultánea de varios pulsadores. El siguiente programa carga el
dato D0-D7 en el registro acumulador, cada vez que una tecla es activada.
;--------------------------------------------- ------------------------------------------------------------------
; Rutina de lectura de teclado
;--------------------------------------------- ------------------------------------------------------------------
pb_8255 equ 81h ; Puerto B
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
plbr_ctrl equ 10000110b ; Palabra de control. Modo 1, PB:entrada
;--------------------------------------------- ------------------------------------------------------------------
teclado: mvi a,86H ;Puerto B, Modo 1:Entrada
out pctrl_8255
exam_IBF: in pc_8255 ;Leer puerto C
ani 2 ;Examinar IBF
jz exam_IBF ;Si IBF=0, registro vacío
in pb_8255 ;Si IBF=1, leer el latch de PB
ret
;--------------------------------------------- ------------------------------------------------------------------
Dispositivos de E/S Programables 533

Modo 1: Salida

El puerto A o el B se configuran como salidas y tres señales del puerto PCH o


PCL, respectivamente, controlan la salida de datos hacia el periférico. Al igual que el
el modo 1 de entrada, pueden usarse interrupciones durante la transferencia.

En la figura 9.24 se muestran las señales de control del puerto C para cada
grupo y el formato de la palabra de control para los grupos A y B.

Fig. 9.24. Formatos de palabra de control para operación en el modo 1 de salida.

Las funciones de las señales de control y el diagrama de tiempo de la transfe-


rencia de datos en el modo 1 de salida, se muestran en la figura 9.25.

Observe que cada vez que el µProcesador escribe un dato en el puerto A o en


el puerto B, la salida OBF respectiva, conmuta a nivel bajo para indicar existe un
dato disponible en el registro de salida. Esto ocurre durante el flanco de subida de
WR .

Cuando el periférico acepta el dato, coloca en estado cero la señal de recono-


cimiento ACK , la cual desactiva la línea OBF notificando que el dato fue recibido y
que el registro está vacío. La señal INTR puede usarse para interrumpir al µP cuando
el periférico ha leído el dato enviado por la CPU. El terminal INTR es puesto a 1
Dispositivos de E/S Programables 534

cuando la salida de reconocimiento ACK , la línea de indicación de latch lleno OBF y


el bit INTE, son todas uno. Es llevada a cero, por el flanco de caída de WR .

Salida en nivel bajo cuando el µP escribe un dato en el puerto A o B. Es activada


OBF por el flanco posterior de WR y desactivada por el flanco de bajada de la señal de
Output Buffer Full
reconocimiento ACK generada por el periférico.
El dispositivo externo pone a nivel bajo está entrada para indicar al µP que el dato
en el puerto A o B ha sido recibido.
ACK
Acknowledge Input

Salida activa cuando ACK conmuta a nivel alto, OBF es uno y el bit INTE está
en 1. Regresa a 0 cuando el el µP escribe un dato en el puerto. Este modo de opera-
INTR Interrupt Request
ción permite interrumpir al CPU cuando un periférico acepta un dato transferido
por el µP. Las interrupciones deben estar habilitadas por:
INTE A: bit set/reset de PC4
INTE B: bit set/reset de PC2
PC4 y PC5 Líneas disponibles para E/S.

Fig. 9.25. Formatos de palabra de control y diagrama de tiempos de salida en modo 1

Ejemplo 9.7

Usar el modo 1 de salida, para enviar un bloque de datos a una impresora pa-
ralela. Escribir la rutina de salida de datos a la impresora.

Como puede verse en la figura 9.26, para la interconexión a la impresora se


usa el grupo A, programado en el modo 1. La impresora recibe el código ASCII del
carácter a imprimir por las 8 líneas del puerto A. Para la línea de sincronización de
transmisión de datos STB del puerto CENTRONICS, se usa el bit PC5. Aunque la
señal OBF indica que existe un dato válido en el registro de salida, ésta no puede ser
Dispositivos de E/S Programables 535

usada como STB , porque se requiere un pulso para indicar a la impresora que hay un
dato listo. Por tal razón se usa PC5.

Una vez que la impresora acepta el dato genera la señal de reconocimiento


ACK para indicar que está lista para recibir otro dato. Esta salida se conecta a la en-
trada ACK A o PC6 del 8255A y cuando se activa retorna a nivel alto a OBF .

Fig. 9.26. Salida a impresora en modo 1

El programa examinará OBF para detectar si la impresora está disponible.


Esto ocurre cuando la impresora acepta el dato y borra el registro de salida. Con la
impresora libre el µP carga el dato en el registro de salida PA y genera por PC5 el
comando STB . El código de la rutina se muestra a continuación.

;----------------------------------------------------------------------------------------------------------------
; Rutina SAL_IMPR de salida a impresora

; Imprime bloque a partir de dirección 2000h


; Carácter de escape
; NULL Æ 0
;----------------------------------------------------------------------------------------------------------------
inic_blq equ 2000h ; Dirección de primer caracter a imprimir
pa_8255 equ 80h ; Puerto A
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
plbr_ctrl equ 0A0h ; Palabra de control. modo 1, PA:salida
; PCH:salida
stb_cero equ 10 ; Activar STB
stb_uno equ 11 ; Desactivar STB
escap equ 0 ; Caracter de escape.
;----------------------------------------------------------------------------------------------------------------
mvi a,plbr_ctrl
out pctrl_8255 ; Se programa 8255A
mvi a,stb_uno
out pctrl_8255 ; STB se pone a uno
lxi h, inic_blq ; Apuntar primer caracter a imprimir
Dispositivos de E/S Programables 536

prox: mov b,m ; Caracter de memoria a registro B


mov a,b ; Examinar caracter
cpi escap ; ¿Es el byte de escape?
jz cont ; Si, continuar programa principal
call sal_impr ; No, Imprimir byte en registro B
inr l ; Apuntar siguiente caracter
jmp prox ; Continuar impresión
cont: ;.
;.
;.
sal_impr: in pc_8255 ; Leer estado de OBF
ani 80h ; Poner máscara
jnz sal_impr ; Si OBF es bajo, esperar
mov a,b ; OBF es cero
out pa_8255 ; Enviar caracter a impresora
mvi a,stb_cero
out pctrl_8255 ; Poner señal STB en cero
mvi a,stb_uno
out pctrl_8255 ; Desactivar línea STB
ret
;----------------------------------------------------------------------------------------------------------------

Operación en el modo 2
Es el modo de transferencia bidireccional sobre los terminales del puerto A.
Ejemplos del uso de este modo de operación es la interconexión con un controlador
de discos flexibles, transferencias paralelas con el estándar para instrumentación de
propósito general GPIB (IEEE-448) y para la comunicación entre computadores. En
la figura 9.27 se muestran las señales asociadas al modo 2 y la palabra de control para
operación en ambas direcciones.

Fig. 9.27. Palabra de control y señales asociadas con el modo 2 de operación.


Dispositivos de E/S Programables 537

Salida en nivel bajo cuando el µP escribe un dato en el puerto A


OBF indicando que el latch de salida está lleno.
Output Buffer Full
Entrada que en cero lógico habilita los buffer de tres estados de
ACK salida del puerto A. Si ACK está en alto, las salidas de PA perma-
Acknowledge Input necen en alta impedancia.

Cuando se activa esta entrada el dato entregado por el periférico es


STB Strobe Input cargado en el registro latch del puerto A-

IBF Un alto en esta salida indica que un dato ha sido cargado en el


Input Buffer Full registro de entrada.

Salida activa que en nivel alto puede usarse para interrumpir al µP


durante transferencias tanto de entrada como de salida.
INTR Interrupt Request INTE 1: Bit set/reset PC6
INTE 2: Bit set/reset PC4

PC2, PC1 y PC0 Líneas disponibles para E/S controladas por bit set/reset.

Fig. 9.28. Formatos de palabra de control y diagrama de tiempos para el modo 2

Debido a que la conexión de una unida de disquetes al sistema y la comunica-


ción interprocesador son aplicaciones fuera del alcance de este trabajo, el siguiente
ejemplo se limita a la presentación de rutinas de transmisión y recepción en el modo
de operación 2.
Dispositivos de E/S Programables 538

Ejemplo 9.8

1. Escribir un programa que transmita por las líneas bidireccionales del puerto
A el dato cargado en el registro acumulador.

2. Una rutina debe recibir por las líneas bidireccionales del puerto A el dato
enviado por un dispositivo externo.

Sin mayores comentarios se presenta el código de transferencia en el modo 2


de operación.

;-----------------------------------------------------------------------------------------------------------
; Ejemplo en modo 2
;-----------------------------------------------------------------------------------------------------------
pa_8255 equ 80h ; Puerto A
pc_8255 equ 82h ; Puerto C
pctrl_8255 equ 83h ; Registro de control
;-----------------------------------------------------------------------------------------------------------
; Programa principal

mvi a,plbr_ctrl
out pctrl_8255 ; Se programa 8255A
;.
;.
;.
;-----------------------------------------------------------------------------------------------------------
; Rutina TRASM. Transmite el dato en el registro B por las líneas del puerto A
;-----------------------------------------------------------------------------------------------------------
trasm: in pc_8255 ; Leer puert C
ani 80h ; Examinar OBF
jz trasm ; Si OBF es 0, registro de salida lleno
mov a,b ; Si OBF es 1. Próximo dato al acumulador
out pa_8255 ; Transmitir byte
ret
;-----------------------------------------------------------------------------------------------------------

; Rutina RECIB. Recibe el dato por las líneas del puerto A y lo retorna en el acumulador
;-----------------------------------------------------------------------------------------------------------
recib: in pc_8255 ; Leer puerto C
ani 20h ; Examinar IBF
jnz recib ; Si IBF es 0, registro de entrada vacío
in pa_8255 ; Si IBF es 1, leer dato
ret
;----------------------------------------------------------------------------------------------------

El lector debe haber notado que para detectar el estado de las señales de con-
trol, en los modos de operación 1 y 2, basta con realizar una lectura convencional del
puerto C. La figura 9.29 muestra los formatos de la palabra de estado para los modos
1 y 2.
Dispositivos de E/S Programables 539

Fig. 9.29. Formatos de las palabras de estado para los modos 1 y 2.

9.2 DISPOSITIVO 8155: SRAM/PUERTOS DE E/S/TIMER

Es conocido por el lector, que el circuito integrado 8155/56 es un dispositivo


de funciones múltiples, diseñado para compatibilidad pin a pin con el µP 8085A. Es
fabricado por varias empresas, en incluso la compañía INTERSIL ofrece una versión
(HS-81C55RH) con alta resistente a la radiación cósmica, destinada al diseño de ins-
trumentos y controles que viajan al espacio.

Fig.9.30. El dispositivo multifunción 8155.


Dispositivos de E/S Programables 540

Los recursos ofrecidos por el 8155/56 son:

• 2Kbits de memoria RWM estáti-


ca arregladas como 256x8 bytes.
• 2 puertos programables de 8 bits
para E/S.
• 1 puerto programable de 6 bits
para E/S.
• 1 temporizador/contador binario
programable de 14 bits.
• Registro latch interno controlado
por ALE para decodificar el by-
te bajo de direcciones.
• Registro de comando/estado

Fig.9.31. Secciones del 8155/56

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8155

VCC +5V

GND Tierra
Un nivel bajo en este terminal permite la comunicación entre el µP y el 8155. Para el 8156 esta entrada
CS es activa en alto.

WR Esta entrada en cero con CS activado causa que el byte en el bus multiplexado sea escrito en la RAM
o en los puertos de E/S y registro comando/estado, dependiendo de la entrada IO / M .
RD Esta entrada en cero con CS activado habilita los buffers de salida AD0-AD7. Si el terminal
IO / M está en nivel bajo el contenido de la posición de RWM seleccionada será cargado en el bus de
datos/direcciones. En caso contrario el contenido de un puerto de E/S o del registro de estado será
colocado en el bus multiplexado.
Selecciona la RWM si es cero y los puertos de E/S y el registro comando/estado si está en alto.
IO/ M
AD0-AD7 Es el bus de datos/direcciones bidireccional y tres estados por medio del cual se transfieren comandos
y/o datos entre el 8155 y el µP. Los ocho bits bajos de las direcciones se cargan en el latch interno
durante el flanco de bajada de la señal ALE.
Un nivel alto en esta entrada durante al menos dos pulsos de reloj inicia el registro de control con todos
RESET los puertos en el modo de entrada.
ALE En el flaco de caída de esta entrada se carga dentro del chip el estado de las líneas de dirección AD0-
AD/, CS e IO / M .
PA0-PA7 Puerto A: Ocho líneas de E/S de propósito general. La dirección es programada escribiendo en el
registro de comando.
PB0-PB7 Puerto B: Ocho líneas de E/S de propósito general. La dirección es programada escribiendo en el
registro de comando.
PC0-PC7 Puerto A: seis líneas de E/S de propósito general o pueden usarse como líneas de control para transfe-
rencia del pA y B en los modos ALT3 y ALT4. Los modos de operación se programan escribiendo en
el registro de comando.
TIMER IN Entrada al temporizador contador. Usualmente se conecta el reloj del µP aunque puede conectarse
cualquier señal digital con frecuencia menor o igual a fclk

TIMER OUT Salida de onda cuadrada o pulso según el modo seleccionado para el temporiza-
dor..
Dispositivos de E/S Programables 541

El acceso a la zona de memoria RWM, con IO / M en nivel bajo, o a los puer-


tos de E/S, cuando IO / M conmuta a nivel alto, se realiza a través del bus multiplexa-
do AD0-AD7, bajo el control de las señales: ALE, la cual indica si el bus contiene
datos o direcciones, y WR y RD que señalan cuando el acceso corresponde a una
operación de escritura o de lectura.
Como ilustra la figura 9.32, el dispositivo 8155 contiene una memoria RAM
estática de 256 bytes y siete registros internos. Estos son: dos puertos de E/S: PA y
PB de 8 bits, un puerto PC de 6 bits, los registros de comando/estado (C/S) para la
programación y examen del estado del dispositivo, y un contador/temporizador de 14
bits. El circuito integrado no requiere lógica externa para conectarse al μP 8085, el
estado lógico de la señal IO / M distingue cuando la dirección presente en las líneas
AD0-AD7 corresponde una posición de la memoria SRAM o hace referencia a uno de
los registros internos del circuito.

La entrada ALE se aplica a un registro latch interno para demultiplexar el byte


de orden bajo A0-A7 del bus de direcciones, una dirección válida se presenta en las
líneas de direcciones en el flanco anterior de ALE, mientras que esta información, y
los estados de IO / M y CS se aplican a la lógica interna del chip durante el flanco
posterior de ALE.

9.2.1 Sección de entrada y salida del 8155

Las direcciones asignadas a los registros internos del 8155 se muestran en la


tabla 9.3 y en el capítulo 5 se expone todo lo relacionado con el diseño del decodifi-
cador de direcciones para el 8155/56.
Tabla. 9.3 Direcciones de los registros internos del 8155
Dirección del Puerto de E/S
Registro seleccionado
AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
x x x x x 0 0 0 Registro de Comando/Estado
x x x x x 0 0 1 Puerto A de E/S
x x x x x 0 1 0 Puerto B de E/S
x x x x x 0 1 1 Puerto C de E/S
x x x x x 1 0 0 8 bits de orden bajo del temporizador/contador
x x x x x 1 0 1 6 bits de orden alto del temporizdor/contador
y 2 bits del modo temporizador.

El 8155/56 tiene tres puertos programables de E/S. Los puertos A y B son de 8


bits y pueden ser usados para transferencias de E/S controladas por programa según el
modo programado en el circuito. Los 6 bits del puerto C pueden a su vez funcionar
como entradas o salidas de propósito general o como líneas de control y estado para
transferencias sobre el puerto A y B, de acuerdo con la configuración del 8155.
Dispositivos de E/S Programables 542

Registro de comando

Los registros de comando y de estado tienen la misma dirección, pero son uni-
dades independientes. La información transferida al registro de comando durante una
operación de escritura en puerto, permite programar las funciones de los puertos de
E/S, de acuerdo con el formato de palabra mostrado en la figura 9.32 Los bits 0 a 3
definen el modo de los puertos, los bits 4 y 5 habilitan o no las interrupciones desde
el puerto C cuando éste es usado como puerto de control y los dos bits más a la dere-
cha son destinados para el control del temporizador.

Fig. 9.32 Formato de la palabra de control del 8155.

El puerto A puede ser usado como entrada o salida según establezca el bit 0 de
registro C/S, y de acuerdo con las función seleccionada para el puerto C, puede fun-
cionar en el modo básico de E/S o en el modo con protocolo de enlace. El puerto B
tiene las mismas características mencionadas para el puerto A. Su dirección la esta-
Dispositivos de E/S Programables 543

blece el estado del bit 1 del registro de C/S. Las seis lineas del puerto C pueden con-
figurarse como entradas o salidas convencionales (ALT1 Y ALT2) o como señales de
control de los puertos PA y PB (ALT3 y ALT4) de acuerdo con el estado de los bits 2
y 3 del registro de comando.

Los modos de funcionamiento del puerto C o ALTn (alternatives) se presentan


a continuación.

Tabla. 9.4 Modos del puerto C


TERMINAL ALT1 ALT2 ALT3 ALT4
PC0 ENTRADA SALIDA INTRA INTRA
PC1 ENTRADA SALIDA BFA BFA
PC2 ENTRADA SALIDA STB A STB A
PC3 ENTRADA SALIDA SALIDA INTRB
PC4 ENTRADA SALIDA SALIDA BFB
PC5 ENTRADA SALIDA SALIDA STB B

INTR: Salida de SOLICITUD DE INTERRUPCIÓN del puerto A o B. Un alto en esta línea


indica que el periférico ha enviado un dato pero este aún no ha sido leído por el µP o
que el dato escrito en el puerto por la CPU ha sido aceptado por el periférico.

BF: Salida BUFFER LLENO que en nivel alto notifica que un dato ha sido cargado en
por el µP/periférico en el latch del puerto pero aun no ha sido transferido al periféri-
co/µProcesador.

STB : Entrada STROBE que se activa en nivel bajo para indicar la disponibilidad de un
dato de entrada o la aceptación de un dato de salida.

Los modos que usan el puerto C para controlar la transferencia a los puertos A
y B son ALT3 (solo puerto A) y ALT4 (puertos A y B). Cuando se usan estos modos
tres bits del puerto C se asignan a control del puerto A y los tres restantes al puerto B.
En el modo ALT3 donde solo se controla el puerto A, los bits PC3-5 funcionan como
salidas. En las figuras 9.36 se muestran los diagramas de tiempos para transferencias
de E/S bajo control del puerto C.

Como se observa en los diagramas de tiempos de la figura 9.33, el funciona-


miento en los modos ALT3 y ALT4 es similar al modo 1 del 8255A. La única diferen-
cia es en la nomenclatura de las señales. Por ejemplo, la señal de buffer lleno se de-
nomina BF tanto para entrada como para salida (OBF e IBF en el 8255A) y la señal
de reconocimiento en modo salida, llamada ACK en el 8255, se nombra STB para el
8155.

Dada la similitud en los modos de operación de ambos dispositivos, se consi-


dera que los ejemplos presentados para el 8255, operando en los modos 0 y 1, pueden
adaptarse con facilidad al 8155.
Dispositivos de E/S Programables 544

Fig. 9.33 Formas de ondas para transferencias de entrada y salida bajo el control del puerto C.

Registro de estado

Una operación de lectura al registro de estado de siete bits, entrega informa-


ción de estados de los puertos de E/S y el temporizador. El programa puede examinar
esta información en cualquier momento. El µP no puede escribirse sobre este registro,
porque al compartir la misma dirección con el registro comando, la escritura sería a
este último. El formato de la palabra de estado se muestra en la figura 9.34.

Una lectura del registro de estado puede indicar si en el latch de entrada o sa-
lida existe un dato aun no transferido al receptor, el estado de las líneas de interrup-
ciones y si éstas están habilitadas. Pudiéndose además detectar cuando el temporiza-
Dispositivos de E/S Programables 545

dor contador llega a la cuenta final después de haber sido iniciado. Esto último se
logra detectando el estado del bit 6 del registro de estado.

Fig. 9.34. Formato de la palabra de estado del 8155.

Ejemplo 9.9

Se debe controlar la presentación de información alfanumérica en una pantalla


de cristal líquido.

Fig. 9.35. Pantalla de cristal líquido conectada a un 8155.


Dispositivos de E/S Programables 546

1. Realizar la interconexión a un sistema 8085A, de un módulo de cristal lí-


quido de 16x2 caracteres (controlador HD44780U), basándose en el dia-
grama simplificado de la figura 9.35.

2. Escribir el programa de control de presentación, e imprima la temperatura


en dos puntos de un proceso. Los valores de temperatura son de dos dígitos
y está almacenados a partir de la dirección de memoria MEM. El dígito
más significativo en la posición más baja. El formato de presentación es el
de la figura 9.36.

Fig. 9.36. Valores de temperatura y estado del proceso.

Solución:

La pantalla LCD de la figura 9.36 es de 16x2 caracteres, lo cual significa que


puede presentar 2 líneas de 16 caracteres cada una. El carácter se construye en una
matriz de 5x7 puntos Existe un gran número de módulos LCD producidos por dife-
rentes fabricantes y existe un estándar que facilita la interconexión entre el dispositi-
vo y un µP o µCtrl, independientemente del modelo. Tal estándar se conoce como
HD44780U.

Este es un sistema microcontrolador y manejador de pantallas LCD, para pre-


sentación de caracteres alfanuméricos y símbolos. Esta unidad provee todas las fun-
ciones como memoria de presentación, generador de caracteres y los manejadores de
cristal líquido necesarios para el control de una matriz de puntos, por lo cual se sim-
plifica la interconexión del LCD con el sistema procesador.

Como ilustra la figura 9.35, para comunicarse con el módulo LCD se requie-
ren tres líneas de control: E, RS, R / W y ocho líneas para datos y comandos. El códi-
go de la aplicación puede programar al dispositivo para operación con datos de 4 bits,
en cuyo caso sólo serán necesarias siete líneas de interconexión. Las funciones y dis-
tribución de los terminales del dispositivo LM032L se muestran en la figura 9.37.

El HD44780U tiene dos registros de 8 bits:


Registro de Datos (DR)
Contiene temporalmente los datos a ser leídos o escritos en la memoria RAM
de datos a presentar (DDRAM: Display Data RAM) y en la memoria RAM del
Dispositivos de E/S Programables 547

VDD: Alimentación de 2.7 V a 5.5 V.


VSS: Tierra.
VEE: Regulación de contraste de la pantalla (0-5 V)
RS: Selects registers.
Cuando es 0 se escriben comandos en el registro de instrucción (IR) o se leen desde IR el esta-
do de la bandera de ocupado y del contador de direcciones.
Cuando es 1 se escribe o lee desde el registro de datos (DR)
R/ W : Read/Write
Selección de operaciones de lectura y escritura.
0: Escritura.
1: Lectura.
E: Enable.
Inicia las operaciones de lectura y escritura.
D4-D7: Nibble mas significativo del bus de datos bidireccional. Comunica el µP con el HD44780U. El
bit D7 puede usarse como bandera de ocupado.
D0-D3: Nibble bajo del bus de datos bidireccional. Comunica el µP con el HD44780U. Estas 4 líneas
no se usan durante el modo de operación con transferencias de 4 bits.

Fig. 9.37. El dispositivo LM032L usa el estándar HD44780U.

generador de caracteres (CGRAM: Character Generador RAM). La CGRAM


contiene caracteres definidos por el usuario.

Cualquier información cargada en el DR por el µP, es almacenada automáti-


camente en la DDRAM o en la CGRAM. Cuando el µP lee datos desde la
DDRAM o CGRAM, estos son transferidos al DR.

Registro de Instrucciones (IR)

Almacena los códigos de las instrucciones, como por ejemplo: limpiar panta-
lla, ocultar cursor o desplazar cursor; y direcciones para la DDRAM o la
CGRAM. Cuando una dirección es escrita en el IR, un dato es leído desde la
DDRAM o CGRAM y cargado en el DR para ser transferido al µP. Una vez
que el µP lee el dato, el contenido de la siguiente posición de la memoria se
envía al DR para una próxima lectura por el sistema.

La línea de control RS permite seleccionar uno de los registros como indica la


tabla 9.5.
Dispositivos de E/S Programables 548

Tabla. 9.5. Selección de registros.


RS R/ W OPERACIÓN
0 0 Escritura de instrucción o dirección en el IR
Lectura de la bandera de ocupado BF (D7) y del conta-
0 1
dor de direcciones (D0-D6).
Escritura en el DR (Dato desde el DR a la DDRAM o
1 0
CGRAM)
Lectura del DR (Dato desde DDRAM o CGRAM hacia
1 1
el DR)

Cuando el HD44780U está realizando una operación interna, la bandera de


ocupado estará en alto y el controlador no aceptará transferencia alguna hasta cuando
BF retorne a nivel bajo. Como se expone en la tabla 9.5, el estado de BF y del conta-
dor de direcciones puede ser examinado por el programa.

El contador de direcciones (AC:Address Counter) es un apuntador de direc-


ciones para la DDRAM y la CGRAM. Cuando el µP escribe la dirección de una ins-
trucción en el IR, ésta es cargada en el AC. La propia instrucción especifica si el des-
tino es la DDRAM o la CGRAM. El AC es incrementado/disminuido en 1, por cada
operación de escritura/lectura.

El diagrama de tiempos de una operación de escritura al módulo LCD se pre-


senta en la figura 9.39. Una escritura en el módulo, puede tener dos propósitos: uno,
la presentación de un caracter ASCII en la pantalla (Operación de escritura al DR con
RS =1); el otro, la ejecución de una instrucción (Borrar pantalla, por ejemplo. Opera-
ción de escritura en el IR con RS =0). El procedimiento implica: poner RS en el esta-
do correspondiente, llevar la línea R / W a cero, poner la entrada E en alto, cargar el
dato en el bus D0-D7 y retornar E a cero lógico. En la práctica está secuencia no es
crítica. Por ejemplo, se puede activar E, fijar el estado de RS y R / W , colocar el da-
to, y al final retornar a cero la línea E. Es en realidad el flanco de caída de la señal E,
el evento que ejecuta las operaciones internas.

La memoria de datos a presentar o DDRAM contiene los códigos de 8 bits de


los caracteres en pantalla. Su máxima capacidad son 80 caracteres. Todo texto escrito
en el HD44780U se almacena en esta memoria y el µCtrl a continuación leerá la
DDRAM y presentará el mensaje en el LCD. Para el dispositivo de 16x2 caracteres, la
DDRAM puede representarse con el siguiente mapa de memoria.

Fig. 9.38. Memoria DDRAM


Dispositivos de E/S Programables 549

Fig. 9.39. Ciclo de escritura en el HD44780U.

El área más oscura en la figura 9.38 corresponde a los caracteres visibles o


16x2 caracteres, y el número indica la dirección de la memoria que corresponde a
cada posición en la pantalla. El primer caracter pertenece a la posición 0, el segundo a
la 1 y así sucesivamente.

Si escribimos un carácter el la dirección 0FH, éste aparecerá en la ultima posi-


ción de la línea 1, el siguiente carácter enviado no aparecerá al comienzo de la segun-
da línea (dirección 40H) debido a que fue escrito en la dirección 10H. En este caso
antes de enviar el caracter debe ejecutarse un comando que desplace el cursor hacia la
primera posición de la línea 2. El área que no se usa para presentar caracteres puede
usarse como RAM de propósito general. Los caracteres imprimibles se muestran en la
tabla de la figura 9.40.

Las instrucciones disponibles, sus códigos y el número de ciclos de reloj in-


vertidos en la ejecución de cada una, se muestran en la tabla 9.6.
Dispositivos de E/S Programables 550

Fig. 9.40. Patrones en la ROM del generador de caracteres.


Dispositivos de E/S Programables 551

Tabla. 9.6. Conjunto de instrucciones del módulo LCD.

I/D: 1 = Avance del cursor.


0 = Retroceso del cursor.

S: 1 = Desplaza el contenido de la pantalla con cada nueva escritura de dato.


0 = Presentación normal.

D: 1 = Pantalla activada.
0= “ apagada.

C: 1 = Cursor está activo.


0 = Cursor oculto.

B: 1 = Cursor parpadea si está activo.


0 = Cursor normal.

S/C: 1 = Desplaza el contenido de la pantalla.


0 = Mueve el cursor.

R/L: 1 = Desplazamiento hacia la derecha.


0= “ “ “ izquierda.

BF: 1 = Módulo LCD está ocupado.


0 = Dispositivo libre para aceptar comandos o datos.

DL: 1 = Bus de 8 bits.


0 = Bus de 4 bits.

N: 1 = Presenta 2 líneas de caracteres.

0 = Muestra 1 línea de caracteres.

F: 1 = Caracteres de 5 x 10 puntos.
0= “ “ 5 x 7 puntos.
Dispositivos de E/S Programables 552

Configurando el módulo LCD

Antes de usar la pantalla de cristal líquido, el HD44780U debe ser configura-


do por medio de una secuencia de instrucciones enviada al controlador del módulo.
En principio, se usa la instrucción Function Set para especificar que se usa un ancho
de 8 bits para el bus de datos, 2 líneas de caracteres y una matriz de 5x7 puntos. Esto
se corresponde con el byte 38H=000011102, como se deduce de la tabla 9.6.
La instrucción siguiente de la secuencia de inicio corresponde al comando
0EH=000011102 de la instrucción Display Control, la cual activa la pantalla y mues-
tra el cursor. Finalmente, un comando 06H=000001102 de la instrucción Entry Mode
Set, establece, que cada vez que se presente un nuevo carácter, la posición del cursor
se mueva hacia la derecha.

Para borrar la pantalla en cualquier momento, se ejecuta Clear Display, cuyo


código es 01H=000000012. Esta orden limpia la pantalla y coloca al cursor en la po-
sición del primer carácter de la primera línea. Si se escribe en la línea 1 y se desea
que el carácter que sigue se presente en la posición 5 de la segunda línea se usa la
función Set DDRAM Addr o C5H=110001012 (Dirección DDRAM= 45H).

El manual de usuario del HD44780U especifica que un circuito interno de


RESET inicia dispositivo, al aplicársele energía. En este caso, se ejecuta una sucesión
de instrucciones que lleva al módulo LCD, por defecto, a un estado inicial. También
se indica, que si no se satisfacen las condiciones de la fuente de alimentación para la
operación del circuito de RESET interno, el programa de la aplicación deberá ejecutar
las instrucciones de configuración del LCD. La secuencia de inicio por instrucciones,
sugerida por el fabricante, para el modo de 8 bits, es la siguiente:
Esperar 15 ms después que VCC alcance 4.7 V.
Ejecutar la instrucción Function Set (30H: bus 8 bits).
Esperar al menos 4.1 ms.
Ejecutar la instrucción Function Set (30H: bus 8 bits).
Esperar al menos 100 µs.
Ejecutar la instrucción Function Set(* ) (30H: bus 8 bits).
Esperar al menos 40 µs.
Ejecutar la instrucción Function Set (38H: bus 8 bits, 2 líneas matriz 5x7).
Esperar al menos 40 µs.
Ejecutar la instrucción Display Control (08H: pantalla y cursor desactivados).
Esperar al menos 40 µs.
Ejecutar la instrucción Clear Display (01H: borrar pantalla).
Esperar al menos 1.64 ms.
Ejecutar la instrucción Display Control (0EH: Activar pantalla y mostrar cursor).
Esperar al menos 40 µs.
Ejecutar la instrucción Entry Mode set (06H:Auto incremento. Avanzar el cursor).
Esperar al menos 40 µs.
* Antes de esta instrucción los tiempos de espera deben cumplirse. No basta con examinar la bandera de
ocupado BF para detectar cuando el módulo está disponible. Los tiempos de espera después de esta
instrucción se corresponden con el tiempo de ejecución de la misma, por lo cual es suficiente con veri-
ficar a BF.
Dispositivos de E/S Programables 553

El programa desarrollado para establecer la comunicación entre el µP y el


HD44780U y presentar el texto de la figura 9.36 consta nueve módulos, los cuales se
describen a continuación:

• LCD

Programa principal.

• INIC_LCD

Rutina de inicio. Configura el módulo LCD y lo deja listo para ser usado.

• SAL_CMD

Escribe en el registro de intrucciones IR, el comando cuyo código está cargado en el registro
acumulador. Antes de ejecutar una instrucción determinada se detecta si el dispositivo está
libre.

• SAL_DATO

Escribe en el registro de datos DR el código ASCII del carácter a presentar, el cual debe
cargarse en el acumulador. Antes de ejecutar la transferencia se verifica que el LCD esté
disponible.

• LCD_OCUP

Verifica el estado de la bandera de ocupado. Si BF está en uno, espera hasta cuando retorne
a cero para continuar la ejecución del programa.

• PULSO_E

Genera un pulso de nivel alto en la línea de control ENABLE (E).

• TEXTO1

Envía al LCD la cadena de caracteres cuyo primer elemento está almacenado en la posición
con dirección de memoria apuntada por el registro par HL. El carácter de escape es NULL
(00H).

• TEXTO2

Envía al LCD la cadena de caracteres BCD de longitud especificada por el contenido del re-
gistro C y cuyo primer elemento está almacenado en la dirección de memoria especificada
por el registro par HL.

• ESP_5MS

Retardo de 5 ms (>4.1ms) para permitir satisfacer los tiempos especificados en la rutina de


inicio.

El programa consta de 9 módulos ensamblados con el AVMAC85 y enlaza-


dos con el AVLINK. El archivo resultante en de formato hex se cargó en el programa
8085SimulatorIde el cual emula un módulo LCD. El resultado se presenta en la figura
9.41, la interconexión del LCD con el 8085A en la figura 9.42. Las instrucciones del
programa de control del módulo LCD, se muestran a continuación.
Dispositivos de E/S Programables 554

$title(Manejo LCD)
$subtitle(Módulo LCD)
;---------------------------------------------------------------------------------------------------------------------
; Modulo de programa principal
;---------------------------------------------------------------------------------------------------------------------

public pa_8155,pc_8155,escrb_cmd,escrb_dat,E_alto,E_bajo,escap,bcd_ascii,leer_dato1
public func_set1,func_set2,dspy_ctrl1,dspy_ctrl2,clr_dspy,ent_mod_set,leer_dato2
extern inic_lcd,sal_cmd,texto1,texto2
;---------------------------------------------------------------------------------------------------------------------

; Definición de etiquetas
;---------------------------------------------------------------------------------------------------------------------
i_stack equ 08F0H ; Inicio de la pila
i_rwm equ 0800H ; Dirección de inicio de RWM
func_set1 equ 30h ; Interconexión de 8 líneas
func_set2 equ 38h ; Interconexión de 8 bits, 2 líneas de 5x7 puntos
dspy_ctrl1 equ 8 ; Pantalla off y cursor oculto
dspy_ctrl2 equ 0EH ; Pantalla on y mostrar cursor
clr_dspy equ 1 ; Borrar pantalla cursor a la esquina izquierda
ent_mod_set equ 6 ; Autoincremento y avanzar cursor
escrb_cmd equ 0 ; Líneas de control para escribir comando
escrb_dat equ 2 ; Líneas de control para escribir dato
E_alto equ 4 ; Máscara para activar línea enable
E_bajo equ 0fbh ; Máscara para llevar enable a cero
leer_dato1 equ 5 ; Líneas de contro (E=1) para leer LCD
leer_dato2 equ 1 ; Líneas de contro (E=0) para leer LCD
escap equ 0 ; Caracter de escape para texto1
bcd_ascii equ 30h ; Conversión BCD a ASCII
;---------------------------------------------------------------------------------------------------------------------
; Definición de segmentos
;---------------------------------------------------------------------------------------------------------------------
defseg puertos,start=50h, class=iospace ; 8155 en dirección 50h
defseg stack, start=i_stack ; La pila reside en la RWM
defseg datos, class=data, start=i_rwm ; RWM a partir de 0800H
defseg progr, class=code, start=0 ; 2k de EPROM desde 0000H
;---------------------------------------------------------------------------------------------------------------------
; Puertos del 8155
;---------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1 ; Puerto de control del 8155
pa_8155 ds 2 ; Líneas de datos del módulo LCD
pc_8155 ds 1 ; PC0-->RW
; PC1-->RS
; PC2-->EN
;---------------------------------------------------------------------------------------------------------------------
; Área de la pila
;---------------------------------------------------------------------------------------------------------------------
seg stack
ds 10H
t_stack:equ $-1 ; Base de la pila
;---------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 555

;---------------------------------------------------------------------------------------------------------------------

; Área de variables
;---------------------------------------------------------------------------------------------------------------------
seg datos
mem ds 4
temp ds 1
;---------------------------------------------------------------------------------------------------------------------

; Segmento de código
;---------------------------------------------------------------------------------------------------------------------
seg progr
lxi sp,t_stack ; Se carga el apuntador de pila
mvi a,0dH ; Pa:salida Pc:salida
out pctrl_8155 ; Programar 8155
call inic_lcd ; Configuración de inicio del módulo LCD
lxi h,cad1 ; Apuntar mensaje 'T1='
call texto1 ; Presentar texto 'T1='
lxi h,mem ; Apuntar valor de temperatura 1
mvi c,2 ; Son dos dígitos BCD
call texto2 ; Presentar temperatura 1
lxi h,cad2 ; Apuntar 'grados centigrados'
call texto1 ; Presentar 'grados centigrados'
lxi h,cad3 ; Apuntar mensaje 'T2='
call texto1 ; Presentar texto 'T2='
lxi h,mem+2 ; Apuntar valor de temperatura 2
mvi c,2 ; Son dos dígitos BCD
call texto2 ; Presentar temperatura 2
lxi h,cad2 ; Apuntar 'grados centigrados'
call texto1 ; Presentar 'grados centigrados'
mvi a,0cdh ; Dirección de posición 13 de línea 2
call sal_cmd ; Mover cursor
lxi h,cad4 ; Apuntar mensaje '(-->)'
call texto1 ; Presentar '(-->)'
hlt
;---------------------------------------------------------------------------------------------------------------------

; Área de mensajes
;---------------------------------------------------------------------------------------------------------------------

cad1: db 'T1=',0
cad2: db 0dfH,'C ',0
cad3: db 'T2=',0
cad4: db '(',7eh,')',0
end
;---------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 556

;----------------------------------------------------------------------------------------------------------------------
; Rutina INIC_LCD
;-----------------------------------------------------------------------------------------------------------------------
public inic_lcd
extern sal_cmd, func_set1,func_set2,dspy_ctrl1,dspy_ctrl2
extern clr_dspy,ent_mod_set,esp_5ms,lcd_ocup
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
inic_lcd: call esp_5ms ; Esperar al menos 15 ms
call esp_5ms
call esp_5ms
mvi a,func_set1 ; Function set
call sal_cmd
call esp_5ms ; Esperar al menos 4.1 ms
mvi a,func_set1 ; Function set
call sal_cmd
call esp_5ms ; Esperar al menos 100 µs
mvi a,func_set1 ; Function set
call sal_cmd
call lcd_ocup ; Esperar al menos 40 µs
mvi a,func_set2 ; Function set
call sal_cmd
mvi a,dspy_ctrl1 ; Display Control
call sal_cmd
mvi a,clr_dspy ; Clear Display
call sal_cmd
mvi a,dspy_ctrl2 ; Display Control
call sal_cmd
mvi a,ent_mod_set ; Entry Mode Set
call sal_cmd
ret
end
;----------------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------------
; Rutina SAL_CMD
;----------------------------------------------------------------------------------------------------------------------
public sal_cmd
extern lcd_ocup,escrb_cmd,temp,pa_8155,pc_8155,pulso_E
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
sal_cmd: mov b,a ; Salva código de instrucción
call lcd_ocup ; Espera que el módulo esté libre
mvi a,escrb_cmd ; Líneas de control para inicio de ejecutar instrucción
sta temp ; Salvar estado de RS y RW
out pc_8155 ; E=0, RS=0, RW=0
mov a,b ; Recuperar código de instrucción
out pa_8155 ; Cargar instrucción en bus de datos
call pulso_E ; Generar un pulso en E
ret
end
;----------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 557

;----------------------------------------------------------------------------------------------------------------------
; Rutina SAL_DATO
;----------------------------------------------------------------------------------------------------------------------
public sal_dato
extern lcd_ocup,escrb_dat,temp,pa_8155,pc_8155,pulso_E
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------

sal_dato: mov b,a ; Salvar dato


call lcd_ocup ; Espera que el módulo esté libre
mvi a,escrb_dat ; Estado de líneas de control para inicio de enviar dato
sta temp ; Salvar estado de RS y RW
out pc_8155 ; E=0, RS=1, RW=0
mov a,b ; Recuperar dato
out pa_8155 ; Cargar dato en el bus
call pulso_E ; Generar un pulso en E
ret
end
;----------------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------------
; Rutina LCD_OCUP
;----------------------------------------------------------------------------------------------------------------------
public lcd_ocup
extern pa_8155,pc_8155,leer_dato1,leer_dato2
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------

lcd_ocup: mvi a,0cH ; Pa:entrada Pc:salida


out pctrl_8155 ; Programar 8155 para lectura
mvi a,leer_dato1 ; E=1, RS=0, RW=1
out pc_8155
nop ; Tiempo extra
in pa_8155 ; Leer estado de bandera de ocupado
mov e,a ; salvar BF en registro E
mvi a,leer_dato2 ; E=0, RS=0, RW=1
out pc_8155
mov a,e ; Recuperar BF
rlc ; BF a la bandera de acarreo
jc lcd_ocup ; Si BF es 1, esperar
mvi a,0dH ; Pa:salida Pc:salida
out pctrl_8155 ; Programar 8155 para escritura
ret
end
;-------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 558

;----------------------------------------------------------------------------------------------------------------------
; Rutina PULSO_E
;----------------------------------------------------------------------------------------------------------------------
public pulso_E
extern temp,E_alto,E_bajo,pa_8155,pc_8155
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
pulso_E: lda temp ; Recuperar estado de RS y R/W
ori E_alto ; Máscara con E = 1
out pc_8155 ; E=1, RS, RW
nop ; Tiempo adicional
ani E_bajo ; Máscara con E = 0
out pc_8155 ; E=0, RS, RW
ret
end
;----------------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------------
; Rutina TEXTO1
;----------------------------------------------------------------------------------------------------------------------
public texto1
extern escap,sal_dato
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
texto1: mov a,m ; Caracter desde la memoria al acumulador
cpi escap ; Probar si es el último caracter del mensaje
rz ; Retornar si fin de cadena
call sal_dato ; Presentar caractes
inx h ; Apuntar siguiente elemento de la cadena
jmp texto1 ; Continuar presentando
end
;----------------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------------
; Rutina TEXTO2
;----------------------------------------------------------------------------------------------------------------------
public texto2
extern escap,sal_dato,bcd_ascii
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
texto2: mov a,m ; Dígito BCD desde memoria al acumulador
adi bcd_ascii ; Convertir a ASCII
call sal_dato ; Presentar dígito
inx h ; Apuntar dígito siguiente
dcr c ; Cuenta de valores presentados
jnz texto2 ; Si no es el último valor, continuar presentando
ret ; Es el último, retornar.
end
;----------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 559

;----------------------------------------------------------------------------------------------------------------------
; Rutina ESP_5MS
;----------------------------------------------------------------------------------------------------------------------
public esp_5ms
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
esp_5ms: push d
lxi d,281h
esp: dcx d
mov a,e
ora d
jnz esp
pop d
ret
end
;----------------------------------------------------------------------------------------------------------------------

Fig. 9.41. Módulo LCD del programa 8085Simulator Ide.

Fig. 9.42. Puerto de conexión del módulo LCD.


Dispositivos de E/S Programables 560

9.2.2 Sección del temporizador-contador del 8155

Además de 256 bytes de memoria RWM y de 3 puertos de E/S, el 8155 tiene


un temporizador contador programable que puede usarse en aplicaciones que requie-
ran control de tiempo. Las aplicaciones de un temporizador son diversas. Entre las
funciones básicas del dispositivo se tienen:

• Generar retardos y medir el tiempo transcurrido entre dos eventos.

• Realizar la cuenta de eventos.

• Generar velocidades de baudios para el canal de comunicación serie.

En la práctica, el uso de un temporizador sólo lo limita la imaginación del di-


señador. Este puede usarse para generar sonido, medir variables físicas como tempe-
ratura y humedad, convertir de voltaje a frecuencia, controlar servomotores; y en ge-
neral, está presente en toda aplicación que involucre generación y control de tiempo.
El uso de un circuito para generar, por ejemplo: tiempos de espera, libera al µP de la
tarea de mantenerse en un lazo sin hacer nada por la duración del retardo. La CPU
sólo debe programar el modo de operación, arrancar el temporizador y esperar que
éste le indique el final del retardo.

La sección del timer del 8155 es un temporizador contador binario descenden-


te de 14 bits, el cual registra los pulsos de entrada y al culminar la cuenta, entrega a
su salida una onda cuadrada o un pulso, de acuerdo con el modo de operación pre-
viamente programado. La figura 9.43 muestra las líneas de entrada y salida del tem-
porizador. Los terminales TIMER IN y TIMER − OUT son externos. Al primero se
conectan los pulsos a contar y en el segundo se presenta la señal de salida.

AD0-AD7 Registro TH

Registro TL
TH

TL

TIMER-IN TIMER − OUT

Fig. 9.43. Entradas y salidas de la sección del timer del 8155.

Las entradas AD0-AD7 corresponden a los terminales del 8155 y permiten el


acceso a los registros. TH y TL son señales internas al 8155 y se usan para seleccio-
Dispositivos de E/S Programables 561

nar los registros del contador. Debido a que la programación del temporizador se rea-
liza por programa, desde el punto de vista del hardware, este puede verse como un
componente con una entrada de reloj y una salida, como ilustra la figura 9.44.

TIMER-IN TEMPORIZADOR TIMER − OUT

Fig. 9.44. Entradas y salidas externas de la sección del timer del 8155.

Programación del temporizador-contador

Antes de ser puesto en operación, el dispositivo debe ser programado para in-
dicarle el modo de operación y la longitud de la cuenta. Esta configuración se realiza
cargando palabras de control en los registros internos del contador, de acuerdo con el
formato mostrado en la figura 9.45. En el registro TL se cargan primero los ocho bits
menos significativos de la cuenta y en TH los seis bits restantes. Los dos bits altos de
TH, establecen el modo de operación.

Fig. 9.45. Formato de los registros internos del timer.

Como se observa en la figura 9.32, los dos bits de orden alto (TM2-TM1) del
registro de comando se usan para funciones del contador. De modo que para arrancar
o parar el temporizador, basta con escribir la palabra de control adecuada en el regis-
tro de comandos. En la tabla 9.7 se especifican los cuatro comandos disponibles. De-
bido a que el programa puede iniciar o parar al timer en cualquier momento, debe
Dispositivos de E/S Programables 562

cuidarse que tales acciones no modifiquen la configuración de los puertos de E/S rea-
lizada al inicio del programa.
Tabla. 9.7. Comandos del timer.
TM2 TM1
0 0 No afecta al temporizador.
0 1 Detiene de inmediato la cuenta.
1 0 Para el contador una vez alcanzado el final de la cuenta.
Carga el modo y longitud de la cuenta. Si el timer está
1 1 corriendo se espera el final de la cuenta antes de cargar el
nuevo modo y longitud.

La longitud de la cuenta puede ser un valor entre 2 y 3FFFH. La salida


TIMER − OUT está normalmente en nivel alto y se puede seleccionar uno entre
cuatro modos de operación, como se especifica en la tabla 9.8.

Tabla. 9.8. Modos de operación del temporizador.


M2 M1
0 0 Onda cuadrada. Pone la salida en cero durante la segunda
mitad de la cuenta.
0 1 Onda cuadrada con auto recarga. El periodo de la onda
cuadrada es igual a la longitud de la cuenta, la cual es
recargada automáticamente al final del conteo.
1 0 Pulso único en nivel bajo cuando se alcanza el final de la
cuenta.
1 1 Pulso en nivel bajo con auto recarga al final de la cuenta.

Como se observa en la figura 9.46, cuando el modo 0 es seleccionado, se pro-


duce a la salida un ciclo de onda cuadrada. Por ejemplo, si la longitud de la cuenta es
4, durante los primeros 2 ciclos de reloj la salida permanecerá en alto y durante los
siguientes 2 pulsos se pondrá en bajo. Para una longitud de 5, el tiempo en uno lógico
será de 3 periodos de reloj y el tiempo en cero de dos ciclos de reloj. Para modo 1,

Fig. 9.46. Formas de ondas de salida según el modo seleccionado..

se recarga la longitud y se repite el ciclo continuamente hasta cuando se pare el con-


tador. Para el modo 2, con una cuenta de 5, la salida permanecerá en alto durante 4
Dispositivos de E/S Programables 563

periodos de reloj y en cero durante el quinto ciclo. En el modo 3 se recarga la longi-


tud generándose un tren de pulsos, con las características descritas.

Ejemplo 9.10

Se tiene un 8155 decodificado en la dirección 40H y se usará el temporizador


para generar una señal de reloj de frecuencia seleccionada por la posición de tres in-
terruptores S0-2 conectados a las líneas PA0-2 del puerto A. Considere que la frecuen-
cia de oscilación del cristal externo del µP es de 6.144 MHz. La tabla 9.9 indica co-
mo se selecciona la frecuencia de salida y la figura 9.47 muestra el circuito de gene-
ración de señales.

Tabla. 9.9. Selección de la frecuencia de salida.


S2 S1 S0 Frecuencia (Hz)
0 0 0 300
0 0 1 600
0 1 0 1200
0 1 1 2400
1 0 0 4800
1 0 1 9600
1 1 0 9600
1 1 1 9600

Fig. 9.47. Generador de reloj de frecuencia variable.


Dispositivos de E/S Programables 564

Solución:

El temporizador funciona en el modo de onda cuadrada con auto recarga y de-


be generarse una tabla de valores para la longitud de la cuenta, en función del estado
de cada interruptor. Para una frecuencia fx la longitud de la cuenta se calcula con:

f
lc = clk
fx

Para una frecuencia de 4800 Hz y un reloj externo de 6.144 Mz se tiene,

3.072 × 10 6
lc = = 640
4800

Usando la ecuación se obtiene la siguiente tabla.

Tabla. 9.9. Frecuencia de salida en función


de la longitud de la cuenta.
Frecuencia Longitud decimal
(Hz) de la cuenta
300 10240
600 5120
1200 2560
2400 1280
4800 640
9600 320

La subrutina CLK lee los interruptores y encuentra en la tabla la longitud co-


rrespondiente. A continuación se cargan los registros TL y TH y se arranca el tempo-
rizador.

; Generador de reloj
;---------------------------------------------------------------------------------------------------------------------------
; Definición de etiquetas
;---------------------------------------------------------------------------------------------------------------------------
modo_timer equ 40h ; Onda cuadrada con autorecarga
inic_timer equ 0C0h ; Arrancar timer
palb_ctrl equ 2
tope_pila equ 200h
;---------------------------------------------------------------------------------------------------------------------------
; Definición de segmentos
;---------------------------------------------------------------------------------------------------------------------------
defseg puertos,start=40h, class=iospace ; 8155 en dirección 40h
defseg progr, class=code, start=0 ; Segmento de código
Dispositivos de E/S Programables 565

;---------------------------------------------------------------------------------------------------------------------------
; Puertos del 8155
;---------------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1 ; Puerto de control del 8155
pa_8155 ds 3 ; Puerto de interruptores
timer_bajo ds 1 ; Registro bajo del contador
timer_alto ds 1 ; Registro alto del contador
;---------------------------------------------------------------------------------------------------------------------------
; Programa principal al inicio del segmento de código
;---------------------------------------------------------------------------------------------------------------------------
seg progr
mvi a,palb_ctrl ; Pa:Entrada
out pctrl_8155 ; Programar 8155
lxi sp, tope_pila ; Inicio de apuntador de pila
call clk
; .
; .
; .
;---------------------------------------------------------------------------------------------------------------------------
; Rutina CLK
;---------------------------------------------------------------------------------------------------------------------------
clk: lxi h,tbl_long ; Apuntar tabla de longitudes de cuenta
in pa_8155 ; Leer estado de interruptores
call ret_20ms ; Suprimir efecto de rebote
in pa_8155 ; Releer interruptores
ani 7 ; Enmascarar
ral ; Multiplicar por dos
add l ; Sumar desplazamiento
mov l,a ; Apuntar byte bajo de la longitud
mov e,m ; Cargar en registro E
inx h ; Apuntar byte alto de la longitud
mov d,m ; Cargar en registro D
mvi a,e ; Byte bajo de longitud al acumulador
out timer_bajo ; Byte bajo de longitud a TL
mvi a,d ; Byte alto de longitud al acumulador
ori modo_timer ; Especificar modo
out timer_alto ; Modo y byte alto de longitud a TH
mvi a,inic_timer or palb_ctrl ; Comando de inicio del timer
out pctrl_8155
ret
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de retardo
;---------------------------------------------------------------------------------------------------------------------------
;ret20ms:
; .
; .
; .
ret
;---------------------------------------------------------------------------------------------------------------------------
; Tabla de valores de longitud de la cuenta
;---------------------------------------------------------------------------------------------------------------------------
tbl_long: dw 10240,5120,2560,1280,640,320,320,320
end
;---------------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 566

El temporizador puede ser usado para interrumpir al µP en intervalos específi-


cos para realizar una función determinada. En estos casos, la salida del temporizador
se conecta a una entrada de interrupción de la CPU. Usando la entrada RST7.5, cada
vez que la salida se coloque en alto, se realizará al microprocesador una solicitud de
interrupción.

Ejemplo 9.11

Una aplicación requiere incrementar en uno, cada 32 µs, un contador de 16


bits. El inicio de la cuenta lo marca el flanco posterior de un pulso generado por el µP
en el bit PB0 de un 8155. Esta señal afecta un circuito externo no mostrado. Transcu-
rrido un tiempo tx, la red coloca la entrada PA0 en nivel lógico uno notificando el fi-
nal de la cuenta. En este instante, el contenido del registro DE, usado como contador,
debe almacenarse a partir de la dirección de memoria MEM.

Solución:

Para resolver el problema, se usa el temporizador del 8155 con su salida co-
nectada a la entrada de interrupción RST 7.5, como ilustra la figura 9.48. El timer es
configurado para entregar, cada 32 µs, un pulso de salida con auto recarga. La rutina
de servicio de interrupción deberá incrementar en uno el registro par DE. Una vez
iniciada la cuenta, el programa se mantendrá examinando la línea PA0, en espera que
conmute a nivel alto para detener el timer y almacenar la cuenta final en memoria.

Fig. 9.48. Circuito para el ejemplo 9.11


Dispositivos de E/S Programables 567

El código del programa se muestra a continuación. El registro DE se usa como


contador y el resultado se almacena en la dirección de memoria 200H y siguiente. Al
final de la cuenta, el programa para el timer y entra en un estado de parada. La ins-
trucción HLT al final, se usa para detener la simulación del programa y examinar el
valor final de la cuenta en memoria. En la práctica, el valor registrado puede conver-
tirse a BCD y presentarse en una pantalla y reiniciar el proceso con un nuevo ciclo de
medida.

; Ejemplo 9.11
;---------------------------------------------------------------------------------------------------------------------------
; Definición de etiquetas
;---------------------------------------------------------------------------------------------------------------------------
modo_timer equ 0c0h ; Un pulso al final de la cuenta
inic_timer equ 0C0h ; Arrancar timer
parar_timer equ 40h ; Parar timer
palb_ctrl equ 2 ; PA:entrada PB:salida
mem equ 200h
long equ 100 ; Longitud de la cuenta
tope_pila equ 300h
;---------------------------------------------------------------------------------------------------------------------------
; Definición de segmentos
;---------------------------------------------------------------------------------------------------------------------------
defseg int, start=3ch ; Vector de interrupción
defseg puertos,start=50h, class=iospace ; 8155 en dirección 50h
defseg progr, class=code, start=100h ; Segmento de código
;---------------------------------------------------------------------------------------------------------------------------
; Puertos del 8155
;---------------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1 ; Puerto de control del 8155
pa_8155 ds 1 ; Puerto de entrada
pb_8155 ds 2 ; Puerto de salida
timer_bajo ds 1 ; Registro bajo del contador
timer_alto ds 1 ; Registro alto del contador
;---------------------------------------------------------------------------------------------------------------------------
; Rutina de servicio de interrupción
;---------------------------------------------------------------------------------------------------------------------------
seg int
inx d ; Incrementar contador
ei ; Rehabilitar interrupciones
ret ; Retornar desde interrupción
;---------------------------------------------------------------------------------------------------------------------------
; Programa principal
;---------------------------------------------------------------------------------------------------------------------------
seg progr
lxi sp,tope_pila ; Iniciar apuntador de pila
mvi a,palb_ctrl ; Cargar e A la palabra de control
out pctrl_8155 ; Programar ; PA:entrada PB:salida
ori 1
out pb_8155 ; Pulso de inicio a nivel alto
lxi d,0 ; Contador a cero
mvi a,long ; Byte bajo de Longitud de cuenta al acumulador
out timer_bajo ; Cargar byte bajo de cuenta en TL
Dispositivos de E/S Programables 568

mvi a, modo_timer ; Cargar modo en el acumulador


out timer_alto ; Cargar modo y byte alto de cuenta en TH
xra a ; Cero al acumulador
out pb_8155 ; Pulso de inicio a cero
mvi a,inic_timer or palb_ctrl
out pctrl_8155 ; Arrancar timer
mvi a,0bh ; Máscara de interrupción
sim ; Desenmascarar entrada RST 7.5
ei ; Habilitar interrupciones
esp: in pa_8155 ; Leer Puerto A
rar ; Bit 0 a la bandera de acarreo
jnc esp ; Si es cero, esperar
mvi a,parar_timer or palb_ctrl
out pctrl_8155 ; Si es uno, parar timer
xchg ; Cuenta final al registro HL
shld mem ; Almacenar cuenta final en memoria
hlt
end
;---------------------------------------------------------------------------------------------------------------------------

Ejemplo 9.12

Se debe construir y programar un generador de forma de ondas usando el 8155


#2 del microcomputador MPR-85 PLUS. El instrumento debe tener dos entradas: la
primera es un pulsador para selección del tipo de señal de salida entre: seno, cuadra-
da, triangular o diente de sierra. Al aplicarse energía al circuito debe generarse una
onda seno. Las activaciones subsecuentes del pulsador seleccionarán una salida dife-
rente en el orden especificado. La segunda entrada es un arreglo de siete interruptores
lógicos que permite variar la frecuencia de la señal de salida. La figura 9.49 muestra
el circuito del generador.

Solución:

Para el diseño del instrumento se utiliza el circuito integrado de E/S PPI 8155
#2 del MPR-85 PLUS, el cual es decodificado en la dirección 50H. Como se observa
en la figura 9.49, el puerto A (51H) se configura como salida con sus terminales co-
nectados a las entradas de convertidor análogo digital DAC0808. Los interruptores
SW1-SW7, para variar la frecuencia de la salida, se acoplan a los siete bits bajos del
puerto de entrada 52H (Puerto B del 8155) y la salida de la red de supresión de rebo-
tes del pulsador S1 de selección de forma de onda, es cableado a la línea P52.7 del
mismo puerto.

Para generar una tensión analógica en VS basta con escribir el valor digital co-
rrespondiente en el puerto A del 8155. El circuito DAC0808 tiene una resolución de 8
bits y es configurado para entregar una corriente de salida IOUT desde 0 hasta la co-
rriente de final de escala IFS. Las entradas A1-8 toman valores entre 00 y FFH. La co-
rriente I OUT es complementaria de IOUT de modo que:
Dispositivos de E/S Programables 569

Fig. 9.49. Circuito para el generador de forma de onda


Dispositivos de E/S Programables 570

I FS = I OUT + I OUT , para toda entrada.

La corriente de fin de escala viene dada por la ecuación:

2 n −1
I FS = I ref ×
2n

Vref 2 n −1
I FS = × n , Vref = 5.0V R ref = 5.6K
R ref 2

La intensidad de salida para cualquier valor de entrada es:

Vref A base10
I OUT = ×
R ref 2n

El amplificador operacional a la salida del CAD entrega una tensión VS entre


0 y +IFS×5.6K.

VS = I OUT × 5.6K

Vref 5
VS = n
× A base10 = 8 × A base10
2 2

Para una entrada digital 100101112 = 15110 la tensión de salida será igual a:

5
VS = × 151 = +2.95V
256

Debido a que se usa un paso para representar el voltaje cero, la tensión máxi-
ma de salida será:

5
VS máx = × 255 = +4.98V
256

De acuerdo con lo anterior, para generar un ciclo de una forma de onda trian-
gular de 2.5 Vpico se debe escribir en el puerto de salida A una secuencia entre 00 y
7FH para la pendiente positiva y desde 7FH hasta cero para la pendiente negativa,
como puede observarse en la figura 9.50.
Dispositivos de E/S Programables 571

Fig. 9.50. Se genera una muestra cada tx.

El tiempo tx entre muestras lo fija el valor cargado en los registros del tempo-
rizador/contador, configurado para pulso único con auto recarga. Los 7 bits de mayor
orden del registro TL corresponden al estado de los interruptores SW7-SW1 y el bit
menos significativo de TL se pone a cero. Los 6 bits altos del contador se cargan con
ceros. Para detectar cuando se debe escribir la siguiente muestra, se puede conectar la
salida del timer a la entrada de interrupción RST 7.5, para que se realice una solicitud
de interrupción cada vez que el contador alcance el final de la cuenta. En este caso, se
usa la instrucción RIM para examinar si existen interrupciones pendientes. Otro mo-
do, el utilizado en este ejemplo, es examinar el estado del bit D6 del registro de estado
del 8155 y producir la siguiente muestra cada vez que D6 se coloque en uno.

Para seleccionar el tipo de onda, se usa un contador de módulo 3 que registra


el orden en el cual es activado el pulsador. Al inicio el contador está en 0, indicando
salida seno. Las subsecuentes activaciones lo pone en 1 para onda cuadrada, en 2 para
triangular y en 3 para diente sierra. Al presionarse S1 por cuarta vez el contador vuel-
ve a 0 reiniciándose la secuencia con salida seno. Con el programa en ejecución, se
lee el tipo de onda y su frecuencia y se genera un ciclo de la forma de onda deseada a
la frecuencia especificada. A continuación se vuelve a leer el estado de los interrupto-
res SW1-7 y S1 para generar el siguiente periodo de la misma señal o el primer ciclo de
nueva onda de salida.

Para generar la onda seno se utiliza una tabla de valores. La k-ésima muestra
Nk se obtiene con la siguiente ecuación, donde n es el número de muestras en un pe-
riodo:
Dispositivos de E/S Programables 572

Para que la frecuencia seleccionada sea la misma para todos los tipos de on-
das, es necesario generar el mismo número de muestras por ciclo y escribir una mues-
tra cada T/n, donde T es el periodo de la forma de onda. Se desea una amplitud de la
salida de 5.0 V (4.98 V) con 128 muestras por ciclo. Con la señal seno no hay pro-
blema en usar una tabla de 64 valores (medio ciclo) y con la onda cuadrada basta con
escribir 64 muestras en nivel bajo y otras 64 en alto. Pero en el caso de la forma de
onda triangular, para obtener la amplitud deseada, la señal debe variar entre 0 y FFH
cada medio ciclo, lo cual equivale a 512 muestras por ciclo.

Para ajustar el número de muestras a 128, se carga (para la pendiente positi-


va) en el DAC los valores 0,4,8,0CH,…,FCH,…0CH,8,4,0; lo cual representa 64
muestras en el semiciclo ascendente y 64 muestras en el descendente. Como resultado
la amplitud se reduce a 4.93 V. Para que toda salida tenga igual amplitud se ajusta la
tabla de valores de la onda seno y el valor de del nivel alto de la onda cuadrada. En el
caso de la señal diente de sierra se carga a la entrada del DAC la secuencia
0,2,4,5,8,0AH,…,0FEH para 128 muestras por ciclo.

El código del generador consta de un programa principal para detectar el tipo


y frecuencia de la onda y generar la señal correspondiente y una subrutina que escribe
el valor digital de la muestra en el puerto A, cada vez que el temporizador alcanza el
final de la cuenta.

$title(Generador de onda)
;---------------------------------------------------------------------------------------------------------------------------
i_stack equ 8FF0H ; Inicio de la pila
modo_timer equ 0C0h ; Pulso único con autorecarga
inic_timer equ 0CDh ; Palabra de control para arrancar temporizador
;---------------------------------------------------------------------------------------------------------------------------
; Definición de segmentos
defseg puertos,start=50h, class=iospace, absolute
defseg pila, start=i_stack
defseg progr, class=code, start=6002h
;---------------------------------------------------------------------------------------------------------------------------
; Puertos de entrada del sistema
seg puertos
pctrl_8155: ds 1 ; Registro de control del 8155.
pa_8155: ds 1 ; El CDA se conecta al puerto de salida A.
pb_8155: ds 2 ; Puerto B entrada para selección de tipo y frecuencia de la onda.
timer_bajo: ds 1 ; Modo del temporizador y 6 bits altos de longitud de la cuenta
timer_alto: ds 1 ; Byte menos semicl_2ificativo de longitud de la cuenta.
;---------------------------------------------------------------------------------------------------------------------------
; Los 16 bytes últimos de RWM soportan el stack.
seg pila
ds 10H
;---------------------------------------------------------------------------------------------------------------------------
t_stack:equ $-1 ; Base de la pila
;---------------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 573

;---------------------------------------------------------------------------------------------------------------------------
;Programa principal
;---------------------------------------------------------------------------------------------------------------------------
seg progr
lxi sp,i_stack ; Cargar apuntador de pila
mvi b,0 ; Se inicia contador de tipo de onda
inicio: in pb_8155 ; Leer frecuencia. Después del reset, PB <-- entrada
rlc ; Desplazar a la izquierda
out timer_bajo ; Byte menor de la cuenta
mvi a,0C0h ; Modo:un pulso con autorecarga y 6 bits altos del
out timer_alto ; contador a cero
mvi a,0cdh ; Configura puertos. PA --> salida PB <-- entrada
out pctrl_8155 ; Arrancar timer
in pb_8155 ; Leer pulsador de selección de onda
ani 80h ; Enmascarar D7
jz gener ; Generar ciclo de onda si pulsador está desactivado
inr b ; Pulsador activado
esp: in pb_8155 ; Releer pulsador para esperar apertura.
ani 80h ; Enmascarar D7
jnz esp ; Esperar que pulsador se desactive
gener: mov a,b ; Estado del contador se carga en el acumulador
cpi 0 ; Comparar con cero
jz seno ; Onda es seno
cpi 1 ; Comparar con 1
jz cuad ; Onda es cuadrada
cpi 2 ; Comparar con 2
jz trian ; Onda es triangular
cpi 3 ; Comparar con 3
jz d_sierra ; Onda es diente de sierra
mvi b,0 ; Onda es seno. Contador a cero
; onda es seno
seno: lxi h,tabla ; Apuntar elemento 1 de la tabla.
semicl_1: inx h ; Saltar valor cero de la tabla.
mov a,m ; Probar si valor de la tabla es cero.
cpi 0 ; Si es cero
jz semicl_2 ; Se generó el primer semiciclo. Generar segundo medio ciclo.
call dac ; Si no es cero, continuar
jmp semicl_1 ; generando primer medio ciclo.
semicl_2: dcx h ; Saltar cero al finalde la tabla.
mov a,m ; Cargar valor de la tabla en el acumulador.
cpi 0 ; Probar si se alcanzó el cero inicial de la tabla.
jz inicio ; Si es así es el fin de ciclo, examinar tipo y frecuencia de la onda.
mov c,a ; Si no, generar segundo medio ciclo
mvi a,0fch ; usando los valores de la tabla,
sub c
call dac ; Escribir a DAC.
jmp semicl_2 ; Continuar generando segundo medio ciclo.
; onda es diente de sierra
d_sierra: mvi a,0 ; Generar pendiente negativa desde FCH hasta 0
mvi c,0feh ; en pasos de 2.
jmp dcs
dct: mov a,c
dcs: call dac ; Escribir en DAC
dcr c
Dispositivos de E/S Programables 574

dcr c
jnz dct
jmp inicio ; Fin de ciclo. Saltar a examinar tipo y frecuencia de la onda.
; onda es triangular
trian: mvi c,0 ; Generar pendiente positiva desde 0 hasta FCH en pasos de 4.
proxs: mov a,c
call dac ; Escribir en DAC.
inr c ; Incrementar en 4 el registro C.
inr c
inr c
inr c
mov a,c
cpi 0fch ; Probar si se alcanzó valor pico de la señal triangular.
jnz proxs ; Si no, seguir generando pendiente positiva.
proxb: mov a,c ; Si valor pico, generar pendiente negativa desde FCH hasta cero.
tri_baj: call dac ; Escribir en DAC.
dcr c ; Pasos de -4.
dcr c
dcr c
dcr c
jnz proxb ; Si valor distinto de cero continuar generando pendiente negativa.
jmp inicio ; Si es cero es fin de ciclo. Examinar tipo y frecuencia de la onda.
; onda es cuadrada
cuad: mvi c,2 ; Son dos semiciclos.
mvi d,0 ; Primer semiciclo consta de 64 muestras en nivel bajo.
semi: mvi e,64
prox: mov a,d ; El registro D tiene 0 en el semiciclo 1 y FCH en el semiciclo 2.
call dac ; Escribir a DCA.
dcr e ; Contador de muestras menos 1.
jnz prox ; Escribir hasta muestra 64.
mvi d, 0fch ; Cargar D con nivel alto.
dcr c ; Contador de semiciclos menos 1
jnz semi ; Generar semiciclo 2.
jmp inicio ; Fin de ciclos, saltar a examinar tipo y frecuencia de la onda.
;---------------------------------------------------------------------------------------------------------------------------
; Rutina DAC
;---------------------------------------------------------------------------------------------------------------------------
dac: out pa_8155
dac1: in pctrl_8155
ani 40h
jz dac1
ret
;---------------------------------------------------------------------------------------------------------------------------
; Tabla de valores para primer semiciclo de la onda seno.
;---------------------------------------------------------------------------------------------------------------------------
tabla: db 0,126,132,138,144,150,156,162,168,174,179,185,190
db 196,201,205,210,215,219,223,227,230,234,237,239
db 242,244,246,248,249,250,251,251,252,251,251,250
db 249,248,246,244,242,239,237,234,230,227,223,219
db 215,210,205,201,196,190,185,179,174,168,162,156
db 150,144,138,132,126,0
end
;---------------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 575

Fig. 9.51. Formas de onda como se ven en un osciloscopio. 2 V/div, 5 ms/div.


Dispositivos de E/S Programables 576

Fig. 9.52. Forma de onda seno.


Dispositivos de E/S Programables 577

Fig. 9.53. Salida onda cuadrada.


Dispositivos de E/S Programables 578

Fig. 9.54. Señal triangular.


Dispositivos de E/S Programables 579

Fig. 9.55. Onda diente de sierra


Dispositivos de E/S Programables 580

9.3 CONTROLADOR DE TECLADO Y PANTALLA 8279


En el diseño aplicaciones de sistemas empotrados donde el µP deba realizar
operaciones de lectura de teclado y presentación de información en pantallas multi-
plexadas de indicadores de siete segmentos, conviene considerar el uso de un contro-
lador de teclado/display, para reducir el tamaño del código y liberar al µP de realizar
estas tareas, para que pueda dedicarse a otras funciones. El circuito 8279, es un con-
trolador de teclado/pantalla diseñado para sistemas MCS 85/86 y que en la práctica
puede interconectarse con facilidad a cualquier microprocesador. El dispositivo origi-
nalmente introducido por INTEL, es ofrecido por las empresas Alliance Core y Aldec,
entre otras, como un módulo lógico especialmente diseñado para FPGAs, facilitando
la actualización o diseño de la aplicación, al permitir al diseñador incorporar las fun-
ciones del 8279 y otras unidades lógicas en dispositivos programables modernos. Las
características resaltantes de controlador 8279 son:
• Operaciones simultaneas sobre teclado y pantalla.
• Modos de barrido de teclado y matriz de sensores.
• Interconexión de un teclado de hasta 64 teclas (8x8).
• Control de pantallas de hasta 16 dígitos.
• Dos memorias pequeñas contienen los caracteres a presentarse y las entradas de teclado:
1. La memoria RAM de display puede almacenar hasta 16 bytes. Contiene los códigos 7-
segmentos de los caracteres a presentar.
2. Una memoria FIFO/RAM de teclado almacena las últimas 8 teclas activadas,
• Protección contra pulsación simultaneas de teclas y supresión del rebote de contactos.
• Modo de operación y temporización seleccionadas por programa.
• Salida de interrupción al pulsarse una tecla.

Fig. 9.56. Símbolo lógico y distribución de terminales del 8279.


Dispositivos de E/S Programables 581

El 8279 es básicamente una técnica hardware para conectar al µP una matriz


de teclado y una pantalla multiplexada de indicadores incandescentes. Las funciones
realizadas por el chip, de exploración de la matriz de teclas y actualización periódica
del display, aumentan el rendimiento de la CPU, al reducir el tamaño y complejidad
del código. El diagrama de bloques del controlador se muestra en la figura 9.57.

Fig. 9.57. Diagrama funcional del 8279.

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8279


Un nivel bajo en este terminal permite la comunicación entre el µP y el 8279.
CS
Estas entradas se activan a cero durante una operación de escritura/lectura del µP.
WR / RD
CLK Entrada de reloj para sincronización interna.
BD Un nivel en esta salida apaga los indicadores durante la conmutación entre dígitos o en la ejecución de
un comando de apagado
DB[7:0] Es el bus de datos bidireccional y tres estados por medio del cual se transfieren comandos y/o datos
entre el controlador y el µP.
A0 Dirección del buffer: Un nivel alto en esta entrada indica que la información de E/S son comandos o
condiciones de estado. Un uno lógico notifica que deben interpretarse como datos.
RESET Un alto en esta entrada inicia el controlador en modos de operación y de sincronización por defecto.
A0 Dirección del buffer: Un nivel alto en esta entrada indica que la información de E/S son comandos o
condiciones de estado. Un uno lógico notifica que deben interpretarse como datos.
IRQ Salida de solicitud de interrupción: En el modo de teclado sube a nivel alto cuando hay datos en la
RAM FIFO y retorna a bajo con cada lectura de la FIFO. Vuelve a uno si quedan datos sin leer en la
RAM. En el modo SENSOR va a alto si se detecta un cambio en un sensor.
SL[3:0] Líneas de barrido: salidas usadas para explorar el teclado y para activar los indicadores de la pantalla.
RL[7:0] Líneas de retorno: Entradas desde la matriz de teclado o de sensores. Son conectadas a SL[3:0] por la
presión de una tecla. También provee un byte de entrada en el modo de entrada STROBE.
SHIFT En el modo de teclado, el estado de esta entrada es almacenado junto con la posición de la tecla presio-
nada.
CNT/STB En el modo de teclado, el estado de esta entrada CONTROL es almacenado junto con la posición de la
tecla presionada. También sirve como entrada de habilitación para cargar datos en la FIFO en el modo
de entrada STROBE.
OUTA[3:0], El contenido de la RAM de display se presenta en estas salidas sincronizadas con las líneas de barrido.
OUTB[3:0]
Dispositivos de E/S Programables 582

9.3.1 Funcionamiento del 8279

El controlador de teclado/pantalla es un circuito complejo con múltiples mo-


dos de operación y que puede ser interconectado a matrices de pulsadores, teclados
codificados o arreglo de sensores y a pantallas multiplexadas de hasta 16 dígitos. En
esta sección, se discuten algunos aspectos del modo de funcionamiento y de la pro-
gramación del circuito. Para acceder una descripción detalla del controlador se reco-
mienda al lector examinar la hoja técnica de datos del chip.

Como ilustran las figuras 9.56 y 9.57, el 8279 tiene terminales de E/S para in-
terconexión con el µP, teclado e indicadores luminosos. El controlador requiere una
señal de 100 KHz para su sincronización. La frecuencia del reloj externo aplicado al
terminal CLK del circuito integrado, es dividida internamente para obtener los 100
KHz necesarios. El valor del divisor del reloj es cargado por una palabra de control
durante la programación inicial del chip.

Fig. 9.58. Diagrama simplificado del 8279.

Un nivel alto aplicado a le entrada RESET inicia al 8279 con la siguiente con-
figuración:
• Presentación de 16 caracteres de 8 bits. Entrada por la izquierda.

• Exploración codificada de teclado con protección contra pulsación simultánea de 2 teclas (2-
key lockout).

• El divisor de reloj se carga con 31.

El controlador puede operar con pantallas multiplexadas de 8 ó 16 caracteres,


con salidas por dos puertos de 4 bits (OUTA[3:0], OUTB[3:0]) o un puerto de 8 bits
(A3=D7,B0=D0); y con la entrada de dígitos por la derecha o por la izquierda. El
8279 tiene un bloque RAM de 16 x 8 la cual contiene los códigos de los caracteres
que se presentan en los indicadores de la pantalla y la cual puede ser escrita o leída
por el µP en cualquier momento. Es posible programar el auto incremento del conta-
Dispositivos de E/S Programables 583

dor de direcciones con cada operación de E/S. Cada dígito de la pantalla tiene asigna-
da una posición de la memoria de display.

Con el formato de entrada por la derecha, el número del indicador (0-F) se co-
rresponde con la dirección de la RAM de display. La posición 0 de la memoria alma-
cena el código del carácter presentado en el dígito más a la izquierda (L0), la direc-
ción 1 con el siguiente (L1) y así sucesivamente. Si se programa el auto incremento
del contador de direcciones, cada nueva entrada se cargará en posiciones consecutivas
de la RAM a partir de la celda inicial.

Una vez actualizada la posición final (7 ó 15), según el modo de salida pro-
gramado (8 ó 16 dígitos) se sobrescribe la dirección 0. Sin auto incremento, es posi-
ble presentar un carácter en cualquier dígito usando un comando de escritura en la
RAM de display. En entrada por la izquierda, el primer caracter se presenta en el dígi-
to más a la derecha. Con auto incremento, la siguiente entrada se carga en la misma
posición de la RAM de display donde está el dato anterior y éste se mueve a la si-
guiente localidad.

El 8279 puede operar con tres tipos de dispositivos de entrada: con una matriz
de pulsadores, con un teclado con entrada por señal estroboscópica o con una matriz
de sensores. Con una matriz de teclas, las salidas del contador de exploración SL
[0:3], son usadas para realizar un barrido de las filas del teclado y detectar, por las
líneas de retorno, la columna a la cual pertenece la tecla presionada. Este contador
puede programarse en dos modalidades.

Con exploración codificada, se presenta una cuenta binaria entre 0 y 15, de


modo que debe usarse un circuito decodificador 1 de 8 para generar las señales de
exploración aplicadas a cada fila, y un decodificador 1 de16 para actualizar los dis-
plays. En esta forma el controlador 8279 puede manejar un teclado de hasta 8 filas (8
x 8) y presentar 16 caracteres. En este modo, el 8279 coloca un cero en una de las
filas conectadas a las líneas SL [0:3] y examina el estado de las teclas, leyendo las
entradas de retorno RL[0:7].

Las entradas RL[0:7] están conectadas a 5 V por resistores internos, de modo


que si cualquiera de estos terminales está en cero, indicará la activación de una tecla.
Entonces, el controlador espera un tiempo de 10 ms para suprimir el efecto de rebote
de contactos y lee de nuevo RL[0:7]. Si la misma tecla permanece pulsada, se alma-
cena su posición en la FIFO/RAM.

La memoria FIFO/RAM funciona como una estructura FIFO de 8 bits y pro-


fundidad de 8, cuando se opera en el modo teclado o entrada por señal STROBE. Los
datos son cargados dentro de la FIFO y posteriormente son leídos en el mismo orden
en el cual fueron almacenados. En el modo de exploración de teclado, el byte cargado
en la FIFO indica la posición del pulsador en el teclado y el estado de las entradas
SHIFT y CNTL a las cuales se supone conectadas las teclas SHIFT y CTRL. La figura
9.59 muestra el formato del dato en la FIFO.
Dispositivos de E/S Programables 584

D7 D6 D5 D4 D3 D2 D1 D0
CNTL SHIFT FILA COLUMNA
0 0 0 1 1 1 0 0

Fig. 9.59. Formato del dato en la FIFO.

Cuando no se usan las entradas CNTL y SHIFT, estas se conectan a tierra, de


modo que si se presiona la tecla en la fila 3 y columna 4, el byte en la FIFO será 1CH

Además de realizar la supresión del rebote, el 8279 puede ser programado pa-
ra protección contra activación simultánea de teclas. Existen dos modalidades dispo-
nibles: 2-key lockout/N-key rollover. El primer modo bloquea el reconocimiento y la
carga en la FIFO, si dos teclas son presionadas simultáneamente. Una tecla debe ser
liberada antes que la proxima tecla activada sea procesada. Sólo se acepta como váli-
da la última tecla activada. El segundo modo acepta todas las teclas presionadas. Si
dos teclas son activadas casi al mismo tiempo, ambas son aceptadas como válidas y
sus códigos son almacenados en la FIFO, en el orden en el cual éstas fueron pulsadas.

La segunda modalidad del contador con salidas SL [0:3], es el de exploración


decodificada, cuando se decodifican los dos bits de orden bajo del contador para pre-
sentar una salida 1 de 4. Con esta forma de barrido, se activa, a la vez, a nivel alto
uno de los terminales SL [0:3]. Como estos pines se usan tanto para explorar el tecla-
do como para refrescar la pantalla, el barrido decodificado limita a 4 el número de
filas del teclado y de indicadores de la pantalla.

Cuando se conecta al 8279 una matriz de sensores, durante la exploración de


las filas no se realiza la protección contra rebotes. En este modo, la FIFO/RAM fun-
ciona como una memoria RAM de 8 bytes. Cada fila de la RAM es cargada con el esta-
do de los sensores de la fila correspondiente en la matriz. A medida que el arreglo de
sensores es explorado, el complemento del estado de las líneas de retorno RL[0:7] es
cargado en la posición de la RAM, cuya dirección es especificada por el contador de
exploración. Esto significa, que la memoria contiene una imagen del estado de los sen-
sores de cada fila. Si el dispositivo de entrada es un teclado con señal STROBE, el es-
tado invertido de las entradas RL[0:7] (código de la tecla) es almacenado en la
FIFO/RAM (operando como FIFO), durante el flanco de subida de la señal de habili-
tación conectada al terminal CNTL / STB .

En los modos de teclado, la señal de salida IRQ se pone en nivel alto cuando
hay datos en la FIFO. IRQ es regresada a cero con cada lectura de la FIFO y retorna a
nivel alto si permanecen posiciones sin leer en la FIFO. En el modo de matriz de sen-
sores IRQ es activada cuando se detecta un cambio en el sensor.

El bloque estado de la FIFO/RAM en la figura 9.57, mantiene al día las condi-


ciones operativas de la FIFO. El µP puede leer la palabra de estados de la FIFO con
A0 en nivel alto. Además de indicaciones de error, este byte puede usarse en los mo-
Dispositivos de E/S Programables 585

dos de teclado para detectar la activación de una tecla sin necesidad de recurrir al uso
de interrupciones. La función de cada bit de la palabra de estados se indica en la figura
9.60.

D7 D6 D5 D4 D3 D2 D1 D0
DU S/E O U F N N N

RAM FIFO
display no llena.
disponible.

Bandera Número de entra-


cierre sensor/Bandera Error das en la FIFO.
error pulsaciones lectura.
múltiples.
Error
escritura.

Fig. 9.60. Palabra de estados de la FIFO/RAM.

Los bits D2:0 (NNN) indican el número de teclas válidas activadas. El bit F (D3)
se activa cuando la FIFO está llena. D5:4 son indicaciones de error: O (overrun) notifi-
ca que se intentó escribir en la FIFO cuando estaba llena, U (underrun) señala que se
quiso leer la FIFO estando vacía. En el modo especial de error. El bit S/E indica que
se presionaron varias teclas a la vez. D7 es una bandera que advierte que la RAM de
display no esta disponible porque la pantalla está apagada o en proceso de apagado.

9.3.2 Programación del 8279

El 8279 debe ser programado antes de usarse por medio de comandos enviados
al circuito integrado con la CS en cero y A0 en nivel alto. Los primeros tres bits del
byte cargado en el registro de control del 8279 en el flaco de subida de WR seleccio-
nan una de ocho comandos disponibles, los cuales se describen en la siguiente tabla.

Tabla.9.10.Palabras de control del 8279.


D7 D6 D5 Función Propósito
Fija el modo de teclado. El número de caracteres de la pantalla y
0 0 0 Seleccionar modo
el tipo de exploración.
0 0 1 Reloj Programa el divisor de reloj interno.
Habilita la lectura de la FIFO/RAM. Indica la dirección que se
0 1 0 Lectura de FIFO
va a leer.
Lectura de RAM de Habilita la lectura de la RAM de display. Indica la dirección que
0 1 1
d display se va a leer.
Escritura en RAM de Habilita la escritura de la RAM de display. Indica la dirección
1 0 0
display q que se va a leer.
Deshabilita escritura
1 0 1 Inhibe la presentación de caracteres y apaga la pantalla.
de display
1 1 0 Borrado Limpia la RAM de display o la FIFO.
Fin de interrupción.
1 1 1 Desactiva la salida IRQ. Activa el modo especial de error.
Modo especial de error.
Dispositivos de E/S Programables 586

1. Selección de modo teclado/pantalla


D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 D D K K K

KKK MODOS
000 Teclado con exploración codificada - 2 key lockout.
001 Teclado con exploración decodificada - 2 key lockout.
010 Teclado con exploración codificada - N key rollover.
011 Teclado con exploración decodificada - N key rollover.
100 Matriz de sensores con exploración codificada.
101 Matriz de sensores con exploración decodificada.
110 Entrada por señal STROBE. Barrido codificado de pantalla.
111 Entrada por señal STROBE. Barrido decodificado de pantalla.
DD
00 Pantalla de 8 caracteres de 8 bits. Entrada por la izquierda.
01 Pantalla de 16 caracteres de 8 bits. Entrada por la izquierda.
10 Pantalla de 8 caracteres de 8 bits. Entrada por la derecha.
11 Pantalla de 16 caracteres de 8 bits. Entrada por la derecha.

Fig.9.61.Modos de teclado y pantalla.

2. Programación del reloj


D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 P P P P P

Fig.9.62.Divisor del reloj.

Un divisor de frecuencia programable genera el reloj de sincronización interna


a partir de la señal aplicada a la entrada CLK. El valor del divisor es fijado por los
bits PPPPP de esta palabra de control. Por ejemplo para un reloj externo de 2.5 MHz,
debe cargarse 00111001 en el registro de control. Si el µP funciona con un reloj in-
terno de 3.125 MHz o 3.070 MHz como en nuestro caso, no es necesario usar este
comando porque después de un reset el divisor es cargado por defecto con el valor
31.

3. Lectura de la memoria FIFO/RAM


D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 AI X A A A

Auto incremento de
la dirección.
Dirección de la
FIFO/RAM.

Fig.9.63. Palabra de control para lectura de la memoria FIFO/RAM.


Dispositivos de E/S Programables 587

Una operación de lectura realizada después de este comando retorna en el


acumulador el contenido de dirección AAA de la FIFO/RAM. Si el bit AI está en uno,
subsiguientes lecturas entregan el contenido de las subsecuentes localizaciones.

4. Lectura de la memoria RAM de pantalla


D7 D6 D5 D4 D3 D2 D1 D0
0 1 1 AI A A A A

Auto incremento de
la dirección.

Dirección de la
RAM de pantalla.

Fig.9.64. Comando para lectura de la memoria RAM de display.

Si luego de enviar este comando al 8279 se realiza una operación de lectura, el


dispositivo retorna en el acumulador el contenido de la posición de memoria RAM de
pantalla con dirección AAAA. Si el bit AI es uno, la dirección se incrementa en uno
después de cada lectura.

5. Escritura de la memoria RAM de pantalla


D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 AI A A A A

Auto incremento de
la dirección.

Dirección de la
RAM de pantalla.

Fig.9.65. Formato de la palabra de control para escritura de la memoria RAM de display.

Después de ejecutar este comando, el dato enviado al controlador es almace-


nado en la posición con dirección AAAA de la RAM de pantalla. Si el bit AI es pues-
to a 1, se seleccionará la siguiente localización con cada escritura en la memoria.

6. Inhibición de escritura y apagado de pantalla


D7 D6 D5 D4 D3 D2 D1 D0
1 0 1 X IWA IWB BLA BLB

Fig.9.66. Bloqueo y apagado de pantalla.


Dispositivos de E/S Programables 588

Los bits IWA e IWB se usan para enmascarar los puertos de 4 bits A o B, en
aplicaciones que usan puertos separados de pantalla con 4 bits. Cuando se activan
estos bits, los caracteres mostrados por el puerto correspondiente no varían aún cuan-
do se cambie el contenido de la RAM de display.

Los bits BL se usan para el apagado de cada puerto. El último comando de bo-
rrado determina el código de apagado. Después de un reset, el código es cero.

7. Borrado
D7 D6 D5 D4 D3 D2 D1 D0
1 1 0 CD CD CD CF CA

Fig.9.67 Comando para borrado de las memorias internas del 8279.

Si el bit D4 está en uno, este comando cargará en todas las posiciones de la


RAM de display el valor elegido por los dos bits CD de menor peso de acuerdo con: si
D3-2 es 0X2 se cargará en la RAM el valor 000000002, si D3-2 es 102 se almacena en la
RAM 001000002 y si D3-2 es 112 todas las posiciones de la RAM se llenarán con
111111112. Si el bit CF es puesto a uno, se limpia la memoria FIFO y se desactiva la
salida IRQ. En el modo de matriz de sensores además el apuntador de direcciones
selecciona la fila cero de la RAM. El bit CA activa una combinación de los efectos de
CD y CF. En la práctica borra todas las memorias internas del 8279.

8. Fin de interrupción/Puesta en modo de error


D7 D6 D5 D4 D3 D2 D1 D0
1 1 1 E X X X X

Fig.9.68. Palabra de control para desactivar solicitud de interrupción en modo sensor.

En el modo matriz de sensores, esta palabra de control lleva a cero la salida


IRQ de solicitud de interrupción y habilita escrituras posteriores en la RAM (en este
modo IRQ se activa cuando se detecta un cambio en el sensor inhibiendo además las
escrituras en la RAM hasta un reset). Para el modo N key rollover, si E =1 el 8279
funcionará en el modo especial de error.

Ejemplo 9.13

Una matriz de teclado de 20 pulsadores se conecta al µP 8085 a través de un


8279, como se muestra en la figura 9.69. El reloj del sistema es 2.0 MHz y la salida
IRQ del controlador de teclado se conecta ala línea de interrupción RST 6.5. El 8279
está decodificado en la dirección 20H. Escriba una subrutina de lectura de teclado que
retorne el código de la tecla en el registro acumulador.
Dispositivos de E/S Programables 589

Fig.9.69. interconexión de un teclado de 20 teclas al 8279.


Dispositivos de E/S Programables 590

;----------------------------------------------------------------------------------------------------------------
; Programa de lectura de teclado.
;----------------------------------------------------------------------------------------------------------------
pdato_8279 equ 20h ; Puerto de datos del 8279.
pctrl_8279 equ 21h ; Puerto de comandos del 8279.
div_reloj equ 00110100b ; Reloj de 2 Mhz. Divisor 20.
modo_tcld equ 0 ; Teclado con exploración codificada
leer_fifo equ 01010000b ; Se lee la FIFO.
borra_fifo equ 11000010b ; Borrar FIFO.
;----------------------------------------------------------------------------------------------------------------
jmp inicio

org 34h
in pdato_8279 ; Leer dato desde teclado
ret ; y retornar
;----------------------------------------------------------------------------------------------------------------
inicio: lxi sp,t_pila ; Cargar el apuntador de pila
mvi a,div_reloj ; Divisor de reloj en 20.
out pctrl_8279
mvi a,modo_tcld ; Modo de teclado
out pctrl_8279
mvi a,borra_fifo ; Borrar la FIFO
out pctrl_8279
mvi a,leer_fifo ; Activar lectura de la FIFO.
out pctrl_8279
mvi a,0dh ; Desenmascarar interrupción RST 6.5.
sim
call leer_tcld ; Leer teclado.
.
.
.
;----------------------------------------------------------------------------------------------------------------
; Lee caracter desde teclado
;----------------------------------------------------------------------------------------------------------------
leer_tcld: ei ; Se habilitan las interrupciones
hlt ; Se espera por pulsación de una tecla
ret ; Retorno con código de tecla en el acumulador
;----------------------------------------------------------------------------------------------------------------

Muchas aplicaciones prácticas incorporan una pantalla de varios caracteres,


además del teclado. El 8279 puede controlar en forma simultánea ambos tipos de pe-
riféricos. El ejemplo anterior, sólo con teclado, se presentó para mostrar el uso de la
salida IRQ para la detección de la activación de una tecla. A continuación se expone
un ejemplo del uso del 8279 en el manejo de teclado y pantalla. Debido a que la apli-
cación siguiente es el programa monitor de una tarjeta de evaluación para aplicacio-
nes basadas en el 8085, se dejan libres para el usuario las interrupciones (excepto
TRAP). La detección de la presión de una tecla se realiza leyendo la palabra de esta-
dos del 8279, cuyo formato se muestra en la figura 9.60. El programa mon85.asm es
un monitor para cargar en la EPROM del microcomputador µPro 85 y ejecuta todas
las funciones presentes en sistemas de desarrollo de bajo costo para carga, ejecución
y depuración del código de aplicaciones con microprocesadores.
Dispositivos de E/S Programables 591

Ejemplo 9.14

Se debe escribir un programa monitor para el control de un microcomputador


µPro 85 basado en el µP 8085. El µC tiene un teclado de 20 teclas y una pantalla de 6
caracteres, bajo el control de un 8279.

Fig.9.70. Teclado y pantalla del µPro 85.

En este ejemplo no se presenta la arquitectura de la tarjeta del µC, exceptuan-


do la sección de teclado/pantalla, cuyo diagrama eléctrico se muestra en la figura
9.72. El resto del diseño se deja como ejercicio para los estudiantes del curso Siste-
mas de µProcesadores. El µPro 85 es un µC con CPU 8085 y tiene 8 Kbytes de
EPROM, 16 Kbytes de RWM, 12 puertos de E/S y 2 temporizadores. El mapa de me-
moria y de puertos se muestra en la figura 9.71 y en la tabla 9.11, respectivamente.

FFFFH

LIBRE
36K
7000H
6FFFH
SRWM
2 x 6264
16K
3000H
2FFFH
SRWM
1 x 8155
256 bytes 2800H
27FFH
SRWM
1 x 8155
256 bytes 2000H
1FFFH
EPROM
1 x 2764
8K
0000H
Fig.9.71.Mapa de memoria del µPro 85. Los 8155 sólo ocupan 256 bytes de los bloques de 2 K.
Dispositivos de E/S Programables 592

Fig.9.72 Sección de teclado/pantalla del µPro 85.


Dispositivos de E/S Programables 593

Tabla.9.11Direcciopnes de los puertos del µPro 85.


PUERTO FUNCIÓN DISPOSITIVO PUERTO FUNCIÓN DISPOSITIVO

00H PUERTO DATOS 28H CONTROL


01H PUERTO CONTROL 8279 29H PUERTO A
20H CONTROL 2AH PUERTO B
21H PUERTO A 2BH PUERTO C 8155 N° 2
22H PUERTO B 2CH LSB TIMER
23H PUERTO C 8155 N° 1 2DH MSB DEL TIMER
24H LSB TIMER 30H PUERTO A
25H MSB DEL TIMER 31H PUERTO B
32H PUERTO C 8255 N° 1
33H COMANDO
50H PUERTO A
51H PUERTO B
52H PUERTO C 8255 N° 2
53H COMANDO

La entrada de interrupción TRAP es usada por el monitor para realizar la fun-


ción de ejecución de programas por pasos, mientras que las instrucciones RST 1 y
RST 7 se reservan para terminar un programa devolviendo el control al monitor y
para la llamada de las rutinas de usuario, respectivamente. Todas las demás entradas e
instrucciones de interrupción se dejan libres para su uso en el desarrollo de las aplica-
ciones.

El programa monitor ejecuta saltos a la memoria SRWM del 8155 #1 como


respuesta a una solicitud de interrupción. Las direcciones de SWRM donde el usuario
puede colocar una instrucción JMP hacia a la RSI que corresponda, se especifican en
la siguiente tabla.

Tabla.9.12 Interrupciones del µPro 85.


INTERRUPCIÓN DIRECCIÓN INTERRUPCIÓN DIRECCIÓN
RST 0 Reset por programa. RST 5.5 2025H
RST 1 Reservada RST 6.0 2028H
RST 2 2019H RST 6.5 202BH
RST 3 201CH RST 7.0 Reservada
RST 4 201FH RST 7.5 202EH
RST 5 2022H TRAP Reservada

El monitor del microcomputador µPro 85 ofrece un grupo de subrutinas, las


cuales pueden ser invocadas por el diseñador, para reducir el esfuerzo de desarrollo
del programa de la aplicación. Estos programas de usuario son identificados con un
número n: 0,…,4 y se llaman por medio del siguiente código:

mvi e, n
rst 7
Dispositivos de E/S Programables 594

En la tabla 9.13 se describe la función de cada rutina de usuario y se indica el


valor se n por medio del cual pueden ejecutarse.

Tabla.9.13 Rutinas de monitor del µPro 85.


Rutina n Descripción
LEER_TCLD 0 Espera por la pulsación de una tecla y retorna su código
en el registro acumulador.
MSTR_DR 1
Presenta el contenido del registro par HL en el campo de
direcciones de la pantalla.

MSTR:_DT 2 Presenta el contenido del registro acumulador en el cam-


po de datos de la pantalla.
3 Muestra en el campo de direcciones de la pantalla la
CAMP_DIR
cadena de caracteres apuntada por el registro par HL.
4 Muestra en el campo de datos de la pantalla la cadena de
CAMP_DAT
caracteres apuntada por el registro par HL.

La pantalla del microcomputador µPro 85 consta de seis indicadores incan-


descentes, agrupados en dos campos, como indica la parte superior de la figura 9.73.
Para la realización de los programas que usen el teclado, el usuario debe conocer los
códigos retornados por la activación de cada tecla. Estos son mostrados en la misma
figura.

Fig.9.73 Campos de la pantalla. Leyenda y códigos de retorno del teclado del µPro 85.
Dispositivos de E/S Programables 595

El mapa de caracteres de la tabla 9.14 muestra los códigos de los caracteres


que pueden presentarse usando las rutinas CAMP_DIR y CAMP_DAT. En realidad
este número corresponde a la posición del carácter en la tabla de códigos de siete
segmentos. Es posible que el usuario desee presentar caracteres distintos a los mos-
trados. Esto puede hacerlo, realizando accesos al 8279.

Tabla.9.14 Mapa de caracteres de µPro 85


Caracter en Código Caracter en Código
pantalla pantalla
0 00H g 10H
1 01H H 11H
2 02H L 12H
3 03H M 13H
4 04H n 14H
5 05H i 15H
6 06H J 16H
7 07H o 17H
8 08H P 18H
9 09H q 19H
A 0AH r 1AH
B 0BH t 1BH
C 0CH u 1CH
D 0DH ¿ 1DH
E 0EH _ 1EH
F 0FH espacio 1FH

El modo en el cual se realizan las interconexiones entre el los indicadores y el


controlador 8279, determina el número que identifica a cada LED de la pantalla y el
formato de los datos presentados en los displays de siete segmentos. Esta información
se muestra en la figura 9.74.

Fig.9.74 Numeración de los LEDs y correspondencia entre las salidas del 8279 y los segmentos del
display.
Dispositivos de E/S Programables 596

El µPro 85 genera algunos mensajes para comunicarse con el usuario. Estos


se presentan en el campo de direcciones, y son los siguientes:

Error.

Introducir dirección de memoria.

Espera tecla de registro.

Programa de usuario en ejecución.

Respuesta a tecla <EXAM>. Examinar registro: <R> o memoria: <M>

Respuesta a tecla <EJEC>. Ejecución normal: <N> o paso a paso: <PP>

Fig.9.75 Mensajes del µPro 85.

Las operaciones básicas que el ususario puede realizar con el microcomputa-


dor µPro 85 se describen a continuación:

• Examinar y modificar el contenido de la memoria SWRM.

• Examinar y modificar el contenido de los registros internos del µProcesador.

• Ejecutar un programa de usuario a partir de una dirección determinada hasta encontrar una
instrucción RST 1 o HLT.

• Ejecutar un programa de usuario por pasos.

Para ejecutar cada una de estas funciones, el usuario usa el teclado para intro-
ducir comandos al µC. Algunos ejemplos de comandos son los siguientes:

1. <EXAM><M> <2> <0><0> <0> <↓> <↓><↓> <↓> <↵>

Presenta en el campo de datos en forma sucesiva el contenido de la dirección de memoria


2000H, 2001H, 20021H, 2003H y devuelve el control al monitor mostrando el mensaje de
identificación.

2. <EXAM> <M> <2> <0> <0> <0> <↓> <4> <5> <↓> <↵>

Presenta en el campo de datos el byte en la posición 8000H de la SWRM, introduce el va-


lor 45H mostrándolo en el campo de datos y lo carga en la dirección 8000H presentándose
el contenido de 8001H para finalmente devolver el control al monitor.

3. <EXAM> <R> <A> <↓> <↓><↓> <↓> <7> <F><↓ > <↵>

Muestra en secuencia el contenido del registro acumulador A, de B, de C, de D, y del re-


gistro E. Sustituye por 7FH el valor almacenado en el registro E y devuelve el control a
monitor.
Dispositivos de E/S Programables 597

4. <EJEC> <N> <↵>

Ejecuta un programa en el modo de corrida libre, cuya primera instrucción se encuentra en


la posición de memoria cuya dirección muestra el campo de direcciones de la pantalla.

5. <EJEC> <N> <↓> <5> <0> <0> <0> <↵>

Ejecuta un programa en corrida libre cuya primera instrucción se encuentra en la dirección


de memoria 5000H.

6. <EJEC> <PP> <↓> <↓><↓> <↓> <↓> <↵>

Ejecuta, una por una, las cinco primeras instrucciones de un programa cuya primera ins-
trucción se encuentra en la posición de memoria indicada por el campo de direcciones de
la pantalla, y luego devuelve el control al monitor.

7. <EJEC> <PP> <*> <5><0> <0> <0> <↓> <↓><↓> <↓> <↓> <↵>

Ejecuta, una por una, las cinco primeras instrucciones de un programa, cuya primera ins-
truí ción se encuentra en la dirección de memoria 5000H. Al final se devuelve el control al
monitor.

<*> cualquier tecla excepto <↓>

El código en el archivo mon85.asm constituye el programa de mayor tamaño


presentado en este trabajo. Se supone que este monitor puede ser grabado en la
EPROM del µPro 85 para proveer en la práctica todas las funciones de microcompu-
tador. Aunque el µPro 85 no ha sido construido, el lector puede tener la seguridad
que el programa que se presenta en las páginas siguientes funcionará en forma correc-
ta al ser probado en el mundo real. Lo rotundo de la afirmación, se sustenta en el
hecho que el monitor fue exhaustivamente evaluado en simulaciones realizadas usan-
do el programa WSIM85. Aunque este simulador no es un software profesional de
costo elevado, sino una versión de evaluación descargada de Internet, el autor ha rea-
lizado con éste simulaciones de al menos cien programas y sólo ha encontrado un
error en la ejecución de la instrucción DAD y ésto sólo bajo ciertas condiciones.

Asumiendo que el WSIM85 simula en forma correcta el repertorio de instruc-


ciones del 8085, en realidad son el resto de los recursos que ofrece el simulador, lo
que lo convierten en una herramienta de gran poder para desarrollar aplicaciones ba-
sadas en el 8085. WSIM85 permite especificar un sistema µC con hasta cuatro bancos
de memorias EPROM y SWRM, hasta cinco dispositivos PPI 8255, un circuito multi-
función 8155, un controlador de teclado/pantalla 8279 además de timers 8253, con-
trolador de comunicaciones 8251 y módulo LCD.

Para configurar un sistema el usuario sólo debe especificar las direcciones de


cada circuito de memoria y de puerto y las conexiones necesarias. Por ejemplo puede
acoplarse la salida del temporizador del 8155 o la IRQ del 8279 a una de las líneas de
interrupciones del µP. También puede especificarse un divisor del reloj de la CPU,
para fijar la frecuencia de la señal de entrada al timer.
Dispositivos de E/S Programables 598

Una vez configurado el simulador de acuerdo con el hardware del µPRO 85,
el código fue exhaustivamente evaluado en sesiones de simulación hasta obtenerse la
versión final completamente operativa. El monitor fue depurado y se ejecutaron pro-
gramas que usan como entrada el teclado del µPro 85 y que presentan resultados en
su pantalla. Por ejemplo se cargó el código del reloj digital en la memoria del µPro
85 y se ejecutó, presentándose la hora en la ventana del 8279 del WSIM85.

En la práctica, la única manera de cargar un programa en la memoria del µPro


85 es introduciendo en memoria el código de operación en hexadecimal de cada ins-
trucción. Esto es una ardua tarea, aun para aplicaciones como el reloj digital. Usual-
mente los kits de evaluación como el µPro 85 pueden aceptar por un puerto de comu-
nicación serie, la descarga de un archivo en formato HEX INTEL desde un PC. En el
caso presente, si el lector desea ejecutar un programa extenso usando el µPro 85,
coloque el código del programa a ser cargado en la SWRM del µPRO 85, al final del
listado del monitor, de modo que se cargue en memoria junto con éste. Una vez en
memoria, el programa puede ser ejecutado como se indicó.

Una de las desventajas del simulador WSIM85 es que no tiene un teclado co-
mo el 8085 Virtual KIT, por ejemplo. En su lugar, para emular la activación de una
tecla se edita el 8279 y entonces el programa solicita, por medio de la ventana de dia-
logo de la figura 9.76, la posición en la matriz de teclado del pulsador activado.

Fig.9.76 Ventana de activación de una tecla en WSIM85.

Con este método se puede usar cualquier teclado con cualquier modo de inter-
conexión al 8279. La ventana de configuració del 8279 también permite especificar la
dirección del circuito, los códigos siete segmentos de los caracteres a presentar en
pantalla y la conexión, si se requiere, de la salida IRQ.

Como se observa en la figura 9.72, el µPro 85 utiliza como dispositivo de en-


trada un teclado que viene ensamblado de fábrica como una matriz 4 x 5 de pulsado-
res, similar al teclado mostrado en la figura 9.10. Se deduce del diagrama eléctrico de
la sección de teclado/pantalla, que se usa exploración codificada de las 4 filas de la
matriz y se interconectan las cinco líneas de columnas a las correspondientes entradas
de retorno RL[4:0]. Las líneas restantes, correspondientes a los tres bits de mayor
peso de RL, permanecen sin conexión y forzadas a nivel alto por los resistores en el
interior del 8279.
Dispositivos de E/S Programables 599

Fig.9.77 El µPro 85 tiene un 8279 en la dirección 00H y no usa la salida IRQ.

Fig.9.78 Posiciones de las teclas del µPro 85.

Este modo de interconexión del periférico al 8279 determina que la posición


de las teclas no se corresponde con su código como en el circuito de la figura 9.69.
De modo que para asignar los códigos a las teclas debe usarse una tabla de consulta.
Observe que las filas no tienen ocho pulsadores sino cinco, en consecuencia la tabla
debe considerar la posición de las teclas que no existen en cada fila.

Como se observa en la figura 9.73, la pantalla del µPro 85 consta de seis in-
dicadores de siete segmentos arreglados en dos campos: direcciones (L0-L3) y datos
(L4-L5). El modo de interconexión de las líneas de selección de dígito a los LEDs,
asigna el número de cada cual. Como el usuario de la tarjeta siempre estará muy cer-
ca de ésta, no se requiere que los diodos luminosos produzcan un gran nivel de ilumi-
nación. Los valores de los resistores en los segmentos garantizan una visibilidad ade-
cuada de los caracteres de la pantalla. El circuito 74LS244 se usa para suministrar la
corriente necesaria por segmento. La información suministrada sobre el hardware de
la tarjeta de evaluación se considera sufiente para escribir el programa de control del
microcomputador.

El programa monitor está organizado en un solo módulo y está compuesto por


subrutinas. Un diagrama simplificado del código se presenta en las figura 9.79 y 9.80.
Dispositivos de E/S Programables 600

Fig.9.79 Diagrama de flujo del programa monitor.

Al inicio se carga el apuntador de pila y se programa el controlador 8279. Se


configura para teclado con exploración codificada con protección para activación de
dos teclas y pantalla de ocho caracteres con entrada por la izquierda. A continuación
se borra la RAM de display y la FIFO.

El proceso de programación del 8279 debería indicar que se va a leer la FIFO


para poder obtener la posición de la tecla pulsada. Pero si esto se hace al inicio del
programa y posteriormente un código de usuario activa la lectura de la RAM de dis-
play, cuando el control regrese a monitor (a la rutina Orden), las operaciones de lec-
tura al 8279 retornarán el contenido de la RAM de pantalla y no el de la FIFO. Por
esta razón, la activación de la lectura de la FIFO se realiza cada vez que se invoca la
rutina de lectura de teclado.
Dispositivos de E/S Programables 601

Fig.9.80 Diagrama de flujo del programa monitor.


Dispositivos de E/S Programables 602

Continuando con el proceso de inicio, se debe programar el 8155. El monitor


no usa los puertos del 8155, sólo la sección de RAM y el temporizador. Pero debido a
que cuando se arranca o para el timer, a la vez se modifica la configuración de los
puertos, el monitor realiza una programación de éstos por defecto y almacena la pala-
bra de control com_ini en la posición de memoria ctrl_usu. Si un programa de usuario
usa los puertos del 8251 #1, deberá actualizar esta posición de memoria con el byte
que usa para configurar los puertos. De este modo, cuando el monitor arranca o detie-
ne el timer del 8155 #1, se usará el contenido de ctrl_usu para mantener la configura-
ción de los puertos impuesta por el programa de usuario.Una vez finalizada la pro-
gramación inicial, se salva el contenido de los registros internos del procesador y se
transfiere el control a la rutina Orden en espera de un comando de teclado. La rutina
Salvar_reg debe determinar desde donde fue invocada. Se usa una bandera de retorno
en la posición de memoria flag, la cual se inicia en cero y es puesta a 1 por la rutina
Paso antes de llamar a Salvar_reg, al retorno Paso vuelve a cero a flag.

La rutina Orden espera continuamente un comando válido desde teclado. Si


este no se produce Orden permanece en espera. Las teclas válidas son <EXAM> y
<EJEC>. Si una de estas teclas es activada, la rutina Orden procesa el comando dis-
criminando entre examinar memoria o registros y ejecución normal o por pasos. Si la
sintaxis del comando no es correcta se genera un mensaje de error. En caso contrario
se redirige el control del programa a una de cuatro rutinas: Exam_mem,, Exam_reg
Ejec o Paso.

$title(Programa monitor para µPro 85)


$subtitle(Monitor básico)
$ALLPUBLIC
;*************************************************************************************
; Monitor para µPro 85.
; Un microcomputador que puede ser simulado con el programa WSIM85
;*************************************************************************************
; Funciones:
; Examina y modifica la memoria
; Examina y modifica los registros
; Ejecuta un programa desde una dirección determinada hasta encontrar una
; Instrucción HLT o RST 1
; Ejecuta un programa por pasos desde una dirección dada
;*************************************************************************************
; El µC tiene un teclado de 20 teclas y
; una pantalla de seis indicadores de siete segmentos
; Ambos bajo control de un 8279
;*************************************************************************************
; Distribución de teclas. Observe que la tecla < ↵ > se sustituye por < OK >.

;+---+---+---+---+----+
;| C | D | E | F |EJEC|
;+---+---+---+---+----+
;| 8 | 9 | A | B |EXAM|
;|pch|pcl| | | |
;+---+---+---+---+----+
;| 4 | 5 | 6 | 7 | ! |
;| h | l |sph|spl| |
;+---+---+---+---+----+
;| 0 | 1 | 2 | 3 | OK |
;| r | m | n |pp | |
;+---+---+---+---+----+
Dispositivos de E/S Programables 603

; Códigos retornados por cada tecla

;+---+---+---+---+---+
;|0CH|0DH|0EH|0FH|13H|
;+---+---+---+---+---+
;| 8 | 9 |0AH|0BH|12H|
;+---+---+---+---+---+
;| 4 | 5 | 6 | 7 |11H|
;+---+---+---+---+---+
;| 0 | 1 | 2 | 3 |10H|
;+---+---+---+---+---+

; Posición o número de la tecla (Para simular teclado con WSIM85)

+---+---+---+---+---+
;|18H|19H|1AH|1BH|1CH|
;+---+---+---+---+---+
;|10H|11H|12H|13H|14H|
;+---+---+---+---+---+
;| 8 | 9 |0AH|0BH|0CH|
;+---+---+---+---+---+
;| 0 | 1 | 2 | 3 | 4 |
;+---+---+---+---+---+

;*************************************************************************************
; No se usa la salida INTR del 8279 para detectar pulsación de una tecla. Se lee la ;
; palabra de estados.
;*************************************************************************************
tope_rwm equ 20ffh ; RWM del 8155 #1 reservada para variables de monitor.
i_rwm equ 2000h ; Inicio RWM 8155 #1
i_stack equ tope_rwm-12 ; Inicio de la pila (6 niveles)
modo_tcld equ 0 ; Teclado codificado con protección para activación de
; dos teclas. Ocho indicadores con entrada por la iz-
; quierda
inic_8279 equ 0d3h ; Borra RAM de display y FIFO.
leer_fifo equ 50h ; Se leerá la FIFO.
ram_dig0 equ 90h ; Indicadores 0-3: Campo de direcciones.
ram_dig6 equ 96h ; Indicadores 6-7: Campo de datos.
; En realidad debe ser 94H.
; Para separar los campos en la simulación se usa 96H.
okey equ 10h ; Tecla ↵
flecha equ 11h ; Tecla ↓
exam equ 12h ; Tecla EXAM
ejec equ 13h ; Tecla EJEC
no_hex equ 0 ; Bandera número hex inválido
hex equ 1 ; Bandera número hex válido
bandera_dir equ 80h ; Indica impresión en campo direcciones
bandera_dat equ 0 ; Indica impresión en campo de datos
com_ini equ 40h ; Palabra de control inicial de usuario.
modo_timer equ 80h ; Un pulso al final de la cuenta
inic_timer equ 0C0h ; Arrancar timer
parar_timer equ 40h ; Detener timer
estd_alto: equ 1 ; Número de estados (186H) para cuenta del timer
estd_bajo equ 86h
;*************************************************************************************
; Definición de segmentos
;*************************************************************************************
defseg x8279,start=0, class=iospace ; 8279 en dirección 50h
defseg p8155,start=20h,class=iospace ; 8155 en direcciòn 20h
defseg stack, start=i_stack ; La pila reside en la RWM del
; 8155 #1
defseg datos, class=data,start=i_rwm ; RWM reservada por el monitor
defseg progr, class=code,absolute ; 8K de EPROM desde 0000H
;*************************************************************************************
Dispositivos de E/S Programables 604

;*************************************************************************************
; Registros del 8279
;*************************************************************************************
seg x8279
x8279_dato ds 1 ; Registro de datos del 8279
x8279_cntrl ds 1 ; Registro de control del 8279
;-------------------------------------------------------------------------------------

;*************************************************************************************
; Registros del 8155
;*************************************************************************************
seg p8155 ; Puertos A, B y C libres
pctrl_8155 ds 4
timer_bajo ds 1 ; Usado por rutina Paso
timer_alto ds 1 ; Usado por rutina Paso
;*************************************************************************************
; Los 12 bytes últimos de RWM de 8155 #1 soportan el stack.
;*************************************************************************************
seg stack
ds 12
;*************************************************************************************
; Segmento de datos en RWM de 8155 #1
;*************************************************************************************
seg datos

direcc ds 2 ; Dirección actual


dato ds 1 ; Dato actual
val_hex ds 1 ; Contiene bandera que indica si el numero desde
; teclado es un valor hex válido.
posic ds 1 ; Indica posición del registro seleccionado en la tabla
; de nombres de registro
mem_hex ds 2 ; Almacena los últimos cuatro dígitos hex obtenidos
; desde teclado
ctrl_usu ds 1 ; Programación inicial del 8155
flag db 0 ; Indica si la rutina salv_reg fue llamada desde Paso.
;-------------------------------------------------------------------------------------
;*************************************************************************************
; Area de memoria imagen de registros
;*************************************************************************************
regh: ds 1 ; Registro H
regL: ds 1
sph: ds 1
spl: ds 1
pch: ds 1
pcl: ds 1
regA: ds 1
regB: ds 1
regC: ds 1
regD: ds 1
regE ds 1
regF ds 1
;*************************************************************************************
; Area para colocar saltos a rutinas de servicio de interrupción

; La interrupción RST1 es usada para terminar los programas de usuario.


; En la práctica regresa el control al monitor
; La interrupción RST 7 está reservada para ejecución de rutinas de usuario.
; La entrada de interrupción TRAP está conectada a la salida deñ Timer del 8155 #1.
; El resto de RST n y de las interrupciones hardware están libres.
;*************************************************************************************
rst2: ds 3
rst3: ds 3
rst4 ds 3
rst5 ds 3
rst5.5: ds 3
rst6: ds 3
rst6.5: ds 3
rst7.5: ds 3
;*************************************************************************************
Dispositivos de E/S Programables 605

;*************************************************************************************
; Código en EPROM
;-------------------------------------------------------------------------------------
seg progr

reset: jmp inicio ; Vector de reset

;**********************************
; Vectores de interrupción
;**********************************

; Vector de interrupción RST 1


org 8
rst1: jmp salv_reg ; La ejecución de RST1 salva los regs. y espera comando

; Vector de interrupción RST 2


org 10h
jmp rst2

; Vector de interrupción RST 3


org 18h
jmp rst3

; Vector de interrupción RST 4


org 20h
jmp rst4

; Vector de interrupción TRAP


org 24h
jmp int_trap ; Salto a rutina Paso

; Vector de interrupción RST 5


org 28h
jmp rst5

; Vector de interrupción RST5.5


org 2ch
jmp rst5.5

; Vector de interrupción RST 6


org 30h
jmp rst6

; Vector de interrupción RST6.5


org 34h
jmp rst6.5

; Vector de interrupción RST 7


org 38h
jmp funcion ; Salto a tabla de saltos de rutinas de monitor

; Vector de interrupción RST7.5


org 3ch
jmp rst7.5

;*************************************************************************************
; Se programa el 8279
;*************************************************************************************
org 100h

inicio: lxi sp,tope_rwm-1 ; Se inicia el apuntador de pila


mvi a,modo_tcld
out x8279_cntrl ; Se programa modo de display y de teclado
mvi a,inic_8279 ; Se inicia 8279
out x8279_cntrl
mvi a,com_ini
sta ctrl_usu ; Valor inicial de comando de usuario
out pctrl_8155 ; Se programa el 8155
jmp salv_reg ; salvar registros
;*************************************************************************************
Dispositivos de E/S Programables 606

;*************************************************************************************
;Rutina de espera de comando
;*************************************************************************************
orden: call logo ; Imprime mensaje [µPro 85]
de_err: call leer_tcld ; Se espera comando
cpi exam ; Compara con <exam>
jz reg_mem ; Preguntar si reg o mem
cpi ejec ; No es <exam>, comparar con <ejec>
jnz orden ; Ni <exam> ni <ejec>, esperar comando
call apagar ; Es <ejec>, apagar pantalla
lxi h,normal_paso ; Apuntar a mensaje
call camp_dir ; Imprimir N¿PP
call leer_tcld ; Espera tecla: corrida libre o por paso
cpi 2 ; Comparar tecla con 1
jz ejecut ; Es 2 (N), salto a corrida libre
cpi 3 ; No es 2, comparar con 3 (pp)
jz paso ; Es 3 (PP), ejecutar por pasos
jmp orden ; Ni 2 (N) ni 3 (PP), esperar comando
reg_mem: call apagar ; Apagar pantalla
lxi h,regmem ; Cargar dirección de mensaje
call camp_dir ; Imprimir quE
call leer_tcld ; Esperar tecla
cpi 1 ; Comparar con 1 (M)
jz exam_mem ; Es 1 (M), a examinar memoria
cpi 0 ; No es 1 (M), comparar con 0 (R)
jz exam_reg ; Es 0 (R), a examinar registros
jmp error ; Ni 0 (R) ni 1 (M), Mensaje de error
;*************************************************************************************
; Ejecuta programa
;*************************************************************************************
ejecut: call apagar ; Borrar pantalla
lhld direcc ; cargar en HL dirección de usuario
call format_dig ; Separar dígitos de direcciones
call camp_dir ; Presentar dirección
call leer_tcld ; Espera tecla
cpi okey ; Comparar con <okey>
jz pc_actual ; Si <okey> ejecutar el programa
cpi flecha ; No <okey>, comparar con <flecha>
jnz error ; No <okey> ni <flecha>; emitir mensaje de error
call apagar ; Es <flecha>, borrar pantalla
lxi h,orgexam ; Apuntar a mensaje dir
call camp_dir ; Presentar dir
mvi c,bandera_dir ; Se insertará nueva dirección
call modif ; Introducir dirección
cpi okey ; ¿Última tecla fue <okey>?
jnz error ; No, emitir mensaje [Err]
pc_actual: call apagar ; Si, apagar pantalla
lxi h,exe ; Presentar mensaje
call camp_dir ; [EJEC] en campo de direcciones
lhld direcc ; Guardar nueva dirección en
call interc_hl ; la memoria imagen
shld pch ; del contador de programa
jmp obtener_reg ; Recuperar registros antes de ejecutar
;*************************************************************************************
; Ejecuta programa por pasos
;*************************************************************************************
paso: call apagar ; Apagar pantalla
lhld pch ; Contador de programa de usuario a HL
call interc_hl
shld direcc ; Hacer HL dirección actual
call format_dig
call camp_dir ; Presentar dirección actual en pantalla
call mostr_dat ; Mostrar contenido de direcc en campo de datos
call leer_tcld ; Esperar tecla
cpi okey ; Comparar con <okey>
jz orden ; Si <okey>, presentar logo y esperar comando
cpi flecha ; No <okey>, comparar con <flecha>
jz timer ; Es <flecha>, arrancar timer
call apagar ; No es <flecha>, apagar pantalla
lxi h,orgexam ; Presentar mensaje
Dispositivos de E/S Programables 607

call camp_dir ; [dir]


mvi c,bandera_dir ; Introducir nueva dirección
call modif.
call interc_hl ; Nueva dirección en HL
shld pch ; Guardar como contador de programa
cpi flecha ; Última tecla fue <flecha>
jnz error ; No, presentar [Err]
call mostr_dat ; Si, mostrar dato
timer: mvi a,modo_timer or estd_alto ; Modo y 6 bits altos del timer
out timer_alto ; Programar timer
mvi a,estd_bajo ; Byte bajo del timer
out timer_bajo ; Programar timer
lda ctrl_usu ; Al A palabra de control de usuario
ori inic_timer ; Incoporar comando de arranque del timer
out pctrl_8155 ; Arrancar timer y mantener palabra de usuario
jmp obtener_reg ; Recuperar registros y ejecutar una instrucción
int_trap: push psw ; PSW a la pila. Retorno desde interrupción
lda ctrl_usu ; Al A palabra de control de usuario
ani 3fh ; Poner a cero A7 y A6
ori parar_timer ; Cargar comando de parada de timer
out pctrl_8155 ; Parar timer
mvi a,1 ; Uno al acumulador
sta flag ; Bandera Flag a 1
pop psw ; Recuperar PSW
jmp salv_reg ; Salvar registros
vuelta: xra a ; Flag es 1, retorno aqui desde salv_reg
sta flag ; Flag a 0
jmp paso ; A ejectar siguiente instrucción

;*************************************************************************************
; Mensaje de identificación µPro 85
;*************************************************************************************
logo: lxi h,mpro ; Dirección de identificación
call camp_dir ; Mostrar [µPro]
lxi h,_85
call camp_dat ; Mostrar [85]
ret
;*************************************************************************************
; Actualiza campo de direcciones
;*************************************************************************************
mostr_dir: lda dato ; Cargar en acumulador dato actual
lhld direcc ; Cargar en HL dirección actual
mov m,A ; Mover dato a memoria

cmp m ; Comparar memoria con dato escrito


jnz error ; Son diferentes, Err
inx h ; Apuntar posición de memoria siguiente
shld direcc ; Hacer dirección actual
mstrdr: call format_dig
call camp_dir ; Presentar en campo de direcciones
ret ; retornar
;*************************************************************************************
; Actualiza campo de datos
;*************************************************************************************
mostr_dat: lhld direcc ; En HL dirección actual
mov a,m ; Recuperar dato
sta dato ; Actualizar dato
mstrdt: mvi b,0 ; Se usará campo de datos
mov h,a ; Dato en H
call format_dig ; Separa valor en dígitos
call camp_dat ; Presentar contenido de dirección actual
ret ; Retornar
;*************************************************************************************
; Guarda contenido de registros en memoria
;*************************************************************************************
salv_reg: shld regh ; Cargar HL en memoria imagen
pop h ; Contador de programa a HL
shld pch ; Salvar PC
push d ; DE a la pila
Dispositivos de E/S Programables 608

push b ; BC a la pila
pop h ; BC de la pila a HL
shld regb ; BC a memoria imagen
pop h ; DE de la pila a HL
shld regd ; DE a memoria imagen
lxi h,0 ; HL en cero
dad sp ; A HL el contenido del SP
shld sph ; El SP desde HL a memoria imagen
push psw ; PSW a la pila
pop h ; Banderas a L
mov a,h ; Carga acumulador con valor desde la pila
sta rega ; A a memoria de registro A
mov a,l ; Banderas al acumulador
sta reg ; Banderas a memoria imagen
call orden_regs ; Ordenar memoria de registros
lda flag ; Al acumulador bit de estado FLAG
cpi 1 ; Probar si la rutina fue llamada desde Paso
jz vuelta ; Si, regresar a paso
jmp orden ; No, esperar comando.

;*************************************************************************************
; Recuperar registros
;*************************************************************************************
obtener_reg: lhld regd ; Recuperar registros D y E
mov d,l
mov e,h
lhld regb ; Obtener registros B y C
mov b,l
mov c,h
lhld rega ; Registro A a L
lda regf ; Banderas al acumulador
mov h,l ; Acumulador al registro H
mov l,a ; Banderas al registro L
push h ; PSW a la pila
pop psw ; Recuperar PSW
lhld sph ; Cargar imagen de apuntador de pila en HL
call interc_hl
sphl ; Cargar HL en apuntador de pila
lhld pch ; El Contador de programa en HL
call interc_hl
push h ; EL contador de programa ala pila
lhld regh ; Recuperar registros H y L
call interc_hl
ret ; Ejecutar Programa
;*************************************************************************************

;*************************************************************************************
; Examina la memoria y modifica la RAM
;*************************************************************************************
exam_mem: call apagar ; Apagar indicadores
lxi h,orgexam ; Cargar en HL dirección del mensaje exam
call camp_dir ; Presentarlo: [][d][i][r] [][]
mvi c,bandera_dir ; Se usará el campo de direcciones
call modif ; Especificar dirección de memoria deseada.
mov d,a ; Salvar última tecla pulsada.
lda val_hex ; Cargar en A bandera de número hex
cpi no_hex ; Probar si dirección es un número hex válido
jz error ; No hex, emitir mensaje Err y esperar comando
mov a,d ; Hex, recuperar última tecla pulsada
cpi flecha ; ¿Flecha hacia abajo? o tecla ¿OK?
jnz salir ; Si tecla OK retornar a esperar nuevo comando
call mostr_dat ; Si Flecha... presentar contenido de la posición
; de Memoria seleccionada después de [][d][i][r]
mvi c,bandera_dat ; Se usará el campo de datos
prox_pos: call modif ; Exam/Modif contenido de la dirección actual
cpi flecha ; Ultima tecla: ¿Flecha hacia abajo? o tecla ¿OK?
jnz salir ; Si tecla OK retornar a esperar nuevo comando
call mostr_dir ; Si Flecha... presentar dirección y contenido de
call mostr_dat ; La posición de memoria siguiente.
jmp prox_pos ; Continuar Exam/Modif memoria
Dispositivos de E/S Programables 609

salir: jmp orden ; Salir a esoerar comando


;*************************************************************************************
; Examina y modifica los registros
;*************************************************************************************
exam_reg: call apagar ; Apagar indicadores
lxi h,orgexar ; Cargar en HL dirección del mensaje reg
call camp_dir ; Presentar [rEg]
call leer_tcld ; Esperar registro
cpi 10h ; Es un dígito hex
jnc error ; No, [Err]
cpi 4 ; Comparar con tecla 4
jc error ; Si es menor, no es un registro
sui 4 ; Restar 4 para determinar posición en tabla de
; registros
exm_regh: sta posic ; Salvar posición
lxi h,nombreg ; Cargar en HL inicio de tabla de nombre de reg
add a ; Multiplicar posición por cuatro
add a
add l ; Sumar nuevo valor a dirección inicial de tabla
mov l,a ; Apuntar registro seleccionado
prox_reg: push h ; Dirección en la tabla de nombre regs a la pila
call camp_dir ; Presentar nombre de reg en campo de direcciones
lxi h,regh ; Cargar en HL dirección de memoria imagen de H
lda posic ; Cargar en acumulador posición de registro
; seleccionado/siguiente
add l ; Sumar posición de registro actual a dirección
; imagen de registro H
mov l,a ; HL contiene dirección de memoria imagen del
; registro seleccionado
lda posic ; Al acumulador posición del registro actual
inr a ; Siguiente registro
sta posic ; Se guarda posición del siguiente registro
mov a,m ; Se recupera contenido del registro seleccionado
sta dato ; Esto es el dato actual
push h ; Se guarda dirección imagen del registro actual
call mstrdt ; Se muestra el contenido del registro actual en
; el campo de datos
mvi c,bandera_dat ; Se modificará el dato
call modif ; Modificar dato
cpi flecha ; Última tecla fue <flecha>?
jnz orden ; No ,fue <ok>. Ir a esperar comando
pop h ; Fue <flecha>, Recuperar dirección imagen del
; registro actual
lda dato ; Cargar en el acumulador nuevo dato
mov m,a ; Actualizar dirección imagen de registro
pop h ; Recuperar dirección del registro en tabla de
; nombres
mov a,l
cpi ultreg ; Probar si es el último registro
jnz no_ultimo ; No es el último (F); seguir
xra a ; Es el último, la siguiente posición es la 0 (H)
jmp exm_regh ; Salto a examinar registro H
no_ultimo: lxi d,4 ; No es el último
dad d ; HL apunta al siguiente registro
jmp prox_reg ; Examinar próximo registro.
;*************************************************************************************
; Convierte una cadena de dígitos de teclados en direcciones
; o datos y los presenta en el campo correspondiente.
;*************************************************************************************
modif: lxi h,0 ; Cargar cero en HL
shld mem_hex ; Guardar HL en posición que contiene valor hex
xra a ; Limpiar acumulador
sta val_hex ; Bandera Val_hex a cero
prox_hex: call leer_tcld ; Esperar tecla
cpi okey ; Comparar con <okey>
jnc no_numero ; Mayor o igual que 16, no es un dígito Hex
lxi h,val_hex ; Es un dígito hex. Apuntar dirección de bandera
; de número válido
mvi m,hex ; Bandera de en Val_hex indica que se tecleó un
; número válido
Dispositivos de E/S Programables 610

lhld mem_hex ; Cargar en HL valor hex


dad h ; Eliminar digito de mayor orden y poner cero en
; dígito de orden menor.
dad h
dad h
dad h
ora l ; Empacar en A, el número desde teclado y el
; dígito 2 en registro L
mov l,a ; Insertar dígito desde teclado en HL
shld mem_hex ; Salvar nuevo valor Hex
mov a,c ; Determinar si se trata de una dirección o dato
rlc ; Obtener acarreo
jc modf_dir ; Si uno, es una dirección
mov h,l ; Si cero, es un dato que se mueve a H
mov a,h ; Dato al acumulador
sta dato ; Convertir en dato actual
call format_dig
call camp_dat ; Presentar dato
jmp prox_hex ; Esperar próximo dígito de datos
modf_dir: shld direcc ; Guardar valor hex en direcc
call format_dig
call camp_dir ; Presentar nueva dirección
jmp prox_hex ; Salto a esperar introducción de nuevo dígito de
; dirección
no_numero: cpi exam ; Comparar comando con <exam>
jnc error ; Si es mayor, mensaje de error
lhld mem_hex ; Si menor, es <flecha>
ret ; retornar
;*************************************************************************************
; Presenta caracteres en campo de direcciones
;*************************************************************************************
camp_dir: ori bandera_dir ; Se presentará una dirección
call visual ; presentar
ret
;*************************************************************************************
; Presenta caracteres en campo de datos
;*************************************************************************************
camp_dat: xra a ; Se presentará un dato
call visual ; Presentar
ret
;*************************************************************************************

;*************************************************************************************
; Apaga los indicadores
;*************************************************************************************
apagar: lxi h,apag ; Apuntar caracteres de espacio
call camp_dir ; Borrar campo de direcciones
lxi h,apag ; Apuntar espacio en blanco
call camp_dat ; Borrar campo de datos
ret
;*************************************************************************************
; Presenta mensaje de error
;*************************************************************************************
error: call apagar ; Apagar pantalla
lxi h,err ; Apuntar mensaje de error
call camp_dir ; Presentar Err
jmp de_err ; Retorno a esperar comando
;*************************************************************************************
; Salida de caracter a display
;*************************************************************************************
visual: jm vis_dir ; Detectar si se imprime en campo de
; direcciones o de datos
mvi b,2 ; Campo de datos, dos dígitos
mvi a,ram_dig6 ; Se presenta primero en L6
jmp prog_disp ; Salto a programar controlador de display
vis_dir: mvi b,4 ; Campo de direcciones, 4 dígitos
mvi a,ram_dig0 ; Se presenta primero en L0
prog_disp: out x8279_cntrl ; Se presenta dígito L0/L6 con autoincremento
prox_dig: mov a,m ; Mover al acumulador L0/L6
xchg ; Preservar HL: Dirección de dígito a presentar
Dispositivos de E/S Programables 611

lxi h,cod_7Seg ; Apuntar tabla de conversión a 7-seg


add l ; Desplazarse en la tabla
mov l,a
mov a,m ; Obtener código de 7-seg
cma
out x8279_dato ; Presentar en indicador
xchg ; Recuperar HL
inx h ; Apuntar siguiente dígito
dcr b ; Contador_ dígitos = Contador_dígitos-1
jnz prox_dig ; No cero, obtener próximo caracter
ret ; Si cero,retornar
;*************************************************************************************
;Lee caracter desde teclado
;*************************************************************************************
leer_tcld: mvi a,leer_fifo ; Se leerá la FIFO
out x8279_cntrl ; del teclado
in x8279_cntrl ; Se lee la palabra de estado.
ani 7 ; Máscara para NNN:número de cracateres en FIFO
jz leer_tcld ; Si cero, esperar activación de tecla
in x8279_dato ; No cero, leer posición de tecla
lxi h,tecla ; Apuntar a posición inicial de tabla de teclado
add l ; Desplazarse hasta la tecla presionada
mov l,a
mov a,m ; Obtener código de la tecla
ret ; Retornar
;*************************************************************************************
; El número hexadecimal de 4 bits en HL es separado en
; dígitos individuales los cuales se cargan en memoria
; a partir de la dirección mem_dig. Este formato es el
; adecuado para presentación en los indicadores de 7-SEG
;
; Contenido de HL es un valor de 4 dígitos hexadecimales
; H L
; (D3D2)(D1D0)
;*************************************************************************************
format_dig: mov a,h ; Cargar en acumulador D3D2
rar ; Rotar 4 bits a la derecha
rar
rar
rar
ani 0FH ; En A (0D3)
lxi d,mem_dig ; Apuntar dirección de 0D3
stax d ; Cargar 0D3 en memoria de pantalla
mov a,h ; Cargar en acumulador D3D2
ani 0FH ; Convertir en 0D2
inx d ; Apuntar dirección de 0D2
stax d ; Copiar 0D2 en memoria
mov a,l ; Mover al A D1D0
rar ; Rotar 4 bits a la derecha
rar
rar
rar
ani 0FH ; En A (0D1)
inx d ; Apuntar dirección de 0D1
stax d ; Cargar 0D1 en memoria de pantalla
mov a,l ; Mover al A D1D0
ani 0FH ; Convertir en 0D0
inx d ; Apuntar dirección de 0D0
stax d ; Copiar 0D0en memoria
lxi h,mem_dig ; HL apunta a posición de D0
ret ; Retornar
;*************************************************************************************
; Intercambiar H y L
;*************************************************************************************
interc_hl: push b ; Salvar BC
mov b,h ; Cargar H en B
mov h,l ; Copiar L en H
mov l,b ; Copiar H en L
pop b ; Recuperar BC
Dispositivos de E/S Programables 612

ret ; Retornar

;*************************************************************************************
; Ordenar registros
; Los registros en memoria están:
; L H SPL SPH PCL PCH A C B E D F
; Deben ordenarse para efectos de presentación como:
; H L SPH SPL PCH PCL A B C D E F
;*************************************************************************************
orden_regs: mvi e,5 ; Se intercambian 5 registros
lxi h,regh ; HL apunta a regH
lxi b,regl ; BC apunta a regL
prox: mov d,m ; Intercambiar regH con regL
ldax b ; .
mov m,a ; .
mov a,d ; .
stax b ; .
dcr e ; Decrementar contador
rz ; Si cero,retornar
inr l ; Apuntar siguiente
inr l ; Registro SPH, PCH o D
inr c ; Apuntar siguiente registro
inr c ; SPL, PCL o E
mov a,e ; Mover contador al acumulador
cpi 2 ; Probar si se apunta al regA
jnz prox ; No, intercambiar próximos registro
inr l ; Si omitir acumulador. Apuntar a B
inr c ; Apuntar a C
jmp prox ; Continuar con siguiente
;*************************************************************************************
; funcion = Tabla de saltos para rutinas de monitor
;*************************************************************************************
; Para ejecutar rutinas de monitor
; mvi e,n cargar en e el número de la rutina y ejecutar
; rst 7

; n =
; (0) leer_tcld: Espera la pulsación de una tecla y retorna el valor en A.
; (1) mstrdr: Presenta el contenido del registro par HL en el campo de direc-
; ciones.
; (2) mstrdt: Presenta el contenido del A en el campo de datos.
; (3) camp_dir: Presenta una cadena de caracteres en el campo de direcciones
; HL contiene la dirección del primer caracter.

; (4) camp_dat: Presenta una cadena de caracteres en el campo de datos


; HL contiene la dirección del primer caracter
;*************************************************************************************
funcion: push h
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.
pop h ; Recuperar HL
push d ; Dirección de salto a la pila.
ret ; Saltar al proceso.
tabla: dw leer_tcld,mstrdr,mstrdt,camp_dir,camp_dat
Dispositivos de E/S Programables 613

;*************************************************************************************
; Tabla de códigos de siete segmentos
;*************************************************************************************
org 0500h
cod_7Seg:
cero equ $-cod_7Seg
db 0f3h
db 60h
db 0b5h
db 0f4h
cuatro equ $-cod_7Seg
db 66h
cinco equ $-cod_7Seg
S equ $-cod_7Seg
db 0d6h
db 0d7h
db 70h
ocho equ $-cod_7Seg
db 0f7h
db 7eh
?A equ $-cod_7Seg
db 77h
?B equ $-cod_7Seg
db 0c7h
?C equ $-cod_7Seg
db 93h
?d equ $-cod_7Seg
db 0e5h
?E equ $-cod_7Seg
db 97h
F equ $-cod_7Seg
db 17h
g equ $-cod_7Seg
db 0f6h
?H equ $-cod_7Seg
db 67h
?L equ $-cod_7Seg
db 85h
?M equ $-cod_7Seg
db 0e6h
n equ $-cod_7Seg
db 45h
i equ $-cod_7Seg
db 20h
J equ $-cod_7Seg
db 0e1h
o equ $-cod_7Seg
db 0e4h
P equ $-cod_7Seg
db 37h
q equ $-cod_7Seg
db 76h
r equ $-cod_7Seg
db 05h
t equ $-cod_7Seg
db 44h
u equ $-cod_7Seg
db 0Eh
¿ equ $-cod_7Seg
db 0A3h
_ equ $-cod_7Seg
db 80H
Dispositivos de E/S Programables 614

espac equ $-cod_7Seg


db 00h
;*************************************************************************************
; nombre de registros
;*************************************************************************************
nombreg: db espac,espac,espac,?H
db espac,espac,espac,?L
db espac,S,P,?H
db espac,S,P,?L
db espac,P,?C,?H
db espac,P,?C,?L
db espac,espac,espac,?A
db espac,espac,espac,?B
db espac,espac,espac,?C
db espac,espac,espac,?D
db espac,espac,espac,?E
ultreg equ low($)
db espac,espac,espac,F

;*************************************************************************************
; Códigos de teclado
;*************************************************************************************
ORG 600H
tecla: db 0 ; Tecla <0>
db 1 ; Tecla <1>
db 2 ; Tecla <2>
db 3 ; Tecla <3>
db 10H ; Tecla <↵>
db 14H ; Tecla no existe
db 14H ; Tecla no existe
db 14H ; Tecla no existe
db 4 ; Tecla <4>
db 5 ; Tecla <5>
db 6 ; Tecla <6>
db 7 ; Tecla <7>
db 11H ; Tecla <flecha hacia abajo>
db 14H ; Tecla no existe
db 14H ; Tecla no existe
db 14H ; Tecla no existe
db 8 ; Tecla <8>
db 9 ; Tecla <9>
db 0AH ; Tecla <A>
db 0BH ; Tecla <B>
db 12H ; Tecla <EXAM>
db 14H ; Tecla no existe
db 14H ; Tecla no existe
db 14H ; Tecla no existe
db 0CH ; Tecla <C>
db 0DH ; Tecla <D>
db 0EH ; Tecla <E>
db 0FH ; Tecla <F>
db 13H ; Tecla <EJEC>
;*************************************************************************************
; Area de mensajes
;*************************************************************************************
orgexam: db ?d,i,r,espac ; [d][i][r][]
orgexar: db r,?E,G,espac ; [r][E][G][]
regmem: db espac,q,u,?E ; [][q][u][E]
err: db espac,?E,r,r ; [][E][r][r]
exe: db ?E,J,?E,?C ; [E][J][E][C]
apag: db espac,espac,espac,espac
mpro: db u,P,r,o ; [u][P][r][o]
_85: db ocho,cinco ; [8][5]
normal_paso: db n,¿,P,P ; [n][¿][P][P]
end
;************* Fin de monitor********************************************************
Dispositivos de E/S Programables 615

Los comentarios del programa permiten un fácil seguimiento de los algorit-


mos. En este trabajo no hay espacio para una exposición completa del modo de fun-
cionamiento de cada rutina. Sólo se discuten las rutinas de lectura de teclado:
LEER_TLCD y de presentación en pantalla: VISUAL. Mayores detalles sobre el pro-
grama se discutirán en las sesiones de clases del curso Sistemas de µProcesadores.

Fig. 9.81 Diagrama de flujo de la rutina LEER_TCLD.

Este código es invocado por varias rutinas del monitor. Su función es esperar
por la activación de una tecla y cuando esto ocurra debe retornar en el registro acu-
mulador el código del pulsador activado. Como indica la figura 9.81, al inicio se indi-
Dispositivos de E/S Programables 616

ca al 8279 que se va a leer la FIFO y de inmediato se obtiene la palabra de estados


del 8279.

Como se aprecia la figura 9.60, si los tres bits de menor peso (NNN) de la pala-
bra de estado están en cero, indica que no se ha producido la activación de una tecla.
La rutina LEER_TCLD examina el valor de NNN y procede a leer desde la FIFO la
posición del pulsador cuando se ha producido la presión de una tecla. En caso contra-
rio, la rutina permanece en espera que se presione un interruptor del teclado. El nú-
mero de la tecla se usa como entrada a una tabla de consulta para obtener el código
correspondiente.

Fig. 9.82 Diagrama de flujo de la rutina VISUAL.

La rutina VISUAL presenta en el campo de direcciones (S = 1) o en el campo


de datos (S =0) la cadena de caracteres cuyo primer elemento está en la dirección de
memoria apuntada por el registro par HL. Al inicio examina el estado de la bandera
Dispositivos de E/S Programables 617

de signo y si está activa se presentará en el campo de direcciones, cargándose el con-


tador de caracteres con 4. En caso contrario, se usará el campo de datos y el contador
se inicia en 2. Luego de cargar el contador se indica al 8279 en cual LED se inicia la
presentación (L0): direcciones, L4: datos). A continuación se obtiene desde memoria
el carácter y se carga en el registro acumulador. Con el contenido del A se entra en
una tabla de consultas que contiene los códigos siete segmentos de los caracteres y se
obtiene el que corresponde, el cual es cargado en la memoria de display y presentado
en el L0 o en L4. De seguido se incrementa el apuntador de memoria para seleccionar
la posición del carácter siguiente y se disminuye en 1 el contador de caracteres, el
caracter se presenta en L1 o en L5 y sucesivamente el proceso se repite hasta cuando
el contador de caracteres llega a cero.

La rutina VISUAL no sólo presenta mensajes en la pantalla del µPro 85 sino


que es el código que se encarga de presentar las entradas de teclado en el campo de
direcciones o datos, según convenga. El µC mantiene en la posició de memoria direcc
y direcc+1 la dirección actual entrada desde teclado y en la posición dato el conteni-
do de esta localización o el contenido de un registro. El monitor mantiene continua-
mente actualizada la pantalla presentando en el campo correspondiente el contenido
de estas direcciones. Para esto previamente se formatea la posición direcc y direcc +1
o la posición dato de modo que cada dígito de 4 bits ocupe una localidad de memoria
a partir de mem_dig. La rutina VISUAL es entonces llamada para presentar el conte-
nido de mem_dig y mem_dig +1 en el campo de datos o el contenido de mem_dig,
mem_dig +1, mem_dig +2 y mem_dig +3 en el campo de direcciones.

Como se explica antes, la simulación en WSIM85 es tediosa por lo lento del


proceso de introducir comandos mientras que la gran ventaja es que se simulan peri-
féricos reales. Para solventar tal situación, se adaptó el monitor presentado para ser
cargado en la memoria ROM del microcomputador virtual SAD 85. Aunque este mi-
crocomputador no usa circuitos reales, tiene un teclado para facilitar la introducción
de comandos. En cierta forma es una mejora del monitor pues se puede usar la tecla
<Prev> para examinar direcciones en retroceso y además se incorporó la posibilidad
de modificar y examinar los registros usando la tecla <Block>, función esta no reali-
zada por el 8085 Virtual Kit en su versión original. Las siguientes páginas muestran el
resultado de sesiones de simulación con ambas versiones del monitor.

Los nombres con los cuales el µPro 85 identifica lor registros internos del mi-
croprocesador 8085 se muestran a continuación:
Tabla. 9.15 Nombre y orden con el cual se muestran los registros en pantalla.
Símbolo Descripción Símbolo Descripción
H Registro H A Registro A.
L Registro L B Registro B.
SPH Byte alto del apuntador de pila. C Registro C.
SPL Byte bajo del apuntador de pila. D Registro D.
PCH Byte alto del contador de programa. E RegistroE.
PCL Byte bajo del contador de programa. F Registro de banderas.
Dispositivos de E/S Programables 618

Fig. 9.83 La pantalla del µPro 85 muestra el mensaje de identificación al inicio de la simulación..
Dispositivos de E/S Programables 619

Fig. 9.84 La pantalla del µPro 85 muestra el contenido del registro acumulador.
Dispositivos de E/S Programables 620

Fig. 9.85 Mensaje de identificación del µPro 85 en la ventana del 8085 Virtual Kit..
Dispositivos de E/S Programables 621

Fig. 9.86 El µPro 85 muestra el contenido del registro acumulador en la ventana del 8085 Virtual Kit..
Dispositivos de E/S Programables 622

La versión del monitor para el 8085 Virtual Kit realiza la lectura del teclado
por medio de la interrupción RST 5.5 y las llamadas a las subrutinas de monitor se
realizan en forma convencional, usando la instrucción CALL dirección.

Los dos ejemplos finales de este capitulo, ilustran el manejo del controlador
8279. Ambos ejemplos se escriben para ejecución en el microcomputador MPR-85,
aunque con las limitaciones para simulación de la interfaz analógica, el código puede
ser ejecutado en el µPro 85. La primera aplicación es un medidor de temperatura
ambiente y la segunda un medidor de capacidad. Ambos presentan su lectura en el
campo de direcciones de la pantalla del MPR-85.

Ejemplo 9.15

Diseñar y programar un medidor de temperatura ambiente. El instrumento de-


be presentar la temperatura en °C en el campo de direcciones de la pantalla del MPR-
85 PLUS, como indica la figura 9.87. Como sensor se usa un transistor bipolar tipo
2N3904.

Fig. 9.87 Presentación de la temperatura ambiente en el display del MPR-85 PLUS.

Las siguientes especificaciones se aplican al instrumento:


Rango de medida:

Para permitir el uso del medidor en cualquier lugar del planeta, el rango de medida ha sido ex-
tendido al máximo posible. Se selecciona para el termómetro un rango de -40 °C ≤ T ≤ 60 °C.

Resolución:

El cambio mínimo detectable de temperatura debe ser de 0.5 °C, valor apropiado para un me-
didor de temperatura ambiente.

Solución:

El sensor usado en el instrumento es un transistor BJT conectado como diodo


como se observa en la figura 9.88. Un sensor tipo diodo, por el cual circula una co-
rriente constante, presentará una variación del voltaje terminal de aproximadamente -
2.2 mV/°C. Al contrario del comportamiento no lineal de los termistores y termocu-
plas, el coeficiente constante convierte al diodo en un excelente sensor para tempera-
turas bajas.
Dispositivos de E/S Programables 623

Fig.9.88. Sensor de temperatura tipo diodo.

Para el diseño del instrumento se requiere conocer para el transistor 2N3904:


el coeficiente de temperatura (CT) a corriente constante y el valor de VBE a una tem-
peratura de referencia. La hoja técnica del dispositivo incluye una curva que muestra
la variación del CT con los cambios de la corriente terminal. Debido a que tal curva
no permite determinar con precisión el valor de CT a la corriente seleccionada de 100
µA, se opto por obtener, mediante una simulación PSPICE, las variaciones de la ten-
sión VBE cuando la temperatura cambia entre -40 °C y 60 °C. El circuito usado se
muestra en la figura 9.89 y los resultados de la simulación en la figura 9.90.

Fig.9.89. Ventana gráfica del PSPICE mostrando el circuito simulado.


Dispositivos de E/S Programables 624

Fig.9.90. Variación de VBE en función de la temperatura, a una corriente constante de 100 µA.

La resistencia de 44K en el circuito de la figura 9.89, se calcula suponiendo


una tensión VBE constante de 600mV. En la práctica, la corriente que cruza el sensor
sólo es aproximadamente constante y es posible demostrar que tal variación tiene un
efecto despreciable en los resultados de la medida. Si se desea mejorar la precisión
debe usarse una fuente de corriente constante. De la figura 9.90 se encuentra el CT
del BJT, este es:

ΔVBE = −1.9086 mV DC × ΔT VBE(25°C) = 0.609 V

Los valores de VBE para los límites del rango de medida pueden obtenerse a
partir de esta ecuación, o directamente de la curva:

VBE(-40°C) = 0.733 V VBE(60°C) = 0.542 V

Estos resultados indican que una variación en la temperatura de 100 °C pro-


duce un cambio de 191 mV en los terminales del sensor. Debido a que el instrumento
debe usar un circuito conversor análogo digital para adquirir la tensión a la salida del
sensor, el cambio en la caída de tensión a través del BJT es demasiado pequeño
(1.91mV por °C) comparado con la señal de entrada que debe aplicarse a la entrada
de un conversor A/D de 8 bits, cuya resolución es de 19.531 mV. Esto es, para que el
valor de la salida digital del convertidor aumente/disminuya en uno, la entrada ana-
lógica debe variar ± 0.01953 V.
Dispositivos de E/S Programables 625

Para lograr una resolución de 0.5 °C en la medida, la lectura del Nadc debe
abarcar 200 pasos en el intervalo de variación de 100 °C de la temperatura ambiente.
El convertidor A/D tiene 28=256 pasos entre 0 y 5 V. Al asignar dos pasos por cada
grado de variación de temperatura, se obtiene una resolución de 0.5 °C/paso. Esto
puede lograrse usando un circuito amplificador para acoplar la salida del sensor a la
entrada del CAD. Seleccionando una correspondencia de 27 entre el valor digital de
salida del conversor y la entrada VBE(-40°C ) de 0.733 mV, se tiene que para los ex-
tremos del rango de medición, la salida del circuito de acondicionamiento de entrada
debe ser:

D
• Para VBE ( −40 C)

D 5
Vadc ( −40 C) = 27 × = 0.527 V
256

D
• Para VBE (60 C)

D 5
Vadc (60 C) = 227 × = 4.434 V
256

Los niveles de las señales se indican en la figura 9.91.

Fig.9.91. Señales del sensor y del ADC.

Un circuito apropiado para procesar la tensión del sensor y obtener los niveles
de voltaje especificados, se muestra en la figura 9.92.
Dispositivos de E/S Programables 626

Fig. 9.92. Circuito de acoplamiento.

Para el amplificador de la figura 9.92, se tiene que:

• La corriente Ie de entrada es igual a :

VP − Ve
Ie =
R1

• La corriente Is en R 2 es :

Vs − VP
Is =
R2

• Considerando que no fluye corriente por la entrada inversora, se tiene :

VP − Ve Vs − VP
=
R1 R2

⎛R ⎞ R
Vs = ⎜ 2 + 1⎟ × VP − 2 × Ve
⎜R ⎟ R1
⎝ 1 ⎠

Vs = ( A v + 1) × VP − A v × Ve

La ecuación de la señal de salida del circuito acoplador tiene dos incógnitas:


la ganancia en lazo cerrado Av del amplificador operacional y la tensión de polariza-
Dispositivos de E/S Programables 627

ción VP de la entrada inversora. Para determinar sus valores, se considera el siguiente


sistema de ecuaciones:

4.434 = ( A v + 1) × VP − A v × 0.542

0.527 = ( A v + 1) × VP − A v × 0.733

Resolviendo, se obtiene:

A v = 20.46 VP = 0.723 V

En la figura 9.93 se muestra el circuito amplificador de entrada, donde se ob-


serva el uso de potenciómetros para fijar los valores de la ganancia y de la tensión de
polarización.

Fig. 9.93. La salida del sensor se conecta a la entrada del circuito de acoplamiento.

El circuito de entrada del termómetro, mostrado en la figura 9.93, amplifica y


desplaza el nivel del voltaje de salida del sensor de modo que este abarque la mayor
parte del rango de operación de entrada del convertidor análogo digital. Una vez que
el conversor de datos convierte la entrada al dominio un valor digital, el código de la
aplicación debe calcular el valor correspondiente de la temperatura ambiente y pre-
sentarlo en representación decimal en la pantalla del MPR-85. El uso del amplificador
operacional LMC660 permite que el circuito de entrada se alimente con +5 V. Otro
Dispositivos de E/S Programables 628

operacional, el LM234 por ejemplo, alimentado a esta tensión entrega un voltaje de


salida máximo de 3.5 V.

En la figura 9.94 se observa el diagrama funcional del instrumento. El pro-


grama usa como entrada la lectura del Nadc y calcula el valor de la temperatura en
grados centigrados.

Fig.9.94. Diagrama funcional del termómetro.

Existe una relación lineal entre la temperatura y la tensión del sensorl, por lo
cual también hay una correspondencia lineal entre la lectura del sensor Nadc y la tem-
peratura ambiente T, como lo ilustra la gráfica de la figura 9.95.

Fig.9.95. Relación entre la salida del conversor A/D y la temperatura ambiente.


Dispositivos de E/S Programables 629

Para efectos del cálculo a realizar por el µP, se debe tener en forma analítica
la dependencia mostrada en la gráfica. La expresión de la temperatura como función
de Nadc es la siguiente:

T = −40 + 0.5 × (N adc − 27)

T = 0.5 × N adc − 53.5

Esta ecuación debe ser resuelta por el µP una vez realizada la conversión de la
muestra de entrada. Debido a que la ALU solo opera con aritmética entera, se escala
la ecuación como:

T = 5 × N adc − 535

Como resultado se obtendrá el valor de T multiplicado por 10. El programa


colocará convenientemente el punto decimal de modo que se presente en pantalla el
valor correcto de la temperatura.

El diagrama final del circuito de procesamiento y adquisición de la variable


temperatura se muestra en la figura 9.96. Se usa el convertidor analógico digital
ADC0804, a cuya entrada positiva se conecta la salida del amplificador. La entrada
negativa se lleva a tierra. Este circuito se comunica con el µP por medio del 8155 #2
del MPR-85, el cual está decodificado en la dirección 50H.

Las salidas DB0-DB7 van al puerto A (51H). Por la línea 0 del puerto B (52H)
se genera la señal de inicio de conversión y el terminal que notifica el fin de la con-
versión se conecta al la entrada 0 del puerto C (53H). Observe que el ADC0804 asi
como los buffers de salida del chip están habilitados permanentemente al tener las
entradas CS y RD forzadas a nivel bajo.

La temperatura varía en forma lenta por lo cual el periodo de muestreo puede


ser de horas, minutos o segundos dependiendo de la aplicación. En este caso se fija el
tiempo de muestreo en 1 segundo. Se usa el temporizador del 8155 #2, con su salida
conectada a la entrada RST 7.5, para establecer el tiempo entre muestras.El tempori-
zador se programa para interrumpir al µP cada 5 mS y se arranca al final de la con-
versión. La rutina de servicio incrementa un contador en cada interrupción. Cuando la
cuenta alcance 200 habrá pasado 1 segundo y entonces se toma la siguiente muestra.

Se creó un proyecto en MicroIde para el control de termómetro. Los 6 módu-


los incluidos en el proyecto son:
Dispositivos de E/S Programables 630

Fig. 9.96. Medidor de temperatura.


Dispositivos de E/S Programables 631

• Programa principal

Al inicio configura el 8155 con puertos A y C como entradas y el puerto B como salida y
llama a la rutina ESCRB_CAD para mostrar las unidades de medida en el campo de datos
del MPR-85.

Adquiere la muestra del voltaje del sensor y calcula el valor en binario de la temperatura
ambiente correspondiente a la muestra.

Llama a las rutinas BIN_BCD para convertir el resultado de la medida a decimal e invoca a
los subprogramas PTO_DEC y CEROS para colocar el punto decimal y el signo negativo
cuando sea necesario.

A continuación habilita las interrupciones, arranca el timer y espera que transcurra un se-
gundo para adquirir la muestra siguiente.

• Rutina ESCRB_CAD

Muestra en pantalla la cadena de caracteres apuntada por el registro par HL. Si B = 01 usa el
campo de datos. Si B = 00 usa el campo de direcciones.

• Rutina POR5

Multiplica por 5 el contenido del registro L y retorna el resultado en el registro par HL.

• Rutina BIN_BCD

Es llamada por el programa principal para convertir a BCD valor de la tensión almacenado
en binario en la memoria del sistema.

• Rutina PTO_DEC

Coloca el punto decimal al número mostrado por el LED L2.

• Rutina CEROS

Elimina los ceros que anteceden al dígito con el punto decimal. Si la variable signo es cero
coloca el signo (-) en el LED L0; en caso contrario apaga el LED.

El listado de los módulos que constituyen el proyecto en el programa MicroI-


de, se muestra a continuación.

;-----------------------------------------------------------------------------------------------------------------------
$title(Medidor de temperatura)
;Modulo de programa principal

public temp,nbytes_dec,nbytes_bin,dir_dec,dir_bin,pdatos_8279,pctrl_8279
extern bin_bcd,por5,pto_dec,ceros,escrb_cad
;-----------------------------------------------------------------------------------------------------------------------
; Declaración de constantes

T535 equ -535


Dispositivos de E/S Programables 632

i_stack equ 8FF0H ; Inicio de la pila


i_rwm equ 8000H ; Dirección de RWM para datos
modo_timer equ 0fch
inic_timer equ 0C2h
parar_timer equ 42h
nbytes_dec equ 2
nbytes_bin equ 2
;-----------------------------------------------------------------------------------------------------------------------
Definición de segmentos
defseg puertos,start=50h, class=iospace, absolute
defseg stack, start=i_stack
defseg datos, class=data, start=i_rwm
defseg int, start=4006h
defseg progr, class=code, start=6002h
;-----------------------------------------------------------------------------------------------------------------------
Puertos de entrada del sistema
seg puertos
pctrl_8155 ds 1
pa_8155 ds 1
pb_8155 ds 1
pc_8155 ds 1
timer_bajo ds 1
timer_alto ds 1

org 60h
pdatos_8279 ds 1
pctrl_8279 ds 1
;-----------------------------------------------------------------------------------------------------------------------
Los 16 bytes últimos de RWM soportan el stack.
seg stack
ds 10H
;-----------------------------------------------------------------------------------------------------------------------
t_stack:equ $-1 ; Base de la pila
;-----------------------------------------------------------------------------------------------------------------------
Segmento de datos en RWM
seg datos
dir_dec ds 4
dir_bin ds 2
signo ds 1
;-----------------------------------------------------------------------------------------------------------------------
seg int
jmp rst7.5
;-----------------------------------------------------------------------------------------------------------------------
; Segmento de código en EPROM
;-----------------------------------------------------------------------------------------------------------------------
seg progr

inicio: lxi sp,t_stack


mvi a,parar_timer ; Parar timer
out pctrl_8155
lxi h,grados ; Presentar unidades
mvi b,1
call escrb_cad ; Medida (grados centigrados)

mvi a,0 ; Señal de inicio de conversión a nivel bajo


Dispositivos de E/S Programables 633

out pb_8155
nop ; Ancho de pulso de iniciar conversión
ori 1
out pb_8155 ; Volver a nivel alto el pulso de inicio
leer: in pc_8155 ; Leer estado de INTR
ani 1
jnz leer ; Si es uno, esperar
in pa_8155 ; Es cero, leer dato
lxi d,T585 ; El registro DE se carga con -535
mvi h,0 ; Parte alta de HL a cero
mov l,a ; Mover dato a L
call por5 ; Multiplicar dato por 5
dad d ; Sumar el valor -535
mov a,h ; Examinar el signo del resultado
ani 80h
jz seg1 ; Si es positivo, variable signo se pone a 1
xra a ; Es negativo, variable signo se pone a 0
sta signo
mov a,l ; Al valor
cma ; negativo
mov l,a ; se le
mov a,h ; extrae
cma ; el
mov h,a ; valor
inx h ; absoluto
jmp seg2 ; Seguir
seg1: ori 1 ; Signo positivo
sta signo
seg2: shld dir_bin ; Convertir dato en binario a decimal
call bin_bcd
mvi c,1 ; Presentar
mvi a,0ah ; en
lhld dir_dec ; campo de direcciones
rst 7 ; de la pantalla del MPR-85
call pto_dec ; Poner punto decimal
call ceros ; Poner signo (-) si la valor es negativo. Eliminar ceros
; antes del pd.
xra a ; Programar timer
out timer_bajo
mvi a,modo_timer
out timer_alto
mvi a,inic_timer ; Arrancar timer
out pctrl_8155
mvi a,11 ; Desenmascarar RST 7.5
sim
ei ; Habilitar interrupciones
mvi b,0 ; Contador se inicia en cero.
es_int: jmp es_int ; Esperar interrupción
;-----------------------------------------------------------------------------------------------------------------------
vector de interrupción rst7.5
;-----------------------------------------------------------------------------------------------------------------------
rst7.5: inr b ; Incrementar contador
mov a,b
cpi 200 ; Comparar con 200
jz inicio ; Si llego a 200, buscar próxima muestra
Dispositivos de E/S Programables 634

ei ; Si aun no llega a 200, habilitar interrupciones


ret ; Retornar.

;-----------------------------------------------------------------------------------------------------------------------
Área de mensajes
;-----------------------------------------------------------------------------------------------------------------------
grados: db 63h,39h
end
;-----------------------------------------------------------------------------------------------------------------------

;-----------------------------------------------------------------------------------------------------------------------
; Módulo PTO_DEC.
;-----------------------------------------------------------------------------------------------------------------------
; Coloca el punto decimal en dígito L2.
;-----------------------------------------------------------------------------------------------------------------------
public pto_dec
extern pdatos_8279,pctrl_8279
defseg progr
seg progr
pto_dec: push psw ; Salvar registro A y banderas.
mvi a,01100010B
out pctrl_8279 ; Se leerá la dirección 2 (L2) de la RWM de display.
in pdatos_8279 ; Leer RWM.
ani 0f7h ; Se active punto decimal.
out pdatos_8279 ; Se muestra el punto decimal.
pop psw ; Recuperar desde de la pila
ret ; Retornar.
end
;----------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------
; Módulo CEROS
;----------------------------------------------------------------------------------------------------------------
; Coloca signo negativo y oculta ceros que precedan
; al dígito con punto decimal
;----------------------------------------------------------------------------------------------------------------
public ceros
extern signo,pdatos_8279,pctrl_8279
defseg progr

seg progr

ceros: mvi a,90h ; Se escribirá en dirección 0 (L0) de la RWM


out pctrl_8279 ; de display del 8279.
lda signo
cpi 1 ; Examinar variable signo.
jz pos ; Si es 1, valor es positivo
mvi a,0fbh ; Valor es negativo.
out pdatos_8279 : Mostrar signo negativo en L0.
jmp cer
pos: mvi a,0ffh ; Positivo .Se apaga dígito L0.
out pdatos_8279
cer: mvi a,61h ; Se leerá dirección 1 (L1) de la RWM
out pctrl_8279
in pdatos_8279 ; L1 al acumulador
Dispositivos de E/S Programables 635

cpi 0ch ; Verificar siu L1 muestra cero.


rnz ; No es cero, retornar.
mvi a,0ffh ; Es cero. apagar L1.
out pdatos_8279
ret
end

Los otros tres módulos: ESCRB_CAD, POR5 y BIN_BCD, fueron presenta-


dos en ejemplos anteriores de este trabajo.El circuito de la figura 9.96 fue construído
y el programa de control fue descargado en la memoria del MPR-85 y ejecutado. Las
lecturas de temperatura fueron comparadas con las realizadas por un medidor comer-
cial de igual resolución y no se mostraron errores apreciables. Por esto, se concluye
que el instrumento diseñado en este ejemplo funciona en forma adecuada.

Como dato curioso, las pruebas experimentales realizadas mostraron que el


coeficiente de temperatura del transistor 2N3904 se acercó más al valor obtenido de
la simulación que al coeficiente suministrado por la hoja tecnica del dispositivo. Esto
se comprobó midiendo la tensión VBE para distintas temperaturas y comparando los
resultados de las medidas con los valores teóricos calculados usando ambos coefi-
cientes.

Ejemplo 9.16

Un medidor digital de capacidad es un instrumento de presencia obligada en el


banco de trabajo de un diseñador de equipos electrónicos. Aunque los multímetros
digitales ususalmente miden valores de capacidad, sólo lo hacen para valores peque-
ños, hasta 20 µF. En este ejemplo se presenta el diseño de un instrumento que mide y
muestra valores de capacidad entre 1 nF y 1000 µF usando el microcomputador
MPR-85.
El instrumento tiene dos escalas mostradas en la figura 9.97. Un interruptor
lógico se usa para seleccionar la escala. Debe diseñarse el circuito de medida y escri-
birse el programa de control del medidor de capacidad. Se usan los puertos y el timer
del 8155 #2 del del MPR-85, el cual está decodificado en la dirección 50H.
E1: 0.001 µF – 9.999 µF

E2: 0.1 µF – 999.9 µF

Fig.9.97. El instrumento tiene dos escalas de medida.


Dispositivos de E/S Programables 636

Solución:

El método mas sencillo para medir capacitancia es contabilizar el tiempo que


el componente Cx, de valor desconocido, tarda en cargarse hasta una tensión de refe-
rencia Vr. Debido a que el tiempo de carga es función de la capacidad, es posible de-
terminar el valor del capacitor.

El circuito de medida se muestra en la figura 9.98. El transistor Q1 permite


descargar a Cx cuando el programa pone en uno la salida P51.0 conectada al resistor
R1. Para realizar una medida es necesario que el capacitor esté inicialmente descarga-
do. Cuando Q1 está cortado, Cx se carga hacia +5 V a través R2. Cuando la tensión
VCx alcanza el valor del voltaje de referencia Vr, la salida del comparador LM311
sube a nivel alto indicando al µP por medio de la línea P52.0 el final del proceso de
medida. El interruptor S1 permite al ususario seleccionar la escala baja E1, cuando
P52.3 está en cero o la alta E2, cuando P52.3 está nivel alto.

El tiempo que tarda el capacitor en cargarse desde cero hasta Vr es dado por la
expresión:

⎛ ⎞
⎜ 1 ⎟
t x = R 2 × C x ln ⎜ ⎟
V
⎜1− r ⎟
⎝ 5 ⎠

Si con la escala E1 seleccionada y con Cx igual a 1 nF se ajusta R2 hasta cuan-


do tx sea 32 µS, entonces:

3 E
t x = 32 × 10 × C x1 = 32μS
min

3 E
t x = 32 × 10 × C x 2 = 3.2mS
min

Con el instrumento en la escala E1, el µP debe ser programado para que


cuando se inicie la carga del Cx incremente en uno un contador cada 32 µS (cada 3.2
mS en la escala E2). Si estando seleccionada la escala E1, se conecta en los terminales
de medida un capacitor de 1.357 µF, este tardará en cargarse a Vr un tiempo de
43.424 mS y el contador debe registrar una cuenta de 1357, precisamente el valor de
Cx. Como se observa en la figura 9.98, el timer registra los pulsos de la señal de reloj
del sistema cuyo periodo es de 0.32 µS. Si en la escala E1, el temporizador se carga
con 100 generará una solicitud de interrupción cada 32 µS. Si la rutina de servicio
incrementa un contador de 16 bits en cada interrupción, entonces el contador alcan-
zará el valor 1357 en el momento que la salida del comparador suba anivel alto. Ob-
serve que la calibración realizada para la escala baja se mantiene para la otra escala.
Un valor de 10000 debe cargarse en el timer cuando se use la escala E2.
Dispositivos de E/S Programables 637

Fig.9.98. Circuito del medidor de capacidad.


Dispositivos de E/S Programables 638

Se creó un proyecto en MicroIde para el control del capacimetro. Los 6 mó-


dulos incluidos en el proyecto son:

• Programa principal

Al inicio configura el 8155 con puertos A como salida y el puerto B como entrada, muestra
el valor 0000 (colocando el punto de acuerdo con la escala) en el campo de direcciones de la
pantalla) y llama a la rutina ESCRB_CAD para mostrar las unidades de medida en el campo
de datos del MPR-85. Luego se descarga el capacitor y se espera la activación de cualquier
tecla para iniciar el proceso de medida.

Con la presión de un pulsador del teclado, el código programa y arranca el timer, inicia la
carga de Cx y habilita las interrupciones. E eAdquiere la muestra del voltaje del sensor y cal-
cula el valor en binario de la temperatura anste punto, el µP permanece examinando el esta-
do de la salida del comparador mientras esta esté en cero. Cuando la salida del comporador
sube a nivel alto, el µP verifica si la medida está dentro del rango. Si este no es el caso se
genera un mensaje de error.

Para una medida válida, se llama a las rutinas BIN_BCD para convertir el resultado a deci-
mal y se ejecuta la rutina PTO_DEC para colocar el punto decimal de acuerdo con la escala
seleccionada y si el instrumento está en la escala E2 se invoca al subprograma CEROS para
eliminar los ceros antes del dígito L2. En este punto el programa espera la activación de
cualquier tecla para reiniciar el proceso de medida.

• Rutina ESCRB_CAD

Muestra en pantalla la cadena de caracteres apuntada por el registro par HL. Si B = 01 usa el
campo de datos. Si B = 00 usa el campo de direcciones.

• Rutina BIN_BCD

Es llamada por el programa principal para convertir a BCD valor de la tensión almacenado
en binario en la memoria del sistema.

• Rutina PTO_DEC

Coloca/quita el punto decimal en el dígito indicado por el registro B. Si el registro C contie-


ne 8 pone el punto, si C es 0 lo quita.

• Rutina CEROS

En la escala E2, oculta los ceros que anteceden al dígito L2.

Los listados de los módulos del programa principal y de las rutinas PTO_DEC
y CEROS, se presentan a continuación:
Dispositivos de E/S Programables 639

$title(Medidor de capacidad)
;Modulo de programa principal
public nbytes_dec,nbytes_bin,dir_dec,dir_bin,pdatos_8279,pctrl_8279
extern bin_bcd, escrb_cad,pto_dec,ceros
; --------------------------------------------------------------------------------------------------------------------------
i_stack equ 8FF0H
i_rwm equ 8000H
modo_timer equ 0C0h
inic_timer equ 0CDh
parar_timer equ 4Dh
nbytes_dec equ 2
nbytes_bin equ 2
dig0 equ 0
dig2 equ 2
; --------------------------------------------------------------------------------------------------------------------------
; Definición de segmentos
; --------------------------------------------------------------------------------------------------------------------------
defseg puertos,start=50h, class=iospace, absolute
defseg stack, start=i_stack
defseg datos, class=data, start=i_rwm
defseg int, start=4006h
defseg progr, class=code, start=6002h
; --------------------------------------------------------------------------------------------------------------------------
; Puertos de entrada del sistema
; --------------------------------------------------------------------------------------------------------------------------
seg puertos
pctrl_8155 ds 1
pa_8155 ds 1
pb_8155 ds 1
pc_8155 ds 1
timer_bajo ds 1
timer_alto ds 1
org 60h
pdatos_8279 ds 1
pctrl_8279 ds 1
; --------------------------------------------------------------------------------------------------------------------------
; Los 16 bytes últimos de RWM soportan el stack.
; --------------------------------------------------------------------------------------------------------------------------
seg stack
ds 10H
; --------------------------------------------------------------------------------------------------------------------------
t_stack:equ $-1 ; Base de la pila
; --------------------------------------------------------------------------------------------------------------------------
; Segmento de datos en RWM
; --------------------------------------------------------------------------------------------------------------------------
seg datos
dir_dec ds 4
dir_bin ds 2
temp ds 1
; --------------------------------------------------------------------------------------------------------------------------
; Vector de interrupción RST 7.5
; --------------------------------------------------------------------------------------------------------------------------
seg int
jmp rst7.5
Dispositivos de E/S Programables 640

; --------------------------------------------------------------------------------------------------------------------------
; Segmento de código en EPROM
; --------------------------------------------------------------------------------------------------------------------------
seg progr
mvi a,0dh ; Programar 8155.
out pctrl_8155
inicio: lxi d,0 ; Mostrar
mov h,d ; 0000
mov l,e ; en
mvi c,1 ; campo
mvi a,0ah ; direcciones
rst 7 ; de pantalla.
lxi h,uf ; Presentar
mvi b,1 ; unidades de medida
call escrb_cad ; en campo de datos.
ori 1 ; Linea P51.0 a nivel alto.
out pa_8155 ; descargar capacitor.
in pb_8155 ; Detectar escala
ani 8 ; examinando estado del terminal P52.3.
push psw
cnz ceros ; Si escala E2, eliminar ceros a la izquierda.
pop psw
mov c,a ; Poner punto decimal, según escala.
mvi b,dig2
call pto_dec ; punto
mov a,c ; decimal
xri 8 ; según
mov c,a ; la
mvi b,dig0 ; escala
call pto_dec ; seleccionada.
mvi a,0ch ; Esperar activación
rst 7 ; de tecla.
xra a ; Poner cero en línea P51.0.
out pa_8155 ; Iniciar carga del capacitor.
in pb_8155 ; Detectar escala.
ani 8
sta temp ; Salvar escala.
jz e1 ; Saltar si escala es E1.
mvi a,10h ; Programar
out timer_bajo ; timer
mvi a,0e7h ; para
out timer_alto ; escala E2.
jmp medir ; Arrancar timer en escala E2.
e1: mvi a,64h ; Programar
out timer_bajo ; timer
mvi a,0c0h ; para
out timer_alto ; escala E1.
medir: mvi a,inic_timer ; Arrancar
out pctrl_8155 ; timer
mvi a,0bh ; Desenmascarar RST 7.5
sim
ei ; Habilitar interrupciones.
exam: in pb_8155 ; Probar estado de salida del comparador.
rar
jnc exam ; Si P52.0 está en nivel bajo, esperar.
Dispositivos de E/S Programables 641

mvi a,parar_timer ; Si P52.0 está en uno, parar timer.


out pctrl_8155
mov a,d ; Detectar fuera de rango.
cpi 27h
jc seg1
mov a,e
cpi 10h
jc seg1 ; Si medida dentro del rango, continuar.
lxi h,error ; Medida está sobre el rango
mvi b,0 ; Generar mensaje de error.
call escrb_cad
lxi h,borrar ; Borrar campo de datos durante error.
mvi b,1
call escrb_cad ; Esperar tecla.
mvi a,12
rst 7
jmp inicio ; A inicio desde error.
seg1: xchg
shld dir_bin
call bin_bcd ; Convertir valor de la medida a BCD.
mvi c,1 ; Presentar valor BCD en campo de direcciones.
mvi a,0ah
lhld dir_dec
rst 7
lda temp ; Recuperar escala.
mov c,a ; Poner punto decimal según escala.
mvi b,dig2
call pto_dec
mov a,c
xri 8
mov c,a
mvi b,dig0
call pto_dec
lda temp ; Recuperar escala.
ani 8
jz tecla ; Si escala es E1, seguir.
call ceros ; Eliminar ceros si escala es E2.
tecla: mvi a,0ch ; Esperar por activación de tecla.
rst 7
jmp inicio ; Iniciar presentando 0000.
; --------------------------------------------------------------------------------------------------------------------------
; Rutina de servicio de interrupción RST 7.5
; --------------------------------------------------------------------------------------------------------------------------
rst7.5: inx d ; Incrementar contador.
ei : Habilitar interrupciones.
ret
; --------------------------------------------------------------------------------------------------------------------------
; Área de mensajes
; --------------------------------------------------------------------------------------------------------------------------
uf: db 3eh,71h ; Unidades de medida (µF)
error: db 0,79h,50h,50h ; Mensaje de error.
borrar: db 0,0
end
; --------------------------------------------------------------------------------------------------------------------------
Dispositivos de E/S Programables 642

; --------------------------------------------------------------------------------------------------------------------------
; Módulo PTO_DEC.
; --------------------------------------------------------------------------------------------------------------------------
; Coloca el punto decimal en dígito indicado por registro B
; Si C=8 pone el punto. Si C=0 no pone punto
; --------------------------------------------------------------------------------------------------------------------------
public pto_dec
extern pdatos_8279,pctrl_8279
defseg progr
seg progr
pto_dec: push b ; Salvar registros y banderas.
push psw
mov a,c ; Si C = 8, activa bit de punto.
cma ; Si C = 0, desactiva bit de punto.
mov c,a ; Guarda estado de bit de punto decimal.
mov a,b ; Carga en el acumulador número del dígito.
ori 60h
out pctrl_8279 ; Programa lectura de dígito.
in pdatos_8279 ; Lee código del dígito.
ori 8 ; Si tiene punto, lo quita.
ana c ; Pone punto cuando indique el contenido de C.
out pdatos_8279 ; Presenta dígito con/sin punto decimal.
pop psw ; recupera registros y banderas.
pop b
ret
end

; --------------------------------------------------------------------------------------------------------------------------
; Módulo CEROS
; --------------------------------------------------------------------------------------------------------------------------
; En la escala E2, oculta los ceros que precedan al dígito con punto decimal (L2)
; --------------------------------------------------------------------------------------------------------------------------
public ceros
extern pdatos_8279,pctrl_8279
defseg progr
seg progr
ceros: mvi b,-1
mvi c,2 ; Se examinan dos digitos: L0 y L1.
rep: inr b ; Selección de dígito
mov a,b : Se programa lectura de código de dígito en B.
ori 60h
out pctrl_8279
in pdatos_8279 ; Se lee código 7-segmentos.
cpi 0ch ; Se compara con cero.
rnz ; Si dígito L1 no es cero, retornar.
mvi a,0ffh ; Como es cero…
out pdatos_8279 ; … se apaga LED.
dcr c ; Contador de digitos menos 1.
jnz rep ; Examinar L1.
ret ; Contador en cero, retornar.
end
Dispositivos de E/S Programables 643

Si el capacitor conectado a los terminales de prueba es mayor que 9.999 µF,


estando la escala E1 seleccionada; o es mayor a 999.9 µF en escala E2, la pantalla
mostrará en el campo de direcciones un mensaje de error y permanecerá en espera de
la activación de una tecla para continuar. El ususario debe conectar un capacitor de
menor valor o cambiar la escala, según corresponda, y presionar una tecla para reini-
ciar la medida.

El medidor de capacidad fue ensamblado y probado. Las lecturas del instru-


mento fueron contrastadas con las medidas realizadas con un capacímetro digital co-
mercial y los resultados fueron excelentes. El equipo mide capacidad con alta preci-
sión.
Bibliografía 644

Bibliografía
Aho, A.
Sethi, R.
Ullman, J. "Compiladores. Principios, técnicas y Herramientas". Addison-
Wesley Iberoaméricana. USA. 1990. ISBN 0-201-62903-8.

Ángulo, J. "Microprocesadores. Fundamentos, Diseño y Aplicaciones en la In-


dustria y en los Microcomputadores". Paraninfo S.A. Madrid. 1981.
ISBN 84-283-1148-X.

Ángulo, J. "Microprocesadores Avanzados 386 y 486. Introducción al Pentium y


Pentium Pro". Paraninfo S.A. Madrid. 1998. ISBN 84-283-2374-X.

Brey, B. "Los Microprocesadores de INTEL. Arquitectura, Programación e


Interface. Prentice Hall Hispanoaméricana S.A. Naucalpan de Juarez.
Estado de Mexico. 1995. ISBN 968-880-481-9.

Brown, P. "Writing Interactive Compilers and Interpreters". John Wiley & Sons.
USA. 1979. ISBN 0-471-27609-X.

Coffron, J. "Microprocessor Programming, Troubleshooting, & Interfacing: The


Z80, 8080, & 8085". Prentice Hall. USA. 1997. ISBN 0135819768.

Dixon, A.
Antonakos, J. "Digital Electronics with Microprocessor Applications". John Wiley.
USA. 1987.

Gaonkar, R. “Microprocessor Architecture, Programming, & Applications with


the 8085". Prentice Hall. USA. 2001. ISBN 0130195707.

Gil, A. "Electrónica General. Dispositivos y Sistemas Digitales". McGraw-


Hill. Interamericana de España. Madrid. 1989. ISBN 84-7615-329-5.

Goody, R. "The Microcomputer Laboratory Manual: Based on the 8085 Micro-


processor". Science Research Associate. USA. 1987.

Graham, N. "Microprocessors Programming". Tab Books. USA. 1980. ISBN 0-


8306-7952-9.
Hennessy, J.
Patterson, D. "Computer Architecture: A quantitative Approach". Morgan Kauf-
mann Publishers. USA. 2002. ISBN 1558605967.
Bibliografía 645

Hennessy, J.
Patterson, D. "Organización y diseño de Computadores. La Interfaz Hardware y
Software". McGraw-Hill. Interamericana de España. Madrid. 1994.
ISBN 84-481-1829-4.

Hordeski, M. "Microprocessor Cookbook. Tab Books. USA. 1979. ISBN 0-8306-


9778-0.
Intel. “The 8080/8085 Microprocessor Book ". John Wiley. USA. 1980.

Intel. “Peripheral Design Handbook ". Intel Corporation. Santa Clara C.A.
1980. AFN 0-1300A-1.

Intel. “MCS-85 User´s Manual". Intel Corporation. Santa Clara C.A. 1978.

Intel. “8080/8085 Assembly Language Programming Manual". Intel Cor-


poration. Santa Clara C.A. 1979.

Kleitz, W. "Microprocessor and Microcontroller Fundamentals: The 8085 and


8051 Hardware and Software. Prentice Hall. USA. 1997. ISBN
0132628252.

Krutz, R. "Interfacing Techniques in Digital Design with Emphasis on Micro-


processors". John Wiley & Sons. USA. 1988. ISBN 0-471-08289-9.

Kuecken, J. "Handbook of Microprocessors Applications. Tab Books. USA.


1980. ISBN 0-8306-9935-X.
Leventhal, L.
Walsh, C. "Microcomputer Experimentation with INTEL SDK-85. Prentice
Hall Inc. New Jersey, USA. 1980. ISBN 0-13-580860-X.

Leventhal, L "Introduction to Microprocessors. Prentice Hall. International Edi-


tions. Londres. 1978. ISBN 0-13-487876-O.

Loeliger, R. "Threaded Interpretive Languages". BYTE Publications Inc. USA.


1981. ISBN 0-07-038360-X.

Peatman, J. "The Design of Digital Systems". McGraw-Hill. USA.1972. ISBN 07-


049136-4.

Robin, M.
Maurin, T. "Interconexión de Microprocesadores". Paraninfo S.A. Madrid. 1985.
ISBN 84-283-1224-9.

Stallings, W. "Computer Organization and Architecture.Designing for Perfoman-


ce". Prentice Hall. USA. 2002. ISBN 0-13-049307-4.
Bibliografía 646

Tanenbaum, A. "Organización de Computadoras. Un Enfoque Estructurado". Prentice


Hall Hispanoamericana S.A. Naucalpan de Juarez. Estado de Mexico.
2000. ISBN 0-13095990-1.

Tokheim, R. "Fundamentos de los Microprocesadores". McGraw-Hill. Interameri-


cana de España. Madrid. 1991. ISBN 84-7615-592-2.

Tracton, K. "Display Electronics. Tab Books. USA. 1977. ISBN 0-8306-7861-1.

Uffenbeck, J. "Microcomputers & Microprocessors: The 8080, 8085, & Z-80 Pro-
gramming, Interfacing, & Troubleshooting". Prentice Hall. USA.
1999. ISBN 0132091984.

You might also like