Escolar Documentos
Profissional Documentos
Cultura Documentos
NÚCLEO DE ANZOÁTEGUI
ESCUELA DE INGENIERÍA Y CIENCIAS APLICADAS
DEPARTAMENTO DE ELECTRICIDAD
REALIZADO POR
Dedicatoria
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.
JUSTIFICACIÓN
ALCANCE
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
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
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.
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
forma de un núcleo lógico en código VHDL el cual puede ser sintetizado junto con
sus circuitos asociados sobre una FPGA.
CAPÍTULO 1
CAPÍTULO 2
CAPÍTULO 3
CAPÍTULO 4
CAPÍTULO 5
CAPÍTULO 6
CAPÍTULO 7
CAPITULO 8
CAPITULO 9
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.
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
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
Bibliografía…………………………………………………………………………. 644
Introducción al Computador 1
Introducción al Computador
1.1 GENERALIDADES
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
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.
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
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.
dosa que usaba una memoria común para el almacenamiento de los datos y las ins-
trucciones.
Instrucciones y datos
Direcciones
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Signetics 2650
Motorola MC6800
Intel 8080
MOS technology 6502
Rockwell PPS-8
Fairchild F-8
National Semiconductor IMP-8
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
Fig. 1.20. Disminución en el tiempo del número de circuitos integrados necesarios para construir un
sistema µC básico.
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.
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.
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.
Pentium
Pro
Pentium II
80486 Pentium
Transistores
80286
80386
8086
8088
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.
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.
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 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.
Datos
Resultados
da para ser entendida por humanos o como comandos que permiten la realización de
algún trabajo.
CCPPU
U SALIDAS
UNIDAD
LÓGICA Y
MEMORIA ARITMÉTICA
UNIDAD
DE
CONTROL
ENTRADAS
RELOJ
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.
• La Memoria
• La Unidad de Entrada/Salida. , y
• El Generador de Reloj.
Registros Direcciones
ALU Datos
Unidad
de control Control
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
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.
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.
Instrucción a la CPU
BÚSQUEDA EJECU-
Ejecución culminada CIÓ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)
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.
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.
Introducción al Microprocesador
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.
• 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
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.
REGISTROS
ALU
UNIDAD DE
CONTROL
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.
CPU PUERTOS
EPROM
RWM
TIMERS
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.
VCC
R9-R16
R1-R8 270 Ω
5.1 KΩ
D0-D7
S0-S7
?
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)
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.
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)
Operación de
entrada
Operación de
salida
• 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.
BUS DE DATOS
D7
DISPOSITIVO BUFFER D6
REGISTRO
DE DE DE TRES
ENTRADA 8 BITS ESTADOS
D0
SEL
VCC
R1-R8
Puerto 01
CON1
S0 - S7
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
(A) ← (Puerto 1)
Periférico de salida
(Puerto 2) ← (A)
Periférico 1 Periférico 2
IN OUT
(A)
Registro A Registro B
(A) (B)
Unidad
Lógica y
Aritmética
(A+B)
D7
D6
REGISTRO DISPOSITIVO
DE DE
8 BITS SALIDA
D0
CLK
SEL
(B) ← (A)
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
; 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.
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).
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?
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)
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
MEMORIA
Líneas de 2
Control
• n líneas de direcciones.
• m líneas de E/S de datos, y
• Algunas líneas de control.
3
n = log 2 (2 ) + 10 = 13 Líneas de direcciones,
⎛ 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.
CS
R/ W
D0-D7
Datos válidos
N = 2n x m, donde:
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
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.
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.
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.
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.
El generador de direcciones
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
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
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.
reset TR
reset
T1
T2
instruc- IN OUT
T3
ción MOV
ADD SUB
T4
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
La unidad de control
• Un Decodificador de Estados.
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.
Velocidad de procesamiento
IN 01 3
MOV 3
IN 01 3
ADD 4
OUT 02 3
N° total de estados 16
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.
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.
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.
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.
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
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
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.
Fig. 3.36. El operando dato de MVI dato se carga en la siguiente posición de memoria
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
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
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
Fig. 3.39. La instrucción JMP tiene como operando la dirección de la próxima instrucción a ejecutar.
reset
HALT
reset HLT
Búsqueda Ejecución
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.
Instrucciones no soportadas
Registro A Registro B
Unidad
Lógica y
Aritmética
Registro de banderas
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.
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,
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
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).
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.
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.
BUS DE
BUS DE
CONTROL
DIRECCIONES
μP
BUS DE
DATOS
μP
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.
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
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
MEM = A 15 + A 14 + A 13 + A 12 + A 11 + A 10 + A 9 + IO/ M
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.
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.
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.
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.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.
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.
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.
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.
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.
Arq ui t e c t ura y O p e ra c i ó n d e l μ P
4.1 GENERALIDADES
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
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
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.
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.
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.
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
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
W Z
B C
D E
H L
MAR
PC
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.
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.
A Reg.Temp.
Banderas
ALU
S Z AC P CY
• 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.
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.
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
1
Ver tabla 4.1.
Arquitectura y Operación del Microprocesador 8085A 114
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 )
f = 3 Mhz
Fig. 4.9. Circuitos para fijar la frecuencia del reloj.
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
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
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
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.
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
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.
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.
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
ALE
RD
Fig. 4.15 Ciclo de instrucción (Ciclo de máquina de búsqueda ) para la instrucción INX H (OC=23H).
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
:...
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
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 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.
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.
Fig. 4.20 Ejecución de una instrucción de un ciclo de máquina y cuatro estados usando el modo de
paso simple.
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.
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.
M1 M1
SEÑAL
T1 T2 TR TR TR TR T1
CLK
RESET IN
RESET OUT
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.
6.125 MHz
+5V
R1 8085A
5.1 KΩ 1N914
RESET C1
10μf
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.
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.
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.
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
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
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
PC
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.
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
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 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
Computador 8085A
SID
1 ≥ 2.0 V 0 = +V 1 ≥ 2.0 V
0 ≤ 0.8 V 1 = -V 0 ≤ 0.8 V
SOD
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
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.
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
x x x x 0 x AD1 AD0
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.
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
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.
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)
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
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
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.
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
nivel alto en cualquiera de estas entradas colocan las salidas de los buffers en estado
de alta impedancia.
DIRECCIONES
Dirección valida
CS
tCE
OE
tOE
tACC tOF
SALIDAS Datos validos
Características AC
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 .
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
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
tWC
DIRECCIÓN
tCSW
CS
WE
tDS tDH
D0 - D7
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 .
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.
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.
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.
Fig. 5.19 RWM 6116 decodificada para las direcciones comprendidas entre 0800H-0FFFH
8255
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.
Fig. 5.22 El PPI 8255 es seleccionado por medio de la línea de dirección A11.
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.
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
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.
(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.
FFFFH
60K-62K
20K-22K
16K-18K
12K-14K
8K-10K
4K-6K
0-2K
0000H
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.
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.
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
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
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
Ejemplo 5.3
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
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
Tabla. 5.14 Direcciones para las secciones de memoria y E/S seleccionadas por U1.
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
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:
Ejemplo 5.5
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.
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.
DIRECCIÓN DE PUERTO
1 x x x 0 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.
Ejemplo 5.6
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
DIRECCIÓN DATOS
. .
. . 32 K EPROM
. .
7FFFH 0111 1111 1111 1111
. . 2 K RWM
87FFH 1000 0111 1111 1111
. .
8FFFH 1000 1111 1111 1111
. . 2K RWM
97FFH 1001 0111 1111 1111
. .
9FFFH 1001 1111 1111 1111
. . 2K RWM
A7FFH 1010 0111 1111 1111.
. .
AFFFH 1010 1111 1111 1111
. . 8255
B7FFH 1011 0111 1111 1111
.
BFFFH 1011 1111 1111 1111
Fig. 5.38 Decodificador de direcciones para 32K de EPROM, 6K de RWM y un PPI 8255
El Microcomputador Básico 179
Ejemplo 5.7
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
CS 2 = A15 ⋅ A14 + A15 ⋅ A13 ⋅ A12 + A15 ⋅ A14 ⋅ A12 + A15 ⋅ A14 ⋅ A13
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
productos. Seis de los terminales de salida son bidireccionales de modo que pueden
ser usados como entradas.
entity decdir is
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);
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;
************************************************************************
OrCAD Simple PLD Fitter tools
************************************************************************
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%)
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
- fuse open
*
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*
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
• 1 TTL + 1 LSTTL
• 5 LSTTL
• 10 ALSTTL.
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.
DIRECCIONES
CS
tCE
OE
tAC tOE
D0-D7 C
DATO
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
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.
SRWM
D0-D7
AD0-AD7 373 A0-A7
ALE A8-A15
DB DCS
A8-A15 CS
OE WR
IO / M
DB DL
WR
RD
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 ⎠
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
datos al chip. En la actualidad, están disponibles EEPROMs para conexión I2C con
mayores capacidades. Por ejemplo la 24LC512 almacena hasta 64Kbytes.
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.
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.
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).
Fig. 5.52 Direcciones físicas y lógicas y mapa de memoria para un sistema con 250 Kbytes de memo-
ria de programa.
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
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.
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.
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.
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:
de ocho bancos de 16 Kbytes, usando para seleccionarlos tres bits XA14-16 de un puer-
to de salida.
Fig. 5.55 Mapa de memorias con área común de código y siete bancos de EPROM.
3. Tomar decisiones, y basarse en los resultados para transferir el control del programa hacia
un nuevo conjunto de instrucciones.
• Las funciones de los registros y la forma en que están organizados en el interior del µP.
8085A
D0-D7 A0-A15
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.
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
(a)
(b) (d)
Introducción a la Programación del 8085A 210
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.
Las instrucciones del 8085A tienen cuatro modos de obtener los datos:
• Direccionamiento directo.
• Direccionamiento inmediato.
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
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
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
B C
(B-C) 12 FF
(B-C) + 1 13 00
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.
• 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
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:
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.
LHLD dirección (L) ←[(byte 3) (byte 2)]; (H) ←[(byte 3) (byte 2) +1]
STAX rp [(rp)]←(A)
Ejemplo 6.1
lda lxi h
1F 1F
45 45
mov a,m
3 bytes 4 bytes
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)
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.
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.
ORA r (A)←(A) ∨ ( r)
Ejemplo 6.2
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
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.
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
CMA (A)←( A )
CMC (CY)←( CY )
STC (CY)←1
Instrucciones de comparación
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) = [(H)(L)] , Z = 1
Ejemplo 6.5
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
.
.
.
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
.
Ejemplo 6.7
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
Ejemplo 6.8
Fin de conversión
A CAD µC 8085
Sensor
Amplificador
Selección
Inicio de conversión
Lectura del dato
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
CS
WR
INTR
RD
DB0-7 Dato
tc
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.
cmp b
jnc adc1
jmp ctrl ; Reiniciar proceso.
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
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;
Instrucciones de rotación
CY A7 A6 A5 A4 A3 A2 A1 A0
CY A7 A6 A5 A4 A3 A2 A1 A0
CY A7 A6 A5 A4 A3 A2 A1 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
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:
c. Si el bit 0 del puerto de entrada 40H esta en cero no debe haber cambios en el estado de
los LEDs.
5 PUSH
POP
6 6
5 5
4 4 4
3 3 3
2 2 2
1 1 1
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.
(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
Ejemplo 6.11
• 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
• 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
• PUSH D
PILA
B C 24 2FFCH
63 85
41 2FFDH
D E 85 2FFEH
41 24
63 2FFFH
SP
X 3000H
2FFC
X
• 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
• 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
Ejemplo 6.12
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
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.
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.
(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)
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
Programa principal
1001H ----
1002H ----
Subrutina
1003H ----
1ra instrucción
1004H CALL 2000H 2000H
---
1007H ----
---
----
---
---
RET
PC SP X
1004H 3000H X 3000H
X
Pila
07
PC SP
10
2000H 2FFEH
X 3000H
Pila
07
PC SP
10
1007H 3000H X 3000H
X
Pila
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.
PC SP X
1000H 3000H X 3000H
X
Pila
PC SP 10 2FFFH
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
Pila
• Inmediatamente después del primer RET
13 2FFCH
12 2FFDH
03 2FFEH
PC SP 10 2FFFH
X
Pila
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:
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.
Ejemplo 6.13
;-----------------------------------------------------------------------------------
; 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
loque en el bus una instrucción RST n con la dirección de la rutina de servicio de in-
terrupción.
INR M [(H)(L)] ← [(H)(L)] + (1) ACI dato (A) ← (A) + (dato) +(CY)
DCX rP (rP) ← (rh) (rl) - (1) SUI dato (A) ← (A) - (dato)
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
(a) (b)
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
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.
Ejemplo 6.14
Ejemplo 6.15
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.
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
Ejemplo 6.17
Ejemplo 6.18
;-----------------------------------------------------------------------------------
; 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
Instrucciones de suma
ADD r (A)←(A) + ( r)
0+0=0 1+0=1
0+1=1 1 + 1 = 0, con acarreo igual a 1
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
Ejemplo 6.20
;-----------------------------------------------------------------------------------
; 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
BA 0200H 4E 0200H
76 0201H A8 0201H
00 1FFCH 00 1FFCH
02 1FFDH 02 1FFDH
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
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.
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
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,
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,
0000 1000
+ 0000 0111
0000 1111 (A) 0FH
PASO 1
PASO 1
PASO 2
La bandera de acarreo es uno, por lo cual se suma 6 al nibble más significativo del registro
acumulador.
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.
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
;-----------------------------------------------------------------------------------
; 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
Ejemplo 6.23
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
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.
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
;-----------------------------------------------------------------------------------
; 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
7810 7810
- 1710 + 8310
61 16110
99
- 17 sustraendo
82 complemento nueve
+ 1
83 complemento diez
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
PASO 2
PASO 3
01100101 (34H)
+ 10011000 (98H)
0←11111101 (FDH)
PASO 4
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
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
0*0=0 1*0 =0
0*1=0 1*1 =1
Ejemplo:
Ejemplo 6.27
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.
Ejemplo 6.28
1001 Cociente
Divisor 10010 10100101 Dividendo
10010
000101
00000
001010
00000
010101
10010
00011 Residuo
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.
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
Ejemplo 6.31
;-----------------------------------------------------------------------------------
; 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
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
0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0
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
¾ Punto fijo
¾ Punto flotante
• Los números son representados por la combinación de una parte fraccional o mantisa y
una parte exponencial.
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
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:
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.
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.
¾ 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.
• 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
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.
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.
1⎛ N ⎞
x n +1 = ⎜⎜ + x n ⎟⎟
2 ⎝ xn ⎠
Ejemplo 6.32
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
y = 159 ⋅ x = 159 ⋅ 2 = 318 , en lugar del valor real: y = 159 ⋅ x = 159 ⋅1.73 = 275.4
159 ⋅ 3 ⋅10 4
y= = 275
10 2
Introducción a la Programación del 8085A 284
Ejemplo 6.33
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.
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
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
TD − 11 ⋅ Treloj
N= +1 (7.2)
14 ⋅ Treloj
TD − Tpaso
N= +1
Tfinal
.
mvi b,n
call retad
.
.
.
hlt
retad: dcr b
jnz retad
ret
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
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
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
Ejemplo 6.35
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
f = 500 Hz
Introducción a la Programación del 8085A 289
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.
estados
retad: dcx b 6
mov a,b 4
ora c 4
jnz retad 7/10
ret 10
TD = [ (N − 1) ⋅ 24 + 49] ⋅ 0.32 µs
Ejemplo 6.36
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
TD = [( N − 1) ⋅ 24 + 35]⋅ 0.32 µs
TD = ( N − 1) ⋅ 7.68 µs + 11.2 µs
TD − 11.2
N= = 65102.7
7.68
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
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
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:
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.
{ [ ] }
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
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.
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.
• Interpretadores.
• Generadores.
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.
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.
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.
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.
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.
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.
• 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.
159 ⋅ 30000
y = 159 ⋅ x = y = 159 ⋅ 3 =
100
1⎛ N ⎞
x n +1 = ⎜ + xn ⎟
2 ⎝ xn ⎠
Desarrollo y Simulación de Programas 303
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.
:10000000213F00460548237E23BEDA120056772B97
:10001000722305C207000D41C21C0076214000C3B7
:020020000700D7
:0A003F0009082345677D889099F5B4
:00000001FF
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.
02 + 00 + 20 + 00 + 07 + 00 = 29H
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
: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.
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
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.
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.
1. SECUENCIAL
2. IF-THEN/ELSE.
3. CASE.
4. WHILE-DO.
5. REPEAT-UNTIL.
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.
Estructura secuencial
Estructura IF-THEN/ELSE
(a) (b)
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
CASE variable
proceso 0
proceso 1
.
.
.
proceso n
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
Ejemplo 7.2
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
Ejemplo 7.3
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
Ejemplo 7.5
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.
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.
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.
1. Durante el primer paso el ensamblador examina cada programa fuente y agrupa las refe-
rencias simbólicas en una tabla.
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
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...
• Instrucciones en nemónicos que serán traducidas a código de máquina. Este tipo de línea
genera código ejecutable.
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.
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
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.
Especificación de operandos
• Registro.
• Registro par.
• Dato inmediato.
• Dirección de 16 bits.
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
EJEMPLO
45Q 1234Q 230Q 7600Q
Binario
EJEMPLO
11010100B
Constante ASCII
EJEMPLO
MVI A,‘G’ ; Carga el A con el valor 47H,
;correspondiente al código en
;ASCII del caracter G.
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
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
EJEMPLO
SUI 2*DATO
MVI A,DATO + 5
EJEMPLO
SALTO: JMP $-5 ; Salto a la dirección 5 bytes
; atrás del primer byte de esta
; instrucción.
Símbolos reservados
Definición de símbolos
bolo global solo puede definirse una vez en el programa, de lo contrario habrá una
indicación de error.
Evaluación de expresiones
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 :
EJEMPLO
Si (VALOR) = 10010110 = (150)10
VALOR SHR 2
Operadores lógicos:
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:
Operadores de comparación:
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.
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
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F’}
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
LAZO = 0005H
Línea 4: JZ SALIR
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
• Paso I:
• 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.
TABLA DE SIMBOLOS:
ASM80 EJEM76.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1
PUBLIC SYMBOLS
EXTERNAL SYMBOLS
USER SYMBOLS
BIT01 A 0009 BIT10 A 002D INVAL A 002B LAZO A 0005 SALIR A 0037 VALI A 0026
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
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:
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
etiqueta: END
EQU
Sirve para facilitar la lectura del programa. Esta directiva asigna un valor nu-
mérico a un nombre. Tiene la forma:
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
IF y ENDIF
etiqueta: IF expresión
instrucción 1
instrucción 2
.
.
.
instrucción n
ELSE
.
.
.
ENDIF
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
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
PUBLIC SYMBOLS
EXTERNAL SYMBOLS
USER SYMBOLS
LAZO A 0006 MEM A 2000 NO A 0000 PRUEBA A FFFF SI A FFFF
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
ASM80 IF.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1
PUBLIC SYMBOL
EXTERNAL SYMBOLS
USER SYMBOLS
LAZO A 0006 MEM A 2000 NO A 0000 PRUEBA A 0000 SI
A FFFF
DB
LISTA: DB 1 01C508
DB 0C5H
DB 1000B
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
Código objeto
DIR: DW POS1 6420
Dirección Contenido
DIR: 0300H 01100100 64H
DS
etiqueta DS expresión
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.
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.
ASM80 EJEM2.SRC
ISIS-II 8080/8085A MACRO ASSEMBLER, V4.1 MODULE PAGE 1
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
USER SYMBOLS
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.
C:\avmac85 prueba
C:\avlink nombre=prueba.obj
DEFSEG
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
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
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:
SEG
SEG nombre
Ejemplos:
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
ORG 500H
DB 'Prueba final'
PUBLIC
PUBLIC etiqueta
EXTERN
EXTERN etiqueta
Desarrollo y Simulación de Programas 355
PROC y ENDPROC
ylog PROC
..data ds 10H ; Primera definición del identificador: data
ENDPROC
Ejemplo 7.8
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
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.
Ejemplo 7.9
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.
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
public p8,pb9,tabl,sqrt,temp1
extern entsal
;---------------------------------------------------------------------------------------------------------------------------------
seg stack
ds 10H
;---------------------------------------------------------------------------------------------------------------------------------
t_stack:equ $-1 ; Base de la pila
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
public entsal,noper
extern adat,raiz,tabl,sqrt
defseg progr
seg progr
;---------------------------------------------------------------------------
; 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
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
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
SEGMENT START
CODE 0000
DATA 0000
IOSPACE 0000
No Transfer Address.
• Editor de texto.
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.
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.
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
(a)
(b)
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.
8085 Instruction Set Simulator 8085 Simulator Ide 8085 Virtual Kit 8085-Simulator [SW]
MICRO 85
• CPU 8085.
• Memoria RAM 6264 de 8K.
• Un PPI 8255.
Mapa de memoria
E000H-FFFFH RAM
Mapa de E/S
Interrupciones
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
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.
• 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:
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
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
VSim Simulador
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
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.
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
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
MIN: DB 0
MAX: DB 0
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
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
Fig. 7.59 Editor de memoria con las entradas y salidas del ejemplo 7.8
Ejemplo 7.10
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
;------------------------------------------------------------------------------- -----------------------------------------
; 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.
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.
• 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
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
• 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
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.
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.
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.
Fig.7.74. Marque simul.hex como archivo de salida. Se pone por defecto nombre_proyecto.hex
En este caso la velocidad de transmisión del canal serie del MPR85 debe ajus-
tarse a 9600 baudios.
7.5 MACROS
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.
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.
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.
1
Estas directivas no se discuten. El interesado puede recurrir al manual del isis-ii 8080/8085
Desarrollo y Simulación de Programas 411
Ejemplo 7.11
PUERTOreg B,Pdato
PUERTOreg C,Pdato+1
PUERTOreg D,Pdato+2
PUERTOreg E,Pdato+3
END
C:\ISIS_II\isim85.exe
- attach :f0:=c:
-asm80 ejem_711.src
ASM80 Ejem_7110.SRC
ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1
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
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
;-------------------------------------------------------------------------------------------------------------
;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
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
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.
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
;----------------------------------------------------------------------------------------------------------------
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
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 - θ - +
;---------------------------------------------------------------------------------------------------------------------------
; 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
;----------------------------------------------------------------------------------------------------------------
; 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.
y i − y i −1
y= × ( x − x i −1 ) + y i −1
x i − x i −1
[ ]
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
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.
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.
no imprime la palabra recibida desde el sistema antes que arribe el próximo dato,
habrá pérdida de información.
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
(a) (b)
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.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
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.
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.
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
;-------------------------------------------------------------------------------------------------------
; 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
;------------------------------------------------------------------------------------------------------
; 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
Solución parte 2:
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.
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 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.
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.
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.
El 8085 tiene varias instrucciones destinadas a ser usadas con las interrupcio-
nes. Estas son: EI, DI, SIM, RIM y la conocida RST n.
EI
DI
genera la instrucción RST interna que suministra el vector de interrupción para las
entradas TRAP y RST.
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
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.
Ejemplo 8.2
;-----------------------------------------------------------------------------------------------------------
; 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
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.
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.
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
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
Ejemplo 8.3
2.2k
S1
220
RST7.5
74LS14
10µF
;----------------------------------------------------------------------------------------------
; 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
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
;---------------------------------------------------------------------------------------------------------------
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.
;---------------------------------------------------------------------------------------------------------------
; 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
;---------------------------------------------------------------------------------------------------------------
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.
2. Pulsando la tecla <RST7.5> del teclado del microcomputador se genera una interrupción
que permite ajustar la hora como se indica.
Para escribir el programa de reloj digital se usan las rutinas de usuario mos-
tradas en la tabla 8.4.
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
;***************************************************************************
; Programa reloj digital
;***************************************************************************
;***************************************************************************
; 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:
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.
L0 L1 L2 L3 L4 L5
El contenido del registro par HL o L se presenta en pan-
talla.
RED 1/60
SEG segundos
MIN minutos
HOR horas
Técnicas de gestión de Entrada y Salida 471
;--------------------------------------------
; 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:
;*************************************************************************
; 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
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.
• 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.
• 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
• 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.
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.
El número de bytes de espaciamiento entre los vectores de interrupción puede ser selec-
cionado por programa entre 4 u 8.
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.
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
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.
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.
Ejemplo:
ICW1 = 16H = 00010110
ICW2 = 10H = 00010000
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
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
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.
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.
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
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.
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.
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
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.
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.
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:
Ejemplo:
OCW2 = 3xH = 0 0 1 1 0 L2 L1 L0
Técnicas de gestión de Entrada y Salida 488
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.
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
Ejemplo:
OCW2 = 7xH = 0 1 1 1 0 L2 L1 L0
Ejemplo 8.7
;----------------------------------------------------------------------------------------------------------------
; 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
;----------------------------------------------------------------------------------------------------------------
; 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
;----------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------
;Tabla de vectores de interrupción
; ---------------------------------------------------------------------------------------------------------------
org 1000h
jmp RSI1
nop
jmp RSI2
nop
jmp RSI3
nop
jmp RSI4
nop
jmp RSI5
nop
jmp RSI6
nop
jmp RSI7
nop
;----------------------------------------------------------------------------------------------------------------
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.
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.
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
8255
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.
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.
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.
Modo 0
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.
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.
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
(a) (b)
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
Identificación de la fila:
• PCbajo: Entrada
• PCalto: Salida
Identificación de la columna:
• PCbajo: Salida
• PCalto: Entrada
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
;---------------------------------------------------------------------------------------------------------------------------
; Identificar columna
; Identificar fila
Ejemplo 9.2
;---------------------------------------------------------------------------------------------------------------------------
; 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
;---------------------------------------------------------------------------------------------------------------------------
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.
Ejemplo 9.3
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
;----------------------------------------------------------------------------------------------------------------
; 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
;----------------------------------------------------------------------------------------------------------------
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
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.
VS = I OUT × 5.6K
VREF 5
VS = n
× A base10 = × A base10
2 256
Dispositivos de E/S Programables 519
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:
• 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
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
• 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
; 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
;--------------------------------------------------------------------------------------------------------------
; 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
Fig. 9.17. Ventana principal de MICRO-IDE con el proyecto del ejemplo 9.4.
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
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
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.
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 .
;----------------------------------------------------------------------------------------------------------------
; Rutina SAL_IMPR de salida a impresora
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
;----------------------------------------------------------------------------------------------------------------
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.
• Grupos A y B.
• 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
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.
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 .
Modo 1: Salida
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.
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.
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.
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.
;----------------------------------------------------------------------------------------------------------------
; Rutina SAL_IMPR de salida a impresora
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.
PC2, PC1 y PC0 Líneas disponibles para E/S controladas por bit set/reset.
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.
;-----------------------------------------------------------------------------------------------------------
; 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
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
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.
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.
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.
Fig. 9.33 Formas de ondas para transferencias de entrada y salida bajo el control del puerto C.
Registro de estado
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.
Ejemplo 9.9
Solución:
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.
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.
D: 1 = Pantalla activada.
0= “ apagada.
F: 1 = Caracteres de 5 x 10 puntos.
0= “ “ 5 x 7 puntos.
Dispositivos de E/S Programables 552
• 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
• 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
$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
;----------------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------------
; Rutina LCD_OCUP
;----------------------------------------------------------------------------------------------------------------------
public lcd_ocup
extern pa_8155,pc_8155,leer_dato1,leer_dato2
defseg progr
seg progr
;----------------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------------
; 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
;----------------------------------------------------------------------------------------------------------------------
AD0-AD7 Registro TH
Registro TL
TH
TL
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.
Fig. 9.44. Entradas y salidas externas de la sección del timer del 8155.
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.
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.
Ejemplo 9.10
Solución:
f
lc = clk
fx
3.072 × 10 6
lc = = 640
4800
; 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
Ejemplo 9.11
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.
; 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
Ejemplo 9.12
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
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
Vref A base10
I OUT = ×
R ref 2n
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
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 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.
$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
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.
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).
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.
D7 D6 D5 D4 D3 D2 D1 D0
CNTL SHIFT FILA COLUMNA
0 0 0 1 1 1 0 0
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.
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.
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.
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.
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.
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.
Auto incremento de
la dirección.
Dirección de la
FIFO/RAM.
Auto incremento de
la dirección.
Dirección de la
RAM de pantalla.
Auto incremento de
la dirección.
Dirección de la
RAM de pantalla.
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
Ejemplo 9.13
;----------------------------------------------------------------------------------------------------------------
; 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
;----------------------------------------------------------------------------------------------------------------
Ejemplo 9.14
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
mvi e, n
rst 7
Dispositivos de E/S Programables 594
Fig.9.73 Campos de la pantalla. Leyenda y códigos de retorno del teclado del µPro 85.
Dispositivos de E/S Programables 595
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
Error.
• Ejecutar un programa de usuario a partir de una dirección determinada hasta encontrar una
instrucción RST 1 o HLT.
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:
2. <EXAM> <M> <2> <0> <0> <0> <↓> <4> <5> <↓> <↵>
3. <EXAM> <R> <A> <↓> <↓><↓> <↓> <7> <F><↓ > <↵>
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.
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.
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.
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.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.
;+---+---+---+---+----+
;| 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
;+---+---+---+---+---+
;|0CH|0DH|0EH|0FH|13H|
;+---+---+---+---+---+
;| 8 | 9 |0AH|0BH|12H|
;+---+---+---+---+---+
;| 4 | 5 | 6 | 7 |11H|
;+---+---+---+---+---+
;| 0 | 1 | 2 | 3 |10H|
;+---+---+---+---+---+
+---+---+---+---+---+
;|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
;*************************************************************************************
; Código en EPROM
;-------------------------------------------------------------------------------------
seg progr
;**********************************
; Vectores de interrupción
;**********************************
;*************************************************************************************
; Se programa el 8279
;*************************************************************************************
org 100h
;*************************************************************************************
;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
;*************************************************************************************
; 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
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
;*************************************************************************************
; 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
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.
;*************************************************************************************
; 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
;*************************************************************************************
; 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
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
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.
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
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:
Fig.9.90. Variación de VBE en función de la temperatura, a una corriente constante de 100 µA.
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:
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
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
VP − Ve
Ie =
R1
• La corriente Is en R 2 es :
Vs − VP
Is =
R2
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
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
Fig. 9.93. La salida del sensor se conecta a la entrada del circuito de acoplamiento.
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.
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:
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
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.
• 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
• 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.
;-----------------------------------------------------------------------------------------------------------------------
$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
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
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
;-----------------------------------------------------------------------------------------------------------------------
Á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
Ejemplo 9.16
Solución:
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 ⎠
3 E
t x = 32 × 10 × C x1 = 32μS
min
3 E
t x = 32 × 10 × C x 2 = 3.2mS
min
• 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
• Rutina CEROS
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
; --------------------------------------------------------------------------------------------------------------------------
; 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
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.
Brown, P. "Writing Interactive Compilers and Interpreters". John Wiley & Sons.
USA. 1979. ISBN 0-471-27609-X.
Dixon, A.
Antonakos, J. "Digital Electronics with Microprocessor Applications". John Wiley.
USA. 1987.
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.
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.
Robin, M.
Maurin, T. "Interconexión de Microprocesadores". Paraninfo S.A. Madrid. 1985.
ISBN 84-283-1224-9.
Uffenbeck, J. "Microcomputers & Microprocessors: The 8080, 8085, & Z-80 Pro-
gramming, Interfacing, & Troubleshooting". Prentice Hall. USA.
1999. ISBN 0132091984.