microprocesadores-luis urdaneta

665
UNIVERSIDAD DE ORIENTE NÚCLEO DE ANZOÁTEGUI ESCUELA DE INGENIERÍA Y CIENCIAS APLICADAS DEPARTAMENTO DE ELECTRICIDAD Análisis, Diseño y Simulación de Sistemas Basados en Microprocesador REALIZADO POR LUIS DANIEL URDANETA GUEVARA TRABAJO PRESENTADO COMO REQUISITO PARCIAL PARA ASCENDER A LA CATEGORÍA DE PROFESOR AGREGADO Puerto la Cruz, noviembre del 2005

Upload: luis-d-urdaneta-g

Post on 27-Jun-2015

6.597 views

Category:

Documents


5 download

DESCRIPTION

Análisis, Diseño y Simulación de Aplicaciones Basadas en Microprocesadores

TRANSCRIPT

Page 1: Microprocesadores-Luis Urdaneta

UUNNIIVVEERRSSIIDDAADD DDEE OORRIIEENNTTEE NNÚÚCCLLEEOO DDEE AANNZZOOÁÁTTEEGGUUII

EESSCCUUEELLAA DDEE IINNGGEENNIIEERRÍÍAA YY CCIIEENNCCIIAASS AAPPLLIICCAADDAASS DDEEPPAARRTTAAMMEENNTTOO DDEE EELLEECCTTRRIICCIIDDAADD

AAnnáálliissiiss,, DDiisseeññoo yy SSiimmuullaacciióónn ddee SSiisstteemmaass BBaassaaddooss eenn MMiiccrroopprroocceessaaddoorr

RREEAALLIIZZAADDOO PPOORR

LLUUIISS DDAANNIIEELL UURRDDAANNEETTAA GGUUEEVVAARRAA

TTRRAABBAAJJOO PPRREESSEENNTTAADDOO CCOOMMOO RREEQQUUIISSIITTOO PPAARRCCIIAALL PPAARRAA AASSCCEENNDDEERR AA LLAA CCAATTEEGGOORRÍÍAA DDEE

PPRROOFFEESSOORR AAGGRREEGGAADDOO

PPuueerrttoo llaa CCrruuzz,, nnoovviieemmbbrree ddeell 22000055

Page 2: Microprocesadores-Luis Urdaneta

ii

DDeeddiiccaattoorriiaa

A mi esposa: Leyda Thays A mis hijas: Ana Cristina y Luz Cristina

Quienes supieron soportar con paciencia y considera-ción las numerosas y largas sesiones de trabajo necesa-rias para la culminación de este proyecto.

Page 3: Microprocesadores-Luis Urdaneta

iii

PPrreeffaacciioo El presente trabajo ha sido realizado con un doble fin: el primero es cumplir

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

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

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

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

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

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

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

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

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

Page 4: Microprocesadores-Luis Urdaneta

iv

JJUUSSTTIIFFIICCAACCIIÓÓNN

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

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

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

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

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

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

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

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

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

Page 5: Microprocesadores-Luis Urdaneta

v

circuitos en bloques y conectarlos como una unidad funcional o sistema, teniendo la capacidad de establecer la arquitectura del microcomputador, interconectando correc-tamente la unidad de procesamiento central (CPU) con los dispositivos externos a éste, y generar el programa de aplicación que controla el equipo diseñado.

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

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

AALLCCAANNCCEE

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

En general, las aplicaciones de los microprocesadores pueden agruparse en

dos categorías principales: a.- En la primera, el μP se usa como una unidad central de proceso, junto con

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

b.- La segunda corresponde a los sistemas empotrados donde uno o más μPs

asociados con otros dispositivos LSI o VLSI, son usados para diseñar un sistema dedicado a realizar una tarea especifica, como: adquisición de da-tos, procesamiento de señal, control e instrumentación.

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

Page 6: Microprocesadores-Luis Urdaneta

vi

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

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

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

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

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

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

Como se expuso, este libro se escribe para usarse como guía texto en un curso

introductorio de microprocesadores dentro del plan de estudios de la mención de Sis-

Page 7: Microprocesadores-Luis Urdaneta

vii

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

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

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

Es de vital interés para el autor justificar la selección del μP 8085A como dis-

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

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

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

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

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

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

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

Page 8: Microprocesadores-Luis Urdaneta

viii

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

Hasta los sistemas Pentium II, el usuario tenía acceso directo a los buses de

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

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

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

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

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

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

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

Page 9: Microprocesadores-Luis Urdaneta

ix

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

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

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

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

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

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

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

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

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

Page 10: Microprocesadores-Luis Urdaneta

x

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

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

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

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

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

OORRGGAANNIIZZAACCIIÓÓNN DDEELL CCOONNTTEENNIIDDOO Sigue una breve descripción de la forma como están organizados los trece ca-

pítulos que constituyen este libro:

CAPÍTULO 1 Inicia este trabajo realizando una presentación del computador y mostran-do su evolución a través de los años, desde las primeras máquinas del si-glo XVII. La historia del computador se divide por generaciones, resaltán-dose los avances más significativos de cada una.

Page 11: Microprocesadores-Luis Urdaneta

xi

CAPÍTULO 2

En forma breve se presenta la estructura funcional del computador, descri-biéndose las unidades funcionales que lo constituyen. También se ofrece una clasificación de los computadores.

CAPÍTULO 3

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

CAPÍTULO 4

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

CAPÍTULO 5

Enseña como diseñar un sistema microcomputador 8085 usando tanto cir-cuitos integrados para bus multiplexado como chips de puertos y de me-moria convencionales. Presenta las técnicas de diseño de circuitos decodificadores de memorias y puertos usando decodificadores y dispositivos programables. Se descri-ben circuitos de memoria reales y se discute las consideraciones de velo-cidad de las memorias del sistema y las características eléctricas de los terminales del µP.

CAPÍTULO 6

Expone el modelo de programación del 8085, los formatos de instrucción y los modos de direccionamiento del µP. Se presenta el repertorio de ins-trucciones del µP y se describe la función de cada instrucción usando ejemplos prácticos cuidadosamente seleccionados. Se explica como programar funciones de control de tiempo para generar tiempos de retardo y formas de onda.

Page 12: Microprocesadores-Luis Urdaneta

xii

CAPÍTULO 7

Justifica el uso del lenguaje ensamblador para el desarrollo de programas. Se presentan técnicas de programación como diseño hacia abajo, código estructurado y programación modular. Se describen las estructuras lógicas de programación usando programas ejemplos. Se describe el proceso de ensamblaje y la relocalización de código. Espe-cífica la sintaxis del lenguaje ensamblador y las directivas de control. Se presentan las herramientas para desarrollo de programas como: entor-nos integrados para desarrollo y programas simuladores, mostrándose ejemplos ilustrativos. Se explica, usando ejemplos, como escribir código que use MACROS y tablas de consulta

CAPITULO 8

Discute las distintas técnicas de gestión de entrada y salida; entrada por programa, por interrupciones y acceso directo a memoria. Se describe el sistema de interrupciones del 8085. Se presentan los con-troladores de interrupción 8259 y de acceso directo a memoria 8237.

CAPITULO 9

Se presentan circuitos programables para interconexión de E/S como el 8255, el 8155 y el controlador de teclado/pantalla 8279. Se ofrecen aplicaciones prácticas realizadas con el 8055 mostrando los circuitos y programas. Algunas de éstas son: control de una matriz de te-clado, manejo de una pantalla del indicadores multiplexados, voltímetro digital, comunicación con impresora CENTRONICS, control de módulo LCD, generador de baudios, generador de forma de onda, programa mo-nitor para microcomputador, medidor de temperatura y medidor de capa-cidad.

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

Luis Daniel Urdaneta Guevara Puerto la Cruz, septiembre del 2005

Page 13: Microprocesadores-Luis Urdaneta

xiii

Este libro está destinado En particular a:

Los cursantes de la asignatura Sistemas de Microprocesadores I, dictada en el

pregrado de Ingeniería Eléctrica de la Universidad de Oriente. En general a:

Quienes teniendo un conocimiento limitado del universo de los microprocesa-

dores, o careciendo totalmente de éste, desean aprender de modo rápido y eficiente los conceptos, técnicas, criterios de diseño y de selección de dispositivos relaciona-dos.

Page 14: Microprocesadores-Luis Urdaneta

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.

Page 15: Microprocesadores-Luis Urdaneta

xv

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

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

Page 16: Microprocesadores-Luis Urdaneta

xvi

Advertencia

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

Page 17: Microprocesadores-Luis Urdaneta

xvii

Contenido

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

Capítulo 1. INTRODUCCIÓN AL COMPUTADOR.

1.1 GENERALIDADES………………………………………………………………….. 1 1.2 EL COMPUTADOR Y SU HISTORIA……………………………………………… 2 1.2.1 Los precursores del computador moderno………………………………………. 2 1.2.2 El computador digital……………………………………………………………. 4

La primera generación: Las válvulas de vacío………………………………….. 4 La segunda generación: Los transistores..…………………………….............. 13 La tercera generación: Los circuitos integrados………………………………. 15 La cuarta Generación: El microprocesador……………………………………. 18 La quinta Generación: Tecnología VLSI……………………………………… 24

Capítulo 2. ORGANIZACIÓN DEL COMPUTADOR.

2.1 ESTRUCTURA FUNCIONAL DEL COMPUTADOR 31 2.1.1 La unidad central de proceso 33 2.1.2 La unidad de control 34 2.1.3 La memoria 34 2.1.4 La unidad de entrada/salida 35 2.1.5 El generador de reloj 35

2.2 LAS INSTRUCCIONES DEL COMPUTADOR 36 2.3 CLASIFICACIÓN DE LOS COMPUTADORES 39

Capítulo 3. INTRODUCCIÓN AL MICROPROCESADOR.

3.1 GENERALIDADES………………………………………………………………… 41 3.2 ARQUITECTURA INTERNA DEL MICROPROCESADOR…………………….. 45 3.2.1 Proceso de síntesis de un microprocesador………………………………………… 45

El conjunto de instrucciones del microprocesador…………………………………. 46 La unidad de cálculo……………………………………………………………….. 46 Periférico de entrada……………………………………………………………….. 47 Periférico de salida…………………………………………………………………. 51 El conjunto extendido de instrucciones…………………………………………….. 54 Formatos para representación de información………………………………………55 La memoria del sistema……………………………………………………………. 58 El generador de direcciones………………………………………………………... 65

Page 18: Microprocesadores-Luis Urdaneta

xviii

El microprocesador como máquina de estados…………………………………….. 68 La unidad de control………………………………………………………………... 70 Comunicación con periféricos lentos………………………………………………. 73 Conjunto extendido de instrucciones………………………………………………. 75 Instrucciones no soportadas………………………………………………………... 80 Diagrama final del microprocesador sintetizado…………………………………… 83 Las señales de entrada y salida al microprocesador………………………………... 84

3.2.2 El sistema microcomputador……………………………………………………….. 86 Las direcciones de memoria………………………………………………………... 87 Las direcciones de los puertos……………………………………………………… 90

3.3 ARQUITECTURA DE UN µP DE 8 BITS MÁS VERSÁTIL……………………. 91 3.4 ARQUITECTURA DE UN µCOMPUTADOR ESTÁNDAR………………………. 98

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

4.1 GENERALIDADES……………………………………………………………….. 101 4.2 ESTRUCTURA FUNCIONAL DEL 8085A……………………………………..... 104

4.2.1 La unidad de control………………………………………………………….. 105 4.2.2 Los registros internos………………………………………………………… 108 4.2.3 La unidad aritmética y lógica………………………………………………… 110 4.2.4 El bus interno de datos……………………………………………………….. 111

4.3 CONSIDERACIONES DE TIEMPO PARA EL 8085A…………………………... 114 4.3.1 El ciclo de instrucción………………………………………………………... 115 4.3.2 Secuencia de transición de estados…………………………………………... 118 4.3.3 El estado de espera…………………………………………………………… 122 4.3.4 El modo de operación paso a paso…………………………………………… 125 4.3.5 Ciclos de lectura y escritura en memoria y puertos de E/S…………………... 127

4.4 LA SECUENCIA DE INICIO DEL 8085A……………………………………….. 129

Capítulo 5. EL MICROCOMPUTADOR BÁSICO.

5.1 SISTEMA MCS-85 MÍNIMO…………………………………………………….. 134 5.2 INTERCONEXIÓN CON DISPOSITIVOS CONVENCIONALES……………… 143

5.2.1 La memoria de programa…………………………………………………….. 147 5.2.2 La memoria de datos…………………………………………………………. 151 5.2.3 Los puertos de entrada y salida………………………………………………. 154

5.3 DECODIFICACIÓN EXHAUSTIVA DE LAS DIRECCIONES………………… 158 5.4 PUERTOS DE E/S SELECCIONADOS COMO MEMORIA……………………. 173 5.5 DECODIFICADOR CON DISPOSITIVOS PROGRAMABLES………………… 179 5.6 CONSIDERACIONES SOBRE INTERCONEXIÓN A LOS BUSES……………. 188

5.6.1 Carga máxima del bus del 8085A…………………………………………... 188 5.6.2 Selección de la memoria del sistema………………………………………… 190

5.7 MEMORIAS EEPROM Y FLASH…………………………………………………193 5.8 BANCOS DE MEMORIA…………………………………………………………. 197

Page 19: Microprocesadores-Luis Urdaneta

xix

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

6.1 EL MODELO PARA PROGRAMACIÓN……………………………………….. 207 6.2 FORMATO DE LAS INSTRUCCIONES………………………………………… 208 6.3 MODOS DE DIRECCIONAMIENTO……………………………………………. 210

6.3.1 Direccionamiento directo…………………………………………………….. 210 6.3.2 Direccionamiento Inmediato…………………………………………………. 211 6.3.3 Direccionamiento por registro………………………………………………... 213 6.3.4 Direccionamiento indirecto por registro……………………………………... 213

6.4 EL CONJUNTO DE INSTRUCCIONES DEL 8085……………………………… 214 6.4.1 Grupo de instrucciones para transferencia de datos…………………………. 215 6.4.2 Grupo de instrucciones que ejecutan operaciones lógicas…………………… 218 6.4.3 Instrucciones para manejo de la pila…………………………………………. 234 6.4.4 Grupo de instrucciones para bifurcaciones…………………………………... 240 6.4.5 Grupo de instrucciones aritméticas…………………………………………... 249

6.5 ARITMÉTICA DE PUNTO FIJO O DE PUNTO FLOTANTE…………………... 276 6.6 INSTRUCCIONES ADICIONALES……………………………………………… 284 6.7 RUTINAS DE RETARDO………………………………………………………… 284

6.7.1 El lazo de retardo básico……………………………………………………... 285 6.7.2 Retardos de mayor duración………………………………………………….. 289

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

7.1 EL LENGUAJE DE PROGRAMACIÓN…………………………………………. 294 7.1.1 Traducción de programas…………………………………………………….. 296 7.1.2 Lenguaje ensamblador o de alto nivel………………………………………... 298 7.1.3 El formato HEX-INTEL……………………………………………………... 303

7.2 ESTRUCTURA DEL PROGRAMA……………………………………………… 306 7.2.1 Programación modular……………………………………………………….. 306 7.2.2 Diseño hacia abajo…………………………………………………………… 307 7.2.3 Código estructurado………………………………………………………….. 308

Estructura secuencial………………………………………………………… 309 Estructura IF-THEN/ELSE………………………………………………….. 311 Estructura CASE……………………………………………………………. 313 Estructura DO-WHILE………………………………………………………. 316 Estructura REPEAT-UNTIL………………………………………………... 317

7.3 EL LENGUAJE ENSAMBLADOR………………………………………………. 318 7.3.1 El proceso de ensamblaje…………………………………………………….. 319 7.3.2 Proceso de ensamblaje de un programa modular…………………………….. 320 7.3.3 Lenguaje ensamblador para el 8085………………………………………….. 325

Formato de línea……………………………………………………………... 326 Conjunto de caracteres……………………………………………………….. 327 Delimitadores………………………………………………………………… 327 Especificación de operandos…………………………………………………. 327 Símbolos reservados…………………………………………………………. 329 Definición de símbolos………………………………………………………. 329 Evaluación de expresiones…………………………………………………… 331

Page 20: Microprocesadores-Luis Urdaneta

xx

Traducción de un archivo fuente…………………………………………….. 332 Directivas generales del ensamblador……………………………………….. 340

7.4 HERRAMIENTAS PARA DESARROLLO DE PROGRAMAS…………………. 365 7.4.1 Programas para simulación del microprocesador 8085……………………… 371 7.4.2 Sistema integrado para desarrollo de programas…………………………….. 396

7.5 MACROS………………………………………………………………………….. 409 7.6 TABLAS DE CONSULTA (lookup tables)………………………………… 415

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

8.1 ENTRADA Y SALIDA POR PROGRAMA……………………………………… 429 8.2 ENTRADA Y SALIDA USANDO INTERRUPCIONES………………………… 443 8.2.1 El sistema de interrupciones del 8085A…………………………………………. 445

Interrupciones disparadas por la entrada INTR…………………………………... 449 Interrupciones disparadas por las entradas RST………………………………….. 453

8.2.2 El controlador de interrupciones 8259A………………………………………… 475 Interconexión con el sistema 8085A……………………………………………… 476 Programación del 8259A………………………………………………………... 479

8.3 ACCESO DIRECTO A MEMORIA………………………………………………. 492

Capítulo 9. DISPOSITIVOS DE E/S PROGRAMABLES

9.1 CIRCUITO PARA INTERCONEXIÓN DE PERIFÉRICOS 8255……………….. 497 9.1.2 Modos de operación del 8255ª…………………………………………... 499 Modo 0…………………………………………………………………... 500 Modo 1…………………………………………………………………... 500 Modo 2…………………………………………………………………... 500

9.1.3 Programación del 8255ª…………………………………………………. 500 9.1.4 Aplicaciones del 8255Aª………………………………………………… 503

Operación en el modo 0…………………………………………………. 503 Operación en el modo 1…………………………………………………. 529 Operación en el modo 2…………………………………………………. 536 9.2 DISPOSITIVO 8155: SRAM/PUERTOS DE E/S/TIMER………………………... 539

9.2.1 Sección de entrada y salida del 8155………………………………………… 541 Registro de comando…………………………………………………………. 542 Registro de estado……………………………………………………………. 544 9.2.2 Sección del temporizador-contador del 8155………………………………… 560

9.3 CONTROLADOR DE TECLADO Y PANTALLA 8279…………………………. 580 9.3.1 Funcionamiento del 8279…………………………………………………….. 582 9.3.2 Programación del 8279………………………………………………………. 585

Bibliografía…………………………………………………………………………. 644

Page 21: Microprocesadores-Luis Urdaneta

Introducción al Computador 1

IInnttrroodduucccciióónn aall CCoommppuuttaaddoorr

1.1 GENERALIDADES

La presentación del computador en un curso introductorio de sistemas de mi-croprocesadores se justifica plenamente por el hecho que el μP es en realidad la uni-dad de proceso fundamental de un tipo de computador conocido como microcompu-tador (μC).

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

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

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

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

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

sión en una gran variedad de aplicaciones. • Su uso en el diseño de sistemas digitales disminuye en forma significativa

el número de componentes necesarios.

Page 22: Microprocesadores-Luis Urdaneta

Introducción al Computador 2

• El tiempo de ingeniería empleado en el desarrollo de sistemas se acorta en forma drástica.

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

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

1.2 EL COMPUTADOR Y SU HISTORIA Exponer con detalle el origen computador y el nacimiento y desarrollo de la

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

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

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

1.2.1 Los precursores del computador moderno

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

Fig. 1.1 Los diez dientes de cada rueda de la máquina de Pascal representaban los dígitos del 0 al 9.

Las operaciones se realizaban rotando las ruedas el número de dígitos necesarios.

Page 23: Microprocesadores-Luis Urdaneta

Introducción al Computador 3

La reflexión con la cual Pascal acompaño la presentación de su calculadora ha perdurado a través del tiempo, revelando que además de ser un gran científico te-nía alma de visionario,

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

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

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

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

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

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

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

Fig. 1.2 Máquina diferencial de Babbage.

Page 24: Microprocesadores-Luis Urdaneta

Introducción al Computador 4

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

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

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

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

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

1.2.2 El computador digital

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

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

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

La primera generación de computadores nace en el año de 1946 cuando se puso en operación la famosa computadora gigante norteamericana ENIAC (Electronic Numerical Integrator and Calculator), proyecto financiado por el gobierno de los

Page 25: Microprocesadores-Luis Urdaneta

Introducción al Computador 5

Estados Unidos, y desarrollada en la Escuela de Ingeniería Moore de la Universidad de Pennsylvania bajo la supervisión de John Presper Eckert y John.Mauchly.

Esta máquina es aceptada como el primer computador programable, y se alojaba en un gabinete de 30 metros de longitud, 3 metros de altura y 1 metro de profundidad, estando constituida por 18000 tu- bos de vacío.

Este computador digital de 2 mi-llones de dólares, pesaba 30000 kilogramos y consumía 150 KW, requiriendo toneladas de equipos de aire acondicionado para evitar el sobrecalentamiento.

Fig.1.3 La computadora gigante ENIAC ocupaba un área significativa de un edificio.

El ENIAC se diseño en base a una arquitectura conocida como tipo Harvard, cuya característica fun-damental es que usa unidades de memoria separadas para los datos y las instrucciones.

La arquitectura Harvard fue intro-ducida en la década de los 30's por un científico de la Universidad de Harvard llamado Howard Aiken. Las figuras 1.3 y 1.4 muestran en forma dramática las diferencias existentes entre el ENIAC y un µcomputador monopastilla mo-derno.

Fig.1.4 El microcontrolador C167R aloja en un área de 100 mm2

todos los elementos de un computador, además de múltiples controladores de periféricos.

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

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

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

diendo almacenar 20 números decimales de 10 dígitos. El programa en lenguaje de

Page 26: Microprocesadores-Luis Urdaneta

Introducción al Computador 6

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

Lectora de tarjetas

Impresora de tarjetas

Uni

dad

de C

ontro

l

Mul

tiplic

ador

D

ivis

or y

1 2 3 ... 20

Acu

mul

ador

Unidad de Programación

Bus de Escritura

Bus de Lectura

Bus de Instrucciones

Fig. 1.5 Estructura del computador ENIAC

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

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

Page 27: Microprocesadores-Luis Urdaneta

Introducción al Computador 7

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

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

El diseño del Colossus se inició en 1939, estando compuesto por 1500 válvu-

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

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

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

Fig. 1.7 El computador MARK I.

Page 28: Microprocesadores-Luis Urdaneta

Introducción al Computador 8

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

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

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

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

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

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

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

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

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

Page 29: Microprocesadores-Luis Urdaneta

Introducción al Computador 9

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

Fig. 1.8 El computador EDVAC. El razonamiento de Von Neumann fue que si toda información se carga en el

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

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

ción en dos campos: el campo de código de operación para identificar la instrucción a ejecutar, y el campo de dirección para especificar la localización en memoria del operando u operandos a usar por la instrucción. La figura 1.9 muestra el formato descrito.

Código de Operación

Dirección Operando

1

Dirección Operando

2

Dirección Resultado

Dirección Instrucción

siguiente Campo de Código de Operación

Campo de Dirección

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

Page 30: Microprocesadores-Luis Urdaneta

Introducción al Computador 10

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

1. El código de operación para señalar el tipo de operación: suma, res-ta, producto, detección de paridad, complemento etc.

2. La dirección de los operandos que participan en el cálculo. 3. La dirección de memoria donde debe almacenarse el resultado. 4. La dirección donde está la instrucción próxima. Una máquina de cómputo cuya instrucción tenga el formato de la figura 1.9 se

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

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

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

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

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

Page 31: Microprocesadores-Luis Urdaneta

Introducción al Computador 11

Direcciones

Instrucciones y datos

Fig. 1.10 Diagrama de bloques del computador IAS.

A diferencia del ENIAC, el computador IAS era una máquina binaria y no de-cimal, con la unidad de memoria constituida por 1000 posiciones de 40 bits donde se podían almacenar tanto datos como las 21 instrucciones disponibles para la máquina. El IAS fue el modelo a seguir para el diseño se los siguientes computadores de propó-sito general. Excepto algunos casos, todos los computadores modernos mantienen la estructura de la máquina de Von Neumann. Los continuos avances logrados en la ar-quitectura y el incremento de la capacidad de memoria permitió la construcción de dispositivos cada vez más rápidos y eficientes, mientras que se desarrollaron los pri-meros lenguajes simbólicos que simplificaron en forma notable el proceso de desarro-llos de programas.

En 1950 el computador abandonó los centros académicos y de investigación con la liberación de la primera máquina comercial, el UNIVAC I. (Universal Automa-tic Computer) fabricada por una empresa fundada en el año 1947 por John Eckert y John.Mauchly: Eckert-Mauchly Computer Corporation, la cual posteriormente se fundió con la Sperry Rand Corporation. Esta última empresa compartía con IBM el dominio de la industria de fabricación de computadores. La figura 1.11 es una foto-grafía del UNIVAC I en operación. A finales del los 50 salió al mercado el modelo UNIVAC II, el cual era una máquina más avanzada que su antecesor La Eckert-Mauchly Computer Corporation, ahora la división UNIVAC de la Sperry, también inició el desarrollo de la serie de computadores con código 1100. El primer modelo de esta serie fue el UNIVAC 1103 destinado para aplicaciones científicas de gran complejidad que involucraban el procesamiento de grandes cantidades de datos a alta velocidad.

Page 32: Microprocesadores-Luis Urdaneta

Introducción al Computador 12

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

Fig. 1.12 El UNIVAC II.

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

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

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

Page 33: Microprocesadores-Luis Urdaneta

Introducción al Computador 13

La segunda generación: Los Transistores El desarrollo del transistor entre los años 1948 y 1952, realizado por los cien-

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

A partir del año 1956, la sustitución de las válvulas de vacío por transistores

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

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

GENERACIÓN PERIODO

TECNOLOGÍA VELOCIDAD operacio-nes/seg

I 1946-1955 Válvulas de vacío 40000 II 1956-1964 Transistores discretos 200000 III 1965-1970 Circuitos integrados-

Tecnologías SSI, MSI. 1000000

IV 1971-1977 El µprocesador. Tecnología LSI.

10000000

V 1978 → Diseño VLSI. 100000000

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

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

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

Digital Equipment Corporation (DEC) con el modelo PDP-1, el cual se considera

Page 34: Microprocesadores-Luis Urdaneta

Introducción al Computador 14

como el primer minicomputador en el mercado de máquinas de computación. Está máquina usó el primer terminal de video y tenía capacidad gráfica.

La respuesta del consorcio IBM no llegó hasta el año 1959 con el computador

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

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

Las máquinas de esta generación podían ejecutar los programas con mayor

eficiencia que sus antecesoras. Por ejemplo, el computador ATLAS desarrollado en 1962 en la universidad de Manchester usaba memoria virtual, segmentación e inte-rrupciones.

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

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

Page 35: Microprocesadores-Luis Urdaneta

Introducción al Computador 15

explotó el uso del paralelismo a nivel de unidades funcionales de la CPU. Su desem-peño era superior al IBM 7094.

Fig. 1.14 Computadores CDC 6700 y CDC 6700.

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

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

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

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

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

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

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

Page 36: Microprocesadores-Luis Urdaneta

Introducción al Computador 16

La tercera generación: Los circuitos integrados El ensamblaje de las tarjetas de circuitos digitales, módulos básicos que for-

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

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

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

El 360 fue introducido por IBM en 1965 como un modelo que incorporaba la

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

Fig. 1.15 El IBM 360. Primer computador con microprograma. El diseño de esta máquina fue un proceso tan cuidadoso y planificado que la

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

Page 37: Microprocesadores-Luis Urdaneta

Introducción al Computador 17

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

El 360 fue diseñado de modo que un programa determinado pudiese ser ejecu-

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

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

MODELO CARATERÍSTICAS 30 40 50 65 75

Memoria Máxima (Kbytes) 64 256 256 512 512 Velocidad de acceso a memoria (Mbytes/s, máx)

0.5 0.8 2.0 8.0 16.0

Tiempo de ciclo del procesador (µs) 1.0 0.625 0.5 0.25 0.2 Velocidad relativa 1 3.5 10 21 50 Número de buses de datos 3 3 4 6 6 Velocidad del bus de datos. (Kbytes/s, máx) 250 400 800 1250 1250

Además del concepto de microprograma, con el IBM 360 surgieron otras in-

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

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

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

Page 38: Microprocesadores-Luis Urdaneta

Introducción al Computador 18

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

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

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

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

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

Page 39: Microprocesadores-Luis Urdaneta

Introducción al Computador 19

La cuarta Generación: el microprocesador.

A diferencia de las generaciones anteriores, la fecha de transición hacia la cuarta generación no la distingue la introducción de un nuevo modelo de computador, o el uso de una tecnología novedosa en la fabricación de éstos. Para muchos especia-listas la transición hacia la cuarta generación de sistemas de computación ocurre en los inicios de la década de los años 70 cuando aparece la tecnología LSI, como resul-tado del sostenido incremento de la densidad de integración de circuitos digitales. La aplicación de esta técnica de integración condujo a la fabricación de dispositivos que contenían en un encapsulado desde miles a decenas de miles de interruptores digitales.

La primera aplicación de la tecnología LSI fue el desarrollo de chips de me-moria para sustituir a las voluminosas y lentas unidades de almacenamiento basadas en núcleos magnéticos, tradicionalmente usadas en computadores. A partir de la apa-rición del primer circuito integrado en 1959, un impresionante desarrollo en la tecno-logía de la microelectrónica condujo en la década del 60, a duplicar cada año el nú-mero de interruptores contenido en un CI. Este vertiginoso compás disminuyó en la siguiente década, a la aún significativa cadencia de cuadriplicarlos cada tres años.

Gordon Moore, uno de los fundadores del consorcio INTEL, había predicho

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

Cap

acid

ad e

n K

bits

1976 1978 1980 1982 1984 1986 1988 1990 1992

Año de inicio de ventas

16K

64K

256K

1M

4M

16M

105

104

103

102

10

Ley de Moore

DRAM

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

Page 40: Microprocesadores-Luis Urdaneta

Introducción al Computador 20

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

Todo comenzó 20 años antes, en los años 50, cuando la necesidad presente de

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

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

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

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

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

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

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

Page 41: Microprocesadores-Luis Urdaneta

Introducción al Computador 21

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

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

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

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

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

Fig. 1.19 El microprocesador 8008 de Intel.

Page 42: Microprocesadores-Luis Urdaneta

Introducción al Computador 22

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

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

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

Tabla 1.3. Microprocesadores de 8 bits.

FABRICANTE CÓDIGO

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

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

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

Cada nuevo producto presentado por la empresa INTEL exhibía mayor veloci-

dad, espacio de memoria aumentado y un repertorio de instrucciones más potente y diverso; además de requerir cada vez menos componentes para diseñar y construir un sistema µC completo a partir del µP.

Page 43: Microprocesadores-Luis Urdaneta

Introducción al Computador 23

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

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

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

Núm

ero

de c

ompo

nent

es p

ara

un si

stem

a m

ínim

o

Año del diseño del microcomputador

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

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

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

Page 44: Microprocesadores-Luis Urdaneta

Introducción al Computador 24

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

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

Fig. 1.21 El microcomputador APPLE II.

La quinta Generación: Tecnología VLSI. La identificación de la generación a la cual pertenece un sistema específico se

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

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

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

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

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

Page 45: Microprocesadores-Luis Urdaneta

Introducción al Computador 25

un microprocesador de mayor potencia de computo y capaz de soportar mayor capaci-dad de memoria.

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

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

El 8086 ejecuta una suma 3.25 veces más rápido que su antecesor el 8085,

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

El 8086 y el 8088 pueden considerase los primeros μPs modernos, los cuales

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

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

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

Para esta época el mercado de fabricación de µPs era compartido por INTEL

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

Page 46: Microprocesadores-Luis Urdaneta

Introducción al Computador 26

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

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

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

Los 134 mil transistores albergados en el interior del encapsulado del 80286

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

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

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

Tabla 1.4 Características de los microprocesadores de Intel.

Código Fecha de Introducción

FrecuenciaMHz

Memoria

Transitores

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

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

las etapas de desarrollo de los µPs de INTEL, apreciándose la validez de la ley de Moore.

Page 47: Microprocesadores-Luis Urdaneta

Introducción al Computador 27

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

Tran

sist

ores

8086

8088

8028680386

80486 Pentium

Pentium Pro

Pentium II

8080 8004

8008 Ley de Moore

µProcesadores

.Año de inicio de ventas

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

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

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

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

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

Page 48: Microprocesadores-Luis Urdaneta

Introducción al Computador 28

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

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

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

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

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

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

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

Hasta 1999 el Pentium III de 550 MHz era el µP más poderoso de Intel, el

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

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

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

Page 49: Microprocesadores-Luis Urdaneta

Introducción al Computador 29

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

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

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

Otro punto digno de mencionar se relaciona con el dominio casi absoluto que

la arquitectura Von Neumann ha mantenido en el diseño de máquina de cómputo. Los microprocesadores Intel ix86 usan tal arquitectura y de alguna manera comparten muchas características de los computadores fabricados en las últimas cuatro décadas.

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

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

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

currieron a la abandonada arquitectura Harvard que permitía la transferencia simultán-ea de instrucciones y datos al disponer de espacios de memoria separado para datos y programa. En al año 1980 la empresa American Microsystems Inc introdujo el primer procesador DSP AMI S2811, al poco tiempo hicieron su aparición el Intel 2920 y el NEC mPD7720, todos con arquitectura Harvard. En el año 1982 Texas Instruments liberó el TMS 32010.

Una fuente actualizada sobre procesadores modernos es la WEB, los avances tecnológicos son de tal magnitud, diversidad y velocidad que casi es necesario redefi- nir el concepto de computador. Por ejemplo, existe una máquina japonesa constituida

Page 50: Microprocesadores-Luis Urdaneta

Introducción al Computador 30

por 640 computadores interconectados, que ejecutan programas con el propósito de simular las condiciones reales del clima del planeta tierra. Los fabricantes de este cí-clope se refieren a éste como, el computador.

Page 51: Microprocesadores-Luis Urdaneta

Organización del Computador 31

OOrrggaanniizzaacciióónn ddeell ccoommppuuttaaddoorr

En forma similar a como la aparición en el año 1980 del primer reloj de cuar-

zo desplazó el mecanismo tradicional de medición de tiempo basado en componentes mecánicos, el procesamiento de información por medios electrónicos dejó muy atrás las técnicas mecánicas usadas por el hombre para el manejo de información.

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

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

Datos

Adquirir Procesar Almacenar Presentar

Resultados

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

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

Page 52: Microprocesadores-Luis Urdaneta

Organización del Computador 32

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

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

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

2.1 ESTRUCTURA FUNCIONAL DEL COMPUTADOR

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

MEMORIA

UNIDAD LÓGICA Y

ARITMÉTICA

ENTRADAS

UNIDAD DE

CONTROL

SALIDAS CCCPPPUUU

RELOJ

Fig. 2.2 Estructura simplificada de un computador.

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

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

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

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

Page 53: Microprocesadores-Luis Urdaneta

Organización del Computador 33

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

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

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

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

• La Unidad Central de Proceso

(CPU) La Unidad de Control. (CU)

• La Memoria • La Unidad de Entrada/Salida. , y • El Generador de Reloj.

2.1.1 La unidad central de proceso

Es la esencia del sistema, su función es controlar la interpretación y ejecución de las instrucciones y todas las acciones que realice el computador bajo la dirección del programa almacenado en memoria en forma de una secuencia de instrucciones. Toda CPU está compuesta de la Unidad Lógica y Aritmética y la Unidad de Control

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

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

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

mente en registros internos de la CPU capaces de conectarse a las entradas de la

Page 54: Microprocesadores-Luis Urdaneta

Organización del Computador 34

ALU. Dentro de la CPU existen también un grupo de registros de propósito específico cuyas funciones se expondrán más adelante.

Direcciones Registros

Unidad de control

ALU

Control

Datos

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

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

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

2.1.3 La memoria

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

Memoria

A10-A0

R/W

D7-D0

CPU

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

Page 55: Microprocesadores-Luis Urdaneta

Organización del Computador 35

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

de 1024 posiciones al CPU. El procesador entrega la dirección (A9-A0) de la celda de memoria fuente o destino de la información a transferir, y coloca la línea de control

WR/ en el estado lógico apropiado para leer (alto) o escribir (bajo) el dato en la me-moria. El dato es transferido desde o hacia la CPU a través del bus bidireccional de datos. Una memoria puede concebirse como un arreglo de biestables organizados en celdas de 1, 4, 8, ó 16 bits, cada una de las cuales tiene una dirección específica. La figura 2.4.b es una representación de una memoria de 1024 (0000-1023) posiciones de 8 bits. Existen distintos tipos de memoria de acuerdo con el tipo de acceso y la tecnología usada en la fabricación. La memoria principal en computadores es del tipo de acceso aleatorio (RAM), término que identifica a dispositivos de almacenamiento en los cuales el tiempo de acceso a una posición determinada es independiente de la localización del dato, de modo que el tiempo que el procesador debe esperar para obtener información desde la memoria es el mismo para cada una de las 1024 posi-ciones.

2.1.4 La unidad de entrada/salida

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

2.1.5 El generador de reloj

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

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

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

Page 56: Microprocesadores-Luis Urdaneta

Organización del Computador 36

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

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

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

2.2 LAS INSTRUCCIONES DEL COMPUTADOR

La ejecución de toda instrucción se realiza en dos fases fundamentales: bús-queda y ejecución. Durante la fase de búsqueda el computador obtiene la instrucción almacenada en memoria y la traslada a la CPU para su posterior decodificación.

BÚSQUEDA EJECU-CIÓN

Instrucción a la CPU

Ejecución culminada

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

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

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

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

Page 57: Microprocesadores-Luis Urdaneta

Organización del Computador 37

tualidad, ni existieron hace 40 años, limitaciones de orden técnico para fabricar un computador de 4 direcciones, el gran número de bits/instrucción es inconveniente debido a que es necesaria una CPU con estructura interna muy compleja para el pro-cesamiento adecuado de la instrucción.

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

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

D79 D0

Código de Operación

Dirección Operando 1

Dirección Operando 2

Dirección Resultado

Dirección Instrucción Siguiente

(a) D63 D0

Código de Operación

Dirección Operando 1

Dirección Operando 2

Dirección Resultado

(b)

D47 D0

Código de Operación

Dirección Operando 1

Dirección Operando 2

(c)

D31 D0

Código de Operación

Dirección Operando

(d)

D15 D0

Código de Operación

(e)

Fig. 2.6 Formato de instrucciones del computador.

(a) Cuatro direcciones. (b) Tres direcciones. (c) Dos direcciones. (d) Una dirección. (e) Sin dirección Para obtener un computador de tres direcciones con el formato de instrucción

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

Si es necesario romper la secuencia normal del programa para ejecutar una instrucción en otra área de la memoria, el computador dispone de una instrucción de salto o bifurcación en cuyo campo de dirección se especifica la dirección del salto. El efecto de la ejecución de tal instrucción es sustituir el contenido del contador de programa por el campo de dirección.

Page 58: Microprocesadores-Luis Urdaneta

Organización del Computador 38

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

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

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

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

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

Page 59: Microprocesadores-Luis Urdaneta

Organización del Computador 39

del operando original en A. El resultado se deposita en memoria por medio de una instrucción de transferencia de datos desde el A hasta el dispositivo de almacena-miento.

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

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

2.3 CLASIFICACIÓN DE LOS COMPUTADORES

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

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

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

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

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

Los expertos del área acostumbran a clasificar los computadores en tres gru-

pos principales: Computadores grandes o Mainframes, Minicomputadores o Estacio-nes de Trabajo, y Microcomputadores, en función de sus dimensiones y velocidad de operación. Tal clasificación es excesivamente amplia, y su validez está sujeta al desa-rrollo altamente dinámico de la industria del computador. Una máquina clasificada

Page 60: Microprocesadores-Luis Urdaneta

Organización del Computador 40

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

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

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

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

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

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

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

Page 61: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

41

IInnttrroodduucccciióónn aall MMiiccrroopprroocceessaaddoorr

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

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

3.1 GENERALIDADES En léxico de computación el término Organización distingue los componentes

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

Atributos típicos de la arquitectura son: • Conjunto de instrucciones, • Longitud de palabra, • Modos de direccionamiento y • Técnicas de gestión de entrada y salida.

Page 62: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

42

• Conjunto de instrucciones

• Longitud de palabra

• Modos de direccionamiento

• Técnicas de gestión de E/S

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

Aquellos aspectos del sistema ocultos para quien escribe el código, constitu-

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

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

para el programador. Ocurre a menudo que las máquinas ofrecidas por un fabricante determinado

tengan la misma arquitectura pero estén organizadas en forma diferente. Esto signifi-

Page 63: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

43

ca que una serie de computadores ejecutan el mismo repertorio de instrucciones pero difieren en la cantidad y la calidad de los recursos disponibles por el usuario.

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

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

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

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

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

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

ALU

REGISTROS

UNIDAD DE CONTROL

Fig. 3.3 Componentes básicos de un microprocesador

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

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

Page 64: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

44

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

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

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

PUERTOS

RWM

EPROM

CPU

TIMERS

Fig. 3.4 Microcomputador en una pastilla.

Los μCtrls de 8 bits son a menudo usado como controladores de teclado de microcomputadores (un 8049 controlaba el teclado del PC compatible IBM), en surti-dores de gasolina, hornos de microondas, receptores de TV y otros electrodomésticos, en control de ascensores, controladores de tráfico urbano, y muchas otras aplicaciones con complejidad media. Los dispositivos de 16 y 32 bits se encuentran en regulado-res de sistemas de frenado antibloqueo de automóviles, en el control de motores de inyección directa, en controladores inteligentes de discos, en sistemas de robots, en equipos de audio y procesamiento de imágenes y en el control de manipuladores in-dustriales.

La evolución de los μCtrls ha sido de tal magnitud y su uso tan extendido que es posible encontrar dispositivos avanzados de 16/32 bits con estructura de multipro-cesador resolviendo tareas de control complejas en sistemas distribuidos de control industriales.

Page 65: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

45

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

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

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

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

3.2.1 Proceso de síntesis de un microprocesador

Se propone la síntesis de una unidad central de procesamiento de ocho bits, capaz de ejecutar programas usando el grupo de instrucciones que se especifican en la tabla 3.1.

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

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

Page 66: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

46

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

El conjunto de instrucciones del microprocesador

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

?

VCC

R9-R16

270 Ω

D0-D7

R1-R8 5.1 KΩ

S0-S7

3.5. Diagrama general del sistema propuesto.

En el μP hipotético, ADD ejecuta la operación de adición de dos números bi-narios, mientras que SUB realiza la substracción. El par de instrucciones restantes IN y OUT permiten la comunicación de la CPU con el mundo exterior para adquirir da-tos y entregar resultados, respectivamente. La unidad de cálculo

Para ejecutar las instrucciones ADD y SUB se requiere una Unidad Aritmé-

tica Lógica o ALU, la cual como se sabe es la parte de la CPU encargada de realizar operaciones de este tipo.

Page 67: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

47

Registro BRegistro A

Unidad Lógica y

Aritmética

(A) (B)

(A+B)

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

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

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

Periférico de entrada

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

(A) ← (Periférico) Esta transferencia implica que la CPU debe tener un camino externo de datos

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

El término entrada/salida (E/S) cubre toda transferencia o intercambio de da-tos entre el µP y un dispositivo externo. Durante una operación de entrada, los da-tos no son transferidos directamente desde el periférico al acumulador, sino que un

Page 68: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

48

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

Registro BRegistro A

Unidad Lógica y

Aritmética

Periférico 1

(A) (B)

(A+B)

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

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

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

Operación de

entrada

Operación de salida

Fig. 3.8 Operaciones de E/S.

Page 69: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

49

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

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

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

• Para puertos de salida tal consideración reviste importancia cuando varios equipos externos que

funcionan conjuntamente con el μP están conectados al bus, debido a que la carga tiene efecto acumulativo.

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

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

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

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

DISPOSITIVO DE

ENTRADA

REGISTRODE

8 BITS

BUFFER DE TRES ESTADOS

SEL

D7

D6

D0

BUS DE DATOS

Page 70: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

50

Puerto 01

R1-R8

S0 - S7

VCC

CON1

Fig. 3.10 Puerto de entrada al μP.

Page 71: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

51

De este modo, la entrada de selección PE01, activa en nivel bajo, habilita la lectura y carga en el acumulador del estado lógico de S7-S0. El bus de datos del µP se conecta al conector CON1.

Extendiendo el código de instrucción Asignar la dirección 1 al dispositivo de entrada obliga a incorporar un ope-

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

Código de operación

Código de operando

Instrucción Operando D7 D 6 D5 D4 D3 D2 D1 D0

IN Puerto 1 1 0 X X X X 0 1 Fig. 3.11. Un operando es necesario para la instrucción IN puerto.

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

(A) ← (Puerto 1) Periférico de salida

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

(Puerto 2) ← (A) De modo que la instrucción de salida OUT también requiere un operando para

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

Page 72: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

52

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

Las características operacionales del periférico conectado al sistema determi-na cuan complejo es el circuito de interconexión, pudiendo requerirse desde simples registros y/o buffers de tres estados hasta circuitos LSI programables de propósito general. Para el puerto de entrada fue suficiente con conectar los interruptores al bus de datos del μP por medio de buffers de tres estados considerando que el estado lógi-co de los bits de entrada es retenido por los interruptores.

Código de operación

Código de operando

Instrucción Operando D7 D 6 D5 D4 D3 D2 D1 D0

OUT Puerto 2 1 1 X X X X 1 0

Fig. 3.13 Un operando es necesario para la instrucción OUT puerto. Para seleccionar la lógica que realiza el puerto de salida es necesario conside-

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

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

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

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

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

Registro BRegistro A

Unidad Lógica y

Aritmética

(A) (B)

(A+B)

Periférico 2

IN OUT

(A)

Page 73: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

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

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

54

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

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

El conjunto extendido de instrucciones Establecida la forma en la cual el µP obtiene los operandos desde los interrup-

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

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

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

BUS DE D

D

D

D

0

7

6

(B) ← (A)

ATOS

REGISTRO DE

8 BITS

CLK

DISPOSITIVO DE

SALIDA

SEL

Page 74: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

55

Puerto 02

D7 D6 D5 D4 D3 D2 D1 D0 CLK OE

Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0

CON2

R9-R16

D7-D0

VCC

Fig. 3.15 Puerto de salida del μP

Page 75: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

56

Tabla 3.2. Conjunto de instrucciones incluyendo MOV.

Código de operación

Instrucción Operando D7 D 6 D5 D4 D3 D2 D1 D0

ADD SUB IN OUT MOV

Puerto 1 Puerto 2

0 0 1 1 0

0 1 0 1 1

1 1 1 1 0

X X X X X

X X X X X

X X X X X

X X 0 1 X

X X 1 0 X

Con el conjunto de instrucciones disponible es posible escribir un programa

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

; Programa 1 in 1 ; (A) ←( Estados de S7-S0); El contenido de A es sustituido por el

estado de los interruptores. mov ; (B) ←(A) El dato en B es reemplazado por el de A. in 1 ; (A) ←( Estados de S7-S0) add ; (A) ←(A + B)

; Se ejecuta la suma y el resultado se coloca en A. out 2 ;(LEDs) ←(A)

; Se presenta el resultado de la suma. El primer operando N1 es obtenido desde los interruptores y transferido al re-

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

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

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

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

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

Page 76: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

57

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

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

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

000 001 010 011 100 101 110 111

0 1 2 3 4 5 6 7

0000 0 NUL DEL SP 0 @ P

D3 -D0

D6-D4

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

K → 7510 010010112 (4B16) ETB → 2310 000101112 (1716) (End of Transmission Block)

Page 77: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

58

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

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

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

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

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

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

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

La memoria del sistema

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

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

Aun cuando los μPs comerciales típicos contienen un banco de registros internos

el 8085A por ejemplo posee los registros de ocho bits: A, B, C, D, E, H y L; estos no

Page 78: Microprocesadores-Luis Urdaneta

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.

Registro BRegistro A

Unidad Lógica y

Aritmética

Periférico 1

(A) (B)

(A+B)

Periférico 2

IN OUT

(A)

Memoria

Fig. 3.16. La memoria contiene el programa.

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

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

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

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

Cada celda tiene asignada una dirección específica, de modo que para lograr ac-

ceso a una determinada posición se requiere especificar la dirección correspondiente. La

Page 79: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

60

figura 3.17 muestra el símbolo lógico de un dispositivo de memoria de lectura/escritura y en la figura 3.18 se observan los componentes internos del circuito integrado.

MEMORIA

Líneas de Direcciones

n

Líneas de 2 Control

Líneas de E/S

de Datos m

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

Fig. 3. 18 Arquitectura interna de una memoria.

Page 80: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

61

Las líneas de acceso típicas de un circuito de almacenamiento de lectura / escritu-ra, son:

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

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

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

n log (N) 102= +

=

Líneas de direcciones.

Por ejemplo, un circuito de 8 Kbytes debe tener:

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

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

( )1 2n log 10 log 2 10 82 222−= + = +

⎛ ⎞⎜ ⎟⎝ ⎠

= 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: WR/ (Re-ad/Write), cuyo nivel lógico especifica si se realiza una operación de lectura/escritura (1: Lectura, 0: Escritura), y CS (Chip Select) que permite la selección del circuito. Un nivel lógico alto en esta entrada, coloca en estado de alta impedancia las líneas de E/S de da-tos.

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

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

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

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

Page 81: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

62

1. Aplicar la dirección a las entradas A0 – An-1 . 2. Seleccionar la memoria colocando un nivel lógico bajo en la entrada CS . 3. Presentar un nivel lógico TTLalto en la línea W/R . 4. Transcurrido el tiempo de acceso, la memoria coloca el byte en las salidas de datos

D0 -D7.

A0-An-1

CS

WR/

D0-D7 Datos válidos

Dirección válida

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

Una de las características que distinguen a un circuito de almacenamiento es la capacidad de la memoria: Esta es:

N = 2n x m, donde: N = Capacidad total en bits. 2n = Número de posiciones. m = Ancho de la palabra o números de líneas de datos. Así, la expresión 256 x 8 = 28 x 8 = 2048 bits, especifica un chip de 256 posicio-

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

A0 – A7 Líneas de direcciones

IO0 - IO7 E/S de datos Seleccionar Chip CE Habilitar Salida OE Habilitar Escritura WE

MODO WE

CE

OE E/S

Lectura VIH VIL VIL O7 -O0

Escritura VIL VIL x I7 -I0

Inhibir VIH x Z VIH

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

Page 82: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

63

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

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

Dirección Binario Nemónico 0 10100001 in 01 1 01000000 mov 2 10100001 in 01 3 00100000 add 4 11100010 out 02 5 xxxxxxxxx

511 xxxxxxxxx Fig. 3.21. El programa 1 se carga en la memoria de la máquina. Los bits del código de instrucción aun no

definidos se suponen cero lógico. El programa de suma del ejemplo 3.1 se carga en la memoria del sistema, mos-

trándose en la figura 3.21 una imagen de la forma en que la secuencia de instrucciones en formato binario ocupa la memoria.

Ejecución de las instrucciones

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

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

En la fase de búsqueda, el μP obtiene la instrucción desde la memoria, sin impor-tar por los momentos como lo hace. La CPU debe entonces interpretar el código de la instrucción para determinar la función a realizar. Esto implica que para almacenar el código a descifrar, es necesario dotar a la CPU de un nuevo registro interno de 8 bits o Registro de Instrucciones (IR)

Page 83: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

64

add

sub in

out mov

InstrucciónDecodificador

de Instrucción

Registro de Instrucción

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

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

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

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

Aunque existe una estrecha vinculación entre el conocimiento que tenga el pro-

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

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

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

Page 84: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

65

Interruptores Lógicos

Indicadores lógicos

in

Acumulador

out

Fig. 3.23. Las salidas del decodificador de instrucciones permiten la ejecución de la instrucción. En la práctica, la lógica de control y demás componentes de un μP real es un

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

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

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

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

Page 85: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

66

Instrucción Decodificador de

Instrucción Memoria

Registro de Dirección de Memoria

Registro de

Instrucción

add sub

in out

mov

Líneas de direcciones

Líneas de datos

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

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

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

Reset

Líneas de direcciones

Líneas de datoss

Contador de Programa Pulsos

Instrucción Decodificador de

Instrucció Memoria

Registro de

Instrucción

add sub

in out

mov

Registro de Dirección de Memoria

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-

Page 86: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

67

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

Fig. 3.26. El contador de programa usa secuenciamiento implícito para actualizar su contenido Los registros A y B de nuestra máquina son de 8 bits al igual que el registro de

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

Al PC no solo se aplican pulsos de reloj, sino que dispone de una entrada adicio-

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

Page 87: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

68

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

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

Fig. 3.27 Cada ciclo del reloj se denomina estado.

Toda secuencia de microinstrucciones es sincronizada por el reloj maestro del

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

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

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

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

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

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

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

Page 88: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

69

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

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

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

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

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

MOV, se ejecuta la transferencia respectiva a, o entre registros. T4: En el caso de una instrucción aritmética ADD o SUB, durante el estado

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

TR

T1

T2

T4

T3 IN OUT MOV

ADD SUB

reset

instruc-ción

reset

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

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

Para facilitar la comprensión del mecanismo que la CPU utiliza para el procesa-

miento del conjunto de instrucciones es usual utilizar el término ciclo de máquina como

Page 89: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

70

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

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

ción de dos nuevas redes lógica en el μP, estas son: • Un Contador de Estados de 2 bits (4 estados). • Un Decodificador de Estados.

Fig. 3.29 Contador de estados y decodificador de estados

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

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

Observe que las señales S0 y S1 están disponibles como terminales de salida del

μP, pudiendo ser usadas desde el exterior para registrar el progreso de la ejecución de una determinada instrucción.

Page 90: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

71

Periférico 1 Periférico 2

Registro B Registro A

Unidad Lógica y

Aritmética

(A) (B)

(A+B)

IN OUT

Contador de Programa Pulsos

Instrucción Registro y Decodificador de Instrucción

Memoria

Registro de Dirección de Memoria

Decodificador de Estados

Reloj S1 S0

Contador de Estados

Señales Internas de Control

Reset S1 S0

Fig. 3.30. Una red lógica de decodificación y control de la transición de estados sincronizada por un reloj

de frecuencia del orden de MHz garantiza un μP con gran velocidad de operación.

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

La operación eficiente de un sistema basado en μP depende en forma crítica de la capacidad de la CPU para controlar los circuitos asociados al μC. El uso de RD y WR para anunciar al sistema la realización de un ciclo de lectura o escritura, determina que el espacio de direcciones disponible es común para la memoria y para los puertos de E/S

Page 91: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

72

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

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

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

Tabla. 3.4 El programa 1 tiene 16

estados.

INSTRUCCIÓN ESTADOS IN 01 3 MOV 3 IN 01 3 ADD 4 OUT 02 3 N° total de estados 16

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

De acuerdo con la tabla 3.4, la velocidad máxima con la cual el μP puede ejecu-

tar una instrucción es de 1.5 μs, en el caso de las instrucciones de transferencia de datos. Las instrucciones aritméticas requieren 2 μs para su ejecución. De este modo que si en

Page 92: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

73

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

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

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

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

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

Comunicación con periféricos lentos. A menos que sea forzado a permanecer en estado de RESET por acción externa,

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

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

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

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

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

Page 93: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

74

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

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

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

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

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

En todo microprocesador existe esta señal de control, en los fabricados por IN-

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

Page 94: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

75

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

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

Conjunto extendido de instrucciones

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

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

MOV A,B (A) ← (B) MOV B,A (B) ← (A)

Ahora, tanto A como B pueden ser origen o destino de los datos. La instrucción

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

Page 95: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

76

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

tificar a los registros.

REGISTRO CÓDIGO A 00 B 01

En la figura 3.33 se identifican las zonas del código de instrucción para los nue-

vos tipos de instrucciones para transferencia de datos entre registros, cuyo símbolo gené-rico es MOV r1,r2.

010 ? DD SS MOV B,A (B)←(A) 010?010 0 Código de operación 010 Operando destino 01 Operando fuente 00

MOV A,B (A)←(B) 010?0001 Código de operación 010 Operando destino 00 Operando fuente 01

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

El nuevo grupo de instrucciones con MOV completamente especificada, se

muestra en la tabla 3.6.

Tabla. 3.6. Conjunto de instrucciones con MOV mejorada.

Código de la instrucción Instrucción Operando D7 D 6 D5 D4 D3 D2 D1 D0

ADD SUB IN

OUT MOV MOV

Puerto 1 Puerto 2 B,A A,B

0 0 1 1 0 0

0 1 0 1 1 1

1 1 1 1 0 0

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 1 0

0 0 0 1 0 0

0 0 1 0 0 1

La escritura de programas eficientes está relacionada con los recursos que ofrece

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

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

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

Page 96: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

77

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

MVI dato (A)←(dato) 110???00 Código de operación 110 Operando destino 00 Dato PC+1

Fig. 3.36. El operando dato de MVI dato se carga en la siguiente posición de memoria La nueva instrucción de carga inmediato se usa en el siguiente programa para

realizar la suma N1 + N2 + 43.

Dirección Contenido de la memoria Binario Nemónico

Comentario

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

Page 97: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

78

el registro acumulador. Desafortunadamente la inteligencia del decodificador de instruc-ciones, como la de la mayoría de las personas y máquinas, tiene un límite.

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

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

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

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

JMP dirección PC ← (dirección)

DIRECCIÓN NEMÓNICO 0 in 01 1 mov b,a 2 in 01 3 add 4 mov b,a

5,6 mvi a,43 7 add 8 out 02

9,10,11 jmp 0000 Fig. 3.38. La instrucción de transferencia JMP permite al programa operar en un lazo.

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

Un lector inquieto habrá entendido que JMP 0000 ha creado un lazo infinito, esto

significa que la máquina ejecuta el programa continuamente esperando por la introduc-ción de operandos desde el teclado, sumando e indicando el resultado hasta que, como una posibilidad, se le desconecte la alimentación. Aun aplicando al μP un pulso de RE-SET, el lazo se mantiene. Este modo de operación es resultado del hecho que la unidad

Page 98: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

79

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

DIRECCIÓN CONTENIDO DE LA MEMORIA

Binario Nemónico COMENTARIOS

0 1 0 1 0 0 0 0 1 in 01 ; (A)←(Int.) 1 0 1 0 0 0 1 0 0 mov b,a ; (B)←(A) 2 1 0 1 0 0 0 0 1 in 01 ; (A)←(Int.) 3 0 0 1 0 0 0 0 0 add ; (A)←(A+B) 4 0 1 0 0 0 1 0 0 mov b,a ; (B)←(A) 5 1 1 0 0 0 0 0 0 mvi 43 ; (A)←(43) 6 0 0 1 0 1 0 1 1 7 0 0 1 0 0 0 0 0 add ; (A)←(A+B) 8 1 1 1 0 0 0 1 0 out 02 ; (LEDs)←(A) 9 1 0 0 0 0 0 0 0 jmp 0000 ; (PC) ←(0000) A 0 0 0 0 0 0 0 0 B 0 0 0 0 0 0 0 0

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

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

Búsqueda Ejecución

reset

reset

HLT

HALT

Fig. 3.40. Modos de operación del microprocesador

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

Page 99: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

80

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

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

El conjunto de instrucciones del μP con los nuevos miembros MVI dato, JMP di-

rección y HLT es el de la tabla 3.7.

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

Instrucción Operando hex D7 D 6 D5 D4 D3 D2 D1 D0

ADD SUB IN OUT MOV MOV MVI JMP HLT

Puerto 1 Puerto 2 B,A A,B dato dirección

2060A1E2 4441C08000

0 0 1 1 0 0 1 1 0

0 1 0 1 1 1 1 0 0

1 1 1 1 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 1 0 0 0 0 0

0 0 1 0 0 1 0 0 0

Instrucciones no soportadas

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

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

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

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

Page 100: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

81

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

Registro BRegistro A

Unidad Lógica y

AritméticaRegistro de banderas

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

Los estados que se asignan a las banderas están relacionados, como se dijo, con

el resultado de una operación aritmética o lógica, de modo que dependen del contenido del acumulador después de la ejecución ADD o SUB, en este caso.

Tabla 3.8 Condiciones del registro de banderas.

BANDERA ESTADO Se produce si: Acarreo CY = 1 Hay desborde desde el bit 7 del acumulador Acarreo auxiliar AC = 1 Ocurre desborde desde el bit 3 de A Signo S = 1

S = 0 A7 = 1 A7 = 0

Cero Z = 1 Z = 0

(A) = 00000000 (A) ≠ 00000000

Paridad P = 1 P = 0

El número de bits en 1 en A es par. La suma de los bits en 1 en A es impar.

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

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

Page 101: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

82

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

1 0 1 1 1 1 1 1 A

+ 0 1 0 0 0 0 1 0 B

1 0 0 0 0 0 0 0 1

Recuerde que con un patrón de ocho unos y ceros, el mayor número de-

cimal que puede expresarse es (28 - 1) = 25510, mientras que el resultado correcto de la

suma es 25710: 1000000012 = 1x28 + 0x27 + 0x26 + 0x25 + 0x24+ 0x23 + 0x22 + 0x21 + 1x20 = 25710. Al ocurrir un desborde del bit 7 del A, la ALU lo indica con CY =1. Las instrucciones típicas de salto condicional y cuya ejecución depende de la bandera de acarreo son,

JC dirección Salto a dirección si CY =1 JNC dirección Salto a dirección si CY =0 Además de realizar operaciones aritméticas la ALU debe estar en capacidad de

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

DIRECCIÓN (hex)

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

Fig. 3.43. Programa que usa instrucciones de salto condicional

El programa de la figura 3.43, muestra en forma sencilla el uso de JC. El resulta-do de la suma solo se presenta si no ocurre acarreo. Si CY = 1, el programa volverá al inicio, a pedir el operando 1. Una suma de números binarios de 16 bits puede realizarse usando a CY para que el acarreo resultante de la suma de dos bytes, se incluya en la adi-

Page 102: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

83

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

Diagrama final del microprocesador sintetizado.

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

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

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

Page 103: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

84

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

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

Las señales de entrada y salida al microprocesador.

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

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

De acuerdo con la función que cumplen y con el tipo de información que condu-

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

Conexión explicita Unidireccional Bidireccional

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

El Bus de Datos (D0-D7) es bidireccional pero no puede transmitir en ambos sen-tidos simultáneamente. Es el canal que permite el flujo de información desde el μP hacia la memoria y los puertos de E/S, y desde estos hacia el μP. El ancho del bus de datos lo define generalmente (el 8088 es una excepción) el formato de las instrucciones y datos que usa la máquina. Es común distinguir la arquitectura de la máquina señalando el ancho de este bus, de modo que un μC de 8 bits contiene un μP con bus de datos con igual número de bits.

Page 104: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

85

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

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

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

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

VCC

VSS

+ 5 V Tierra

CLK Entrada de reloj al microprocesador RESET Entrada que pone en cero el contador de programa. A0-A15 Bus de direcciones del microprocesador. D0-D7 Bus de datos de la CPU RD

Indica que el μP desea leer la localización de memoria o dispositivo de E/S seleccionado. Además avisa que el bus de datos está disponible para realizar la transferencia.

Señala una salida válida de datos en el bus de datos. Indica que la información presente en el bus de datos ha de ser escrita en la posición de memoria o dispo-sitivo de E/S seleccionado.

WR

IO/M Distingue si la operación de lectura o escritura se realiza sobre la memoria o puerto de E/S.

READY

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. Si presenta nivel bajo, el procesador esperará un número entero de ciclos de reloj para que READY vaya a nivel alto y completar el ciclo de lectura o escri-tura de E/S.

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

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

Page 105: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

86

Las 34 señales del μP se distribuyen en el encapsulado en forma arbitraria como se muestra a la izquierda de la figura 3.46, los 6 terminales restantes del CI se consideran no conectados. A la derecha se ofrece un diagrama de la CPU donde se agrupan las lí-neas en los tres buses típicos de un μP.

BUS DE DATOS

BUS DE DIRECCIONES

BUS DE CONTROL

μP

μP

Fig. 3.46 Configuración de terminales y buses del microprocesador. Las 16 líneas de direcciones, las 8 de datos, las 2 de alimentación, y el reloj del

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

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

de control para cumplir con todas las funciones relacionadas con para la operación de un microcomputador. Esto significa que alguna señales de importancia están ausentes en el μP desarrollado, debido a que en beneficio de la sencillez se han omitido ciertas entradas y salidas. Para control de acceso directo a memoria y aceptación de interrupciones un μP típico destina por lo menos 4 entradas. En general los μPs disponen de señales que cum-plen funciones similares en formas diferentes. El Z80 por ejemplo usa 4 señales: RD , WR , IOREQ , y MREQ para las funciones que el μP de la figura 3.46 realiza con solo 3:

MIO/ , RD , y WR . Se puede concluir que el μP desarrollado en forma descriptiva dispo-ne de la mayoría de las entradas y salidas que se encuentran en un μP comercial, excep-tuando el control de interrupciones y DMA, tópicos a discutir más adelante.

3.2.2 EL SISTEMA MICROCOMPUTADOR

Considerando el modo de operación de un microcomputador práctico, son múlti-ples las omisiones o simplificaciones que se han realizado a lo largo de esta sección in-

Page 106: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

87

tentando exponer de modo sencillo el funcionamiento de las unidades internas del μP y los dispositivos asociados.

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

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

Las direcciones de memoria

Sí el dispositivo de memoria SRWM de ½ Kbytes de la figura 3.20 se acopla di-

rectamente al μP, conectando las líneas de direcciones de la memoria a los terminales de dirección correspondientes del μP, no sería posible la expansión futura de la memoria del sistema. Un μP de 8 bits con 16 líneas de direcciones puede tener acceso hasta un máximo de 65536 celdas, de modo que el uso de una memoria con 9 entradas de direc-ciones acoplada directamente al sistema representa el desperdicio del 99.68 % de la ca-pacidad de memoria del procesador.

A primera vista pudiese parecer que la solución estaría en usar circuitos integra-

dos con mayor capacidad de almacenamiento, pero antes conviene considerar que a pe-sar que el procesador ve un espacio único para toda la memoria del sistema, lo usual es que aun en aplicaciones simples sea necesario el uso de más de un chip para organizar el subsistema de memoria. También es común que los puertos de E/S del sistema sean tra-tados como posiciones de memoria con la finalidad de aprovechar la potencialidad del relativo gran número de instrucciones del μP que hacen referencia ala memoria.

Un microcomputador requiere un área de memoria capaz de retener los datos aun luego de retirarle la energía, este espacio contiene el programa almacenado y es conoci-do como la memoria de solo lectura (ROM). Es común que el espacio de ROM se gene-re usando un solo circuito integrado. En contraposición, para organizar la zona de me-moria de lectura/escritura (RWM) usada para almacenamiento temporal de datos y resul-tados, puede ser necesario un arreglo de paralelo o serie de dos o más dispositivos. Esto, debido a que los circuitos disponibles no son de la capacidad que exige las especifica-ciones del sistema en desarrollo, o bien porque la longitud de la palabra del CI es menor a 8 bits.

Un CI de memoria de 8 Kbytes tienen 8192 celdas con direcciones físicas comu-

nes desde 0000H hasta 1FFFH. En una aplicación que requiera esta capacidad para la ROM y para la RAM, se encuentra que las líneas A0-A12 del bus de direcciones del μP estarán conectadas a las entradas correspondientes de ambos chips. Si no se provee al sistema de algún medio para acoplar eléctricamente al bus de datos solo un dispositivo a la vez, un intento de leer un dato en la localización 01FFH, o en cualquier otra, tendrá resultados imprevisibles debido existen dos celdas con la misma dirección. La solución práctica para que la CPU distinga y tenga acceso a solamente la dirección seleccionada consiste en usar un decodificador de direcciones de memoria. Tal circuito digital sec-

Page 107: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

88

ciona el espacio de 64 Kbytes en bloques de rango especificado y asigna cada una de las particiones a la ROM y a la RWM del sistema de acuerdo con lo establecido en la fase de diseño del sistema. Una representación gráfica de las zonas asignadas a cada dispositivo o grupo de éstos se conoce como el mapa de memoria del sistema, mostrándose en a figura 3.47 el correspondiente a un sistema que tiene 8 K de ROM y 4 K de RWM.

DIRECCIÓN DATOS

0000 0010000000000000

.

.

.

. 8 K ROM .

. 1FFF 1010111110110111

2000 0010000000000000

.

.

.

. 16 K libre

4 K RWM

36 K libre

.

. 5FFF 0101111111111111

6000 111111111110000

. .

.

.

. 6FFF 0101111111111111

7000 0101111111111111

.

.

.

.

.

. FFFF 111111111111111

Fig. 3.47 Localización del área de memoria ROM y RWM en el espacio de direcciones del μP En la máquina hipotética no tenemos memoria ROM, sólo disponemos de una memoria de 512 bytes con una pila interna para retener los datos del programa, sin im-portar como éste es cargado en la memoria. A continuación se diseña el de decodificador de memoria del sistema.

El objetivo es generar una señal de selección del chip de memoria llamada MEM y activa en nivel bajo, cuando en el bus de direcciones esté un valor dentro del rango de direcciones de la memoria y cuando se realice una operación de búsqueda. Como solo existe un dispositivo de memoria de 512 bytes el diseño de un decodificador es directo. En el rango de direcciones del dispositivo (0000H-01FFH) las líneas A9 hasta A15 están siempre en estado bajo, como se puede observar en la zona más oscura de la tabla de la tabla 3.10, y además durante la realización de una operación sobre la memoria la señal de control MIO/ será cero lógico.

Page 108: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

89

Esta combinación solo se presenta cuando el μP desea acceso a la RWM, por lo cual puede usarse para generar la señal de selección de memoria MEM , la cual se aplica a la entrada de habilitación CS del circuito integrado. La señal MEM responde a la la ecuación lógica,

MIO/AAAAAAAMEM 9101112131415 +++++++= Tabla. 3.10 Estados de las líneas de direcciones del μP en el espacio de 64 K.

Dirección A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A00000H 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0001H 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

01FEH 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 01FFH 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0200H 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0201H 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1

FFFEH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 FFFFH 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Se deduce por inspección que si cualquiera de las líneas de direcciones que inter-

vienen en la ecuación está en nivel alto, la dirección en el bus no corresponde a una po-sición de la memoria del sistema permaneciendo MEM en estado alto, deshabilitando la memoria. Así mismo cuando MIO/ esté en uno lógico, lo cual ocurre cuando el μP rea-liza una operación de lectura/escritura sobre un puerto de E/S, el estado lógico de MEM será uno. El circuito del decodificador de direcciones de memoria se muestra en la figura 3.48.

Fig. 3.48 decodificador de direcciones de la memoria RWM de 512 Bytes

Page 109: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

90

Las direcciones de los puertos El circuito decodificador de puertos debe generar dos señales: la primera 1PEO

para habilitar los buffers que conectan los interruptores de entrada al bus de datos del µP como ilustra la figura 3.10; la segunda PS02 para cargar en el registro paralelo de la fi-gura 3.15 el resultado de la suma.

El circuito decodificador de direcciones de puertos tiene como tarea la identifica-

ción y seleccionar el circuito de puerto con el cual el μP intenta establecer comunicación cuando ejecuta las instrucciones IN puerto 1 y OUT puerto 2. Como indica la tabla 3.2 los dos bits menos significativos del código de instrucción representan la dirección del puerto. Durante una transferencia de datos hacia o desde un puerto la señal de control

MIO/ permanece en estado lógico alto, si la instrucción en ejecución es IN puerto 1 se activa RD , mientras que si es OUT puerto 2 WR va a cero. En ambos casos el número del puerto aparece en los bits A1 y A0 del bus de direcciones.

En la tabla 3.11 se resumen los estados de las señales que intervienen en un ciclo

de transferencia de datos al puerto de entrada 01 y al puerto de salida 02.

Tabla. 3.11 Estados de las señales de control del μP durante una operación de E/S.

Operación MIO/ RD WR A1 A0

Entrada 1 0 1 0 1 Salida 1 1 0 1 0

Como en el sistema solo existen dos periféricos se pueden generar dos señales de selección de puertos: 1PEO para el puerto de entrada 01 y PS02 para el puerto de salida 02. De la tabla 3.11 se deduce por simple inspección el circuito digital para obtener am-bas señales.

Fig. 3.49 Circuito de selección de los puertos de E/S El procedimiento usado para identificar los puertos se conoce como método de selección lineal y limita a cuatro (2 de entrada y 2 de salida) el número de puertos posi-bles de habilitar. Para extender a 8 puertos la capacidad de la estructura de E/S del μC se usa un CI 74LS139, el cual contiene dos decodificadores binarios 2 a 4.

Page 110: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

91

Tabla. 3.12 Tabla de estados del 74LS139

G B A Y3 Y2 Y1 Y0

1 x x 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1

La tabla 3.12 indica que con la entrada G está en estado bajo la salida yk estará en nivel bajo si el número entero representado por la entrada B A es igual a k. La figura 3.50 muestra el diagrama eléctrico del decodificador de 4 puertos de salida y 4 de entra-da. Observe que las señales intermedias a las salidas de las puertas NAND ( IOR y OWI ) pueden usarse para la habilitación de puertos en una aplicación que incluya un periférico de entrada y uno de salida.

Finalmente, la figura 3.51 ilustra el diagrama del circuito final del μC. Los puer-tos de E/S del sistema final son decodificados usando el método de selección lineal

Fig. 3.50 Decodificador de 4 puertos de entrada y 4 de salida 3.3 ARQUITECTURA DE UN μP DE 8 BITS MÁS VERSÁTIL

El microprocesador hipotético puede considerarse una aproximación aceptable de un μP debido a que contiene las unidades funcionales características de un μP típico de 8 bits. No obstante es conveniente aclarar que al ser usado como recurso didáctico para introducir al estudiante en forma amigable y rápida en el mundo de los microprocesado-res fue necesario simplificar el análisis e incluso omitir ciertos aspectos operativos fun-damentales para el funcionamiento de dispositivos reales. El autor considera que esta altura del texto el lector conoce los principios básicos sobre la arquitectura y funciona-miento del microprocesador y la forma de combinarlos con otros dispositivos LSI para ensamblar un microcomputador primitivo. El propósito de este capítulo, que se supone cumplido, fue introducir en forma resumida la mayor cantidad de tópicos relacionados

Page 111: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

92

Fig. 3.51 Microcomputador de 8 bits con 512 bytes de memoria RWM y 1 puerto de entrada y 1 de salida.

Page 112: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

93

con el área sin tener que esperar el avance por capítulos para la introducción de nue-vos conceptos.

En estas páginas iniciales se exponen principios elementales como el funcio-

namiento de la ALU y la forma en que establece comunicación con los registros inter-nos, hasta conceptos algo más elaborados como la introducción de estados de espera. A partir de aquí se reforzaran en forma sistemática y detallada los conceptos aprendi-dos y se capacita al estudiante para el análisis y diseño de μCs ensamblados usando circuitos integrados y dispositivos electrónicos comerciales.

El microprocesador hipotético presenta ciertas limitaciones ausentes en μP

comerciales. En primer lugar tiene solo dos registros internos: el acumulador usado para contener un operando y el resultado en cualquier operación realizada por la ALU y el registro B donde se almacena el segundo operando. Un μP real contiene uno o más acumuladores y un banco de registros para propósito general usados para alma-cenamiento temporal de datos y como operandos en la ejecución de instrucciones que usen la ALU. Un número reducido de registros internos de uso general representa un serio obstáculo para la escritura de programas eficientes debido a que estos registros permiten a la ALU funcionar a gran velocidad ya que toda transferencia de datos tie-ne lugar en el interior del μP, sin requerirse hacer referencia a la memoria externa. Los microprocesadores modernos con arquitectura RISC tienen al menos 32 registros internos. En segundo termino, solo se especificaron algunas señales para control de la máquina como RESET y READY , y RD , WR , MIO/ , S0 y S1 para control de los disposi-tivos del sistema.

Fig. 3.52 Arquitectura de un microprocesador típico de 8 bits

Page 113: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

94

En la figura 3.52 se presenta un diagrama funcional de un microprocesador de 8 bits con arquitectura similar a un μP comercial típico. Observe que exceptuando el banco de registros y los registros buffers usados para conectar las líneas de datos y direcciones al exterior del μP, todos los demás elementos están contenidos en la CPU de la figura 3.52. De modo que el lector puede considerarlo como una simple exten-sión de la CPU sintetizada en el capítulo anterior.

Aunque cada fabricante produce μPs con arquitectura ligeramente distintas, al

ser los principios de funcionamiento iguales para todo μP (de 8 bits), basta con fami-liarizarse con el modo de operación de uno, para entender con facilidad el funciona-miento de cualquier microprocesador.

El μP de la figura 3.52 tiene un acumulador y un banco de registros de 8 bits

para propósito general, denominados: B, C, D, E, F, y G. El registro de 16 bits Apuntador de Pila (SP), mantiene la dirección tope de un área especial de memoria administrada por programa, llamada el Stack (pila), la cual se describe posteriormen-te.

El grupo de registros lo completa el Contador de Programa (PC), el Regis-

tro de Direcciones de Memoria (MAR), ambos de 16 bit, y un circuito lógico para Incremento/Decremento de Direcciones, el cual permite el enlace automático de las instrucciones del programa. Cada vez que se busca el contenido de una posición de memoria, el contenido del PC y del MAR se incrementa en 1, apuntando a la si-guiente posición de memoria. El MAR se conecta al exterior por medio de un regis-tro buffer de 16 bits, el cual es el origen del Bus de Direcciones (A0 - A15). El Regis-tro/Buffer de Datos está conectado al Bus Interno de Datos del μP, y sus salidas son el Bus Externo de Datos (D0 - D7).

La Unidad Lógico Aritmética se observa a la derecha del esquema. Las en-

tradas a la ALU son el registro A y uno de los registros de uso general. Esto permite la existencia de la instrucción ADD E, por ejemplo, la cual suma el contenido de los registros A y E, y deposita el resultado de la operación en el acumulador. La conexión de un registro determinado a la entrada de la ALU lo realiza un multiplexor omitido en el diagrama. La ALU también controla el Registro de Condiciones o Banderas (flags), el cual contiene las banderas Z, S, AC, P, y CY.

Analizar un microprocesador genérico es difícil. En párrafos anteriores se es-

tablece que procesador está compuesto de tres bloques fundamentales: un banco de registros, la ALU, y la unidad de control. La sección de temporización y control lógi-co es una unidad realizada por hardware, cuya función es sincronizar y controlar todas las operaciones que se realizan dentro de la CPU. La unidad de control usa el reloj del sistema para sincronizar la búsqueda y ejecución de las instrucciones, gene-rando señales de control que gobiernan toda acción realizada por el μP. La sección de control tiene como entradas:

Page 114: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

95

• El reloj del sistema,

• Líneas externas de control para alterar o interrumpir la secuencia del pro-grama, tales como RESET, READY , y otras aun no mencionadas, y

• Las salidas de la sección formada por el Decodificador de Instrucciones y el

Codificador de Ciclos de Máquina (llamado decodificador de estados en la figura 3.44), que portan información sobre la instrucción bajo procesamien-to, la cual es usada por la unidad de control para generar las señales exter-nas para manejo de memoria y dispositivos de E/S, y señales internas para el control de la ALU y la transferencia entre registros de la CPU, estando toda operación sincronizada por el reloj maestro del sistema.

En general, es algo complejo separar los distintos elementos de la CPU en los

tres bloques básicos debido a la estrecha relación que existe entre ellos, no obstante puede considerarse que el diagrama de la figura 3.52 reproduce en forma adecuada, desde el punto de vista funcional, la estructura interna de un μP, y lo que es más im-portante desde el punto de vista didáctico, no introduce contradicción alguna con los resultados del proceso de síntesis de la máquina hipotética.

El bus interno de datos

Un elemento de vital importancia para distinguir la arquitectura de un μP es el núme-ro de buses internos usados para la transferencia de datos entre los registros y la ALU.

Fig. 3.53 Arquitectura de bus doble El diagrama de la figura 3.53 corresponde a una sección del μP PACE fabri-

cado por National Semiconductor. Este μP usa una estructura de bus doble. Uno de-nominado bus de operandos conectado a las dos entradas de la ALU, el otro o bus de resultados conecta la salida de la ALU con los registros internos donde se deposita el resultado de la operación lógica o aritmética. Una arquitectura de este tipo mejora el desempeño del μP porque aumenta la velocidad de ejecución debido a que los ope-randos y el resultado de la operación se transfieren por vías diferentes. Si el bus de

Page 115: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

96

operandos en la figura 3.53 se separa en dos buses de modo que a cada entrada de la ALU se conecte un bus de datos independiente, se obtiene un μP con arquitectura de bus triple. El esquema de tal sistema puede verse en la figura 3.54.

Fig. 3.54 Arquitectura de bus triple.

EL μP de la figura 3.52 usa un bus único conectado a las dos entradas de la

ALU. Al existir una sola vía para la transferencia de datos entre los registros y la ALU, tanto los operandos como el resultado circulan por el bus interno aunque en tiempos diferentes. Este modo de operación se destaca por su lentitud, mientras que el principal beneficio que ofrece el uso de un bus simple es la poca complejidad de la arquitectura del μP y la reducida área que ocupa las ramificaciones del bus interno en la oblea de silicio, lo cual representa un verdadero ahorro de superficie de integra-ción.

La baja velocidad de ejecución se debe a que para ejecutar la suma la ALU de-

be realizar tres transferencias en secuencia por el único bus disponible, dos desde los registros que contienen los operandos hasta cada entrada de la ALU, y una para tras-ladar el resultado al acumulador. Se supone que las empresas fabricantes de μPs eva-luaron el compromiso entre la velocidad y el ahorro de superficie de integración y optaron por esta última, porque la mayoría de los μPs usan un solo bus interno. Aun-que esta arquitectura es sencilla y ocupa poco espacio en el área de silicio del CI, presenta problemas de sincronización que afectan la operación de la ALU.

Para ilustrar esta situación considere que la ALU es un circuito combinatorio

de modo que responde de inmediato a cualquier cambio en sus entradas. Suponga que se carga un valor en el acumulador, el cual está conectado a la entrada izquierda de la ALU, y se ejecuta la instrucción SUB b. La unidad de control selecciona el registro B y lo conecta por medio del bus interno a la entrada derecha de la ALU. Al ejecutar la sustracción el resultado A-B debe cargarse en el acumulador. Cuando el resultado de la operación aritmética se transfiere por medio del bus de datos hacia el A, el cual debe estar habilitado, se originan dos problemas serios de sincronización en el interior del μP. Primero, el resultado no solo se almacena en el A, sino que a través del bus

Page 116: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

97

interno alcanza la entrada derecha de la ALU y pasado el retardo de propagación de los circuitos que forman la ALU la salida de ésta entrega un resultado distinto a la a la resta (A) - (B).

Entradas falsas A

ALU

Fig. 3.55 Ilustración del problema de sincronización. Las entradas a la ALU son falsas.

En segundo lugar, para hacer más crítico el problema, observe que aun cuando el A aísla una entrada a la ALU del bus de datos, el hecho que la instrucción de resta use al acumulador para almacenar el resultado, implica que en el instante que la suma se deposite en el A, la entrada izquierda de la ALU tendrá un operando no deseado, por lo cual contribuirá a la obtención de un nuevo y falso resultado.

Fig. 3.56 La CPU ejecuta dos transferencias simultáneas por distintas rutas. La solución de ambos problemas se muestra en la figura 3.56 y consiste en

usar dos registros para almacenamiento temporal: uno denominado TEMP separa la entrada derecha de la ALU del bus interno de datos, el otro es un acumulador tempo-ral para aislar la entrada izquierda de la ALU del acumulador. Ambos registros TEMP y ATEMP son de uso exclusivo del sistema y son transparentes para el programador.

Ahora, con un valor precargado en el acumulador se ejecuta la instrucción

SUB B: la existencia de los registros adicionales permite que el μP realice dos trans-ferencias de datos simultáneas, una implica mover el contenido del registro B por el bus de interno de datos hacia el registro temporal de la entrada derecha de la ALU. El

Page 117: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

98

otro, transferir el dato en A al acumulador temporal, y de hecho a la entrada izquierda de la ALU. Observe que en este flujo paralelo de datos no existe conflicto, dado que usan diferentes caminos, como se aprecia en la figura 3.57.

Fig.3.57. Para completar la ejecución de SUB B, la salida de la ALU se lleva al acumulador.

3.4 ARQUITECTURA DE UN µCOMPUTADOR ESTÁNDAR

Con los diferentes conceptos introducidos es posible establecer el diagrama funcional de un μC estándar, recordando que desde el punto de vista didáctico el ob-jetivo es resolver problemas típicos del ambiente industrial usando la potencia del μP, más que diseñar equipos de procesamiento de datos. En la figura 3.58 se presenta el diagrama funcional simplificado de un computador basado en un μP.

El μP dispone de los buses de direcciones, datos, y control, y todo circuito

LSI necesario para una aplicación determinada se conecta a estos tres buses. La única diferencia entre este esquema y el logrado a partir de la síntesis del μC, es que la memoria del sistema aparece separada en dos bloques: uno corresponde a la Memoria de Lectura/Escritura del sistema, o RWM (Read Write Memory), cuyo contenido puede ser alterado por el usuario de la máquina. En un μC de propósito general el programa es cargado en esta unidad por medio del teclado, o unidades de discos. También contiene la información sobre los datos y los resultados de la ejecución del programa. Este circuito es volátil, lo cual significa que retirarle la energía a la má-quina, implica la pérdida de la información almacenada en el circuito de memoria.

La ROM (Read Only Memory) es la memoria de sólo lectura del sistema, ni el

usuario ni las instrucciones del computador pueden cambiar su contenido, estas me-morias se programan durante el proceso de producción. y no es volátil. En μCs para procesamiento general contiene rutinas para el arranque de la máquina, tales como rutinas de prueba de memoria, de la fuente de alimentación, y de control de las unida-des de E/S del sistema. En computadores personales compatibles con el modelo IBM, una variante de la ROM denominada, almacena el BIOS (Basic Input Output Sys-tem)de la máquina. A diferencia de las ROM, las EPROM pueden ser programadas, borradas y reprogramadas, usando equipos de muy bajo costo. En sistemas pequeños

Page 118: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

99

de propósito específico, caso en el que se diseña un μC para realizar una tarea especí-fica, el programa de control escrito por el diseñador se almacena en una EPROM (Erasable Programmable ROM) Si se requiere fabricar un gran números unidades, se puede encargar un grupo de ROMs a compañías especializadas, las cuales las pro-graman en durante el proceso de producción.

La presencia de la RWM en este tipo de μC no es obligada, si la aplicación no

requiere el almacenamiento temporal de datos, puede estar ausente. Esto implica que el programador no puede hacer uso de la técnica de subrutinas en el desarrollo del programa ni usar interrupciones. En cualquier caso, los requerimientos de memoria en la solución de problemas de poca envergadura, es baja, y los circuitos de memoria no son costosos. Posteriormente se analizaran con más detalle los diferentes tipos de memoria y su modo conexión al sistema.

Conocido el funcionamiento de una CPU genérica y, por lo menos concep-

tualmente, el de la memoria del sistema, y el modo en que los buses del μP interco-nectan las diferentes unidades, se considera conveniente presentar la arquitectura de un μP real, el 8085A, de modo que el estudiante se traslade al mundo real de los mi-croprocesadores.

Page 119: Microprocesadores-Luis Urdaneta

Introducción al Microprocesador

100

Fig. 3.58. Arquitectura de un sistema estándar basado en microprocesador.

Page 120: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 101

AArrqquuiitteeccttuurraa yy OOppeerraacciióónn ddeell μμPP

4.1 GENERALIDADES El 8085A de INTEL es un microprocesador de 8 bits para uso general cons-

truido usando tecnología NMOS. El dispositivo incorpora un generador de reloj in-terno y es capaz de tener acceso hasta 64 Kbytes de memoria y 256/256 puertos de E/S. Con este dispositivo puede realizarse un sistema microcomputador mínimo usando solo 3 circuitos integrados, alimentados con una fuente de poder de +5 V.

La figura 4.1a es una imagen del área de integración de los 20000 transistores

MOS de canal N que componen el circuito del μP. El CI se presenta en un encapsu-lado tipo DIP-40, mostrado en la figura 4.1b, el cual era el estándar industrial para la fabricación de circuitos integrados VLSI, durante la década de los 70. El 8085A tiene un ciclo de instrucción de 1.3 μs, estando disponibles en versiones más rápidas con códigos 8085A-2, 8085AH, 8085AH-1 y 8085AH-2.

(a) (b) Fig. 4.1 (a) Foto microscópica del μP8085A. (b) Encapsulado DIP-40

Page 121: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 102

El μP puede ejecutar un conjunto de 74 instrucciones sincronizado por un re-loj derivado de un oscilador interno, el cual usa un cristal externo de resonancia para-lela y frecuencia máxima de 6.25 MHz. Esta señal base es dividida por 2 en el inter-ior del dispositivo para producir el reloj interno que controla todas las operaciones del 8085A. Una versión avanzada, el 8085A-2 puede operar a 5 MHz con un cristal de 10 Mhz.

X1X2

RESET OUTSOD

SID TRAP

RST 7.5RST 6.5RST 5.5

INTRINTAAD0AD1AD2AD3AD4AD5AD6AD7Vss

VccHOLDHLDACLK OUTRESET INREADYIO/MS1RDWRALES0A15A14A13A12A11A10A9A8

8085A

Fig. 4.2. Disposición de los terminales del microprocesador 8085A

De los 40 terminales, 12 son entradas, 18 salidas, 8 son bidireccionales, y 2 están destinadas a la alimentación del circuito, como ilustra la figura 4.2. La fuente de poder de +5 V, se aplica los terminales VCC (+) y VSS (-). El cristal de cuarzo se aplica a la entradas X1-X2. El diagrama de la derecha en la figura 4.2 indica el senti-do del flujo de información en los terminales del 8085.

Como ilustra la figura 4.2, el 8085 no presenta buses de datos y direcciones

separados. En este μP, mientras que el byte de orden alto de la dirección se presenta en las líneas A8-A15, los 8 bits menos significativos de la dirección aparecen en los mismos terminales (AD0-AD7) que el bus de datos. Las funciones de estos ocho pines se presentan multiplexadas en el tiempo, encargándose la señal ALE (Address Latch Enable) de indicar a dispositivos externos cuando la información presente correspon-de a datos o direcciones.

La razón de la aparente complicación que representa el multiplexado de seña-

les está relacionada con el estado de la tecnología de fabricación de circuitos LSI en la década de los 70. En esa época, como en la actualidad, durante el proceso de pro-ducción los chips eran probados usando equipos especiales y costosos para garantizar el correcto funcionamiento del producto final. En los inicios de los setenta, tales ins-trumentos sólo podían verificar el funcionamiento de circuitos integrados en receptá-culos de hasta 42 terminales. Esto no significa que treinta años atrás no se fabricaran CI de más de 40 pines, se hacían de 64 pines, pero su prueba representaba un proceso engorroso para el fabricante.

Page 122: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 103

Aunque los µPs fabricados hasta ese momento residían en paquetes tipo DIP-

40, las innovaciones con las cuales INTEL acompañó el desarrollo de su nuevo pro-ducto exigía un número mayor de entradas y salidas para cumplir con las especifica-ciones del diseño. Si se considera que el 8085A requería 2 líneas para el cristal ex-terno, 2 para la fuente de poder, 16 para el bus de direcciones, y 8 para el bus datos, solo restan 12 terminales para el bus de control. Una docena de líneas de control no permitía la integración de todas las funciones establecidas para el dispositivo, razón por la cual INTEL recurre al multiplexado de las líneas de datos y direcciones del µP.

El μP 8085 fue diseñado para disminuir el número de componentes necesarios

para la construcción de un sistema microcomputador típico. Antes de la aparición en el mercado de este µP, la construcción de una CPU completa (8080, por ejemplo) requería el uso de al menos tres chips LSI: el μP propiamente dicho (8080), el gene-rador de reloj (8224), y el controlador del sistema (8228), este último se encargaba de separar el bus de control y el de datos, los cuales estaban multiplexados en este pro-cesador. En el 8085A se integran las funciones de los circuitos 8224 y 8228, de mo-do que basta con conectar un cristal a las entradas X1-X2, para disponer de una CPU autónoma. A la par, se mantuvo la compatibilidad de programación con el 8080 y de hardware con los componentes periféricos más utilizados en el desarrollo de aplica-ciones de µPs.

Por supuesto un lector perspicaz pudiese alegar: Al estar multiplexado los da-

tos con las direcciones. ¿No se requiere incluir un latch, externo al μP, para separar estas funciones, necesitándose por lo menos dos circuitos, uno LSI y otro MSI, para la CPU? La respuesta es, si... es cierto. Pero, una de las bondades del 8085, radica en los dispositivos LSI introducidos como periféricos para garantizar la integración del sistema, estos son: el 8155/56 y el 8355/8755. Los nuevos componentes combinaban funciones de memoria, puertos de E/S y temporizadores, a la vez que se conectaban directamente a los buses multiplexados del µP. Como resultado de esta estrategia, INTEL disminuyó desde quince (con el 8080) a tres (con el 8085) la cantidad de com-ponentes necesarios para un µC mínimo.

El uso de cápsulas de 40 pines con estructura de buses multiplexados se man-

tuvo en los μPs de 16 bits 8086 (AD8-AD15) y 8088 (AD0-AD7). El 80186 y el 80188, también de 16 bits, usan 68 terminales, los μPs de 32 bits 386DX y 486DX disponen de 132 y 168 pines respectivamente, mientras que el Pentium básico, con arquitectura interna de 64 bits y diseño superescalar, ocupa una pastilla de 273 termi-nales.

Aunque este procesador es un producto INTEL originalmente introducido en

el año 1977, es fabricado actualmente por varias empresas. Como segundas fuentes de del 8085 se encuentran: Siemens, NEC, AMD, OKI, Hitachi, y Toshiba.

Page 123: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 104

4.2 ESTRUCTURA FUNCIONAL DEL 8085A Para entender como funciona un µP es necesario conocer los tipos de registros

internos del dispositivo y el modo en el cual se realiza la transferencia de datos entre éstos. El conjunto de los registros y el repertorio de instrucciones son atributos de la arquitectura de la máquina, y constituyen el modelo de programación por excelencia. El conocimiento de la función de cada uno y una técnica apropiada de utilización permiten la programación del µP. Con el propósito de introducir la arquitectura del 8085 y la manera en la cual se organizan las unidades funcionales en un microproce-sador real, se reproduce en la figura 4.3 un diagrama de bloques del µP, tal como es suministrado por INTEL en la hoja técnica del dispositivo.

Fig.4.3. Diagrama funcional del 8085ª

En el 8085 están integradas todas las funciones de una unidad de procesa-miento central capaz de ejecutar el conjunto de instrucciones del µP, además de un grupo de funciones adicionales, tales como: la generación del reloj, la selección y asignación de la prioridad de las interrupciones y el control del canal de comunica-ción serie.

El circuito integrado µP 8085 contiene un número considerable de compo-

nentes digitales interconectados para formar unidades funcionales. Éstas pueden estar

AD0 - AD7

Bus Interno de Datos (8)

Registro de Instrucciones (8)

Decodificador de Instrucciones

y Codificador de

Ciclo de Máquina

Lógica de Control y Tiempo

B (8) C (8)

D (8) E (8)

Apuntador de PilaContador de Programa (16)

± Registro de Dir.

Buffer Dir Buffer Dir/Dat

Acumulador

ALU

Flags

H (8) L (8)

A0 - A15

Bus de Direcciones/Datos

Bus de Control

Bus De Direcciones

Reg. Temp.

GND

X

SID SOD INTR INTA RST 5.5

1

X2

Gen. Reloj

CLK OUT READY RD WR ALE S0 S1 IO/ M HOLD

HLDA RESET IN

RESET OUT

CONTROL ESTADO DMA RESET

Control de Interrupciones

RST 6.5 TRAP

+5V

RST7.5

Canal Serie

Page 124: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 105

constituidas por algunos elementos digitales o por arreglos complejos de puertas lógicas, registros y biestables. En el diagrama de la figura 4.3 solo se muestran las los bloques que ejecutan las funciones básicas del dispositivo, tales son:

• El conjunto del Registro de Instrucciones, el Decodificador de Instruccio-

nes y la lógica de Control y Tiempo, la cual conforman la Unidad de Con-trol del microprocesador.

• El Banco de Registros de propósito general (B,C,D,E,H,L) de 8 bits. El

Apuntador de Pila (SP), el Contador de Programa (PC), y el registro de di-recciones de memoria (MAR), de 16 bits.

• La Unidad Aritmética y Lógica (ALU), el Acumulador (A), el Registro

Temporal y las Banderas de Estado. • El control de selección y asignación de prioridad de las interrupciones. • El Control del Canal de Comunicación Serie. • Los buffers de datos y datos/direcciones.

4.2.1 La unidad de control Toda operación realizada por el 8085 durante la ejecución del programa de

instrucciones almacenado en memoria, ocurren como respuestas a señales de control generadas por esta sección del microprocesador. El µP incorpora un generador inter-no de reloj, el cual usa un cristal conectado a las entradas X1-X2 para fijar la fre-cuencia de oscilación. La lógica de control utiliza esta base de tiempo maestra o reloj del sistema para generar comandos de sincronismo para toda operación interna y ex-terna realizada por el dispositivo. En esta sección también se libera una salida CLK OUT, a la misma frecuencia del reloj interno, la cual puede ser usada como reloj de componentes externos.

Como se observa en la figura 4.3, las entradas de la lógica de control y tiem-

po son los terminales del cristal de cuarzo, las salidas de la sección de decodificación de instrucciones y codificación de ciclo de máquina, y señales externas generadas por dispositivos externos a la CPU.

Las entradas externas a la lógica de control son tres: RESET IN , READY y

HOLD., éstas permiten a circuitos periféricos modificar el modo normal de funcio-namiento del µP.

Page 125: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 106

En el caso de RESET IN , si por un tiempo de al menos tres ciclos de reloj se aplica un nivel lógico bajo a este terminal, la lógica de control inicializa el µP car-gando cero en el contador de programa, en el registro de instrucciones y en varios bits internos de control. La entrada al estado de reset es anunciada al exterior por la acti-vación de la salida RESET OUT.

El terminal de entrada READY tiene como función permitir el intercambio de

información entre dispositivos periféricos lentos y el microprocesador. Si esta señal es activada a cero durante una operación de acceso a memoria o puerto de E/S, signi-fica que un dispositivo externo notifica que no está listo para transferir datos, de ma-nera que solicita al µP que proceda a entrar en un estado de espera hasta cuando pue-da transmitir o recibir la información. El 8085 saldrá del estado de espera cuando READY retorne al nivel lógico alto.

La entrada restante de control (HOLD) es utilizada por componentes externos

para indicar al 8085 que requieren hacer uso exclusivo de los buses del sistema para realizar una operación de acceso directo a la memoria. La activación de HOLD (nivel lógico alto) implica una solicitud al CPU para que libere las líneas de datos y direc-ciones una vez que culmine el ciclo de máquina en desarrollo. Este modo de opera-ción es usado por circuitos controladores LSI para realizar transferencias de datos a memoria sin intervención del µP.

La función HOLD es necesaria porque ninguna instrucción del µP permite el

intercambio directo de datos entre dispositivos externos, de modo que toda transfe-rencia de información desde un periférico a memoria debe usar al 8085 como recep-tor intermedio. Este modo de operación es demasiado lento para transmitir cantidades masivas de datos desde un disco o tarjeta de video.

La lógica de control genera una salida HLDA para informar al dispositivo ex-

terno que acepta la solicitud de HOLD, y que procede a llevar a tercer estado el bus de direcciones, el bus de datos/direcciones y algunas salidas de control. Una vez cul-minada la transferencia, el periférico desactivada la señal HOLD y el 8085 recupera el control de los buses.

El 8085 es un dispositivo microprogramado, lo cual significa que en su inter-

ior reside un µprograma encargado de trasladar la instrucción depositada en el IR a una secuencia de microinstrucciones necesarias para realizar las funciones ordenadas por el programa. El µprograma está almacenado en una memoria de solo lectura y no es accesible al usuario

La figura 4.4 muestra al registro de instrucciones conectado al decodificador

de instrucciones, el cual identifica la instrucción en ejecución y selecciona el µpro-grama correspondiente. El decodificador de instrucciones transfiere a la lógica de control y tiempo el resultado de la interpretación de la instrucción.

Page 126: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 107

Registro de Instrucciones

Decodificador de Instrucciones y Codificador de

Ciclo de Máquina

Lógica de Control y Tiempo

Bus Interno de Datos

Buffer de Dir/Datos

E/S externas

Señales Internas de Control

Bus Dir/Datos

Fig.4.4. Sección de decodificación y control del μP

Sincronizada por el reloj interno, la lógica de control y tiempo tiene la res-ponsabilidad de ejecutar la secuencia de microinstrucciones que controla la búsqueda, decodificación y ejecución de las líneas de código almacenadas en la memoria. Según la naturaleza de la instrucción, la lógica de control emitirá señales internas destinadas a sincronizar la transferencia de datos entre registros, o entre éstos y la ALU. Además, se encarga de generar señales externas dirigidas al control de la memoria, puertos de E/S y otros periféricos del sistema. La sincronización de la transferencia de datos por las líneas de interconexión y la interpretación del estado de las entradas a la CPU, son también responsabilidad de a lógica de control.

Las salidas externas del bloque de control son S1, S0, IO/M, RD, RW, ALE,

CLK OUT, RESET OUT y HLDA. Para entender las funciones de las seis primeras de éstas, considere una operación de búsqueda en memoria. Durante el arranque del sis-tema, una red de RESET automático pone a cero el contador de programa. Cuando el µP sale del estado de RESET, la lógica de control genera las señales de estado IO/M=0, S1=1, S0=1, anunciando que se dispone a realizar una operación de búsque-da del código de operación de la instrucción almacenada en la posición 0000H.

Page 127: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 108

El siguiente paso es transferir desde el contador de programa al buffer de da-tos/direcciones los 8 bits de menor peso de las direcciones (A0-A7), mientras que el byte de orden alto del PC (A8-A15) se carga en el buffer de direcciones. Simultánea-mente la UC emite una señal de control ALE para indicar a lógica externa que el con-tenido del bus multiplexado corresponde a direcciones.

Una vez que la dirección se estabiliza en el bus, la lógica de control envía a la

memoria un comando RD de lectura indicando que el código de operación debe ser trasladado desde la memoria hasta el buffer de datos a través del bus externo de datos, y de allí al registro de instrucciones para su posterior decodificación. Si la operación fuese de escritura en memoria se hubiese generado un comando de escritura WR. A continuación se incrementa en uno el PC para apuntar a la posición de la memoria donde se almacena el siguiente byte de la instrucción o la próxima instrucción a eje-cutar.

Si la instrucción en progreso contiene más de un byte, la UC ordenará uno o dos accesos adicionales a la memoria hasta tanto toda la información relacionada con la instrucción sea transferida al interior del µP. En este momento se inicia la ejecu-ción propiamente dicha. De acuerdo con el tipo de instrucción, la UC generará todas las señales internas y externas necesarias para la transferencia entre registros, uso de la ALU, o acceso a memoria o puertos de E/S.

4.2.2 Los registros internos

La figura 4.3 indica que el 8085 tiene un grupo de registros de 8 y 16 bits, a

los cuales se tiene acceso por medio del bus interno de datos. Siete de estos registros son direccionables y están a la disposición de programador. El acumulador (A) es un registro especial de 8 bits asociado a la ALU, debido a que es usado por casi todas las instrucciones aritméticas y lógicas. Los seis registros restantes (B,C,D,E,H,L), tam-bién de 8 bits, son de propósito general y están disponibles para almacenamiento de datos durante la ejecución del programa.

Para permitir la realización de algunas operaciones con operandos de 16 bits,

los registros de propósito general pueden ser usados como tres registros pares de 16 bits: BC, DE, y HL. El 8085 posee instrucciones que hacen referencia a registros pa-res. Por ejemplo: LXI D, dato, cargará el dato de 16 bits especificado por el operan-do de la instrucción en el registro par DE.

El uso adecuado de los registros internos resulta en la escritura de programas

eficientes y de rápida ejecución. Al existir 7 registros de 8 bits accesibles por el pro-gramador, son necesarios sólo tres bits para identificarlos, de modo que las instruc-ciones de transferencia entre registros y las aritméticas (exceptuando las de suma y resta inmediata) son de un byte, al igual que en la máquina hipotética. Una instruc-ción corta es procesada con rapidez debido a que el µP debe realizar un acceso único a memoria en busca de la instrucción, y toda operación adicional es realizada dentro de la propia CPU.

Page 128: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 109

Una particularidad del arreglo de registros programables es que cuando se tra-tan como registros pares, pueden almacenar la dirección de una posición de memoria a la cual se puede transferir, o desde la cual se pueden obtener datos.

W Z B C D E H L

PC

SP

MAR

A8-A15 AD0-AD7

Buffer Direcciones

Buffer datos/ Direcciones

Bus interno de Datos

Fig. 4.5. Registros que pueden alterar el contenido de registro de direcciones de memoria.

La figura 4.5 indica que existen cuatro fuentes posibles para cargar una direc-ción específica en el registro de direcciones de memoria (MAR), el cual es de 16 bits. Estas son: el PC, los registros de propósito general, el apuntador de pila SP y dos registros W y Z de 8 bits no accesibles por el programador. EL generador por exce-lencia de direcciones del μP es el contador de programa, el cual es un registro de 16 bits que mantiene la dirección de la próxima instrucción a ejecutar, o la dirección de búsqueda del 2do o 3er byte de una instrucción multibyte en proceso. Al final de la ejecución de una instrucción, o al concluir una búsqueda en memoria, el PC es in-crementando automáticamente en 1 para apuntar a la siguiente posición de memoria.

Cuando el arreglo de registros de propósito general actúa como fuente de una

dirección, ésta debe ser cargada en el registro par por el programa. Instrucciones sub-siguientes que hacen referencia a memoria utilizan esta información, por ejemplo: LDAX D, transfiere al acumulador el contenido de la posición de memoria cuya di-rección especifica el contenido del registro par DE.

El contenido del SP, otro registro de 16 bits, representa la dirección del tope

de un bloque de memoria con estructura LIFO manejado por programa, y en la cual se pueden almacenar datos en forma temporal, recuperándolos oportunamente. La utilidad de la zona de la pila es obvia si se considera que debido al número reducido de registros del microprocesador la capacidad de almacenamiento interno de la CPU puede agotarse rápidamente. Durante la ejecución de un programa determinado los registros ocupados pueden ser liberados y los datos antiguos preservados usando la pila como área de almacenamiento.

La dirección de la base de la pila se fija en el inicio del programa. Cuando se

ejecuta una instrucción que haga referencia a la pila, el SP es incrementado, o decre-

Page 129: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 110

mentado, por la unidad de control. El SP también permite, como se explicará más adelante, el manejo de subrutinas como técnica de programación.

En la figura 4.5 se observan dos registros de 8 bits, W y Z, de uso exclusivo

por la unidad de control del μP para el almacenamiento intermedio de datos o direc-ciones durante la ejecución de una instrucción. Como ejemplo, durante la ejecución de una instrucción de tres bytes, tal como JMP dirección, el μP busca en memoria el primer byte correspondiente al código de operación de la instrucción, lo traslada al IR, y lo interpreta; se incrementa el PC y se busca el segundo byte de la instrucción y se deposita en Z, se vuelve a incrementar el PC en la búsqueda del tercer byte, el cual se almacena en W. Concluida la fase de búsqueda, el registro par WZ contiene la dirección de salto. Durante la ejecución de la instrucción, el contenido de WZ se transfiere al registro de direcciones de memoria, y el contenido del PC es sustituido por WZ+1, para apuntar a la próxima posición de memoria.

4.2.3 La unidad aritmética y lógica

La ALU ejecuta operaciones aritméticas o lógicas con números binarios de 8 bits. Si la función se realiza sobre dos operandos (puede ser sobre un operando), uno estará almacenado en el acumulador y el otro en un registro de propósito general. El resultado de cualquier operación siempre se deposita en el acumulador, destruyendo el contenido anterior del registro. La ALU puede realizar las siguientes operaciones aritméticas y lógicas: Suma y resta binaria, AND, OR, OR Exclusivo, y NOT, y rota-ción del acumulador hacia la derecha o izquierda. La figura 4.6 presenta a la unidad aritmética lógica del 8085 y sus registros de soporte.

A Reg.Temp.

Banderas

ALU

Fig. 4.6. La unidad aritmética lógica.

Se observa en la figura 4.6 el Registro de Estados o Banderas, de 5 bits, donde

la ALU deposita información vinculada con el resultado de una operación aritmética o lógica. Las condiciones pueden ser probadas por programa.

S Z AC P CY

Fig. 4.7 Registro de condiciones de estado del 8085A

Page 130: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 111

• La bandera de Acarreo (CY) es activada (1 lógico) cuando el resultado de una operación

aritmética produce un desborde del bit 7 del acumulador, en otras palabras CY =1 cuando el resultado no puede ser expresado por 8 bits, como se expuso en párrafos anteriores. Si no ocurre desborde, CY = 0.

• La condición de Acarreo Auxiliar (AC) indica con un nivel alto el desborde desde el bit 3 del acumulador. Es útil cuando se realizan operaciones BCD.

• El bit de Signo (S) se activa si el bit más significativo del resultado almacenado en A, es 1. Es puesta por instrucciones que usan el bit 7 del acumulador como bit de signo. En estos casos se permiten números entre -128 a + 127.

• La bandera de Cero (Z) es 1, si el resultado de operaciones lógicas o aritméticas es cero. Si

el resultado es distinto de cero, entonces Z = 0. • El bit de Paridad (P) va a 1 si número de bits en 1 del registro acumulador, es par. Si es

impar, P = 0. 4.2.4 El bus interno de datos

El 8085A es un µP con estructura de bus único, lo cual significa que toda transfe-rencia de información en el interior del dispositivo se realiza a través del bus interno de datos de 8 bits. Las líneas internas de interconexión están separadas de los buses externos por medio de dos buffers de almacenamiento de 8 bits, cuyas salidas son de tres estados. Estos se denominan: buffer de direcciones y buffer de datos/direcciones.

Durante una operación de acceso a memoria o puerto de E/S, el µP debe usar

el bus de direcciones para distinguir el dispositivo con el cual desea comunicarse. Para cargar el bus externo con una dirección, el µP transfiere el byte alto del registro de direcciones de memoria al buffer de direcciones y el orden bajo del mismo registro se carga en el buffer de datos/direcciones, el cual debe estar habilitado en modo de salida. Debido a que el bus interno es de 8 bits, el µP debe realizar dos transferencias internas para emitir los 16 bits de la dirección.

La dirección permanece estable sobre el bus por un tiempo equivalente a un

ciclo de reloj, permitiendo que alguna lógica externa retenga el estado de las ocho líneas de menor peso de la dirección. Al final del ciclo de reloj, la unidad de control lleva a tercer estado las salidas del buffer de datos/direcciones. Dependiendo del tipo de operación a realizar con el dispositivo externo, las salidas del buffer permanecerán flotantes para que el dato en el bus externo sea transferido al interior del µP durante una operación de lectura, o abandonarán el tercer estado para que la CPU transmita el dato hacia el exterior durante una operación de escritura.

Page 131: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 112

Finalmente, en la figura 4.8 se muestran el control de interrupciones y el canal de comunicación series, ambos conectados al bus interno de datos del 8085. Estos tópicos serán discutidos con detalle en capítulos próximos.

Fig. 4.8. Funciones auxiliares integradas en el 8085

En la próximas dos páginas se presenta una relación completa de la definición funcional de los terminales del microprocesador 8085A. Muchas de estas señales son conocidas, otras adquirirán sentido a medida que el estudiante progrese en la lectura de este trabajo.

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8085

VCCVSS

+ 5 V Tierra

X1 -X2 Terminales de entrada para un cristal de cuarzo o una red LC o RC para activar el reloj interno del microprocesador

CLK OUT Salida de la señal de reloj del μP para usar como reloj del sistema. La frecuencia de CLK es la mitad de la de la señal en X1 X2.

Entrada que inicializa el contador de programa y los flip flops de habilitación de 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.

A8-A15

Bus de direcciones. Los 8 bits más significativos de las direcciones de memoria o de dispositivos de E/S. Permanecen en tercer estado durante el proceso de RESET o en los modos HOLD y HALT.

AD0-AD7

Bus de datos/direcciones multiplexado. Los 8 bits menos significativos de las 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.

ALE

Es una salida que indica si el contenido del bus AD0-AD7 corresponde a direccio-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.

RESET IN

Page 132: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 113

S0,S1-IO/M

Son salidas que indican si el ciclo de máquina1 en progreso corresponde a: Bús-queda del código de operación, escritura en memoria o en puerto de E/S, lectura en memoria o en puerto de E/S, reconocimiento de interrupción o estado HALT.

RD

Señal de lectura. Un nivel bajo en RD indica que el μP desea leer la memoria o dispositivo de E/S seleccionado, y que el bus de datos está listo para la transferen-cia de información. Permanece en tercer estado durante el proceso de RESET o en los modos HOLD y HALT.

WR

Señal de escritura. Un nivel lógico bajo en este terminal indica que el contenido del bus de datos va a ser escrito en la memoria o dispositivo de E/S seleccionado, y que el bus de datos está listo para la transferencia de información. Permanece en tercer estado durante el proceso de RESET o en los modos HOLD y HALT.

READY

Si tiene nivel lógico alto durante un ciclo de lectura o escritura, indica que la memoria o dispositivo de E/S está listo para recibir o transferir datos. Si presenta nivel bajo, el procesador esperará un número entero de ciclos de reloj para que READY vaya a nivel alto y completar el ciclo de lectura o escritura. Se utiliza cuando el sistema se comunica con periféricos lentos cuyos tiempos de acceso sean superiores al periodo del dispositivo microprocesador.

HOLD

Entrada que indica que otro procesador o controlador solicita el uso de los buses de direcciones y datos. el CPU abandona el uso de estos buses una vez finalizado el ciclo de máquina en progreso, poniendo en estado de alta impedancia las si-guientes líneas: A8-A15, AD0-AD7, RD , WR , e M/IO .

HLDA

Reconocimiento de HOLD. Salida que indica que el μP ha recibido una petición de HOLD y que los buses entrarán en tercer estado. HLDA vuelve a nivel bajo una vez que la solicitud de HOLD es removida.

INTA

Reconocimiento de interrupción. Después que una solicitud de interrupción ha sido aceptada, esta salida se usa, en lugar de RD, para activar el circuito que gene-ra la interrupción.

TRAP Entrada de interrupción no enmascarable. Es la interrupción de más alta prioridad.

SID Entrada de datos en serie. Los datos en la entrada SID son cargados en el bit 7 del acumulador se ejecuta una instrucción RIM.

SOD Salida de datos en serie. Usando la instrucción SIM, el estado del bit 7 del acu-mulador es cargado en esta salida.

Tabla. 4.1. Tipos de ciclos de máquina y señales de estado

IO/M S1 S0 ESTADO 0 0 1 Escritura en memoria 0 1 0 Lectura de memoria 1 0 1 Escritura a puerto de E/S 1 1 0 Lectura de puerto de E/S 0 1 1 Búsqueda de OP 1 1 1 Reconocimiento de interrupción Z 0 0 HALT Z X X HOLD Z X X RESET

1 Ver tabla 4.1.

Page 133: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 114

4.3 CONSIDERACIONES DE TIEMPO PARA EL 8085A En la sección 3.1 se trató al µP imaginario como una máquina de estado. Tal

discusión reveló aspectos de interés sobre el modo como la CPU ejecuta las instruc-ciones y el tiempo invertido en ejecutar cada una. En el manual del usuario del 8085A se encuentra abundante información sobre aspectos relativos a la sincroniza-ción de las señales del 8085 y sobre el número de ciclos de reloj necesarios para pro-cesar cada instrucción. No obstante, el autor estima que una guía sobre el funciona-miento de un µP no puede soslayar este tópico, por ser fundamental para comprender la dinámica del proceso de búsqueda y ejecución de una instrucción.

Fig. 4.9. Circuitos para fijar la frecuencia del reloj.

Características del cristal f = 2fclk

CL ≤ 30 pf, CS ≤ 7 pf, RS ≤ 75 Ω Red LC de resonancia paralela

)(2

1

iCeCLf

+=

π

Con Ce ≥ 2Ci para un Δfmin ≈ 10 % Red RC de resonancia paralela f = 3 Mhz

L Ce Ci

20 pf 10 KΩ Ci

Toda operación realizada por el 8085A durante el procesamiento de una de-terminada instrucción esta sincronizada por el reloj maestro del sistema, el cual puede ser generado en el interior del dispositivo o suministrado por una fuente externa. Para usar la opción de reloj interno, debe aplicarse a las entrada X1-X2 un cristal de cuar-zo, una red RC, o un circuito sintonizado LC. En cualquier caso el valor de la fre-cuencia de oscilación interna debe estar comprendido entre 1 MHz y 3.125 MHZ, a menos que se use la versión 8085A-2, la cual soporta hasta 5 MHz. La figura 4.9 ilustra el modo de conexión para cada una de las posibilidades de uso del generador interno.

Con el uso de un cristal de cuarzo se obtiene precisión y una gran estabilidad

del valor de la frecuencia del reloj. El oscilador LC funciona en forma adecuada para frecuencias hasta 5 MHz. Si se elige está opción, la tolerancia de la frecuencia será de 10 %, la cual puede considerarse apropiada para algunas aplicaciones. En los casos donde el µP no requiera realizar tareas que involucren medidas o control de tiempo puede recurrirse a una red RC oscilando a 3 Mhz. En este último caso, el fabricante no recomienda otro valor de frecuencia.

Page 134: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 101

4.3.1 El ciclo de instrucción

Al igual que el µP del capítulo anterior, cuando se aplica potencia al procesa-dor, éste inicia la ejecución de las instrucciones en la posición 0000H de la memoria, esto se logra porque el sistema está provisto de una red para autoreset de la CPU. El microprocesador buscará la primera instrucción en memoria y la ejecutará, procesan-do todo el programa hasta su finalización. Este modo de operación se mantiene, a menos que el μP sea forzado a entrar, por una instrucción HLT, en un estado de para-da (HALT). Existen otros métodos para modificar el proceso de ejecución normal de un programa, tales como las interrupciones o la petición de operación en modo HOLD.

T1 T2 T3 T4 T1 T2 T3 T1 T2 T3 T1 T2 T3

Ciclo de Instrucción

Ciclo de Máquina

M1 M2 M3 M4

Estado

CLK

Fig. 4.10. Estados y ciclos de máquina del microprocesador.

El tiempo necesario para que el µP busque y ejecute una instrucción represen-

ta un ciclo de instrucción. Para completar la ejecución de una instrucción, el 8085A debe realizar de 1 a 5 operaciones de lectura/escritura a memoria o puerto de E/S. Cada uno de estos accesos a dispositivos externos a la CPU constituyen un ciclo de máquina (Mi), los cuales se realizan internamente por medio de una secuencia de mi-croinstrucciones almacenadas en ROM. Cada paso de esta secuencia comprende un estado (Ti), necesitándose de 3 a 6 estados para completar un ciclo de máquina. Un estado corresponde a un ciclo del reloj del sistema. En la figura 4.10 se muestra un ciclo de instrucción de cuatro ciclos de máquina.

Los ciclos de máquina de posible aparición durante la ejecución de una ins-

trucción son: • Búsqueda del código de operación

• Lectura de memoria

• Escritura de memoria.

• Lectura de puerto de E/S.

• Escritura en puerto de E/S

• Reconocimiento de interrupción.

Page 135: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 102

• Modo de bus inactivo. En el transcurso del primer estado cualquier ciclo de máquina, el microproce-

sador asigna los estados de las señales IO/M, S1, S0, para informar a dispositivos periféricos el tipo de ciclo de máquina que se inicia. La tabla 4.2 muestra el estado de las señales de estado y control para cada tipo de ciclo de máquina.

Tabla. 4.2. Ciclos de máquina del 8085A.

SEÑALES DE ESTADO SEÑALES DE CONTROL IO/M S1 S0 CICLO DE MÁQUINA RD WR INTA

0 1 1 Búsqueda del código de operación 0 1 1 0 0 1 Escritura en memoria 1 0 1 0 1 0 Lectura en memoria 0 1 1 1 0 1 Escritura a puerto de E/S 1 0 1 1 1 0 Lectura de puerto de E/S 0 1 1 1 1 1 Reconocimiento de interrupción 1 1 0 0 1 0 Bus inactivo DAD 1 1 1 1 1 1 RST/TRAP 1 1 1 Z 0 0 HALT Z Z 1

Durante el ciclo de máquina de bus inactivo no se realizan operaciones con

memoria o puerto de E/S. Este tiempo es usado para operaciones internas con los registros y la ALU.

El número de ciclos de máquina necesarios para completar la ejecución nor-

mal de una instrucción depende del total de operaciones de lectura o escritura que se realice a la memoria o dispositivo de E/S y de la complejidad de la instrucción. Algu-nas instrucciones de un byte, como INX rp, requieren un ciclo de máquina único para obtener el OC de memoria y completar su ejecución; mientras que DAD rp, también de un byte, se procesa durante tres ciclos de máquina. En este último caso, los ciclos M2 y M3, ambos del tipo de bus inactivo, son utilizados por el µP para realizar opera-ciones internas necesarias para completar la ejecución de la instrucción.

Considerando las instrucciones multybyte, por ejemplo JMP dirección, ésta

exige tres lecturas de la memoria o ciclos de máquina para obtener el código de ope-ración, la dirección de salto y culminar la ejecución. En cualquier caso, ninguna ins-trucción del 8085A requiere más de cinco ciclos de máquina. La fase de búsqueda del código que identifica a toda instrucción se realiza durante el primer ciclo de máquina M1. En cada ciclo se invierten tres estados, excepto el ciclo de búsqueda del código de operación, el cual utiliza cuatro o seis ciclos de reloj.

Para ilustrar la secuencia de operaciones necesarias para la ejecución de una

instrucción, considere INX H, la cual produce que el contenido del registro par HL se incremente en 1. En la figura 4.11 se observa el estado de los registros del µP antes de ejecutar la instrucción. El contenido de IR (21H) corresponde al código de opera-ción de la última instrucción ejecutada, LXI H,20FFH, usada para cargar en HL, el dato de 16 bits 20FFH.

Page 136: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 103

Fig. 4.11. Registros del CPU antes de ejecutar la instrucción INX H

Observe, en la figura 4.12, que una vez procesada la instrucción aritmética, el

registro par contiene el valor 2100H y el registro IR mantiene el código de opera-ción,23H, de la instrucción INX rp.

Fig. 4.12 Estado interno del CPU después de la ejecución de INX H.

Las figuras mostradas son una copia de la salida del programa MICRO 85, el cual simula en ambiente WINDOWS la operación de un microcomputador basado en el µP8085. Esta es una herramienta de gran valor didáctico y práctico, pero nuestro interés actual se centra en los detalles de la secuencia de operaciones internas que conducen a la ejecución de una instrucción.

Page 137: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 104

4.3.2 Secuencia de transición de estados

El diagrama de la figura 4.13 muestra la sucesión de eventos por los cuales transita el 8085A durante el desarrollo de un ciclo de máquina.

TR

RESET

RESET

RESET

T1

T2 TW

READY

READY

READY THALT

HOLD· INTVAL

HOLD INTVAL

T3 T4

T5T6

THOLD

HOLD

HOLD

HOLD = 1 SI BITHLDA = 1

BITHLDA = 1

BITHLDA = 1

no

HOLD = 1 SI

no

BITHLDA = 1 SI

no

ÚLTIMO CICLO

INT. VÁLIDA

BITHLDA = 0

HALT = 1 SI

no

BITHALT= 0

BITINTA = 1 BITINTE = 0

BITINTA = 1 BITINTE = 0

SI

no

no

SI

CC=6

CC=4

M1

HALT

HALT

Fig. 4.13 Diagrama de transición de estados del µP 8085A

Para distinguir los modos de operación del µP, se analiza el diagrama de la

figura 4.13 considerando sólo aquellos sucesos que modifican la transición normal de la ejecución entre los estados T1 y T6. Debe recordarse que durante un ciclo de má-quina el µP pasa por tres estados, a menos que se trate del ciclo de búsqueda, el cual tiene una duración de cuatro o seis estados.

Page 138: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 105

Cuando el µP sale del estado de reset, después del arranque del sistema, ini-cia en el estado T1 el ciclo de máquina M1 de búsqueda del código de operación. En este análisis se considera que M1 es el único ciclo de máquina y consta de seis esta-dos. En T2 se inspecciona el estado de la entrada READY. Si está en nivel lógico alto, el µP transitará hacia T3 y luego a T4, porque el ciclo en desarrollo es M1. Si por el contrario READY está en nivel bajo, el 8085A entrará en un estado de espera TW, donde se mantendrá hasta cuando READY vuelva a nivel alto, instante en el cual pro-cederá hasta los estados T3 y T4.

En el estado T4 el µP captura el estado de la línea HOLD y pone a 1 un bit in-

terno (BITHLDA), si la entrada HOLD está en 1. Si HOLD es cero el ciclo de máquina se completa con los estados T5 y T6. Observe en el diagrama de la figura 4.13, que si el ciclo M1 consta de 4 estados, la prueba de la línea HOLD se realiza, mientras el reloj CLK =1 durante los estados T2 o TW. Esto también ocurre si el ciclo en desarro-llo no es de búsqueda del código de operación, en cuyo caso finaliza en T3.

Después de T6, o de T4 si M1 es de 4 estados, se examina el bit de estado

HLDA, si está en 1 el 8085 entra en un estado THOLD en el próximo pulso de reloj; si el resultado de la prueba del BITHLDA indica un nivel bajo y el ciclo en progreso es el último o único ciclo de máquina de la instrucción, el µP verifica si hay interrupcio-nes pendientes. Si no las hay, procederá al estado T1 del ciclo M1 de la próxima ins-trucción, o del siguiente ciclo, en caso que la instrucción tenga más de uno. Si exis-ten interrupciones diferidas, se carga uno en el bit de reconocimiento de interrupción BITINTA, y se desactivan las interrupciones poniendo a cero el BITINTE de habilitación de interrupciones. En el siguiente pulso de reloj, se inicia un ciclo de máquina de reconocimiento de interrupción.

Una vez ejecutada la instrucción, cuando el µP sale del estado T6 y no exis-

ten solicitudes de interrupción, el 8085 se traslada estado T1 del ciclo de búsqueda del código de operación de la siguiente instrucción. En T1 prueba un bit interno que, cuando está en uno, indica que última instrucción ejecutada fue HLT. Si este es el caso, el diagrama de la figura 4.13 indica que el µP entrará en un estado de parada (HALT). Durante el modo de operación HALT, el 8085 permanece inactivo y los terminales AD0-AD7, A8-A15, WRy RD ,M/IO se mantienen flotantes.

El 8085A puede abandonar temporalmente THALT cuando la línea HOLD sea

puesta en alto por un dispositivo externo en solicitud de acceso directo a memoria (DMA). El µP se trasladará al estado THOLD, atenderá la petición externa y retornará a THALT cuando HOLD vuelva cero, señalando que finalizó la operación de DMA.

Solo por la ocurrencia de un evento externo, el 8085A podrá salir del estado

THALT e iniciar la ejecución de una nueva instrucción. Si se activa una interrupción válida, el µP deshabilitará el sistema de interrupciones cargando cero en el BITINTE y transitará hacia el estado T1del ciclo M1 de la próxima instrucción. En ausencia de solicitud de interrupción, sólo un comando de RESET permitirá que el µP abandone

Page 139: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 106

THALT. En este caso el sistema será reiniciado en TR y procederá a ejecutar la instruc-ción en la dirección 0000H de la memoria, cuando la orden de RESET sea levantada.

Con el análisis previo, basado en el diagrama de estados de la figura 4.13, se

pretende mostrar los modos de operación del microprocesador 8085A, más que deta-llar los sucesos que ocurren durante cada estado por el cual pasa la CPU. Debe que-dar claro que si la última instrucción ejecutada no fue HLT y si además ningún peri-férico: solicita estados de espera, entrada en el modo de operación HOLD o inte-rrumpe al µP; éste se trasladará en forma libre desde el estado T1 hasta completar la ejecución de la instrucción en el estado T4 o T6, si se trata de una instrucción con un ciclo de máquina.

Si la búsqueda o la ejecución de la instrucción requieren más de una acceso a

la memoria, el primer ciclo M1 constará de cuatro o seis estados y los subsiguientes de sólo tres. Tal situación la describe el diagrama de transición de la figura 4.14.

TR

T1

T2

T3 T4

T5T6

RESET

RESET

RESET

Fig. 4.14 Diagrama de transición de estados del µP 8085A sin considerar los estados THALT, THOLD,

TW, ni solicitudes de interrupción.

Retomando el caso de la instrucción INX H, cuyo ciclo de instrucción está

constituido por un ciclo de máquina de seis estados, a continuación se detallan todas las operaciones, tanto externas como internas, realizadas por el 8085A durante cada estado.

Se supone que la instrucción INX H, de un byte, se ejecuta inmediatamente

después que el µP sale del estado de RESET y que todo ciclo de máquina Mi se inicia en el estado T1.

Page 140: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 107

T1

Externas: Al inicio de T1, el µP identifica el ciclo de máquina en progreso emitiendo las señales, M/IO =0, S0=1 y S1=1. Para indicar a la memoria la direc-ción de la posición donde se encuentra la instrucción, transfiere el conteni-do del contador de programa al buffer de datos/direcciones y al buffer de direcciones. Simultáneamente, el 8085A genera la señal ALE, activa en al-to, para informar a dispositivos externos que el contenido del bus AD0-AD7 corresponde a los 8 bits de orden bajo de la dirección. Internas: Examina el flip flop de estado HALT.

T2

Externas: El µP activa la señal RD de lectura y coloca en tercer estado las salidas del

buffer de datos/direcciones para permitir que el dispositivo de memoria transfiera el código de operación de la instrucción INX H.

Internas El contador de programa es incrementado. El estado de las entrada READY es capturado en el flanco de subida de T2, si es bajo se introduce un estado de espera. La entrada HOLD es examinada y si está en nivel alto se carga uno en el BITHLDA.

T3 Externas: El código de operación de la instrucción es cargado en el registro de ins-trucciones del µP. RD pasa a nivel alto. Internas: El código de operación es pasado al decodificador de instrucciones.

T4 Externas: Ninguna Internas: El código de operación es interpretado. En este punto el µP sabe que en el próximo pulso debe transitar hacia el estado T5 por tratarse de la instruc-ción INX H. Si el ciclo de búsqueda de la instrucción en ejecución tuviese cuatro estados, al salir de T4, iniciaría un nuevo ciclo de máquina en T1. Durante T4 de instrucciones de 4T, se examina el BITHLDA, si es uno los bu-ses pasan a tercer estado, se activa a uno la salida HLDA y el µP entra en un estado THOLD. Durante T4 de instrucciones de 6T, la entrada HOLD es muestreada, y si está en uno el BITHLDA es cargado con uno.

T5-6 Externas: Ninguna Internas: El registro HL es incrementado. Se detecta el estado del BITHLDA, si está en uno el µP se traslada al estado THOLD en el próximo pulso de reloj.

La información de las operaciones externas realizadas en cada estado del ciclo

de máquina M1 durante el procesamiento de la instrucción INX H, se muestra como un diagrama de tiempo en la figura 4.15.

Page 141: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 108

T1 T2 T3 T4 T5 T6 T1

M1 M1

CLK S1,S0

IO / M

Fig. 4.15 Ciclo de instrucción (Ciclo de máquina de búsqueda ) para la instrucción INX H (OC=23H). En la mayoría de las instrucciones del 8085, el ciclo de búsqueda tiene cuatro

estados, de modo que como indica el diagrama de figura 4.14, al final del estado T4 la transición ocurre hacia el estado T1 del ciclo de máquina siguiente. Las instrucciones en las cuales se invierte 6 estados durante el ciclo de búsqueda son: CALL, CALL condicional, DCX, INX, PCHL, PUSH, SPHL, y RET condicional. La función de cada una se describirá oportunamente.

El 8085A requiere seis estados para completar la ejecución de la instrucción

INX rp. Si la frecuencia de la fundamental del cristal de cuarzo externo es 6.25 MHz, cada estado interno tendrá una duración de 2000/6.25 ns o 320 ns. Esto significa que para realizar la operación de incrementar cualquiera de los registros pares, el 8085A invierte un tiempo de 6 estados x 320 ns/estados = 1.92 µs. La hoja técnica del µP señala un ciclo de instrucción de 1.3 µs. En realidad esta información se refiere tiempo que corresponde a la ejecución de las instrucciones de cuatro estados, 4x320 ns = 1.28 µs. Existen instrucciones de 18 estados, en cuya ejecución se invierte un tiempo de 5.76 µs. Una versión más rápida, el 8085A-2 tiene un ciclo de instrucción de 0.8 µs, operando a 5 MHz. También una versión CMOS de OKI semiconductor liberada en 1998 y con código MSM80C85AHRS, opera a esta velocidad. 4.3.3 El estado de espera.

Si un periférico de E/S o un circuito de memoria son lentos comparados con

los tiempos estipulados para que el 8085A realice una operación de lectura o escritu-ra, el dispositivo externo puede optar por solicitar al µP que pase a un estado de espe-ra por un número entero de periodos de reloj, como indica la figura 4.16.

A8-A15

AD0-AD7

ALE

RD

PCH Indeterminado

PCL 23H

SEÑAL

1,1M/IO === 0S 1S 0,

Page 142: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 109

Fig. 4.16 Diagrama de transición de estados del µP 8085A considerando el estado TW.

En el caso de la instrucción INX H, la entrada al estado TW no modifica nin-

guna de las operaciones externas o internas realizadas durante el desarrollo del ciclo de máquina, excepto que a la salida del estado T2 el µP no pasa a T3. En su lugar, al estar la entrada READY activada en nivel bajo, la transición ocurre hacia un estado de espera. Las actividades realizadas por el µP durante el estado TW son las siguientes:

T1;

. . . T2;

. . . TW

Externas: Las líneas de direcciones, datos, y control mantienen los niveles existentes

durante T2.

Internas Se muestrea la entrada READY en el flanco de subida del estado TW, si se mantiene en nivel bajo se introduce otro estado de espera.

T3: . . . T4: . . . T5-6

: . . .

El diagrama de tiempos de la ejecución de la instrucción INX H con estado de

espera es el de la figura 4.17.

TR

T1

4

T5T6

RESET

T2

T3

RESET RESET

T

TWREADY

READY

READY

Page 143: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 110

SEÑAL

READY

PCL 23H

1,1M/IO === 0S 1S 0,

T1 T2 T3 T4 T5 T6 T1

M1 M1

CLK

S1,S0

IO / M

A8-A15

AD0-AD7

ALE

RD

PCH Indeterminado

Fig. 4.17 Ciclo de instrucción (Ciclo de máquina de búsqueda) para INX H (OC=23H) con estado de

espera. El estado de espera puede ser solicitado por dispositivos de memoria con

tiempo de acceso tacc mayor que el tiempo especificado para que el 8085A lea un dato válido, después que la dirección está estabilizada en las líneas de direcciones. En la figura 4.18 se muestra un ciclo de lectura de memoria, especificándose el tiempo tAD (A0-15 valid to valid data in).

Fig. 4.18 Ciclo lectura en memoria.

El tiempo tAD es el lapso del cual dispone un dispositivo externo para cargar un dato válido en el bus de datos, después que el 8085A presenta una dirección válida en las líneas de direcciones.

El fabricante especifica un valor de tAD = 575 ns para un cristal de 6.25 MHz.

Si la memoria tiene un tiempo de acceso mayor que tAD, deberá solicitar al µP que

Page 144: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 111

agregue uno o más estados de espera al ciclo de máquina en progreso. El valor de tAD para cualquier frecuencia del cristal dentro del rango válido está dado por la expre-sión (2.5+N).T-225 ns, donde N es el número de estados de espera. Por cada estado de espera, el tiempo tAD tendrá un incremento efectivo de 320 ns, a la frecuencia es-pecificada.

Aunque el concepto de estado de espera fue originalmente introducido para sincronizar la transferencia de datos entre el µP y memorias o periféricos de veloci-dad baja, es posible utilizarlo para detener el programa cada vez que se ejecute una instrucción o un ciclo de máquina. Estos modos de operación son de gran utilidad en la fase de desarrollo de un programa.

4.3.4 El modo de operación paso a paso Debido a que el microprocesador 8085A debe operar con un reloj interno con una frecuencia de al menos 500 KHz, no es posible ejecutar el programa suministrán-dole pulsos de reloj a una cadencia lo suficientemente lenta como desearía un diseña-dor en la fase de depuración de un programa. No obstante, si utilizando lógica externa se introducen n estados de espera durante el ciclo de búsqueda del código de opera-ción de cada instrucción del programa, este será ejecutado instrucción por instruc-ción.

El circuito mostrado en la figura 4.19 permite llevar a la práctica el modo de operación de ejecución de instrucciones por pasos. El funcionamiento del circuito de paso simple se entiende mejor si se examina el diagrama de tiempos de la figura 4.20. El objetivo es detener la ejecución de un programa cada vez que se ejecuta una instrucción, debiéndose pulsar el interruptor paso de la figura 4.18 para procesar la instrucción siguiente.

Considere el inicio de la ejecución de un programa después de haber reinicia-do el µP. Una vez que el 8085A sale del estado de RESET, procesa la primera ins-trucción del programa hasta el estado T2 del ciclo de máquina M1 de búsqueda del código de operación. Durante T1 el µP identifica el ciclo en progreso emitiendo las señales de estado IO / M, , S y S0 1 . Por tratarse del ciclo de búsqueda, IO / M estará en nivel lógico cero, mientras que S0 y S1 estarán en alto, de modo que la salida de la puerta 74LS11 pasará a nivel alto. En el flanco descendente de la señal ALE, también generada durante el estado T1, se carga uno en U2A y la entrada READY del 8085 conmutará a nivel lógico bajo.

Durante el flanco de subida del ciclo T2, el µP examina la línea READY y en siguiente pulso de reloj entrará en un estado de espera TW. El µP cesará toda activi-dad por la duración de N pulsos de reloj, hasta cuando se reciba un comando PS (CLKU2B) de paso simple.

Page 145: Microprocesadores-Luis Urdaneta

126Arquitectura y Operación del Microprocesador 8085A

Fig. 4.19. Circuito para paso simple.

Page 146: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 127

Fig. 4.20 Ejecución de una instrucción de un ciclo de máquina y cuatro estados usando el modo de

paso simple. En la transición positiva de PS, el biestable U2B forzará un cero en U2A, oca-

sionando que la entrada READY regrese a uno. El µP realizará la transición hacia los estados T3 y T4 de M1 y hacia los estados T1 y T2 de la siguiente instrucción, repitién-dose el proceso descrito hasta la ejecución de la última instrucción del programa en proceso. 4.3.5 Ciclos de lectura y escritura en memoria y puertos de E/S.

Para instrucciones de más de un byte, el 8085A debe realizar al menos un ci-

clo de máquina adicional al de búsqueda para obtener todos los bytes de la instruc-ción y completar la ejecución.

Considere la figura 4.21, donde se presentan los estados y ciclos de máquina

necesarios para ejecutar la instrucción STA dirección. La ejecución de STA direc-ción causa que los ocho bits almacenados en el acumulador sean copiados en la posi-ción de memoria especificada por el operando dirección.

Para procesar esta instrucción, el 8085A deben obtener tres bytes desde la

memoria del sistema: el código de operación y los dos bytes que identifican la direc-ción a la cual se debe realizar la transferencia.

Durante el ciclo de máquina M1, el microprocesador interpreta el código de

operación de la instrucción y detecta que debe realizar otro acceso a la memoria en búsqueda de la dirección a la cual debe transferirse el contenido del registro acumu-lador.

Page 147: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 128

Fig. 4.21 Ciclos de instrucción de STA dirección. Los ciclos de máquina M2 y M3, ambos del tipo de lectura en memoria, son

necesarios para obtener el operando dirección de STA, mientras que durante M4 se escribe a memoria el byte en el acumulador. El µP invierte cuatro ciclos de máquinas y un total de trece estados en procesar STA dirección.

Fig. 4.22 Ciclo de instrucción para OUT 01H (OC=32H). Los ciclos de máquina de lectura o escritura pueden ser de acceso a memoria

o a un puerto de E/S. En el repertorio de instrucciones del 8085A existen sólo dos instrucciones para comunicación con puertos: IN puerto y OUT puerto. La ejecución de la instrucción de dos bytes OUT puerto, carga el contenido del acumulador en el bus de datos, mientras que en las dieciséis líneas de direcciones se duplica el número de ocho bits del operando puerto. Como resultado, la información en el registro A es transferida al dispositivo de salida con la dirección especificada por puerto. En la

Page 148: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 129

figura 4.22 se muestra el diagrama de tiempos de los ciclo de máquina de búsqueda y ejecución de la instrucción OUT 01H. El ciclo de instrucción de OUT puerto lo constituyen tres ciclos de máquina distintos, el primero de búsqueda de OC, seguido de un ciclo de lectura en memoria para obtener la dirección del puerto, y finalmente un ciclo de escritura a memoria para realizar la transferencia hacia el dispositivo ex-terno. Cada ciclo de máquina es identificado por las señales de estado

01 Sy ,S ,M/IO , como puede apreciarse en la figura 4.22. Estas salidas son generadas al inicio de cada ciclo y mantienen sus niveles durante el transcurso del ciclo de má-quina.

Durante el ciclo de búsqueda M1, la dirección en el PC es cargada en las lí-

neas de direcciones y el PC es incrementado para apuntar al siguiente byte de la ins-trucción. El µP activa la línea de lectura RD y el código de operación de OUT puer-to (32H) es transferido desde la memoria hasta interior del µP, donde es decodificado. A la salida de T4 , el 8085A ha interpretado el OC y está enterado que debe regresar a la memoria y extraer el número del puerto. En el estado T1 de M2, la dirección PC+1 es presentada en el bus de direcciones, se activa de nuevo RD y entonces la memoria coloca en el bus de datos el número del puerto (01H), la cual se almacena en el µP. Finalizado el ciclo de máquina M2, toda la información relativa a la instrucción en proceso está en poder del 8085A y solo resta mover el contenido de A hacia el puerto 01H para completar la ejecución.

Para que en el ciclo M3 de escritura a puerto se realice la transferencia del by-

te en el A hacia el exterior del µP, es necesario cargar la dirección de 8 bits del puerto en las líneas de direcciones. Para convertir el número del puerto en una dirección de 16 bits se repite la dirección (0101H) y se carga en el bus, como se observa en la fi-gura 4.22. Al inicio del estado T2 de M3, el µP activa la señal de escritura WR , y carga en el bus externo de datos el contenido de A. Durante T3 se completa la transfe-rencia hacia el periférico identificado por los 8 bits altos o bajos del bus de direccio-nes.

4.4 LA SECUENCIA DE INICIO DEL 8085

Cuando se suministra potencia a una aplicación basada en el 8085A, es de im-portancia vital para el funcionamiento adecuado del sistema, que el soporte físico de la máquina garantice que el µP entre en un estado inicial definido, una vez que la tensión de alimentación alcance su valor mínimo de operación y que la señal de reloj se haya estabilizado. La entrada IN RESET del 8085A se usa con el propósito de llevar a la CPU al estado inicial deseado, después del proceso de arranque; o para restituir las condiciones iniciales, si el µP está bloqueado o funcionando en situación de falla. En ambos casos es necesario aplicar un nivel bajo al terminal, y mantenerlo por un tiempo mayor o igual a la duración de tres ciclos del reloj interno.

Page 149: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 130

Como resultado de la aplicación de una señal válida a IN RESET , el µP en-tra en el estado de RESET (TR) y ejecuta una secuencia interna Durante el proceso de inicio se pone en cero el contador de programa y el registro de instrucciones y se in-habilita el sistema de interrupciones del µP. Todos los bits de control y de estado aso-ciados a las líneas HOLD, READY, HLDA, y SOD, y los bits de ciclos de máquina y estados de máquina, son cargados con cero. La figura 4.23 muestra el diagrama de tiempos de la secuencia de inicio.

T1 T2 TR TR TR TR T1

SEÑAL

CLK

OUT RESET

IN RESET

M1 M1

Fig. 4.23 Secuencia de RESET.

Un comando de RESET finaliza la ejecución del programa y lleva a tercer es-tado los buses de direcciones y datos y las líneas de control. Las banderas de condi-ción de estados y los registros internos del µP no son manipulados durante la secuen-cia de inicio, pero no puede asegurarse que mantengan su contenido después de una operación de RESET.

El nivel de la entrada IN RESET es examinado durante cada pulso del reloj.

Cuando un nivel bajo es detectado, el µP, entra en TR y activa a uno la salida OUT RESET , tal como indica la figura 4.23, para notificar al exterior que el µP esta

siendo iniciado. OUT RESET es sincrónica con el reloj CLK y permanece activa durante un número entero de ciclos de reloj. Esta salida puede usarse para el inicio de circuitos externos del sistema.

Mientras IN RESET permanezca en cero transcurren nuevos TR y se continúa

examinando el nivel de IN RESET . Durante este tiempo se ejecuta la secuencia de inicio. Cuando se detecta el regreso a nivel alto de la línea IN RESET , la salida

OUT RESET vuelve a cero y el 8085A entra en el estado T1 del ciclo de máquina M1 de la primera instrucción del programa.

Cuando el µP sale del estado TR, el contador de programa contiene la direc-

ción 0000H, de modo que después de una operación de RESET la primera instrucción

Page 150: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 131

será buscada en esta dirección. Por esta razón conviene que la memoria EPROM de sistemas basados en el 8085A ocupe la zona inicial del espacio de direcciones del µP. Es usual que esta área de la memoria contenga la identificación del sistema, rutinas de detección de fallas y comandos para programar los periféricos y controladores asociados al sistema.

Es obvio que si el dispositivo no es iniciado durante TR, la naturaleza aleato-

ria de los estados iniciales alcanzados por registros y flip flops internos afectaría en forma severa el funcionamiento del sistema. La ejecución de la secuencia de inicio permite cargar los componentes internos de la CPU con valores lógicos procedentes para la búsqueda y ejecución de la primera instrucción del programa.

Existen otras situaciones en las cuales es necesario forzar el 8085A al estado

inicial. Por ejemplo, es común insertar una instrucción HLT en un programa para suspender temporalmente la ejecución en espera de una solicitud de interrupción por parte de un periférico. Si no ocurre la interrupción, una operación de RESET es el único medio para sacar al µP del estado THALT.

6.125 MHz

R1 5.1 KΩ 1N914

C1 10μf

RESET

8085A

+5V

Fig. 4.24 Circuito de RESET. En las versiones CMOS del 8085A, por ejemplo MSM80C85A, existe una

forma de operación conocida como modo de consumo bajo (power down mode), du-rante el cual el µP mantiene la información en memoria, pero se suspenden las activi-dades internas a tal punto que el consumo de potencia global se reduce en forma apre-ciable. Reiniciar el µP, es una de las opciones para salir del modo de bajo consumo. Un circuito típico para generar la señal de RESET, tanto en modo automático como manual, se presenta en la figura 4.24.

Al activarse la fuente de +5V, el capacitor C1 aplicará un nivel bajo en la en-

trada IN RESET , iniciándose el estado TR. A continuación C1 se carga a través del resistor R1 con constante de tiempo τ = R1C1. El µP se mantendrá en TR hasta cuando

Page 151: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A 132

el voltaje en C1 alcance el valor mínimo reconocido como uno lógico por el circuito disparador de Schmitt de la entrada IN RESET . Este es VIHR = 2.4 V.

En condiciones normales de operación, el capacitor C1 mantiene en nivel alto

la entrada de RESET. Si se acciona el pulsador de la figura 2.24, se lleva a nivel bajo a IN RESET por algunos milisegundos, al final de este periodo se repite el proceso de carga de C1. El diodo D1 permite la descarga rápida del C1 al desconectarse al energía.

La duración de TR es fijada por el valor deτ, de modo que bastará con selec-

cionarla para que asegure el mantenimiento de IN RESET en cero por un tiempo equivalente al menos al de tres ciclos del reloj. No obstante deben tenerse presente dos condiciones de operación que obligan a prolongar el tiempo de RESET. Primero, debe considerarse que el voltaje de alimentación requiere algunos milisegundos para alcanzar un nivel del 95% de VCC, o 4.75 V, especificado en la hoja técnica del dispo-sitivo como voltaje mínimo de operación.

En segundo lugar, INTEL especifica que no garantiza, por razones concernien-

tes a la tecnología de fabricación del dispositivo, el funcionamiento correcto del µP hasta 10 ms después que la tensión de alimentación VCC se eleve a 4.75 V . En conse-cuencia, conviene que durante el arranque se retarde la subida a nivel alto de la entra-da IN RESET , por un tiempo mayor a t95 + 10 ms, donde t95 es el tiempo transcurrido desde la activación de la fuente de poder hasta cuando VCC = 4.75 V.

Fig. 4.25 Salida de la fuente de poder y señal IN RESET 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 IN RESET está en cero. La rutina de inicio se ejecuta y

Page 152: Microprocesadores-Luis Urdaneta

Arquitectura y Operación del Microprocesador 8085A

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.

133

el µP entrará al último estado TR, durante el cual se detectara un nivel alto en IN RESET , y el 8085A transitará al ciclo de búsqueda de la primera instrucción del

programa. En realidad no representa un problema crítico la selección de la constante de tiempoτ. El valor de 51 ms seleccionado para τ en el circuito de la figura 4.24, mantiene a IN RESET en cero (por debajo de 2.4 V) durante 33 largos ms, desde el momento de accionarse el interruptor de la fuente de poder.

Page 153: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

134

Para el diseño de un sistema empotrado basado un microprocesador y destina-do resolver un problema específico de control, es necesario organizar un sistema mi-crocomputador alrededor del µP. Los recursos ofrecidos por el 8085A, tales como el sistema de interrupciones y el canal de comunicación serie, además de la versatilidad de los circuitos de soporte, distinguen al dispositivo como una CPU apropiada para uso en aplicaciones de control susceptibles de realizar con máquinas de 8 bits.

Debido a que el 8085A es un microprocesador, no tiene memoria, puertos de

E/S, ni temporizadores internos. En un sistema de cómputo basado en el 8085, todas estas funciones deben ser realizadas por circuitos externos conectados a los buses del microprocesador.

El 8085A puede usarse para construir un microcomputador usando los circui-

tos de soporte del dispositivo, o interconectando el microprocesador a circuitos de memoria y puertos de E/S estándares. La selección del tipo de componente a utilizar está determinada por la capacidad de la memoria y el número de puertos de E/S re-queridos por la aplicación.

5.1 SISTEMA MCS-85 MÍNIMO Para establecer los componentes mínimos necesarios para construir un sistema

de control típico basado en µP, considere el problema simple de supervisar los niveles de temperatura en ocho puntos de un proceso usando termopares como sensores. El sistema debe permitir que los valores de temperatura adquiridos, así como las even-tuales condiciones de alarma sean presentados en la pantalla de un terminal o sean transmitidos por el canal de comunicación serie hacia un microcomputador de mayor capacidad. Un diagrama de bloques de sistema se muestra en la figura 5.1

EEll MMiiccrrooccoommppuuttaaddoorr BBáássiiccoo

Page 154: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

135

Fig. 5.1 Sistema de adquisición de datos.

La adquisición, medición y control de temperatura es una aplicación suscepti-ble de ser realizada con un µP de ocho bits. En otros casos, el diseñador debe asegu-rarse que la capacidad de procesamiento y el espacio de memoria del sistema son recursos suficientes para satisfacer las exigencias impuestas por el problema de con-trol. De igual forma debe garantizarse que toda la restricción de tiempo inherente a la adquisición de los datos y control de la planta puede ser superada por el µP.

Cada sensor del sistema de adquisición de datos de la figura 5.1 proporciona

como señal de salida una tensión analógica, cuya magnitud es una función no lineal del valor de la temperatura en el punto de prueba. El multiplexor analógico (MUX) selecciona una de las señales para ser enviada al convertidor analógico digital (CAD), después de ser procesada por el amplificador de instrumentación (A) y el circuito de muestreo y mantenimiento (S/H). Por medio de las entradas de selección S0-S2 del MUX se determina cual de las tensiones de entrada va a ser muestreada y convertida a digital.

El amplificador incrementa la amplitud y reduce el nivel de ruido del voltaje

análogo. El circuito S/H muestrea la tensión de entrada y la mantiene constante du-rante el tiempo que dure la conversión. El proceso de conversión se inicia cuando es activada la línea START del CAD, y el fin de la conversión lo señala el CAD por me-dio de la salida EOC. El valor digital presente a la entrada del convertidor digital ana-lógico (CDA) es convertido en una tensión análoga y entregado al proceso. En caso que sea necesario disponer de otras salidas análogas, debe usarse un circuito demulti-plexor análogo.

Los circuitos de CAD y CDA son conectados al 8085A, por medio de puertos de E/S de dirección determinada. Como puede observarse en el diagrama de bloques del sistema, el valor digital equivalente al voltaje análogo desconocido es cargado en

MUX A S/H CAD

µC 8085A CDA

PC

S2 S1 S0 S/H

start eoc

salida serie entrada serie

sensores

salida analógica

D0-D7

D0-D7

Vi

interrupción

Page 155: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

136

el µP. Este lo convertirá a unidades de temperatura y posteriormente lo transmitirá, por el canal de comunicación serie, hacia un terminal o computador central. El CDA, conectado a un puerto de salida, recibe un valor digital desde el µP y lo envía al pro-ceso en forma de una tensión análoga.

El 8085A presenta en las entradas S0-S2 del multiplexor, el número del canal,

para seleccionar cual de las ocho señales va a ser convertida. Simultáneamente ordena al circuito S/H que inicie el muestreo de la señal. Transcurrido un tiempo igual al re-tardo de los circuitos MUX, A, y S/H, el µP detendrá el proceso de muestreo po-niendo al S/H en el modo de mantenimiento y activará la señal START dando lugar al inicio de la conversión.

Una vez culminada la conversión, el CAD usará la salida EOC para interrum-

pir al procesador. Como respuesta, el µP cargará en memoria el byte resultado de la conversión y procederá a procesar la siguiente entrada. Una vez adquiridas las ocho señales de entradas son convertidas en unidades de temperatura y enviadas al canal serie, reiniciándose el proceso.

Para conectar la sección de adquisición de datos al µP, son necesarios tres

puertos, uno de entrada (Puerto A) y dos de salida (Puertos B y C). La salida del CAD se acopla al puerto A, el puerto B entrega un valor digital a las entradas de CDA y cinco líneas del puerto C son utilizadas por el µP para el control del proceso de ad-quisición. El la figura 5.2 se observa que las líneas PC4- PC2 se usan para la selección del canal, mientras que PC1 controla el S/H y PC0 suministra la señal de inicio de con-versión.

Fig. 5.2 Funciones de las líneas de los puertos de E/S.

Las funciones de memoria y puertos necesarios para el sistema de supervisión

pueden ser suplidas por los circuitos de soporte del 8085A: el 8155/56 integra en el encapsulado 256 bytes de memoria RWM, 2 puertos programables de 8 bits, uno de 6 bits y un contador/temporizador programable de 14 bits. El 8355/8755 provee 2 Kby-tes de memoria ROM/EPROM y dos puertos 8 bits.

PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0

PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0

S2 S1 S0 S/H START

Puerto A: Entrada

Puerto B: Salida

Puerto C: Salida

D0-D7: CDA

D0-D7: CAD

PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0

Page 156: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

137

En ambos dispositivos está integrado el registro de 8 bits necesario para sepa-rar los datos y direcciones del bus multiplexado. La figura 5.3 presenta el símbolo lógico de ambos circuitos.

Fig. 5.3 Dispositivos compatibles directamente con el 8085A.

No se requieren componentes LSI adicionales para construir la tarjeta necesa-ria para la aplicación. Una vez que la tensión de entrada desconocida es convertida a digital, el CAD activará la salida EOC de fin de conversión. Esta señal conecta a una de las entradas de interrupción del 8085A. Pueden usarse cualquiera de las líneas RST 5.5, RST 6.5, RST 7.5 o TRAP.

El uso del sistema de interrupciones del µP para detectar el final del proceso

de conversión de una muestra de la tensión de entrada, simplifica el diseño del siste-ma. Cuando un periférico aplica un nivel alto a cualquiera de estas entradas una vez que el µP acepta la solicitud, el contenido del contador de programa es almacenado en la pila y el control del programa es transferido a una posición determinada de la memoria.

El programador debe tener la previsión que la primera la instrucción de la ru-

tina que carga en memoria y procesa el dato adquirido, resida en la dirección del sal-to. Lo usual es que la dirección del vector de interrupción contenga una instrucción de salto incondicional al inicio de la rutina de servicio.

El problema propone el uso del canal serie del 8085A para que el micropro-

cesador se comunique con un microcomputador de mayor capacidad o con un termi-nal remoto. La adquisición y procesamiento local usando grupos de microcomputado-res de 8 bits interconectados a un computador central es una estructura muy usada en control de procesos. Para establecer la comunicación se utilizan la entrada SID y sali-da SOD del canal serie del µP. En el 8085A se integra un circuito transmisor/receptor

Page 157: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

138

asincrónico primitivo, el cual ser programado apropiadamente para establecer el en-lace.

Si el microcomputador o terminal está separado del sistema de adquisición por

una distancia superior a 2 metros, la transferencia no puede ser realizada conectando directamente el transmisor al receptor. A esta distancia, los niveles lógicos de 0 y +5V sufrirán un deterioro severo debido a la atenuación introducida por el cable, el ancho de banda del canal y la velocidad de transmisión.

Una de las soluciones a este problema es utilizar la interfase RS232C, la cual

consiste en elevar los niveles lógicos desde 0 y 5 V a valores superiores, uno positivo para representar el cero lógico y otro negativo para el uno lógico.

Fig. 5.3 Interconexión RS232C

Los circuitos integrados LM1488 y LM1489 pueden usarse como dispositivos

de interconexión entre el µP y el canal RS232C. El transmisor (LM1488) requiere alimentación de ±12V. Si no se dispone de fuentes de doble polaridad, debe utilizarse el dispositivo MAX-232, este circuito además de realizar el cambio de tensión de las señales de transmisión y recepción, también permite el uso de una fuente única al elevar el voltaje de la fuente desde +5 V hasta ±12V.

Usando los circuitos de soporte del 8085A, se diseña un sistema mínimo para

el control de la adquisición y presentación de datos. El acoplamiento de la entrada y salida serie al canal RS232C se realiza por medio de circuitos integrados de propósito específico. Para la recepción de datos se usa el LM1489 y para la transmisión, el LM1489.

Computador 8085A

0 = +V 1 = -V

SID

SOD

1 ≥ 2.0 V 1 ≥ 2.0 V 0 ≤ 0.8 V 0 ≤ 0.8 V

Page 158: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

139

Fig. 5.4 Sistema microcomputador mínimo con circuitos de la familia MCS-85

El diagrama eléctrico final de la tarjeta es el de la figura 5.4. La selección de los componentes y el cableado de la sección análoga del sistema de adquisición de la figura 5.1, se realizará en un capítulo posterior. Por ahora observe que el µP configu-rado ofrece recursos suficientes para satisfacer las exigencias del sistema de adquisi-ción.

El programa de la aplicación reside en los 2 Kbytes de memoria EPROM de

U2, mientras que las líneas de salida del CAD se conectan al puerto A del componente U3. Al puerto B del mismo componente se acopla el CDA y por las líneas PC0-PC4 del puerto C de U3 se generan las señales de selección del canal del multiplexor analógi-co, la entrada de control del circuito de muestreo y mantenimiento y la señal de inicio de conversión.

Las funciones asignadas a los puertos determinan que el puerto A del 8156

debe ser programado como entrada y los puertos B y C como salidas. La programa-ción se realiza cargando un patrón de bits específico en el registro interno de coman-dos, mostrado en la figura 5.2, del 8156. Los puertos de U2 y el temporiza-dor/contador de U3 no se usan en esta aplicación. La salida de fin de conversión se aplica a la línea de interrupción RST 6.5 y la conexión de los circuitos de interco-nexión RS232C es directa, solo se requiere que la fuente de poder del sistema tenga tensiones de salida de ± 12 V.

Page 159: Microprocesadores-Luis Urdaneta

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 RDy WR a +5V usando resistores, para evitar que cuando estén en tercer estado se produzcan selecciones falsas de dispositivos. Esto no lo muestra el diagra-ma de la figura 5.4. Aunque el modo de operación y de programación del 8155/56 y del 8355/8755 se discute en el capitulo 9, en esta sección conviene establecer como está distribuido el espacio de memoria del 8085A, según establece la interconexión de los componentes en el diagrama eléctrico de la figura 5.4.

Como se explicó con anterioridad, durante una operación de escritura o lectu-

ra en memoria o puerto de E/S, el µP identifica la posición de memoria o el puerto en acceso colocando su dirección sobre el bus de direcciones y activa la salida

RD o WR . Según el tipo de operación en progreso, escribirá un dato sobre el bus AD0-AD7 o leerá el contenido del mismo. El nivel lógico de la salida M/IO determi-na si el acceso se realiza a una dirección de memoria o a un puerto de E/S. El µP completará la lectura o escritura con independencia que el origen o destino de la in-formación sea el deseado por el programador.

Cuando varios circuitos de memoria son conectados al sistema, cada disposi-

tivo debe ser habilitado para una zona particular del espacio de memoria. El meca-nismo usado para decodificar la memoria debe asegurar que no exista la posibilidad que dos posiciones de memoria sean seleccionadas simultáneamente. En el caso del sistema de supervisión y presentación de temperaturas, se tienen dos áreas de memo-ria física: 2048 bytes correspondientes a la EPROM del circuito 8755 y 256 bytes de la sección de memoria RWM del 8156.

La selección de los circuitos de memoria y puertos de E/S se realiza usando el

método de selección lineal. Para situar los 2 Kbytes de la EPROM en el espacio de memoria de 64K del 8085A, se conecta la línea de dirección A11 a la entrada habilita-ción 1CE mientras que la otra entrada de selección, 2CE es forzada a uno lógico. Debido a que el circuito 8755 es habilitado cuando 12CEy01CE == , el 8755 será seleccionado cada vez que la línea A11 esté en nivel bajo, como señala la tabla 5.1 de decodificación de direcciones.

El proceso de adquisición se inicia una vez que el µC sale del estado de RE-

SET, después de aplicarse potencia a la tarjeta. Debido a que el programa reside en la EPROM, cuando una dirección de los dos primeros Kbytes (0000H-07FFH) del espa-cio de direcciones se presente el bus, debe habilitarse el 8355. Con el esquema selec-cionado se satisface tal condición, pero en realidad el 8355 será seleccionado cada vez que el bus contenga una dirección comprendida en los rangos 0-2K, 4-6K, 8-10K, 12-14K, 16-18K,...,60K-62K, lo cual representa 16 bloques de 2Kbytes, para un total de 32 K.

Page 160: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

141

Tabla. 5.1 Espacio de memoria ocupado por las memorias EPROM y RWM

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

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

Registro selccionado

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 x x x x 0 0 0 0 0 0 0 0 0 0 0 1 . . . . . . . . . . . . . . . .

x x x x 0 1 1 1 1 1 1 1 1 1 1 0

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

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

. . . . . . . . . . . . . . . .

EPROM (2K) RWM (256 bytes)

x x x x 0 1 1 1 1 1 1 1 1 1 1 1

Page 161: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

142

El estado lógico de la señal M/IO distingue cuando se solicita acceso a una posición de memoria o a un puerto. El uso de M/IO también determina que la lectu-ra o escritura en un registro de E/S solo pueda realizarse mediante la ejecución de una instrucción IN puerto o OUT puerto. Cuando se ejecuta una de estas instruccio-nes, el número del puerto es duplicado sobre las 16 líneas de direcciones. Debido a que la línea de dirección A11 debe estar en cero, el operando puerto de IN y OUT debe ser especificado como indica la figura 5.5. El estado lógico bajo del bit 3 del número del puerto, garantiza que A11 estará en cero.

Fig. 5.5 Patrón de bits del número de puerto para el 8755

El circuito 8155 tiene seis registros internos, los cuales son tratados como

puertos de E/S. Cuatro de éstos corresponden a la sección de E/S del dispositivo: el registro de comando para programar los puertos, los puertos de E/S: A, B y C, y dos registros para programar el temporizador. Para el acceso a uno de estos registros la salida A11 deberá estar en uno lógico y la dirección particular de los puertos la deter-mina las líneas AD0-AD2, tal como indica la figura 5.6.

Fig. 5.6 Patrón de bits del número de puerto para el 8156

La tabla de asignación de direcciones para la sección de E/S del 8155 se ofre-ce en la tabla 5.3.

Tabla. 5.3 Direcciones de puertos de E/S para el 8156

Considerando una vez más como cero, las condiciones especificadas como in-

diferente en los patrones de bits de las figuras 5.5 y 5.6, se obtienen para los puertos las direcciones especificadas por la tabla 5.4. Aunque los puertos de E/S del 8755 no se usan en el sistema de adquisición, sus direcciones también se indican.

x x x x 0 x AD1 AD0

x x x x 1 AD2 AD1 AD0

Page 162: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

143

Tabla. 5.4 Direcciones de los puertos de E/S

8755 Puerto A 00H Puerto B 01H DDR A 02H DDR B 03H 8156 RC/S 08H Puerto A 09H Puerto B 0AH Puerto C 0BH T/C bajo 0CH T/C alto 0DH

Se ha mostrado que el diseño un µC usando el 8085A y sus circuitos de sopor-

te, es una tarea sencilla. En realidad el trabajo se limita a conectar terminal a terminal los 3 dispositivos. Si una aplicación exige mayores recursos que los ofrecidos por el sistema mínimo, pueden usarse circuitos 8755 y 8156 adicionales y utilizar las líneas de direcciones A12 hasta A15 para seleccionarlos.

Cuando se usa el método de selección lineal para habilitar varios dispositivos,

las áreas de memoria asignadas a cada uno de los chips no corresponden a bloques contiguos, quedando como responsabilidad del programador reconocer las áreas vá-lidas de memoria. Otra desventaja de la selección lineal es que limita el número de circuitos posibles de conectar al µP, debido a secciona por la mitad el espacio dispo-nible de memoria por cada línea de dirección usada como señal de habilitación. Este obstáculo puede ser superado usando circuitos decodificadores, como sugiere la figu-ra 5.7. El dispositivo 8155 cumple funciones iguales que el 8156, exceptuando el hecho que el circuito es seleccionado aplicando un nivel bajo en la entrada de habili-tación CE .

Otra posibilidad de expandir el sistema MCS-85 mínimo se muestra en la fi-

gura 5.8. El uso de los circuitos de soporte del 8085A se recomienda para sistemas que requieran poca memoria. En la medida que se incrementen las exigencias de memoria o de puertos de entrada y salida, deberán conectarse componentes adiciona-les al microprocesador. Para aplicaciones que exijan capacidad de memoria mediana o grande, puede ser preferible apelar al uso de dispositivos estándares. En tal situa-ción deberá usarse un registro externo de 8 bits para demultiplexar el bus de direccio-nes /datos.

5.2 INTERCONEXIÓN DEL 8085A CON DISPOSITIVOS CON-VENCIONALES.

Los circuitos de soporte del 8085 simplifican en forma notable el diseño de un

sistema µC debido a que están diseñados específicamente para conectarse al bus mul-tiplexado del µP. Cuando se considere necesario, es posible acoplar circuitos conven-cionales de memoria o puertos al 8085A siempre que se separen las ocho líneas me-

Page 163: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

144

nos significativas de las direcciones del bus AD0-AD7. Una vez que se dispone de las 16 líneas de direcciones, cualquiera de las técnicas de selección expuestas en la sec-ción anterior pueden ser utilizadas para la habilitación de componentes estándar.

Fig. 5.7 Sistema expandido con selección usando decodificadores 3 a 8

Page 164: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

145

Fig. 5.8 Sistema MCS-5 expandido.

El 8085A no tiene señales de control individuales para indicar a circuitos de

memoria o puertos que se dispone a iniciar una operación de lectura o escritura. Estas funciones las cumple en conjunto las señales M/IO , RDyWR .

Fig. 5.9 Sistema 8085 usando componentes externos convencionales

8085A

EPROM RWM Puerto

de Entrada

A0-A15

A0-A7

A8-A15

ALE

RD WR

IO/M

IOWR MRD MWR IORD D0-AD7

Puerto de

Salida LACTH

Decodificador

Puerto B (8)

Puerto A (8)

Puerto B (8)

Puerto A (8)

Puerto B (8)

Puerto A (8)

Puerto B (8)

Puerto A (8)

Puerto C (6)

Puerto B (8)

Puerto A (8)

Puerto C (6)

Page 165: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

146

Para el control del acceso a memoria y puertos convencionales, estas salidas pueden combinarse para obtener señales de lectura y escritura correspondientes. En el diagrama de bloques de la figura 5.9 se observa el modo de conexión del 8085A a dispositivos externos estándar, destacándose el registro latch y una lógica para gene-rar las salidas de lectura/escritura.

La demultiplexión del bus AD0-AD7 se realiza usando la salida ALE como se-

ñal de reloj de un registro convencional de 8 bits.

Fig. 5.10 Demultiplexión del bus de direcciones/datos del 8085A.

Es conocido por el lector que la salida ALE es activada a nivel alto al inicio

del estado T1 de todo ciclo de máquina, como medio de notificar a dispositivos exter-nos que el bus AD0-AD7 contiene información correspondiente a direcciones. De mo-do que se puede por medio del lacth capturar los ocho bits menos significativos de la dirección generada por el µP para que estén disponibles durante la duración de todo el ciclo de máquina.

En la figura 5.10 se muestran las conexiones necesarias para realizar la demul-

tiplexión del bus. Las salidas Q0-Q7 del 74LS373 siguen el valor de las entradas co-rrespondientes AD0-AD7, cuando la línea G está en nivel lógico alto, y capturan el último valor de las entradas cuando G vuelve a cero. Conectando la salida ALE del µP a la entrada G del registro se garantiza la retención de los ocho bits de menor peso de la dirección.

Para generar las salidas de control para la lectura y escritura en dispositivos

convencionales de memoria y de puertos de E/S, se utiliza la lógica discreta de la figura 5.11.

ALE

8085A AD0-AD7 D0-D7

OC

G

A0-A7

D0-D7

74LS373

Q0-Q7

Page 166: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

147

Fig. 5.11 Decodificador de señales de lectura y escritura en memoria y E/S

El diagrama eléctrico del µP 8085A, listo para ser interconectado a circuitos

de memoria o de puertos de E/S convencionales se presenta en la figura 5.12. Debido a que el objetivo es diseñar un sistema mínimo basado en el microprocesador 8085A pero que use componentes externos estándar, y sea capaz de realizar las tareas de con-trol del sistema de supervisión de temperatura de la figura 5.1, se deben seleccionar los dispositivos de memoria y de E/S a utilizar. A continuación se procede a seleccio-nar la memoria de programa y de datos y el circuito integrado de puertos de E/S.

5.2.1 La memoria de programa Para almacenar el programa de control del sistema de supervisión de tempera-

tura, se requiere un circuito de memoria programable, que pueda ser eventualmente borrada. La capacidad de almacenamiento del dispositivo debe ser de 2048 bytes y con tiempo de acceso inferior a 575 ns. Las memorias EPROM son un tipo de ROM que pueden ser programadas y borradas por el usuario.

En el mercado electrónico existe una extensa variedad de memorias EPROM,

disponibles para satisfacer exigencias de cualquiera aplicación. Las EPROM más usadas en aplicaciones con µPs son la 2716, 2732, 2764, 27128, 27256,27512 y 271024 con capacidades desde 2Kbytes hasta 128 Kbytes y con velocidades desde 450 ns a 45 ns.

Para sustituir la sección de memoria EPROM del dispositivo 8755 se elige el

circuito integrado con código 2716, el cual es una EPROM con una capacidad de 2 Kbytes y un tiempo de acceso igual a 450 ns, para la versión más lenta. El dispositivo se presenta en un encapsulado de 24 pines y en la figura 5.13 se presenta la distribu-ción de terminales del circuito.

Page 167: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

148

Fig. 5.12 Unidad de proceso central de un microcomputador clásico

Page 168: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

149

A0 – A10 Direcciones O0 - O7 Salida de Datos

OE Habilitar Salida

PGM/CS Selección de chip/ Programar

Fig. 5.13 Distribución de terminales de la EPROM 2716.

El circuito integrado código 2716 tiene 11 líneas de direcciones (A0-A10) para

brindar acceso a las 2048 posiciones de la memoria, y 8 salidas de datos D0-D7. El modo de operación lo establece las 2 entradas de control ( CS y OE ), de acuerdo con lo indicado en la tabla 5.5.

Tabla. 5.5 Modos de operación de la EPROM 2716.

MODO OE PGM/CS VPP VCC SALIDAS

Deshabilitar VIH x +5 +5 Z Lectura VIL VIL +5 +5 DATOSsalida Espera x VIH +5 +5 Z Programar

VIH

+25

+5

DATOSentrada

Verificar Programa VIL VIL +25 +5 DATOSsalida Inhibir Programa VIH VIL +25 +5 Z

VIL : TTLbajo 0.8 Vmáx VIH : TTLalto 2.0 Vmín Z: Alta Impedancia

La EPROM tiene dos entradas de alimentación: VCC y Vpp. En funcionamiento normal, ambos terminales se conectan a +5 V. Durante el proceso de programación de la memoria, el terminal Vpp debe estar a +25 V. Como ilustra la figura 5.14, para ob-tener en las salidas D0-D7 el contenido de una posición de la 2716, los terminales de habilitación de salida OE y de selección de chip CS deben estar en estado cero. Un

CS/ PGM

A7

A6

A5

A4

A3

A2

A1

A0

O0

O1

O2

GND

VCC

A8

A9

VPP

OE

A10

O7

O6

O5

O4

O3

2716 2K x 8

VIH

VIL

Page 169: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

150

nivel alto en cualquiera de estas entradas colocan las salidas de los buffers en estado de alta impedancia.

Fig. 5.14 Estructura interna de la EPROM.

La entrada de selección de chip, CS , cumple una función doble de control. Además del uso típico de seleccionar el circuito entre un grupo de dispositivos de memoria con salidas conectadas a un bus común, la línea CS permite controlar la potencia consumida por la 2716. Cuando CS es llevada al nivel lógico uno, y con independencia del nivel de la entrada de habilitación de salida OE , se remueve la alimentación de los componentes internos de la memoria, quedando sin energía el decodificador de fila, los buffers de salida y el multiplexor de columna. Este modo de operación se conoce como de consumo bajo o espera, y está caracterizado por un gasto total de potencia que corresponde a una fracción (25%) de la necesaria para la operación normal del chip.

Un ciclo de lectura de la 2716 se muestra en la figura 5.15. La entrada CS se

usa para seleccionar la memoria y OE para habilitar la presentación de los datos en los terminales de salida. El proceso de lectura de la EPROM se inicia con la aplica-ción de una dirección válida a las líneas A0-A10, a continuación se selecciona la me-moria y se habilitan los buffers de salida llevando a cero las entradas CS y OE , res-pectivamente. Transcurrido el tiempo de acceso, el dato almacenado en la posición escogida se presenta en las líneas O0-O7.

Page 170: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

151

Características AC tACC Tiempo de acceso (Access Time) 450 ns máximo Espacio de tiempo transcurrido entre la aplicación de una dirección estable y la aparición de

los datos en la salida de la memoria. tCE Tiempo de habilitación de salida (Output Delay from CS ) 450 ns máximo

Retardo entre la aplicación de la señal de selección de chip CS y la salida de datos válidos tOE Output enable to output float 120 ns máximo Tiempo que transcurre desde la activación de la entrada OE hasta que existe un dato de

salida válido. tDF Output enable high to output float 100 ns máximo Tiempo desde la supresión de la entrada OE hasta cuando las salidas van a estado de alta

impedancia.

Como se observa en la figura 5.16, se usa selección lineal para situar la 2716

en la misma área de memoria que la ocupada por la sección de EPROM del 8755 del µC de la figura 5.4. La línea de dirección A11 se conecta a CS y la salida de lectura en memoria, MRD , se aplica a la entrada de habilitación de salidas OE .

5.2.2 La memoria de datos

Para suplir la zona de memoria volátil se usa una RWM estática 6116 de 2 Kbytes, en lugar de los 256 bytes del 8156.

Fig. 5.15 Ciclo de lectura de la EPROM 2716

DIRECCIONES

CS

OE

SALIDAS

tACC

tOE

tOF

tCE

Datos validos

Dirección valida

Page 171: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

152

Fig. 5.16 EPROM 2716 decodificada para el rango 0000H-07FFH

A0 -A10 Direcciones D0 - D7 E/S de Datos CS Seleccionar Chip

OE Habilitar Salida

WE Habilitar Escritura

Fig. 5.17 Distribución de terminales de la RWM 6116.

Tabla. 5.6 Modos de operación de la RWM 6116.

MODO WE CS OE D0 –D7

Lectura VIH VIL VIL DATOSsalida Escritura VIL VIL x DATOSentrada Deshabilitar VIH x VIH Z Espera x VIH x Z

A7

A6A5

A4

A3

A2

A1

A0

D0

D1

D2

GND

VCC

A8

A9

WE OEA10

D7

D6

D5

D4

D3

6116 2K x 8 CS

Page 172: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

153

La memoria estática 6116 dispone de 11 líneas de direcciones A0-A10 y 8 ter-minales para E/S de datos, D0-D7. Las líneas de control CS y OE funcionan en forma idéntica que en la EPROM 2716, mientras que la entrada WE es la señal de escritura de datos. El tiempo de acceso de la versión más lenta del dispositivo es de 250 ns. El ciclo de lectura de una celda de memoria de la RWM es similar al descrito para la EPROM. Para explicar como se almacenan los datos en la memoria, se muestra en la figura 5.18 el diagrama de tiempos de un ciclo de escritura.

Una operación de escritura se inicia con la aplicación en las líneas A0-A10 de

dirección de la posición donde se almacenará el dato, la cual debe permanecer estable en A0-A10 durante un tiempo tAS, antes de la activación de las señales de control CS y WE , para permitir que la memoria decodifique la nueva dirección. Si esta restricción es violada, el dato en D0-D7 se almacena en una posición con dirección imposible de predecir. Fig. 5.18 Ciclo de escritura de la RWM 6116

Cuando las entradas de selección y escritura van a nivel alto, la dirección debe

mantenerse válida durante un tiempo tAH. La duración del pulso bajo de la entrada de selección de chip CS debe ser al menos tCSW para asegurar la selección de la celda mientras que el ancho del pulso de escritura WE debe ser mayor o igual a tWP para garantizar que la información se coloca en la dirección seleccionada .

Al colocarse el dato en los terminales de entrada, debe permanecer estable cuando menos un tiempo tDS antes, y un intervalo tDH después, que las entradas de selección de chip CS y habilitación de escritura WE sean removidas. La duración del ciclo de escritura es tWC

tWC

tAS tWP

tDS tDH

tAH

DIRECCIÓN

CS

WE

D0 - D7

tCSW

Page 173: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

154

Características AC tAS Tiempo de preparación de direcciones (Address Setup Time Before Write) Intervalo durante el cual todas las líneas de direcciones deben mantenerse estables antes

que las entradas WE y CS ( ambas en cero lógico) sean aplicadas a la memoria. tAH Tiempo de retención de direcciones (Address Hold Time After Write) Lapso durante el cual la dirección debe permanecer válida después de desactivar a WE y

CS . tCSW Tiempo de preparación de CS . (Chip Select Setup Before End of Write) Duración mínima de la entrada de selección de chip. tWP Ancho del pulso de escritura (Write Pulse Width) Ancho mínimo del pulso WE . tDS Tiempo de preparación del dato (Data Setup Time Before End of Write) Espacio de tiempo que deben permanecer estables los datos en la entrada de la memoria

antes de la desactivación de las entradas de selección y escritura. tDH Tiempo de retención del dato (Data Hold Time After End of Write) Lapso que debe mantenerse válido el dato a la entrada de la memoria después de la remo-

ción de las entradas de selección y escritura.

Las especificaciones técnicas de las memorias SRWM distinguen entre dos modos de ciclo de escritura:

1. Escritura bajo control de WE 2. " " " " CS .

El diagrama de tiempos mostrado en la figura 5.18 corresponde a la memoria de lectura/escritura estática 6116 operando en modo 1. La diferencia la establece cual de las dos señales, WE o CS , se activa de último y se remueve primero.

Para que la memoria RWM sea decodificada en las mismas direcciones que la

sección de RAM del 8156 de la figura 5.4, es suficiente con aplicar la a la entrada CS , el complemento de la línea de direcciones A11. Las señales de lectura y escritura MRD y MRW se conectan respectivamente a las entradas o OE y WE de la 6116, como especifica la figura 5.19.

5.2.3 Los puertos de entrada y salida

Para conectar al 8085A la etapa de adquisición de datos de temperatura se uti-

lizaron la sección de E/S del 8156. Para cumplir las funciones de E/S de la CPU de la figura 4.41, se usa un circuito programable para interconexión de periféricos del tipo PPI 8255 (PPI: Programmable Peripheral Interface). El 8255 es un circuito LSI de uso difundido y de bajo costo. A pesar que fue introducido en la década de los setenta

Page 174: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

155

como un componente de E/S para sistemas basados en el μP 8080 de INTEL, aun es posible encontrarlo (no necesariamente como un 8255 discreto) en μCs basados en procesadores modernos, cumpliendo funciones de puerto para la conexión de teclado e impresora.

Fig. 5.19 RWM 6116 decodificada para las direcciones comprendidas entre 0800H-0FFFH Una descripción con detalle del dispositivo y la presentación de aplicaciones

típicas, se realizará en el capítulo 9. Por ahora, interesa más bien entender como se interconecta el PPI al 8085A y la forma en la cual es seleccionado por el µP. El 8255 tiene 24 líneas de E/S distribuidas en 3 puertos de 8 bits, los cuales los cuales pueden ser programados como entradas o salidas en 2 grupos (A y B) de 12 líneas y puede usarse en tres modos principales de operación. La configuración de los terminales y el símbolo eléctrico del circuito programable para interconexión de periféricos 8255, son los mostrados en la figura 5.20.

Fig. 5.20 Distribución de terminales del PPI 8255

8255

Page 175: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

156

El grupo A está formado por el puerto A:PA0-PA7 y por los cuatro bits de or-

den mayor del puerto C (PC4-PC7); el grupo B está compuesto por las ocho líneas del puerto B: PB0-PB7 y los cuatro bits menos significativos del puerto C (PC0-PC3). Además de los puertos el 8255 contiene un registro de comandos para la programa-ción del dispositivo. Para que el 8085A pueda tener acceso a uno de los registros para programar el dispositivo o usar uno de los puertos, la entrada de habilitación CS de-be ponerse a nivel bajo. La selección del registro de comando o de un puerto de E/S particular se realiza por medio de las entradas de dirección A0 y A1, según lo indica-do por la tabla siguiente.

Tabla. 5.7 Direcciones de los registros internos del PPI 8255

El tipo de operación a realizar es determinado por la activación de una de las

entradas de control: RD o WR . Estas líneas de entrada deben conectarse, respectiva-mente, a las salidas de control de lectura y escritura en puerto de E/S: IORD e IOWR de la CPU de la figura 5.16. Las ocho líneas bidireccionales de datos (D0-D7) del 8255 se acoplan al bus de direcciones/datos AD0-AD7 y permanecerán en estado de alta impedancia cuando CS no esté activa; o en caso que RD y WR estén ambas en uno, independientemente del estado de CS . La tabla 5.8 muestra el modo básico de operación del 8255.

Tabla. 5.8 Tabla de estados del PPI 8255

Dirección del Puerto de E/S A7 A6 A5 A4 A3 A2 A1 A0

x x x x x x 0 0 Puerto A de E/S x x x x x x 0 1 Puerto B de E/S x x x x x x 1 0 Puerto C de E/S x x x x x x 1 1 Registro de comando

Registro seleccionado

Page 176: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

157

La interconexión del 8255 al µP se realiza como indica la figura 5.21. Observe que para seleccionar el circuito, se usa el complemento de la línea de direcciones A11.

Fig. 5.21 Conexión del PPI 8255 al µP 8085A Cuando se aplica tensión para arrancar al sistema, la señal de salida de 8085A: OUTRESET se activa en alto, y fuerza al 8255 a iniciarse con todos los puertos

programados como entrada. Si tal configuración no es la deseada para la aplicación, el PPI debe ser reprogramado escribiendo un cierto patrón de bits en el registro de comando. La selección lineal del 8255 usando la línea A11, establece las direcciones de los puertos como especifica la figura 5.22.

Fig. 5.22 El PPI 8255 es seleccionado por medio de la línea de dirección A11.

Observe que para seleccionar el área de 2048 Kbytes de la memoria de lectu-ra/escritura 6116 y al PPI 8255 se usa la misma señal ( 11A ). No obstante, las líneas de datos de ambos dispositivos nunca se conectan simultáneamente al bus de direc-ciones/datos AD0-AD7 del 8085A. Esto es posible porque el espacio de direcciones de memoria está separado del correspondiente a los puertos de E/S. Durante una ope-ración de lectura o escritura, el 8085A indica que la dirección en el bus se refiere a una posición de memoria activando una de las señales: MRD o MRW ; mientras que un acceso a un puerto de E/S es notificado por medio de les señales IORD o IOWR .

Durante una operación de lectura (escritura) de la memoria RWM, se selec-

ciona el chip 6116 y se activa en nivel bajo la señal MRD ( MRW ) para leer (escri-

Puerto A 08H Puerto B 09H Puerto C 0AH Comando 0BH

A15 A14 A13 A12 A11 A10 A9 A8

A7 A6 A5 A4 A3 A2 A1 A0

x x x x 1 x A1 A0

Page 177: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

158

bir) la posición especificada por las líneas de direcciones A0-A10. Aun cuando está operación pone un nivel cero en la entrada CS del 8255, el bus de datos (D0-D7) del PPI permanece en tercer estado debido a que las entradas de control IORD e IOWR están ambas en nivel alto. Esto puede ser verificado consultando la tabla 5.8 de fun-cionamiento del 8255.

Una situación similar ocurre cuando se ejecuta una instrucción IN puerto

(OUT puerto). Con el 8255 habilitado, se activa la línea IORD ( IOWR ) para leer (escribir) el registro de E/S del 8255 identificado por el estado de las líneas de direc-ciones A0-A1. En este caso la memoria 6116 permanece inactiva porque las señales MRD y MRW , ambas en uno, mantienen flotantes las líneas de datos (D0-D7) del circuito. Si se desea mantener la memoria RWM en el modo de bajo consumo ( CS =1) cuando se habilite el 8255, puede usarse una de las líneas de direcciones A12-A15 (en lugar de A11) para seleccionar el PPI.

En la figura 5.23 se presenta el diagrama final de la sección de memoria y

puertos de E/S, usando dispositivos convencionales, para el sistema de adquisición y supervisión de datos de la figura 5.1,

5.3 DECODIFICACIÓN EXHAUSTIVA DE LAS DIRECCIONES

En la técnica de selección lineal, cada línea de bus de direcciones del µP se utiliza para habilitar un componente particular del sistema. Este método usado hasta ahora para decodificar las direcciones de los circuitos de memoria y puertos tiene varias desventajas. En primer término, el número de dispositivos posibles de selec-cionar está limitado por el número de líneas de dirección no usadas para acceder a posiciones de memoria.

En el caso del µC de la figura 5.4 para el acceso a los 2 Kbytes de EPROM del

8755 son necesarios once líneas de direcciones, mientras que para los 256 bytes de la RWM del 8156 bastan con sólo ocho líneas. Esto significa que de los dieciséis bits del bus de direcciones, once (211=2048K) están destinadas para el acceso a las áreas de EPROM y RAM. Es común que la mayoría de las aplicaciones requieran una zona de EPROM de mayor capacidad que la de RWM.

Como indica la figura 5.24, las cinco líneas de direcciones A11-A15 pueden

usarse para seleccionar los componentes. La línea A11 selecciona la EPROM y la RAM quedando los cuatro bits restantes para habilitar otras memorias o dispositivos de E/S. A pesar del número reducido de dispositivos posibles de habilitar mediante está técnica, es muy utilizada en sistemas pequeños por que no requiere de circuitos decodificadores y disminuye el número total de componentes y el costo de construc-ción del sistema.

Page 178: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

159

Fig. 5.23 Sección de memoria y E/S del µC de la figura 5.12.

Page 179: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

160

Fig. 5.24 Esquema de selección lineal. Otra desventaja asociada a esta técnica es que secciona por la mitad el espacio

total de 64K de memoria disponible, por cada bit individual de dirección usado como señal de selección de chip. El uso de la línea A11 para seleccionar la EPROM del 8755 en el µC de la figura 5.4, divide el espacio de memoria en dos bloques de 32K cada uno. Otra limitación de la selección lineal es que si se utiliza para habilitar varios 8755, dos por ejemplo, las zonas ocupadas por la sección de memoria de cada circuito no son contiguas. La del primero estará asignada desde 0 a 2K y la del segundo desde 6K hasta 8K, como se deduce examinando el sistema de la figura 5.8. En estos casos, es responsabilidad del programador reconocer las áreas válidas de memoria.

Al no utilizar todas las líneas de direcciones para decodificar la dirección de la

posición de memoria a la cual se desea acceso, la selección lineal resulta en una de-codificación parcial del espacio de direcciones. Tal esquema es permitido como me-dio de simplificar el decodificador, siempre y cuando el sistema no utilice todo el espacio de memoria del µP. Una decodificación incompleta significa que una misma posición de memoria puede ser seleccionada con direcciones diferentes. Recuerde que se indicó en la sección 5.1 que aun cuando la EPROM está asignada a los primeros 2Kbytes (000H-07FFH), la sección de memoria del 8755 será seleccionada cada vez que el bus contenga una dirección comprendida en los rangos 0-2K, 4-6K, 8-10K, 12-14K,16-18K, ...,60K-62K. Estos bloques adicionales se conocen como zonas imagen y su número puede ser calculado por la ecuación,

(n j k l)I 2 − − −=

donde: n: número de líneas del bus de direcciones. j: número de entradas de direcciones de la memoria. k: número de líneas de direcciones usadas en la decodificación externa, y l: número de líneas comunes a la decodificación externa e interna.

En el caso en discusión, I=2(16-11-1-0) = 16. Las zonas imagen del bloque de 2K

de la EPROM del 8755 se muestran en el mapa de memoria de la figura 5.25, y co-rresponden a las direcciones para las cuales la línea A11 está en cero.

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

PUERTOS EPROM/RAM POSICIONES DE E/S EPROM/RAM

Page 180: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

161

Fig. 5.25 Ubicación del bloque de 2Kbytes en el espacio de 64 K de memoria.

Una decodificación completa de las direcciones es posible por el uso de cir-cuitos decodificadores. Como resultado, una y solo una posición corresponderá al contenido del bus en un momento determinado. A cada dispositivo componente del sistema se le asigna con exclusividad una zona del espacio total de direcciones de memoria. En el µC de la figura 3.51 se usaron puertas OR discretas para decodificar en forma exhaustiva los 512 bytes de la memoria de lectura/escritura del microcom-putador.

Ejemplo 5.1

Suponga que desea decodificar, usando lógica SSI, una memoria EPROM

2764 de 8Kbytes para el rango de direcciones 0000H—1FFFH. El estado de las líneas del bus en el rango especificado es el mostrado en la tabla 5.9.

Tabla. 5.9 Direcciones del bloque de 8K de una memoria 2764

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

0-2K

4K-6K

8K-10K

12K-14K

16K-18K

60K-62K

20K-22K

0000H

FFFFH

Page 181: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

162

Para todas las direcciones en el área de la EPROM, las líneas A13-A15 están en nivel bajo y durante una lectura en memoria la salida de control M/IO también esta-rá en cero. De modo que utilizando estas condiciones y aplicando RD a la entrada de habilitación de salidas OE de la 2732, se puede seleccionar la memoria, como sugiere el circuito de la figura 5.26.

Fig. 5.26 Decodificador de direcciones de la EPROM 2764

Otra posibilidad para la decodificación de la 2764, es utilizar la señal de con-trol de lectura en memoria MRD , en lugar de RD , para habilitar las salidas de la EPROM. Haciendo esto, el circuito decodificador se simplifica como indica el dia-grama eléctrico de la figura 5.27.

Fig. 5.27 Decodificador de direcciones de la EPROM 2764, usando MRD

Page 182: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

163

El decodificador de la figura 5.27 deja abierta la posibilidad que en una opera-ción de acceso a puerto, la entrada de selección CE vaya a nivel lógico cero. Esto no representa un problema, porque MRD estará en uno y las salidas de datos de la EPROM permanecerán flotantes. El uso de lógica integrada en escala pequeña para realizar el decodificador de direcciones no es una buena elección. Tal arreglo no es práctico porque obliga a que cada componente tenga su propio decodificador con puertas discretas, aumentando el costo del sistema. Más conveniente es usar circuitos MSI como decodificadores de direcciones. Los más usados en aplicaciones con µP son:

8205 1 de 8 74LS139 2 a 4 74LS138 3 a 8 74LS154 4 a 1 74LS155 2 a 4 74LS156 2 a 4

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 x x 1 x x x 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1

Fig. 5.28 Tabla de la verdad del decodificador 74LS138

Con un 74LS138 único es posible seleccionar hasta ocho dispositivos diferen-

tes de memoria o de puertos de entrada y salida. El circuito decodificador tiene ocho salidas ( 70 YY − ), activas en nivel bajo; tres entradas de selección de salidas (A,B y C) y tres entradas de habilitación del circuito (G1, B2GyA2G ) Para que una salida

iY esté en cero lógico, la entrada G1 debe estar en nivel alto y las entradas

B2GyA2G deben estar en nivel bajo.

A B C

G2A G2B

G1

GND

Vcc 0Y

1Y

2Y

3Y

4Y

5Y

6Y

7Y

74LS138

Page 183: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

164

Por medio de las líneas A,B y C se especifica cual de las ocho salidas se acti-vará. La EPROM 2732 funciona igual que la memoria 2716, pero tiene 12 líneas de direcciones (A0-A11) para permitir el acceso a las 4096 posiciones del dispositivo. Las direcciones ocupadas por cada chip 2732 son las indicadas por la tabla siguiente:

Tabla. 5.9 Cada 2732 ocupa un

bloque de 4K.

EPROM DIRECCIÓN 0 0000H-0FFFH 1 1000H-1FFFH 2 2000H-2FFFH 3 3000H-3FFFH 4 4000H-4FFFH 5 5000H-5FFFH 6 6000H-6FFFH 7 7000H-7FFFH

El estado de cada línea de direcciones para los 32Kbytes de memoria suplidos por el arreglo de EPROM se presenta en la tabla 5.10. Para cada bloque se muestra la dirección inicial y final.

Tabla. 5.10 Bloques de memoria de 4K asignados a cada una de las 2732.

El circuito decodificador de direcciones para las ocho 2732, es el presentado

en la figura 5.40. Observe que para todo el espacio de 32K, la línea de direcciones A15 permanece en nivel bajo, mientras que los bits A12-A14 muestran una progresión binaria desde una EPROM a la siguiente. Forzando la entrada G1 a nivel alto y conec-tado la línea de dirección A15 a A2G y la señal M/IO a B2G , el decodificador será habilitado cada vez que el bus de direcciones identifique una posición de memoria

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

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

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

. . . . . . . . . . . . . . . .

EPROM 0 EPROM 1 EPROM 2 EPROM 7

0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Page 184: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

165

comprendida entre 0000H y 7FFFH. El bloque particular seleccionado lo establecen las líneas A12-A14, las cuales se aplican a las entradas A, B y C del 74LS138.

Fig. 5.29 Un 74LS138 selecciona hasta 8 dispositivos de memoria.

El uso de la salida M/IO del µP para seleccionar el 74LS138 de la figura

5.40, garantiza que durante una operación de E/S todas las EPROM funcionarán en el modo de bajo consumo, debido a que el circuito decodificador estará deshabilitado ( M/IO =1) con todas sus salidas en nivel alto. Conviene resaltar que la señal RD pudo usarse, en lugar de MRD , para habilitar las salidas de la memoria EPROM se-leccionada.

Ejemplo 5.3

Suponga que se tiene un sistema con 4 Kbytes de EPROM (2732), 2Kbytes de

RWM (6116) y un PPI 8255. Para seleccionar los componentes se debe usar un deco-dificador doble 2 a 4 con código 74LS139. Este circuito fue usado en el capitulo 3 como decodificador de puertos. En la figura 5.30 se repite la tabla de funcionamiento del chip.

G B A 1 X x 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1

Fig. 5.30 Tabla de la verdad del decodificador 74LS139

Las direcciones se asignan a cada componente de acuerdo con lo indicado por

la figura 5.11.

3Y 2Y 1Y 0Y

Ga Aa

GND

Vcc

b0Yb1Yb2Yb3Y

a0Y74LS139

Ba

a1Y

a2Y

a3Y

Gb Ab Bb

Page 185: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

166

Tabla. 5.11 Direcciones para las secciones de memoria y E/S

DISPOSITIVO DIRECCIÓN EPROM 2732 0000H-0FFFH

RAM 6116 1000H-17FFH PUERTO A 8255 00H PUERTO B 01H PUERTO C 02H

REG. COMANDO 03H La tabla de estado de las líneas de direcciones del sistema es la que sigue y el

circuito decodificador se muestra en la figura 5.31. Observe que se hace una decodifi-cación parcial de la dirección de los puertos del 8255.

Tabla. 5.12 Tabla de direcciones para las secciones de memoria y E/S

Como señala la tabla 5.12, aunque la memoria 6116 tiene sólo 2Kbytes de ca-

pacidad, ocupa el área de 4 Kbytes en el rango direcciones comprendo desde 1000H hasta 1FFFH. De modo que el usuario del sistema debe evitar programar accesos a las direcciones no válidas de la memoria de lectura/escritura.

Ejemplo 5.4

En este ejemplo se discute el funcionamiento del decodificador de direcciones

de un µC comercial. El MPR-85 PLUS es un microcomputador de bajo costo pero muy completo basado el 8085A, el cual es utilizado para realizar las prácticas del Laboratorio de Sistemas de Microprocesadores en el Departamento de Electricidad. El MPR-85 tiene en la tarjeta de circuito impreso, incorporados 16K de EPROM (27128), 16K de RWM (2x6264), dos dispositivos 8155, dos PPI 8255 y un controla-dor de teclado/display 8279. Además, se proveen señales de selección para expansio-nes futuras de memoria y puertos de E/S.

El circuito para decodificación de las direcciones del microcomputador fue di-señado usando dos decodificadores 2 a 4 del tipo 74LS156. En la tabla 5.13 se pre-senta la asignación de direcciones para memoria y puertos, la cual fue reproducida del manual de operación del MPR-85.

EPROM RWM

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . . . . . . . . . . . . . .

0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1

0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 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 . . . . . . . . . . . . . . . .

Page 186: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

167

Fig. 5.31 Circuito decodificador de direcciones y de puertos.

Page 187: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

168

El MPR-85 utiliza las señales de control MRD , MRW , IORD e IOWR para tener acceso a la memoria y a los puertos de E/S. Como indica la tabla de direcciones de la figura 5.45, los circuitos de memoria y puertos se seleccionan usando señales comunes. Por ejemplo, la salida 3CS 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) MONITOR DEL SISTEMA

0000H-3FFFH

0CS

00H-3FH

8255 N°2 EXPANSIÓN DE PUERTOS

8155 N°1 256 bytes de RWM

4000H-4FFFH

1CS

40H-4FH

8155 N°1

8155 N°2 256 bytes de RWM

5000H-5FFFH

2CS

50H-5FH

8155 N°2

6264/2764 HASTA 8K DE RWM O

EPROM

6000H-7FFFH

3CS

60H-7FH

8729 CONTROLADOR DE TECLADO/DISPLAY

6264/2764 HASTA 8K DE RWM O

EPROM

8000H-9FFFH

4CS

80H-9FH

8255 N°1

4K PARA EXPANSION A000H-AFFFH 5CS A0H-AFH EXPANSIÓN

2K PARA EXPANSION B000H-B7FFH 6CS B0H-BFH EXPANSIÓN

2K PARA EXPANSION B800H-BFFFH 7CS B8H-BFH EXPANSIÓN

El encapsulado del 74LS156 contiene dos decodificadores individuales, los

cuales operan como indica la tabla de la figura 5.32. El diagrama eléctrico de la sec-ción de decodificación del MPR-85 es el presentado en la figura 5.33.

1C B A 1 x x x 1 1 1 1 X 0 x x 1 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 B A

1 x x x 1 1 1 1 X 1 x x 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1

Fig. 5.32 Tabla de la verdad del decodificador 74LS15

1C G1

GND

Vcc

3Y1 74LS156

B

2Y1

1Y1

0Y1

C2G2

3Y22Y21Y20Y2

A

a3Y a2Y a1Y a0YG1

G2 C2 b3Y b2Y b1Y b0Y

Page 188: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

169

Fig. 5.33 Decodificador de direcciones del µC MPR-85.

Page 189: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

170

El decodificador marcado U1 en la figura 5.33, genera las señales de selección de la EPROM 27128, de los 8155 N°1 y N°2 y de la memoria RWM 2764. Las co-nexiones seleccionadas para el 74LS156 dividen en bloques de 4K, los primeros 32K del espacio total de memoria. Esto puede verificarse en la tabla 5.14.

Tabla. 5.14 Direcciones para las secciones de memoria y E/S seleccionadas por U1.

En los primeros 16K del espacio de memoria del µP, las líneas de dirección

A15 y A14 (conectadas a C2yG2 ) 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 iY2 del de-codificador 2 contenido en U1, estará en cero. Como las salidas del 74LS156 son a colector abierto, uniendo las 4 salidas iY2 se obtiene una función AND cableada, cuya salida corresponde a 0CS .

El decodificador 1 de U1 tiene las entradas de habilitación: C1yG1 , 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

0Y1 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.

A3 A2 A1 A0 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

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 0 0 0 0 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

0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1

EPROM 4 X 4K RWM

256 bytes

RWM

256 bytes RWM 2 X 4K

0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 1 0 1 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 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 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

Page 190: Microprocesadores-Luis Urdaneta

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 ,

2Y1 y

3Y1 . 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 3CS0CS − operan sobre los primeros 32Kbytes del espacio de memoria. Por medio de U2, se generan los comandos 7CS4CS − , 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.

El espacio de direcciones de la tabla anterior se presenta dividido en bloques

de 2K. Una dirección entre los primeros 8K genera el comando de selección 4CS , mediante el cableado de las cuatro salidas del decodificador 2 de U2. Observe que en estos cuatro bloques de 2K, las líneas A12 y A11 (aplicadas a las entradas B y A) muestran una progresión binaria de un bloque de 2K al próximo y que A13 (conectada a la entrada de habilitación C2 ) permanece en nivel bajo. Finalmente, la combina-ción lógica de las líneas de direcciones A15 y A14, realizada por las puertas U3A y U3B, fuerzan a cero la otra entrada de habilitación G2 .

Para entender como se genera las señales 7CS5CS − , basta con inspeccionar

la tabla de direcciones de la figura 5.49. Los 4K entre A000H y AFFFH son seleccio-

A3 A2 A1 A0 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4

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

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 1 0 0 0 0 0 0 0 0 0 0 0 0 0

1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1

1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

RWM 4 X 2K EXPANSIÓN 4Kbytes EXPANSIÓN 2Kbytes EXPANSIÓN 2Kbytes

1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

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 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0

1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 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 1 1

Page 191: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

172

nados por 5CS , la cual es generada por la AND implícita con entradas 10 Y1yY1 . Los siguientes dos bloques de 2K se reservan para expansión y son seleccionados por

6CS y 7CS . 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

0CS también habilita un 8255 N° 2, al cual se le ha previsto en el circuito impreso una base para expansión. Los puertos de este dispositivo están situados entre 00H y 3FH. De este rango de 64 bytes, se asigna al puerto de comando la dirección 00H y las direcciones 01H, 02H y 03H a los puertos de E/S A, B, y C, respectivamente. Las posiciones restantes dentro del rango se consideran inválidas. El modo como se asig-nan las direcciones de todos los puertos, es la presentada en la tabla siguiente:

Tabla. 5.16 Direcciones de puertos de E/S

Ejemplo 5.5 Para finalizar esta sección, se presenta un ejemplo final de decodificación de

puertos usando E/S aislada. Considere que se tienen dos PPI 8255A y un puerto de salida realizado con un registro paralelo 74LS374. Las direcciones de los puertos se muestran en la tabla 5.17 y el circuito en la figura 5.34.

Fig. 5.17 Tabla de direcciones de puertos. 8255 #1 Puerto A 20H Puerto B 21H Puerto C 22H Comando 23H 8255 #2 Puerto A 24H Puerto B 25H Puerto C 26H Comando 27H 74LS374 28H*

A1= A0 =0

PUERTO FUNCIÓN DISPOSITIVO PUERTO FUNCIÓN DISPOSITIVO00H PUERTO A 50H CONTROL 01H PUERTO B 51H PUERTO A 02H PUERTO C 8255 N° 2 52H PUERTO B 03H COMANDO 53H PUERTO C 8155 N° 2

04H-3FH no válidas 54H LSB TIMER 40H CONTROL 55H MSB DEL TIMER 41H PUERTO A 56H-5FH no válidas 42H PUERTO B 60H PUERTO DATOS 43H PUERTO C 8155 N° 1 61H PUERTO CONTROL 8279 44H LSB TIMER 62H-7FH no válidas 45H MSB DEL TIMER 80H PUERTO A

46H-4FH no válidas 81H PUERTO B 82H PUERTO C 8255 N° 2 83H COMANDO 84H-8FH no válidas A0H-BFH --------------- EXPANSIÓN

Page 192: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

173

Fig. 5.34 Decodificación completa de 7 puertos usando un 74LS138.

El decodificador de la figura 5.34 realiza una decodificación exhaustiva de los puertos de los 8255 y del registro paralelo.

5.4 PUERTOS DE E/S SELECCIONADOS COMO MEMORIA El método usado hasta ahora para seleccionar los puertos de E/S, se basa en el

hecho que el espacio de direcciones de memoria está separado del espacio de puertos de E/S. Durante una operación de lectura o escritura, el µP usa la señal M/IO para notificar a los dispositivos externos cuando la dirección presente en el bus correspon-de a una posición de memoria o a un puerto de E/S. Lo registros de puertos son dise-ñados para responder a las señales de control IORD o IOWR y para ser selecciona-dos por una señal CS de habilitación.

Este procedimiento de manejo de puertos se conoce como el método de e/s es-

tándar o de E/S aislada y sólo permite acceso a puertos por medio de las instrucciones

Page 193: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

174

IN puerto y OUT puerto. Usando está técnica, pueden controlarse hasta 512 registros externos (256 de entrada y 256 de salida). Recuerde que en estas instrucciones la di-rección del puerto la especifica el segundo byte de la instrucción, y el número máxi-mo que puede representarse con ocho bits es 255. Otra limitación de esté método es que sólo consiente transferencias entre el puerto seleccionado y el registro acumula-dor. Una estrategia de acceso a puertos que permite superar la limitación del número de puertos impuesta por el método estándar, es el método de E/S mapeada como memoria. Esta técnica trata a los puertos como posiciones convencionales de memo-ria, fusionando en un mapa único el espacio de direcciones de memoria y de puertos. Por esta razón se hace innecesario el uso de decodificadores independientes para memoria y E/S.

Una desventaja que se puede percibir de inmediato del mapeo de E/S como

memoria, es que reduce la cantidad de memoria disponible, debido a que una porción de ésta es cedida para los puertos. Si el sistema tiene menos de 32Kbytes de memoria, la línea A15 no es utilizada para identificar posiciones de memoria, de modo que des-tinando este bit de dirección para distinguir entre un acceso a memoria (A15 = 0) y una operación con puertos (A15 = 1), se dispondrá de 32K direcciones de E/S almace-namiento, sin usar la memoria instalada.

El mapeo de E/S a memoria no solo aumenta el número de puertos del µC, si-

no que permite el uso para control de puertos de toda instrucción que haga referencia a memoria. Esto simplifica la programación de las rutinas de manejo de periféricos. Por ejemplo, ejecutando a instrucción MOV r, M se transfiere el contenido de un puerto de entrada a cualquiera de los registros internos del µP; XRA M realiza la fun-ción OR exclusivo entre dato en el puerto de entrada y el acumulador; LHLD direc-ción transfiere los datos en dos puertos hacia los registros H y L; SHLD dirección traslada los 16 bits en HL a dos puertos de salida; SUB M substrae el contenido de un puerto de entrada del dato en el acumulador. Estos son sólo algunos pocos ejemplos de instrucciones que usan la memoria.

La figura 5.35 ilustra como puede tratarse la sección de puertos de un 8755 y

de un 8255, como si fuesen localidades de memoria. Para el 8755, la línea A15 deter-mina cuando el acceso se realiza a la sección de 2K de la memoria EPROM o los re-gistros del circuito. Para acceder a un puerto basta con sumar 8000H a la dirección. Por ejemplo si el puerto B del 8755 ha sido programado como salida y se desea mo-ver a este puerto el contenido del acumulador, debe ejecutarse STA 8001H. Esta ins-trucción transfiere el contenido del A en la posición de memoria especificada por el operando de la instrucción. Pero como A15 está en nivel alto, el destino será el puerto B (de dirección xxxxxx01) del 8755. Para el 8255 el procedimiento es el mismo. En ambos casos, los periféricos responderán a las señales de control RD y WR .

Si el programador de un sistema sabe que no debe usar las instrucciones IN

puerto y OUT puerto, porque los registros externos son considerados posiciones de memoria no es necesario decodificar las salida M/IO para tener acceso a los puertos.

Page 194: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

175

8755 DIRECCIÓN DE MEMORIA 0 x x x 0 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

DIRECCIÓN DE PUERTO

1 x x x 0 x x x x x x x x x A1 A0

8255 DIRECCIÓN DE PUERTO 1 0 0 0 x x x x x x x x x x A1 A0

Fig. 5.35 Los puertos de E/S del 8755 y del 8255 son tratados como posiciones de memoria.

En el siguiente ejemplo se presenta un decodificador de direcciones de un µC usando el método de E/S mapeada en memoria.

Page 195: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

176

Ejemplo 5.6

El espacio de direcciones comprendido entre 0000H y 3FFFH es dividido en bloques de 2K, como indica la tabla 5.18. Cada bloque es seleccionado por las líneas A13, A12 y A11. Para habilitar el circuito 74LS138 se usan los las líneas de direcciones A14 y A15, las cuales permanecen en cero en el rango especificado.

Fig. 5.36 El decodificador de direcciones permite al acceso a 16Kbytes de memoria.

Tabla. 5.18 Tabla de direcciones de cada bloque de 2K.

CS DIRECCIÓN DISPOSITIVO

0CS 0000H-07FFH EPROM

1CS 0800H-0FFFH RWM

2CS 1000H-17FFH TECLADO

3CS 1800H-1FFFH DISPLAY

4CS 2000H-27FFH ENTRADA

5CS 2800H-2FFFH SALIDA

6CS 3000H-37FFH OTRO

7CS 3800H-3FFFH OTRO

La selección del chip es completada por la salida de la puerta NAND, la cual

va a uno durante una operación de lectura o escritura. Cada salida del decodificador es una señal de selección CS de dispositivos de memoria o de E/S. Las direcciones correspondientes a cada salida del decodificador son las mostradas en la tabla 5.18.

Para finalizar esta sección, se presenta en la figura 5.38 el subsistema de me-

moria y puertos de un sistema 8085. Para el diseño del decodificador de puertos se usa la técnica de mapeo a memoria. La 27256 es una EPROM de 32 Kbytes y es se-leccionada por medio de la línea A15, lo cual sitúa el circuito en los primeros 32 Kby-tes del espacio de direcciones del µP. Para activar las salidas O0-O7 de la memoria, se conecta la señal de control de lectura RD a la entrada OE de habilitación de salidas del dispositivo. Para seleccionar el grupo de tres memorias RWM 6116 y el 8255, se usa un decodificador 74LS138. La conexión de la línea A15 a la entrada de selección G1del decodificador, garantiza que este permanecerá deshabilitado, con todas sus salidas en nivel alto, durante operaciones de lectura a la EPROM. Cualquier dirección en el bus a partir de la posición 8000H, pondrá el bit A15 en uno habilitando el

Page 196: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

177

74LS138. Las líneas A14, A13 y A12 (conectadas C, A, y B) determinan cual de las salidas del decodificador se activará, para seleccionar un área de 4K (la 6116 solo usa 2K) en el bloque superior de 32 K del espacio de direcciones. Las direcciones de ac-tivación de las salidas del decodificador se muestran en la en la tabla 5.19 y el mapa de direcciones de los componentes conectados al sistema en la figura 5.37.

Tabla. 5.19 Tabla de direcciones de cada bloque de 2K.

CS DIRECCIÓN DISPOSITIVO

0CS 8000H-87FFH 27256

1CS 9000H-97FFH 6116

2CS A000H-A7FFH 6116

3CS B000H-B7FFH 8255 PUERTO A B000H

4CS C000H-C7FFH SIN USO PUERTO A B001H

5CS D000H-D7FFH SIN USO PUERTO A B002H

6CS E000H-E7FFH SIN USO COMANDO B003H

7CS F000H-F7FFH SIN USO

DIRECCIÓN DATOS

0000H 0000 0000 0000 0000

.

.

.

.

.

. 7FFFH 0111 1111 1111 1111

8000H 1000 0000 0000 0000

. 87FFH

.

. 1000 0111 1111 1111

. 8FFFH 1000 1111 1111 1111

9000H 1001 0000 0000 0000

. 97FFH

.

. 1001 0111 1111 1111

. 9FFFH 1001 1111 1111 1111

A000H 1010 0000 0000 0000

. A7FFH

.

. 1010 0111 1111 1111.

. AFFFH 1010 1111 1111 1111

B000H 1011 0000 0000 0000

. B7FFH

.

. 1011 0111 1111 1111

BFFFH 1011 1111 1111 1111

Fig. 5.37 Mapa de memoria para el sistema de la figura 5.38.

32 K EPROM

2 K RWM

2 K RWM

2 K RWM

8255

Page 197: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

178

Fig. 5.38 Decodificador de direcciones para 32K de EPROM, 6K de RWM y un PPI 8255

Page 198: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

179

5.5 DECODIFICADOR CON DISPOSITIVOS PROGRAMABLES

Además de usando puertas discretas y circuitos integrados MSI, el decodifica-dor de direcciones puede realizarse usando algún tipo de dispositivo lógico progra-mable (PLD). Estos componentes ahorran espacio en la tarjeta del circuito impreso, su estructura es apropiada para el uso como decodificador y mantienen la confiden-cialidad de la lógica programada. Para ilustrar las ventajas del uso de PLD, considere el siguiente ejemplo.

Ejemplo 5.7

Bebe diseñarse un decodificador de direcciones para un subsistema de memo-

ria compuesto por 4 Kbytes de EPROM (1 x 4K), 8 Kbytes de EEPROM (1 x 8K) y 52 Kbytes de RWM (1 x 32K, 1 x 16K y 1x 4K). El espacio de memoria de la aplica-ción es distribuido como indica el mapa de la figura 5.39.

En principio, se observa que el circuito de memoria conectado al sistema y

que tiene menor capacidad es el módulo de 4K (212), de modo que para el diseño del decodificador se divide el espació de 64Kbytes de memoria en bloques de 4Kbytes. Esto significa que se usan los bits de dirección A12-A15 para seleccionar el circuito integrado al cual corresponde la dirección a la cual se desea acceso. La tabla 5.20 muestra el rango de direcciones en el cual se habilita cada salida del decodificador.

Fig. 5.39 Mapa de memoria para el sistema ejemplo de decodificador con PLD

0000H

0FFFH1000H

2FFFH3000H

AFFFH

B000H

EFFFH

FFFFH

F000H

EPROM

EEPROM

SRWM

SRWM

SRWM

Page 199: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

180

Tabla. 5.20 Tabla de estados del decodificador de direcciones con PLD.

A15 A14 A13 A12 CS0 CS1 CS2 CS3 CS4 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1

1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0

Las ecuaciones lógicas de las señales de selección de chip obtenidas a partir

de la información suministrada por la tabla de estados, son:

El decodificador de direcciones realizado con circuitos 74LS138, se muestra

en la figura 5.41. Como alternativa para el diseño del decodificador especificado, las ecuaciones del decodificador pueden programarse en un dispositivo PAL. Un circuito programable comercial de amplio uso en aplicaciones combinatorias es el de código PAL16L8. La figura 5.40 muestra el diagrama de distribución de terminales y en la figura 5.42 se presenta la estructura interna del chip.

Fig. 5.40 Distribución de terminales para el circuito PAL16L8.

0 15 14 13 12

1 15 14 13 12 13 12

2 15 14 15 13 12 15 14 12 15 14 13

3 15 14 12 14 13 14 13 12

4 15 14 13 12

CS A A A A

CS A A A A A A

CS A A A A A A A A A A A

CS A A A A A A A A

CS A A A A

= + + +

= + + ⋅ + ⋅

= ⋅ + ⋅ ⋅ + ⋅ ⋅ + ⋅ ⋅

= + ⋅ + ⋅ + ⋅ ⋅

= + + +

Page 200: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

181

Fig. 5.41 Decodificador de direcciones usando decodificadores convencionales.

Page 201: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

182

Fig. 5.42 Diagrama lógico de la PAL16L8 La estructura interna de la PAL16L8 determina que el circuito integrado solo

puede ejecutar funciones lógicas cuyas ecuaciones tengan siete o menos términos de

I1

I2

I3

I4

I5

I6

I7

I8

I9

O1 IO2

IO3 IO4 IO5 IO6 IO7 O8 I10

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 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

32 33 34 35 36 37 38

39

40 41 42 43 44 45 46 47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Page 202: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

183

productos. Seis de los terminales de salida son bidireccionales de modo que pueden ser usados como entradas.

Para propósitos de desarrollo del programa a grabar en la PAL puede usarse

cualquiera de los lenguajes compiladores existentes para descripción de hardware, tales como: ABEL, VHDL, VERILOG, ORCAD/PLD, ONCUPL... y otros. A continua-ción se presentan dos versiones de un programa escrito en lenguaje VHDL y que per-miten generar el archivo de mapa de fusibles necesario para programar el decodifica-dor de direcciones en una PAL16L8. El primer código describe, usando ecuaciones, la estructura lógica del decodificador y el otro programa define el comportamiento fun-cional del circuito. Si se usa la segunda opción no es necesario usar las técnicas con-vencionales de diseño digital, debido a que no se requiere especificar las ecuaciones.

library ieee; use ieee.std_logic_1164.all; entity decdir is port ( A12, A13,A14,A15: in std_logic; CS0, CS1, CS2, CS3, CS4: out std_logic ); end decdir; architecture rtl of decdir is begin

CS0 <= A15 or A14 or A13 or A12; CS1 <= A15 or A14 or(A13 and A12)or((not A13)and(not A12));

CS2<= (A15 and A14)or (A15 and A13 and A12)or((not A15)and (not A14) and(not A13))or ((not A15)and (not A14) and (not A12));

CS3 <=(not A15)or((not A14)and(not A12))or((not A14)and(not A13))or(A14 and A13 and A12);

CS4 <= not(A15)or(not A14)or(not A13)or not(A12); end rtl; library IEEE; use IEEE.STD_LOGIC_1164.all; entity DECODIR is port ( A : in STD_LOGIC_VECTOR (15 downto 12); CS : out STD_LOGIC_VECTOR (4 downto 0) ); end DECODIR; architecture BEHAVIOR of DECODIR is begin process (A,CS) begin case A is when "0000" => CS <= "11110"; when "0001" => CS <= "11101"; when "0010" => CS <= "11101"; when "1011" => CS <= "10111"; when "1100" => CS <= "10111"; when "1101" => CS <= "10111"; when "1110" => CS <= "10111"; when "1111" => CS <= "01111"; when others => CS <= "11011"; end case; end process; end BEHAVIOR;

Page 203: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

184

La herramienta usada para generar el archivo de programación de la PAL es ORCAD EXPRESS 9.1. La información siguiente es generada por el software ************************************************************************ OrCAD Simple PLD Fitter tools ************************************************************************ OrCAD PLD FITTER x1.11 11/5/98 (Source file C:\Program Files\OrCAD\CAPTURE\EJEMPLOS\DECODER\Timed \DECODER.jed) Copyright (C) 1988-1998 OrCAD All Rights Reserved. RESOLVED EXPRESSIONS (Reduction 2) Signal name Row Terms CS0' 9 A12' A13' A14' A15' CS1' 17 A12' A13 A14' A15' 18 A12 A13' A14' A15' CS2' 25 A12' A14' A15 26 A12 A13 A15' 27 A13' A14' A15 28 A14 A15' CS3' 33 A12 A13 A14' A15 34 A12' A14 A15 35 A13' A14 A15 CS4' 41 A12 A13 A14 A15 SIGNAL ASSIGNMENT Rows Pin Signal name Column -------------- Activity Beg Avail Used 1. A12 2 - - - High 2. A13 0 - - - High 3. A14 4 - - - High 4. A15 8 - - - High 5. - 12 - - - 6. - 16 - - - 7. - 20 - - - 8. - 24 - - - 9. - 28 - - - 11. - 30 - - - 12. - - 56 8 0 (Three-state) 13. - 26 48 8 0 (Three-state) 14. CS4 22 40 8 1 High (Three-state) 15. CS3 18 32 8 3 High (Three-state) 16. CS2 14 24 8 4 High (Three-state) 17. CS1 10 16 8 2 High (Three-state) 18. CS0 6 8 8 1 High (Three-state) 19. - - 0 8 0 (Three-state) ---- ---- 64 11 (17%) 7. Checking for error conditions NOTE (PLD0200) No fatal errors found in input file. NOTE (PLD0201) No warnings.

Page 204: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

185

FUSE MAP FOR PAL16L8 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 32 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 64 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 96 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 128 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 160 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 192 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 224 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 256 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 288 -x -x -x -- -x -- -- -- -- -- -- -- -- -- -- -- 320 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 352 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 384 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 416 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 448 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 480 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 512 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 544 -x x- -x -- -x -- -- -- -- -- -- -- -- -- -- -- 576 x- -x -x -- -x -- -- -- -- -- -- -- -- -- -- -- 608 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 640 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 672 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 704 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 736 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 768 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 800 x- x- -- -- -x -- -- -- -- -- -- -- -- -- -- -- 832 -x -- -x -- x- -- -- -- -- -- -- -- -- -- -- -- 864 -- -x -x -- x- -- -- -- -- -- -- -- -- -- -- -- 896 -- -- x- -- -x -- -- -- -- -- -- -- -- -- -- -- 928 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 960 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 992 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1024 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1056 x- x- -x -- x- -- -- -- -- -- -- -- -- -- -- -- 1088 -x -- x- -- x- -- -- -- -- -- -- -- -- -- -- -- 1120 -- -x x- -- x- -- -- -- -- -- -- -- -- -- -- -- 1152 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1184 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1216 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1248 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1280 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1312 x- x- x- -- x- -- -- -- -- -- -- -- -- -- -- -- 1344 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1376 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1408 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1440 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1472 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1504 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1536 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1568 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1600 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1632 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1664 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1696 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1728 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1760 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1792 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1824 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1856 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1888 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1920 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1952 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 1984 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 2016 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx Legend: x fuse intact

Page 205: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

186

- fuse open 475 fuses open of 2048 total. OrCAD PLD EXPRESS Type: PAL16L8 * QP20* QF2048* QV1024* F0* L0256 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 * L0288 10 10 10 11 10 11 11 11 11 11 11 11 11 11 11 11 * L0512 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 * L0544 10 01 10 11 10 11 11 11 11 11 11 11 11 11 11 11 * L0576 01 10 10 11 10 11 11 11 11 11 11 11 11 11 11 11 * L0768 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 * L0800 01 01 11 11 10 11 11 11 11 11 11 11 11 11 11 11 * L0832 10 11 10 11 01 11 11 11 11 11 11 11 11 11 11 11 * L0864 11 10 10 11 01 11 11 11 11 11 11 11 11 11 11 11 * L0896 11 11 01 11 10 11 11 11 11 11 11 11 11 11 11 11 * L1024 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 * L1056 01 01 10 11 01 11 11 11 11 11 11 11 11 11 11 11 * L1088 10 11 01 11 01 11 11 11 11 11 11 11 11 11 11 11 * L1120 11 10 01 11 01 11 11 11 11 11 11 11 11 11 11 11 * L1280 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 * L1312 01 01 01 11 01 11 11 11 11 11 11 11 11 11 11 11 * C3E74* NOTE (PLD0202) 1/23/4 10:46 am (Friday) NOTE (PLD0204) Elapsed time 4 seconds

En la figura 5.43 se muestra el circuito decodificador usando la PAL16L8 y en

la figura 5.44 se muestra el arreglo interno de fusibles para la salida CS0 del decodi-ficador de direcciones.

Fig. 5.43 Decodificador de direcciones con PAL.

El decodificador de direcciones cuyo diagrama eléctrico se muestra en la fi-gura 5.43 no discrimina entre accesos a memoria o a puertos de E/S, por lo cual de-ben usarse las señales MRD y MWR para leer o escribir en el dispositivo de memoria seleccionado.

Page 206: Microprocesadores-Luis Urdaneta

El Microcomputador Básico 187

Fig.5.44. Patrón de fusibles para la salida CS0 del decodificador de direcciones.

I2

I3

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

8 9 10 11 12 13 14 15

X X X X

I1

IO2

Page 207: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

188

5.6 CONSIDERACIONES ADICIONALES SOBRE INTERCO-NEXIÓN A LOS BUSES DEL 8085A

Todo circuito conectado a un terminal de salida del 8085A produce efectos que pueden afectar eventualmente el funcionamiento normal del sistema microcom-putador. En primer término, la carga total conectada a un pin de salida puede sobre-cargar al terminal con consecuencias severas para el nivel lógico presente en la línea. En segundo lugar, la lógica usada para decodificación introduce retardos en la propa-gación de las señales, los cuales deben ser tomados en cuenta para el cálculo del tiempo de acceso de los chips de memoria a conectar al sistema. En esta sección se discuten brevemente ambos aspectos.

5.6.1 Carga máxima del bus del 8085A

Si el sistema está acoplado a muchos circuitos de memoria o si el µC va a ser interconectado con distintos tipos de interfaces, debe dedicarse especial atención a la capacidad de corriente de los terminales del µP. Una línea de salida del 8085A, cuan-do está en nivel alto, es capaz de entregar una corriente máxima IOH de 400 µA, mien-tras que un terminal de salida en cero puede admitir una corriente máxima IOL de 2 mA. Si estos valores máximos son respetados, el terminal mantendrá su nivel lógico.

Estas características eléctricas DC fijan cuantas entradas puede guiar cada terminal de salida del µP, sin deterioro del nivel lógico de la línea. Como ejemplo de algunas posibilidades, las siguientes cargas pueden conectarse directamente a un pin de salida del 8085:

• 1 TTL + 1 LSTTL • 5 LSTTL • 10 ALSTTL.

Si en una aplicación determinada se exceden estos límites, será necesario el

uso de circuitos buffers para realizar la conexión de la señal sobrecargada. Lo usual es conectar amplificadores de corriente a las líneas de direcciones y de datos, aunque en ciertos casos puede ser necesario para alguna líneas de control, tales como RD , WR e M/IO .

Para reforzar la capacidad de corriente del bus de direcciones/datos AD0-AD7,

puede usarse un circuito 74LS245, el cual está especialmente diseñado para acopla-miento a buses bidireccionales de 8 bits. Como ilustra la figura 5.45, el circuito es habilitado conectando la entrada G a cero. La dirección del flujo de datos es fijada por la entrada de control de dirección DIR, a la cual se conecta la señal RD . El 74LS245 es capaz de suministrar una corriente de 15 mA (IOH) mientras que la co-rriente IOL es de 24 mA.

Page 208: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

189

Fig. 5.45 Conexión de guiadores de bus al 8085A

Para incrementar la carga permisible por las líneas de la parte más significati-

va del bus de direcciones (A8-A15) se recurre a un 74LS244, el cual permanece per-manentemente habilitado, al aplicarse un nivel bajo a las entradas de selección G1 y G2 . La capacidad de corriente en nivel bajo de las salidas del chip, son idénticas

a las del 74LS245.

Page 209: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

190

El 74LS373, usado para separar el byte bajo de direcciones del bus multi-plexado AD0-AD7, puede entregar una corriente de 400 µA y drenar 8 ma. Esto hace innecesario el uso de buffers adicionales para las líneas de direcciones A0-A7.

5.6.2 Selección de la memoria del sistema

Es importante escoger el dispositivo de memoria que, teniendo costo de ad-quisición menor, cumpla con las restricciones de tiempo impuestas por el 8085A sin que sea necesaria la introducción de estados de espera. En principio, considere un ciclo de lectura típico para una memoria ROM o WRM, ilustrado en la figura 5.46

Fig. 5.46 Ciclo de lectura característico de una memoria ROM o RWM.

Los tiempos indicados son máximos y pueden considerarse como medidas de

la velocidad de la memoria. Estos lapsos se definieron para la EPROM 2716, como: tACC retardo entre aplicación de una dirección estable y la salida del dato. tCE retardo entre la selección del chip y la salida del datos. tOE retardo entre la habilitación de lectura y la salida del dato. Para la selección de la memoria los tiempos tACC, tCE y tOE deben comparase con

los lapsos permitidos por el µP para que el dispositivo externo coloque el dato en el bus. Estos tiempos se muestran en la figura 5.47.

Fig. 5.47 Ciclo de lectura del 8085A.

DIRECCIONES

CS

OE

D0-D7 tAC

C

tOE

tCE

DATO

AD0-AD7

Dato

tAD

CLK

A8-A15

ALE

tRD RD

Page 210: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

191

Los tiempos a considerar son: tAD: tiempo del cual dispone un dispone un dispositivo externo para cargar un dato válido en

el bus de datos, medido a partir de la presentación de una dirección válida en las líneas de direcciones.

tRD: lapso permitido desde la activación de la señal RD , hasta la colocación de un dato váli-

do en el bus. En la figura 5.48 se muestra un diagrama de conexión entre un 8085A y un

dispositivo de memoria. Se considera que las señales de control están acopladas por medio de buffers. Fig. 5.48 Sistema µC con acopladores de bus.

Para establecer la correspondencia entre los tiempos disponibles por la memo-

ria para la transferencia del dato y los retardos debidos a los componentes internos de la memoria, deben tomarse en consideración los tiempos de propagación de la lógica de decodificación y de los acopladores de bus.

Los tiempos de propagación a considerar son los siguientes:

8085A

AD0-AD7 D0-D7

A0-A7

SRWM

373

A8-A15

CS

ALE

A8-A15

OE WR

DAD

DB DCS

DB DL

M/IO

WR RD

Page 211: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

192

DB: retardo de los buffers de las líneas direcciones y control. DAD “ de los acopladores del bus de datos. DCS “ del decodificador de direcciones. DL “ de la lógica de generación de OE y WR . Para calcular el tiempo de acceso disponible por la memoria, se usa la expre-

sión:

∑−= iDtt 8085memorialapordisponible Como la señal de selección de circuito CS es generada directamente por lógi-

ca combinatoria cuyas entradas son las líneas de direcciones, los tiempos de interés son tAD y tRD.

tAD memoria = [tAD 8085 + tCAPB] – [DB + DCS + DAD] tRD memoria = [tRD 8085 + tCAPB] – [DB + DL + DAD] Los valores especificados para tAD y tRD en la hoja de datos del fabricante del

8085, consideran una capacidad de carga CL máxima. El uso de buffers para acopla-miento al bus, reduce notablemente esta carga capacitiva y mejora los tiempos de transición de las señales. El termino tCAPB, con un valor típico de 15 ns, es un factor de corrección para los datos y se denomina ganancia de transición por acoplamiento.

tAD memoria = [5

N T 2252+ −

⎛ ⎞⎜ ⎟⎝ ⎠

+15] – [DB + DCS + DAD] ns

tRD memoria = [3

N T 1802+ −

⎛ ⎞⎜ ⎟⎝ ⎠

+ 15] – [DB + DL + DAD] ns

Sin estados de espera y fclk = 3.125 Mhz tAD memoria = 590 – [DB + DCS + DAD] ns tRD memoria = 315 – [DB + DL + DAD] ns Los retardos no especificados se obtienen de la hoja de especificaciones de los

circuitos. Calculados los tiempos de acceso de la memoria, se comparan con los co-rrespondientes al µP para establecer que existe compatibilidad. En caso contrario existen dos opciones: si la diferencia es pequeña, se puede rediseñar la lógica para evitar que se superen los retardos máximos; o se sustituyen las memorias por otras de mayor velocidad.

Page 212: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

193

5.7 MEMORIAS EEPROM Y FLASH

Hasta hace pocos años, el dispositivo de memoria más usado para contener el código de una aplicación de sistemas empotrados fue la EPROM. La desventaja prin-cipal de estas memorias es que cuando era necesario actualizar el programa o los da-tos, se debía retirar el circuito de memoria del circuito impreso, exponerla a la luz ultravioleta para borrarla por completo, utilizar un quemador de EPROMs para regra-barla y finalmente reinsertarla en la tarjeta de la aplicación. En sistemas que requerí-an la actualización periódica de datos se usaba un dispositivo SRAM con una pila auxiliar para retener la información en ausencia de la alimentación principal.

Un nuevo tipo de memoria conocida como flash, mantiene su contenido en

ausencia de energía y además permite actualizar el código y los datos con el disposi-tivo conectado al sistema (ISP:In System Programming). Existe un amplio rango de aplicaciones de sistemas empotrados donde las memorias flash son usadas para alma-cenamiento información. Estas aplicaciones incluyen teléfonos celulares, control de motores de automóviles, unidades de reconocimiento de voz independiente del hablante y funciones activadas por voz. En estas dos últimas categorías, existe un modo de programación del equipo en el cual el usuario programa comandos de voz que deben ser almacenados en una memoria no volátil para ser recuperados poste-riormente y comparados con la entrada de voz en cualquier momento. Estos patrones de voz pueden ordenar el encendido o apagado de equipos o el marcado de un número telefónico.

Las flash también se usan en sistemas que requieren preservar información en

caso de interrupción del suministro de potencia de la red. Durante tal evento el proce-sador mueve el código y/o datos contenidos en una memoria volátil a la flash. Una vez reintegrada la energía el sistema continúa en el estado presente antes de la inte-rrupción.

Aunque las memoria tipo flash son de relativamente reciente aparición, estos

dispositivos pueden considerarse como una mejora del diseño de las PROM eléctri-camente borrables o EEPROM (Electical Eraseable Programmable Read Only Me-mory) inventadas al inicio de década de los ochenta. Un dispositivo EEPROM típico puede borrarse en 10 ms y el ciclo de escritura tiene una duración de 10 ms. En una EPROM estos lapsos son de 30 minutos y de 50 ms respectivamente. Otra ventaja resaltante es que es posible rescribir el contenido de una o algunas posiciones, al con-trario de las EPROMs que debe ser regrabadas totalmente aunque sólo deba modifi-carse un byte.

Una memoria EEPROM con características muy mejoradas con respecto a las

primeras, es el circuito integrado de código X28C64 con capacidad de 8 K x 8 e in-troducida por la empresa Xicor en el año 1991. El tiempo de acceso del dispositivo esta comprendido entre 150 ns y 250 ns dependiendo de la versión y es tan sencilla de utilizar como una memoria RWM. Aunque en las primeras EEPROM solo se podía

Page 213: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

194

escribir un byte a la vez, la X28C64 acepta la escritura de páginas de 64 bytes. En la figura 5.49 se muestra el diagrama funcional de la memoria. Observe la similitud con una RWM.

Fig. 5.49 Diagrama funcional de la X28C64

Una EEPROM tiene garantizado un número limitado de ciclos de escritura y

un tiempo máximo de retención de los datos almacenados. Una X28C64 retiene los datos por 100 años y soporta 100 mil ciclos de grabado, lo cual significa que si el diseño se hizo para 20 años pueden hacerse 13.7 reescrituras por día.

Debido a que en los sistemas empotrados no existen medios de almacena-

miento masivo como discos, las EEPROM son adecuadas para aquellas aplicaciones que requieren la retención de información. Por el límite de ciclos de escritura y por su lento tiempo de acceso, las memorias EEPROM han tenido un espectro limitado de aplicaciones. Por años han sido utilizadas como memoria de canales en sintonizado-res de televisión, como sustituto de arreglos de interruptores de configuración y para almacenamiento de constantes de calibración

Existen EEPROMs de acceso serie como el chip ST93C56 con capacidad de

256 x 8 bits y un millón de ciclos de escritura la cual se presenta en un encapsulado de 8 terminales la cual puede usarse para almacenar por largo tiempo pequeñas canti-dades de datos. Por ejemplo el circuito ST93C56 puede usarse en un registrador de llamas telefónicas para almacenar y retener el número y el tiempo de duración de las llamadas realizadas en un periodo determinado. Para acceso a este tipo de memoria se establece un lazo serie de comunicación con el dispositivo simulando un UART. La memoria tiene una entrada de reloj que permite sincronizar el envío de comandos y

Page 214: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

195

datos al chip. En la actualidad, están disponibles EEPROMs para conexión I2C con mayores capacidades. Por ejemplo la 24LC512 almacena hasta 64Kbytes.

Para interconectar una EEPROM a un sistema no se requieren técnicas distin-

tas a las explicadas antes. El chip se conecta como una memoria RWM convencional, aplicándole el pulso de escritura MWRoWR , si es necesario. La sustitución de la me-moria volátil SRAM de datos del sistema por una EEPROM no es una buena idea. El tiempo de acceso de una SRAM esta entre 15 ns-25 ns mientras que el acceso a una EEPROM puede durar entre 100 ns a 250 ns. Al contrario es una excelente idea lo que hicieron los diseñadores del microprocesador PopCorn. En un sistema basado en este procesador el código reside en una EEPROM/Flash y durante el arranque es cargado en una memoria SRAM, de modo que se puede incrementar la frecuencia del reloj del sistema sobre el valor requerido para ejecutar el código desde la memoria no volátil.

Una EEPROM/Flash puede sustituir a una EPROM para el almacenamiento

del código de la aplicación, pero si se usa ISP deben tomarse algunas previsiones y el procedimiento de sustitución no es tan directo. En un sistema empotrado capaz de realizar ISP se entiende que un computador anfitrión puede descargar código en la memoria no volátil usando un canal de comunicación, usualmente un UART, o cual-quier otro que soporte el sistema. El problema es si existe la posibilidad de borrar o escribir sobre el mismo circuito integrado que contiene el código que se está ejecu-tando. Si las rutinas de arranque del CPU y los algoritmos de programación (código cargador de ISP) comparten la misma memoria EEPROM/Flash, esta no estará dis-ponible durante ISP. En la práctica es virtualmente imposible realizar ISP de una memoria bajo el control del procesador en un sistema empotrado que contenga sólo una memoria EEPROM/Flash. El código ISP debe ejecutarse desde una memoria independiente.

Aunque las tecnologías de fabricación de memorias EEPROM y flash son

convergentes, cada una de estas es diseñada con propósito diferente. Las memorias flash fueron creadas originalmente como reemplazo de medios de almacenamiento masivo como discos flexibles y duros. De modo que son diseñadas para capacidad máxima, consumo de potencia mínimo y un gran número de ciclos de escritura. La información cargada en una flash se escribe usualmente por bloques en lugar de por bytes.

Las EEPROM se inventaron para mantener información de configuración o

para permitir reprogramar dispositivos integrados programables. Generalmente tienen capacidades de kilobits en contraposición a los megabits de las memorias flash y son escritas byte por byte o por páginas pequeñas. Normalmente, soportan pocos ciclos de escrituras debido a que fueron diseñadas para ser actualizadas ocasionalmente en lu-gar de estar sometidas a continuas actualizaciones. Algunos diseños de memorias no volátiles modernas utilizan la más nueva tecnología de fabricación de flashs para pro-porcionar a una vida más larga y mayores capacidades y densidad. Como resultado, se obtienen chips con características semejantes a las EEPROM, atenuando de esta

Page 215: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

196

forma las distinciones entre las dos categorías. Por ejemplo las flash serie son desde el punto de vista del sistema leídas y programadas byte por byte como una EEPROM convencional.

Aunque la lectura de una memoria eléctricamente borrable se realiza como si

se tratase de una EPROM o SRWM convencional, cuando deben realizarse operacio-nes como borrado, escritura de datos o protección de segmentos de memoria contra reescrituras no autorizadas., el procesador debe usar el algoritmo de programación proporcionado por el fabricante para el dispositivo. Bajo el control de este algoritmo pueden enviarse comandos a la memoria para indicarle que debe permitir la entrada de datos y toda tarea asociada con la programación. En la figura 5.50 se muestran dos modelos de programación de una memoria flash.

Fig. 5.50 Algoritmos de programación

Es usual que versiones de microcontroladores de los principales fabricantes se

presenten con alguna cantidad de memoria flash interna para permitir el desarrollo de prototipos. Si la empresa produce versiones del controlador con flash y con ROM, el diseñador puede usar la versión con flash para el prototipo y la que contiene ROM para la producción final de la aplicación. Un problema intrínseco es que el tiempo de acceso de la flash puede afectar la velocidad del sistema integral.

Por otra parte, la capacidad de la flash integrada con el CPU es usualmente de

hasta 32 Kbytes, tamaño que puede considerarse adecuado para la mayoría de las aplicaciones. No obstante, existen proyectos donde: o se usa compiladores C para desarrollo del programa o por su naturaleza deban acceder a cantidades de memoria muy superiores a la señalada. Por ejemplo, las cámaras digitales requieren muchos megabytes para almacenar las imágenes y un sistema de reconocimiento de voz pue-de necesitar ½ megabyte para retener los patrones de reconocimiento de voz. Tales sistemas no pueden ser realizados con microcontroladores con memoria flash interna debiendo usarse dispositivos de memoria externos para satisfacer las especificacio-nes.

Page 216: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

197

Una memoria flash de 512 K x 8 bits es la Am29F040 el cual es un dispositivo con acceso por sectores de 64 Kbytes y con tiempo de acceso máximo de 55 ns. La figura 5.51 muestra el símbolo lógico del chip. Observe que la interconexión a un sistema 8085A es directa, Por ejemplo pueden usarse 32 Kbytes conectando sólo las líneas de direcciones A0-A14 y dejando las restantes desconectadas.

Fig. 5.51 Memoria flash Am0F040 de 4 Mbits.

5.8 BANCOS DE MEMORIA

Aunque algunos microcontroladores modernos pueden tener acceso a un espa-cio de memoria externo de por ejemplo 2 Mbytes (PIC18C252), en los microprocesa-dores típicos de 8 bits el ancho de 16 bits del bus de direcciones impone un límite de 64K bytes al número de posiciones que el procesador puede usar para almacenar có-digo y datos. Por muchos años las aplicaciones de sistemas empotrados de media y baja complejidad exigieron capacidades de memoria que estaban muy por debajo de este tope. En ese tiempo, la frontera de los 64Kbytes parecía demasiado lejana para ser rebasada por las aplicaciones con µPs.

En la actualidad, la existencia de compiladores C para la mayoría de los µPs y

µCtrls en el mercado, ha hecho posible el desarrollo de aplicaciones de tal compleji-dad que hubiese sido una fantasía pensarlas en programarla en lenguaje ensamblador, herramienta básica de trabajo para los programadores de sistemas empotrados hasta hace pocos años. De hecho, los diseños modernos con µPs de complejidad media pueden requerir desde 64 K hasta 256 Kbytes de espacio de memoria.

Pareciera que la solución ante esta situación es apelar a los modernos µCtrls o

a un µP de 16 bits como el 8088 o el 80188, con accesos a memoria de hasta 1 Mbyte. Sin embargo, en el mundo real, no siempre la solución ante esta disyuntiva es tan sencilla. Considere por ejemplo que se debe actualizar un sistema basado en un µP antiguo de 8 bits. Si se elige la opción señalada posiblemente el programador se en-

Page 217: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

198

frentara al hecho de rescribir decenas de miles de líneas de código. El costo del desa-rrollo del nuevo software puede ser tan alto que una decisión sabia puede ser mante-ner el mismo CPU, aunque puede ocurrir que la actualización del código produzca un programa de un tamaño tal que rebase la capacidad de direccionamiento del µP.

Por otro lado, existen aplicaciones cuyos requerimientos de diseño pueden ser

de tal magnitud que rebasen las capacidades de los microcontroladores disponible. Estos usualmente tienen 6 puertos de E/S (48 líneas si no se usan algunos recursos como el CAD y el UART) y si se usa memoria externa hay que sacrificar algunos de estos para convertir al chip en un microprocesador. Por ejemplo, considere el desarro-llo de un sistema que ejecuta operaciones de E/S sobre 80 dispositivos tales como sensores, cámaras de TV, lasers, modem, motores y un espectrómetro de rayos X. además el sistema debe ejecutar 12 experimentos cuyos resultados será vitales para el avance de una determinada tecnología de punta. Suponga además que el código de la aplicación para el control de E/S y los experimentos ocupa 16 Kbytes de PROM, 160 Kbytes de EEPROM y 576 Kbytes de RWM. Especificaciones adicionales indican que el µP debe ser de bajo consumo e inmune a la radiación cósmica.

El párrafo anterior describe a un sistema empotrado de gran complejidad con

tales especificaciones que no pueden ser satisfechas por ningún microcontrolador estándar, a menos que éste se configure para operar como microprocesador con me-moria externa y circuitos programables para interconexión de E/S. Acepto que este es un ejemplo extremo, pero este problema tuvo que resolverlo en Laboratorio de Pro-pulsión de Jets (JPL) de la NASA durante la preparación de parte de la misión a Mar-te lanzada el 4 de julio de 1997 y conocida como Pathfinder; específicamente durante el diseño del sistema de control del vehículo autónomo explorador Sojouner

Los diseñadores del JPL seleccionaron el µP de 8 bits 80C85 (versión moder-

na del 8085) como CPU del sistema microcomputador de control del Sojouner. El programa se organizó como un lazo único de control con soporte de interrupciones para eventos ante los cuales el explorador debía reaccionar rápidamente. Esta arqui-tectura del sistema de control responde al hecho que el vehículo no tenía suficiente energía para hacer dos cosas a la vez. Por ejemplo no podía moverse activando los motores de las ruedas y a la vez comunicarse usando el modem de radiofrecuencia.

Ante este modo de operación, la NASA no vislumbro ventaja alguna en el uso

de un sistema de control multitarea de tiempo real que más bien podría deteriorar el funcionamiento del sistema. El 80C85 fue programado usando un compilador C de un paquete de desarrollo adquirido por la NASA y algunas herramientas de software des-cargadas de Internet. Este µP aparece frecuentemente en diseños de instrumentos y controles en el área de navegación espacial. Muchas opiniones señalan que esto se debe a la inmunidad del 80C85 ante los rayos cósmicos y a su bajo consumo de po-tencia.

En todo caso tenemos dos situaciones, la segunda quizás algo extrema, en las

cuales el tamaño del programa de una aplicación basada en un µP de 8 bits, excede la

Page 218: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

199

capacidad del espacio de memoria accesible por el procesador. Debido a que el límite de 64 Kbytes lo impone el hecho que el µP sólo tiene 16 líneas de direcciones, si se suman bits extras de direcciones es posible aumentar la capacidad de acceso a memo-ria. Estas nuevas líneas se conectan a los bits de direcciones de orden alto de los cir-cuitos de memoria del sistema. Por ejemplo, usando lógica externa para generar los bits A16 y A17, se incrementa el espacio de memoria a 256 Kbytes (218).

Al aumentar en dos las líneas de direcciones se tiene 256 Kbytes de memoria

física (real) y sólo 64 Kbytes de memoria lógica cuyas direcciones son generadas por el procesador. Como indica la tabla 5.21, el espacio de memoria puede verse como 4 bancos de 64Kbytes cada uno con iguales direcciones lógicas pero direcciones reales distintas. Cuando el programa hace referencia a una posición de la memoria, el estado de los bits A17 y A16 establecerá a cual banco corresponde la dirección. En otras pala-bras, cuando se haga referencia a una dirección de memoria lógica, el hardware ex-terno de mapeo debe redirigir la llamada o salto una dirección física específica.

Tabla. 5.21. Direcciones físicas y lógicas y mapa de memoria

para un sistema con 256 Kbytes de EPROM.

DIRECCIÓN Banco A17 A16 FÍSICA LÓGICA

0 0 0 00000-0FFFFH 0000-FFFFH 1 0 1 10000-1FFFFH 0000-FFFFH 2 1 0 20000-2FFFFH 0000-FFFFH 3 1 1 30000-3FFFFH 0000-FFFFH

Fig. 5.52 Direcciones físicas y lógicas y mapa de memoria para un sistema con 250 Kbytes de memo-ria de programa.

Una dirección de 17 bits de la memoria sistema, puede especificarse como

B00:7FFFH o B10:7FFFH. Donde Bxx indica el banco al cual pertenece la posición seleccionada y 7FFFH será la dirección de desplazamiento en el banco. Una dirección física viene dada por la expresión:

0Dir 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

= × +

= × +

= × +

=

Page 219: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

200

No existe limitación alguna para diseñar un subsistema de memoria como el descrito. Puede usarse dos bits de un puerto de salida para las líneas extras de direc-ciones y código adicional para conmutar los bancos. No obstante, existen algunas consideraciones de orden práctico que deben hacerse al momento de definir el mapa de memoria de una aplicación real. En principio el sistema con el mapa de la figura 5.52 no tiene memoria de lectura/escritura y los programas típicos adquieren varia-bles externas o generan valores locales que deben almacenarse en una memoria de datos, la cual además soporta la pila del sistema permitiendo la codificación de subru-tinas y la gestión de interrupciones.

De modo que para diseñar un sistema con bancos de memoria conmutados de-

be realizarse un análisis detenido de las necesidades de memoria de código y de datos y decidir o cuál de estás es la que requiere el uso de bancos. Considere ahora el mapa de memoria de la figura 5.53, el cual pertenece a un sistema con una memoria SRWM de 32 Kbytes y un área de código de 32Kbytes que será mapeada a 4 páginas en un dispositivo de 128 Kbytes. La memoria de datos, en este caso, es un área común (sin bancos) que es visible desde cualquiera de los bancos.

Fig. 5.53 Mapa de memorias con cuatro bancos de EPROM.

La memoria de código consiste de un dispositivo EPROM MBM27C1000 de 128 Kbytes, el cual debe ser accedido como cuatro bancos de 32 Kbytes cada uno; y una memoria volátil de 32 Kbytes tipo MBM6256AFP. Para el diseño del subsistema de bancos de memoria, observe que del mapa de memoria de la figura 5.53 se deduce que la línea de dirección A15 estará en nivel alto para cualquier posición dentro del rango de la SRWM y en estado cero para cualquier dirección lógica de la EPROM. Es posible entonces, usar esta línea de dirección (A15) para seleccionar la EPROM y su complemento 15A , para habilitar la memoria la SRWM.

Los bits A0-A14 del µP se conectan las entradas de direcciones de la EPROM y

de la SRWM. Para tener acceso a 128 Kbytes desde el espacio lógico de 32 Kbytes asignado a código, se debe generar un bit de dirección adicional A’16 (217=128K) el cual debe conectarse al terminal A16 de la EPROM. Pero como usamos la línea A15 del microprocesador para seleccionar los circuitos de memoria, también debemos

Page 220: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

201

generar una nueva línea A’15 para la EPROM, que se aplica a la entrada A15 de la MBM27C1000.

La razón de esto es que cada vez que se tiene acceso a la EPROM, A15 estará

en cero, de modo que si la conectamos directamente al la memoria de código sólo se tendrá acceso al banco 0. La tabla siguiente muestra el estado de los bits de selección de banco XA16 - XA15, de las líneas de dirección de la EPROM A’16 - A’15 y del termi-nal A15 del µP, para cualquier posición de la memoria de programa.

Tabla. 5.22 Tabla de estados de la memoria EPROM.

DIRECCIÓN Banco XA16 XA15 A’16 A’15 A15 FÍSICA LÓGICA

0 0 0 0 0 0 00000-7FFFFH 0000-7FFFH 1 0 1 0 1 0 08000-0FFFFH 0000-7FFFH 2 1 0 1 0 0 10000-17FFFH 0000-7FFFH 3 1 1 1 1 0 18000-1FFFFH 0000-7FFFH

Para generar los nuevos bits de direcciones se usa un puerto de salida y algu-nas puertas como se observa en el diagrama eléctrico de la figura 5.54. El puerto de salida se realiza con un latch 74LS175, cuyas salidas son puestas a cero por la señal RESET-OUT, durante el arranque del sistema. La memoria RAM es seleccionada con direcciones lógicas entre 8000H y FFFFH. Cualquier dirección por debajo de este rango, habilita el circuito mapeador externo y selecciona una posición de memoria en una de las páginas de 32Kbytes, dependiendo del valor de XA15-16.

Cuando se diseña un subsistema de memoria usando la técnica de conmuta-

ción de bancos, deben realizarse previsiones para que ciertas áreas de memoria de código y de datos no desaparezcan cuando se selecciona un banco. Esto significa que el diseño debe hacerse para que exista una región de memoria de programa y otra de memoria de datos que sean visibles desde cualquier banco. Estas zonas se denominan áreas comunes de código o de datos. Algunos prefieren llamarlas área de código del sistema o área de datos del sistema.

Por ejemplo, la sección de memoria asignada al área de la pila debe estar dis-

ponible para acceso desde cualquier banco para las llamadas y retornos a y desde sub-rutinas. Es necesario, además, que exista alguna cantidad de memoria de programa común donde debe cargarse por ejemplo las rutinas que controlan la conmutación de los bancos. Las secciones de código mencionadas a continuación deben siempre resi-dir en el área común:

• Vectores de reset y de interrupción: debido a que el reset e interrupción del µP son eventos asincrónicos y pueden ocurrir cuando esté selecciona-do cualquiera de los bancos de código, los vectores de reset y de interrup-ciones deben residir en el área común.

Page 221: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

202

Fig. 5.54 Subsistema de memoria con bancos conmutados

Page 222: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

203

• Constantes y tablas: si un banco contiene valores constantes y tablas defi-nidas por el código, debe garantizares que esa página sea seleccionada en el momento que esta información sea invocada por el programa. En caso contrario estas constantes y tablas deben almacenarse en el área común.

• Rutinas de conmutación de bancos: esta sección del programa así como la

tabla de saltos debe localizarse en el área común por ser necesarias para todos los bancos.

• Funciones de bibliotecas: las rutinas de bibliotecas usadas por el compila-

dor en tiempo de ejecución deben cargarse en el área común.

Algunos ensambladores y compiladores C incorporan soporte para conmuta-ción de bancos. Los programas enlazadores asociados generan automáticamente el código y la información de mapeo necesaria para ejecutar programas con bancos. El enlazador crea una tabla de saltos para todas las funciones almacenadas en el área de bancos y que son llamadas desde el área común o de otros bancos. Normalmente el vendedor del software entrega un pequeño módulo de código el cual realiza la con-mutación a y desde bancos. Normalmente las instrucciones CALL, JMP, RET y sus formas condicionales están sujetas a remapeo cuando se ejecutan. Algunos paquetes de desarrollo no incluyen acceso a bancos de datos, por lo cual éstos deben ser mane-jados por el programa.

La aplicación que usa la técnica de conmutación de bancos debe incluir el módulo fuente que contiene el código que es invocado para la conmutación de los bancos. Este archivo debe ser configurado para que se corresponda con la técnica de conmutación usada por el hardware, especificando el número de bancos y como son seleccionados. Por ejemplo debe especificarse el número del puerto de la lógica de conmutación y el estado de los bits de selección para cada banco. El enlazador ade-más tiene directivas de control para especificar la localización y tamaño de los bancos y para asignar determinados módulos del programa al área de un banco o al área co-mún.

Una omisión en el modo de operación del circuito de manejo de memoria de la figura 5.54, es que no proporciona una sección para el área común de código en el espacio de la EPROM. La solución es que debe indicarse en tiempo de compilación, cuales módulos del programa deben residir en el área del sistema. El programa enla-zador entonces copia el código y los datos almacenados en esta zona en cada banco, de modo que el contenido de todos los bancos de EPROM es el mismo en el rango de direcciones del área común.

Para evitar la duplicación del código común, debe rediseñarse el manejador de memoria para asignar por hardware el área común. Para esto considere que el tamaño de esta zona es 16 Kbytes (0000H-03FFFH) como ilustra el mapa de memoria de la figura 5.55. El espacio de EPROM en el rango 40000H-7FFFH será redirigido a uno

Page 223: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

204

de ocho bancos de 16 Kbytes, usando para seleccionarlos tres bits XA14-16 de un puer-to de salida.

Como muestra la figura 5.56 Las líneas de direcciones A0-A13 se conectan a

las entradas correspondientes de la EPROM. Cuando A15 es igual a cero se selecciona la EPROM y se puede tener acceso a uno de ocho bancos de 16 Kbytes, dependiendo del estado de los bits A14’, A15’ y A16’ que se conectan a las tres líneas orden alto de las entradas de direcciones del dispositivo.

Fig. 5.55 Mapa de memorias con área común de código y siete bancos de EPROM.

Aunque algunos compiladores no soportan bancos para el área de datos no

existe razón alguna para que la técnica de conmutación de bancos sea aplicada a la memoria SRWM del microcomputador. El proceso de diseño de un mapeador para la RAM se realiza exactamente igual a como se hizo para la memoria de código.

Page 224: Microprocesadores-Luis Urdaneta

El Microcomputador Básico

205

Fig. 5.56 Subsistema de memoria con área común de código.

Page 225: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

206

PPrrooggrraammaacciióónn ddeell 88008855

En el capítulo anterior se establecieron las bases mínimas para el diseño de un sistema microcomputador mínimo. En este capítulo, se presenta el conjunto de ins-trucciones del microprocesador 8085A, y se describe como usarlo para realizar proce-samiento de información.

El µP ejecuta una secuencia de instrucciones de máquina que define las opera-ciones a realizar. Basándose en las instrucciones, el µP puede realizar tres tareas bási-cas:

1. Mover datos desde una posición de memoria a otra. 2. Usar la ALU para ejecutar operaciones matemáticas y lógicas. 3. Tomar decisiones, y basarse en los resultados para transferir el control del programa hacia

un nuevo conjunto de instrucciones.

Aunque es posible, y en ocasiones conveniente, el uso de lenguajes de alto ni-vel para la escritura de los programas de aplicación, para introducir al lector en la programación del 8085A se usará el lenguaje ensamblador. Para escribir programas eficientes en ensamblador, el usuario debe conocer a la perfección:

• Las funciones de los registros y la forma en que están organizados en el interior del µP. • El repertorio de instrucciones del µP y • Los modos de direccionamiento.

Page 226: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

207

6.1 EL MODELO PARA PROGRAMACIÓN

Aunque un microcomputador construido alrededor del μP8085, o de cualquier otro μP, comprende un número de unidades funcionales distintas y de complejidad variable, las cuales están interconectadas a los buses del microprocesador; para pro-gramar el sistema, es suficiente considerar inicialmente un modelo que represente los recursos a la disposición del programador.

D0-D7 A0-A15

8085A

Fig. 6.1 Modelo del microcomputador para programación.

Los registros internos a los cuales se permite acceso al usuario constituyen el

modelo básico de programación del microprocesador. En la figura 6.1 se presenta un diagrama de la estructura interna del µP y de los componentes externos asociados que integran al µC. Los elementos del modelo se presentan tal como se perciben desde la óptica de un programador. Los registros buffers de datos y de direcciones no forman parte del modelo.

El modelo para programación está constituido por varios registros de 8 bits,

tales como el acumulador (A), el registro de banderas o de estado, y el banco de re-

Page 227: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

208

gistros de propósito general (B,C,D,E,H,L); y dos registros de 16 bits: el contador de programa y el apuntador de pila. El microcomputador tiene una memoria para ins-trucciones y datos con una capacidad de 64Kbytes y 512 puertos de E/S. Para efectos de programación, la conexión real entre el μP, la memoria, y los puertos de E/S del sistema pueden considerarse transparentes para el programador. 6.2 FORMATO DE LAS INSTRUCCIONES

Para ejecutar un programa, el microprocesador debe obtener el código ejecu-

table y trasladarlo en secuencia al registro de instrucciones del microprocesador. Las instrucciones y los datos del programa son obtenidos desde la memoria del sistema. Esta almacena la información en palabras con formato de ocho bits.

De acuerdo con su tipo, cada instrucción puede ocupar uno, dos o tres posi-

ciones en el interior del dispositivo de memoria. Por ejemplo, la instrucción aritméti-ca ADD r, realiza la suma del contenido del registro r y el dato depositado en el acumulador, cargando el resultado de la operación en el mismo registro acumulador. Se requiere un byte para definir completamente la instrucción.

La instrucción MVI r, dato, mueve el valor especificado por el operando dato

al registro r, necesitándose dos bytes para especificar la instrucción. El primero para el código de operación, y el otro para representar el dato a ser almacenado en el regis-tro. Una instrucción JMP dirección produce un salto incondicional a la dirección es-pecificada, y es una instrucción de tres bytes porque requiere dos palabras adicionales al código de operación, para especificar la dirección del salto.

En la figura 6.2 se muestra el formato general para las instrucciones del 8085.

Fig. 6.2 Formato de instrucciones del μP 8085.

Byte de una dirección de memoria

Código de operación

Dato o byte de una dirección de memoria

Instrucción de un byte

Instrucción de dos bytes

Instrucción de tres bytes

Page 228: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

209

NOMENCLATURA PARA EL CONJUNTO DE INSTRUCCIONES:

Para facilitar la comprensión de las instrucciones del 8085 se presenta, en la tabla 6.1, la simbología usada por la empresa INTEL para las instrucciones.

Tabla. 6.1. Nomenclatura de las instrucciones del 8085. SÍMBOLO SIGNIFICADO dirección Expresión binaria de 16 bits. Dato Expresión binaria de 8 bits. dato 16 Expresión binaria de 16 bits. Puerto Dirección de 8 bits de un dispositivo de E/S r,r1.r2 Uno de los registros: A, B, C, D, E, H, L DDD, SSS Representación de 3 bits del código de operación donde algunos de los registros: A,

B, C, D, E, H, L es destino (D) o fuente (S) de información. (Vea tabla 2) Rp Cada pareja de registros B-C, D-E, H-L. El registro B representa el par B-C, D al par

D-E, mientras que H representa al registro par H-L. (Vea tabla 3) XX Código de las banderas en instrucciones de salto condicional. (vea tabla 4) NNN Número binario entre 000 y 111. N Número decimal entre 0 y 7. Rh El byte alto de mayor peso de un registro par. Rl El byte menos significativo de un registro par. PCH y PCL Bytes de mayor y menor peso del contador de programa. M Referencia a memoria PSW Palabra de estado del programa. Consiste del contenido del acumulador más las ban-

deras de condición.

(a)

Registro

DDD o

SSS

Registro

par

rp

Condición

(XX)

CCC

A 111 BC 00 NZ no cero (Z=0) 000 B 000 DE 01 Z cero (Z=1) 001 C 001 HL 10 NC sin acarreo (CY=0) 010 D 010 SP 11 C con acarreo (Z=1) 011 E 011 PO Paridad impar (P=0) 100 H 100 PE paridad par (P=1) 101 L 101 P positivo (S=0) 110

M negativo (S=1) 111

(c)

(b) (d)

Page 229: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

210

6.3 MODOS DE DIRECCIONAMIENTO

Especifican la manera en que las instrucciones del microprocesador 8085A obtienen los datos a los cuales hacen referencia. Un modo de direccionamiento parti-cular establece el procedimiento utilizado por el microprocesador para obtener un dato necesario para la ejecución de la instrucción. Este valor puede estar en la memo-ria del sistema, en un registro o puede ser especificado por un operando de la propia instrucción.

Por ejemplo, ADD r y ADD M son ambas instrucciones que ejecutan una

suma, con uno de los operandos almacenado en el acumulador. El modo en el cual la instrucción obtiene el segundo elemento de la operación, establece una diferencia entre estas dos instrucciones. En un caso, el valor es obtenido desde un registro r, mientras que en el segundo caso se encuentra en la posición de memoria especificada por el contenido del registro par HL.

Para la escritura de programas eficientes es necesario entender con claridad

los distintos modos de direccionamiento que puede utilizarse con cada instrucción del µP. En general, la potencia de cómputo de un determinado µP está determinada por el número de modos de direccionamientos disponibles.

Las instrucciones del 8085A tienen cuatro modos de obtener los datos: • Direccionamiento directo. • Direccionamiento por registro. • Direccionamiento indirecto por registro. • Direccionamiento inmediato.

6.3.1 Direccionamiento directo

La instrucción indica en forma explicita la dirección de la posición de memo-ria donde está el dato. Este modo corresponde a instrucciones de tres bytes, donde el segundo indica los 8 bits de menor peso de la dirección, mientras que el tercer byte corresponde a los 8 bits de mayor peso de la dirección donde está el dato.

Suponga que una instrucción STA 2045H está almacenada en la dirección 2000H de la memoria del sistema. Esta instrucción realiza la operación de mover el contenido del acumulador a la dirección de memoria especificada por los bytes 2 y 3 de la instrucción, esto es [(byte 3) (byte2)], ← (A).

La figura 6.3a muestra como se almacena la instrucción en memoria, y la figu-

ra 6.3b presenta el contenido del dispositivo de memoria después de ejecutarse la instrucción.

Page 230: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

211

STA

45

20

STA

45

20

2000H 32

45

20

A

2002H

2000H

2001H

2003H

2045H F3

MEMORIA

32 F3

45 2001H

(a) (a)

(b) (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

Fig.6.3 Direccionamiento directo de una posición de memoria. (a) antes de la ejecución. (b) Después de la ejecución

6.3.2 Direccionamiento Inmediato 6.3.2 Direccionamiento Inmediato

La instrucción contiene en forma explícita el dato a utilizarse en la ejecución de la instrucción. Este tipo de referencia a datos corresponde a instrucciones de dos y tres bytes. Por ejemplo, la instrucción ANI dato, ejecuta una operación AND entre el contenido del byte dos de la instrucción y el dato en el acumulador. El resultado de la operación lógica se deposita en el acumulador. La bandera de acarreo y la de acarreo auxiliar son puestas a cero, las otras son afectadas según el resultado.

La instrucción contiene en forma explícita el dato a utilizarse en la ejecución de la instrucción. Este tipo de referencia a datos corresponde a instrucciones de dos y tres bytes. Por ejemplo, la instrucción ANI dato, ejecuta una operación AND entre el contenido del byte dos de la instrucción y el dato en el acumulador. El resultado de la operación lógica se deposita en el acumulador. La bandera de acarreo y la de acarreo auxiliar son puestas a cero, las otras son afectadas según el resultado.

20 20 PC

2002H00

2003H

xx 2045H

2046H

32

45

20 2002H

2000H

2001H

2003H

2045H

2046H

F3

STA

45

20

A

F3

03 20

MEMORIA

PC

Page 231: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

212

Suponga que el acumulador contiene el dato binario 110111112. El resultado de ejecutar ANI 011010112, es:

1101 1111 (A) 0110 1011 (byte 2) 0100 1011 (A) (S) = 0 , (Z) = 0, (P) = 1, (AC) = 0, (CY) = 0

STA

45

ANI

6B

2000H 32

45

20 2002H

2000H

2001H

2046H

F3

E6

6B

x 2002H

2001H

F30020

PC

MEMORIA A

DF X X X X X

F

2003H

Fig.6.4 Direccionamiento inmediato de un dato. Contenido del acumulador, el contador de programa,

la memoria, y el registro de condiciones, antes de ejecutar la instrucción.

STA

45

ANI

6B

2000H 32

45

20 2002H

2001H

2046H

F3

E6

6B

x 2002H

2001H

F302 20

PC

MEMORIA A

CF 0 0 0 1 0

F

2003H

Fig.6.5 Direccionamiento inmediato de un dato. Contenido del acumulador, el contador de programa,

la memoria y el registro de condiciones, luego de ejecutar la instrucción.

Page 232: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

213

6.3.3 Direccionamiento por registro

La instrucción especifica el registro r de 8 bits, o rp de 16 bits, donde se halla el dato. La instrucción INX rp, es un ejemplo de este tipo de referencia a dato. Se trata de una instrucción de un byte, cuya ejecución incrementa en 1 el contenido del regis-tro par rp, esto significa (rh) (rl) ← ((rh) (rl) +1). Si el registro B contiene el dato 12H y el registro (C ) = 4FH, al ejecutarse la instrucción INX B, el contenido de BC cambiará como muestra la figura 6.7.

B C

12 FF

13 00

(B-C)

(B-C) + 1

Fig. 6.6 Direccionamiento por registro.

6.3.4 Direccionamiento indirecto por registro

La dirección de memoria donde está el dato es especificada por el contenido de un registro par. La instrucción ADC M suma el contenido de la posición de memo-ria indiada por el registro par H-L más el bit de acarreo contenido del acumulador, el cual contendrá el resultado de la operación. Esto es: (A) ← (A) + [(H)(L)] + (CY).

Si antes de ejecutar la instrucción: (A) = 1F (CY) = 1 (H) = 20 (L) = 50 [2050] = 23 Después de ejecutar la instrucción: (A) = 43 (H) = 20 (L) = 50 [2050] = 23 y el estado de las banderas será: (S) = 0 (Z) = 0 (AC) = 1 (P) = 0 (CY) = 0 En las figuras 6.8 y 6.9 se presentan los contenidos de los registros y memo-

ria, antes y después de ejecutar la instrucción.

Page 233: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

214

ADC2000H 32

45

20 2002H

2000H

2001H

2045H

F3

8E

x

23

F350 F3 H L

20

MEMORIA A 1F X X X X 1

F

F300 F3 20

PC

2050H

2046H

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.

ADC2000H 32

45

20 2002H

2000H

2001H

2045H

F3

8E

x

23

F350 F3 H L

20

MEMORIA A 1F 0 0 1 0 0

F

F301 F3 20

PC

2050H

2046H

Fig.6.9 Direccionamiento indirecto por registro de un dato. Contenido del acumulador, el registro par

H-L, el contador de programa, la memoria y el registro de condiciones, luego de ejecutar la instrucción.

6.4 EL CONJUNTO DE INSTRUCCIONES DEL 8085

El μp8085A puede ejecutar 246 operaciones distintas agrupadas en 74 instruc-ciones generales, estás pueden distinguirse en los siguientes grupos:

• Transferencia de datos. • Operaciones lógicas. • Bifurcaciones. • Instrucciones de manejo de pila (stack), E/S, y control de la máquina. • Operaciones Aritméticas.

Page 234: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

215

6.4.1 Grupo de instrucciones para transferencia de datos Permiten el movimiento de datos entre los distintos componentes del sistema

μcomputador. Transfieren información entre los registros internos del microprocesa-dor, desde un registro hacia la memoria del sistema, o hacia los puertos de entrada y salida, o bien desde la RWM o dispositivos de E/S, hacia un registro. Estas instruc-ciones deben especificar la fuente donde se localizan los datos, y el destino donde debe copiarse la información. Cuando se ejecuta una transferencia (mover), el conte-nido del registro fuente permanece inalterable. Las instrucciones de este grupo no afectan las banderas. En la tabla 6.2 se presentan las instrucciones del 8085A destina-das a transferir datos.

Tabla. 6.2 Instrucciones para carga y movimiento de datos.

Instrucciones para transferencia de datos

MOV r1,r2 (r1) ← (r2) STA dirección [(dirección)]←(A)

MOV r,M (r) ←[(H)(L)] LHLD dirección (L) ←[(dirección)] (H) ←[(dirección+1)]

MOV M,r [(H)(L)] ← (r) SHLD dirección [(dirección)] ← (L) [(dirección+1)] ← (H)

MVI r,dato (r) ← (dato) LDAX rp (A) ← [(rp)]

MVI M,dato [(H)(L)] ← (dato) STAX rp [(rp)] ← (A)

LXI rp,dato 16 (BC) ←dato 16 XCHG (H) ↔ (D) (L) ↔ (E)

LDA dirección (A) ←[(dirección)] IN puerto OUT puerto

(A) ← (puerto) (puerto) ← (A)

Los datos son transferidos entre registros o entre un registro y la memoria por

la instrucción MOV, esta se especifica de la siguiente forma, dependiendo del origen y destino de los datos:

MOV r1,r2 (r1)←(r2)

Transfiere el contenido del un registro fuente r2 a al registro destino r1 , puede

especificarse cualquier registro interno de 8 bits.

MOV r,M (r)←[(H) (L)]

Mueve el contenido de la posición de memoria apuntada por el registro par HL al registro r. El registro HL debe cargarse con la dirección de memoria cuyo con-tenido se quiere transferir. Existen varios métodos para cargar la dirección, pero una forma común es usar la instrucción:

Page 235: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

216

LXI rp, dirección (rl)←(byte 2); (rh)←(byte 3) Esta instrucción de 3 bytes, carga el registro par rp con los bytes 2 y 3 de la

instrucción, por ejemplo: LXI H, 10FFH, carga el registro H con el byte 10H y L con FFH.

Otra forma de cargar un registro o una posición de memoria es con la instruc-

ción MVI, mover inmediatamente.

MVI r ,dato (r)←(byte 2)

Carga el registro r de 8 bits con el dato especificado por el byte 2 de la ins-

trucción MVI M,dato [(H)(L)]←(byte 2)

Permite copiar el dato especificado por el byte 2 de la instrucción en la posi-ción de memoria con dirección indicada por el contenido del registro HL.

Las instrucciones LXI y MVI pueden usarse para cargar cualquier registro o

posición de memoria cambiando el operando destino, o el modo de direccionamiento. Por ejemplo LXI B, dirección deposita en el registro par BC los bytes 2 y 3 de la ins-trucción. La instrucción LXI SP, dirección carga el apuntador de stack con la direc-ción del tope de la pila.

Algunas instrucciones para transferencia de datos con memoria no hacen refe-rencia al registro par HL.

LDAX rp (A) ←[(rp)]

La información en la posición de memoria especificada por el contenido del

registro par rp es transferida al acumulador.

LHLD dirección (L) ←[(byte 3) (byte 2)]; (H) ←[(byte 3) (byte 2) +1]

El contenido de la dirección de memoria especificada por el byte 2 y 3 de la instrucción es cargado en el registro L, y el contenido de la próxima posición de me-moria es transferido al registro H.

LDA dirección (A) ←[(byte 3) (byte 2)]

El dato en la posición de memoria especificado por el byte 2 y 3 de la instruc-

ción es movido al acumulador.

Page 236: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

217

STAX rp [(rp)]←(A) El byte almacenado en el registro acumulador es transferido a la posición de

memoria cuya dirección está especificada por el contenido del registro par rp.

SHLD dirección [(byte 3) (byte 2)]←(L); [(byte 3) (byte 2) +1]←(H) Mueve el contenido del registro L a la posición de memoria señalada por los

bytes 2 y 3 de la instrucción. El contenido del registro H es transferido a la siguiente posición de memoria.

STA dirección [(byte 3) (byte 2)] ←(A)

El contenido del acumulador es almacenado en la dirección de memoria espe-

cificada por los bytes 2 y 3 de la instrucción. Las instrucciones LDA y STA proveen un medio para transferir inmediata-

mente datos entre el acumulador y la memoria. Usando estas instrucciones, esto pue-de realizarse con tres bytes en lugar de los cuatro bytes necesarios para cargar el re-gistro par HL con una dirección y mover datos desde o hacia la memoria. Ejemplo 6.1

El código siguiente mueve el contenido de la dirección de memoria 451FH al

registro acumulador. lda lxi h 1F 1F 45 45 mov a,m

3 bytes 4 bytes

XCHG (H) ↔ (D); (L) ↔ (E) Intercambia los datos contenidos en los registros pares HL y DE: La elección de las instrucciones que permiten la transferencia de información

entre el microprocesador y los dispositivos de entrada y salida, depende del tipo de estructura que utilice el sistema para la decodificación de los puertos de E/S. Son po-sibles dos esquemas:

• E/S estándar. (E/S aislada) • E/S direccionada como memoria. (Mapeo de memoria)

Page 237: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

218

Posteriormente se analizaran en detalle los modos de selección más comunes para dispositivos de E/S. En lo que se refiere al programador, basta con distinguir las instrucciones que se pueden utilizar en cada caso.

Para el esquema E/S estándar se usan las instrucciones de dos bytes IN puerto

y OUT puerto. El primer byte de la instrucción contiene el código de operación y el segundo la dirección del puerto que se desea seleccionar:

IN puerto (A)←(dato) El byte colocado en el bus de datos por el puerto especificado por el segundo

byte de la instrucción, es depositado en el acumulador.

OUT puerto (dato)←(A)

El contenido del registro A es colocado en el bus de datos para ser transmitido al puerto especificado por el segundo byte de la instrucción

Es obvio que como la dirección del puerto se especifica con un byte, solo es

posible el acceso a 512 puertos, 256 de entrada, y 256 de salida. Un puerto de entra-da puede tener la misma dirección que uno de salida, las señales de control de lectura y escritura en puerto realizarán la distinción.

Cuando se ejecuta una instrucción IN la señal de control de lectura, RD , se

activa para permitir la lectura del puerto, en el caso de la ejecución de una instrucción OUT se activará la señal WR , de escritura en memoria o puerto de E/S. La línea

M/IO es puesta en alto para indicar que la transferencia es a un registro de E/S. Además, el 8085A coloca la dirección del puerto sobre las ocho líneas de dirección de menor peso A -A , duplicando esta información en las ocho líneas de mayor peso del bus de direcciones A -A .

0 7

8 15 Cuando los puertos de entrada y salida son seleccionados como si se tratara de

posiciones de memoria, se pueden usar las instrucciones que hacen referencia a me-moria para transferir datos a, o desde dispositivos de E/S. En este caso, el procesador no puede distinguir entre un puerto tratado como memoria y una dirección de la me-moria del sistema.

6.4.2 Grupo de instrucciones que ejecutan operaciones lógicas

El microprocesador 8085A posee un grupo de instrucciones que usan la uni-dad lógica y aritmética para hacer posible la realización de operaciones lógicas, de forma equivalente a como las puertas básicas digitales las ejecutan por hardware. La única diferencia es que el microprocesador opera con datos de 8 bits. Las instruccio-

Page 238: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

219

nes de este grupo facilitan la manipulación y control de bits individuales de un regis-tro o posición de memoria.

Tabla. 6.3 Instrucciones del grupo lógico.

Instrucciones lógicas

ANA r (A)←(A) ∧ ( r) CMC (CY )← (CY)

ANA M (A) ←(A) ∧ [(H)(L)] STC (CY) ← 1

ANI dato (A) ← (A) ∧ (dato) CMP r (A) - ( r)

ORA r (A) ← (A) ∨ ( r) CMP M (A) - [(H)(L)]

ORA M (A) ←( A) ∨ [(H)(L)] CPI dato (A) - (dato)

ORI dato (A) ← (A) ∨ (dato) RRC (A )←(A ); (A )←(A ) n n+1 7 0

(CY) ← (A0)

XRA r (A)←(A) ∀ (r) RLC (A )←(A ); (A )←(A ) n+1 n 0 7

(CY) ← (A7)

XRA M (A)←(A) ∀ [(H)(L)] RAR (A )←(A ); (CY)←(A )n n+1 0

(A7) ← (CY)

XRI dato (A)←(A) ∀(dato) RAL (A )←(A ); (CY)←(A )n+1 n 7

(A0) ← (CY)

CMA (A)←(A)

Cuando en una instrucción de este grupo intervienen dos operandos, como en

ANA r, que ejecuta una operación AND entre un registro y el acumulador, la opera-ción se realiza simultáneamente entre los bits correspondientes de cada byte. En el caso de la instrucción CMA de complemento, la operación de complementar se efec-túa sobre los ocho bits del acumulador. En todas las instrucciones lógicas, exceptuan-do aquellas que se refieren a la bandera de acarreo (CY), uno de los operandos está en el acumulador. Cuando intervienen dos operandos, el otro puede estar: implícito en la instrucción, en otro registro del microprocesador o en la memoria.

Las instrucciones de este grupo afectan todas las banderazas operaciones lógi-

cas posibles son: AND, OR, OR Exclusivo, Complemento, Comparación, y Despla-zamientos.

Instrucciones que ejecutan la función AND

ANA r, ANA M y ANI dato realizan la función AND entre el acumulador y el operando de referencia. Afectan todas las banderas de condiciones: CY es puesta a cero y AC a 1. Los valores de P, S y Z son asignados de acuerdo con el resultado de la operación. ANA r (A)←(A) ∧ ( r)

Page 239: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

220

Realiza la función AND bit a bit entre el acumulador y el registro especifica-

do, el resultado se deposita en el acumulador.

Ejemplo: ANA C, con (A) = B6H y (C)=63H 10110110 (A) B6H ∧ 01100011 (C) 63H 00100010 (A) 22H

ANA M (A) ←(A) ∧ [(H)(L)] Ejecuta la operación AND entre el acumulador y el contenido de la posición

de memoria apuntada por el registro par HL, el resultado se carga en el acumulador.

ANI dato (A) ←(A) ∧ (dato)

Realiza una función AND entre el segundo byte de la instrucción y el conteni-do del acumulador. El resultado se almacena en el acumulador.

La utilidad de las instrucciones que ejecutan operaciones lógicas puede no ser

obvia. Por ejemplo, la función AND permite poner en cero algunos bits específicos de una palabra, mientras que los restantes permanecen inalterables. Si es necesario bo-rrar los bit 7 y 0 del A, basta con usar un byte de máscara (7EH) y ejecutar la instruc-ción ANI 7EH.

10101001 (A) A9H xxxxxxxx (A) xxH

∧ 01111110 (C) 7EH ← máscara ∧ 01111110 (C) 7EH ← máscara 00101000 (A) 28H 0xxxxxx0

Instrucciones que ejecutan la función OR

Las instrucciones ORA r, ORA M y ORI dato, disponibles en el grupo de ins-trucciones lógicas del microprocesador 8085A, ejecutan la función OR entre el acu-mulador y el operando especificado. Al igual que en el caso anterior el segundo ope-rando puede ser un registro de 8 bits, la memoria del sistema, o un dato contenido en el segundo byte de la instrucción OR inmediato (ORI). Estas instrucciones afectan todas las banderas: CY y AC son puestas a cero.

ORA r (A)←(A) ∨ ( r)

Realiza la función OR bit a bit entre el acumulador y el registro especificado,

el resultado se deposita en el acumulador. Ejemplo: ORA B, con (A) = B6H y (B)=63H

Page 240: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

221

10110110 (A) B6H ∨ 01100011 (B) 63H 11110111 (A) F7H

ORA M (A) ←(A) ∨ [(H)(L)] Ejecuta la operación OR entre el registro A y el contenido de la posición de

memoria apuntada por el registro par HL, el resultado se carga en el acumulador.

ORI dato (A) ←(A) ∨ (dato)

Produce la ejecución de una función OR entre el segundo byte de la instruc-ción y el contenido del acumulador, el resultado se almacena en el acumulador.

Una aplicación inmediata de la función OR es poner a uno un bit de una pala-

bra de control, manteniendo el estado lógico de los demás bits. Como ejemplo, la ejecución de la instrucción ORI 70H fuerza a uno el bit A6 del registro acumulador. El programa que se ofrece a continuación muestra el uso de las instrucciones lógicas AND y OR para la conversión de números codificados en ASCII al sistema BCD y viceversa. Para convertir un carácter ASCII (37H) a su equivalente decimal (07H), basta con poner a cero los bits A4-6 del valor ASCII. Esto se logra con la instrucción AND 0FH. Para revertir el proceso, se retornan a uno el mismo grupo de bits, ejecu-tando ORI 30H.

Ejemplo 6.2

El puerto de entrada 80H contiene el código ASCII de un digito decimal y en

el registro D está almacenado el equivalente binario de un número decimal. El pro-grama debe leer el puerto de entrada, convertir el carácter ASCII a BCD y almacenar-lo en la posición de memoria 0200H. El dígito decimal en D, debe ser convertido a ASCII y escrito en el puerto de salida 90H.

in 80h ; Obtener carácter ASCII ani 0fh ; Convertir a BCD

sta 0200h ; Almacenar en memoria mov a,d ; Cargar en a el número decimal

ori 30h ; Convertir en ascii out 90h ; Escribir a puerto hlt

En aplicaciones de control es a menudo necesario probar el estado lógico de

uno o más bits de un registro o de una posición de memoria determinada. Considere que el contenido del registro acumulador es A9H y se requiere detectar el estado del bit A3.

10100001 (A) A9H 10101001 (A) A9H ∧ 00001000 (C) 08H ← máscara ∧ 00001000 (C) 08H ← máscara

Page 241: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

222

00000000 (A) 00H 00001000 (A) 08H (Z) = 1 (Z) = 0

La forma más directa y sencilla de realizar esta tarea es usar un byte de masca-

ra específico, 08H en este caso, para ocultar todos los bits del A excepto el correspon-diente a la prueba. Ejecutando la instrucción ANI 08H, se coloca la máscara. El resul-tado de la prueba se indica mediante la bandera de cero (Z), la cual se activará sólo en el caso que A3 sea igual a cero. El ejemplo 6.3 ilustra un método para realizar prueba de bits.

Ejemplo 6.3

El programa detecta el estado del bit 4 de la posición de memoria con direc-

ción 300H. Si está en uno, se cargarán ceros en todos los bits de la posición 0500H. Si por el contrario el bit 4 es cero, se pondrán a uno todos los bits de la misma celda de la memoria.

lxi h,0300h ; Apunta la dirección del bit a probar mov a,m ; Palabra de prueba al a

ani 10h ; Prueba de a4 jz uno ; Si cero, todos a uno ani 00h ; Si uno, todos a cero jmp mem uno: ori ffh mem: sta 0500h ;Actualiza indicador hlt

Instrucciones que ejecutan la función OR EXCLUSIVO

El μP 8085A permite realizar las funciones: XRA r, XRA M y XRI dato. La ejecución de cualquiera de estas instrucciones ponen a cero las banderas de acarreo y de acarreo auxiliar, el resto de los bits de condiciones son afectados según el resulta-do de la operación lógica.

Al ejecutar la instrucción OR exclusivo entre bits de igual valor lógico, se ob-

tiene como resultado un cero, mientras que entre bits distintos se produce uno. Esto indica que si el dato en el acumulador coincide con el operando de la instrucción OR exclusivo, el registro acumulador es cargado con cero y la bandera de cero (Z) es ac-tivada a uno.

XRA r (A)←(A) ∀ (r)

La función OR exclusivo se ejecuta entre el acumulador y el registro r, el re-sultado se deposita en el acumulador.

Ejemplo: XRA B, con (A) = B6H y (B)=63H

Page 242: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

223

10110110 (A) B6H ∀ 01100011 (B) 63H 11010101 (A) D5H

XRI M (A)←(A) ∀ [(H)(L)]

Realiza la operación OR exclusivo entre el contenido de A y el byte en la posi-ción de memoria apuntada por el registro par HL., el resultado se carga en el A.

XRI dato (A)←(A) ∀ (dato) Ejecuta una función OR exclusivo entre el segundo byte de la instrucción y el

contenido del acumulador, el resultado se almacena en el acumulador. Para el programador, es una práctica habitual tener que cargar el registro acu-

mulador con cero. Esta operación puede ser realizada por la instrucción de dos bytes MVI A,0. Una forma más eficiente para iniciar en cero el A es utilizar la instrucción de un bytes XRA A, la cual además torna a cero las banderas de acarreo (CY) y aca-rreo auxiliar (AC).

En forma similar a como se usó la función AND para poner bits a cero y la OR

para hacerlos uno, la operación OR exclusivo puede usarse para complementar bits. Por ejemplo XRI F0H produce la inversión lógica de los cuatro bits de mayor orden del registro acumulador.

1011 1110 (A) BEH ∀ 1111 0000 (B) F0H 0100 1110 (A) 4EH El ejemplo 6.4 muestra el uso de la función OR exclusivo para prueba de byte.

Ejemplo 6.4 El programa lee una palabra de control del puerto 0BH y lo compara con una

copia del dato almacenada en la dirección 3000H de la memoria. Si son iguales, se hace uno el bit 5 de la posición de memoria 3200H. Si los bytes comparados difieren, se actualiza la copia de la palabra de control.

lda 3000h mov c,a ; Copia de palabra de control en c

in 0ah ; Leer palabra de control mov b,a xra c ; Comparar con copia jnz difer ;Son diferentes

Page 243: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

224

lda 3200h ; Son iguales ori 20h ; Bit 5 a uno sta 3200h jmp fin difer: mov a,b ; Actualizar copia en memoria sta 3000h fin: hlt

Observe que la actualización de la palabra de control ocurre únicamente si hubo cambios en ésta. Instrucciones que realizan complemento

Son dos instrucciones de un byte: complementar el acumulador, CMA, y complementar la bandera de acarreo, CMC.

CMA (A)←( A )

El contenido de acumulador es complementado. El registro de banderas no

es modificado.

CMC (CY)←( CY ) Solo afecta la bandera de acarreo.

Existe otra instrucción que actúa directamente sobre el bit de acarreo: STC (CY)←1

La bandera de acarreo es puesta a uno, las otras permanecen mantienen su valor.

Instrucciones de comparación

La instrucción OR exclusivo (XRA) se usó en el ejemplo 6.4 para comprobar si dos datos son iguales. Si se requiere comparar bytes e indicar si uno es mayor o menor que el otro, no puede usarse XRA. La comparación de dos valores binarios en términos de sus magnitudes relativas, puede ser realizada usando las instrucciones de comparación, descritas a continuación.

CMP r, CMP M y CPI dato, comparan el contenido del acumulador con: el

de cualquier registro interno del μP (incluyendo al propio A), con el de una posición de memoria, o con un dato inmediato. La comparación consiste en substraer el byte

Page 244: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

225

operando del contenido del acumulador. Todas las banderas son afectadas. Los bits Z y CY son afectadas de acuerdo con el resultado de la comparación.

CMP r (A) - ( r)

Si (A) = (r), la bandera de cero Z es puesta a 1 Si (A) < (r) el bit de acarreo CY se hace 1.

CMP M (A) - [(H)(L)]

Si (A) = [(H)(L)] , Z = 1 Si (A) < (r) , CY= 1.

CPI dato (A) - (dato)

Si (A) = (dato), Z=1 Si (A) < (r), CY es 1.

En todas las instrucciones de comparación, el dato en el acumulador antes de la ejecución de la instrucción, permanece invariable. Los valores de las banderas de estado son asignados de acuerdo con el resultado de la comparación realizada.

Ejemplo 6.5 La instrucción de comparación CMP r es utilizada para resolver el problema

planteado en el ejemplo anterior. Es suficiente con sustituir la línea de código XRA C del ejemplo 6.4, por la instrucción CMP C.

lda 3000h

mov c,a in 0ah mov b,a cmp c jnz difer lda 3200h ori 20h sta 3200h jmp fin difer: mov a,b sta 3000h fin: hlt

Page 245: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

226

Ejemplo 6.6 Para la comparación de la magnitud de dos números se puede usar el siguiente

código.

. .

. cpi 50h jz no50 ; Saltar si distinto a 50h . ; Es igual a 50h . .

no50: jc men50 ; Saltar si menor de 50h . ; Mayor que 50h . .

men50: . ; Es menor a 50h .

Las instrucciones de comparación pueden usarse para determinar si un número

está dentro de un intervalo determinado. El programa del ejemplo 6.7, verifica si un dato obtenido desde un puerto de entrada, corresponde al carácter ASCII de un dígito decimal.

Ejemplo 6.7

Si el dato captado por el microprocesador desde el puerto de entrada con di-

rección 00H, es un dígito decimal, éste debe almacenarse en la posición de memoria 2000H. En caso contrario, el valor obtenido desde el puerto debe copiarse en el regis-tro E.

lxi h,2000h in 00h ; Leer dígito de puerto de entrada. mov c,a ; Almacenar dígito en registro c. cpi 30h ; Comparar con ascii ‘0’. jm inval ; Si es < , no es un digito decimal. cpi 40h ; Comparar con ascii ‘9’+1. jm vali ; Si es <, el digito esta entre ‘0’ y ’9’.

inval: mov e,a ; Carácter no decimal al registro e. jmp salir vali : mov m,a ; Número decimal a memoria salir: hlt

Para concluir la exposición sobre las instrucciones de comparación, se presen-ta un ejemplo del uso del microprocesador 8085A en la solución de un problema simple de control industrial.

Page 246: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

227

Ejemplo 6.8 Un 8085A debe supervisar en forma continua el valor de una variable analógi-

ca de un proceso industrial. Si la magnitud de la variable supera un valor de referen-cia, debe generarse una alarma visual. En la figura 6.12 se ofrece un diagrama de blo-ques del proceso.

Fin de conversión

A

µC 8085

CAD

Selección Inicio de conversión

Lectura del dato

Sensor

Amplificador

Fig. 6.10 Supervisión de un proceso industrial.

El conversor de datos usado es el ADCC0804, el cual se presenta en un encap-sulado de veinte terminales con todas las funciones necesarias para facilitar la co-nexión al bus de un microprocesador. En la figura 6.11 se observa el símbolo del cir-cuito y las funciones de los terminales.

Señal Función DB0-DB7 Salidas digitales

VI+, VI- Entradas analógicas

CS Selección De circuito RD Habilitación de salida

WR Iniciar conversión INTR Fin de conversión AGND Tierra analógica

VREF Tensión de referencia CLK Entrada de reloj externo

Fig. 6.11 El convertidor A/D de 8 bits ADC0804.

El ADC0804 convierte el voltaje de entrada a un valor digital de 8 bits. Las salidas DB0-DB7 son tri- estados. La resolución del CAD es de 19.6 mV. Las entradas analógicas VI+ y VI- permiten la conversión de entradas diferenciales. Con entrada

Page 247: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

228

no diferencial, el voltaje a convertir se aplica a VI+ y VI- se conecta a la tierra analó-gica AGND. Con el terminal VREF a circuito abierto, el rango de la señal de entrada es 0-5V.

Posee un generador de reloj interno de frecuencia 1/(1.1RC), donde RC son

componentes externos conectados a los terminales CLKR y CLK. Con alimentación de +5 V, la frecuencia de trabajo permitida está entre 100 KHz y 800 KHz. Puede usarse un reloj externo conectado a la entrada CLK. En la figura 6.12 se muestran las señales que intervienen en el proceso de adquisición de datos.

SC WR

INTR

RD

DB0-7

Inicio de conversión

Lectura de datos

Dato

Fin de conversión

tc

Fig. 6.12 Diagrama de tiempos del ADC0804.

Para habilitar al ADC0804, la entrada CS debe estar en cero. Con el disposi-

tivo seleccionado, la aplicación de un pulso de nivel bajo en la entrada WR pone al CAD en operación y la señal INTR cambia a nivel alto. El proceso de conversión propiamente dicho se inicia una vez que las señales CS y WR han regresado al nivel alto. Al finalizar el proceso, INTR vuelve a cero, señalando que puede proceder a leerse el dato habilitando las líneas de salida DB0-DB7 con la aplicación de un co-mando de lectura en la línea RD .

La sección de adquisición de datos y generación de alarma del sistema super-

visor se muestra en la figura 6.13. Las salidas de datos del circuito convertidor ADC0804 se conectan al bus AD0-AD7 del 8085 y las líneas de inicio de conversión y de habilitación de salidas se aplican, respectivamente, a los terminales de control WR y RD .

Los valores de los componentes externos, resistencia y capacitor fijan una fre-

cuencia de trabajo de 606KHz la cual está dentro de las especificaciones de funcio-namiento del circuito. El decodificador de direcciones realiza una decodificación par-cial situando al ADC0804 en el puerto 04H, y a la señal de fin de conversión ( INTR ) en 00H. El indicador luminoso se conecta a la salida Q de un circuito 74LS74 y se

Page 248: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

229

controla aplicando las entradas de selección de puerto ( 3CSy2CS ) a las líneas asincrónicas de puesta a uno ( PR ) y puesta a cero ( CL ).

Una operación de escritura al puerto con dirección 08H apagará al diodo indi-

cador durante la operación normal, mientras que la selección del puerto 0CH, lo ilu-minará cuando el sistema funcione bajo falla. El contenido del bus de datos durante el acceso a estos dos puertos es irrelevante.

Fig. 6.13 Sección de adquisición de datos e indicación de alarma.

El programa de control se muestra a continuación.

ctrl.: lda e200h ; Obtener valor de referencia mov b,a ; almacenarlo en B. out 8 ; Se asegura que el LED esté apagado

adc: out 4 ; Inicio de la conversión esp: in 0 ; Se lee la línea INTR. ani 80h ; Prueba de INTR

jnz esp ; Esperar hasta cuando sea cero. in 4 ; Leer resultado de la conversión.

cmp b ; Comparar con la referencia. jc adc ; Si es menor, adquirir nuevo valor out 0ch ; Es mayor, activar led

adc1 out 4 ; Adquirir variable y esperar esp1: in 0 ; que disminuya por debajo del ani 80h ; valor de referencia.

jnz esp1 in 4

Page 249: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

230

cmp b jnc adc1 jmp ctrl ; Reiniciar proceso.

Al inicio de la ejecución, se desactiva el diodo luminoso. A continuación una

operación de escritura en el puerto 4 da inicio al proceso de conversión. Para verificar el fin de la conversión, se examina continuamente el contenido del puerto 0 hasta cuando el bit D7 sea cero. En este momento se lee el dato de salida del CAD. Este valor se compara con la referencia. Si es menor, se continúa adquiriendo valores de la variable. Cuando la magnitud de la señal de entrada supera el valor de referencia se activa la alarma. Con el diodo iluminado, se adquieren nuevos valores hasta cuando la magnitud de la tensión de entrada cae bajo el nivel de referencia. Se apaga el diodo y de inicia de nuevo el proceso de supervisión.

El programa del ejemplo 6.8 se mantiene en un lazo sin fin supervisando con-

tinuamente la variable del proceso. La redundancia de código mostrada por el pro-grama se corregirá cuando se trate el tópico de subrutinas. También puede ordenarse el apagado del diodo, aun cuando esté desactivado, al inicio del lazo de adquisición y de este modo no será necesario lazos separados de adquisición para condiciones nor-mal y bajo falla. Observe que las puertas OR en la figura 6.13 pueden suprimirse si en el sistema no existe un puerto 0 de salida ni puertos 8 y 0CH de entrada. Esto debido a que el 74LS139 selecciona el puerto sin discriminar si es de entrada o salida.

Fig. 6.14 Decodificador de puertos con PLD para la sección de adquisición de datos e indicación de

alarma.

Page 250: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

231

Como alternativa, en figura 6.14 se muestra el circuito de la figura 6.13 con un decodificador de puertos que realiza una decodificación completa de las direccio-nes de los puertos y además usa un solo chip.

El código a programar en el circuito PAL es el siguiente: library IEEE; use IEEE.STD_LOGIC_1164.all; entity DECDIR is port ( IOM,RD,A7,A6,A5,A4,A3,A2,A1,A0: in STD_LOGIC; CS0, CS1, CS2, CS3: out STD_LOGIC ); end DECDIR; architecture RTL of DECDIR is begin CS0 <= NOT(IOM)OR RD OR A0 OR A1 OR A2 OR A3 OR A4 OR A5 OR A6 OR A7; CS1 <= NOT(IOM) OR A0 OR A1 OR NOT (A2) OR A3 OR A4 OR A5 OR A6 OR A7; CS2<= NOT(IOM)OR NOT(RD) OR A0 OR A1 OR A2 OR NOT(A3) OR A4 OR A5 OR A6 OR A7; CS3<= NOT(IOM)OR NOT(RD) OR A0 OR A1 OR NOT(A2) OR NOT(A3) OR A4 OR A5 OR A6 OR A7; end RTL;

Instrucciones de rotación

Las instrucciones de este grupo desplazan el contenido del acumulador un bit a la derecha, o a la izquierda. Son instrucciones de un byte, y su ejecución solo afecta la bandera de acarreo.

RRC (An)←(An+1); (A7)←(A0); (CY) ← (A0) La instrucción RRC, desplaza el contenido del A un bit hacia la derecha. El

bit menos significativo del A (A0) se transfiere al de mayor peso (A7) y al bit de aca-rreo, como ilustra la figura 6.15.

CY A7 A6 A4 A3 A2 A1 A0A5

Fig 6.15 Rotación del acumulador un bit hacia la derecha

Page 251: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

232

RLC (An+1)←(An); (A0)←(A7); (CY) ← (A7) Realiza una rotación hacia la izquierda del contenido del acumulador. A7 se transfiere hacia A0 y hacia la bandera de acarreo.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig. 6.16 Rotación del acumulador un bit hacia la izquierda

RAR (An)←(An+1); (CY)←(A0); (A7) ← (CY) El contenido del acumulador se desplaza un bit hacia la derecha a través del

bit de acarreo. El bit A0 pasa a CY, y el bit de acarreo a A7.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig. 6.17 Rotación de un bit hacia la derecha a través de la bandera de acarreo.

RAL (An+1)←(An); (CY)←(A7); (A0) ← (CY) El byte en el acumulador es desplazado un lugar hacia la izquierda a través del

bit de acarreo. El bit A7 ocupa el lugar del CY, y el contenido de la bandera de acarreo se transfiere al bit A0.

CY A7 A6 A5 A4 A3 A2 A1 A0

Fig. 6.18 Rotación del acumulador un bit hacia la izquierda a través de CY.

Page 252: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

233

Ejemplo 6.9 Se requiere empaquetar los nibbles menos significativos de las posiciones de

memoria E400H y E4001H en la dirección E500H, como indica la figura 6.19.

Fig. 6.19 Después de ejecutar el programa, el dato en la posición E500H es 92H

lhld e400h ; Se cargan en h y l los datos en memoria mov a,l ; Se mueve al acumulador el valor en e400h. rlc ; Intercambio de nibbles del acumulador. rlc rlc rlc ani f0h ; Se pone a cero el nibble de orden menor y mov b,a ; Se mueve al registro b mov a,h ; Cargar el a con el dato en e401h ani 0fh ; Se hace cero el nibble de mayor orden. ora b ; Se empaquetan valores sta e500h ; Resultado a posición e500h. hlt

En este capítulo se ha intentado presentar programas útiles para el desarrollo

de aplicaciones prácticas de sistemas empotrados. Sin embargo, esta tarea es obstacu-lizada por el hecho que aún no se ha presentado el repertorio completo de instruccio-nes del 8085A. La potencialidad real de algunas instrucciones se revelará a medida que se avance en la exposición.

Por ejemplo, las instrucciones de rotación combinadas en un programa con

instrucciones aritméticas, permiten realizar operaciones matemáticas diversas, algu-nas de éstas son: multiplicación, división, cálculo de logaritmos y de funciones trigo-nométricas.

En el siguiente ejercicio se muestra otra aplicación sencilla de las instruccio-

nes de rotación.

Page 253: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

234

Ejemplo 6.10 A los terminales del puerto de salida 20H están conectados 8 indicadores lu-

minosos (LED0-7), los cuales deben iluminarse de acuerdo con las siguientes condi-ciones:

a. Los LEDs deben estar inicialmente apagados.

b. Si la línea 7 del puerto 40H está en:

0, active LED0, LED2, LED4 y LED6

1, active LED1, LED3, LED5 y LED7

c. Si el bit 0 del puerto de entrada 40H esta en cero no debe haber cambios en el estado de los LEDs.

ori 0ffh ; Apagar los ocho LEDS out 20h orden: in 40h ; Obtener permiso para cambios rrc jnc orden ; Permiso negado in 40h ; Obtener patrón de encendido rlc jc l1357 mvi a,0aah ; P40.7 = 0 >> LED0, LED2, LED4 y LED6 out 20h jmp orden l1357: mvi a,55h ; P40.7 = 1 >> LED1, LED3, LED5 y LED7 out 20h jmp orden hlt

6.4.3 Instrucciones para manejo de la pila

La pila o stack es una zona de almacenamiento cuya presencia es imprescin-dible en todo computador debido a que es utilizada para asignar niveles de subrutinas y de interrupciones. En algunos microprocesadores, la pila se encuentra en el interior del CPU y en otros, forma parte de la memoria del sistema. Esta área de memoria es una estructura LIFO (Last Input First Output), la cual acumula eventos en forma cro-nológica. Esto significa que la primera información en entrar al stack ocupara la ba-se, mientras que la más reciente estará en la cima de la pila.

En la figura 6.20 se observa un grupo de cilindros apilados. A cada pieza se le asigna un número, según el orden de entrada a la pila. La operación de retirar un ele-mento del snack, se denomina POP, mientras que la tarea de añadir un cilindro se identifica como PUSH. En el caso de una memoria, un comando POP leerá la pila y un comando PUSH escribirá a la pila.

Page 254: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

235

Como indica la figura 6.20, el primer elemento en dejar la pila es el número 6, el cual fue el último cilindro colocado. La zona del stack puede corresponder a un área de memoria física o puede ser establecida por programa. Una pila de hardware ocupa un número determinado de registros de la CPU, lo cual garantiza una veloci-dad alta de operación pero una capacidad de almacenamiento limitada.

6

5

4

3

2

1

4

3

2

1

6

5

POP

4

3

2

1

6

5

PUSH Fig. 6.20 Representación conceptual de una memoria con estructura LIFO

La pila programada usa la memoria RWM del µC y está limitada sólo por la capacidad de memoria del sistema. El contenido del registro apuntador de pila indica siempre la dirección ocupada por el último dato en entrar a la pila El programador selecciona la base de la pila en cualquier parte de la memoria RWM y el control de la información almacenada es realizada en forma automática por el SP. En términos de direcciones de memoria, la pila progresa hacia abajo y el tope de la pila corresponde a la dirección del último elemento en entrar, señalada por el SP.

El 8085A usa una pila por programa y la manipulación de la pila se realiza por

medio de dos instrucciones especiales. La instrucción PUSH deposita el contenido de un registro par en la parte superior de la pila, mientras que POP lee los dos últimos bytes almacenados en el stack y los transfiere a un registro par. La tabla 6.4 detalla las instrucciones de este grupo.

PUSH rp [(SP) - 1] ← (rh); [(SP) - 2] ← (rl); (SP)← (SP) -2

Los datos en el registro par rp son transferidos a la pila, como se indica. El SP es disminuido en dos. PUSH PSW [(SP) - 1] ← (A); [(SP) - 2] ← (PSW); (SP)← (SP) - 2

El contenido del A es movido a la posición de memoria inmediatamente infe-rior a la apuntada por el SP. Las banderas de estados son empaquetadas como una

Page 255: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

236

palabra de estados denominada PSW (Program Status Word), la cual es copiada a la posición cuya dirección es menor en dos unidades que el contenido del SP.

Tabla. 6.4 Instrucciones de salto y de manejo de subrutinas

Instrucciones para manejo de la pila

PUSH rp

[(SP) - 1] ← (rh) [(SP) - 2] ← (rl) (SP)← (SP) -2

POP PSW

(CY) ← [(SP)]0

(P) ← [(SP)]2

(AC) ← [(SP)]4

(Z) ← [(SP)]6

(S) ← [(SP)]7

(A) ← [(SP+1)]

(SP) ← (SP) + 2

PUSH PSW

[(SP) - 1] ← (A) [(SP) - 2]0 ← (CY) [(SP) - 2]2 ← (P) [(SP) - 2]4 ← (AC) [(SP) - 2]6 ← (Z) [(SP) - 2]7 ← (S) [(SP) - 2]1,3,5 ← X (SP)← (SP) - 2

XTHL (L) ← [(SP)]

(H) ← [(SP)+1]

POP rp

(rh) ← [(SP)] (rh) ← [(SP+1)] (SP)← (SP) +2

SPHL (SP) ← (H) (L)

POP rp (rh) ← [(SP)]; (rh) ← [(SP+1)]; (SP)← (SP) +2

Los datos en el registro par se transfieren a la pila, como indica la secuencia.

POP PSW (banderas) ← [(SP)]; (A) ← [(SP+1)]; (SP) ← (SP) + 2 Se restituyen las banderas desde la dirección de memoria apuntada por el SP.

El registro A es cargado con el dato en la posición de memoria con dirección mayor en uno a la indicada por el SP. El SP es incrementado en dos.

XTHL (L) ↔ [(SP)]; (H) ↔ [(SP)+1]

El byte depositado en el registro L es intercambiado con el contenido de la po-

sición cuya dirección señala el SP. El dato en el registro H se intercambia con el byte almacenado en la posición de memoria con dirección es mayor en uno que la indicada por el SP.

SPHL (SP) ← (H) (L)

El contenido del registro par HL es copiado en el apuntador de pila.

Page 256: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

237

El manejo de la pila es sencillo. El programador solo debe asegurarse que ex-trae la información desde el STACK en el orden correcto. También es recomendable asignar el tope de la pila en las últimas direcciones de la memoria del sistema. Usualmente se requieren pocas posiciones de memoria para la zona del stack, pero conviene asegurarse que está área no sea sobrescrita por alguna instrucción del pro-grama. En el ejemplo 6.11 se muestra lo que no debe hacerse al extraer datos desde la pila.

Ejemplo 6.11

lxi sp,3000h ; Asignar el tope de la pila push b ; Cargar bc en el stack push d ; Transferir de a la pila pop b ; Recuperar bc del stack. pop d ; Restaurar de desde la pila hlt

En el programa del ejemplo 6.1 no se consideró que el contenido del registro

par BC se trasladó a la pila antes que el del registro DE. El intento de recuperar pri-mero a BC y luego a DE producirá un error de lógica durante la ejecución del pro-grama. A continuación se describe la situación.

• LXI SP,3000H

63 85 B C

41 24 D E

3000

SP

X

X

X

X

X

X

X

X

PILA

3000H

2FFFH

2FFEH

2FFDH

2FFCH

Fig. 6.21 Se carga el apuntador de pila con la dirección 3000H

Page 257: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

238

• PUSH B

63 85 B C

41 24 D E

2FFE

SP

X

X

X

85

63

X

X

X

PILA

3000H

2FFFH

2FFEH

2FFDH

Fig. 6.22 El contenido del registro par BC se almacena en la pila • PUSH D

63 85 B C

41 24 D E

2FFC

SP

X

24

41

85

63

X

X

X

PILA

3000H

2FFFH

2FFEH

2FFDH

2FFCH

Fig. 6.23 El dato de 16 bits en DE se mueve al stack

Page 258: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

239

• POP B

41 24 B C

41 24 D E

2FFE

SP

X

24

41

85

63

X

X

X

PILA

3000H

2FFFH

2FFEH

2FFDH

2FFCH

Fig. 6.24El contenido de la pila se transfiere al registro par BC • POP B

41 24 B C

63 85 D E

3000

SP

X

24

41

85

63

X

X

X

PILA

3000H

2FFFH

2FFEH

2FFDH

2FFCH

Fig. 6.25 El contenido de la pila se mueve al registro DE

Observe que como resultado de la ejecución del programa, se intercambiaron los contenidos de los registros pares. Para mantener intacta la información en los re-gistros BC y DE, primero se debió rescatar DE, el último que se almacenó. Si se hubiese deseado intercambiar el contenido de los registros pares, el procedimiento empleado en el ejemplo 6.9 puede ser utilizado.

Page 259: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

240

La pilas un área ideal para almacenamiento temporal y fácil recuperación de variables de un programa. En el siguiente ejemplo se usa el stack para intercambiar datos de dos posiciones de la memoria RWM.

Ejemplo 6.12

Utilizando la pila como medio de almacenamiento temporal, intercambie los

contenidos de las direcciones de memoria 2020H y 2021H

lxi sp,3000h lda 2020h ; Cargar en el a el dato en 2000h push psw ; Mover el byte en a hacia la pila lda 2021h ; Cargar en a el dato en 3000h sta 2020h ; Mover el a a la posición 2000h pop psw ; Recuperar dato de la pila sta 2021h ; Copiarlo en 3000h hlt

6.4.4 Grupo de instrucciones para bifurcaciones

A menos que una instrucción de este grupo sea ejecutada, el flujo normal de un programa consistirá en la ejecución de las instrucciones almacenadas en secuencia en la memoria. La tabla 6.5 presenta las instrucciones de este tipo. El 8085A tiene instrucciones que permiten cambiar el contenido del contador de programa, de modo que la próxima instrucción sea buscada en una dirección de memoria especificada, en lugar de en la posición siguiente.

La bifurcación del programa puede ser originada por un salto (JUMP) o una

llamada a subrutina (CALL). La alteración de la secuencia de ejecución puede ser incondicional, cuando al ejecutarse la instrucción se modifica inmediatamente el con-tenido del contador de programa; o condicional, la cual requiere la satisfacción de una condición de bandera antes de producirse la ruptura de la secuencia.

Instrucciones que producen salto

Las instrucciones de este grupo son bien conocidas por lector, debido a que fueron introducidas el capitulo 3 como soporte lógico del µP hipotético. Por tal razón, han sido usadas en los programas de ejemplos anteriores. Para mantener la secuencia de presentación del repertorio de instrucciones del 8085A, se trataran en forma breve en esta sección.

Las instrucciones de salto ocupan tres bytes de la memoria del sistema. El

primero corresponde al código de operación y los dos siguientes especifican la direc-ción de memoria hacia la cual se ejecutará el salto.

Page 260: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

241

Tabla. 6.5 Instrucciones de salto y de manejo de subrutinas Instrucciones para bifurcaciones

JMP dirección (PC)←(byte3) (byte2) RET (PCL) ← [(SP)] (PCH) ← [(SP) + 1] (SP)←(SP) + 2

Jx dirección Si x es verdad (PC)←(byte3) (byte2) Rx

Si x es verdad (PCL) ← [(SP)] (PCH) ← [(SP) + 1] (SP)←(SP) + 2

CALL dirección

[(SP)-1]← (PCH) [(SP)-2]← (PCL) (SP)←(SP) -2 (PC)←(byte3) (byte2)

RST n

[(SP)-1]← (PCH) [(SP)-2]← (PCL) (SP) ← (SP) -2 (PC) ← 8*n

Cx dirección

Si x es verdad [(SP)-1]← (PCH) [(SP)-2]← (PCL) (SP)←(SP) - 2 (PC)←(byte3) (byte2)

PCHL (PCL)← (L) (PCH)← (H)

JMP dirección (PC)←(byte3) (byte2)

Realiza un salto incondicional a la dirección especificada por los bytes 2 y 3

de la instrucción.

Jx dirección IF x (PC) ←(byte3) (byte2) Se produce un salto a la dirección especificada por los bytes 3 y 3 de la ins-

trucción, si se satisface la condición especificada. Hay varios tipos de saltos condi-cionales, los cuales prueban el estado de una bandera y el salto se produce únicamen-te si la bandera es uno o si es cero. Los saltos condicionales son:

Tabla. 6.6 Instrucciones de salto condicionales Instrucción Condición Salto si la bandera de: JZ cero es 1 JNZ cero es 0 JC acarreo es 1 JNC acarreo es 0 JPE paridad es 1 JPO paridad es 0 JM signo es 1 JP signo es 0

Page 261: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

242

El estado de las banderas se modifica por la ejecución de una instrucción arit-mética o lógica. El programador debe asegurarse que la instrucción de la cual depen-de el salto afecte la bandera, y que no sea modifica por instrucciones subsecuentes.

Instrucciones para manejo de subrutinas

El microprocesador 8085A no tiene instrucciones directas para realizar algu-nas operaciones de uso común en ciertas aplicaciones. Por ejemplo, no es posible programar las líneas:

TIME n ; Retardo de n milisegundos DIV B ; (A) ← (B) ÷ (A)

Cuando se requiere realizar un retardo por programa, o una operación de divi-sión, el programador debe especificar una secuencia de instrucciones que realice la tarea. En una aplicación donde se realice control de tiempo es usual tener que generar retardos de diferente duración en varios puntos de un programa y es posible que un programa deba ejecutar en forma repetida operaciones de división. Una forma de cumplir con estas tareas consiste repetir las líneas de código tantas veces como sea necesario.

La repetición de líneas de código, conlleva un desperdicio de la memoria del sistema, debido a que existe redundancia en el código objeto resultante. Una solución más eficiente y que permite un ahorro de memoria, es codificar la rutina de retardo o de división como una subrutina. Este término identifica a una secuencia de instruc-ciones que realiza una tarea específica. Una subrutina es identificada por la dirección (etiqueta) de memoria donde se encuentra la primera instrucción. La llamada a la sub-rutina es realizada usando una instrucción CALL dirección o Cx dirección.

CALL dirección [(SP)-1]← (PCH); [(SP)-2]← (PCL); (SP)←(SP) -2 (PC)←(byte3) (byte2)

La dirección de la instrucción siguiente a CALL es transferida a la pila y el SP es disminuido en dos. A continuación, se ejecuta un salto hacia la posición de memo-ria cuya dirección es indicada por el operando de la instrucción.

Cx dirección IF x (pila)← (PC); (SP)←(SP) -2 (PC)←(byte3) (byte2)

Si se satisface la condición, se realiza la llamada a subrutina. En caso contra-rio se ejecuta la siguiente instrucción.

Page 262: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

243

RET (PCL) ← [(SP)]; (PCH) ← [(SP) + 1]; SP)←(SP) + 2

Los contenidos de las direcciones de memoria apuntada por el SP y la inme-diatamente superior son cargadas en el contador de programa, como indica la secuen-cia. El apuntador de pila es incrementado en dos. Rx IF x (PC) ← (pila) ← [(SP) + 1]; (SP)←(SP) + 2

Si la condición x es cierta, se realiza el retorno. De otra manera se ejecuta la instrucción siguiente.

Una de las funciones de la pila de memoria es almacenar la dirección de la próxima instrucción a ejecutarse, después que se produce una llamada a subrutina. La instrucción CALL introduce la dirección de retorno en el stack, mientras que RET la extrae de la pila. Este procedimiento es automático, de modo que la última línea de código de toda subrutina debe ser una instrucción de retorno RET, o una de sus va-riantes.

En la figura 6.26 se muestra como se altera el flujo de un programa durante la

ejecución de una subrutina, y en la figura 6.27 se observa el estado cronológico de la pila durante el proceso. También se indica el contenido del contador de programa y del apuntador de stack.

Programa principal

1ra instrucción

---

---

---

--- RET

Subrutina

2000H

----

----

----

CALL 2000H

----

----

1003H

1001H

1002H

1004H

1007H

Fig. 6.26 Secuencia de llamada a subrutina y retorno al programa principal

Page 263: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

244

• Antes de ejecutar CALL 2000H

• Después de ejecutar CALL 2000H

• Después de ejecutar RET

X

X

X

X

3000H

3000H

3000H

1004H 3000H PC SP

Pila

07

10

X

X

Pila

1007H 3000H

PC SP

07

10

X

X

2000H 2FFEH

PC SP

Pila

Fig. 6.27 Contenido de la pila durante el llamado a subrutina

Page 264: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

245

El programa principal se ejecuta en secuencia hasta cuando ocurre la llamada a subrutina CALL 2000H. En ese momento, el control del programa pasa a la direc-ción 2000H donde se encuentra la primera instrucción del subprograma. Al finalizar éste, una instrucción RET produce el retorno del control a la instrucción siguiente a la llamada CALL en el programa principal. Cuado se ejecuta un programa, puede presentarse el caso donde una subrutina, previamente llamada desde el programa principal, requiera el servicio de una segunda subrutina, ésta de una tercera, y así sucesivamente. Esta situación conoce como ani-damiento de subrutinas. La dirección de retorno de cada subprograma se almacena ordenadamente en la pila. La figura 6.28 ilustra el proceso usando dos subrutinas.

Fig. 6.28 Desde el programa principal se llama a la subrutina 1, ésta llama a la subrutina 2.

• Antes de ejecutar CALL 1200H Fig. 6.29 Estado de la pila antes de la llamada a la subrutina 1

X

X

X

X

3000H 1000H 3000H PC SP

Pila

----

----

----

CALL 1200H

----

----

Programa principal

1000H

1003H

1ra instrucción

1ra instrucción

---

---

---

--- RET

Subrutina 2

1300H

---

---

1213H

CALL 1300H

Subrutina 1

1200H

1210H

---

RET

Page 265: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

246

• Después de ejecutar CALL 1200H

• Inmediatamente antes de ejecutar CALL 1300H

• Inmediatamente después de ejecutar CALL 1300H

• Inmediatamente después del primer RET

• Inmediatamente después del segundo RET Fig. 6.30 Estado de la pila durante un anidamiento de subrutinas.

03

10

X

X

3000H

Pila

03

10

X

X

3000H

Pila

13

12

03 10

3000H

Pila

X X

13

12

03

10

Pila

X

X

2FFFH 2FFEH

2FFFH 2FFEH

2FFFH 2FFEH

2FFDH 2FFCH

3000H 2FFFH 2FFEH 2FFDH 2FFCH

07

10

X

X

Pila

X

X

3000H

2FFFH 2FFEH 2FFDH 2FFCH

1007H 3000H

PC SP

1213H 2FFEH

PC SP

1300H 2FFCH

PC SP

2010H 2FFEH

PC SP

1200H 2FFEH

PC SP

Page 266: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

247

Para que una subrutina realice la tarea para la cual fue escrita, se requiere que el programador le suministre los datos o parámetros necesarios. Generalmente estos datos se transfieren desde el programa principal, y una vez ejecutada la subrutina en-tregará resultados hacia el programa principal. La transferencia puede realizarse por medio de:

• Registros del microprocesador. • Tabla de datos. • La pila. • Posiciones reservadas de memoria. Si el número de parámetros que deben ser transferidos es pequeño, por ejem-

plo dos operandos para una rutina de multiplicación, pueden utilizarse los registros internos. Estos se cargan con el multiplicando y el multiplicador, y luego se realiza la llamada a subrutina. El producto puede volver al programa principal usando uno de los mismos registros. Si los operandos superan el número de registros disponibles, este método no es apropiado.

Cuando es necesario suministrar a una subrutina una gran cantidad de paráme-

tros, estos pueden residir en la memoria en forma de tabla de datos. Desde el progra-ma principal se transferirá únicamente la dirección de inicio de la tabla de datos desde la memoria

La pila de memoria puede utilizarse como medio para trasladar datos y resul-

tados entre el programa principal y la subrutina. Las instrucciones de carga de datos PUSH y recuperación de información POP, se usan con este propósito. El hecho que el stack contenga la dirección de retorno al programa principal, no representa proble-ma alguno. Más bien, el uso de la pila tiene la ventaja que la subrutina es indepen-diente de posiciones específicas de memoria, en forma similar a cuando se usan los registros internos del µP.

Los datos también pueden obtenerse desde posiciones de memoria previamen-

te reservadas por el programa. Los resultados de la ejecución de la subrutina son de-positados también en celdas de memoria previamente definidas.

Ejemplo 6.13

El programa que se presenta a continuación realiza la misma función que el mostrado en el ejemplo 6.8. En este caso, las instrucciones para la conversión de da-tos, para la lectura de las salidas del convertidor analógico-digital y para la compara-ción del dato obtenido con la referencia, han sido codificadas como una subrutina denominada ADC.

El programa principal realiza dos llamadas a esta subrutina, una en operación

normal y la otra cuando ocurre una falla.

Page 267: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

248

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila ctrl: lda e200h ; Obtener valor de referencia

mov a,b out 08h ; Apagar LED

men: call adc ; Adquirir hasta que la variable supere jc men ; El valor de referencia

out och ; Generar condición de alarma may: call adc ; Adquirir hasta que cese la situación jnc may ; de falla jmp ctrl ; Reiniciar proceso. ;---------------------------------------------------------------------------------- ; Subrutina de adquisición de datos ;---------------------------------------------------------------------------------- adc: out 04h ; Inicio de la conversión esp: in 00h ; Se lee la línea intr. ani 80h ; Prueba de INTR

jnz esp ; Esperar hasta cuando sea cero. in 04h ; Leer resultado de la conversión.

cmp b ; Comparar con la referencia. ret

Al inicio de la ejecución del programa, en condiciones normales de operación,

se lee la variable supervisada hasta que aumente sobre el punto de equilibrio. Al supe-rarse el umbral, se activa el indicador luminoso y se inicia un nuevo proceso de ad-quisición y comparación de datos, hasta cuando finalice la situación de alarma. Al regresar la variable a un valor permitido, se inicia el proceso con la salida de alarma desactivada.

La siguiente instrucción de este grupo es RST n, ésta es en realidad una ins-

trucción de interrupción. En el capítulo 8 se describirá como usar esta instrucción durante una operación de interrupción.

RST n n: 0,1,2…,7 (pila) ← (PC); (SP)← (SP) –2; (PC) ← 8*n

El contenido del contador de programa es cargado en la pila. El registro SP es decrementado en dos. La próxima instrucción del programa es buscada en la posición de memoria cuya dirección es el resultado de multiplicar por ocho el operando de la instrucción. Esta instrucción está destinada a ser usada durante el proceso de interrup-ción del µP. Es equivalente a una llamada CALL dirección, pero solo ocupa un byte de memoria, en lugar de tres bytes.

Cuando un dispositivo externo interrumpe al procesador activando la línea

INTR, el procesador detiene la ejecución del programa y espera que el periférico co-

Page 268: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

249

loque en el bus una instrucción RST n con la dirección de la rutina de servicio de in-terrupción.

PCHL (PCL)← (L); (PCH)← (H)

Produce un salto a la posición de memoria cuya dirección es especificada por el contenido del registro par HL 6.4.5 Grupo de instrucciones aritméticas

La mayoría de las tareas de cómputo realizadas por el 8085A exigen la ejecu-ción de operaciones aritméticas como suma, sustracción, multiplicación y división. Además para la realización de lazos de programación son necesarias instrucciones de incremento y decremento del contenido de un registro usado como contador. Estas últimas instrucciones, y las de suma y resta están disponibles en el repertorio de ins-trucciones del µP. Para realizar cualquier otra operación matemática, debe escribirse una rutina usando las instrucciones de suma y resta y la capacidad de rotación del registro acumulador.

Las instrucciones de este grupo ejecutan operaciones con registros, y posicio-

nes de memoria y datos inmediatos de ocho bits, estando siempre uno de los operan-dos en el acumulador, donde también se deposita el resultado. La mayoría de las ins-trucciones aritméticas afectan las banderas.

Tabla. 6.7 Grupo de instrucciones aritméticas

Instrucciones aritméticas

INR r (r) ← (r) + (1) ADC M (A)←(A)+ [(H)(L)]+(CY)

INR M [(H)(L)] ← [(H)(L)] + (1) ACI dato (A) ← (A) + (dato) +(CY)

DCR r (r) ← (r) - (1) DAA Ajuste Decimal del A

DCR M [(H)(L)] ← [(H)(L)] - (1) SUB r (A)←(A) - ( r)

INX rP (rP) ← (rh) (rl) + (1) SUB M (A) ←(A) - [(H)(L)]

DCX rP (rP) ← (rh) (rl) - (1) SUI dato (A) ← (A) - (dato)

ADD r (A)←(A) + ( r) SBB r (A) ← (A) - (r) - (CY)

ADD M (A) ←(A) + [(H)(L)] SBB M (A)←(A)- [(H)(L)] - (CY)

ADI dato (A) ← (A) + (dato) SBI dato (A) ← (A) - (dato) - (CY)

ADC r (A)←(A)+ (r) + (CY) DAD rP (H) (L) ← (H) (L)+ (rh) (rl)

Page 269: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

250

Instrucciones de incremento y decremento

Las instrucciones que producen el incremento y el decremento en la unidad de un registro o posición de memoria son de uso obligado para el establecimiento de lazos de programación. Éstos permiten ejecutar N veces una secuencia de código es-pecifica, hasta cuando una condición terminal es alcanzada. En su forma básica, un lazo repite una serie de instrucciones, tantas veces como indique un contador cargado antes de iniciar la iteración. En cada paso se disminuye o incrementa el contador has-ta cuando llegue a cero o a un valor determinado. Una instrucción de salto condicio-nal se encarga de decidir, de acuerdo con el estado del contador, la realización de una nueva iteración o la salida del bucle.

(a) (b) Fig. 6.31 Modos de establecer lazos de programación. a) REPEAT-UNTIL b) DO-WHILE

La figura 6.31 muestra los diagramas de flujo de dos formas de realizar un bu-cle. La estructura lógica de la izquierda se conoce como REPEAT-UNTIL o iteración al menos un paso. Esta última denominación es debida a que, la secuencia de código se ejecuta y luego se examina la condición. Como contador puede usarse cualquiera de los registros internos o una posición de memoria. El modo de conteo puede ser

Page 270: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

251

ascendente o descendente. El diagrama de la estructura REPEAT-UNTIL de la figura 6.35, usa el modo de conteo hacia abajo. Una instrucción condicional JNZ garantiza la realización de un nuevo pasa hasta cuando el registro llegue a cero. Para disminuir e incrementar un registro de 8 bits o un dato en memoria, se utilizan las instrucciones DCR e INR. INR r (r)←(r) + (1) INR M [(H)(L)] ← [(H)(L)] + (1)

El dato especificado por el operando, es incrementado en uno. DCR r (r)←(r) - (1) DCR M [(H)(L)] ← [(H)(L)] - (1)

Resta uno del contenido del byte especificado

Las instrucciones INR y DCR afectan todas las banderas excepto el bit de aca-

rreo. Al conservar el estado de CY, pueden se utilizadas en rutinas aritméticas de pre-cisión múltiple.

El ejemplo 6.14 es una muestra de un lazo de programación realizado con es-tructura lógica al menos un paso. Ejemplo 6.14

La tarea consiste en sumar el contenido de los valores almacenados en dos bloques A y B de la memoria del sistema. El usuario suministra la dirección inicial de cada bloque y el número de valores a sumar. El programa retorna la suma, en el blo-que A.

lxi h,dira ; Dirección inicial bloque a lxi b,dirb ; “ “ “ b mvi e,num ; Número de valores a sumar smem: ldax b ; Dato del bloque b al a add m ; Sumar con dato del bloque a mov m,a ; Resultado al bloque A inr l ; Dirección siguiente de ambos inr c ; bloques

dcr e ; Decremento del contador jnz smem ; Repetir hasta contador igual 0 hlt

Al inicio del programa se introducen las direcciones de inicio de ambos blo-

ques de memoria, y el número de elementos de cada bloque. El lazo SMEM, se inicia sumando las posiciones correspondientes de ambas áreas, hasta cuando el registro contador llega a cero, momento cuando finaliza el lazo.

Page 271: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

252

El modo alterno para control de iteración es DO-WHILE o estructura quizás ningún paso. En la figura 6.31 se observa que la decisión de control del lazo es reali-zada al inicio del lazo, por lo cual existe la posibilidad que nunca se ejecute la se-cuencia de código. Si se usa DO-WHILE para realizar N iteraciones, debe cargarse el contador con el valor N+1, como indica el ejemplo 6.15

Ejemplo 6.15

Use una estructura DO-WHILE para resolver el problema planteado en el

ejemplo anterior.

lxi h,dira ; Dirección inicial bloque a lxi b,dirb ; “ “ “ b mvi e,num+1 ;Número de valores a sumar smem: dcr e ; Decremento del contador

jz salir ; Si contador cero, salir ldax b ; Dato del bloque b al A add m ; Sumar con dato del bloque a mov m,a ; Resultado al bloque a inr l ; Dirección siguiente de ambos inr c ; Bloques

jmp smem ; Repetir salir: hlt

En este caso la consulta se realiza al inicio del lazo, observe que si carga el va-

lor 1 en el contador, no se ejecutará paso alguno. El primer decremento del contador, lo hace cero y la instrucción de salto condicional forzará la salida de la rutina.

El uso de registros de 8 bits como contadores, limita el número posible de ite-raciones a 256. En casos que sea necesario un número mayor de pasos en un bucle, pueden usarse registros pares para el control de los pasos. El 8085A tiene instruccio-nes para el incremento y decremento de registros pares. Estas son: INX y DCX.

INX rp (rp)←(rp) + (1)

Suma uno al registro par especificado DCX r (rp)←(rp) - (1)

Substrae la unidad del registro par especificado. Estas instrucciones, por desgracia, no afectan las banderas de µP. De modo

que para probar cuando el registro contador llega a cero, debe usarse otro método. Considere ahora que el programa anterior deba sumar el contenido de un nú-

mero de posiciones de memoria superior a 256, por ejemplo 512. La solución se muestra en el ejemplo 6.16.

Page 272: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

253

Ejemplo 6.16

Use una estructura REPEAT-UNTIL para sumar los contenidos de las posicio-

nes correspondientes de dos bloques de memoria de 512 bytes. La dirección inicial de cada área de la memoria es: E200H y E800H

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ Lxi sp,tope ; Se inicia el apuntador de pila lxi h,e200h

lxi b,e800h lxi d,200h ; Se sumarán 512 valores call smem hlt

;---------------------------------------------------------------------------------- ; Subrutina SMEM ;---------------------------------------------------------------------------------- smem: ldax b

add m mov m,a inx h inx b dcx d ; Decremento del contador mov a,e ; Byte bajo del contador al a ora d ; Se realiza un OR con el byte bajo jnz smem ; Si z=1, el contador llegó a cero ret

El programa principal carga las direcciones de inicio de cada zona de la me-

moria donde se encuentran los sumandos. El registro par DE se usa como contador de las 512 posiciones a sumar. La subrutina SMEM realiza la suma y en cada paso com-prueba si el contador llegó a cero. Para esto se ejecuta una función OR entre ambos bytes del contador. El resultado será cero sólo cuando el contenido de los registros D y E sean ambos cero.

No es imprescindible conocer con anterioridad el número de pasos que debe

transitar un bucle de programación. La salida o mantenimiento del lazo puede depen-der de la ocurrencia de un evento y no del estado de un contador.

Ejemplo 6.17

Dada la dirección de inicio de una zona de la memoria, el programa debe leer

cada posición. Si el valor en una celda es mayor o igual a 16, debe sustituirse con FFH. En caso que el dato sea menor que 16, debe escribirse el número 20H en la po-sición de memoria bajo prueba. El proceso debe culminar cuando el dato leído sea igual a 41H.

Page 273: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

254

lxi h,e200 ; Dirección de inicio en hl prox: mov a,m ; Mover valor al a

cpi 41h ; Comparar con 41h jz salir ; Si igual, salir cpi 10h ; Comparar con 16 jc menor ; Si menor, escribir 20h mvi m,ffh ; Si mayor o igual, escribir ffh jmp seguir

menor: mvi m,20h seguir: inx h ; Apuntar posición siguiente

jmp prox ; Leer valor siguiente salir: hlt

El número de pasos que cumple el lazo depende de en cual posición se en-

cuentre el patrón 41H. Si es hallado en la primera celda examinada: E200H, el pro-grama finalizará sin recorrer algún paso. Si 41H está almacenado en la posición con dirección E9FFH, se leerán 2048 celdas y se realizarán las sustituciones correspon-dientes. Ejemplo 6.18

Se requiere llenar un área de memoria con un valor determinado. Los datos de

entrada son la dirección inicial y final de la zona de memoria y el dato a escribir.

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila lxi h,dinicio lxi d,dfinal inx d mvi b,dato call llenar hlt ;---------------------------------------------------------------------------------- ; Subrutina LLENAR ;---------------------------------------------------------------------------------- llenar: mov m,b inx h mov a,l cmp e jnz llenar mov a,h cmp d jnz llenar ret

El programa lee la posición de inicio: DINICIO, y sustituye su contenido, y el

de posiciones consecutivas, con el valor DATO. El proceso culmina cuando se ha escrito la posición de memoria con dirección DFINAL.

Page 274: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

255

Instrucciones de suma ADD r, ADD M y ADI dato suman el contenido del A y el operando de refe-

rencia. Las otras tres instrucciones de suma: ADC r, ADC M, y ACI dato suman el operando y el bit de acarreo al byte en el acumulador. Afectan todas las banderas. ADD r (A)←(A) + ( r)

Suma el acumulador y el registro especificado, el resultado se deposita en el acumulador.

Ejemplo: ADD C, con (A) = 34H y (C)=76H 00110100 (A) 34H + 01110110 (C) 76H 10101010 (A) AAH

ADD M (A) ←(A) + [(H)(L)]

Ejecuta la suma entre el acumulador y el contenido de la posición de memoria

apuntada por el registro par HL, el resultado se carga en el acumulador.

ADI dato (A) ←(A) + (dato)

Realiza la suma entre el segundo byte de la instrucción y el dato en el A.

ADC r (A) ← (A) + ( r) + (CY)

Suma el dato en el acumulador, el contenido del registro especificado y la bandera de acarreo. El resultado se deposita en el acumulador.

ADC M (A) ←(A) + [(H)(L)] + (CY)

Suma el dato en la posición de memoria, el acumulador y el bit de acarreo. ACI dato (A) ←(A) + (dato) + (CY) El bit de acarreo y el dato se suman al acumulador.

Page 275: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

256

Suma de números binarios

La instrucción de suma ADD realiza la operación de adición de dos números de 8 bits, sin considerar el estado del bit de acarreo, pero activa a CY si ocurre des-borde desde el bit 7 del acumulador. Las reglas para la suma binaria son como se in-dica a continuación,

0 + 0 = 0 1 + 0 = 1 0 + 1 = 1 1 + 1 = 0, con acarreo igual a 1 El programa mostrado en el ejemplo 6.19, ejecuta la suma de dos números al-

macenados en posiciones consecutivas de memoria

Ejemplo 6.19

Dos valores obtenidos desde los puertos de entrada 00H y 04H, son almace-nados en posiciones consecutivas de memoria, a partir de la dirección MEM. El pro-grama principal llama a una subrutina SUMA, la cual realiza la suma de los valores en memoria y devuelve el resultado en la posición con dirección MEM+2.

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila in 00h sta mem in 04h sta mem+1 call suma hlt ;---------------------------------------------------------------------------------- ; Subrutina SUMA ;---------------------------------------------------------------------------------- suma:

lhld mem ; Cargar en hl los datos de la suma mov a,h ; Mover dato en h al acumulador add l ; Sumar con el otro dato en l sta mem+2 ; Resultado a memoria ret

Observe que los sumandos son pasados a la subrutina desde la memoria y el

resultado también es devuelto en la memoria. Para sumar ahora los contenidos de dos posiciones de memoria no consecutivas, analice el ejemplo 6.20.

Ejemplo 6.20

Dos valores están almacenados en las posiciones de memoria no consecutivas

MEM1 y MEM2, El programa debe sumar los números y depositar el resultado en la dirección de memoria RESULT.

Page 276: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

257

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila lxi h,mem1 ; En HL dirección del sumando 1 lxi b, mem2 ; En BC dirección del sumando 2 lxi d, resul ; En DE dirección del resultado. call suma hlt ;---------------------------------------------------------------------------------- ; Subrutina SUMA ;---------------------------------------------------------------------------------- suma: ldax b ; Cargar en a sumando 1

add m ; Sumar con el otro operando stax d ; Resultado a memoria ret

En este caso las direcciones donde se encuentran los sumandos y donde debe

depositarse el resultado, son pasadas a la subrutina en los registros pares del microprocesador. La pila de memoria también puede ser utilizada para transferir datos a una subrutina. El ejemplo 6.21 ilustra el uso de esta zona de la memoria para el paso de los operandos de una subrutina de suma.

Ejemplo 6.21

Escribir un programa que sume la penúltima entrada al stack con la palabra en

memoria cuya dirección está en el tope de la pila. Esta dirección debe contener el resultado de la operación con el byte menos significativo del resultado en la dirección más baja. Considere que el contenido de la memoria antes de ejecutar el programa es el mostrado en la figura 6.32.

02

94

31

X 2000H

1FFFH

1FFEH

BA

76

00

0201H

0200H

1FFDH

1FFCH

02

94

31

X 2000H 1FFFH 1FFEH

4E

A8

00

0201H 0200H

1FFDH 1FFCH

pila

pila

Antes Después Fig. 6.32 Contenido de la memoria y de la zona de pila antes y después de ejecutar el programa.

Page 277: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

258

La operación a realizar es: 00110001 10010100 (3194H) Segunda entrada de la pila + 01110110 10111010 (76BAH) Contenido de la dirección 201H-200H 10101000 01001110 (A84EH) 1

CY

POP H ; Se obtiene dirección de sumando 2 POP B ; Sumando 1 a registro BC MOV A,M ; Byte bajo de sumando 2 al A ADD C ; Se suma a byte bajo de sumando 1 MOV M,A ; Resultado parcial a memoria INX H ; Dirección de Byte alto de sumando 2 MOV A,M ; Byte alto de sumando 2 al A ADC B ; Se suma al byte alto de sumando 1 y al CY MOV M,A HLT

Observe que el uso del la instrucción ADC, garantiza que el valor del acarreo

desde el bit 7 del acumulador después de la suma de los bytes menos significativos de los sumandos de 16 bits, es tomado en cuenta y agregado a la suma de los bytes altos. No se considera el acarreo desde el bit 7 del byte de orden alto.

Suma de números decimales

Los periféricos de entrada al microcomputador no siempre entregan los datos numéricos al computador en código binario o ASCII. Un interruptor rotativo (Thumb- wheel switch) de 1 polo y 10 posiciones, por ejemplo, produce una salida de 4 bits con la información codificada en decimal. La lectura del puerto transferirá al acumu-lador el número BCD. Si se usa un puerto para cada dígito, los valores pueden ser almacenados en posiciones consecutivas de memoria para estar disponibles para pro-cesamiento posterior.

En el caso de sistemas que presenten información de salida en indicadores de

siete segmentos, los resultados del tratamiento de los datos de entrada deben ser escri-tos al puerto codificados en BCD. El procedimiento usual es convertir los datos de entrada a binario natural, procesarlos y volverlos a convertir a BCD antes de transferir los resultados. Si el procesamiento numérico de los datos consiste en operaciones aritméticas simples, puede ser conveniente realizarlas directamente como operaciones en BCD, sin necesidad de utilizar las rutinas de conversión de datos de BCD a binario y de binario a BCD.

Aunque el 8085A no tiene instrucciones para ejecutar suma de números deci-

males. Para realizar este tipo de operación pueden sumarse los valores BCD usando

Page 278: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

259

la instrucción para suma binaria ADD, y realizar a continuación un ajuste decimal del resultado en el acumulador. Para esta última operación, se usa la instrucción DAA.

DAA

Ensambla el byte en el acumulador como dos dígitos de cuatro bits codifica-

dos en decimal. Afecta todas las banderas y requiere el uso del bit de acarreo auxiliar, AC. Para entender como funciona la instrucción considere la siguiente operación de dos números BCD:

ADD C, con (A) = 3410 y (C)=7610 0011 0100 (A) 34H + 0111 0110 (C) 76H 1010 1010 (A) AAH El resultado de la operación es incorrecto, porque ADD considera los valores

de entrada y la salida como binarios. La suma en decimal de 3410 y 7610 debe ser 11010.

Si ahora se ejecuta la instrucción de ajuste decimal, DAA, con (A) = AAH PASO 1 Si el nibble de orden bajo del acumulador es mayor que 9 o la bandera AC es uno, se suma 6 al acumulador. Como A es mayor que 9, 1010 1010 AAH + 0000 0110 06H 1011 0000 B0H 1

AC PASO 2 Si el nibble de orden alto del acumulador es mayor que 9 o la bandera de acarreo es uno, se suma 6 al nibble más significativo del acumulador. Debido a que B es mayor que 9, 1011 0000 B0H + 0110 0000 60H 0001 0000 1010

1 CY La bandera de acarreo está activada a 1 y el dato en el acumulador es 1010, de modo que el resultado es 11010, si se considera el estado del bit CY.

Page 279: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

260

Considere ahora la suma de los dígitos 710 y 810, ADD C, con (A) = 0810 y (C)=0710 0000 1000 + 0000 0111 0000 1111 (A) 0FH El resultado de sumar 810 y 710 es 1510. DAA, con (A) = 0FH PASO 1 0000 1111 AAH + 0000 0110 06H 0001 0101 1510

1 AC

Como el nibble de orden alto del acumulador es menor que 9 y AC es cero, es innecesario el paso 2, y el resultado en decimal corresponde al contenido del A. En realidad conviene realizar un par de observaciones sobre el modo en que el

µP realiza las operaciones internas durante la ejecución de DAA. Para esto suponga que se tiene el valor 00H en el acumulador y uno en el bit de acarreo, como resultado de la suma binaria 87H+79H=100H. Sí ahora se realiza el ajuste decimal del A.

DAA, con (A) = 00H (CY) = 1 (AC)=1 PASO 1 Como bandera AC es uno, se suma 6 al acumulador. 0000 0000 00H + 0000 0110 06H 0000 0110 06H La bandera de acarreo CY permanece activada. PASO 2 La bandera de acarreo es uno, por lo cual se suma 6 al nibble más significativo del registro acumulador. 0000 0110 06H + 0110 0000 60H 0110 0110 6610

La bandera de acarreo CY se mantiene en uno.

Page 280: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

261

La bandera de acarreo está en 1 y el dato en el acumulador es 6610, de modo que el resultado es 16610, si se considera el estado del bit CY. Las sumas internas del paso 1 y 2 de DAA, pueden afectar la bandera de acarreo. Si durante el paso 1, ocurre un desborde desde el bit A3, y este se propaga hasta salir del bit A7, efectivamente la bandera CY se activará. Pero si está en uno como resultado de la suma binaria, la adi-ción interna no la pondrá en cero. Durante el paso 2 ocurre algo similar. La suma de 06H a los cuatro bits de orden alto del A, puede llevar a uno a CY, pero no la inicia en cero después de una suma sin acarreo. La preservación de la bandera CY de la suma binaria, permite realizar operaciones de suma decimal mayores de dos dígitos.

Como dato curioso, ninguno de los simuladores del 8085A utilizados por el

autor para probar los ejemplos, ejecutaron la instrucción DAA en forma correcta. Se probaron al menos una decena de simuladores.

Es necesario que el lector entienda que la instrucción DAA no convierte el da-

to en el registro acumulador a números decimales. Solo ensambla como dos dígitos BCD el byte almacenado en el A, resultado de la suma de dos números decimales. Esta es la única instrucción que requiere examinar la bandera de acarreo auxiliar para realizar su función. DAA debe ser usada sólo con instrucciones que afecten este bit de estado. Por ejemplo, suponga que se carga en el registro acumulador el valor 20H usando la instrucción MVI A,20H. Si a continuación se ejecuta DAA, el contenido del acumulador se mantiene en 20H. Si por el contrario, los registros A y B contienen los valores decimales: A=1710 y B=0910, y se suman usando ADD B, se obtiene como resultado A=20H y la bandera AC se pone a uno. Si ahora se realiza un ajuste decimal del A, el dato en el A después de ejecutar DAA será 2610. Tenga en cuenta en cuenta que 1710 + 0910 = 2610.

Ejemplo 6.22

Deben sumarse dos números decimales de 4 dígitos. Los operandos están al-macenados en la memoria como indica la figura 6.33. Los 3 bytes del resultado, se cargarán en las 2 posiciones de memoria ocupada por el operando 1, y en la siguiente.

95

48

37

67

E041H

E040H

E051H

E050H

67

15

33 E041H E040H

E050H

E042H 01

Antes Después Fig. 6.33 Contenido de la memoria antes y después de ejecutar el la suma 3748+9567.

Page 281: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

262

El procedimiento para realizar la operación y el programa de suma decimal, se presentan a continuación:

Cargar cero en el bit de acarreo. Sumar los dos dígitos menos significativos de los operandos: Realizar el ajuste decimal del resultado. Mover los dos dígitos del resultado a la memoria. Sumar los dígitos restantes y la bandera de acarreo. Si existe acarreo desde el bit 2*N, mover 1 a la memoria.

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila

mvi b,2 ; Cargar contador de dígitos lxi h,e040h ; HL apunta a sumando 1 lxi d,e050h ; DE apunta a sumando 2 call sumdec ; Realizar la suma hlt

;---------------------------------------------------------------------------------- ; Subrutina SUMDEC ;---------------------------------------------------------------------------------- sumdec: ana a ; Bit de acarreo a cero sum: ldax d ; Dos dígitos de sum.1 al a

adc m ; Sumar a dos dígitos del sum2 daa ; Ajuste decimal mov m,a ; Resultado parcial a memoria dcr b ; Contador menos 1 jz acarr ; Al terminar, probar CY inx h ; Siguientes dígitos de sum.2 inx d ; Siguientes dígitos de sum.1 jmp sum ; Continuar operación

acarr: rnc ; Retornar si cy es cero. inx h ; Si CY=1, cargar la siguiente mvi m,01 ; Posición de la memoria

ret

Fig. 6.34 Resultado de la suma de dos números de 6 dígitos

Page 282: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

263

La subrutina SUMDEC puede sumar valores decimales de 2N dígitos, con N igual al valor inicial del contador. Por ejemplo para 6 cifras, debe cargarse 03H en el registro B. El resultado de la operación se presenta como un valor de 2N+1 dígitos. La figura 6.34 muestra el contenido de la memoria después de la ejecución de la suma 954.567 + 954.567. El código del programa a partir de E000H y el resultado de la operación en E040H-E043H.

Una aplicación de las instrucciones aritméticas en la comprobación del fun-

cionamiento del sistema microcomputador, consiste en la prueba de la memoria EPROM o ROM usando el método de verificación por suma total (checksum). La prueba requiere que en el momento de la programación del chip, se grabe en la posi-ción final un valor correspondiente al resultado de sumar los datos de todas las posi-ciones de la memoria, excepto la que contiene la suma total. La operación de suma no debe considerar el acarreo. En algunos casos se usa como se usa el complemento a dos de la suma total.

Es usual que al arrancar un sistema, ejecute unas rutinas de diagnóstico que incluye la prueba de la EPROM. La rutina obtiene la suma total y la compara con el byte almacenado en la posición final de la memoria. Si los datos coinciden, es muy probable que el dispositivo esté en buen estado. Una divergencia en los valores com-parados, indica con certeza que la memoria está dañada. La confiabilidad de la prueba es alta, a pesar que existe una pequeña probabilidad que una combinación de errores en los datos programados hagan que el resultado coincida con la suma total. Ejemplo 6.23

Escriba un programa de que permita probar el estado de una memoria ROM, usando el método de verificación por suma total.

lxi d,dfin ; Obtener dirección final de la ROM lxi h,dini ; Cargar dirección final en HL mvi b,0 ; Suma se inicia en cero cont: mov a,m ; Dato en memoria al acumulador add b ; Agregar a suma acumulada mov b,a ; Guardar resultado inx h ; Apuntar dirección siguiente mov a,e ; Comprobar si el contenido del cmp l ; Registro par HL jnz cont ; Corresponde a la mov a,d ; Dirección de la cmp h ; Útima posición de la memoria jnz cont ; Si no esa sí, leer posición siguiente mov a,b ; Mover al a, la suma total calculada xra m ; Poner Z=1 si la ROM está buena hlt

El programa coloca en uno la bandera de cero cuando la ROM esté en buen es-

tado.

Page 283: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

264

Instrucciones de sustracción El 8085A tiene seis instrucciones dedicadas a realizar la operación de resta de

números binarios. SUB r, SUB M y SUI dato sustraen el contenido del acumulador y el operando especificado. Las otras dos instrucciones de resta son: SBB r, SBB M, y SBI dato sustraen el operando y la bandera de acarreo del byte en el A. Afectan todas las banderas. SUB r (A)←(A) - (r)

Resta el dato en el registro especificado del contenido del acumulador, en el cual se deposita el resultado. La operación se realiza sumando al A el complemento a dos del sustraendo, como se muestra a continuación.

Ejemplo: SBB C, con (A) = B4H y (C)=76H 10001001 -76H complemento a 1 del sustraendo + 00000001 10001010 8AH complemento a 2 del sustraendo 10110100 (A) B4H + 10001010 (C) 8AH 00111110 (A) 3EH

1 CY

La suma con complemento a dos no afecta el contenido del registro, pero acti-

va el bit de acarreo. La instrucción complementa a CY para usarse como bandera de préstamo.

SUB M (A) ←(A) - [(H)(L)] Ejecuta la sustracción del contenido de la posición de memoria apuntada por

el registro par HL, del dato en el acumulador.

SUI dato (A) ←(A) - (dato)

Resta inmediata del dato especificado del byte en el acumulador.

SBB r (A) ←(A) -(r) - (CY)

Sustrae el byte almacenado en el registro especificado y el bit de acarreo, del contenido del acumulador. Al incorporar a la operación el bit CY, puede ser usado para sustracciones multibyte. SBB opera como se indica a continuación:

Page 284: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

265

SSB C, con (A) = 10H, (C)=08H, (CY)=1 00001000 (C) 08H 00010000 (A) 10H + 00000001 (CY)01H + 11110111 (CY)F7H complemento a 2 (C+CY) 00001001 (C) 09H 00000111 (C) 07H SBB agrega la bandera CY al sustraendo, obtiene el complemento a 2 del re-

sultado y lo suma al valor en el acumulador.

SBB M (A) ←(A) - (r) - (CY)

Resta el byte en la posición de memoria indicada por el registro par HL y el bit de acarreo, del valor en el acumulador.

SBI dato (A) ←(A) - (dato) - (CY) El dato especificado y la bandera de acarreo, son sustraídos del contenido del acumulador. Resta de números binarios

La programación de operaciones de sustracción de números binarios, se reali-

za en forma similar a como se procede para la suma. Para operandos de 8 bits se usa la instrucción SUB o SUI, mientras que para restas de números de varios bytes se recurre a SBB o SBI. Las reglas de la operación aritmética de substracción son,

0 – 0 = 0 1 – 0 = 1 0 – 1 = 1, con préstamo igual a 1 1 – 1 = 0

Ejemplo 6.24

Escribir una subrutina que realice la resta de dos valores de 32 bits. El mi-nuendo y el sustraendo están almacenados en memoria como indica la figura 6.35.

F2

2B

46

46 2003H

2002H

2001H

4A

23

1002H

1001H

2000H

23 1003H

46

1000H

F2

46

46

46 2003H

2002H

2001H

FC

22 1002H

1001H

2000H

23

C7 1000H

1003H

sustraendo

minuendo

Fig. 6.35 Ubicación en la memoria del minuendo y el sustraendo.

Page 285: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

266

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila

ora a ; Bit de acarreo a cero mvi b,04 ; Cargar contador de bytes lxi h,1000h ; HL apunta a sustraendo lxi d,2000h ; DE apunta a minuendo call resta ; Realizar operación hlt

;---------------------------------------------------------------------------------- ; Subrutina RESTA ;---------------------------------------------------------------------------------- resta: ldax d ; Minuendo al A

sbb m ; Restar sustraendo mov m,a ; Resultado parcial a memoria dcr b ; Contador menos 1 rz ; Retornar si z=1 inx h ; Byte siguiente del sustraendo inx d ; Byte siguiente del minuendo jmp resta ; Continuar operación

Un contador cargado por el programa principal, permite variar el número de bytes de los operandos de la sustracción.

Resta de números decimales

La instrucción de ajuste decimal DAA no funciona sobre el resultado de la

resta de dos números decimales, de modo que para realizar operaciones de sustrac-ción decimal debe representarse el minuendo como un valor decimal negativo y su-marse al minuendo. Considere la operación simple de restar el número 1710 de 7810.

7810 7810 - 1710 + 8310 61 16110 El resultado de la operación a la derecha es 6110 si se descarta el desborde

ocurrido en el dígito de las decenas. Esto se debe a que el valor 8310 es el comple-mento a diez del sustraendo 1710. Para obtener este complemento debe formarse el complemento nuevo restando cada dígito del número nueve y sumársele al resultado la unidad,

99 - 17 sustraendo 82 complemento nueve + 1 83 complemento diez En operaciones con varios dígitos debe considerarse la bandera de préstamo.

En este caso el bit de acarreo en uno indica la ausencia de préstamo desde el sus-traendo, debiéndose sumar el complemento a diez al próximo dígito. Si el bit de aca-

Page 286: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

267

rreo tiene un valor cero, indicando la ocurrencia de préstamo, debe usarse el com-plemento a nueve en la siguiente operación.

Ejemplo: 982510 - 345210 637310 PASO 1 Obtener el complemento a diez del número 5210 y sumárselo a 2510 01001000 (48H) Complemento diez de 52 + 00100101 (25H) 0←01101101 (6DH) El bit de préstamo es cero PASO 2 Realizar el ajuste decimal del resultado parcial 0110 1101 6DH + 0000 0110 06H 0111 0011 7310 PASO 3 Obtener el complemento a nueve del número 3410 y sumárselo a 9810 01100101 (34H) + 10011000 (98H) 0←11111101 (FDH)

1 AC

PASO 4 Realizar el ajuste decimal del resultado 1111 1101 FDH + 0000 0110 06H 0000 0011 1310

1 AC

0000 0011 FDH + 0110 0000 60H 0110 0011 6310

1 AC

Page 287: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

268

Ejemplo 6.25 El programa siguiente usa la subrutina RDEC para restar dos valores decima-

les de 2*N bits. El minuendo está almacenado el la dirección de memoria MINU y el sustraendo en SUBST. En está última posición se carga el resultado de la operación.

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila

lxi sp,dpila ; Se fija la base de la pila lxi h,sustr ; Dirección del sustraendo a hl lxi d,minu ; Dirección del minuendo a de mvi b,n ; Contador de par de dígitos decimales call rdec hlt

;---------------------------------------------------------------------------------- ; Subrutina RDEC ;---------------------------------------------------------------------------------- rdec: stc ; Acarreo en uno. no prestamo. rep: mvi a,99h ; 9910 al acumulador

aci 0 ; Se suma el acarreo al a sub m ; Complemento 10 del sustraendo xchg ; HL apunta al minuendo add m ; Suma del complemento al minuendo daa ; Ajuste decimal del resultado xchg ; HL apunta al sustraendo mov m,a ; Resultado a memoria dcr b ; Disminuir B rz ; Retornar si B es cero inx h ; Próximo byte (2 díg..) del sustraendo inx d ; Próximo byte (2 díg..) del minuendo jmp rep

Multiplicación de números binarios

El producto de dos números binario sin signo puede obtenerse por medio de dos técnicas: sumas repetidas y sumas y desplazamientos. El primer método consiste en sumar el multiplicando tantas veces como indique el multiplicador. Tal procedi-miento tiene la desventaja de ser muy lento, pero si la velocidad de cómputo no es un factor crítico puede ser utilizado.

Ejemplo 6.26 Debe usarse el método de suma repetidas para multiplicar dos números bina-

rios enteros de 8 bits. El operando multiplicador se carga en el registro C y el multi-plicando en el registro E.

Page 288: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

269

mvi l,0 ; Resultado bajo a cero mov h,l ; Resultado alto a cero

mov d,h ; Multiplicando alto en cero mult: dad d ; Suma multiplicando a resultado

dcr c ; Decremento del multiplicador jnz mult ; Si cero salir. hlt

La rutina de multiplicación por sumas repetidas fue utilizada para computar el producto 45H*64H = 1AF4H, requiriéndose 2417 estados para completar la opera-ción. A una frecuencia de 3.125 MHz, esto representa un tiempo de 0.7 mS. El tiempo de cómputo del programa varía con el valor del multiplicador.

La técnica de sumas y desplazamiento para multiplicar es mucho más rápida

y se realiza en forma similar a como se obtiene un producto usando lápiz y papel. Las reglas de la multiplicación binaria son como se indica a continuación,

0 * 0 = 0 1 * 0 = 0 0 * 1 = 0 1 * 1 = 1 El producto final de la operación es la suma de una serie de productos parcia-

les. Existe un resultado parcial por cada bit del multiplicador. Si un dígito del multi-plicador es igual a uno, el producto correspondiente es igual al multiplicando. En caso que el bit sea cero, el producto parcial será cero. Cada producto intermedio estará desplazado un lugar a la derecha con respecto al inmediatamente inferior.

Ejemplo:

11001101 (CDH) Multiplicando 11000111 (C7H) Multiplicador

11001101 11001101

11001101 00000000 00000000 00000000 11001101 11001101 1001111101011011 (9F5BH) Resultado de 16 bits

La multiplicación de números de 1 byte produce un resultado de 2 bytes. En

general, el número de bits del resultado es igual a la suma del número de bits de los operandos. De modo que al multiplicar un valor de 8 bits por uno de 16 bits se ob-tendrá un producto de 24 bits.

Cuando se programa el algoritmo de multiplicación es más conveniente sumar

cada producto parcial al ser formado, en vez de totalizarlos todos al final como se realiza en forma manual.

Page 289: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

270

Para simplificar el programa se forman los productos parciales desde abajo hacia arriba, lo cual es equivalente a procesar los bits del multiplicador de izquierda a derecha, en contraposición a como se realiza con lápiz y papel. Antes de sumar un producto parcial, se desplaza un lugar a la izquierda produciendo el mismo efecto que si cada producto intermedio hubiese sido desplazado un lugar a la derecha con respecto al de abajo.

Ejemplo 6.27

Escribir un programa para multiplicar dos valores binarios enteros de 8 bits.

Se supone que el registro C contiene el operando multiplicador y el E el multipli-cando. El producto resultante se carga en el registro par HL.

mov h,c ; Multiplicador al registro h mvi l,0 ; Se carga cero en byte bajo del resultado. mov d,l ; Byte alto del multiplicando a cero mvi b,8 ; Contador de bits

mul: dad h ; Bit msb del multiplicador al carry. jnc nsu ; Si es 0,no sumar multiplicando a resultado dad d ; Si es 1, sumar multiplicando a resultado

nsu: dcr b ; Disminuir contador de bits. jnz mul ; Si b es no cero, procesar próximo bit del hlt ; Multiplicador. si b cero, salir

Para probar cada bit del multiplicador, éste se carga en el registro H y se utili-

za la instrucción DAD H para rotar el registro HL. Cada ejecución de esta instrucción tiene doble efecto. Si el bit 7 de H es uno, ocurrirá un desborde y la bandera de aca-rreo se pone en uno, detectándose un bit uno del multiplicador. La prueba posterior del bit de acarreo indica si debe sumarse el producto parcial, evitando la suma de los productos intermedios en cero.

El segundo efecto de la instrucción es que produce el desplazamiento hacia la

izquierda del producto parcial, originalmente en L, el cual progresivamente ocupa los 16 bits de HL, a medida que los bits del operando multiplicador (en H) van siendo procesados.

El µP 8085A invirtió 317 estados en calcular el producto 45H*64H = 1AF4H,

lo cual equivale a 0.1 mS. Aunque el tiempo necesario para completar una operación de multiplicación varía con el valor del multiplicador, tal dependencia no es signifi-cativa, debido a que solo se requiere realizar una suma (7 estados) por cada bit del multiplicador en uno.

Para culminar el tema de multiplicación binaria de enteros sin signo, el ejem-

plo 6.28 presenta la lista de instrucciones de un programa que ejecuta una multiplica-ción binaria con resultado de 24 bits.

Page 290: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

271

Ejemplo 6.28 En el siguiente programa realiza el producto de un multiplicando de 16 bits

(en el registro par DE) por un multiplicador de 8 bits (almacenado en el registro C). El byte más significativo del producto se carga en C y los otros dos bytes en HL. Se supone que los operandos se cargan en los registros correspondientes antes de ejecu-tar el programa.

mul168: mov a,c ; Multiplicador al registro a

mvi b,8 ; Contador de bits del multiplicador lxi h,0 ; Bytes 2 y 3 del resultado a cero

mul: dad h ; Desplazar resultado a la izquierda ral ; Cargar bit del multiplicador en CY jnc nsu ; Si bandera de acarreo es 0, no sumar dad d ; Si cy es 1, sumar multiplicando aci 0 ; Si hay desborde, sumar CY al a

nsu: dcr b ; Disminuir b jnz mul ; Si B es no cero, próximo bit mov c,a , Si B es 0, salir. ret

El algoritmo de la multiplicación de 16 x 8 bits es similar al utilizado para

programar el producto de dos números de 8 bits. En este caso, para formar el resulta-do de 24 bits, el producto parcial se desplaza desde el registro HL hacia el acumula-dor a través del bit de acarreo. Rotando el A hacia la bandera de acarreo se prueban los bits del multiplicador. Para considerar el desborde del bit más significativo del registro par HL se usa la instrucción ACI 0, la cual suma el bit de acarreo al conteni-do del acumulador.

División de números binarios La operación de división se ejecuta usando las reglas de multiplicación y sus-

tracción, tal como se realiza en aritmética convencional. Por ejemplo, considere la división A5H ÷ 12H,

Ejemplo:

1001 Cociente Divisor 10010 10100101 Dividendo

10010 000101

00000 001010 00000 010101 10010 00011 Residuo

El resultado de la operación es 1001B (09H) y el residuo 11B (03H).

Page 291: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

272

La división es un poco más compleja de realizar que la multiplicación, pero se basa en los mismos principios usados en la aritmética clásica. El procedimiento para realizar la operación de división binaria, se expone a continuación,

1. Se seleccionan los bits del dividendo, iniciando por el más significativo. Mientras el

grupo de bits elegidos representen un valor menor que el divisor se colocan ceros en el cociente.

2. Cuando los dígitos extraídos del dividendo forman un número que supera al divisor, se coloca uno en el cociente y el divisor es restado del dividendo parcial. El resulta-do constituye el primer residuo parcial.

3. En cada paso del proceso se toman bits adicionales del dividendo y se colocan en el residuo parcial. El divisor es comparado con nuevo residuo parcial. Si el divisor es menor o igual, se sustrae del residuo parcial y uno es colocado en el cociente. En ca-so contrario, se pone cero en el cociente permaneciendo invariable el residuo par-cial.

4. Después de cada paso el residuo parcial es desplazado un bit hacia la izquierda. El proceso finaliza cuando se halla seleccionado el bits menos significativo del divi-dendo

Ejemplo 6.29

Escribir una rutina para dividir dos valores binarios de 16 bits y producir un

cociente y un residuo de 16 bits. El registro par DE contiene el dividendo y el cocien-te. El registro BC almacena el divisor y el residuo se carga en el registro HL.

div1616: mvi a,10h ; Contador de bits a 16 lxi h,0 ; HL en cero al inicio div1: xchg ; CY msb del dividendo dad h xchg jnc cy0 ; Bit del dividendo se carga en dad h ; HL desde CY y HL se inr l ; desplaza jmp cont ; un bit cy0: dad h ; hacia la izquierda cont: inr e ; Uno al cociente push psw ; Se salva el contador de bits mov a,l ; Se resta el sbb c ; Dividendo parcial mov l,a ; Del divisor mov a,h ; El resultado sbb b ; Queda mov h,a ; En HL jnc div2 ; Si resultado es positivo, continuar dcr e ; Si es negativo cero al cociente dad b ; Restaurar residuo parcial div2: pop psw ; Recuperar contador dcr a jnz div1 ; Siguiente bit del dividendo. ret

Page 292: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

273

La programación del código de división se realizo en forma algo diferente al algoritmo descrito. Al inicio del proceso, se coloca uno en el registro cociente y el divisor se substrae del dividendo parcial cada vez que un nuevo bit del dividendo es seleccionado. Si el resultado es negativo, se remueve el uno del cociente (se cambia por cero) y se restaura el dividendo parcial, sumándole el dividendo al divisor. Al obtenerse el primer uno válido en el cociente, el proceso continúa como se indicó. Multiplicación y división de números decimales

Los algoritmos para multiplicar y dividir valores decimales son lentos y ocu-pan mucha espacio de memoria. En muchos casos puede ser más conveniente utilizar un método alternativo. Este, puede consistir en convertir los operandos decimales a binario, ejecutar la operación en este al sistema de representación numérica y conver-tir el resultado a BCD. La multiplicación decimal puede hacerse por el método de sumas repetidas, mientras que para la división, puede acudirse al procedimiento de restas repetidas. Ejemplo 6.30

Este ejemplo ilustra el método de sumas para realizar el producto de un valor

BDC de 4 dígitos almacenado a partir de la posición de memoria MPNDO por un número de dos dígitos decimales en la dirección MPDOR. A partir de ésta última po-sición se obtiene el producto de 6 cifras BCD.

lxi sp,tope ; Se inicia el apuntador de pila

lxi h,mpdor ; Dirección del multiplicador mov c,m ; Multiplicador al registro c

mvi m,0 ; Se inicia a suma en cero rep: mvi b,3 ; Producto de 6 dígitos bcd

lxi h,mpdor ; Dirección del multiplicador lxi d,mpndo ; Dirección del multiplicando call sumdec ; Se realiza la suma mov a,c ; Decremento adi 99h ; del daa ; contador mov c,a ; BCD jnz rep ; Si cero, salir hlt

La rutina SUMDEC es llamada tantas veces como indique el multiplicador. Tal valor viene expresado en BCD. Para utilizar una variable BCD como contador, se suma 99H al valor del registro y se ajusta el resultado a decimal con DAA. Su-ponga que el A contiene 15H, al sumarle 99H se obtiene AEH, y después del ajuste decimal el A tendrá 14H y la bandera de acarreo se activará a 1. Si se desea incre-mentar el contador BCD, debe sumarse 01H al A antes de realizar el ajuste decimal.

Page 293: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

274

La última instrucción aritmética del 8085A, aun no comentada, realiza la su-ma de números de 16 bits. Esta es DAD rp.

DAD rP (H) (L) ← (H) (L)+ (rh) (rl)

Suma el dato de 16 bits almacenado en el registro par especificado, al conte-nido del registro par HL. El resultado de la operación aritmética se carga en HL. Esta instrucción solo afecta la bandera de acarreo. Los registros operandos permitidos son: BC, DE, HL y el SP.

La instrucción DAD, además de permitir la suma de números de doble preci-

sión, puede ser usada para el desplazamiento hacia la izquierda de datos de 16 bits. Las instrucciones de rotación del 8085A sólo actúan sobre valores de 8 bits almace-nados en el acumulador. Cuando se requiere desplazar datos de 2 bytes, debe escri-birse una rutina con tal propósito.

Ejemplo 6.31 Escribir un programa para rotar a la izquierda números de 16 bits,

;----------------------------------------------------------------------------------- ; Programa principal ;------------------------------------------------------------------------------------ lxi sp,tope ; Se inicia el apuntador de pila

lxi h,dato16 ; Valor a desplazar mvi b,nrot ; Número de desplazamientos ora a ; Bandera de acarreo acero call rotar ;Rotar hlt

;---------------------------------------------------------------------------------- ; Subrutina ROTAR ;---------------------------------------------------------------------------------- rotar: mov a,l ; Byte bajo al acumulador

ral ; Rotar a la izquierda mov l,a ; resultado parcial mov a,h ; Byte alto al acumulador ral ; Rotar a la izquierda mov h,a ; resultado parcial dcr b jnz lazo ; próximo desplazamiento ret

La subrutina ROTAR desplaza el dato en el registro par HL, NROT posicio-

nes hacia la izquierda. El procedimiento consiste en usar la bandera de acarreo como paso intermedio para desplazar el bit 7 del registro L al bit 0 del registro H. Conside-re que el dato de dos bytes es 34A7H y que debe desplazarse dos bits hacia la iz-quierda. En la figura 6.36 se muestra el contenido del registro HL, después de cum-plirse cada rotación.

Page 294: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

275

H CY L

0 1 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 0 1 1 0 1 0 0

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 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

Estado inicial

Después de la primera rotación de L

Después de la primera rotación de H

Después de la segunda rotación de L

Después de la segunda rotación de H

Fig. 6.36 Desplazamiento de un número de 16 bits dos lugares hacia la izquierda.

Aunque en este caso no es necesario, antes de rotar el contenido del registro

H debe cargarse cero en la bandera de acarreo. Esto previene que un 1 se introduzca en el bit 0 de L cuando el registro se rota hacia la izquierda. El resultado de rotar el número 34A7H (1347910) es D29CH (5391610).

El lector puede verificar con facilidad que el desplazamiento de 34A7H, dos

lugares hacia la izquierda, ha multiplicado el número por cuatro. En general, el des-plazamiento de un valor entero hacia la izquierda multiplica el número por 2, mien-tras hacia la derecha, lo divide por 2. Por supuesto, debe considerarse si la operación desplaza un uno desde el bit 7 del dato, en cuyo caso el resultado de la multiplicación no puede representarse con un byte. Las operaciones de multiplicación y división por números potencias de dos, son factibles de realizarse con desplazamientos hacia la derecha o hacia la izquierda.

El uso de la instrucción DAD simplifica de modo considerable la tarea de ro-

tar hacia la izquierda valores de 16 bits, si se considera que la operación 2*X es equivalente a X+X. La instrucción DAD H efectivamente desplaza el contenido del registro par a HL, un bit hacia la izquierda. De modo que, una secuencia de cuatro instrucciones DAD H, realizan la misma tarea que la subrutina rotar, con NROT = 4.

Page 295: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

276

6.5 ARITMÉTICA DE PUNTO FIJO O DE PUNTO FLOTANTE

Los números binarios pueden ser representados en el computador como un va-lor entero o de punto flotante. Cada modo de representación tiene alguna ventaja que en general depende del tipo de aplicación. Los µPs y Ctrls usan por defecto aritmética entera para procesar los operandos. Para proveer representación en punto flotante en sistemas empotrados lo usual es usar una librería matemática que se incorpora al có-digo del proyecto. En cambio, los procesadores modernos incorporan en su interior un coprocesador matemático que funciona en paralelo con el µP y puede realizar además de las operaciones fundamentales, cálculos con funciones trigonométricas, exponenciales y logarítmicas. En este caso, si el programa que se ejecuta usa el co-procesador, el desempeño del sistema aumenta sustancialmente.

Las características básicas de los sistemas de representación numérica de pun-

to fijo y de punto flotante, son las siguientes:

Punto fijo

• Los números son representados y manipulados como valores enteros. • El rango de valores posibles de representar es menor. • Requiere un código más complejo.

Punto flotante

• Los números son representados por la combinación de una parte fraccional o mantisa y una parte exponencial. • Hardware adicional puede procesar estas partes. • Tiene mayor costo y es más lento.

La representación en punto flotante puede usarse si los requisitos de memoria

y velocidad de la aplicación no se ve comprometida por el código adicional necesario. El uso de hardware de punto flotante aumenta la velocidad pero incrementa los cos-tos. En sistemas basados en microprocesadores lo usual es utilizar aritmética entera para realizar las operaciones matemáticas y usar formatos especiales para representar fracciones.

Como debe haber observado el lector, todas las operaciones matemáticas rea-

lizadas con el lenguaje de máquina del 8085, produce como resultado un número en-tero. En algunas aplicaciones es común que el µP deba trabajar con números muy grandes que no pueden ser representados con un byte. En estos casos, debe recurrirse a la aritmética de precisión múltiple donde son necesarios 2 o más bytes para almace-nar los operandos y resultados. En la sección anterior se mostraron diversos ejemplos de operaciones matemáticas con entradas y salidas de números con varios dígitos. También puede ser necesario que el µP realice alguna tarea que involucre la represen-

Page 296: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

277

tación de valores fraccionales. El equivalente binario de la fracción puede ser repre-sentado por un número entero que ocupe uno o más bytes, separando las partes ente-ras y decimal por un punto decimal imaginario. La exactitud de la representación es variable. En ocasiones, la fracción puede ser representada en forma exacta en el sis-tema binario.

Por ejemplo, el sen(30°) = ½ , puede almacenarse como sen(30°) = 5000, te-

niéndose en cuenta que para obtener el resultado correcto debe dividirse este valor por 10000. Por el contrario, el número decimal sen(60°) = 0,866025403, no tendría un equivalente binario exacto con este método. El valor decimal original, debe ser truncado o redondeado para ser cargado en dos bytes: sen(60°) = 8660

También es posible que el rango de las variables procesadas durante una tarea

sea tan grande, que la representación binaria de los números enteros y fraccionales como valores multibytes, exija una cantidad de memoria apreciable. No siempre la precisión requerida del procesamiento, justifica el uso de números de precisión múlti-ple. En estos casos, si se desea un ahorro de la memoria del sistema puede apelarse a la representación de punto flotante. En este trabajo, no se discute este tópico, pudien-do el lector consultar la literatura recomendada.

Suponga ahora que debe multiplicarse por 1.73 el valor DATO (9410) usando

números de punto fijo, almacenado en memoria. Como el número 1.73 no puede ser representado, se multiplica por 100 y se ejecuta la operación entera:

(173 DATO) (173 94) 16262N 162100 100 100⋅ ⋅

= = = = Expresado en números hexadecimales como,

10(ADH 5EH) 3F86HN A2H 162

64H 64H⋅

= = = =

Observe que el valor DATO (9410) es multiplicado efectivamente por el nú-

mero 1.73, (el resultado real es 162.62) aún cuando solo se usaron números enteros. La precisión puede ser mejorada si se redondea el resultado.

Considere ahora que el µP debe medir y presentar el valor de una variable z,

la cual depende de un parámetro w, conocido. Para esto se debe resolver la ecuación: z 0.43 w 62= × − La ecuación es escalada multiplicándola por 100, para que los coeficientes del

polinomio puedan representarse con números enteros.

Page 297: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

278

z 43 w 6200= × − Se usó el valor de 100 para escalar la ecuación porque conviene por la natura-

leza de la aplicación. Se trata de un instrumento que adquiere desde un conversor A/D el valor de la muestra w, lo multiplica por 43 y luego le suma el complemento a dos de 6200. El resultado z obtenido es entonces convertido a BCD. Aunque este valor esta centuplicado no es necesario usar una rutina de división para dividirlo por 100, basta con activar el punto decimal en el tercer dígito BCD, contado a partir del dígito del extremo derecho.

En aplicaciones de procesamiento digital de señales es usual el uso de hard-

ware de punto fijo, por lo limitado de la memoria disponible y las restricciones de velocidad. Como los coeficientes de los filtros digitales son pequeños, los valores de punto fijo deben ser escalados. En general, cuando se usa aritmética de punto fijo, los números deben ser escalados para evitar condiciones de desborde errores altos de cuantización.

El punto binario es el medio por el cual los números de punto fijo son esca-

dos. Es el programa quien determina la posición del punto binario. La ALU ejecuta operaciones como suma y resta sin detectar el factor de escala. Las operaciones de punto fijo con o sin signo son ejecutadas como si el punto binario estuviese a la dere-cha del bit menos significativo. Los números en punto fijo pueden ser escalados por tipos de datos cuyo escalamiento es definido por la posición por defecto del punto decimal o se puede usar un tipo de datos en punto fijo con un escalamiento lineal arbitrario.

Los tipos de datos de punto fijo son:

Enteros

Para enteros con o sin signo el punto binario por defecto está colocado a la derecha del bit

menos significativo.

Fracciones Para fracciones sin signo, el punto binario por defecto está ubicado a la izquierda del bit

más significativo mientras para números con signo está a la derecha del bit más significa-tivo.

Números de punto fijo generalizados

No existe un punto binario por defecto. Un tratamiento con detalle del tópico de representación de datos en punto fijo

y de las técnicas de escalamiento escapa al alcance de este trabajo. El lector interesa-do debe consultar literatura relacionada. Como ejemplo, considere que se debe repre-sentar el número fraccional 0.95 y -0.75 usando una palabra de 16 bits. Una notación

Page 298: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

279

utilizada en sistemas empotrados y apropiadas para este caso es el conocido formato Qm,n, donde:

• Q indica que el número está en formato Q. • m es el número de bits usado ara representar la porción entera en complemento dos del nú-

mero. • n indica número de bits usado ara representar la porción fraccional en complemento dos del

número o el número de bits a la derecha del punto binario. Por ejemplo un número de 16 bits con signo y con 15 bits a la derecha del

punto binario se expresa como Q0.15 o simplemente Q.15. Los valores indicados se representan como:

0.9510

bn-1 bn-2 b0

0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1

-0.7510

1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

Fig. 6.37 Notación en formato Q.15

Para encontrar la representación se multiplica el coeficiente por 215. Observe

que el valor del número puede ser encontrado con: 0 1 (n 2) (n 1)

n 1 n 2 1 0N b 2 b 2 b 2 b 2− − − − −− −= − × + × + × ×

Una aplicación típica donde puede usarse el formato Q.15 es en un filtro digi-

tal. Este adquiere una muestra de una señal bipolar de entrada y la usa para resolver una ecuación diferencia que describe el algoritmo de filtrado. A continuación, el valor resultante del procesamiento de la muestra de entrada aplicado a las entradas de un conversor D/A. El formato Q.15 se usa para representarse los coeficientes de la ecua-ción del filtro. La notación Q.15 permite representar valores entre -1 y 0.99 con la ventaja que al ser todos los números ≤.1 no puede ocurrir desborde durante las opera-ciones de multiplicación.

Debido a que los cálculos se realizan usando aritmética de complemento dos,

los valores entregados por el conversor A/D deben ser trasladados a este formato. Esto puede hacerse en forma sencilla si el circuito de entrada es diseñado para leer los valores en formato binario desplazado. En esta representación al voltaje de entra-da más negativo se le asigna el número 0, cero voltios lo representa el número 128 y 255 es asignado al voltaje más positivo.

Page 299: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

280

Debido a que los microcontroladores tienen un convertidor A/D de entrada unipolar, la señal de entrada al filtro debe ser ajustada usando amplificadores opera-cionales con la onda centrada en + 2.5 voltios con variación entre 0 y +5 voltios. El valor de la muestra de entrada en binario desplazado es convertido a complemento dos simplemente mediante la inversión lógica del bit más significativo de la palabra. Una vez completados los cálculos de procesamiento de la señal, el número resultante es convertido a binario desplazado complementando el bit de mayor peso y es envia-do al conversor D/A.

Para efectos de los cálculos, los coeficientes en formato Q.15 se almacenan

en la memoria del sistema y las muestras de la señal de entrada se leen del CAD de 8 bits. La ecuación del filtro puede resolverse mediante sumas y productos, esto es los coeficientes se multiplican con signo por valores de entrada y los productos parciales son sumados con signo. El byte de entrada es multiplicado por 256 para obtener un número de 16 bits el cual es multiplicado por el coeficiente que corresponda obte-niéndose un número de 32 bits, lo cual implica un bit extra de signo que debe ser suprimido. Los resultados parciales son sumados y el resultado final es truncado o redondeado a un valor de 8 bits que va al conversor D/A y al circuito de acondicio-namiento de salida.

Por ejemplo, suponga que la entrada del filtro es una forma de onda seno de

2.5 V de amplitud. Si se le inserta a la señal un nivel DC de +2.5 V, se obtiene la on-da deseada con variación entre 0 y + 5 V. Suponga que para simplificar el ejemplo, la onda de entrada debe ser multiplicada por el coeficiente +0.75 (6000H). Considere que en un instante determinado, se adquiere desde el convertidor A/D una muestra de valor FFH, la cual se pasa a complemento dos como 7FH y a un valor de 16 bits co-mo 7F00H. Ahora se realiza la multiplicación con signo la cual da como resultado el número de 32 bits 6000H ∗ 7F00H = 2FA00000H. Eliminando el bit de signo adicio-nal se obtiene 5F400000H.

Truncando este valor a una longitud de 8 bits se tiene 5FH el cual es retorna-

do a binario desplazado como DFH. Este valor es aplicado al convertidor digital ana-lógico produciendo un voltaje de + 4.355 V. Al restituir el nivel DC de la señal se obtiene una tensión de + 1.855 V. Observe que el resultado de multiplicar la entrada por 0.75 es una salida de + 1.875 V por lo tanto se ejecutó con éxito la operación deseada.

En la práctica, programar este procedimiento para microcontroladores o mi-

croprocesadores, requiere arduos esfuerzos. Además, debe prestarse especial atención a los efectos de usar palabras de longitud limitada para representar los números. Es-tos efectos se relacionan con: cuantización de la señal en la conversión A/D, errores por redondeo-truncado y cuantización de los coeficientes del filtro. Esto puede resul-tar en desplazamiento de los polos y ceros de la función de transferencia del filtro, lo cual puede causar variaciones en la ganancia, en las frecuencias de corte del filtro o en la estabilidad del sistema.

Page 300: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

281

Lo recomendado es simular el algoritmo usando un programa de simulación adecuado, para verificar el modelo del filtro con aritmética de punto fijo y palabras de la longitud seleccionada. El paquete MATLAB y su herramienta para aritmética de punto fijo, es una buena elección para el propósito señalado.

Cálculo de la raíz entera de un número binario

Las operaciones matemáticas posibles de ejecutarse usando aritmética de pun-

to fijo no se limitan a suma, resta, multiplicación y división. En realidad, cualquier función matemática por compleja que sea, puede ser programada si se dispone del algoritmo adecuado. Usando lenguaje de máquina puede calcularse el logaritmo, la raíz cuadrada, el seno o cualquier otra función de una variable. Las limitaciones para el cómputo de cualquiera de estas funciones las impone el tiempo de CPU exigido por la aplicación. Según el caso, pueden utilizarse formulas especificas, algoritmos de aproximación o tablas de consulta. Esta última técnica disminuye en forma nota-ble el tiempo de CPU necesario para el cálculo de la función.

Considere ahora que debe calcularse la raíz cuadrada de un número entero N

usando aritmética de punto fijo. Una forma realizar esta operación es usando el mé-todo de aproximaciones sucesivas de Newton-Raphson. Dado el valor entero y posi-tivo N, si xn es una aproximación a la raíz de N, la expresión para obtener la aproxi-mación siguiente xn+1, viene dada por,

⎟⎟⎠

⎞⎜⎜⎝

⎛+=+ n

n1n x

xN

21x

El diagrama de flujo del algoritmo se presenta en la figura 6.37 y el programa

en el ejemplo 6.32. Ejemplo 6.32

El siguiente programa realiza el cálculo de la raíz de un valor entero. El núme-

ro cuya raíz se pretende calcular es de 16 bits y se obtiene a desde la posición de me-moria DMEM y DMEM+1. El resultado se carga en el registro DE.

raiz: lhld dmem ; x=N inx h ; x =N+1 mov a,h ; x(n)=x/2, x(n) BC rrc ; . mov b,a ; . mov a,l ; . rar ; . mov c,a ; . rep: lhld dmem ; n HL xchg ; HL↔DE call div1616 ; x(n+1)=n/x(n) DE=DE/BC mov h,b ; x(n+1)=x(n+1)+ x(n)

Page 301: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

282

mov l,c ; . dad d ; . inx h ; Redondear mov a,h ; x(n+1)=x(n+1)/2 rar : . mov d,a ; . mov a,l ; . rar ; . mov e,a ; . mov a,b ; Comparar x(n) con x(n+1) cmp d ; BC DE jnz cont ; Diferentes, x(n)=x(n+1) mov a,c ; . cmp e ; . rz ; Iguales, raíz en DE y ; retornar cont: mov b,d ; x(n)=x(n+1) mov c,e ; . jmp rep ; Siguiente aproximación

Fig. 6.37 Algoritmo para extracción de la raíz cuadrada de un número entero.

Page 302: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

283

Para algunos valores, el algoritmo de aproximación no funciona en forma apropiada, entrando en un lazo sin fin para aproximaciones sucesivas que difieren por uno. Esto puede corregirse detectando cuando xn-xn+ 1=1, y usando xn+1 como el valor final de la raíz. Una forma más conveniente consiste en sumar 1 al valor que se divide por 2 en la formula de aproximación, lo cual redondea el cociente evitando la oscilación. Si se suprime la instrucción INX H en el lazo de aproximación y se eje-cuta el programa con N=3, xn y xn+1 alternaran continuamente entre 1 y 2. Otro falla ocurre cuando N=1, debido a que se obtiene cero como resultado. La instrucción INX H al inicio del programa, selecciona N+1 como aproximación inicial a la raíz y corrige el problema. La precisión del cálculo depende del valor del número N. La tabla 6.8 presenta algunos resultados de la ejecución del programa, pudiendo obser-varse que para valores grandes de N, la aproximación a la raíz cuadrada es mejor.

Tabla. 6.8 Resultados de rutina RAIZ.

N Raíz programa

Raíz calculador

tcpu

(ms)

3 2 1.7320 1.37 125 11 11.1803 3.47 300 17 17.3205 9.66 670 26 25.8844 4.15

1560 40 39.4968 4.79 7834 89 885099 5.57 16384 128 128.0000 6.04 30000 173 173.2051 7.64 64637 254 254.2381 7.07

El tiempo de CPU invertido en calcular la raíz es variable. Aunque la tabla

sugiere que se incrementa con el valor de N. Observe que el tCPU es mayor para N=300 que para N=30000. Este tiempo depende en realidad del comportamiento de la formula de aproximación. En el caso de N=300 se requieren 13 aproximaciones para alcanzar el resultado, mientras que para N=30000, solo se realizan 11 estimacio-nes antes obtenerse la raíz cuadrada.

Note que el error en el cálculo de la raíz de 3 es significativo. Si debe calcu-

larse el valor de y, para x =3, se obtendría,

3182159x159y =⋅=⋅= , en lugar del valor real: 4275731159x159y .. =⋅=⋅= El error en el resultado es inaceptable, gracias a la burda aproximación de 2,

al valor de la raíz cuadrada de 3. En la tabla se observa que la precisión del resultado aumenta para los valores: x = 300 y x =30000. Si antes de extraer la raíz se multipli-ca el valor de x por 10000, se ejecuta el producto y el resultado se divide por 100, se tiene:

27510

103159y2

4=

⋅⋅=

Page 303: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

284

El programa del ejemplo 6.33 realiza esta operación. Ejemplo 6.33

lxi d,2710h ;1000010 a DE mvi c,3 ;3 al registro C call mul168 ;HL=3*10000 shld dmem ;30000 a memoria call raiz ;DE=raiz(30000) mvi c,9fh ;15910 c call mul24 ;HL=159*raiz(3000) mvi c,64h ;10010 c xchg ;DE hl call div1616 ;DE=159*raiz(3000)/100 hlt

6.6 INSTRUCCIONES ADICIONALES Se han presentado 68 del conjunto general de 74 instrucciones del 8085A,

habiéndose utilizado la mayoría de estas en los ejemplos de programación. De las instrucciones restantes, la función HLT es conocida por el lector. Las instrucciones SIM, RIM, EI y DI se discutirán cuando se trate el tópico de interrupciones.

Tabla. 6.9 Instrucciones no comentadas

Instrucciones adicionales

HLT Parada EI Habilitar interrupción

SIM Poner máscara de interrupción DI Inhibir interrupción

RIM Leer máscara de interrupción NOP Ninguna operación

Durante la ejecución de la instrucción NOP no se realizan operaciones exter-

nas o internas, no afecta las banderas y requiere 4 estados. Usualmente se utiliza para consumir tiempo en lazos de retardo

6.7 RUTINAS DE RETARDO

La realización de retardos por programa es una tarea obligada en muchas apli-caciones con microprocesador. Por ejemplo, puede ser necesaria la generación de un pulso de ancho determinado o de una forma de onda periódica para un dispositivo de externo conectado a un puerto de salida. También, la supresión del rebote por contac-to de un interruptor en un puerto de entrada puede ser lograda con un lazo de retardo.

Page 304: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

285

Además, estas rutinas son apropiadas para establecer tiempos de espera para la entra-da o salida de información durante la ejecución de un programa.

El hecho que el tiempo de ejecución de cada instrucción sea conocido deja

abierta la posibilidad de utilizar el μP para realizar funciones de control de tiempo o temporización. Los lazos que usan un registro contador para control de la repetición, son adecuados para esta tarea. Si se requiere establecer un retardo de una duración determinada, basta calcular el tiempo empleado por el procesador para ejecutar un paso por el lazo y cargar el registro con el valor que permitirá obtener el tiempo de espera deseado.

6.7.1 El lazo de retardo básico Considere que se usa el registro B como contador y se ejecuta un lazo N ve-

ces, con la siguiente secuencia de instrucciones .

ESTADOS MVI B,N LAZO: DCR B 4 JNZ LAZO 7/10

La instrucción DCR requiere 4 estados y JNZ 10 estados cuando se produce

el salto y 7, en caso contrario. El lazo será ejecutado N veces, los primeros N-1 pasos tendrán una duración de 4 +10 = 14 estados cada uno y el lazo final, sólo 7 + 4 = 11 estados. De modo que el retardo total es,

[ ] relojD T11141NT ⋅+⋅−= )( (7.1)

Para una frecuencia de operación interna de 3.125 MHz, un estado tiene una

duración igual a Treloj = 0.32 µs. De modo que el tiempo necesario para ejecutar el lazo y salir puede calcularse conociendo el número de estados que emplea el ciclo de instrucción de DCR y JNZ. Esta información es suministrada en el manual del usua-rio por el fabricante del dispositivo procesador.

[ ] µs523µs4841N TMHz1253

111141NT DD ..)( .

)( +⋅−=⋅+⋅−=

El mayor número que puede representarse con un byte es 25510. Sustituyendo

este valor en la ecuación 7.1 se tiene,

...)(max µS441141µs523µs4841255TD =+⋅−= 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-

Page 305: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

286

do si se carga el registro B con cero, debido a que el primer decremento lo llevará hasta 255.

Establecido como calcular el tiempo de retardo de un lazo de programación

conociendo el valor del módulo del contador, conviene formular el proceso inverso. Para un tiempo de retardo especificado. ¿Cuál valor debe asignarse a la variable N, para obtenerlo? Por supuesto la respuesta es directa, basta despejar N de la ecuación 7.1, resultando,

1T14

T11TN

reloj

relojD +⋅

⋅−= (7.2)

La formula 7.2 puede ser generalizada, si se toma en cuenta que el término

14⋅Treloj es la duración de un paso a través del lazo y 14⋅Treloj corresponde a la dura-ción del paso final.

1T

TTN

final

pasoD +−

=

En la práctica el programa de retardo se realiza como una subrutina, cargando

el registro contador desde el programa principal, como se indica a continuación,

. mvi b,n call retad . . . hlt retad: dcr b jnz retad ret

En tal caso, la ecuación de retardo varía al incluirse los 38 estados consumidos

por las instrucciones CALL (18) y RET (10). La nueva formula de retardo es,

[ ] relojD T3914)1N(T ⋅+⋅−= 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.

Page 306: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

287

Estados xra a ; El acumulador a cero out 01 ; Bit 4 del puerto p01 a cero. mvi b,n ; Cargar contador de lazo mvi a,10h ; Bit a4= 1 out 01 ; Pulso a nivel alto. lazo: dcr b ; Decremente contador 4 jnz lazo ; Si (b) ≠ 0, repita el lazo. 7/10 xra a ; Si (b) = 0 haga (a) = 0 4 out 01 ; Pulso cae a cero. 10

Al inicio del programa se carga cero en el acumulador y se asegura que la lí-

nea 4 del puerto 1 esté en nivel bajo. Las siguientes dos instrucciones conmutan el bit 4 de P0.1 a nivel alto, antes de entrar al lazo. Se mantiene el pulso en alto por tp y las dos últimas instrucciones proveen el flanco de bajada de la onda.

Se sabe que cada paso por el lazo dura 14 estados. Cuando el registro B llega

a cero, JNZ no produce salto y dura solo 7 estados. Esto implica una duración del paso final hasta que se escribe en el puerto, de: 4 + 7 + 4XRA + 10OUT = 25 estados. Usando la ecuación se calcula el valor a cargar en el registro B, para obtener el ancho de pulso deseado, como resultado se obtiene N = 14.84. Debido a que N debe ser un número entero, seleccionando N = 14 se obtiene un tiempo de retardo igual a 66.24 μS y de 70.72 µs con N= 15.

Existen situaciones donde la duración del pulso a generar es un parámetro crí-

tico, esto significa que debe obtenerse un ancho de pulso lo más cercano posible a los 70 μS. Para esto se selecciona para el entero inmediatamente inferior y se alarga la duración del retardo usando instrucciones que no realicen función, pero que consu-man tiempo. El ajuste del tiempo puede hacerse usando instrucciones NOP fuera del lazo. Seleccionando N =14, y agregando tres NOP al programa del ejemplo, se obtie-ne la rutina,

estados xra a out 01 mvi b,0eh mvi a,10h out 01 lazo: dcr b 4 jnz lazo 7/10 nop 4 nop 4 nop 4 xra a 4 out 01 10

La duración del paso final es 4 + 7 + 3⋅4NOP + 4XRA + 10OUT = 37 estados. El

ancho de pulso será:

[ ] s0870s3203714114t P μ=μ⋅+⋅−= ..)(

Page 307: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

288

Dependerá de la habilidad y paciencia del programador lograr el ajuste nece-sario. Es obvio que podría usarse cualquier instrucción distinta a NOP para alargar el retardo. Por ejemplo, el programa del ejemplo 6.32 puede ser modificado para gene-rar un pulso de 50 µs, Cargando N = 8 en el registro B y usando dos instrucciones DAD H y una LDA DMEM para el ajuste del tiempo.

Estados xra a out 01 mvi b,8 mvi a,10h out 01 lazo: dcr b 4 jnz lazo 7/10 dad h 10 dad h 10 lda dmem 13 xra a 4 out 01 10

La generación por programa de una señal cuadrada a una frecuencia especifi-

cada requiere alternar de alto a bajo por tiempos iguales, el estado de una línea de un puerto de salida. Un circuito de interconexión externo fijará la magnitud y polaridad de los niveles de tensión de la forma de onda.

Ejemplo 6.35 Escribir un programa para generar un tren de pulsos de ciclo de trabajo 50 % y

frecuencia 500 Hz, en todas las líneas de salida del puerto 20H.

estados tpul: out 20h ; (a) (puerto 20h) 10 cma ; Complementar el (a) 4 mvi b,dbh ; argar contador de lazo 7 lazo: dcr b ; Decremente contador 4 jnz lazo ; Si (b) ≠ 0, repita el lazo 7/10 lxi d,0 ; Epere 10 lxi d,0 ; Epere 10 mvi e,0 ; Epere 7 nop ; Epere 4 jmp tpul ; Cambiar nivel del pulso 10

Un semiciclo de la señal cuadrada tiene una duración de,

[ ]

Hz500f

µs1000µs320104710107414121974102T

=

=⋅+++++++⋅−+++= .)(

Page 308: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

289

La frecuencia de la onda es igual a 500 Hz como especifica el problema. Por supuesto, la rutina del ejemplo 6.31 representa un lazo sin fin durante el cual se gene-ra continuamente la onda cuadrada.

6.7.2 Retardos de mayor duración

Si el ancho tp del pulso generado en el ejemplo 6.33 debe extenderse hasta 500

ms, es imposible lograrlo con el uso del registro B como contador de lazo. El lapso de retardo máximo posible con un registro de ocho bits, para una frecuencia de reloj in-terna de 3.125 MHz, es de aproximadamente 1.14 ms. Si se utiliza una pareja de re-gistros de ocho bits como un registro único de 16 bits, y la instrucción de decremento de registro par DCX rp será posible repetir el bucle 65536 veces, si se asigna el valor cero a N.

Debe considerarse que la instrucción DCX rp no afecta las banderas, por lo

cual debe usarse un método diferente al usual, para detectar cuando el registro par llegue a cero. El lazo de espera usando un contador de 16 bits se muestra a continua-ción,

estados retad: dcx b 6 mov a,b 4 ora c 4 jnz retad 7/10 ret 10

Antes de ejecutar la subrutina de retardo, el registro par BC debe cargarse con

el valor de N usando la instrucción LXI rp,dato16. La instrucción DCX B decrementa en 1 el registro de 16 bits BC. Desafortunadamente, DCX rp, no afecta la bandera de cero Z. Una solución para determinar cuando el contador alcanza cero, e indicarlo con Z=1, es cargar el acumulador con el contenido de B, lo cual corresponde al byte de orden alto del registro contador, ejecutar una función OR exclusivo con el registro C como operando. La bandera de cero será activada, solo cuando se cumpla que (B) = (C) = 00H. La ecuación de retardo con el contador de 16 bits está expresada por,

[ ]T (N 1) 24 49 0.32 µD = − ⋅ + ⋅ s

El cual tendrá un valor máximo a la frecuencia especificada, de

[ ]T (65536 1) 24 49 0.32 µs 503.32 msDmax = − ⋅ + ⋅ = Ejemplo 6.36

Usando una rutina de retardo, debe generarse un pulso de ancho 500 ms en la

línea 7 del puerto de salida B0H.

Page 309: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

290

estados lxi b,n ; cargar contador de lazo

mvi a,10h ; bit a7 = 1 out b0h ; pulso a nivel alto. lazo: dcx b ; decremento registro par bc 6 mov a,b ; byte alto del contador al a. 4 ora c ; or entre b y c. 4 jnz lazo ; salto si contador es cero 7/10 lxi d,0 ; esperar 10 lxi d,0 ; esperar 10 lxi d,0 ; esperar 10 mvi d,0 ; esperar 7 nop : esperar 4 xra a ; (a) = 0 4 out 01 ; pulso a nivel bajo. 10

Como es usual debe calcularse el valor de N a cargar en el contador para obte-

ner la duración deseada para la señal. La única diferencia entre este programa y el usado par generar el pulso de ancho 70 ms es el procedimiento usado para registrar el final de la cuenta. De modo que se escribe la expresión del retardo, como,

[ ]

µs211µs6871NT

µs32035241NT

D

D

..)(

.)(

+⋅−=

⋅+⋅−=

El valor correspondiente de N es igual a,

765102687

211TN D .

..=

−=

Seleccionando N = 6510210 (FE4EH) y ajustando el tiempo con instrucciones

no funcionales, se obtiene un ancho de pulso de,

ms500µs32041µs211µs6871NTD =⋅++⋅−= ...)( El pulso permanece en nivel alto por 1562500 estados, lo cual corresponde en

forma exacta a 500 ms. Un tiempo de 0.5 s pudiese ser demasiado corto para las necesidades de algu-

nas aplicaciones. Por ejemplo, un controlador de tráfico urbano basado en µP, requie-re retardos mayores para establecer los lapsos de encendido de la luces del semáforo. Para lograr tiempos de espera largos puede usarse un bucle externo para repetir n ve-ces el retraso logrado con la pareja de registros.

estados mvi d,20h ; Contador externo en 32 ext: lxi b,fe50h ; Contador interno para 0.5 s 7 int: dcx b ; 6 mov a,b ; 4

Page 310: Microprocesadores-Luis Urdaneta

Introducción a la Programación del 8085A

291

ora c ; . 4 jnz int ; Fin de lazo interno 7/10 dcr d ; 6 jnz ext ; Fin de lazo externo 7/10

La rutina provee un retardo de 16 segundos. Durante 50000541 estados. El re-

tardo interno es 0.5 segundos y se repite 32 veces. Al usar un contador de 8 bits para control de la repetición del lazo interno, con este programa pueden obtenerse tiempos de hasta aproximadamente 2 minutos. La rutina del ejemplo 6.37 permite retardos mayores. Ejemplo 6.37

Escribir una rutina de retardo para alcanzar tiempos de espera del orden de

horas. Para un lapso de 9 horas, basta con repetir 65535 veces el lazo interno de 0.5

segundos del programa anterior. Para lo cual es necesario sustituir el contador que controla el lazo externo por un contador con registro par. En lugar de usar el registro D, se usa DE. Esto puede ser realizado como ejercicio. En este caso se prefiere usar un procedimiento algo diferente, pero que igual utiliza dos contadores de 16 bits.

lxi d,n1 lxi b,n2 cont: dcx b mov a,b ora c jnz cont dcx d mov a,d ora e jnz conT

El retardo máximo obtenible con este programa es de 9 horas a la frecuencia

de 3.125 MHz. Todos los ejemplos de código de retardos han supuesto esta frecuen-cia de operación. Si se usa una versión del 8085 de 5 MHz, los tiempos de espera se reducen al disminuir la duración de un estado a 0.2 µs. La técnica de control de tiem-po por programa, puede usarse además para generar formas de ondas más complejas, audio e incluso música. Examine el ejemplo siguiente donde se usa un programa para generar el sonido del timbre de un teléfono. Ejemplo 6.38

Se desea generar una señal que simule el tono de timbre telefónico. Esta for-

ma de onda se obtiene liberando durante 1 segundo 8 tonos de 320 Hz, seguidos por 12 tonos de 480 Hz y al final 2 segundos de silencio.

Page 311: Microprocesadores-Luis Urdaneta

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

Page 312: Microprocesadores-Luis Urdaneta

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:

Semciclo ((B 1) 22 61) * 0.32µs Semciclo ((B 1) 22 69) * 0.32µs 1 2

B 220 0DCH f 319.98 Hz

B 146 92H f 480.03 Hz

= − × + = − × +

= = →= =

= = →= =

La figura 6.38 muestra la conexión del parlante a la línea 0 del puerto de sali-

da 0.

Fig. 6.38 El transistor 2N2905 provee la corriente necesaria para activar la corneta de 8 Ω/0.125W.

El retardo de la rutina ret_2s viene dado por

[ ] Re tardo 0.32 µs 18 7 10 (D 1) (B 1) 24 21 4 10 1 (B 1) 24 21 11 10ret _ 2s

Re tardo 0.32 µs 6249977 1.99999264 segret _ 2s

= × + + + − × − × + + + + + − × + + +

= × =

Page 313: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

294

DDeessaarrrroolllloo yy SSiimmuullaacciióónn ddee PPrrooggrraammaass

La habilidad para escribir programas para microprocesadores proviene de la

comprensión que se tenga del conjunto de instrucciones del μP, de lo que cada una de éstas hace, y fundamentalmente de la experiencia de quien programa. A diferencia de la elaboración de programas en lenguajes de alto nivel, como C, ADA o Pascal, el programador de microprocesadores debe conocer la arquitectura de la máquina en la cual se ejecutará la rutina, debiendo entender como las instrucciones afectan al hard-ware.

Para desarrollar una aplicación basada en µP se requiere que el equipo de di-

seño incluya personal con conocimientos de electrónica digital y de programación. En este tipo de sistemas es usual que el desarrollo del código ejecutable represente una inversión de tiempo y dinero superior al costo del diseño del soporte físico del siste-ma. El reto principal a enfrentar por el programador es la selección del lenguaje de programación del microprocesador. De hecho, el costo del desarrollo del soporte lógi-co de la aplicación y la eficiencia del funcionamiento del producto final están deter-minados por el lenguaje utilizado para programar el microprocesador.

7.1 EL LENGUAJE DE PROGRAMACIÓN

Para desarrollar un programa ejecutable por un microprocesador existen dos opciones, usar: lenguaje de máquina o lenguaje de alto nivel. Los códigos en lenguaje de máquina son los que puede ejecutar directamente el microprocesador, los escritos en ensamblador, C o Pascal deben ser traducidos a código de máquina antes de ser ejecutados.

Page 314: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

295

El término lenguaje de máquina usualmente se asigna a la secuencia binaria de instrucciones que ejecuta la CPU, mientras que lenguaje ensamblador identifica a la representación simbólica del código binario de las instrucciones del procesador.

Un programa en lenguaje de máquina es una secuencia de instrucciones y da-

tos en binario, y es el código que la máquina entiende y ejecuta. Programar en código ejecutable exige un conocimiento completo del conjunto de instrucciones del μP y de la arquitectura de la máquina, debido a que cada instrucción en este lenguaje es una indicación directa al hardware para que ejecute una operación.

Programar en código de máquina conduce a un control total sobre los recursos

que ofrece el sistema μC, a un manejo óptimo la memoria del sistema, además de producir programas con alta velocidad de ejecución. La forma más primitiva de pro-gramación en lenguaje de máquina implica la escritura de cada código de operación, dirección o dato usando el sistema binario.

Tabla. 7.1 Código para generación de pulsos Dirección Binario Hex Ensamblador

0200H 11010011 D3H OUT 0201H 00100000 01H 20 0202H 00101111 2FH CMA 0203H 00000110 06H MVI B

0204H 01000100 DBH DB 0205H 00000101 05H DCR B 0206H 11000010 C2H JNZ 0207H 00000101 05H 05 0208H 00000010 02H 02 0209H 00010001 11H LXI D 020AH 00000000 00H 00 020BH 00000000 00H 00 020CH 00010001 11H LXI D 020DH 00000000 00H 00 020EH 00000000 00H 00 020FH 00011110 1EH MVI E 0210H 00000000 00H 00 0211H 00000000 00H NOP 0212H 11000011 C3H JMP 0213H 00000000 00H 00 0214H 00000010 02H 02

La segunda columna de la lista de la tabla 7.1 es una representación en binario

de la rutina del ejemplo 6.34 del capítulo 6, la cual ha sido cargada en memoria a par-tir de la dirección 200H. Inspeccionando esta secuencia de bytes es difícil determinar que genera un tren de pulsos en las líneas del puerto de salida 20H. De hecho, la na-turaleza binaria de los programas escritos en código de máquina implica gran dificul-tad para escribirlos, entenderlos y modificarlos.

Page 315: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

296

Una forma simple de facilitar el arduo camino que significa desarrollar pro-

gramas en lenguaje de máquina, consiste en usar el sistema de numeración hexadeci-mal para la codificación de las instrucciones, tal como ilustra la columna tres de la tabla 7.1. Aunque esto resulta en una versión simplificada del programa en binario, la complejidad para entenderlo persiste. Algunos μC de uso didáctico aceptan la entrada de instrucciones directamente en hexadecimal, por teclado o terminal, encargándose el programa monitor de realizar la conversión a binario de las instrucciones, almace-narlas en memoria y ejecutarlas.

El lenguaje de máquina no fue diseñado pensando en la comunicación con

humanos, y esto no es una falla del diseñador del μP. En realidad el código de máqui-na permite expresar algoritmos de forma que puedan ser decodificados o interpreta-dos por la unidad de control del µP.

La programación directa en código de máquina no debiera considerarse como

opción para el desarrollo del programa de aplicaciones basadas en µP, debido a las considerables dificultades que supone escribir los códigos de operación y los datos usando los sistemas de representación binario o hexadecimal. Para aprovechar las ventajas de programar el µP usando su conjunto de instrucciones, es posible usar el lenguaje simbólico o lenguaje ensamblador, constituido por los nemónicos de los có-digos de operación de cada instrucción. Observe que con cierta destreza, es posible deducir la función del programa con la información que se obtiene de la inspección de la columna cuatro de la tabla 7.1.

7.1.1 Traducción de programas

Como recursos útiles para la escritura del software del sistema, existen pro-

gramas traductores que permiten realizar la conversión desde un archivo fuente en lenguaje simbólico o de alto nivel, al código objeto ejecutable por la CPU. Un traduc-tor es un programa que convierte secuencias de instrucciones de una forma a otra. Los traductores abarcan interpretadores, ensambladores y compiladores y permiten al programador expresar un algoritmo (instrucciones y datos) en un lenguaje adecuado para la comprensión por parte de seres humanos.

Los traductores pueden distinguirse en dos grupos principales de acuerdo a la

operación que ejecutan al analizar el programa fuente, estos son: • Interpretadores. • Generadores.

Los interpretadores ejecutan directamente la operación resultante del proceso

de análisis del programa fuente. Para cada posible operación existirá una subrutina para realizarla. Son programas fáciles de escribir pero son de lenta ejecución debido a

Page 316: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

297

que toda instrucción del archivo fuente es analizada cada vez que ejecuta el progra-ma, lo cual significa que la traducción es simultánea a la ejecución. En contraposi-ción, los generadores crean un código objeto posible de ejecutarse en un tiempo pos-terior a al conversión del programa fuente. En general, el término generador se aplica a programas orientados a la máquina, como los ensambladores, mientras que los orientados al usuario (C, Pascal, ADA) se les denomina compiladores. El código re-sultado de la interpretación del programa fuente es de gran tamaño, debido a que debe mantenerse en memoria no sólo la rutina a procesar sino también el programa kernel encargado de interpretar y ejecutar el programa de usuario. Esta opción puede ser útil para propósitos didácticos o puede ser usada durante el desarrollo del programa. Para µPs de 8 bits existen interpretadores como el FORTH, BASIC y algún interpretador C. Este tipo de traductor no se considera en este trabajo.

Fig. 7.1 Métodos de traducción de programas en un computador

Aunque los interpretadores no se recomiendan como una opción viable para el

desarrollo de programas para µPs, esto no significa que la técnica de interpretación no sea utilizada. En realidad ambos métodos de traducción son ampliamente usados. Como puede observarse en la figura 7.1, un interpretador por hardware se encarga de

Page 317: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

298

trasladar las instrucciones en lenguaje de máquina a las acciones internas que resultan en la ejecución del programa. También un interpretador traslada las instrucciones del sistema de operativo a código de máquina.

La figura 7.1 muestra el uso de los métodos de compilación e interpretación

en un computador. El objetivo de la traducción es entregar como salida un programa en el lenguaje de la máquina Los programas escritos en lenguaje ensamblador son traducidos por el programa ensamblador a código de máquina. La compilación de un programa fuente escrito en un lenguaje de alto nivel, produce como salida otro pro-grama en lenguaje ensamblador, o directamente en código de máquina. En el primer, caso debe usarse un ensamblador para la traducción final. Los programas del sistema operativo son traducidos a lenguaje de máquina por un interpretador. Un interpretador microprogramado se encarga de realizar la traducción desde el lenguaje de la máquina a las operaciones internas que conducen a la ejecución de cada instrucción.

7.1.2 Lenguaje ensamblador o de alto nivel

Descartada la opción de programar el µP usando directamente el código nu-mérico de máquina, la elección del lenguaje de soporte se reduce a dos posibilidades: lenguaje ensamblador o de alto nivel. Este escenario se basa en que todo µP tiene al menos una versión de ensamblador; y se supone la existencia de algún compilador para el microprocesador usado en la aplicación.

Esta disyuntiva es un tema tradicional de discusión entre los programadores

de computadores, y es más polémico aun entre los diseñadores de sistemas empotra-dos. En esta sección, no se pretende intervenir en tal controversia. Nuestro objetivo no es seleccionar el mejor lenguaje para desarrollar soluciones basadas en µP, más bien consiste en elegir el lenguaje más apropiado para escribir los programas inclui-dos en una guía introductoria de sistemas microprocesadores. El interés es establecer, ¿Cuál lenguaje debe usarse en un curso de introducción a la programación de µPs?

El lenguaje de alto nivel más utilizado en la actualidad para programar µCtrls,

es el C. Existen compiladores C para todos los microcontroladores existentes en el mercado y para microprocesadores de 8 bits como el Z80 y el 8085, entre otros. Una encuesta realizada el año pasado entre los usuarios del sitio WEB http://www.8052.com, reveló que el 52 % de los programadores de la familia de µCtrls 8051 utilizan el lenguaje ensamblador, mientras que un 35 % programa en C. El grupo restante, usa otros compiladores. Dada el extenso uso de la familia MCS-51 en aplicaciones industriales, es de suponer que esta proporción se mantiene para otros dispositivos usados en sistemas empotrados.

El traductor denominado ensamblador se encarga de la conversión a lenguaje

de máquina del programa fuente escrito con los nemónicos que identifican a cada instrucción de la máquina. Constituye un recurso que en la práctica, automatiza la programación en código de máquina. En su forma más simple, los ensambladores

Page 318: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

299

traducen cada instrucción del archivo fuente en una instrucción en código objeto, con una correspondencia 1:1. Ensambladores más elaborados, realizan la traslación del programa fuente de forma que éste puede ser enlazado con otros programas, antes de la ejecución.

Además de admitir la utilización de nemónicos para identificar las instruccio-

nes, se pueden usar etiquetas para las direcciones, y los datos pueden ser expresados en formatos diferentes al sistema binario. Estas posibilidades simplifican mucho el desarrollo de un programa, mientras preserva las ventajas inherentes al uso de código de máquina. Con ensamblador, pueden realizarse programas de miles de líneas de código con un eficiente uso de la memoria y un aprovechamiento máximo de la po-tencia del microprocesador. El programador mantiene un control total sobre la má-quina, esto se debe a que las instrucciones hacen referencia explícita a la arquitectura de computador. Por tal razón, es usual calificar el ensamblador como un lenguaje de bajo nivel.

La separación entre el ensamblador y el lenguaje nativo del µP es sutil, la úni-

ca diferencia con el lenguaje de máquina es que los códigos de operación, operandos y direcciones pueden representarse simbólicamente. Es una tradición suponer que un programa escrito en ensamblador por un programador experimentado, produce un código de menor tamaño y de más rápida ejecución que su equivalente realizado con un interpretador o con lenguaje de alto nivel. No obstante, en modo alguno el ensam-blador constituye la panacea para el desarrollo del soporte lógico del sistema. La es-critura de un software extenso y complejo puede representar una tarea de larga dura-ción y alto costo, mientras que el código resultante es difícil de entender, de mantener y es no portátil por naturaleza.

Desde los inicios del desarrollo de los µPs han existidos compiladores de len-

guajes de alto nivel, como FORTRAN, COBOL o ALGOL, ejecutables en sistemas basados en los µPs más populares. No obstante, el propósito de tales compiladores era permitir el uso del µP como CPU de un microcomputador de propósito general destinado al procesamiento de datos, siendo inapropiados para desarrollar programas para proyectos de control.

Las primeras empresas en introducir lenguajes de alto nivel dedicados al desa-

rrollo del software de aplicaciones específicas, fueron INTEL y MOTOROLA con los compiladores PLM80 para la familia 8080 y MPL para el µP 6800. Esta tendencia ha proseguido hasta la fecha. Las compañías fabricantes de dispositivos y otras empresas de diseño de software ofrecen compiladores destinados a ser usados como recurso de primera línea en la fase de diseño de aplicaciones.

La programación en lenguaje de alto nivel reduce significativamente el tiempo

de desarrollo y produce programas más fáciles de entender y de mantener que sus equivalentes en ensamblador. En general, el código resultante de la compilación es de mayor tamaño y de ejecución más lenta que el generado por el ensamblador. El uso de compiladores ofrece cierto grado de portabilidad. Un programa escrito un µP en

Page 319: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

300

lenguaje C, puede ser usado para otro dispositivo si se compila con el traductor co-rrespondiente. La salida de un compilador puede ser un archivo en lenguaje ensam-blador, el cual debe ser traducido a código de máquina; o puede entregar en forma directa el código ejecutable, a expensas de la simplicidad del traductor y de la veloci-dad de compilación.

En esta breve discusión se han establecido de modo muy general que las ven-

tajas del ensamblador sobre los compiladores son dos: produce un código que requie-re menos memoria para almacenarse y el programa es de ejecución rápida. Si estas dos cualidades del ensamblador fuesen irrefutables, no existiría ninguna duda sobre cual lenguaje emplear para el desarrollo de sistemas empotrados. Esto debido a que en este tipo de aplicaciones se dispone de recursos limitados, principalmente memoria y es usual que el sistema este sometido a restricciones de tiempo críticas.

Lo cierto es, que lo afirmado en el párrafo anterior sobre el rendimiento del

ensamblador relativo a los compiladores, ha sido devastadoramente cierto hasta hace algunos años. En nuestros días, el panorama se ha visto modificado con la aparición de compiladores más sofisticados. Los diseñadores de los nuevos lenguajes de alto nivel para sistemas empotrados, han introducido técnicas de optimización en la com-pilación, las cuales toman en consideración la limitación de recursos inherentes a ta-les aplicaciones. Estos traductores novedosos, permiten que el usuario seleccione si debe intentarse que el código a generar sea optimizado para reducir el tamaño o para aumentar la velocidad de ejecución.

En los compiladores actuales se incorpora a la estructura del traductor una

sección que optimiza el código intermedio reorganizando las estructuras de lazo y optimizando la evaluación de expresiones. La etapa final de la compilación es el ge-nerador de código que produce el programa objeto en lenguaje de máquina. La nueva generación de compiladores ha reducido en forma notoria la distancia existente entre el código producto del ensamblaje y el obtenido por compilación. Esto significa que actualmente es posible obtener, usando lenguajes de alto nivel, programas de tamaño relativamente pequeños.

Una consideración de interés en esta discusión es la productividad del pro-

gramador. Está demostrado que un programador produce un determinado número de líneas de código en el tiempo, independientemente del lenguaje de programación uti-lizado. Debido a que una línea de un archivo fuente de alto nivel corresponde a n (3 a 10) instrucciones en ensamblador, la eficiencia de un programador en un lenguaje compilado supera en n veces la de aquel que usa ensamblador. Además, los progra-mas en alto nivel son sencillos de comprender y simples de mantener, incluso por personal distintos a los autores del programa. Entonces, la pregunta es: se justifica programar en ensamblador.

La respuesta es: si... sin duda alguna. Antes de alegar alguna razón, es preciso

destacar como un hecho que un buen programador en ensamblador es capaz de afinar un programa, o una sección de éste, de forma tal que se obtenga el código más rápido

Page 320: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

301

posible. En algunos casos, puede que esto implique un trabajo excesivo y que no se justifique el esfuerzo y tiempo dedicado en perfeccionar el código.

En otros proyectos, principalmente durante el desarrollo de sistemas empotra-

dos, existe la posibilidad que la velocidad de ejecución del código de la aplicación constituya un factor crítico para el desempeño del sistema. Es común que en estas aplicaciones. Algunas acciones de control en tiempo real sean realizadas por el pro-grama. Es obvio, que programando en ensamblador tiene un absoluto conocimiento y control sobre el tiempo de ejecución de las instrucciones y lazos, siendo más sencillo la realización de retardos precisos o la generación de eventos de duración específica. La programación en lenguaje de alto nivel hace difícil el seguimiento de la duración de la ejecución de procedimientos e instrucciones. Esto introduce cierta vaguedad en la posible respuesta del programa a eventos externos en tiempos especificados como críticos.

Otro factor que justifica programar en ensamblador se relaciona con el apro-

vechamiento de la capacidad de la memoria EPROM (EEPROM) de la aplicación. Si este recurso está muy limitado, un buen programa en ensamblador puede reducir la capacidad necesaria para almacenar los programas y los datos. A pesar de la habilidad del compilador para optimizar el código para tamaño y velocidad, estos traductores no siempre son capaces de determinar cuando una sección del código puede ser susti-tuida por una simple instrucción. Un programador en código de máquina, a diferencia del compilador, entiende el algoritmo en desarrollo y conoce la estructura y la más recóndita instrucción del programa, en tal forma que es capaz de lograr que seccio-nes de código sean más eficientes, como recompensa a una buena dosis de coraje y a un gran esfuerzo.

Pareciera que la opción apropiada es recurrir a la programación en lenguaje de

alto nivel cuando, para una aplicación específica, el tiempo de ejecución de las tareas no sea un factor determinante y en caso contrario, utilizar lenguaje ensamblador. En realidad existe una tercera posibilidad que representa una solución más conveniente para programar el sistema. Esta consiste, en utilizar una técnica mixta que explote la potencia de ambos lenguajes. Con este método, casi todo el programa se escribe en lenguaje de alto nivel y las rutinas de tiempo crítico se programan en ensamblador.

La eficiencia de la utilización de la técnica mixta está basada en el principio

de localidad de las referencias. Este establece que durante la ejecución de un progra-ma el procesador hace referencias frecuentes a un conjunto de instrucciones almace-nadas en un área pequeña de la memoria. Esto es cierto para espacios cortos de tiem-po, en lapsos largos puede cambiar la secuencia de código que se repite, pero la vali-dez del principio se mantiene. En síntesis, el µP invertirá la mayor parte del tiempo de ejecución en procesar una pequeña sección del código. Si el 90% del tCPU se invierte en ejecutar el 10% del programa, esta parte del código se programa en ensamblador. El 90% restante del programa, responsable del 10% del tCPU, se escribe en lenguaje de alto nivel.

Page 321: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

302

Lo usual es que durante el desarrollo del software, el programa integro se es-cribe en lenguaje de alto nivel. El programa se ejecuta y se detectan las secciones de código a las cuales se dedica el mayor tCPU, y se reprograma en ensamblador. Como resultado se obtiene un programa con velocidad de ejecución comparable al escrito en ensamblador y con costo de desarrollo mucho menor.

Parece evidente que pese a las desventajas inherentes a la programación en

lenguaje ensamblador, es necesario que el estudiante conozca el lenguaje. Las razones son varias y algunas han sido mencionadas. Para cerrar esta discusión se mencionan tres:

• Una mejora en la velocidad de ejecución en el código crítico de una aplicación puede ser la

única opción para la viabilidad del proyecto. De modo que el programador debe estar en ca-pacidad de escribir esta sección del programa en ensamblador.

• La segunda razón se apoya en que las rutinas de librería de los lenguajes de alto nivel deben

escribirse en ensamblador. • Finalmente, la salida del compilador puede ser un programa en ensamblador, lo cual signifi-

ca que para que comprender el funcionamiento de los compiladores debe estudiarse el en-samblador.

Al ser el material que se presenta, una guía para el aprendizaje de los funda-

mentos de sistemas de microprocesadores, el uso del lenguaje ensamblador es una necesidad ineludible. El tipo de problemas a resolver usando el µP, usualmente tienen restricciones de tiempo y el código a desarrollar no es necesariamente muy extenso. Usando el ensamblador, el estudiante se mantendrá en contacto continuo con la arqui-tectura de la CPU y se enfrentará a la programación directa de circuitos programables de interconexión de E/S.

La forma en que el programador en ensamblador debe manipular los registros

del µP, la memoria del sistema y los dispositivos de E/S permitirán al estudiante ad-quirir una base sólida en programación de µPs, además de hacer más fácil la tarea de programar en lenguajes de mayor nivel y de capacitarlo para la escritura de rutinas para la librería del compilador. Para finalizar la discusión sobre el nivel del lenguaje a utilizar para programar el µP, considere el ejemplo 6.33. Este ejercicio presenta un código escrito en ensamblador para calcular el valor de y, por medio de la expresión:

159 30000

y 159 x y 159 3100

⋅= ⋅ = = ⋅ =

El algoritmo usado para hallar la raíz cuadrada de N es:

n 1 nn

1 Nx x2 x+

⎛ ⎞= +⎜ ⎟

⎝ ⎠

Page 322: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

303

El programa principal MAIN y las subrutinas MUL168, DIV1616 y RAÍZ es-critas en ensamblador comprenden aproximadamente 79 líneas de código. El archivo ejecutable ocupa 118 bytes de memoria. Una versión de este programa fue realizada usando el compilador MICRO-C para el 8085 y se muestra a continuación. Ejemplo 6.33 escrito en lenguaje C

int N,x,xn,y; main () x=3*10000; N=x; xn=(x+1)>>1; while (x != xn) x=xn; xn=(N/x+x+1)>>1; y=(159*x)/100;

Como se observa se requieren sólo diez líneas de código, pero el archivo ge-

nerado por el compilador C ocupa 471 posiciones de memoria. Esto significa que el uso de MICRO-C genera un código objeto con cuatro veces el tamaño que el resultan-te de usar el ensamblador.

7.1.3 El formato HEX-INTEL Las opciones de compilación, ensamblaje y enlazado de las herramientas para

desarrollo de programas para microprocesadores, permiten seleccionar el formato del archivo que contiene el código que va a ser grabado en EPROM. Uno de los más usa-dos es el formato HEX INTEL. Este estándar, permite que el proceso de programación se realice en un PC y que el código sea cargado en la tarjeta prototipo y ejecutado desde la memoria RAM. También el archivo en formato HEX INTEL puede ser con-vertido a binario y cargado en un simulador del µP o en un grabador de EPROM. Un programa en formato HEX, es un archivo ASCII el cual contiene un registro por línea. Un ejemplo se muestra a continuación,

:10000000213F00460548237E23BEDA120056772B97 :10001000722305C207000D41C21C0076214000C3B7 :020020000700D7 :0A003F0009082345677D889099F5B4 :00000001FF

Fig. 7.2 Archivo HEX INTEL

Page 323: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

304

Cada uno de los registros del archivo de la figura 7.2 tiene el formato indicado en la tabla 7.2. Aislando los campos de la línea tres del archivo ejemplo, se obtiene:

:020020000700D7 : Marcador de registro. 02 Longitud del registro. Dos bytes de datos. 0020 Dirección de carga 0020H, 0021H. 00 Tipo de registro: datos. 0700 Datos. D7 Byte para verificación por suma total.

La línea se inicia con el carácter dos puntos, señalando que corresponde a un

registro en el formato HEX INTEL. Los siguientes dos caracteres (02H) indican que la línea contiene 2 bytes de datos, los cuales deben ser cargados a partir de la dirección 0020H. El próximo par de caracteres: 00H, informa que la línea es un registro de da-tos. El primer byte de dato es 07H y el último es 00H. Los últimos dos caracteres D7H son el checksum de la línea. Para calcular el byte de verificación se realiza la suma hexadecimal:

02 + 00 + 20 + 00 + 07 + 00 = 29H El complemento dos de 29H es D7H 29H + D7H = 0

Tabla. 7.2 Formato HEX INTEL.

CARÁCTER DESCRIPCIÓN

1 Marcador de registro: El primer carácter de una línea siempre es ‘:’ para identificar el inicio de un registro.

2-3 Longitud de registro: El número de bytes de datos expresado con dos dígitos hexadecima-les. No incluye los nueve primeros ni los dos últimos caracteres de la línea.

4-7 Dirección: Este campo indica la dirección de memoria donde se cargaran los datos. Se expresa con cuatro dígitos hex (0000H-FFFFH)

8-9 Tipo de registro: Estos dos caracteres identifican el tipo de registro para la línea. Los más comunes son:

00 Registro de datos 01 Registro de fin de archivo 02 Registro de direcciones de segmento extendido

10 Datos: A partir del décimo carácter se encuentran los bytes de datos útiles. Esta es la información a cargar en la EPROM o en la memoria del simulador o emulador. Se repre-senta como dos dígitos hex.

Dos últimos Checksum: Este campo es la verificación por suma total para la línea. Se obtiene calcu-lando el complemento dos de la suma sin acarreo de todos los bytes anteriores de la línea exceptuando el marcador de registro (:)

Page 324: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

305

En la figura 7.3 se muestra el archivo HEX generado por el ensamblador para el programa del ejemplo 6.32 y la figura 7.4 presenta la salida de compilador C para el mismo programa.

:0E0000001110270E03CD1700CD4F000E9FCD1F :09000E0017000E64EBCD2B007607 :0E0017007906080E00616C298FD22500198928 :0600250005C21E004FC9D8 :0E002B003E10210000EB29EBD23B00292CC334 :0E0039003C00291CF57D996F7C9867D2490028 :080047001D09F13DC23000C9A2 :0E004F002230087C0F477D1F4F2A3008EBCD72 :0E005D002B00606919237C1F577D1F5F78BA46 :0B006B00C2710079BBC8424BC35800B3 :00000001FF

Fig. 7.3 Salida del ensamblador para el programa del ejemplo 6.33.

:20400000310060AF32E341CD6A41CF396EC9E56069C139716069C9397E23666FC9E5606982 :20402000C1397123706069C9EB5E23562BEBC9EB7323722BEBC97E23666FC97D02037C023E :20404000C97D079F67C9EB4E23462378B1CA5E407E23BBC258407EBA23C24740C5C97E2365 :20406000666FE92B7C2F677D2F6FC97CB5210000C023C979956F789C67C9D5EB2100007B46 :204080000FD2854009A77A1F577B1F5FB2CA9A4079174F781747B1C27F40D1C9CDA24060FB :2040A00069C9D5EB2100003E1132D741A779174F7817473AD7413DCAD84032D7417D176F3A :2040C0007C1767BADAAC407DC2CF40BBDAAC40936F7C9A6737C3AD40D1C979A56F78A46787 :2040E000C979B56F78B467C979AD6F78AC67C97CB5CAFF40A7781F47791F4F2DC2F44060EC :2041000069C97CB5CA1241A779174F7817472DC207416069C9CD5F41C82BC9CD5F41C02B79 :20412000C9E56069C1CD4F41D82BC9CD4F41D8C82BC9CD4F41D02BC9E56069C1CD5F41D858 :204140002BC9CD5F41D8C82BC9CD5F41D02BC978ACF25F41210100A0FA5D41B5C937C97833 :20416000BCC2664179BD210100C921307522DD412ADD4122DB412ADD41444D210100094425 :204180004D210100CDEF4022DF412ADF4122DD417CB5CAC0412ADF4122DD412ADB41444D8B :2041A0002ADD41CD9C40444D2ADD4109444D21010009444D210100CDEF4022DF41C38A41F1 :1741C0002ADD41444D219F00CD7A40444D216400CD9C4022E141C9FC :00000001FF

Fig. 7.4 Salida del compilador MICRO-C 8085 para la versión en C del ejemplo 6.33.

Es notable que el tamaño del código generado por el compilador C sea mucho mayor que el correspondiente en ensamblador. En realidad el compilador MICRO-C tiene algunas deficiencias. Compiladores C para el 8085, con costo elevado, utilizan técnicas de optimización que disminuyen el tamaño del código de salida.

Aunque los compiladores modernos y las nuevas arquitecturas de los micro-

controladores intentan día a día que el archivo de salida ocupe menos espacio en me-moria, y además se ejecute a mayor velocidad, puede considerarse que los ensambla-dores se mantienen como líderes en la competencia de generar código pequeño y de velocidad alta. El autor comparó, usando una rutina de prueba, el código generado por el ensamblador y el compilador C de un microcontrolador MCS-51. A pesar que el traductor C se ofrece como un compilador moderno, se mantuvo la diferencia de ta-maño entre los archivos generados por ambas herramientas.

Page 325: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

306

7.2 ESTRUCTURA DEL PROGRAMA Para realizar el proceso de representar un algoritmo como un programa capaz

de realizarlo, el programador debe prestar especial atención al uso de técnicas que faciliten el desarrollo de diagramas de flujo y de programas. Entre estas técnicas se consideran,

1. Programación modular. El programa está compuesto por procedimientos o módulos cada

uno de los cuales realiza una función específica. Cada módulo puede ser escrito, codifica-do y probado en forma independiente.

2. Diseño hacia abajo. Al inicio se define la función global del programa (módulo principal)

como un conjunto de subfunciones generales (módulos específicos). A continuación el di-seño continúa en descenso hasta cuando cada subfunción es definida y los módulos son programados.

3. Código estructurado. Para escribir el programa se usan sólo ciertas estructuras lógicas de

programación. Tales formas lógicas pueden constituir lazos de código o estructuras condi-cionales

7.2.1 Programación modular

Consiste en seccionar el programa en rutinas, las cuales pueden ser escritas y probadas por separado para posteriormente ser integradas en un programa capaz de resolver el problema propuesto originalmente. Cada uno de los módulos en los cuales se divide el programa debe tener una entrada y una salida, y debe realizar una función única, la cual debe ser independiente de las que realizan los otros bloques del pro-grama. La comunicación entre módulos debe ser mínima.

Los módulos se programan usando procedimientos. Dependiendo de la com-

plejidad de la tarea que realice un módulo específico, éste puede contener más de un procedimiento. Esta técnica simplifica en forma notable el proceso de diseño y el mantenimiento ulterior de los programas. El desarrollo de un programa extenso y complejo se facilita si el código es separado en bloques funcionales que contengan un número relativamente pequeño de instrucciones. No existen reglas totales para la pro-gramación modular con relación al número de líneas que debe tener un módulo para formar parte de un programa eficiente. Sólo deben cumplirse con tres reglas básicas al escribir cada módulo. Este debe,

1. Realizar una función única. 2. Contener todas las instrucciones necesarias para llevarla a cabo. 3. Tener una entrada y una salida

Page 326: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

307

La técnica de programación modular disminuye el tiempo de desarrollo de un programa, al separar la función global del código en tareas pequeñas realizadas por subprogramas cortos, mas simples de escribir y de depurar que un programa extenso. Las unidades de código pueden ser escritas por más de un programador y en forma independiente.

Debido a que las fallas de posible aparición durante el proceso de depuración

de un programa son especificas de cada módulo, éstas son fáciles de encontrar y co-rregir. Una vez verificados los módulos en forma independiente, éstos son enlazados y relocalizados para formar un bloque único de código, el cual puede ser cargado en memoria y ejecutado.

Otra ventaja de la programación modular es patente cuando un programa des-

arrollado y en operación debe ser modificado. Esto puede responder a que un proce-dimiento particular debe ser reformado o que nuevos módulos deben ser incluidos. En ambos casos, los cambios necesarios pueden realizarse sin afectar al resto de los ar-chivos del programa. Finalmente, la programación de rutinas funcionales permite establecer una biblioteca de procedimientos factibles de ser usados en programas fu-turos.

Los beneficios obtenibles por el diseñador con la utilización de la técnica de

programación modular son de tal proporción, que ésta técnica ha sido adoptada como un recurso de presencia obligada durante el proceso de diseño y escritura del software de soporte de aplicaciones basadas en microcontroladores y microprocesadores. No obstante, pueden señalarse algunos puntos débiles del uso de módulos, pero que en modo alguno pueden considerarse desventajas significativas.

La programación modular requiere de sostén extra de programas para desarro-

llo. Los procedimientos individuales deben ser relocalizables y debe disponerse de un programa enlazador (linker). La cesión del control del programa a los módulos consume tiempo de CPU y memoria. Además, es necesario escribir rutinas para de-puración de los módulos, los cuales son verificados antes de la prueba del programa final.

7.2.2 Diseño hacia abajo Este método de diseño descendente permite organizar el programa como un

conjunto de bloques de código relacionados en forma jerárquica. Un módulo particu-lar está constituido usualmente por un procedimiento, pero no siempre es de este mo-do. En la práctica cualquiera sección de código que realice una función específica, puede ser un módulo.

Cada rectángulo del diagrama de tres niveles de la figura 7.5 corresponde a un

módulo del programa. En el nivel superior se encuentra el programa principal, el cual para realizar la tarea llama a 10, 20 y 30, ubicados en el nivel 1. La subtarea ejecutada

Page 327: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

308

por el módulo 10 requiere que éste llame a 11, 12 y 13; mientras que 20 usa a 21 y 22. El módulo 30 no llama a ningún procedimiento.

Fig. 7.5 Organización jerárquica de los módulos

Una vez establecida la tarea que debe realizar el programa, como resultado de la suma de pequeñas subtareas propuestas en forma general, el proceso continúa con la progresiva sustitución de cada proposición con secuencias específicas de código.

1. La primera fase del diseño consiste en escribir y depurar el módulo principal, el cual incluirá las llamadas necesarias a los módulos restantes del programa. Para la prueba, cada rutina puede substituirse por un código auxiliar que entregue la misma respuesta que debería entregar el sub-programa codificado y verificado.

2. Durante la segunda fase, cada módulo es codificado y depurado. Una vez verificado un módulo,

el código auxiliar correspondiente es sustituido por el código operativo. 3. Codificados todos los módulos, se prueba el programa final.

La ventaja más resaltante del método de diseño en descenso es que no requiere

codificar y probar todos los módulos y posteriormente realizar la prueba del progra-ma. Esta técnica convierte el proceso de desarrollo de un programa en una serie de etapas donde se mezclan la escritura y depuración de secciones de código. Existen algunos defectos que pueden afectar negativamente los resultados obtenibles al apli-car esta técnica. Es obvio que la escritura de los programas auxiliares puede ser una labor compleja y en casos extremos, imposible de realizar.

El módulo principal debe se cuidadosamente definido, escrito y depurado.

Cualquier error en el diseño o escritura de esta sección causará resultados fatales en la eficiencia u operatividad del programa desarrollado.

7.2.3 Código estructurado

El uso de programación estructurada como método de desarrollo de progra-

mas es una vía para eludir el uso indiscriminado de instrucciones tipo GO TO, debido

Page 328: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

309

a que este comando de bifurcación resulta en el desarrollo de programas confusos y difíciles de analizar. Para escribir un programa eficiente no se requieren estructuras complejas de control. La aplicación práctica de teoremas de estructura ha verificado que un programa con cualquier grado de complejidad puede ser desarrollado sin el uso de instrucciones GO TO concibiéndolo en términos de tres estructuras lógicas de control básicas: secuencial, condicional y lazos. Considerando las variantes de las estructuras condicionales y lazo, se tienen cinco tipos comunes de formas lógicas simples, ampliamente usadas en lenguajes de programación de alto nivel. Estas son:

1. SECUENCIAL 2. IF-THEN/ELSE. 3. CASE. 4. WHILE-DO. 5. REPEAT-UNTIL.

La programación estructurada requiere un lenguaje en el cual las estructuras

de control puedan ser codificadas. En la práctica, existe cierta dificultad para pro-gramar en forma estructurada usando lenguaje ensamblador, debido a que la cons-trucción de lazos y proposiciones CASE en este lenguaje, implica el uso de instruc-ciones de salto. A pesar que es imposible alcanzar el nivel de estructuración posible en lenguajes de alto nivel, es factible el uso de código estructurado en programas en ensamblador.

Toda sección de código que realice una tarea representada por la realización de una acción especifica y distinguible, tendrá una entrada y una salida y las instruc-ciones se ejecutarán tal como están almacenadas consecutivamente en memoria. Una tarea o proceso puede consistir de: una operación de lectura de un puerto de entrada para adquirir datos provenientes de un convertidor análogo digital, la carga inmediata de un valor en el acumulador o de una secuencia de código que programe convenien-temente los dispositivos de E/S conectados al sistema.

También representa un proceso: un programa completo o una sección de este

que resuelva un problema matemático o ejecute algún tipo de procesamiento de datos. En cualquier caso, el procesamiento se inicia en la entrada de la rutina, ejecutándose cada instrucción hasta la finalización del programa.

Estructura secuencial Las instrucciones del programa son ejecutadas en el orden que aparecen en el

listado o lo que es igual se procesan instrucciones almacenadas en posiciones sucesi-vas de memoria. En la figura 7.6 se muestra la secuencia de ejecución de tres proce-sos.

Page 329: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

310

Fig. 7.6 Estructura secuencial.

Los procesos individuales pueden tener un nivel de complejidad interna varia-

ble. Una tarea particular puede ser realizada por una instrucción simple o puede ser necesaria una secuencia larga o compleja de instrucciones para programarse la tarea. Si cada proceso corresponde a una instrucción, el programa completo descrito por la figura 7.5, constará de tres instrucciones.

En las otras estructuras de programación, una proposición fija las condiciones

que se requieren para el control de la dirección de ejecución del programa. Cuando se ejecuta la proposición, se prueba una condición y se transfiere el control hacia una de dos vías, de acuerdo con el resultado de la prueba. Dependiendo de la estructura bási-ca, la transferencia puede producir dos acciones: en un caso, el resultado de la prueba conduce a la ejecución de un proceso determinado, o la salida del módulo; en el otro, se selecciona uno de dos más procesos posibles. En ambos modos la culminación de la ejecución del código implica la salida de la rutina.

La utilización de éstas estructuras lógicas simplifica el desarrollo de progra-

mas, al sentar las base de la técnica de programación estructurada, en la cual un con-junto de módulos, con una entrada y una salida, se combinan para formar algoritmos lógicos más complejos, los cuales también disponen de solo una entrada y una salida. El resultado es el desarrollo de programas más eficientes, fáciles de entender y de modificar.

Page 330: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

311

Estructura IF-THEN/ELSE

Un elemento de decisión es usado para aprobar la ejecución de un proceso o para seleccionar entre la ejecución de uno de dos procesos. En el primer caso la es-tructura se reduce a IF-THEN. La forma general de la proposición es,

IF condición 1 THEN proceso 1 ELSE proceso 2

En la figura 7.7 se muestra el algoritmo de esta estructura de código y en el ejemplo 7.1 se presenta el listado de n programa que usa la estructura lógica IF-THEN/ELSE.

(a) (b) Fig. 7.7 Estructuras de control: a) IF THEN. b) IF-THEN/ELSE Ejemplo 7.1

Usando la estructura lógica IF-THEN/ELSE, escriba un programa para activar

la bandera de acarreo e iluminar un LED conectado al bit 7 del puerto de salida 20H, si el dato en el puerto de entrada 20H corresponde al caracter ASCII ‘R’. En caso contrario el indicador de acarreo debe ser 0 y se activará un LED conectado al bit 3 del mismo puerto de salida.

Page 331: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

312

En la figura 7.8 se muestra el diagrama de flujo del código y a continuación el listado del programa.

in 20h ; Lee el puerto 20h. cpi 52h ;Compara el contenido de a con ‘r’. jnz noesr ; Salto si el caracter no es ‘r’. stc ; Cy=1. mvi a, 80h ; Bit 7 del a a 1. jmp led ; Salto a escribir en puerto 20h. noesr: stc ; Cy=1. cmc ; Se complementa cy

mvi a, 08 ; Bit 3 del a a 1. led: out 20h ; Se escribe en puerto de salida 20h. hlt

Fig. 7.8 Diagrama de flujo del programa del ejemplo 7.1

Una vez realizada la lectura del puerto 20H se compara el valor en el registro

acumulador con el código 52H. El elemento de decisión es el estado del bit de cero Z, el cual es probado con una instrucción JZ de salto condicional, para determinar la secuencia de instrucciones a ejecutarse, entre dos posibilidades. Observe que al reali-zarse la tarea correspondiente se produce la salida del programa.

Page 332: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

313

Estructura CASE

Es usual que un programa deba seleccionar la realización de una tarea dentro de un grupo de opciones. Para codificar una estructura de selección múltiple existen dos caminos: el primero es utilizar varias proposiciones IF-THEN y una IF-THEN/ELSE, de la forma,

IF condición 1 THEN proceso 1 IF condición 2 THEN proceso 2 IF condición 1 THEN proceso 3 . . . ELSE proceso n

Fig. 7.9 Selección múltiple

Se ejecutará el proceso correspondiente a la condición que sea verdadera. Una vez realizada la tarea seleccionada se sale del programa. Si ninguna condición es ver-dadera se ejecuta el último proceso. Este tipo de selección puede complicar innecesa-riamente un programa. La estructura CASE es la segunda vía disponible para selec-ción múltiple. La proposición CASE permite que el valor de una variable entera entre 0 y n, determine cual de varios procesos debe ser ejecutado. El valor índice puede ser

Page 333: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

314

resultado de la evaluación de una expresión o puede ser suministrado por un periféri-co. La forma de la proposición CASE es,

CASE variable proceso 0 proceso 1

. . .

proceso n

Fig. 7.10 Estructura CASE Para el caso igual a i se ejecuta el proceso i, al culminar la ejecución de la ta-

rea seleccionada, el control abandona la rutina. Si el valor índice es mayor que n, el comportamiento de la proposición CASE es impredecible, auque puede programarse algún código de protección contra tal eventualidad.

Suponga ahora que desee escribir una rutina con estructura CASE para ejecu-

tar uno de cuatro procesos diferentes, según indique un número binario almacenado en el registro E, este dígito puede ser: 0, 1, 2, ó 3. Para codificar la proposición CASE se usará una tabla de saltos almacenada en memoria, la cual contiene las direcciones de inicio de los cuatro procesos. Los dos primeros bytes de la lista contienen la direc-ción de inicio de la rutina correspondiente al proceso 0, y así sucesivamente. Los

Page 334: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

315

elementos de la tabla ocupan 8 bytes de memoria. Conocido el proceso a ejecutar se debe encontrar la dirección del proceso en la tabla.

Para el acceso a la tabla se programa un modo de direccionamiento conocido

como base más desplazamiento, donde la base representa la dirección de inicio del arreglo de datos, mientras que el desplazamiento señala la ubicación relativa en el arreglo de un elemento de 16 bits. Si llamamos i el número del proceso a ejecutar, su dirección en la tabla estará a partir de la posición de memoria base + 2*i, como indi-ca la tabla 7.3.

Tabla 7.3 Ubicación de las direcciones de salto

Dirección en la tabla Proceso Byte alto Byte bajo

0 base+1 base 1 base +3 base+2 2 base +5 base+4 3 base +7 base+6

Observe que si nos ubicamos en el inicio de la tabla, bastará desplazarse dos

veces el valor del número binario de entrada, para apuntar la dirección de inicio del proceso. Esto significa que si el número es 3, basta con ir a la dirección base+6 para encontrar el byte de orden bajo de la dirección de salto. Ejemplo 7.2

Escribir un programa con estructura CASE utilizando una tabla de saltos. El número de la tarea a ejecutar se encuentra el registro E de 8 bits.

Conviene utilizar direccionamiento indirecto por registro para acceder a la ta-

bla. La posición del elemento seleccionado en la tabla está almacenada en el registro par HL. Para crear la dirección se carga la base del arreglo en HL y se le suma dos veces el valor del número del proceso, obteniéndose la dirección en HL. Con este registro apuntando la posición deseada se transfiere desde la memoria hasta el regis-tro DE la dirección de la posición de que contiene la rutina. Esta información se transfiere a HL y finalmente al contador de programa, haciéndose efectiva la ejecu-ción del proceso.

mvi d,0; ; Byte alto del desplazamiento de la tabla a cero. lxi h, tabla ; Cargar hl con la base de la tabla. dad d ; Sumar el desplazamiento a la base de la tabla. dad d ; Sumar de nuevo mov e,m ; El byte bajo de la dirección de salto en e. inx h ; HL apunta a dirección siguiente. mov d,m ; El byte alto de la dirección de salto en d. xchg ; Intercambiar los contenidos de hl y de. pchl ; Saltar al proceso.

Page 335: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

316

Para garantizar que la estructura CASE tenga una entrada y una salida, cada rutina de proceso debe asegurar que una vez ejecutado, el control de programa vaya a la misma dirección de la memoria. Aunque las dos últimas estructuras de control se discuten en el capitulo 6, para mantener la continuidad, se repiten aquí.

Estructura DO-WHILE

Las instrucciones de salto permiten el establecimiento de lazos de programa-ción, en los cuales un grupo de instrucciones se ejecutan repetidamente mientras una instrucción de salto condicional se encarga de controlar la repetición y salida del lazo.

Fig. 7.11 Estructura DO-WHILE.

En esta estructura la condición al inicio del lazo es repetidamente evaluada, y el resultado de la prueba indicará si se debe ejecutar el lazo o salir de este. Cuando se utiliza un contador podría concebirse como ejecute el proceso mientras el contador sea distinto de cero. En tanto esta condición sea cierta, la tarea se realizará repetida-mente. Cuando el contador llegue a cero, la condición será falsa y se saldrá del pro-grama.

Ejemplo 7.3

Este programa transfiere un bloque de 16 datos desde una zona de memoria con dirección de inicio en DORG, hasta otra área con dirección de inicio DDES. En este caso el lazo debe repetirse 16 veces para lograr la transferencia del bloque de datos de 16 bytes. Pero, debido a que el contador se decrementa antes de la ejecución del primer lazo, el contador debe cargarse con un valor N, siendo (N-1) el número de veces que debe repetirse el lazo.

Page 336: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

317

lxi h,dorg ; Cargar en hl la dirección de inicio del bloque origen. lxi d,ddes ; Cargar en de la dirección de inicio del bloque desti no mvi b,17 ; Inicializar el contador de número de datos a mover. lazo: dcr b ; Disminuir contador. jz salir ; Si el último dato fue transferido, salir de la rutina. mov a,m ; Leer un dato desde el bloque origen. stax d ; Transferir el dato al bloque destino. inr l ; Incrementar apuntador de bloque origen. inr e ; Incrementar apuntador de bloque destino jmp lazo salir:

Estructura REPEAT-UNTIL En este tipo de proposición, el control entra al lazo y el proceso es ejecutado

incondicionalmente, posteriormente se prueba la condición y dependiendo del resul-tado se repite el lazo o se abandona este. A diferencia de la estructura DO-WHILE en la cual es posible que el lazo nunca se ejecute, en REPEAT-UNTIL se ejecuta por lo menos una vez.

Fig. 7.12 Estructura REPEAT-UNTIL

En el caso que se use un registro como contador para el control del lazo, la proposición puede concebirse como: repita el proceso hasta cuando el contador al-cance cero. Mientras la condición sea falsa, se ejecuta la tarea. Cuando sea verdadera

Page 337: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

318

se sale del programa. El ejemplo 7.4 muestra el código del ejemplo 7.3 usando la es-tructura REPEAT-UNTIL.

Ejemplo 7.4

lxi h,dorg ; Cargar en hl la dirección de inicio del bloque origen. lxi d,ddes ;Cargar en de la dirección de inicio del bloque desti no mvi b,16 ; Inicializar el contador de número de datos a mover. lazo: mov a,m ; Leer un dato desde el bloque origen stax d ; Transferir el dato al bloque destino. inx h ; Incrementar apuntador de bloque origen inx d ; Incrementar apuntador de bloque destino dcr b ; Decrementar contador. jnz lazo ; Si el último dato fue transferido, salir de la rutina.

No siempre estas dos últimas estructuras de programación requieren un con-

tador para el control de repetición del lazo, es posible mantener activo el lazo hasta la ocurrencia de un evento externo, como la introducción de un caracter por un puerto, o la lectura de un dato de control almacenado en memoria.

Ejemplo 7.5

Considere que un grupo de datos numéricos almacenados en una tabla en me-

moria deben ser transferidos al puerto de salida 1. El final del arreglo de datos es in-dicado con el código del caracter ASCII ‘P’ (parar). Una rutina que realiza esta tarea se escribe a continuación.

lxi h,tabla ; Cargar en hl dirección de inicio de la tabla. lazo: mov a,m ; Mover al acumulador el contenido de m. cpi 80h ; Comparar el dato en a con el caracter ‘p’. jz salir ; Si es ‘p’, salir. out 01 ; Si no es ‘p’, escribir en puerto de salida. inx h ; Incremente hl. jmp lazo ; Repetir lazo. salir: Es obvio que el número de veces que el lazo se repite es desconocido, dado

que es fijado por la localización del caracter ‘P’ en memoria.

7.3 EL LENGUAJE ENSAMBLADOR El ensamblador permite representar en forma simbólica el lenguaje de máqui-

na del procesador, facilitando la escritura o lectura de un programa. Cada µP viene con su propio ensamblador, aunque es usual que segundas fuentes provean otras ver-siones del lenguaje para un mismo µP. Aunque la sintaxis y potencia del traductor

Page 338: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

319

puede variar de una versión a otra, existen ciertas características comunes. Por ejem-plo todo buen ensamblador permite,

• Usar una secuencia de caracteres alfanuméricos (TPULSO, LAZO, LAZO1) para el mane-

jo simbólico de direcciones. • Definir constantes en bases distintas: 255, FFH, 377Q, 11111111B, representan el mismo

número en decimal, hexadecimal, octal y binario respectivamente. • La asignación de direcciones de memoria usando expresiones aritméticas. • Reservar áreas de la memoria para el almacenamiento del programa y los resultados. • El uso de seudo-instrucciones o directivas para controlar el proceso de ensamblaje.

Tales características resultan en el incremento de la productividad del progra-

mador al evitarse los errores inherentes a la representación de instrucciones, direccio-nes y datos en binario, y simplifica el proceso de modificación y documentación de los programas. Una de las desventajas del lenguaje ensamblador es que al estar ínti-mamente relacionado con la estructura de la máquina, cada microprocesador deberá disponer de su propio ensamblador.

7.3.1 El proceso de ensamblaje

En su forma más simple un ensamblador lee un archivo fuente escrito siguien-do la sintaxis del traductor. El nombre del archivo es elegido por el usuario y su ex-tensión es fijada por el diseñador del traductor. Por ejemplo: nombre.asm, nom-bre.a85 y nombre.scr, son archivos típicos de entrada para ensambladores del µP 8085A.

Como muestra la figura 7.13, el traductor procesa el programa fuente y lo tra-

duce a código objeto. El archivo objeto contiene el código ejecutable con todos las referencias simbólicas de códigos de operación, datos y direcciones convenientemen-te convertidas a binario. Cuando el ensamblador traduce el programa fuente también incorpora en el archivo binario generado información adicional además de la versión en lenguaje de máquina del código. Esta información permite control de la carga en memoria del código ejecutable.

Lo usual es que el archivo objeto tenga un formato adecuado para ser cargado

en un grabador de EPROM o EEPROM, en la memoria de un equipo emulador del µP o para ser entrada de un programa simulador del µP. En cualquier de estos casos el código objeto generado por el ensamblador puede ser probado y depurado.

El ensamblador genera además un archivo texto o programa lista que contiene

una combinación del programa fuente y el código de máquina generado, indicando las direcciones de memoria utilizadas para almacenamiento del programa, y mensajes de posibles errores cometidos en la escritura del texto fuente. Opcionalmente, algunos

Page 339: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

320

ensambladores entregan otro archivo texto denominado referencia cruzada, el cual ofrece una herramienta de diagnóstico para el desarrollo de programas, al contener información sobre los símbolos usados, su clase, dirección y líneas del programa donde aparecen. El archivo lista se identifica como nombre.lst o nombre.prn, y la referencia cruzada como nombre.crf.

Fig.7.13 Salidas del proceso de ensamblaje

Al inicio del ensamblaje, el programa ensamblador activa un contador de loca-

lizaciones (LC), el cual se inicia por defecto en la dirección 0000H. Este contador se incrementa a medida que se procesa cada instrucción del programa fuente para indi-car al ensamblador la posición de memoria donde se ensamblará la siguiente instruc-ción. El contenido del LC puede ser modificado por el comando ORG dirección. Al final del proceso de traducción, el archivo objeto contiene todas las direcciones de carga del código especificadas pudiendo ser cargado directamente en memoria. Este tipo de archivo se conoce como archivo objeto absoluto. El proceso descrito supone la existencia de un solo archivo fuente. En el momento de la traducción el ensambla-dor conoce las direcciones de memoria donde se cargarán todas las etiquetas del pro-grama. Una dirección puede expresarse como un número: 0100H, o con una etiqueta como DIRM. El ensamblador se encarga de determinar el valor absoluto de la direc-ción y lo asigna a la etiqueta, manteniendo un registro en una tabla de símbolos.

7.3.2 Proceso de ensamblaje de un programa modular

El ensamblador genera un código objeto absoluto cuando en el programa fuente todas las direcciones se declaran en forma absoluta. Esto requiere que el pro-gramador conozca y defina las direcciones de carga en memoria de las instrucciones de datos del programa. Este modo de programación es ineficiente porque especificar la dirección de carga del código en memoria impide la ejecución del programa en otra área de memoria y el desarrollo de programas en forma modular. La función del en-samblador que permite superar estas limitaciones se denomina relocalización y capa-cita al programador par codificar un programa o partes de éste sin desvelarse por la

Page 340: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

321

ubicación en memoria del código objeto final. El uso de la relocalización genera un código reubicable, el cual es un software cuya dirección de carga puede cambiar. El código puede ser movido en el espacio de direcciones del µP y ejecutado en más de una dirección. Un programa relocalizable puede ejecutarse en la dirección cero en un caso, y en 2000H en otro.

Para ilustrar una de las ventajas de la relocalización de código considere que

subsistema de memoria de una aplicación con µP está compuesto por una combina-ción de memoria EPROM y RWM, con direcciones lógicas determinadas. Es claro que el programa final a ejecutar en el hardware debe hacer referencia a estas direcciones. No obstante, es común que en la fase de desarrollo y depuración del software se usen recursos como equipos emuladores o simuladores con un espacio de direcciones de memoria distinto al de la tarjeta de la aplicación. La relocalización permite la prueba del programa en cualquier dirección y posteriormente la reubicación del código a las direcciones correspondientes al hardware desarrollado.

Además, la aplicación de la técnica de programación modular en el desarrollo

de programas con ensamblador es posible gracias a la relocalización de código. Esta función hace posible el ensamblaje y depuración de los módulos independientes, los cuales serán posteriormente enlazados para formar un programa único ejecutable. Los ensambladores son diseñados para permitir el uso de programación modular, pudien-do el programador estar en capacidad de diseñar, codificar, y probar en paralelo mó-dulos distintos del programa y limitar las modificaciones necesarias a un modulo es-pecifico en lugar de hacerlo al programa completo.

En la etapa inicial de desarrollo del programa, las tareas a realizar son defini-

das y divididas en rutinas. El programa constará de varios archivos o módulos, los cuales son escritos y ensamblados independientemente. Además, el programa puede requerir el uso de algún código contenido en una biblioteca de programas, el cual debe ser incorporado durante el proceso de traducción al archivo binario ejecutable final. Un módulo de entrada tiene un nombre asignado por el usuario y puede conte-ner uno o más segmentos o segmentos parciales.

Un segmento es una sección de código o de datos en memoria generada a par-

tir de código o datos del archivo fuente, y puede ser absoluto o relocalizable. Un programa ejecutable consistirá de un módulo único que es una combinación de los segmentos absolutos y relocalizables de los módulos de entrada.

Un segmento absoluto identifica una sección de código con su dirección de

carga completamente especificada, estos se usan para definir código cuya dirección nunca cambiará. Los segmentos absolutos normalmente se usan (aún en módulos que contengan segmentos relocalizables) para puertos mapeados en memoria o para car-gar código en direcciones fijas usadas por el procesador, por ejemplo rutinas de inicio o vectores de interrupción.

Page 341: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

322

Los segmentos relativos contienen código cuya dirección de carga en memoria aun no está definida. Un segmento relocalizable tiene nombre, tipo y otros atributos. Los segmentos que tengan el mismo nombre pero procedan de diferentes módulos son considerados parte del mismo segmento y son denominados segmentos parciales. Estos son combinados por el por el programa enlazador. Los segmentos absolutos no tienen atributos y no pueden combinarse con otros segmentos.

Los segmentos se definen al inicio del programa. El ensamblador AVMAC85

asigna un contador de posiciones para cada segmento. Cuando un segmento definido es activado, su LC es puesto a cero (en segmentos absolutos, ORG dirección puede modificar el LC) y toda instrucción o dato subsiguiente es asignado a este bloque de memoria. La activación de un nuevo segmento inicia un nuevo LC y desactiva el segmento en curso.

El símbolo ($) hace referencia al valor del LC en el segmento activo. El LC

apunta al espacio de direcciones dentro del segmento y su contenido representa una dirección lógica para segmentos absolutos o un desplazamiento para segmentos relo-calizables. Las direcciones lógicas identifican posiciones reales de memoria usadas por el microprocesador cuando requiere acceso a instrucciones o datos del programa en el espacio de memoria del microcomputador. Para segmentos relocalizables la dirección inicial de carga puesta por el ensamblador siempre es cero y el LC se in-crementa a medida que se agregan líneas de código.

Una etiqueta en la primer byte de la sección de código relocalizable se le asig-

na la dirección cero. De modo que cualquier línea dentro del segmento estará en una dirección que representa un desplazamiento con relación a la localización final de carga del segmento. Cuando los segmentos relativos son vinculados por el enlazador se le asigna su dirección real de carga y todas las etiquetas relativas son resueltas.

El proceso de traducción de los archivos de entrada que componen cada pro-

grama fuente se describe a continuación: 1. Durante el primer paso el ensamblador examina cada programa fuente y agrupa las refe-

rencias simbólicas en una tabla. 2. En el segundo paso, el ensamblador genera un código el cual no está totalmente en códi-

go de máquina. Más bien es un código muy cercano al lenguaje de máquina, denominado código relocalizable, al cual llamaremos código objeto.

3. Un programa denominado enlazador/relocalizador se encargará de procesar los distintos

módulos objetos para formar un programa único ejecutable. En la figura 7.14 un diagrama de bloques ilustra el proceso de generación de

un programa objeto absoluto a partir de varios módulos de entrada.

Page 342: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

323

Fig.7.14 Secuencia de traducción de un programa modular Después que el diseño del programa es completado, se escriben los distintos

módulos fuente y se traducen uno a uno a código objeto usando el ensamblador. Este genera un archivo objeto de tipo relocalizable, si al menos uno de los segmentos del respectivo módulo fuente es de este tipo, en caso contrario el código objeto resultante para ese módulo particular será absoluto. Opcionalmente, el traductor entregará los resultados del ensamblaje en un archivo texto o listado del programa por cada módulo de entrada.

El programa objeto contiene las instrucciones del código en lenguaje de má-

quina y los datos a ser cargados en memoria y ejecutados, además incorpora coman-dos de control adicionales que dirigen el proceso de carga. Para un módulo particular, el ensamblador puede producir un programa objeto en código relocalizable, pero si el módulo contiene solo segmentos absolutos, el archivo objeto producto del ensamblaje será código absoluto. Este puede ser cargado en memoria sin pasar por el programa enlazador/relocalizador.

El archivo mapa es un fichero ASCII donde se registra información sobre el proceso de enlace de los archivos objeto con códigos relocalizables y absolutos. Al final del ensamblaje de todos los módulos del programa, el programa enlazador pro-cesa el archivo en módulo objeto. La función del enlazador/relocalizador es asignar direcciones de memoria absolutas a todos los segmentos relocalizables, combinando segmentos del mismo nombre y tipo.

Además el enlazador resuelve todas las referencias entre módulos. Las salidas

del linker son: Un programa objeto en código absoluto listo para ejecutar y un pro-grama lista que muestra los resultados del proceso de enlazado y reubicación. Por ejemplo se indican los segmentos del programa especificando el tipo las direcciones de inicio y final, además de las direcciones de carga en memoria de cada módulo del programa.

Page 343: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

324

Fig. 7.15 Proceso de desarrollo de un programa

Page 344: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

325

La figura 7.15 muestra, que el código absoluto de salida puede ser programa-do en una memoria no volátil y ejecutado por el μP. Por ejemplo en un grupo de ROMs programadas por máscara en la fábrica, o en una PROM, EPROM o EEPROM programada por el usuario. El emulador en la figura 7.15 es una herramienta especia-lizada para la depuración de programas para sistemas basados en microprocesadores. Lo común y deseable es que el desarrollo del programa, desde el diseño, ensamblaje, prueba y depuración, hasta la grabación en memoria sean realizado usando equipos microcomputadores de propósito específico, denominados Sistemas de Desarrollo (SD), los cuales incluyen todas las herramientas necesaria para el diseño y desarrollo de programas . Es común que cada fabricante de µPs ofrezca un SD adecuado para el diseño de aplicaciones generales que usen el dispositivo que producen.

Algunos μC de bajo costo como el MPR-85 requieren que el código objeto ab-

soluto esté en formato hexadecimal para proceder a su ejecución. En este caso, se requiere el uso de un programa para convertir desde código objeto a formato hexade-cimal. En realidad, algunos enlazadores entregan directamente un archivo ejecutable en formato hex...

7.3.3 Lenguaje ensamblador para el 8085

Para un proceso de ensamblaje exitoso es necesario que el archivo texto que contiene el código fuente cumpla estrictamente con ciertas reglas de codificación, propias de cada ensamblador. Existen muchos ensambladores para el µP 8085A, los cuales pueden presentar diferencias en la sintaxis del lenguaje. No obstante existen algunas características comunes a todos los ensambladores que permiten la descrip-ción de los aspectos resaltantes del lenguaje usando una versión específica. En esta sección se presenta el ensamblador original (ASM80) diseñado por la empresa INTEL para el 8085A, el cual es descrito con detalle en el 8080/8085 Assembly Language Programming Manual. El uso de otra versión del lenguaje usualmente implica modi-ficaciones menores en el programa fuente.

Un programa fuente escrito en lenguaje ensamblador consiste de una secuen-

cia de líneas que suministran al ensamblador la información necesaria para ejecutar el proceso de traducción. El ensamblador reconoce tres tipos de líneas fuentes:

• Instrucciones en nemónicos que serán traducidas a código de máquina. Este tipo de línea

genera código ejecutable. • Directivas generales de ensamblador para especificar la estructura del programa y definir

los tipos y alcance de los símbolos usados. Por ejemplo, especifican el valor de inicio del contador de localizaciones, señalan el final del programa, permiten reservar direcciones o cargar datos en memoria. También se usan para definir y activar segmentos o para definir si un símbolo tiene un alcance local o global.

• Directivas de control de ensamblador para fijar el modo de ensamblaje. Por ejemplo,

usando una de estas directivas puede especificarse el nombre de un archivo en ensambla-

Page 345: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

326

dor que debe ser incluido como parte del programa que está siendo traducido. También puede establecerse los archivos de salida a generarse, el ancho o longitud de la página y el título del programa.

Formato de línea

El formato de una línea del programa fuente consta de cuatro campos, separa-

dos al menos por un espacio en blanco.

CAMPO 1 CAMPO 2 CAMPO 3 CAMPO 4 Etiqueta Código de operación Operando(s) ; Comentarios

Fig. 7.16 Formato de línea del ensamblador

• El campo de etiqueta identifica en forma simbólica la posición de memoria donde se lo-caliza la instrucción que es ensamblada y debe finalizar con dos puntos (:). Es opcional, y puede consistir de uno a seis caracteres alfanuméricos, pero el primer caracter debe ser al-fabético o uno de los caracteres especiales ‘?’ o ‘@’. El ensamblador indicará error si una etiqueta es definida más de una vez en el programa.

• El campo de código de operación Puede contener el nemónico de una instrucción del μP

que debe ser ensamblada o una directiva de ensamblador para ser ejecutada.

• El campo de operando especifica explícitamente o identificando el lugar de origen de los datos o dato que usará la instrucción definida en el campo de código de operación. Este campo estará vacío para instrucciones que no requieran operandos, STC por ejemplo, o puede contener dos operandos cuando deba especificarse el destino de los datos, como en MOV A,B. El operando puede ser un registro, una referencia a memoria, un dato, o una dirección.

• El campo de comentarios expone la función la operación que ejecuta la instrucción. Es

opcional y en una línea fuente puede existir solo este campo. Un caracter (;) marca el ini-cio del comentario.

Etiqueta Código de operación Operando(s) ; Comentarios ; ********************Esto es una sección del ejemplo 6.32********************* LAZO: DCX B ;Decremento registro par BC MOV A,B ;Byte alto del contador al A. ORA C ; OR entre B y C.

Fig.7.17 Ejemplos de líneas fuente válidas. La primera línea solo tiene campo de comentario.

Page 346: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

327

Conjunto de caracteres

Los siguientes caracteres son reconocidos por el ensamblador: a) Las letras del alfabeto Inglés. Desde la A hasta la Z. b) Los dígitos del 0 al 9 c) Los caracteres especiales + - * / , ( ) ‘ & ... d) Cualquier caracter del código ASCII que forma parte de una constante encerrada entre

apóstrofes (‘R’ , ‘abef’), o que forme parte de un comentario.

Delimitadores

Son caracteres especiales usados para indicar la finalización de una línea o pa-ra separación entre campos.

Tabla.7.4 Delimitadores legales en el asm80/85

CARACTER USO b Uno o más espacios en blanco Separador de campo. , Coma Separador de operandos. ; Punto y coma Inicio de comentario : Dos puntos Último caracter de la etiqueta ‘ ’ Dos apóstrofes Delimita cadena de caracteres. ( ) Dos paréntesis Delimita una expresión.

Especificación de operandos

Cuando existen dos operandos, el primero identifica el destino del resultado, mientras que el segundo señala el origen del dato. Los tipos de operandos posibles son:

• Registro. • Registro par. • Dato inmediato. • Dirección de 16 bits.

Los operandos pueden especificarse de distintas formas:

Hexadecimal

Una cantidad hexadecimal iniciada con un dígito del 0 al 9, y que finalice con la letra H.

EJEMPLO

00H 23C5H 0DFH 0FFFCH

Page 347: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

328

Octal

Un número octal seguido por la letra Q u O.

EJEMPLO 45Q 1234Q 230Q 7600Q

Binario

Cualquier cantidad en binaria seguida por la letra B.

EJEMPLO 11010100B

Constante ASCII

Un caracter encerrado entre apóstrofes define una constante ASCII.

EJEMPLO MVI A,‘G’ ; Carga el A con el valor 47H,

;correspondiente al código en ;ASCII del caracter G.

Valores asignados a etiquetas

Las directivas SET y EQU permiten asignar valores a etiquetas. Si DATO tie-

ne asignado el valor 0DH, puede ser usada como operando, de modo que las siguien-tes instrucciones son equivalentes:

EJEMPLO

SUI 0DH SUI DATO

Etiquetas de instrucciones o datos

El ensamblador asigna a las etiquetas usadas para identificar líneas de pro-grama, el valor de la dirección del primer byte de la instrucción. A partir de la decla-ración de la etiqueta, cualquier instrucción del código fuente puede utilizar esta eti-queta como operando.

EJEMPLO LAZO2: DCX B MOV A,B ORA C JNZ LAZO2 ; Salto a instrucción en lazo2 si Z=0.

Page 348: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

329

Expresiones

Cualquier de los operandos anteriores pueden se usados conjuntamente con operadores, para formar expresiones utilizables como operandos en una instrucción.

EJEMPLO

SUI 2*DATO MVI A,DATO + 5

Referencia al contador de posiciones

El ensamblador usa un contador para mantener un seguimiento de las direc-ciones de las instrucciones en lenguaje de máquina. Debido a que estas direcciones en última instancia especifican posiciones de la memoria principal, el contador es deno-minado contador de posiciones (Location counter (LC)). Antes del ensamblaje el LC es puesto a cero. Luego que cada línea fuente ha sido examinada en el primer paso, el LC es incrementado en un valor igual al número de bytes de cada instrucción. Existe una directiva de ensamblador, ORG, la cual permite inicializar el LC en una dirección diferente a cero.

El caracter especial $ hace referencia al contenido actual del contador de posi-

ciones, y puede formar parte de un operando.

EJEMPLO SALTO: JMP $ - 5 ; Salto a la dirección 5 bytes

; atrás del primer byte de esta ; instrucción.

Símbolos reservados

Los símbolos utilizables en el lenguaje ensamblador tienen el formato especi-ficado para las etiquetas. Existen ciertos símbolos que no pueden ser definidos como símbolos de usuario debido a que tienen un significado específico para el ensambla-dor. Por ejemplo, los nemónicos de las instrucciones y las directivas son símbolos reservados por el ensamblador. Los operandos de la tabla 7.5 tampoco pueden usarse como símbolos de usuario.

Definición de símbolos Un símbolo global es aquel que mantiene su significado a lo largo del progra-

ma. Si una dirección especifica de una instrucción se le asigna el símbolo SALTO1, se puede hacer referencia a este símbolo desde cualquier parte del programa. Un sím-

Page 349: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

330

bolo global solo puede definirse una vez en el programa, de lo contrario habrá una indicación de error.

Tabla. 7.5 Símbolos de operandos reservados por el ensamblador. SÍMBOLO SIGNIFICADO

$ Referencia al contador de posiciones A Acumulador B Registro B o registro par BC C Registro C D Registro D o registro par DE E Registro D H Registro H o registro par HL L Registro L

SP Registro apuntador de pila PSW Palabra de estado del programa.

Corresponde al contenido del acumulador y del registro banderas. M Referencia a memoria usando la dirección almacenada en HL

Cuando se desarrolla un programa, es común que exista una secuencia de ins-

trucciones que es ejecutada a menudo cambiando únicamente ciertos parámetros. Para estos casos el ensamblador ofrece la posibilidad de definir una rutina denominada MACRO que puede ser tratada como una entidad. Cada vez que el macro sea llamado desde el programa principal pueden ser reemplazados un grupo de parámetros por otros. La posibilidad de usar macros evita la codificación repetida un grupo de ins-trucciones (con parámetros distintos) a lo largo del programa.

Un símbolo local tiene significado solamente dentro de un macro o en una

llamada a macro, su nombre deriva del hecho que son locales al macro. Si un nombre dentro de un macro es definido como global, al realizar la segunda llamada al macro se recibirá un mensaje de error indicando la duplicación de un símbolo global. Si el valor de un símbolo es constante durante el proceso de ensamblaje se dice que es un símbolo permanente, en caso contrario se habla de símbolo redefinible.

Los programas relocalizables son ensamblados con referencia a la posición de

memoria 0, siendo posteriormente relocalizados a otra área de memoria. Un símbolo absoluto mantiene constante su dirección durante el proceso de reubicación, mientras que un símbolo relocalizable la cambia. Un símbolo relocalizable externo es usado en un módulo, pero definido en otro.

Un símbolo relocalizable público es definido en un módulo pero puede se

usado por otro módulo. Estos dos últimos tipos de símbolos son de utilidad cuando se usa un enlazador/relocalizador para enlazar módulos de programas relocalizables y producir un sólo programa. El ensamblador tiene directivas que permiten definir el tipo de símbolo.

Page 350: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

331

Evaluación de expresiones

Una expresión puede ser absoluta o relocalizable, y contiene símbolos, núme-ros y operadores. El ensamblador trata a las expresiones como valores de 16 bits. El número 10H, por ejemplo, se representa internamente como 0010H. Los operadores válidos en el ensamblador permiten la ejecución de operaciones:

1. Aritméticas 2. De desplazamiento 3. Lógicas 4. De comparación 5. De aislamiento de byte.

Operadores aritméticos:

Los operadores aritméticos son los siguientes: + Suma. - Resta. * Multiplicación. / División sin residuo. (13/2 = 6). MOD Módulo. El resultado es el residuo de una división (13 MOD 2=1).

Operadores de desplazamiento :

Los operadores de desplazamiento son dos:

y SHR x Desplace operando y a la derecha, x posiciones de bit. y SHL x Desplace operando y a la izquierda, x posiciones de bit.

EJEMPLO

Si (VALOR) = 10010110 = (150)10 La ejecución de la instrucción afectará al operador VALOR: VALOR SHR 2 (VALOR) = 00100101 = (37)10. Observe que al desplazar un número binario a al derecha, éste queda dividi-

do por 2. Si el desplazamiento ocurre hacia la izquierda el efecto será la multiplica-ción del número por 2.

Operadores lógicos:

Los operadores lógicos reconocidos por el ensamblador son: NOT (comple-mento), AND, OR y XOR. Estos operadores se usan extensamente en conjunto con la

Page 351: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

332

directiva de ensamblaje condicional IF. Actúan solamente sobre el bit 0 del resultado de la operación.

EJEMPLO

Si el símbolo DIR está definido como 07D3, la instrucción: LXI H,NOT DIR +1 producirá (H)(L) = (11111000) (00101011)

Operadores de comparación:

La operación de comparación produce un resultado booleano Si la evalua-ción de la expresión es cierta, el valor del resultado es todos los bits en 1, cuando es falso será todos bits en cero. Al igual que los operadores lógicos, los de comparación se usan en directivas IF.

Los operandos para comparación son:

EQ Igual EN Desigual LT Menor que LE Menor o igual GT Mayor que GE Menor o igual NUL Usado para pruebas de omisión de parámetros en macros.

Operadores de aislamiento de byte:

Cuando se requiere obtener un número de 8 bits desde una expresión, o si se desea obtener un byte de una dirección, se usan los operadores:

HIGH Obtiene el byte más significativo de un valor de

16 bits. LOW Obtiene el byte menos significativo de un valor

de16 bits Aquí finaliza una breve introducción a la sintaxis del lenguaje ensamblador. El

lector habrá notado que todos los programas fuente que se han presentado en este trabajo están escritos en ensamblador.

Traducción de un archivo fuente

Antes de presentar las directivas de ensamblador más usadas conviene realizar la traducción de un programa ejemplo para mostrar como el programa traductor reali-

Page 352: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

333

za el procesamiento del archivo fuente. Con este objetivo inspeccione el programa del ejemplo 7.6 en el cual se aplican algunos de los conceptos expuestos en esta sección.

Ejemplo 7.6 El objetivo del programa es leer 16 caracteres ASCII del puerto de entrada 0 y

determinar si corresponden a dígitos válidos del sistema de numeración hexadecimal. Cada vez que un dato se presente en el puerto 0, el bit 0 del puerto 02 se pone en ni-vel alto.

Si el digito en el puerto pertenece al conjunto: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F’

debe almacenarse en un bloque de memoria con inicio en 1000H. Si la prueba falla, el valor debe escribirse en el puerto de salida 01H. La tabla 7.6 muestra los códigos ASCII para los números hexadecimales.

Tabla. 7.6 Código ASCII de dígitos hex. CARACTER ASCII (hex)

0 30 1 31 2 32 3 33 4 34 5 35 6 36 7 37 8 38 9 39 A 41 B 42 C 43 D 44 E 45 F 46

El algoritmo para identificar un número hexadecimal es simple. Basta con

examinar el valor del caracter obtenido del puerto de entrada, el cual está almacenado en el acumulador. Si se cumple que:

30H ≤ (A) ≤ 39H ó 41H ≤ (A) ≤ 46H, El caracter es un dígito hexadecimal. El listado del programa que resuelve el problema planteado, se muestra a con-

tinuación.

Page 353: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

334

Etiqueta Código de Operando(s) Comentarios operación LXI H,1000H ; Dirección de almacenamiento de digitos hex. MVI B,17 ; Cargar contador de digitos . LAZO: DCR B ; Decrementar contador de digitos. JZ SALIR ; Salir si se evaluó último digito. BIT01: IN 02H ; Leer la palabra de control en el puerto 02. ANI 01H ; Probar si el bit 0 está en nivel alto. JZ BIT01 ; Si es cero, saltar a esperar que pase a 1. IN 00H ; Leer digiro de puerto de entrada. CPI '0' ; Comparar con ASCII ‘0’. JM INVAL ; Si es menor , no es un digito hexadecimal. CPI '9'+1 ; Comparar con ASCII ‘9’+1.

JM VALI ; Si es menor, el digito esta entre ‘0’-’9’. CPI 'A' ; Comparar con ASCII ‘A’. JM INVAL ; Si es menor no es un digito hexadecimal. CPI 'F '+1 ; comparar con ASCII ‘F’+1. JP INVAL ; Si es mayor, inválido.Debe estar entre ‘A’-’F’.

VALI: MOV M,A ; Mover a memoria el digito hex en el reg. (C). INX H JMP BIT10 ; Apuntar a próxima dirección de memoria. INVAL: OUT 01H ; Escribir en puerto de salida valor no hex. BIT10: IN 02H ; Leer la palabra de control en el puerto 02. ANI 01H ; Probar si el bit 0 está en nivel bajo. JNZ BIT10 ; Si es uno, saltar a esperar que pase a 0. JMP LAZO ; Saltar a leer nuevo valor. SALIR: HLT ; Salir al leer los 16 valores del puerto.

El camino más adecuado para comprender como se lleva a cabo un proceso de

ensamble de un programa, es realizándolo manualmente. El procedimiento lógico pareciera ser realizar un barrido del programa en un paso y traducirlo de acuerdo con la sintaxis del lenguaje ensamblador. Para esto se asigna una dirección de memoria al código de operación de la primera instrucción, la cual es el origen del programa, y se incrementa de acuerdo al número de bytes que tenga cada instrucción. Se elije la di-rección 0000H como dirección de inicio del programa anterior. Cada etiqueta que se encuentre debe registrarse en una tabla de símbolos, asignándole el valor del primer byte de la instrucción que esté en la línea donde se halla la etiqueta.

Línea Dirección Mnemónico Código Objeto Longitud Bytes 1 0000H LXI H,1000H 210010 3 2 0003H MVI B,17 0611 2 3 0005H LAZO: DCR B 05 1 4 0006H JZ SALIR CA???? 3 5 0009H IN 02H DB02 2 . . . . . . . . . . . . . . .

TABLA DE SÍMBOLOS

LAZO 0005 SALIR ????

Fig.7.18 Ensamblaje parcial del programa del ejemplo 7.6 usando un solo paso.

Page 354: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

335

Como se observa en la figura 7.18, no existe problema alguno para ensamblar las primeras 3 líneas del programa.

Línea 1: LXI H,1000H Inicio del programa, dirección 0000H. El código objeto generado corresponde al código de operación de la instrucción (21H) y a la dirección a almacenarse en el registro par HL (1000). Las direcciones siempre se almacenan ubicando el byte de menor orden en una posición de memoria y el byte de mayor orden en la siguiente. La instrucción en la línea 1 ocupará 3 bytes de la memoria a partir de la posición 1000H. Línea 2: MVI B,17H El contador de posiciones se ha incrementado en 3 bytes. El código de opera-ción de la instrucción (06H) se almacena en la posición 0003H y el dato a mover al registro B (11H=1710) ocupará la posición siguiente. La instrucción requiere 2 bytes para su almacenamiento. Línea 3: LAZO: DCR B

(LC) = 0005H ((LC)+2) Código de operación = 05 1 byte En esta línea se encuentra una etiqueta, y debe asignársele un valor igual a la dirección del primer byte de la instrucción. Esto es:

LAZO = 0005H Cuando se avance en el análisis de las líneas del programa, cualquier referen-cia a SALTO, corresponde a la dirección de memoria 0005H. Este valor queda regis-trado en la tabla de símbolos. Línea 4: JZ SALIR

(LC) = 0006H Código de operación = CA???? 3 bytes En esta línea existe una instrucción de salto condicional (Salto si Z=1) a una referencia denominada SALIR. Al tratar de ensamblar la línea 4, nos encontramos que no conocemos el valor del símbolo SALIR, al no estar incluido en la tabla de símbolos debido a que aparece posteriormente al final del programa. En consecuen-cia, no es posible ensamblar la línea 4 por completo. Una situación similar ocurrirá cuando se pretendan ensamblar las líneas 8, 10, 12, y 14. Las etiquetas INVAL y VA-LI son indefinidas. Es obvio que con este procedimiento, al llegar al final del progra-ma, quedaran algunas líneas ensambladas en forma incompleta por lo cual se requeri-rá realizar un segundo paso por el programa para completar el proceso. Al final de este segundo paso el programa quedará completamente ensamblado. La mayoría de los ensambladores son de dos pasos pero no es el descrito, el camino que se usa para

Page 355: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

336

realizar el análisis de las líneas del programa. Un procedimiento más eficiente es el siguiente:

• Paso I: Se localizan las direcciones de memoria que corresponden al código de operación de cada

instrucción y se ubican en la columna de direcciones, creándose una tabla que contiene to-das las etiquetas que denoten posiciones de memoria.

• Paso II: En el segundo paso se examina cada instrucción nuevamente, esta vez se traduce cada códi-

go de operación al valor hexadecimal que representa la operación en lenguaje de máquina, y el mnemónico se sustituye por el código de máquina equivalente. Esta información se co-loca en la columna de código objeto. Si una instrucción es de dos bytes o más, y el operan-do está definido en forma simbólica, se examina la tabla de símbolos creada en el primer paso para asignar el código hexadecimal correspondiente al operando simbólico.

En las figuras 7.19 y 7.20 se muestran los resultados de realizar cada paso con el programa ejemplo. Línea Dirección Nemónico Código Objeto Longitud (Bytes) 1 0000 LXI H,1000H 3 2 0003 MVI B,17 2 3 0005 LAZO: DCR B 1 4 0006 JZ SALIR 3 5 0009 BIT01: IN 02H 2 6 000B ANI 01 2 7 000D JZ BIT01 3 8 0010 IN 00H 2 9 0012 CPI ‘0’ 2 10 0014 JM INVAL 3 11 0017 CPI ‘9’+1 2 12 0019 JM VALI 3 13 001C CPI ‘A’ 2 14 001E JM INVAL 3 15 0021 CPI ‘F’+1 2 16 0023 JP INV 3 17 0026 VALI: MOV M,A 1 18 0027 INX H 1 29 0028 JMP BIT10 3 20 002B INVAL: OUT 01H 2 21 002D BIT10: IN 02 2 22 002F ANI 01 2 23 0031 JNZ BIT10 3 24 0034 JMP LAZO 3 25 0037 SALIR: HLT 1 TABLA DE SIMBOLOS: LAZO 0005 BIT01 0009 VALI 0026 INVAL 002B BIT10 002D SALIR 0037 Fig.7.19 Resultado del proceso de ensamblaje a mano. Paso I.

Page 356: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

337

Línea Dirección Nemónico Código Objeto Longitud (Bytes) 1 0000 LXI H,1000H 210010 3 2 0003 MVI B,17 0611 2 3 0005 LAZO: DCR B 05 1 4 0006 JZ SALIR CA3700 3 5 0009 BIT01: IN 02H DB02 2 6 000B ANI 01 E601 2 7 000D JZ BIT01 CA0900 3 8 0010 IN 00H DB00 2 9 0012 CPI ‘0’ FE30 2 10 0014 JM INVAL FA2B00 3 11 0017 CPI ‘9’+1 FE3A 2 12 0019 JM VALI FA2600 3 13 001C CPI ‘A’ FE41 2 14 001E JM INVAL FA2B00 3 15 0021 CPI ‘F’+1 FE47 2 16 0023 JP INV F22B00 3 17 0026 VALI: MOV M,A 77 1 18 0027 INX H 23 1 29 0028 JMP BIT10 C32D00 3 20 002B INVAL: OUT 01H D301 2 21 002D BIT10: IN 02 DB02 2 22 002F ANI 01 E601 2 23 0031 JNZ BIT10 C22D00 3 24 0034 JMP LAZO C30500 3 25 0037 SALIR: HLT 76 1 TABLA DE SIMBOLOS: LAZO 0005 BIT01 0009 VALI 0026 INVAL 002B BIT10 002D SALIR 0037 Fig.7.20 Resultado del proceso de ensamblaje a mano. Paso II.

Page 357: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

338

La figura 7.21 muestra el resultado de ensamblar el programa del ejemplo 7.6, usando el programa ensamblador ASM80 de INTEL, ejecutable en ambiente MSDOS. ASM80 EJEM76.SRC ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1 LOC OBJ LINE SOURCE STATEMENT 0000 210010 1 LXI H,1000H 0003 0611 2 MVI B,17 0005 05 3 LAZO: DCR B 0006 CA3700 4 JZ SALIR 0009 DB02 5 BIT01: IN 02H 000B E601 6 ANI 01H 000D CA0900 7 JZ BIT01 0010 DB00 8 IN 00H 0012 FE30 9 CPI '0' 0014 FA2B00 10 JM INVAL 0017 FE3A 11 CPI '9'+1 0019 FA2600 12 JM VALI 001C FE41 13 CPI 'A' 001E FA2B00 14 JM INVAL 0021 FE47 15 CPI 'F'+1 0023 F22B00 16 JP INVAL 0026 77 17 VALI: MOV M,A 0027 23 18 INX H 0028 C32D00 19 JMP BIT10 002B D301 20 INVAL: OUT 01H 002D DB02 21 BIT10: IN 02H 002F E601 22 ANI 01H 0031 C22D00 23 JNZ BIT10 0034 C30500 24 JMP LAZO 0037 76 25 SALIR: HLT END PUBLIC SYMBOLS EXTERNAL SYMBOLS USER SYMBOLS BIT01 A 0009 BIT10 A 002D INVAL A 002B LAZO A 0005 SALIR A 0037 VALI A 0026 ASSEMBLY COMPLETE, NO ERRORS Fig. 7.21. Salida del macro ensamblador ASM80/85

Page 358: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

339

En la figura 7.22 se presenta la salida del ensamblador ASM85, incorporado en el programa SID85. Este ofrece la mayoría de las funciones realizadas por ensam-bladores comerciales. Observe la generación automática de una lista de referencia cruzada.

1 0000 21 00 10 LXI H,1000H 2 0003 06 11 MVI B,17 3 0005 05 LAZO: DCR B 4 0006 CA 39 00 JZ SALIR 5 0009 DB 02 BIT01: IN 02H 6 000B E6 01 ANI 01H 7 000D CA 09 00 JZ BIT01 8 0010 DB 00 IN 00H 9 0012 FE 30 CPI 30H 10 0014 FA 2C 00 JM INVAL 11 0017 FE 40 CPI 3AH 12 0019 FA 27 00 JM VALI 13 001C FE 41 CPI 41H 14 001E FA 2C 00 JM INVAL 15 0021 FE 47 CPI 47H 16 0023 F2 2C 00 JP INVAL 17 0026 77 VALI: MOV M,A 18 0027 23 INX H 19 0028 C3 2F 00 JMP BIT10 20 002B D3 01 INVAL: OUT 01H 21 002D DB 02 BIT10: IN 02H 22 002F E6 01 ANI 01H 23 0031 C2 2F 00 JNZ BIT10 24 0034C3 05 00 JMP LAZO 25 0037 76 SALIR: HLT Etiquetas Definidas =================== LAZO 0005 SALIR 0037 BIT01 0009 INVAL 002B VALI 0026 BIT10 002D Referencia Cruzada ================== LAZO #3 24 SALIR 4 #25 BIT01 #5 7 INVAL 10 14 16 #20 VALI 12 #17

Fig.7.22. Salida del ensamblador cruzado del programa SID85. El procedimiento de ensamblaje manual realizado, no es más que un ejercicio didáctico. Para el desarrollo de los programas asignados en el curso se debe usar un programa ensamblador comercial. Todos los programas simuladores suministrados a los estudiantes tienen un ensamblador el cual compila y carga en memoria el archivo binario. También la herramienta MICROIDE tiene un ensamblador (ASM85). Estos

Page 359: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

340

ensambladores en general son de desempeño limitado y no permiten el uso de macros ni generan código relocalizable. Entre los programas de trabajo del curso se encuentra el paquete ISISII de INTEL, el cual incluye el ensamblador ASM80 y el enlazador LINK80. Otro recurso al alcance del estudiante de sistemas de microprocesadores es el software distribuido por la empresa AVOCET y dirigido al desarrollo de programas para el 8085A. Este conjunto de programas incluye un ensamblador (AVMAC85) con capacidad para procesar macros, un enlazador/relocalizador (AVLINK) y otros pro-gramas asociados. Directivas generales del ensamblador

El ensamblador reconoce un grupo de órdenes de ensamblaje que no pertene-cen al conjunto de instrucciones del procesador y que no generan código de máquina. Estas se denominan pseudos-instrucciones y pueden usarse para controlar el proceso de ensamblaje, reservar áreas de memoria, almacenar datos y resultados, ignorar o ensamblar líneas de código, definir variables de trabajo y fijar las direcciones de ini-cio y final del código generado por el ensamblador. Las directivas reconocidas por el ensamblador son:

Tabla. 7.7 Directivas de control de ensamblaje. ORG Define la dirección de inicio del programa o de un área de datos. END Señala el final de un programa en lenguaje ensamblador. EQU Define constantes numéricas. SET Asigna un valor numérico a un símbolo. IF Inicio de ensamblaje condicional. ENDIF Fin de ensamblaje condicional. DB Define bytes de datos. DW Define palabra de datos. DS Reserva áreas de memoria para almacenamiento de datos. Las directivas se ubican en el campo de operación, pudiendo ser precedidas

por una etiqueta y/o seguidas por un comentario. Todas las pseudos-operaciones re-quieren un argumento, exceptuando a END y ENDIF.

ORG

Fija el inicio de las direcciones absolutas del programa o área de datos, al po-ner el contador de posiciones LC al valor especificado por el operando expresión. Tiene la forma:

etiqueta: ORG expresión ;comentario Los campos de etiqueta y comentario son opcionales. Expresión es un valor

de 16 bits, o una expresión que al ser evaluada produce un valor de 16 bits (una di-rección). Un programa puede tener varias declaraciones ORG si se requiere ensam-blar secciones del programa en direcciones diferentes. Si se usa una expresión en lu-

Page 360: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

341

gar de un valor absoluto, en el campo de expresión, la etiqueta usada debe ser defini-da en líneas anteriores. Si no existe una directiva ORG antes de la primera instrucción del programa, éste se ensamblará con inicio en la dirección 0000H.

END

Señala el punto de culminación del programa y que el proceso de ensamblaje debe detenerse. Sólo debe existir una directiva END y debe estar al final del texto del programa.

El formato de esta directiva es: etiqueta: END Un ejemplo del uso conjunto de las instrucciones ORG y END es el siguiente:

ORG 0500H ; inicio del programa . . . . ORG 1000H ; área de datos . . . END

EQU

Sirve para facilitar la lectura del programa. Esta directiva asigna un valor nu-mérico a un nombre. Tiene la forma:

nombre: EQU expresión El valor de expresión es asignado al nombre especificado en el campo de eti-

queta. Por ejemplo, si el valor de inicio de un área de datos es 2000H. La asignación: DIRDAT EQU 2000H

permite a cualquier instrucción hacer referencia al comienzo del bloque de datos, usando el nombre DIRDAT. En consecuencia las instrucciones siguientes, son equiva-lentes:

LXI H, 2000H LXI H, DIRDAT

Page 361: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

342

El valor asignado a un símbolo por una directiva EQU no puede ser cambiado por otra declaración EQU. Algunos ensambladores no requieren los dos puntos al final de la etiqueta. SET

Es idéntica a la directiva EQU, exceptuando el hecho que una asignación SET posterior puede cambiar el valor de nombre. De modo que el valor de un identifica-dor fijado por una asignación EQU es válido para todo el programa, mientras que el definido por un comando SET es válido hasta la próxima directiva SET que contenga el nombre.

IF y ENDIF

Permiten incluir o excluir partes de un programa durante el proceso de ensam-blaje. El formato de esta directiva es:

etiqueta: IF expresión instrucción 1 instrucción 2 . . . instrucción n ELSE . . . ENDIF

El programa ensamblador evalúa la expresión que acompaña a la declaración

IF, y si el bit 0 del resultado es un valor lógico uno (evaluado como 0FFFFH), las instrucciones entre la directiva IF y el próximo ELSE o ENDIF son ensambladas, en este caso las instrucciones de la 1 a la n. Si el resultado es cero (0H) las n instruccio-nes son ignoradas.

Toda declaración IF debe estar asociada a un ENDIF. La directiva ELSE es opcional y solo una puede aparecer en un bloque IF-ENDIF. Si existe ELSE, cuando la prueba de IF resulte cero las declaraciones entre ELSE y ENDIF se ensamblaran; si el bit 0 es uno lógico, serán ignoradas.

Los bloques de código acotados por directivas IF-ENDIF se usan con frecuen-cia en la fase de prueba y depuración de programas. Suponga que se tiene un progra-ma que contiene un lazo cuya ejecución es controlada por un valor desconocido car-gado desde un puerto de entrada en la posición de memoria MEM. Se desea saber

Page 362: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

343

cuantas veces se repite en lazo en algún momento. La rutina mostrada a continuación puede usarse con ese propósito.

SI EQU -1 NO EQU 0 PRUEBA EQU SI MEM EQU 2000H LHLD MEM LXI B,0 LAZO: DCX H IF PRUEBA INX B ENDIF JNZ LAZO END

Al final de la ejecución del programa el registro par BC contendrá el número de veces que el lazo se repite. El código objeto resultado de ensamblar la rutina es el siguiente,

ASM80 IF.SRC ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1 LOC OBJ LINE SOURCE STATEMENT FFFF 1 SI EQU -1 0000 2 NO EQU 0 FFFF 3 PRUEBA EQU SI 2000 4 MEM EQU 2000H 5 0000 2A0020 6 LHLD MEM 0003 010000 7 LXI B,0 0006 2B 8 LAZO: DCX H 9 IF PRUEBA 0007 03 10 INX B 11 ENDIF 0008 C20600 12 JNZ LAZO 13 END PUBLIC SYMBOLS EXTERNAL SYMBOLS USER SYMBOLS LAZO A 0006 MEM A 2000 NO A 0000 PRUEBA A FFFF SI A FFFF ASSEMBLY COMPLETE, NO ERRORS

Observe que la directiva EQU ubicada en la línea 3 se usa para asignar al sím-

bolo PRUEBA el valor 0FFFFH. La evaluación del bit 0 de prueba produce uno lógi-co, ensamblándose la instrucción INX B, dentro del bloque IF-ENDIF. Una vez que el programa ha sido depurado simplemente se le fija el valor NO al identificador

Page 363: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

344

PRUEBA. Cuando se ensambla de nuevo la rutina, no se ensambla el código respon-sable de registrar el número de veces que se ejecuta el lazo. Esto, debido a que el va-lor de PRUEBA es 0 (NO).

ASM80 IF.SRC ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1 LOC OBJ LINE SOURCE STATEMENT FFFF 1 SI EQU -1 0000 2 NO EQU 0 0000 3 PRUEBA EQU NO 2000 4 MEM EQU 2000H 5 0000 2A0020 6 LHLD MEM 0003 010000 7 LXI B,0 0006 2B 8 LAZO: DCX H 9 IF PRUEBA 10 INX B 11 ENDIF 0007 C20600 12 JNZ LAZO 13 END PUBLIC SYMBOL EXTERNAL SYMBOLS USER SYMBOLS LAZO A 0006 MEM A 2000 NO A 0000 PRUEBA A 0000 SI A FFFF ASSEMBLY COMPLETE, NO ERRORS

La utilidad del uso del ensamblaje condicional en la fase de desarrollo del

software de una aplicación se hace patente cuando se diseña una tarjeta de control con la opción de seleccionar, entre varias opciones, los sensores de entrada y los actuado-res de salida. En este caso el programa de aplicación, incluyendo el bloque de código del programa que realiza el algoritmo de control, es el mismo para cualquiera de las posibilidades. La diferencia estará en el código de los sensores y actuadores. Si exis-ten 3 tipos de sensores y 4 de actuadores, será necesario escribir 12 programas para cubrir todas las opciones. El uso bloques IF-ENDIF permite la escritura de un solo programa, con todas las rutinas de entrada y salida sujetas a ensamblaje condicional. Cuando deba programarse una tarjeta particular se selecciona las rutinas correspon-dientes al sensor y al actuador elegido por el usuario.

DB

La directiva DB (Definición de byte) carga una serie de posiciones consecuti-

vas de memoria con valores de ocho bits. Se escribe como: etiqueta DB lista de expresiones o cadenas de caracteres

Page 364: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

345

El campo etiqueta es opcional, si existe se le asigna el valor del contador de posiciones, y en esa dirección se almacena el primer byte especificado por la directiva DB. Los símbolos en expresión deben definirse previamente. La lista puede incluir hasta 8 elementos separados por comas. Para facilitar la lectura de la lista pueden usarse varias declaraciones DB. Algunos ejemplos se muestran a continuación,

Código objeto LISTA: DB 1, 0C5H, 1000B 01C508 LISTA: DB 1 01C508 DB 0C5H DB 1000B MEM: DB ‘R.A.M’ 522E412E4D MULT: DB 2*8,4*8 1020 Observe en la figura 7.23 la forma en la cual se almacena la cadena ‘R.A.M’

en memoria: Dirección Contenido

MEM

01010010

52

R

MEM+1

00101110

2E

.

MEM+2

01000001

41

A

MEM+3

00101110

2E

.

MEM+4

01001101

4D

M

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

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

almacena valores de 16 bits de la lista de expresiones como direcciones de memoria. etiqueta DW lista de expresiónes o cadenas de caracteres Si la evaluación de una expresión resulta en un número de ocho bits, este re-

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

Page 365: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

346

Código objeto DIR: DW POS1 6420 TEMP: DW 0DH 0D00 ABCD: DW ‘AB’,’C’ 42414300 Si el contador de posiciones es igual a 0300H cuando se alcanza el símbolo

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

Dirección Contenido

DIR:

0300H

01100100

64H

301H

00100000

20H

TEMP:

0302H

00001101

0DH

0303H

00101110

00H

ABC:

0304H

01000010

42H

0305H

01000001

41H

0306H

01000011

43H

0307H

00000000

00H

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

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

miento de datos generados por el programa. La sintaxis de DS es: etiqueta DS expresión El ensamblador evalúa la expresión y reserva el número de bytes de memoria

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

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

Page 366: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

347

Los comandos anteriores son algunas directivas generales del ensamblador.

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

Ejemplo 7.7

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

ORG 0200H ; Inicio del programa. NUM EQU 010H ; Número de elementos de la tabla. MENOR: LXI H,TABLA ;Cargar dirección de inicio de la tabla HL. MVI B,NUM ;Cargar contador de números. MOV A,M ;Mover al acumulador el primer número. LAZO1: INX H ;Apuntar al próximo elemento en la tabla. DCR B ;Decrementar contador de elementos de la lista. JZ MENOR ;Si (B)=0, el mínimo está en el acumulador. ;Almacenarlo en memoria y buscar el mayor. CMP M ;Comparar un valor con el posible mínimo ;cargado en el acumulador. JC LAZO1 ;Si elemento es mayor, comparar con el ;próximo. MOV A,M ;Si es menor, es el nuevo mínimo. Cargar en A. JMP LAZO1 ;Comparar el nuevo mínimo con el siguiente valor. MENOR: STA MIN ;Almacenar el valor mínimo de la tabla. LXI H,TABLA ;Al inicio de la tabla en búsqueda del mayor. MOV A,M ;Primer valor al acumulador. MVI B,NUM ;Inicializar contador de elementos. LAZO2: INX H ;Apuntar a próximo valor. DCR B ;Decrementar contador. JZ MAYOR ;Si (B)=0, almacenar máximo en memoria y salir. CMP M ;Comparar elemento de la tabla con el potencial ;máximo depositado en el acumulador. JNC LAZO2 ;Si valor en la tabla es menor, comparar con el ;siguiente. MOV A,M ;Si es mayor, sustituir el anterior JMP LAZO2 ;Comparar nuevo máximo con próximo en la tabla. MAYOR: STA MAX ;Almacenar en memoria el máximo. HLT ;Parar. ORG 0300H ;Inicio del área de datos MIN: DS 1 ; Posición para almacenar el mínimo. MAX: DS 1 ; Posición para almacenar el máximo. TABLA: DB 64H,45,23Q,60H,90H,3H,24H,15H DB 20H,15,34H,80H,50H,2H,101011B,30 END

Page 367: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

348

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

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

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

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

ción.

ASM80 EJEM2.SRC ISIS-II 8080/8085A MACRO ASSEMBLER, V4.1 MODULE PAGE 1 LOC OBJ LINE SOURCE STATEMENT 0200 1 ORG 0200H 0010 2 NUM EQU 010H 3 0200 210203 4 LXI H,TABLA 0203 0610 5 MVI B,NUM 0205 7E 6 MOV A,M 0206 23 7 LAZO1: INX H 0207 05 8 DCR B 0208 CA1302 9 JZ MENOR 020B BE 10 CMP M 020C DA0602 11 JC LAZO1 020F 7E 12 MOV A,M 0210 C30602 13 JMP LAZO1 0213 320003 14 MENOR: STA MIN 0216 210203 15 LXI H,TABLA 0219 7E 16 MOV A,M 021A 0610 17 MVI B,NUM 021C 23 18 LAZO2: INX H 021D 05 19 DCR B 021E CA2902 20 JZ MAYOR 0221 BE 21 CMP M 0222 D21C02 22 JNC LAZO2 0225 7E 23 MOV A,M 0226 C31C02 24 JMP LAZO2 0229 320103 25 MAYOR: STA MAX 022C 76 26 HLT 27 0300 28 ORG 0300H 29 0300 30 MIN: DS 1

Page 368: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

349

0301 31 MAX: DS 1 0302 64 32 TABLA: DB 64H,45,23Q,60H,90H,3H,24H,15H 0303 2D 0304 13 0305 60 0306 90 0307 03 0308 24 0309 15 33 030A 20 34 DB 20H,15,34H,80H,50H,2H,101011B,30 030B 0F 030C 34 030D 80 030E 50 030F 02 0310 2B 0311 1E 35 36 END PUBLIC SYMBOLS EXTERNAL SYMBOLS ISIS-II 8080/8085A MACRO ASSEMBLER, V4.1 MODULE PAGE 2 USER SYMBOLS LAZO1 A 0206 LAZO2 A 021C MAX A 0301 MENOR A 0213 MIN A 0300 NUM A 0010 MAYOR A 0229 TABLA A 0302 ASSEMBLY COMPLETE, NO ERRORS

Para cargar los elementos de la tabla se usan dos directivas DB. Observe que

el ensamblador carga los datos a partir de la dirección 0300H seleccionada por la se-gunda directiva ORG en la línea 28.

Directivas generales para relocalización de código

Todo lo expuesto en páginas anteriores sobre la sintaxis del lenguaje ensam-blador para el 8085A es válido para un gran número de las versiones disponibles del traductor y ofrecidas por segundas fuentes. Esto significa que un programa escrito para ser traducido por el ASM80 de INTEL puede ser usado como entrada de otro en-

Page 369: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

350

samblador realizando pequeñas modificaciones al código fuente. Por ejemplo, algu-nos programas ensambladores en lugar de usar la nomenclatura: 02BH para represen-tar el número 4310 en hexadecimal, utilizan: 0x02B, H02B, o simplemente 02B. Co-mo otro ejemplo, los símbolos %IF y %ENDIF sustituyen a las directivas IF y EN-DIF.

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

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

C:\avmac85 prueba Como resultado se obtienen dos archivos: prueba.obj archivo objeto prueba.prn. archivo de listado Aunque el programa fuente conste de un módulo de entrada único y sólo con-

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

C:\avlink nombre=prueba.obj

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

bre.hex.

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

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

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

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

calización del código.

Page 370: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

351

Fig.7.25. Pantalla de ayuda del programa AVLINK.

Tabla. 7.8. Directivas para relocalización de código. DEFSEG Asigna el nombre de un segmento. SEG Activa el segmento. PUBLIC Define un símbolo público. EXTERN Define un símbolo externo. El código es ensamblado y enlazado para ejecutarse en direcciones lógicas. El

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

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

ción de segmentos.

DEFSEG

La sintaxis de esta directiva es, DEFSEG nombre , atributos Define un segmento de usuario denominado nombre. Si no se especifican atri-

butos, el segmento es relocalizable y de clase CODE. El punto de carga del nuevo

Page 371: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

352

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

DEFSEG define el segmento pero no lo activa. Aunque los atributos son de-

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

START= expresión Asigna la dirección lógica de inicio del segmento. Si éste es absoluto, actúa como una direc-tiva ORG. En caso contrario, START indica al enlazador la dirección de origen del segmento relocalizable. Este atributo se usa para aquellos segmentos reubicables que solo pueden ser cargados en direcciones determinadas. Puede ser usado para indicar que el código debe car-garse en EPROM o EEPROM y que los resultados deben almacenarse en la zona de RWM. La información de START es usada por el enlazador/relocalizador y puede ser modificada en el momento del enlace, como se observa en las opciones del AVLINK en la figura 7.28. ALIGN= valor Fija el alineamiento del segmento. Cuando el segmento es enlazado por AVLINK, el atributo START= es ajustado para que se inicie en valor, donde éste debe ser una potencia de dos. Si valor no es potencia de dos, el alineamiento ocurre en la dirección representada por la poten-cia de dos inmediatamente inferior a valor. CLASS= clase Es opcional y asigna el nombre de la clase del segmento. Si el atributo CLASS es omitido, la clase CODE se fija por defecto. Las clases válidas son: CODE Ubica al segmento en la clase CODE. Este es un segmento relocalizable de memoria. DATA Coloca al segmento en la clase DATA. Este es un segmento relocalizable de memoria IOSPACE Pone al segmento en la clase IOSPACE. Este es un segmento relocalizable del espacio

de entrada/salida del procesador. Debido a que los chips microcontroladores tienen una arquitectura con área determinadas de memoria interna, las clases son vitales para especificar la clase de espacio de memoria donde residirá el segmento. En el caso del AVMAC85, éste no parece distinguir entre las clases CODE y DATA, en el sentido que no agrupa segmentos de la misma clase. El ensamblador si diferencia los segmentos de memoria 'M' (CODE y DATA) de aquellos de entrada/salida 'I' (IOSPACE). Esta discriminación hace posible definir segmentos M e I en el mismo rango de direcciones, debido a que corresponden a posiciones lógicas pertenecientes a espacios distin-tos. Aunque en la figura 7.28 se indica que existen opciones de AVLINK para fijar la direc-ción de inicio y final de los segmentos pertenecientes a una clase, las pruebas realizadas no tuvieron éxito. ABSOLUTE Establece que el segmento es absoluto. Asignar este atributo hace posible el uso de ORG di-rección en el cuerpo del segmento, recuerde que si no declara atributos al definir un segmen-to, éste será relocalizable por defecto y el uso de la directiva ORG causará la emisión de un

Page 372: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

353

mensaje de error. El comando ORG dirección puede utilizarse en un segmento relocalizable pero únicamente si éste tiene el atributo START= y pertenece por entero a un módulo. OVERLAID Este atributo sólo puede ser usado para segmentos del mismo nombre en más de un módulo. Si el segmento tiene START=, la condición OVERLAID permite el uso de la directiva gene-ral ORG dirección, aunque el segmento resida en varios módulos. Además el atributo indica que secciones del programa con el mismo nombre pueden ocupar direcciones que se solapan en el espacio de direcciones lógicas aunque permanecen en direcciones físicas diferentes. Esto permite el uso de bancos de memoria conmutados durante la ejecución. BLOCK= expresión Fija el valor máximo permitido para el segmento. Si esta restricción es violada, AVLINK ge-nera un mensaje de error. Ejemplos:

DEFSEG PROG, CLASS=CODE, START=0

DEFSEG LAB, BLOCK=8000h, CLASS=CODE DEFSEG ABS, ABSOLUTE, START=40H

DEFSEG SOLP, OVERLAID

DEFSEG DATO, ALIGN=80H

SEG

Activa el segmento llamado nombre definido previamente con la directiva DEFSEG. Su sintaxis tiene la forma,

SEG nombre

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

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

Ejemplos:

DEFSEG PROG, CLASS=CODE, START=0 SEG PROG lxi sp,stack xra a . . .

Page 373: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

354

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

SEG DATA DB 1,2,3,4,5,6,7,8 DEFSEG ABS, ABSOLUTE SEG ABS ORG 300H DB 'UDO 2003' ORG 500H DB 'Prueba final'

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

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

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

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

PUBLIC

Declara que el operando etiqueta tiene un alcance publico. Puede especificarse más de una etiqueta, en cuyo caso deben separarse por comas.

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

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

EXTERN

Especifica que el operando etiqueta tiene un alcance externo. Puede especifi-carse varias etiquetas separadas por comas.

EXTERN etiqueta

Page 374: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

355

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

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

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

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

PROC. nombre PROC ; inicio procedimiento nombre Considere que los siguientes procedimientos pertenecen a un mismo progra-

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

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

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

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

(A) = 'M' (HL) (C) • (E) (A) ≠ 'M' (H) (C) ÷ (E) (L) residuo

Page 375: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

356

Las operaciones aritméticas se realizan con operandos de 8 bits y deben usarse procedimientos para cada una. La multiplicación se hará por sumas sucesivas y la división por restas sucesivas.

stack: equ 07ffh lxi sp,stack cpi 'M' ; Compare A con ASCII M jnz salto ; Si igual, multiplique call mul hlt salto: call div ; Si no igual, divida hlt ; Multiplicación por sumas sucesivas (HL) (C)*(E) mul PROC lxi h,0 ;Resultado cero al inicio mov b,h ;Operando de 8 bits, B a cero ..salto: dad b ;HL = HL + BC dcr e jnz ..salto ;Repetir las veces que indique el multiplicador ret mul ENDPROC ; División por restas sucesivas (H) (C)/(E) (L) residuo div PROC mvi h,0 mov a,c ..salto: sub e cmp e inr h jnc ..salto mov l,a ret div ENDPROC END El programa supone que los operandos son cargados en los registros B (multi-

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

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

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

Page 376: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

357

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

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

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

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

Estas salidas siguen el valor de las entradas hasta que el flanco negativo de

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

OC

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

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

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

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

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

chivos particulares. Estos son: PRPAL.ASM: Programa principal. ENTSAL.ASM: Rutina de manejo de datos y resultados ADAT.ASM: Rutina de adquisición de datos. RAIZ.ASM: Extrae la raíz cuadrada entera de un número de dos bytes. DIV1616.ASM: Código usado por RAIZ.

Page 377: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

358

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

Fig.7.27. Diagrama estructurado del programa del ejemplo 7.8

Page 378: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

359

Fig. 7.28 Salidas de la simulación con ORCAD/PSPICE para el circuito de la figura 7.26.

Page 379: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

360

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

El código fuente de cada módulo del programa se presenta a continuación: $title(Procesamiento de tabla de valores) $subtitle(Cálculo de raiz cuadrada) ;Modulo de programa principal public p8,pb9,tabl,sqrt,temp1 extern entsal ;--------------------------------------------------------------------------------------------------------------------------------- i_stack equ 08F0H ; Inicio de la pila i_rwm equ 0800H ; Dirección de inicio de RWM ndatos equ 10H ; número de datos de entrada ;---------------------------------------------------------------------------------------------------------------------------------; Definición de segmentos defseg puertos,start=8, class=iospace ; Dirección de puertos de entrada defseg stack, start=i_stack ; La pila reside en la RWM defseg datos, class=data, start=i_rwm ; 256 bytes de RWM a partir de 0800H defseg progr, class=code, start=0 ; 2k de EPROM desde 0000H ;---------------------------------------------------------------------------------------------------------------------------------; Puertos de entrada del sistema seg puertos p8 ds 1 p9 ds 1 ;---------------------------------------------------------------------------------------------------------------------------------; Los 16 bytes últimos de RWM soportan el stack. seg stack ds 10H ;---------------------------------------------------------------------------------------------------------------------------------t_stack:equ $-1 ; Base de la pila ; Segmento de datos en RWM seg datos tabl ds 10H sqrt ds 10H temp1 ds 2 ;---------------------------------------------------------------------------------------------------------------------------------; Segmento de código en EPROM seg progr lxi sp,t_stack ;Se carga el apuntador de pila mvi b,ndatos ;Contador de valores de entrada lxi h,tabl ;Dirección del elemento 1 de la tabla de valores call entsal ;Se inicia proceso hlt ;Fin de programa end ;---------------------------------------------------------------------------------------------------------------------------------

Page 380: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

361

$title(Entrada de datos y salida de resultados) ;Modulo ENTSAL public entsal,noper extern adat,raiz,tabl,sqrt noper equ 8 ;Son 8 números de 2 bytes defseg progr seg progr entsal: call adat ;Obtiene los 16 valores desde el puerto 8 mvi a,noper ;Contador de números de 16 bits lxi b,sqrt ;Dirección de los resultados en BC lxi h,tabl ;Dirección de los datos en HL prox: push psw mov e,m inx h mov d,m push h push d xchg push b call raiz ;Se extrae la raíz del contenido de HL mov a,e ;resultado en DE pop b stax b ;Se almacena byte bajo del resultado. inr c mov a,d stax b ;Se almacena byte alto del resultado inr c ;BC apunta al número siguiente pop d pop h pop psw dcr a inx h ;Apunta a próximo dato jnz prox ;Terminar si se procesaron todos los valores. ret end ;--------------------------------------------------------------------------- ; Los datos desde el puerto se cargan en memoria en posiciones ; consecutivas y representan 8 valores de 16 ;bits. ; Datos de entrada: Puerto 08 ; Bit de control: Línea 7 del puerto 09 ;--------------------------------------------------------------------------- $title(adquisición de datos) ;Modulo ADAT public adat extern p8,p9 defseg adatos seg adatos adat: in p9 ani 80H jz adat in p8 mov m,a inx h dcr b jnz adat ret end

Page 381: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

362

$title(Cálculo de raìz cuadrada) ;Modulo RAIZ public raiz extern div1616,temp1 defseg progr

seg progr raiz: shld temp1 mov a,h rrc mov a,l rar mov c,a rep: lhld temp1 xchg call div1616 mov h,b mov l,c dad d inx h

mov a,h rar mov d,a mov a,l rar mov e,a mov a,b cmp d jnz cont mov a,c cmp e rz cont: mov b,d

mov c,e jmp rep end

$title(División entera 16x16) ;Modulo DIV1616 public div1616 defseg progr seg progr div1616: mvi a,10H lxi h,0 div161: xchg dad h xchg jnc yyy dad h inr l jmp www yyy: dad h www: inr e push psw mov a,l sbb c mov l,a mov a,h sbb b mov h,a jnc div162 dcr e dad b div162: pop psw dcr a jnz div161 ret end

Para generar el archivo ejecutable denominado ejem78.hex, se ejecuta la si-guiente secuencia de comandos:

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

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

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

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

Page 382: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

363

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

1 public entsal,noper 2 extern adat,raiz,tabl,sqrt 3 =0008 4 noper equ 8 ;Son 8 números de 2 bytes 5 6 defseg progr 7 seg progr 8 0000& CD 0000* 9 entsal: call adat ;Obtiene los 16 valores desde el puerto 8 0003& 3E 08 10 mvi a,noper ;Contador de números de 16 bits 0005& 01 0000* 11 lxi b,sqrt ;Dirección de los resultados en BC

0008& 21 0000* 12 lxi h,tabl ;Dirección de los datos en HL 000B& F5 13 prox: push psw 000C& 5E 14 mov e,m 000D& 23 15 inx h 000E& 56 16 mov d,m 000F& E5 17 push h 0010& D5 18 push d 0011& EB 19 xchg 0012& C5 20 push b 0013& CD 0000* 21 call raiz ;Se extrae la ramz del contenido de HL 0016& 7B 22 mov a,e ;resultado en DE 0017& C1 23 pop b

0018& 02 24 stax b ;Se almacena byte bajo del resultado. 0019& 0C 25 inr c 001A& 7A 26 mov a,d 001B& 02 27 stax b ;Se almacena byte alto del resultado 001C& 0C 28 inr c ;BC apunta al nzmero siguiente 001D& D1 29 pop d 001E& E1 30 pop h 001F& F1 31 pop psw 0020& 3D 32 dcr a 0021& 23 33 inx h ;Apunta a prsximo dato 0022& C2 000B& 34 jnz prox ;Terminar si se procesaron todos los valores. 0025& C9 35 ret 36 end

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

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

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

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

Page 383: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

364

AVLINK ---- LOAD MAP For: Avocet 8085/Z80 Assembler v2.02, #01235 RELOCATED SEGMENTS - CLASS 'I' SEGMENT NAME START STOP LENGTH ovl/cat def/undef PUERTOS 0008 0009 0002 Concat Defined RELOCATED SEGMENTS - CLASS 'M' SEGMENT NAME START STOP LENGTH ovl/cat def/undef PROGR 0000 007b 007c Concat Defined ADATOS 007c 008b 0010 Concat Defined DATOS 0800 0821 0022 Concat Defined STACK 08f0 08ff 0010 Concat Defined ZERO LENGTH SEGMENTS SEGMENT START CODE 0000 DATA 0000 IOSPACE 0000 SYMBOLS -- CLASS 'I' SYMBOL NAME START SYMBOL'S SEGMENT def/undef P8 0008 PUERTOS Defined P9 0009 PUERTOS Defined SYMBOLS -- CLASS 'M' SYMBOL NAME START SYMBOL'S SEGMENT def/undef ENTSAL 000c PROGR Defined RAIZ 0032 PROGR Defined DIV1616 0058 PROGR Defined ADAT 007c ADATOS Defined TABL 0800 DATOS Defined SQRT 0810 DATOS Defined TEMP1 0820 DATOS Defined SYMBOLS -- CLASS 'N' SYMBOL NAME START SYMBOL'S SEGMENT def/undef NOPER 0008 ABSOLUTE Defined No Transfer Address. MODULE DATA -------- MODULE: prpal NUMBER OF SEGMENTS: 7 SEGMENT NAME OFFSET STOP LENGTH CODE 0000 0000 0000 DATA 0000 0000 0000 IOSPACE 0000 0000 0000 PUERTOS 0000 0001 0002 STACK 0000 000f 0010 DATOS 0000 0021 0022 PROGR 0000 000b 000c MODULE: entsal NUMBER OF SEGMENTS: 4 SEGMENT NAME OFFSET STOP LENGTH CODE 0000 0000 0000 DATA 0000 0000 0000 IOSPACE 0000 0000 0000 PROGR 000c 0031 0026

Page 384: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

365

MODULE: adat NUMBER OF SEGMENTS: 4 SEGMENT NAME OFFSET STOP LENGTH CODE 0000 0000 0000 DATA 0000 0000 0000 IOSPACE 0000 0000 0000 ADATOS 0000 000f 0010 MODULE: raiz NUMBER OF SEGMENTS: 4 SEGMENT NAME OFFSET STOP LENGTH CODE 0000 0000 0000 DATA 0000 0000 0000 IOSPACE 0000 0000 0000 PROGR 0032 0057 0026 MODULE: div1616 NUMBER OF SEGMENTS: 4 SEGMENT NAME OFFSET STOP LENGTH CODE 0000 0000 0000 DATA 0000 0000 0000 IOSPACE 0000 0000 0000 PROGR 0058 007b 0024

7.4 HERRAMIENTAS PARA DESARROLLO DE PROGRAMAS La realización de un proyecto de una aplicación basada en μPs transciende el simple uso de un ensamblador. En el diseño de sistemas de cierta envergadura es casi obligatoria la presencia de un sistema de desarrollo, el cual por su costo elevado rara vez está a la disposición de quienes asisten a un curso básico de sistemas de μP. Una solución común para superar este obstáculo es desarrollar el programa usando un µC de propósito general, un PC por ejemplo, dotado con las herramientas de programa-ción mínimas necesarias, estas son: editor de textos, ensamblador cruzado, enlaza-dor/relocalizador y un simulador del µP. En la figura 7.29 se muestra un diagrama de flujo de los pasos a seguir para el diseño de programas usando estos recursos. Un sistema de desarrollo y emulador profesional para el 8085A puede costar la astronómica cifra de $6000, aunque es posible adquirir sistemas de bajo costo con menos prestaciones por menos de una décima parte del precio señalado. Aunque en la actualidad pueden obtenerse en INTERNET más de veinte simuladores para el 8085A, con ejecución en plataformas Linux y Windows, la situación hace diez años era bien diferente ya que el estudiante de Sistemas de Microprocesadores no disponía de si-mulador alguno.

Para solventar este problema se desarrolló en el año 1995, el Sistema Integral de Desarrollo para el Microprocesador 8085 (SID85), realizado como tesis de grado por el Ing. César García, egresado de nuestra Universidad. El SID85 ofrece en un ambiente orientado a ventanas los siguientes recursos:

Page 385: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

366

Fig.7.29 Fases del desarrollo del programa

Page 386: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

367

• Editor de texto. • Ensamblador cruzado (ASM85). • Simulador del μP8085A (SIM85). • Conexión con el microcomputador MPR85.

El SID85 representó, sin duda alguna, un recurso de gran valor para la ense-

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

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

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

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

Fig.7.30 Presentación del SID85

Page 387: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

368

Fig.7.31 Editor del SID85

Al ensamblar el archivo ejem7_6.asm, se generan: ejem7_6.lst y ejem7_6.obj. El procedimiento para realizar la simulación, es el siguiente:

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

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

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

ejemplo 7.6.

1 Hasta 4 K en el SIM85, con posibilidad de extenderse a 64 K

Page 388: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

369

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

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

(a)

(b)

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

Page 389: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

370

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

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

Fig. 7.35 Editor de puertos del SID85

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

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

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

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

Page 390: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

371

almacenado en memoria, si es un dígito válido, o escrito al puerto 01H, en caso de no ser un caracter hexadecimal. Para la lectura de un nuevo caracter, el pulso de control debe ir primero a cero (bajada del pulso), escribiendo 00H en el puerto 02H, antes de que se registre el nuevo caracter. El proceso continúa hasta que sean escritos los 16 dígitos, y el control sea transferido al sistema.

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

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

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

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

7.4.1 Programas para simulación del microprocesador 8085

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

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

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

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

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

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

en el disco compacto entregado al inicio del curso.

Page 391: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

372

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

Micro 3 AVSIM85 (DOS) Micro85 8085 Simulator

Microprocessor 8085 Simulator MPS85-KIT SID85 (DOS) Sim8085

Simulator Vsim Win85 WSIM85 Fig. 7.36 Algunos de los simuladores en el CD de trabajo.

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

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

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

MMIICCRROO 8855

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

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

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

cargan automáticamente en memoria. Permite la ejecución del código en modo de

Page 392: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

373

corrida libre y paso a paso. El ensamblador es limitado y el programa no corre en ambientes Windows 2000, Millenium o XP.

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

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

• CPU 8085. • Memoria RAM 6264 de 8K. • Un PPI 8255. Mapa de memoria E000H-FFFFH RAM Mapa de E/S 08H – 0BH PPI8255 Interrupciones Los vectores de interrupción han sido cambiados según se indica: TRAP 0024H FFB0H RST7.5 003CH FFB3H RST6.5 0034H FFB6H

Page 393: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

374

RST5.5 002CH FFB9H INTR Ejecuta una de las RST n RST 0 0000H 0000H RST 1 0008H FFCBH RST 2 0010H FFC8H RST 3 0018H FFC5H RST 4 0020H FFC2H RST 5 0028H FFBFH RST 6 0030H FFCBH RST 7 0038H FFCEH En la figura 7.37 se observa el editor de textos y la ventana de memoria RAM.

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

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

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

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

Fig. 7.39 Puertos de Entrada y salida.

Page 394: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

375

El ensamblador no contiene todas las funciones de un programa comercial pe-ro en general, el simulador puede ser de alguna utilidad.

WWSSIIMM8855

Es quizás el más útil de todos los simuladores del 8085. Es capaz de simular el

CPU y diversos dispositivos periféricos y el ensamblador es aceptable. La versión de evaluación acepta programas hasta 256 bytes de tamaño. Desafortunadamente el ar-chivo fuente debe ser ensamblado por un programa externo. Acepta archivos en for-matos HEX y binario.

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

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

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

bancos de RAM/EPROM definiendo las direcciones de inicio y fin de cada banco. • Pueden definirse las direcciones de los puertos de los controladores de periféricos a conec-

tarse al µP. Los módulos posibles de interconectar al 8085 son:

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

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

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

Las opciones de este simulador son diversas y no pueden exponerse con deta-

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

Page 395: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

376

Fig. 7.40 Entorno gráfico de WSIM85

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

Page 396: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

377

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

Otra ventaja de esta herramienta que supera el obstáculo del uso obligado de

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

MMIICCRROO33

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

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

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

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

88008855 VViirrttuuaall KKiitt

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

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

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

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

Page 397: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

378

Fig. 7.42 Ventanas del simulador MICRO3.

Page 398: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

379

Fig. 7.43 Ventana principal del 8085 Virtual Kit.

El SDA 85 tiene las siguientes características: • Editor de textos excelente. • Modela hardware similar al real. • Programa monitor incorporado con posibilidad de modificación. • Simulación de teclado e indicadores visuales. • Soporte para interrupciones y comunicación serie. • Ejecución de programas paso a paso. • En el modo trace se visualiza la ejecución de instrucciones en el programa fuente.

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

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

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

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

Page 399: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

380

88008855 SSiimmuullaaddoorr IIDDEE

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

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

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

La figura 7.44 muestra la ventana principal del programa donde se ob-servan los registros internos incluyendo el registro de banderas (todos editables), la última y la siguiente instrucción a ejecutar, el número de estados del programa, el contador de instrucciones, las líneas de comunicación serie y las interrupciones del microprocesador.

Fig. 7.44 Ambiente de trabajo del 8085 Simulator IDE.

Page 400: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

381

Fig. 7.45 Editores de memoria y puertos.

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

Page 401: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

382

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

Fig. 7.46 Módulo de dispositivos periféricos

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

Page 402: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

383

Fig. 7.48 Administrador de puntos de parada Otras herramientas como el compilador BASIC y el desensamblador son co-

mentadas en la ayuda del 8085 Simulator IDE.

VVSSiimm SSiimmuullaaddoorr

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

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

Pese a sus carencias, para aplicaciones que requieran simular entradas usando

interruptores lógicos y salidas a indicadores luminosos conectados a puertos del sis-tema, puede simplificar el trabajo usar el panel de LED & Switch del VSim, mostrado en la figura 7.50.

Page 403: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

384

Fig. 7.49 Ventana principal del VSim.

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

Page 404: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

385

88008855 EEmmuullaattoorr ((WWiinn8855))

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

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

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

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

Fig. 7.51 Herramientas del Win85. En la parte superior izquierda de la figura se observa la ventana principal del

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

Page 405: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

386

El parte superior derecha de la figura 7.51 se muestra la ventana de dispositi-vos periféricos con los puertos e interrupciones asociadas. Se distinguen:

• Puertos básicos de E/S • Teclado • Monitor de puertos • Módulo LCD con capacidad gráfica tipo Seiko G1216B1N000

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

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

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

88008855 SSiimmuullaaddoorr yy SSiimm88008855

Estos dos programas son útiles para ejecutar las funciones básicas de simula-

ción de las instrucciones del microprocesador. El Sim8085 posee editor de memoria y puertos y el 8085 Simulator carece de esta última herramienta, además no reconoce las instrucciones IN y OUT de modo que sólo permite puertos mapeados como me-moria.

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

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

Todos los programas en este trabajo han sido probados usando algunos de los

simuladores de la figura 7.36 y ejecutados en el Sistema de Evaluación MPR85 PLUS. Es necesario que el estudiante seleccione la herramienta de su preferencia y

Page 406: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

387

Fig. 7.53 Ventanas principales del 8085 Simulator y del Sim8085

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

Page 407: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

388

nes del curso deben desarrollarse en un ambiente de simulación y posteriormente de-ben ser probadas con hardware real. De modo que el cursante debe explorar exhausti-vamente su simulador hasta lograr una confianza total en los resultados que éste en-trega.

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

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

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

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

Observe la lista de valores a partir de la posición de memoria 0302H, el valor mínimo en 0300H, y el máximo en 0301H. El acumulador contiene el máximo, el cual fue el último número escrito en memoria, mientras que el registro par HL apunta al final de la tabla. El contador de programa contiene la dirección de la próxima ins-trucción.

Page 408: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

389

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

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

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

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

Page 409: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

390

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

A continuación, el programa del ejemplo 7.9 se simula a usando el 8085 Simu-lator Ide. Previamente se generó el archivo ejecutable Ejem_78.hex, el cual se carga en la memoria del simulador como muestra la figura 7.57

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

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

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

Page 410: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

391

del código al facilitar la entrada de los 8 valores de 16 bits en el puerto P8 y el estado de la señal de control en la línea P9.7. El resultado de la simulación se almacena en memoria a partir de la dirección 0810H, como ilustra la figura 7.59.

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

Escribir un programa que calcule el periodo de la señal aplicada a la línea 0 del puerto 10H. La frecuencia de la onda está comprendida entre 0.1 Hz y 1 KHz. El código debe escribirse para ser simulado en el 8085 Virtual Kit, en cuya pantalla de-berá presentarse la medida con el formato de la figura 7.60.

Fig. 7.60 Medida del periodo de una onda.

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

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

Page 411: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

392

El único problema es que el simulador no presenta el carácter ‘m’, .por lo cual debe hacerse una pequeña modificación al monitor del programa para desplegar las unidades de medida. Basta con agregar al mapa de caracteres del monitor del SDA 85 la línea db 37h como se indica en el siguiente listado.

;----------------------------------------------------------- ;--------------------- Character Map ----------------------- org 0700h CharMap: db 3fh ; map for '0' db 06h db 5bh db 4fh db 66h db 6dh db 7dh db 07h db 7fh db 67h db 77h db 7ch db 39h db 5eh db 79h db 71h ;'F' 0fh db 1110110b ;'H' 10h db 0111000b ;'L' 11h db 1110011b ;'P' 12h db 0110000b ;'I' 13h db 1010000b ;'R' 14h db 0000000b ;' ' -blank 15h db 0111110b ;'U' 16h db 1000000b ;'-' 17h db 37h ;'m' 24 ;----------------------- END CharMap -----------------------

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

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

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

versión de binario a BCD. Existen muchos de éstos. En este caso se usa el siguiente: bin_bcd: acum_bcd = 0 contador = precisión repetir bin = 2 x bin bcd = 2 x bcd + acarreo contador = contador -1 hasta contador = 0 fin bin_bcd Este algoritmo calcula el valor BCD de un número, como se hace con lápiz y

papel.

Page 412: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

393

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

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

; Unidades de medida (ms) ;------------------------------------------------------------------------------- ----------------------------------------- unid: db 5 db 24 ;------------------------------------------------------------------------------- -----------------------------------------

; Programa principal ;------------------------------------------------------------------------------- ----------------------------------------- org 8100h lxi sp,tope_pila lxi h,unid mvi a,01h mvi b,00h call output ; Se ppresenta 'Ms' en pantalla sin pd bit10: in puerto ani 1 ; Esperar que señal pase a nivel bajo jnz bit10 bit01: in puerto ; Detectar flanco positivo de la onda ani 1 jz bit01 lxi d,0 ; Contador de milisegundos a cero de10: call medir ; Detecta fin de semiperiodo y continúa medida jnz de10 de01: call medir ; Mide hasta transición positiva jz de01 xchg shld dir_bin ; En DE periodo de la señal call bin_bcd ; Convierte medida a BCD call updad ; Presenta medida en campo de direcciones hlt ;------------------------------------------------------------------------------- -----------------------------------------

; Incrementa en 1 el registro BC entre transiciones positivas ;------------------------------------------------------------------------------- ----------------------------------------- medir: inx d ; Incrementa medida en 1 ms call retard ; Retardo de 1ms in puerto

Page 413: Microprocesadores-Luis Urdaneta

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 ;------------------------------------------------------------------------------- -----------------------------------------

Page 414: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

395

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

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

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

Esta situación se repite en otros simuladores, por lo cual el usuario debe adap-

tar cada programa a la sintaxis del ensamblador usado. Los dos obstáculos son inde-seables: es necesario programar en forma modular y usar un programa ensamblador de potencia tal que simplifique en forma resaltante la escritura del programa.

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

Page 415: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

396

7.4.2 Sistema integrado para desarrollo de programas Una aplicación IDE estándar contiene al menos:

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

Un diagrama que ilustra los recursos de una aplicación IDE estándar, se mues-

tra en la figura 7.62.

EDITOR DE TEXTO

COMPILADOR ANSI C

MACRO ENSAMBLADOR

BIBLIOTECA ESTANDAR

BIBLIOTECA CPU

S.O. TIEMPO

REAL

ENLAZADOR/RELOCALIZADOR

DEPURADOR

SIMULADOR EMULADOR

GRABADOR DE EPROM

Fig. 7.62 Funciones típicas de un entorno integrado para desarrollo de programas El proceso de desarrollo del programa se inicia cuando se escribe en C o en

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

Page 416: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

397

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

El programa ejecutable puede ser simulado en el microcomputador, cargado

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

En el Laboratorio de Microprocesadores existen 5 microcomputadores de bajo

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

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

evaluación con las siguientes características:

1. Permite el desarrollo de programas en forma modular con el compilador C: MICROC-85. 2. Para programación en ensamblador utiliza el ASM85, el cual no procesa macros ni código

relocalizable, haciendo imposible la programación modular. 3. Limita el tamaño del código a 500 líneas. 4. No incorpora un simulador para la versión correspondiente al 8085. 5. Dispone de un terminal por medio del cual se puede conectar al MPR-85. 6. Se puede incorporar nuevas herramientas de desarrollo de programa como macroensam-

bladores y enlazadores.

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

Page 417: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

398

a) Sustituir el ensamblador original por un Macroensamblador AVMAC85 con capacidad para procesar código relocalizable; e incorporar el enlazador/relocalizador correspondiente (AVLINK).

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

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

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

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

• Incorporar el ensamblador AVMAC85 como opción para el desarrollo de proyectos. • Especificar la forma en que el programa enlazador AVLINK debe procesar los archivos ob-

jetos generados por el ensamblador. • Convertir el archivo con extensión .hex generado por AVLINK a un archivo binario que

pueda ser cargado en el simulador WIN85. El programa WSIM85 acepta como entradas ar-chivos en formato HEX-INTEL o en binario.

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

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

Page 418: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

399

2. Seleccione la opción: Add New Toolkit

Fig.7.64. Se agrega un nuevo ensamblador 3. En la ventana de dialogo de la figura 7.64 escriba el nombre de la nueva herra-

mienta.

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

Fig.7.65. Configuración de la nueva herramienta

Page 419: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

400

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

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

Fig.7.66. Creación del proyecto Ejemplo1 2. Indique la carpeta (el programa la creará) donde residirá el proyecto dentro del

directorio de trabajo …\EXAMPLES. La carpeta puede tener el mismo nombre del proyecto.

3. Seleccione la herramienta (Toolkit).

Page 420: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

401

Fig.7.67. El proyecto Ejemplo1 está vacío. 4. Usando el menú Projects\Add files to project adjunte los archivos al proyecto.

Estos deben residir en la carpeta Ejemplo1.

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

Completado el procedimiento, el proyecto está listo para compilación y enla-zado como ilustra la figura 7.69.

Page 421: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

402

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

Es de suponer que con la configuración del AVMAC85 y del AVLINK realizada con el Toolkit Configurator, no es necesario realizar ajustes adicionales. No obstante examinemos Project\Settings:

Fig.7.70. Seleccione Generic Serial Loader.

Al seleccionar un cargador es posible transferir al MPR85 (Por un puerto serie del PC) el archivo SIMUL.HEX.

Page 422: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

403

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

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

El comando TOOLKITDIR\avmac85 SOURCEFILES procesa uno o más archivos fuente (.ASM) y los ensambla a uno o más archivos con extensión OBJ.

Page 423: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

404

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

genera un archivo único (SIMUL.HEX) con el código ejecutable. Este archivo está en formato HEX-INTEL. Las opciones son:

–sy Activa la generación de un archivo de símbolos y –sp Incluye información de símbolos en el archivo .map generado por AVLINK.

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

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

(SIMUL.BIN) usando la herramienta HEX2BIN. Finalmente use Build\Build Simul.hex para generar el archivo ejecutable.

Page 424: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

405

Fig.7.75. Proceso de generación del archivo ejecutable Incorporando los simuladores 1. Seleccione Tool\Add Tool .

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

Page 425: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

406

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

WSIM85 acepta como entrada archivos .hex o .bin

Fig.7.77. El simulador Win85 requirió el auxilio de un archivo .bat para ejecutarse El contenido del archivo win85.bat consiste de la línea:

c:\avocet\win85\win85 simul.bin

Los programas avmac85.exe, avlink.exe, hex2bin.exe y win85.bat deben resi-dir en el directorio: C:\bipom\devtools\microc.

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

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

Page 426: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

407

Fig.7.78. Ahora se tiene acceso a dos simuladores

1. Para configurar Terminal use Tools\Options\Terminal

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

Page 427: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

408

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

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

es similar a la de Terminal.

Fig.7.80. Seleccione dos bits de parada.

Los cargadores disponibles en Micro-IDE no están destinados para la transfe-rencia de archivos en el MPR85. Se usó El Generic Serial Loader. Aunque este indi-ca un error al tratar de poner al MPR85 en modo RUN, realiza la transferencia del archivo en forma correcta.

Fig.7.81. Cargadores para download.

Page 428: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

409

7.5 MACROS

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

Suponga que necesita generar un retardo por software con una duración de

cinco segundos y posteriormente en otro punto del programa se requiere un tiempo de espera de veinte segundos. Las rutinas capaces de generar el lapso de retardo tienen el mismo código excepto por el parámetro tiempo retardo. En lugar de escribir dos ruti-nas, el diseñador puede utilizar un macro definiendo en cada llamada el tiempo de-seado. Las aplicaciones de macro son diversas, recomendándose su uso cuando el número de instrucciones que componen el macro son pocas. Los programas ensam-bladores con capacidad para procesar macros se denominan Macroensambladores. Usted dispone de copias de dos traductores de este tipo: el isis-ii 8080/8085 macroas-sembler y el avmac85. Los macros deben definirse en el programa antes de ser invo-cados. Con este propósito el ensamblador acepta las siguientes directivas relacionadas con tal definición:

Tabla. 7.9. Directivas para control de macros. MACRO Definición de macro. ENDM Fin de cuerpo del macro. LOCAL Asigna a símbolo alcance local. REPT Repetir bloque. IRP Repetir indefinidamente. IRPC Repetir caracter indefinidamente. EXITM Salida del macro antes de ENDM. Las pseudo instrucciones anteriores corresponden al isis-ii 8080/8085 ma-

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

nombre MACRO lista de parámetros falsos cuerpo del macro ENDM

Page 429: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

410

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

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

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

Una vez que el macro es definido puede ser llamad cualquier número de veces

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

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

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

Pdato EQU 80H ;----------------------------------------------------------------------- Definición de macro PUERTOreg ;-----------------------------------------------------------------------PUERTOreg %MACRO r,PUERTO IN PUERTO MOV r,A %ENDM ;----------------------------------------------------------------------- Las siguientes instrucciones de llamadas al macro cargarán en el registro B el

contenido del puerto 80H, en C el de 81H, en D el de 82H y en E el de 83H.

;------------------------------------------------------------------------ PUERTOreg B,Pdato PUERTOreg C,Pdato+1 PUERTOreg D,Pdato+2 PUERTOreg E,Pdato+3 ;-----------------------------------------------------------------------

1 Estas directivas no se discuten. El interesado puede recurrir al manual del isis-ii 8080/8085

Page 430: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

411

La sintaxis del código corresponde al avmac85. El siguiente ejemplo ilustra el uso del isis-ii 8080/8085, este último programa muestra claramente en el archivo de salida .lst, la expansión del macro. Observe el cambio en la sintaxis.

Ejemplo 7.11

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

$MACROFILE ; ejem_711.src ;----------------------------------------------------------- ; Puerto de entrada ;----------------------------------------------------------- Pdato EQU 80H ;----------------------------------------------------------- ; Definición de macro ;----------------------------------------------------------- PUERTOreg MACRO r,PUERTO IN PUERTO MOV r,A ENDM PUERTOreg B,Pdato PUERTOreg C,Pdato+1 PUERTOreg D,Pdato+2 PUERTOreg E,Pdato+3 END

Ejecute la secuencia de comandos:

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

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

ASM80 Ejem_7110.SRC ISIS-II 8080/8085 MACRO ASSEMBLER, V4.1 MODULE PAGE 1 LOC OBJ LINE SOURCE STATEMENT 1 $MACROFILE 0080 2 Pdato EQU 80H 3 4 PUERTOreg MACRO r,PUERTO - 5 IN PUERTO - 6 MOV r,A 7 ENDM 8

Page 431: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

412

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

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

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

Tabla. 7.10. Estados de las luces.

P10.7 P106 P10.7 P10.4 Estado de las luces P10.3 P10.2 P10.1 P10.0

Norte-Sur Este-Oeste 0 0 0 0 Apagadas 0 0 0 0 0 0 0 1 Rojo 0 0 0 1 0 0 1 0 Ámbar 0 0 1 0 0 0 1 1 Verde 0 0 1 1

Page 432: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

413

Fig.7.82.Intersección vial simple

En la figura 7.83 se muestra un flujo grama para el ciclo principal de cambio de luces, considerando la presencia de vehículos en ambas avenidas.

INICIO

ns en verdeeo en rojo

esperar 20

segundos

ns en amarillo

esperar 5

segundos

ns en rojoeo en verde

esperar 15

segundos

eo en amarillo

esperar 5

segundos

A

A

Fig. 7.83 Secuencia para el cambio de luces con circulación continua de en ambas direcciones.

Page 433: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

414

El código presentado a continuación usa macros para resolver el problema de control de una intersección básica.

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

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

se omite por tratarse de una asignación. ;------------------------------------------------------------------------------------------------------------- ;Control de trafico ;------------------------------------------------------------------------------------------------------------- luz equ 10h nsbits equ 4 eobits equ 0 noluz equ 0 rojo equ 1 ambar equ 2 verde equ 3 ;------------------------------------------------------------------------------------------------------------- ; Macro PONluz dir,color ;------------------------------------------------------------------------------------------------------------- PONluz MACRO dir,color mvi a,color shl dir&bits out luz ENDM ;------------------------------------------------------------------------------------------------------------- ; Macro ESPERAR segundos ;--------------------------------------------------------------------------------------------------------------- ESPERAR MACRO segundos Cuerpo del macro ENDM

Page 434: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

415

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

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

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

7.6 TABLAS DE CONSULTA (LOOKUP TABLES)

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

°F = 9/5 x °C + 32 °C = 5/9 x (°F – 32) En estos casos el proceso de conversión entre dominios se reduce a aplicar

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

Fig. 7.11 Código de 7 segmentos Dígito binario Código 7-Segmentos

Binario gfedcba

hex

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

Page 435: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

416

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

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

org 100h lxi sp,300h lxi h,150h

mvi b,255 ; B contiene el dígito a convertir dig: inr b mov a,b cpi 16 ; Si dígito ‘F’ parar jz salir call bin7seg ; Convertir digito a 7 segmentos mov m,a ; Guardar código en memoria inr l jmp dig salir: hlt bin7seg: push h lxi h,tabla add l mov l,a mov a,m pop h ret ; ----------------------------------------------------------------------------------- ; Tabla de conversión ; ----------------------------------------------------------------------------------- ; la tabla se inicia en la dirección 200h org 200H db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h db 7fh,67h,77h,7ch,39h,5eh,79h,71h end

Page 436: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

417

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

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

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

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

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

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

Page 437: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

418

Fig. 7.86 Ventana del simulador.

Page 438: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

419

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

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

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

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

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

Ejemplo 7.12

Se requieren dos rutinas que usen tablas de consulta para realizar la conver-

sión desde grados Centígrados a Fahrenheit y viceversa. El rango es entre 0 °C y 100 °C y debe evaluarse la temperatura con un grado de diferencia.

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

lador a °F y lo almacena en la dirección 150h. Se usa una tabla de 101 entradas. ; Conversión de Centigrados a Fahrenheit ;---------------------------------------------------------------------------------------------------------------- tempf equ 150h

org 100h lxi sp,200h call gcaf sta temp hlt ;---------------------------------------------------------------------------------------------------------------- gcaf: lxi h,tabla add l mov l,a mov a,m ret

Page 439: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

420

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

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

; Conversión de Fahrenheit a Centigrados ;---------------------------------------------------------------------------------------------------------------- tempc equ 150h org 100h lxi sp,300h call gfac sta tempc hlt gfac: lxi h,tabla sui 32 add l mov l,a mov a,m ret org 200h tabla: db 0,1,1,2,2,3,3,4,4,5,6,6 db 7,7,8,8,9,9,10,11,11,12,12,13 db 13,14,14,15,16,16,17,17,18,18,19,19 db 20,21,21,22,22,23,23,24,24,25,26,26 db 27,27,28,28,29,29,30,31,31,32,32,33 db 33,34,34,35,36,36,37,37,38,38,39,39 db 40,41,41,42,42,43,43,44,44,45,46,46 db 47,47,48,48,49,49,50,51,51,52,52,53 db 53,54,54,55,56,56,57,57,58,58,59,59 db 60,61,61,62,62,63,63,64,64,65,66,66 db 67,67,68,68,69,69,70,71,71,72,72,73 db 73,74,74,75,76,76,77,77,78,78,79,79 db 80,81,81,82,82,83,83,84,84,85,86,86 db 87,87,88,88,89,89,90,91,91,92,92,93 db 93,94,94,95,96,96,97,97,98,98,99,99 db 100 end ;----------------------------------------------------------------------------------------------------------------

Page 440: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

421

Ejemplo 7.13

Un programa debe calcular el seno y el coseno de un ángulo θ en el rango de 0 a 360°. El valor de θ se carga en el registro BC y el sen(θ) y el cos(θ) deben salvar-se en los registros de 16 bits BC y DE, respectivamente. El signo del sen/cos lo indi-cará el bit más significativo del registro par B/D.

Use una tabla de consulta que registre, con incrementos de un grado, los valo-res del seno o coseno del ángulo para θ en el cuadrante I.

Por ejemplo: 5000 → sen (30°) 8660 → sen (60°)

Para determinar el valor del seno y el coseno se usará una tabla de búsqueda con 91 entradas, la cual contiene el seno de los ángulos entre 0° y 90° multiplicados por 10000. Para encontrar el coseno de θ se usa la relación trigonométrica de ángulos complementarios:

)90(sen)cos( θ−=θ

Además es necesario trasladar los ángulos en el rango 90° < θ ≤ 360° hacia el primer cuadrante. La tabla siguiente muestra las relaciones necesarias y el signo de las funciones para cada cuadrante.

Tabla. 7.12. Signos de sen y cos por cuadrantes. Cuadrante Relación sen(θ) cos(θ)

I θ + +

II θ =180 - θ + -

III θ = θ - 180 - -

IV θ =360 - θ - +

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

;--------------------------------------------------------------------------------------------------------------------------- ; Programa principal ;---------------------------------------------------------------------------------------------------------------------------

defseg prog seg prog ; ángulo en grados en registro BC sencos: lxi sp,0200h lxi h,tbsenx mov a,b ; byte de orden alto del ángulo a B cpi 1 ; ángulo es mayor de 255 grados

Page 441: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

422

jz III_IV ; si, ubicar el cuadrante entre el 3 ó 4 mov a,c ; ángulo no mayor de 255 grados cpi 90 ; ¿teta está en cuadrante 1? jnc cuad23 ; si, extraer seno de la tabla call calc jmp salir cuad23: cpi 180 ; no, probar si está en cuadrante 2 ó 3 jnc III ; si, está en cuadrante 3, pasar a cuadrante 1 mvi a,180 ; no, está en el cuadrante 2... sub c ; pasar a cuadrante 1 call calc ; extraer seno de la tabla call cosneg ; coseno negativo jmp salir III: sui 180 ; de cuadrante 3 al 1 call calc ; extraer seno de la tabla call senneg ; seno negativo call cosneg ; coseno negativo jmp salir III_IV: mov a,c ; si, en el cuadrante 3 o 4 cpi 14 ; probar entre cuadrantes 3 ó 4 jnc IV ; teta está en el cuadrante 4 adi 76 ; teta en el 3, pasar al cuadrante 1 call calc ; extraer seno/cos de la tabla call senneg ; seno negativo call cosneg ; coseno negativo jmp salir IV: mvi a,104 ; pasar de cuadrante 4 al 1 sub c call calc call senneg ; seno negativo salir: hlt ;---------------------------------------------------------------------------------------------------------------- ; Subrutina CALC de búsqueda en la tabla ;---------------------------------------------------------------------------------------------------------------- calc: mvi b,2 mov c,a ccos: add a ; extraer seno/cos de la tabla add l mov l,a mov e,m inx h mov d,m dcr b jz retor push d mvi a,90 sub c lxi h,tbsenx jmp ccos retor: pop b ; BC contiene el senx y DE el cosx ret

Page 442: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

423

;--------------------------------------------------------------------------------------------------------------------------- ; Subrutina SENNEG para colocar el signo negativo al seno ;--------------------------------------------------------------------------------------------------------------------------- senneg: mov a,b ; seno negativo cpi 0 jz oks ori 80h mov b,a oks: ret ;--------------------------------------------------------------------------------------------------------------------------- ; Subrutina COSNEG para colocar el signo negativo al coseno ;--------------------------------------------------------------------------------------------------------------------------- cosneg: mov a,d ; coseno negativo cpi 0 jz okc ori 80h mov d,a okc: ret defseg datos,start=100H seg datos ;--------------------------------------------------------------------------------------------------------------------------- ; Tabla de senos. ;--------------------------------------------------------------------------------------------------------------------------- tbsenx: dw 0000,0175,0349,0523,0698,0872,1045,1219,1392,1564 dw 1736,1908,2079,2250,2419,2588,2756,2924,3090,3256 dw 3420,3584,3746,3907,4067,4226,4384,4540,4695,4848 dw 5000,5150,5299,5446,5592,5736,5878,6018,6157,6293 dw 6428,6561,6691,6820,6947,7071,7193,7314,7431,7547 dw 7660,7771,7880,7986,8090,8192,8290,8387,8480,8572 dw 8660,8746,8829,8910,8988,9063,9135,9205,9272,9336 dw 9397,9455,9511,9563,9613,9659,9703,9744,9781,9816 dw 9848,9877,9903,9925,9945,9962,9976,9986,9994,9998 dw 10000 end Interpolación

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

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

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

Page 443: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

424

Fig. 7.87 El valor de y para la entrada x puede calcularse por interpolación Para un valor x cualquiera de la variable independiente, la salida correspon-

diente puede calcularse de,

1i1i1ii

1ii y)xx(xxyy

y −−−

− +−×−−

=

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

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

[ ]

5

calc

104834.2Error

8681989814.0y

8681739796.0y

)60(sen)6025.60()60(sen)61(seny

)60(sen)60x(6061

)60(sen)61(seny

−×=

=

=

+−×−=

+−−

−=

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

ra, se obtiene un error despreciable. El proceso implica una multiplicación y una divi-

Page 444: Microprocesadores-Luis Urdaneta

Desarrollo y Simulación de Programas

425

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

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

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

Page 445: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

426

TééccnniiccaaT ss ddee GGeessttiióónn ddee EE//SS

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

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

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

El desarrollo del programa que controla el acceso al periférico es una fase del

diseño que requiere tanta atención como la selección del circuito de puerto, esto debi-do a que en algunas aplicaciones no solo es necesario seleccionar el puerto y ordenar

Page 446: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

427

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

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

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

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

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

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

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

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

Page 447: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

428

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

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

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

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

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

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

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

Page 448: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

429

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

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

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

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

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

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

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

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

• Una técnica de gestión apropiada.

Existen tres técnicas principales de gestión para establecer comunicación entre un periférico y el µP, éstas son:

1. E/S por programa. 2. E/S usando interrupciones. 3. Acceso directo a memoria (DMA)

8.1 ENTRADA Y SALIDA POR PROGRAMA

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

Page 449: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

430

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

El siguiente ejemplo usa E/S por programa en el primer modo para comunicar

al µprocesador con dispositivos externos

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

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

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

dor el número del pulsador. 2. Muestre el número de veces que S5 es activado. El programa debe parar la

décima vez.

Tome en consideración el efecto de rebote de los pulsadores. Un dispositivo de entrada de uso común en aplicaciones de control, son inter-

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

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

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

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

Page 450: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

431

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

Page 451: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

432

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

Fig. 8.3. Efecto del rebote de contactos en un interruptor mecánico. El uso de pulsadores o teclas de bajo costo en aplicaciones de microprocesa-dores es factible siempre y cuando se tomen medidas para suprimir el efecto de rebo-te. En la práctica la intermitencia de contactos pude ser eliminada con circuitos o por programa. Si se tiene un interruptor SPDT, el circuito de la figura 8.4 es ideal para esta función.

Fig.8.4. Un biestable con puertas NAND suprime el efecto de rebote en un interruptor SPDT.

Page 452: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

433

En el flanco de caída del primer rebote, la salida D0 es llevada a uno o cero dependiendo de la posición del interruptor. Cualquier rebote posterior no tiene efecto sobre la salida.

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

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

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

Otro método de eliminación de la intermitencia en los contactos es usar un multivibrador monoestable que produzca un pulso con una duración mayor al tiempo de rebote. Un chip circuito integrado del tipo 74LS121 puede usarse con tal propósi-to.

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

red RC y un disparador de Schmitt, como ilustra la figura 8.6. En este caso la salida es el complemento lógico de la entrada: cuando el interruptor está liberado, la salida es

Page 453: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

434

cero lógico y al ser presionado sube a estado uno. Cuando el pulsador es activado el voltaje del capacitor se descarga rápidamente. Cuando esta tensión cae por debajo del umbral inferior de histéresis VT

-, la salida conmuta a nivel alto hasta cuando el inter-ruptor es desactivado. En este momento el capacitor vuelve a cargarse y cuando el voltaje sube por encima de VT

+, la salida del 74LS14 cae a cero lógico. La salida es un pulso en nivel alto, totalmente limpio.

Fig.8.6. Circuito antirebote con disparador de Schmitt.

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

Solución parte 1:

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

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

o más de los ocho interruptores. El diagrama de flujo para el código del ejemplo pue-de verse en la figura 8.8. Se supone una duración de 10 ms para el transitorio del rebote de contactos. Debido a que el número con el cual se identifica el interruptor es un valor binario, éste debe convertirse al código adecuado para presentarse en el indicador de siete segmentos antes de ser escrito en el puerto de salida 17. El código consta del progra-ma principal y dos subrutinas: una para el retardo de 10 ms y la otra para la conver-sión, como se aprecia en la figura 8.9.

Page 454: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

435

Fig.8.7. Formas de ondas resultado de la simulación del circuito antirebote de la figura 8.5. En t=0 se cierra/abre el interruptor el cual estaba abier-

to/cerrado en t=0-.

Page 455: Microprocesadores-Luis Urdaneta

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.

Page 456: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

437

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

;------------------------------------------------------------------------------------------------------- ; Ejemplo 8.1 ;------------------------------------------------------------------------------------------------------- ; Programa principal ;-------------------------------------------------------------------------------------------------------

defseg progr, start=0 defseg p8255,start=16, class=iospace ;------------------------------------------------------------------------------------------------------

extern ret_10ms,bin_7seg tope_pila equ 0300h ;----------------------------------------------------------------------------------------------------- seg p8255 pa: ds 1 pb: ds 2 pctrl: ds 1 ;------------------------------------------------------------------------------------------------------ seg progr lxi sp,tope_pila mvi a,95h out pctrl ; programar 8255 mvi a,255 out pb ; apagar indicador esper_cierre: in pa ; esperar cierre de un interruptor cpi 0ffh

Page 457: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

438

jz esper_cierre ; ninguno cerrado, esperar call ret_10ms ; alguno cerrado, retardar 10 ms mvi b,0ffh ; identificar interruptor otro: inr b rar jc otro ; probar otro pulsador esper_apert: in 10h ; esperar apertura para presentar número cpi 0ffh ; jnz esper_apert ; mov a,b ; número al acumulador call bin_7seg ; convertir a 7 segmentos cma ; el indicador es ánodo común out pb ; presentar número hlt ; salir end ;------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------ ; Rutina de retardo ;------------------------------------------------------------------------------------------------------ public ret_10ms defseg retardo seg retardo ret_10ms: push psw lxi d,502h ret1: dcx d mov a,e ora d jnz ret1 pop psw ret end ;------------------------------------------------------------------------------------------------------ ; Rutina de conversión de binario a siete segmentos ;------------------------------------------------------------------------------------------------------

public bin_7seg defseg convers seg convers bin_7seg: lxi h,tabla add l mov l,a mov a,m ret ;------------------------------------------------------------------------------------------------------ ; tabla de conversión ;------------------------------------------------------------------------------------------------------ tabla: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h db 7fh,67h,77h,7ch,39h,5eh,79h,71h end

Page 458: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

439

El código programa un PPI8255 en la dirección 10H con el puerto A como en-trada y el puerto B como salida. El ejemplo se simuló con WSIM85 y funcionó bien.

Fig.8.10. Simulación del ejemplo 8.1 parte 1 con el interruptor S4 activado.

Solución parte 2: En la parte anterior se debía esperar la liberación del interruptor para proceder a parar al programa, lo cual sucedía con el primer rebote de apertura. En este caso se desea registrar el número de veces que el interruptor 5 es presionado, esto significa que es necesario también eliminar los rebotes durante la desactivación. De otro modo, estos serían contabilizados como cierres/aperturas.

El diagrama de flujo para el programa se presenta en la figura 8.11 y a conti-nuación se muestra el código para el programa principal. La programación de la sub-rutina de retardo y la de conversión de binario a siete segmentos fue realizada en la parte anterior del ejemplo.

Page 459: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

440

Fig.8.11. Flujograma para presentar el número de veces que el interruptor S5 es activado.

defseg progr, start=0 defseg p8255,start=16, class=iospace extern ret_10ms,bin_7seg tope_pila equ 0300h seg p8255 pa: ds 1 pb: ds 2 pctrl: ds 1

Page 460: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

441

seg progr lxi sp,tope_pila mvi a,95h out pctrl mvi a,not(3fh) out pb ; indicador a cero mvi b,0 ; contador inicia en cero esper_cierre: in pa ; esperar cierre de un interruptor cpi 0ffh jz esper_cierre ; ninguno cerrado, esperar call ret_10ms ; alguno cerrado, retardar 10 ms inr b mov a,b cpi 10 jz salir mov a,b ; número al acumulador call bin_7seg ; convertir a 7 segmentos cma ; indicador es ánodo común out pb ; presentar número esper_apert: in 10h ; esperar apertura para presentar número cpi 0ffh ; jnz esper_apert ; call ret_10ms jmp esper_cierre ; esperar siguiente cierre salir: hlt

end

Retomando lo dicho sobre la existencia de dos modos de realizar E/S por pro-

grama, se tiene que la segunda modalidad es la de consultas sucesivas o polling cuan-do el µP pregunta periódicamente a cada periférico si requiere atención. Si la res-puesta es negativa, el µP consultará al siguiente dispositivo de E/S, permaneciendo en el lazo hasta cuando se le solicite servicio. Para preguntar al puerto, se debe examinar un bit de estado activado por el periférico cuando necesita atención. Si existen varios dispositivos de E/S, cada uno deberá generar su propio bit de estado. La lógica nece-saria para poner en práctica esta modalidad es sencilla, pero al ser una comunicación asincrónica, se gasta tiempo de CPU en forma innecesaria debido a que para garanti-zar el funcionamiento del sistema, el lazo de consulta debe ejecutarse en intervalos regulares aunque los periféricos no requieran servicio.

En la figura 8.12 se repite el circuito de la figura 7.30, el cual constituye un

ejemplo de E/S programada con consulta. En este caso el µP examina la línea P8.7 y si está en nivel alto, lee el contenido del puerto P7. En otras palabras el periférico sube a uno el terminal P8.7 para anunciar la presencia de un nuevo dato en la entrada del puerto 8. Una vez que el µP lee el puerto, desactiva el bit de condición.

El código para la transferencia se presentó en el ejemplo 7.8. Considere ahora

que se tienen ocho puertos de entrada P0-P7, cada uno con su bit de estados particular en la línea correspondiente del puerto P8. Por ejemplo el terminal P8.5 corresponde al

Page 461: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

442

puerto de entrada P5. El µP debe leer el puerto P8 y examinar los bits individuales para determinar en cual puerto se ha cargado un nuevo dato.

El siguiente código permite ejecutar la rutina de servicio correspondiente a los

puertos que requieran atención. conslt_suc: in 8 ; leer bits de estados rar ; bit 0 a la bandera de acarreo cc rut_0 ; leer nuevo dato en puerto 0 si bit 0 es uno rar cc rut_1 rar cc rut_2 rar cc rut_3 rar cc rut_4 rar cc rut_5

rar cc rut_6 rar ; bit 7 a la bandera de acarreo cc rut_7 ; leer nuevo dato en puerto 7 si bit 7 es uno ret

Fig.8.12. Entrada de datos usando un bit de condición.

Page 462: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

443

8.2 ENTRADA Y SALIDA USANDO INTERRUPCIONES

El método de E/S por programa es adecuado para atender periféricos muy len-tos como interruptores e indicadores visuales, los cuales pueden ser registrados o ac-tualizados en cualquier momento. Otros dispositivos de E/S con mayor velocidad co-mo: teclados, impresoras y sistemas de adquisición de datos, deben ser atendidos cuando estén disponibles para transmitir o recibir información. En estos casos, el pro-grama estará a la expectativa por la activación de una bandera de condición que noti-fique que el periférico está libre. El tiempo de espera desperdicia tiempo de CPU y requiere más líneas de código para su realización.

Suponga que el periférico de la figura 7.30 tarda un segundo en transmitir los

16 valores. El lazo en la rutina ADAT del ejemplo 7.8 que examina la bandera de estado tiene una duración de 8.64 µs/paso.

adat: in p9 ani 80H jz adat

El ancho de banda del periférico nos sugiere que el examen de la bandera ten-drá éxito cada 62.5 ms. No obstante la verificación ocurrirá 115741 veces cada se-gundo, lo cual equivale a 7234 veces antes de la transmisión de cada carácter. La pér-dida de tiempo es del 99.99 %, debido a que el tiempo útil es de 138.24 µs por cada segundo.

La solución a este problema es el uso de la técnica de interrupciones. Una in-

terrupción es una solicitud realizada al microprocesador por parte de un periférico para solicitar servicio. Todo µP tiene al menos una entrada INTR para este propósito y una salida INTA de reconocimiento de interrupción. La figura 8.13 muestra como el puerto de bit de estado de la figura 8.12 puede ser eliminado para que en respuesta a una interrupción el µP lea el dato cargado en el puerto de entrada por el dispositivo externo.

Fig.8.13. Entrada de datos usando una interrupción.

Page 463: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

444

Cuando el µP recibe una interrupción puede tomar dos acciones: parar la eje-cución del programa en progreso y ejecutar una rutina de servicio a la interrupción para luego regresar al programa principal; o ignorar la petición si la interrupción está deshabilitada. La entrada INTR puede ser sensible a flanco o a nivel, en el primer caso cuando se presenta el flanco correspondiente en la entrada INTR se registra el evento activando un bit interno del procesador hasta cuando el CPU reconozca la interrupción. De modo que la señal de solicitud no tiene porque permanecer en uno lógico. En el otro caso, la señal debe permanecer aplicada con un nivel estable hasta cuando la interrupción sea aceptada. Si INTR es sensible a nivel, debe usarse un latch para memorizar la petición de interrupción como ilustra la figura 8.14.

Fig.8.14. Entrada de datos usando una entrada INTR sensible a nivel.

Fig.8.15. Proceso de atención a una interrupción.

Page 464: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

445

Una interrupción, como todo evento asincrónico, puede producirse en cual-quier momento durante la ejecución de un programa. Cuando ocurre, se completa la instrucción que está en ejecución, el µP acepta la petición y transfiere el control a una rutina de servicio de interrupción (RSI) la cual salva las variables para preservar las operaciones a reanudarse y atiende al periférico que originó la llamada. Una vez completada la RSI, el control se transfiere de nuevo al programa principal. La figura 8.15 muestra como se interrumpe el procesamiento normal de un programa y se re-anuda una vez ejecutada la RSI. Las tareas que siguen a una interrupción son las si-guientes:

• Culmina la ejecución de la instrucción en curso. • Se activa la señal de reconocimiento de interrupción. • El contenido del contador de programa se almacena en la pila. • El PC se carga con la dirección de la primera instrucción de la RSI. • Se ejecuta la rutina de servicio. • Se recupera el contenido del PC guardado en la pila. Considere de nuevo el caso del periférico que transmite 16 bytes por segundo.

Si la transferencia se ejecuta por medio de una interrupción, el procesador será inte-rrumpido 16 veces cada segundo y ejecutará la rutina de servicio para leer y cargar en memoria el valor. Si la duración del código en la RSI es digamos 15 µs, para poder transmitir y almacenar en memoria los 16 valores se invierte un tiempo de CPU de aproximadamente 240µs, en contraste con el tiempo de más de un segundo que re-quiere el µP para examinar la bandera de estado, leer el puerto y almacenar los valo-res cuando se usa el método de polling.

Las interrupciones que pueden ser inhabilitadas por el programa, se dice que

son enmascarables, mientras que aquellas que el sistema no puede suspender son no enmascarables. Existen instrucciones específicas del microprocesador para la habili-tación o no de una interrupción particular o de todo el sistema de interrupciones. Cuando una señal es aplicada a una entrada de interrupción vectorizada, se le sumi-nistra internamente al procesador la dirección a la cual se debe transferir el control del programa. En el caso de interrupciones no vectorizadas, el µP espera que una ló-gica externa provea tal dirección. 8.2.1 El sistema de interrupciones del 8085A

El µP 8085A tiene cinco de entradas de interrupción: TRAP, RST 7.5, RST

6.5, RST 5.5 e INTR. Todas son enmascarables excepto TRAP, la cual no puede ser deshabilitada por el sistema. Las interrupciones TRAP, RST 7.5, RST 6.5 y RST 5.5 son vectorizadas, de modo que cuando son activadas y están habilitadas, se genera una instrucción RST n.x interna que suministra la dirección de salto. En el caso de activación de la línea INTR, el µP espera que en respuesta a la conmutación de la salida INTA , alguna lógica externa coloque en el bus de datos una instrucción CALL dirección o preferiblemente una RST n.

Page 465: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

446

El terminal INTR es sensible a nivel, de modo para activar esta interrupción debe aplicarse un 1 lógico a la entrada y mantenerse hasta cuando la interrupción sea reconocida. El vector de interrupción de la entrada INTR debe suministrarse exter-namente.

Fig.8.16. Entradas de interrupción y salida de reconocimiento de interrupción La entrada TRAP tiene prioridad máxima y es sensible a flanco y a nivel, lo

cual significa que el flanco de subida de la señal aplicada dispara el proceso de inte-rrupción, pero la entrada deberá ser mantenida en uno hasta cuando la solicitud sea reconocida.

La línea RST 7.5 es disparada por el flanco anterior de la señal presentada a

esta entrada. Debido a que el µP registra la ocurrencia del flanco cargando uno en un bit interno, no es necesario mantener a RST 7.5 en alto. Cuando la interrupción es atendida la bandera vuelve a cero. Las restantes entradas: RST 6.5 y RST 5.5 son sensibles a nivel alto, como INTR.

El 8085 tiene varias instrucciones destinadas a ser usadas con las interrupcio-

nes. Estas son: EI, DI, SIM, RIM y la conocida RST n.

Tabla. 8.1 Instrucciones asociadas al sistema de interrupciones.

Instrucciones asociadas con interrupciones

EI Habilitar interrupción SIM Poner máscara de interrupción

DI Inhibir interrupción RIM Leer máscara de interrupción

Page 466: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

447

EI Habilita las interrupciones del microprocesador después de la ejecución de la

siguiente instrucción. EI pone en uno la bandera de habilitación de interrupción o BITINTE, autorizando todas las interrupciones enmascarables.

DI

Pone en 0 la bandera de habilitación de interrupción o BITINTE, deshabilitando

todas las interrupciones enmascarables, inmediatamente después la ejecución de DI.

Cuando una señal es aplicada a la entrada TRAP, la interrupción es atendida de inmediato independientemente que el sistema de interrupciones esté deshabilitado con DI. Para que una solicitud de interrupción realizada en la línea INTR sea atendida basta con que la entrada esté habilitada por medio de la instrucción EI. Por el contra-rio, las entradas RST 7.5, RST 6.5 y RST 5.5 disponen de un mecanismo de enmas-caramiento que permite la autorización o no de cada entrada en forma independiente. Para que una de estas entradas sea habilitada se debe desenmascarar la interrupción correspondiente usando la instrucción SIM y posteriormente se debe ejecutar la ins-trucción EI.

Tabla. 8.2 Características de las interrupciones del 8085A.

Entrada Prioridad Habilitación Disparo Vector de interrupciónTRAP 1 Ninguna Flanco y nivel 0024H

RST5.5 2 SIM EI Nivel 002CH

RST6.5 3 SIM EI Nivel 0034H

RST7.5 4 SIM EI Flanco anterior 003CH

INTR 5 EI Nivel Externo (CALL dir o RST n)

El espacio de direcciones entre 0000H y 0040H debe preservarse para el ma-

nejo de interrupciones. Observe que entre los vectores de las interrupciones existe un espacio de ocho posiciones de memoria, lo cual es suficiente para contener una ins-trucción de salto a la RSI. Las rara nomenclatura de las interrupciones RST n.x se debe a que su vector se encuentra en el punto medio entre la RST n anterior y la sub-siguiente. Por ejemplo RST 6 tiene como vector 0030H (8 x 6) y 38H (7 x 8) es el de RST 7, de modo que a RST6.5 le corresponde 34H (6.5 x 8).

Como se expuso en el capítulo 4, la presencia de una interrupción es detecta-

da por el µP durante el flanco negativo del pulso de reloj anterior al fin de la instruc-ción durante la cual la interrupción es activada. Esto permite la culminación de la

Page 467: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

448

ejecución de la instrucción en curso antes de atender la interrupción. Si el µP está en el estado HALT el muestreo se realiza en cada ciclo de reloj.

En la figura 8.17 se muestra un diagrama de transición simplificado de la ope-

ración del 8085. Observe que al final del último ciclo de máquina de la instrucción en ejecución se pregunta si hay alguna interrupción pendiente que esté habilitada y/o desenmascarada. Si la respuesta es negativa el µP buscará la siguiente instrucción. Si existen solicitudes diferidas, se desactivan las interrupciones poniendo a cero el BITINTE de habilitación y se reconoce la petición cargando uno en el bit de recono-cimiento de interrupción BITINTA, y. En el siguiente pulso de reloj, se inicia un ciclo de máquina de reconocimiento de interrupción o INA, si e trata de INTR o un ciclo de máquina del tipo de bus inactivo o BI, en el caso de TRAP y RST.

Fig.8.17. Diagrama de transición de estados simplificado del 8085A.

El ciclo de máquina INA es similar al ciclo de búsqueda excepto que M/IO

va a nivel alto y se activa INTA en lugar de RD . Durante el ciclo de máquina BI se

Page 468: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

449

genera la instrucción RST interna que suministra el vector de interrupción para las entradas TRAP y RST.

Cuando una interrupción es reconocida, se deshabilita el sistema de interrup-

ciones al ponerse a cero el BITINTE. También en un evento de RESET son puestos a cero el BITINTE, el bit interno de reconocimiento de flanco del RST 7.5 y TRAP y se colocan (ponen a 1) las máscaras de interrupción a RST 7.5, RST 6.5 y RST 5.5. Usualmente un flip flop de habilitación se pone a uno para permitir la interrupción mientras que un flip flop de máscara se pone a cero para desenmascarar la interrup-ción.

Interrupciones disparadas por la entrada INTR

Estando habilitada INTR por medio de la instrucción EI, el proceso de inte-rrupción se inicia cuando el periférico pone en alto la entrada. A continuación se des-habilitan las interrupciones poniendo a cero el BITINTE y el µP inicia un ciclo de má-quina tipo de reconocimiento de interrupción con 1S1 = , 1S2 = , 1M/IO = y la línea INTA activada a nivel bajo. Durante el ciclo INA no se incrementa el contador de programa, el cual contiene la dirección de la instrucción que sigue a la que estaba en ejecución en el momento de producirse la interrupción. Mientras INTA esté en nivel bajo, el µP esperará que el dispositivo que interrumpe coloque en el bus de datos el código de operación de la próxima instrucción a ejecutar. Tal instrucción debe sumi-nistrar a la CPU la dirección de inicio de la rutina de servicio de interrupción. Tam-bién debe almacenar en la pila el contenido del contador de programa para que el programa pueda reasumir, una vez finalizada la RSI, las operaciones que estaba reali-zando antes de producirse la interrupción. Para esta función, sólo dos instrucciones son factibles de usar: CALL dirección y RST n.

La instrucción RST n requiere menos lógica externa para esta tarea que la

CALL. El código de instrucción de RST n es:

D7 D6 D5 D4 D3 D2 D1 D01 1 N N N 1 1 1

Donde NNN es el valor de n en binario. La ejecución de RST n carga en la pila

el contenido del PC y carga en el PC el valor 0000000000NNN000 ó 8 x n, el cual es la dirección de la primera instrucción de la RSI o de una instrucción de salto a ésta.

Tabla.8.3. Vectores de interrupción para las instrucciones RST n.

Instrucción Vector de interrupción Instrucción Vector de interrupciónRST0 0000H RST4 0020H RST1 0008H RST5 0028H RST2 0010H RST6 0030H RST3 0018H RST7 0038H

Page 469: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

450

Un circuito que permite cargar en el bus de datos cualquiera de las instruccio-

nes RST n cuando la línea INTA esté en nivel cero se muestra en la figura 8.18. La lógica consiste de ocho buffers de tres estados del tipo 74LS244 y tres interruptores lógicos. El interruptor S permite seleccionar la instrucción RST n (n: 0-7) y la señal INTA habilita los buffers de modo que la instrucción RST n programada pase al bus de datos del µP.

Fig.8.18. Interconexión de una RST n al 8085.

Debido a que la instrucción RESTART sólo salva en la pila el contenido del

contador de programa, es responsabilidad del programador incluir al inicio de la RSI las instrucciones PUSH necesarias para preservar el contenido de los registros que van a ser modificados, los cuales deben ser recuperadas con POP al culminar la RSI. La rutina de servicio de interrupción debe terminar con una instrucción RET para

Page 470: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

451

reasumir el programa principal y ésta debe estar precedida por una EI para habilitar de nuevo las interrupciones enmascarables, las cuales fueron inhibidas por el proceso de interrupción previo.

A continuación se expone un ejemplo del modo de operación de un puerto de

entrada con interrupción.

Ejemplo 8.2 La figura 8.19 muestra el diagrama eléctrico de un circuito de conversión ana-

lógico digital ADC0804 conectado al microprocesador 8085. Cuando el dispositivo finaliza el proceso de conversión de una muestra de la entrada analógica Ve, activa a nivel bajo la salida de fin de conversión del conversor A/D INTR , e interrumpe al procesador al aplicar un nivel alto a la entrada de interrupción INTR. El latch mantie-ne a INTR en uno hasta cuando el CPU reconoce la interrupción, instante cuando la salida INTA inicia a cero el biestable. Se debe escribir un programa que maneje el puerto del ADC y cargue 16 datos partir de la dirección de memoria 2000H.

;----------------------------------------------------------------------------------------------------------- ; Ejemplo 8.2 ;----------------------------------------------------------------------------------------------------------- jmp inicio org 28H ; vector de interrupción de RST 5 rst5: jmp leer_dato ; salto a rutina de servicio de interrupción org 100h inicio: lxi h,dat ; inicio de zona de almacenamiento de datos mvi b,17 ; contador de datos ret_int: lxi sp,b_stack dcr b jz proceso out puerto_adc ; iniciar conversión ei ; habilitar interrupciones hlt ; esperar interrupción proceso: ; procesamiento de los ; datos adquiridos ; . ; . ; . leer_dato: in puerto_adc ; leer valor desde ADC mov m,a ; cargar dato en memoria inx h ; próxima posición jmp ret_int ; muestra siguiente end

En las aplicaciones usuales de interrupciones, el µP está ejecutando una sec-ción de código y en cualquier momento es interrumpido por un periférico. Luego de atender al dispositivo externo, el procesador retorna a ejecutar el programa que proce-

Page 471: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

452

saba antes de ser interrumpido. En este ejemplo, la CPU inicia el proceso de conver-sión y a continuación espera, sin realizar ninguna acción, por una interrupción. El µP sólo espera por la interrupción y no se requiere código de consulta de una bandera de estado ni una línea de puerto adicional para el bit de estado.

Al inicio, el programa coloca en el registro par HL, la dirección de carga del primer dato e inicia en 17 el contador de datos adquiridos. A continuación, carga el apuntador de pila y prueba si el dato anterior fue el último. Si lo es, ejecutará un códi-go no mostrado para procesar la información obtenida. En caso contrario, se inicia el proceso de conversión de una muestra, habilitando las interrupciones con EI y se lleva al µP a un estado de parada, en espera de la interrupción de fin de conversión. Cuando la línea INTR del conversor cae a cero, se ejecuta una instrucción RST 5 y el control salta a la rutina de lectura del CAD.

Fig.8.19.El ADC0804 interrumpe al µP al final de cada conversión.

La RSI no finaliza con un RET porque el µP retornaría a la siguiente instruc-ción después de HLT y lo que se requiere es adquirir la siguiente muestra o procesar los datos adquiridos. El retorno se realiza a restaurar el valor del apuntador de pila y probar el contador de datos.

Page 472: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

Fig.8.20.El registro de máscaras de interrupción como es puesto por la instrucción SIM.

453

El programa fue simulado con WIN85, como ilustra la figura 8.21. La mayoría de los simuladores detienen la ejecución del programa al ejecutar HLT y no simulan el modo de parada. WIN85, por el contrario, si lo emula, permaneciendo en estado HALT del cual puede ser sacado con una interrupción o con un pulso de RESET.

Interrupciones disparadas por las entradas RST

Cuando el µP reconoce una interrupción provocada por la aplicación de una

señal en las entradas TRAP, RST 7.5, RST 6.5 o RST 5.5, transita a un ciclo de má-quina de bus inactivo durante el cual se genera una instrucción RST n.x interna, la cual provee el vector de interrupción. Durante el ciclo BI no se incrementa el contador de programa. La sólo ejecución de la instrucción EI, no habilita las entradas de interrup-ción RST. Es necesario que previamente se desenmascare la interrupción, usando la instrucción SIM (Set Interrupt Mask).

SIM

Esta instrucción permite que el contenido del acumulador sea usado como indi-

ca la figura 8.20 para programar el registro interno de máscara de interrupciones.

D7 D6 D5 D4 D3 D2 D1 D0

SOD SOE X R7.5 MSE M7.5 M6.5 M5.5 Salida serie

de datos

Habilitación de salida serie

Sin uso

Reset RST7.5

Habilitación de puesta de más-caras.

Máscaras de interrupción

Page 473: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

454

Fig.8.21.Ventana principal de WIN85 mostrando los resultados de la simulación.

Page 474: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

455

Un 1 debe ser cargado en el bit 3 del acumulador para poder poner/quitar la máscara de cualquiera de las entradas de interrupciones RST. Un 1/0 en los bits D0-2 deberá poner/quitar la máscara de la entrada correspondiente. Quitando la máscara se habilita la interrupción correspondiente. Si el bit 4 del acumulador es puesto a 1 antes de ejecutar SIM, se pone en cero el flip flop interno de RST7.5. La salida de este bies-table es puesta a 1 cuando se presenta un flaco positivo a la entrada RST7.5 indepen-dientemente de que la entrada está enmascarada. Este biestable también es puesto en cero cuando se reconoce la interrupción o después de un RESET. La instrucción SIM también carga el bit 7 del acumulador en la salida SOD si el bit 6 está en 1.

La última instrucción asociada al sistema de interrupciones es RIM (Read In-

terrupt Mask), la cual carga en el acumulador el estado del bit de validación de inte-rrupciones, el estado de las máscaras RST y las interrupciones pendientes.

RIM

Carga en el acumulador con las máscaras de las entradas RST, las interrupcio-

nes solicitadas y aún no atendidas, la bandera de habilitación de interrupciones y el estado de la línea SID de entrada serie como indica la figura 8.22.

D7 D6 D5 D4 D3 D2 D1 D0

SID I7.5 I6.5 I5.5 IE M7.5 M6.5 M5.5

Fig.8.22.El registro de máscaras de interrupción como es leído por la instrucción RIM.

Máscaras de interrupción

Bandera de ha- bilitación de in-terrupciones

Interrupciones pendientes

Entrada serie de datos

Page 475: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

456

Cuando las interrupciones están pendientes, pero enmascaradas, puede usarse la instrucción RIM para dar servicio a o a los periféricos que solicitan atención. Si la entrada es RST 7.5 debe ponerse a 1 el bit 4 del acumulador por medio de SIM, antes que sea detectada una nueva solicitud.

Ejemplo 8.3 La figura 8.23 muestra un pulsador conectado a la entrada de interrupción RST

7.5. Escriba un programa que cargue el puerto de salida 20H el número de veces que el pulsador S1 es presionado.

RST7.5

S1

2.2k

220

+5V

10µF74LS14

Fig.8.23.El pulsador S1 dispara la interrupción RST7.5.

;---------------------------------------------------------------------------------------------- ; Ejemplo 8.3 ;----------------------------------------------------------------------------------------------

defseg prog, absolute, start=0 seg prog jmp inicio ;a inicio del programa ;---------------------------------------------------------------------------------------------- ; Rutina de servicio de interrupción ;---------------------------------------------------------------------------------------------- org 3ch ; vector de RST7.5 inr a ; Se incrementa contador de pulsaciones out 20h ; salida al puerto 20H ei ; Se vuelven a habilitar las interrupciones ret ; retorno desde interrupción ;--------------------------------------------------------------------------------------------- ; Programa principal ;--------------------------------------------------------------------------------------------- org 0100h inicio: lxi sp,b_stack

mvi a,0bh ; desenmascara RST7.5 sim ei ; habilita sistema de interrupciones xra a ; el contador se inicia en cero out 20h esper: jmp esper ; espera por interrupción end

Page 476: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

457

Para habilitar la entrada de interrupción es necesario quitar la máscara de inte-rrupción con la secuencia,

mvi a, 00001011b sim ei El bit 3 en uno permite manipular los bits de máscara. El bit 2 en cero quita la

máscara a RST 7.5, mientras que los bits 1 y 0 en uno mantienen RST 6.5 y RST 5.5 enmascaradas. Para completar la habilitación de las interrupciones se ejecuta EI. An-tes del retorno de la RSI se rehabilita el sistema de interrupciones con EI.

El programa fue simulado con WIN85. Observe en la figura 8.24 que el simu-

lador muestra el contenido del puerto directamente en decimal. En la práctica debe usarse una instrucción DAA después del incremento del acumulador para que la cuenta sea en BCD.

Ejemplo 8.4

Debe repetirse el ejemplo anterior, pero con la entrada RST 7.5 enmascarada.

Use la instrucción RIM para detectar una solicitud e interrupción. ;--------------------------------------------------------------------------------------------------------------- ; Ejemplo 8.4 ;---------------------------------------------------------------------------------------------------------------

defseg prog, absolute, start=0 seg prog org 0100h mvi b,0 contar: rim ; leer registro de máscaras de interrupciones ani 40h ; ocultar todos los bits excepto el de RST7.5 pendiente jz contar ; no hay interrupción pendiente, esperar inr b ; se activo el pulsador y se incrementa contador. mov a,b ; out 20h ; salida al puerto 20H mvi a,10h ; se inicia flip flop que indica flanco detectado en entrada sim ; RST7.5 jmp contar ; a esperar por interrupción end ;--------------------------------------------------------------------------------------------------------------- En este caso las interrupciones no se habilitan, de modo que las solicitudes al

µP son ignoradas. Sin embargo, usando RIM puede detectarse si se ha realizado una petición en cualquiera de las entradas RST. Cuando esto ocurre puede brindarse aten-ción al dispositivo en una forma similar a la técnica de consultas. Debido a que el flip flop interno de RST 7.5 es puesto a 1 cuando se aplica un flanco positivo a esta en-trada, el programador debe llevar a cero este bit usando SIM para que una nueva so-licitud pueda ser detectada. Si las interrupciones hubiesen estado habilitadas la salida de este biestable volvería a cero, al ser reconocida la interrupción.

Page 477: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

458

Fig.8.24.La instrucción RIM permite atender a periféricos cuando el sistema de interrupciones está deshabilitado.

Page 478: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

459

Ejemplo 8.5 Escribir un código que permita ver en la pantalla del SDA 85, el número de

veces que la tecla Rst 7.5 es presionada.

Fig.8.25.Teclado y pantalla del SDA 85.

• El monitor del SDA 85 tiene en la dirección ROM:003CH un salto a la posición de memoria RAM:0FFB1H. En esta última dirección debe estar la primera instrucción de la RSI.

• La subrutina UPDDT (06D3H) presenta en el campo de datos de la pantalla el byte almacenado

en la dirección 0FFF9H. En un µC como el SDA 85 lo usual es que el controlador de teclado suprima

en forma automática el rebote de contactos de cada una de las teclas. En este caso, el pulsador Rst 7.5 está conectado directamente a la entrada de interrupción RST 7.5, de modo que se produce efecto de rebote, al ser pulsado. Como consecuencia, si se pre-siona está tecla una sola vez se generarán múltiples peticiones de interrupción. El programa de este ejemplo debe garantizar que se produce una solicitud de interrup-ción por cada activación de la tecla Rst7.5.

La solución es que la rutina de servicio de interrupción espere 30 ms (dura-

ción del rebote), a continuación suprima toda interrupción pendiente y finalmente proceda a incrementar el contador.

;--------------------------------------------------------------------------------------------------------------- ; Ejemplo 8.5 ;--------------------------------------------------------------------------------------------------------------- upddt equ addr 06d3h ; dirección de rutina UPDDT cont equ addr 0fff9h ; dirección cuyo contenido muestra UPDDT ;--------------------------------------------------------------------------------------------------------------- ; Programa principal ;--------------------------------------------------------------------------------------------------------------- org 4000h lxi sp,4800h mvi a,0bh ; quitar mascara a RST7.5 sim ei ; habilitar interrupciones

Page 479: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

460

mvi a,0 ; contador se inicia en vero sta cont mvi b,00h ; sin punto decimal call upddt ; presentar contador en campo de datos ocup: jmp ocup ; esperar por interrupción ;--------------------------------------------------------------------------------------------------------------- ; Subrutina de servicio de interrupción. ;--------------------------------------------------------------------------------------------------------------- rst7.5: call rebot ; Suprimir rebote mvi b,00h ; sin punto decimal lda cont ; contador al acumulador inr a ; incrementar contador daa ; cuenta en decimal sta cont ; presentar contador call upddt rim ei ; rehabilitar interrupciones ret ;--------------------------------------------------------------------------------------------------------------- ; Eliminar rebote de tecla Rst7.5 ;--------------------------------------------------------------------------------------------------------------- rebot: call ret30ms ;Esperar 30 ms mvi a,10h ;Suprimir interrupciones no deseadas sim ;Limpiando el FF RST 7.5 mvi a,0bh sim ;Desenmascarar RST7.5 ret ;--------------------------------------------------------------------------------------------------------------- ; Retardo de 30 ms ;--------------------------------------------------------------------------------------------------------------- ret30ms: lxi d,0deah ret30: dcx d mov a,e ora d jnz ret30 ret ;--------------------------------------------------------------------------------------------------------------- ; Vector de interrupción RST 7.5 ;--------------------------------------------------------------------------------------------------------------- org 0ffb1h jmp rst7.5 ;---------------------------------------------------------------------------------------------------------------

Si el efecto de contactos no es eliminado, el contador se incrementará por

cuatro cada vez que se pulse la tecla Rst7.5. Las interrupciones normalmente están asociadas al funcionamiento de circui-

tos de control de tiempo o temporizadores y en casos donde el µP intercambia datos con un periférico o con otro procesador. Estos tópicos se tratan más adelante. Para finalizar el capítulo se presenta un ejemplo que involucra tres eventos, dos de los cuales son controlados por interrupción.

Page 480: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

461

Fig.8.26 La tecla Rst 7.5 se presionó treinta y seis veces.

Page 481: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

462

Ejemplo 8.6 El microcomputador SDA 85 del simulador 8085 Virtual Kit debe ser conver-

tido en un reloj de tiempo real. Esto es que debe presentar la hora del día en su panta-lla de acuerdo con el formato de la figura 8.27.

Fig.8.27.Formato del reloj de 24 horas. El funcionamiento del programa debe ser como se indica a continuación: 1. El reloj presentará continuamente la hora del día en un formato de 24 horas.

2. Pulsando la tecla <RST7.5> del teclado del microcomputador se genera una interrupción

que permite ajustar la hora como se indica.

3. Pulsando la tecla <END> se modifican los minutos.

4. Tecleando de nuevo <END> se presenta la nueva hora.

Como base de tiempo se usará una rutina de retardo de 1 segundo. En la prác-

tica se prefiere aplicar la señal de un oscilador externo de frecuencia estable a una de las entradas de interrupción, para generar el retardo base de 1 segundo. Pero el simu-lador no permite aplicar tal señal a la entrada RST 6.5, al estar conectada a una tecla con efecto de rebote.

Page 482: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

463

Para escribir el programa de reloj digital se usan las rutinas de usuario mos-

tradas en la tabla 8.4. Tabla.8.4.Rutinas de monitor del SDA 85.

Rutina Dirección Descripción OUTPUT

05FCH Presenta en pantalla la cadena de caracteres apuntada por HL. Si (A)=0 se usa el campo de direcciones. Si (A)=1 se usa el campo de datos. Si (B)=0 se muestra el punto decimal. Si (B)=1 sin punto decimal.

RDKBD

0634H Espera la pulsación de una tecla y retorna en el A el código de la tecla. La interrupción RST5.5 debe ser desenmascarada.

UPDAD 06BCH El contenido de las direcciones de memoria FFF7H y

FFF8H se presenta en el campo de direcciones de la pantalla. El registro B controla el punto decimal.

UPDDT

06D3H El byte en la posición FFF9H se presenta en el campo de datos de la pantalla. El registro B controla el punto deci-mal.

El programa ejecutará un programa principal el cual mide y presenta horas, minutos y segundos. Una interrupción RST 7.5 ejecutará una rutina de servicio que permite modificar las horas y los minutos. Esta rutina debe desenmascarar la entrada RST 5.5, para poder leer el teclado.

El programa usa tres contadores en memoria para presentar la hora. Cada vez

que transcurre un segundo, se incrementa el primer contador (SEG). Cuando SEG alcance 60, se pone a cero y se suma uno al contador de minutos (MIN) y cuando MIN llegue a 60, se lleva a cero y se incrementa en uno el contador de horas (HOR). Cuando HOR indique 24, se pone en cero y se reinicia la cuenta. Para simplificar el programa las posiciones de memoria que se usan como contadores son:

MIN 0FFF7H HOR 0FFF8H SEG 0FFF9H Observe que SEG corresponde a la posición cuyo contenido UPDDT presen-

ta en el campo de datos y MIN y HOR son las direcciones cuyos bytes UPDAD muestra en el campo de direcciones. El vector de RST7.5 (003CH) contiene un salto a la posición de memoria RAM: FFB1H. Aquí se inserta un salto a la rutina de servicio pon_hm.

Los diagramas de flujo del programa principal y de la rutina de servicio de in-

terrupción RST 7.5 se muestran en las figuras 8.28 y 8.29 y el listado del código a continuación.

Page 483: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

464

Fig.8.28. Diagrama de flujo del programa principal

Page 484: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

465

Fig.8.29. Rutina de servicio RST 7.5.

Page 485: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

466

;*************************************************************************** ; Programa reloj digital ;*************************************************************************** output equ addr 5fch rdkbd equ addr 634h updad equ addr 6bch upddt equ addr 6d3h seg: equ addr 0fff9h hor: equ addr 0fff8h min: equ addr 0fff7h ;*************************************************************************** ; Programa principal ;*************************************************************************** .code org 4000h xra a sta seg ; inicio en 00:00:00 sta min sta hor inicio: lxi sp, 5000h mvi a,0bh ; desenmascarar interrupción RST7.5 sim ei ; habilitar interrupciones call upddt ; presentar segundos call updad ; presesentar horas-minutos call ret1s ; esperar un segundo mvi b,2 ; contador para control de seg-min lxi h,seg ; apuntar segundos inc_min: mov a,m ; cargar en acumulador seg/min anterior inr a ; incrementar seg/min daa ; cuenta en decimal mov m,a ; actualizar seg/min cpi 60h ; comparar con 60 jc inicio ; si menor presentar hh:min:seg mvi m,0 ; si mayor seg/min a cero dcx h dcx h ; apuntar min dcr b jnz inc_min ; incrementar minutos inx h ; apuntar hora inx h inx h mov a,m ; cargar hora anterior en el acumulador inr a ; incrementar hora daa ; contador decimal mov m,a ; actualizar hora cpi 24h ; comparar con 24 jc inicio ; si menor presentar hh:min:seg mvi m,0 ; si mayor hor a cero jmp inicio ; presentar hh:min:seg ;***************************************************************************

Page 486: Microprocesadores-Luis Urdaneta

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

Page 487: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

468

ret ;*************************************************************************** ; Rutina de retardo de 1 segundo ;*************************************************************************** ret1s: push b push d push psw mvi b,3 ret2: lxi d,09aeah ret1: dcx d mov a,e ora d jnz ret1 dcr b jnz ret2 pop psw pop d pop b ret ;*************************************************************************** ; Mensajes ;*************************************************************************** msj_h: db 10 ;A db 25 ;r db 27 ;o db 16 ;H msj_m: db 28 ;u db 26 ;n db 29 ;i db 24 ;M ;*************************************************************************** ; Vector de interrupción RST7.5 ;*************************************************************************** org 0ffb1h jmp pon_hm ; salto a rutina de servicio

El programa anterior fue simulado usando el 8085 Virtual Kit y funcionó co-mo se esperaba. Otra solución para el ejemplo del reloj es usar una base de tiempo externa. La señal maestra puede también derivarse de la red de 60 Hz como ilustra el circuito de la figura 8.31 y se aplica a la entrada de interrupción RST6.5. El circuito no está aislado de la línea de potencia. La onda seno es rectificada y aplicada a un disparador de Schmitt obteniéndose una señal de variación rápida, frecuencia 60 Hz y nivel TTL. El código para ésta versión del reloj fue escrito para el microcomputador real MPR-85 PLUS, debido a las dificultades presentes para la simulación. Este µC es una tarjeta de desarrollo de bajo costo pero de gran utilidad. Las rutinas de usuario se ejecutan usando la secuencia de código:

mvi a,n ; n es el número de la rutina de monitor rst 7

Page 488: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

469

Fig.8.30. El SDA 85 ejecutando el programa de reloj digital.

Page 489: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

470

Fig.8.31. La salida del circuito se aplica a las entradas RST 6.5 y SID del 8085A.

Para escribir el programa de reloj para el MPR-85 PLUS se usan las rutinas de usuario mostradas en la tabla 8.5.

Tabla.8.5.Rutinas de monitor del MPR-85 PLUS.

Rutina Descripción

9

Presenta en pantalla el caracter cuyo código de 7-segmentos esté cargado en el registro C. El número del indicador donde se presentará el carácter lo indica el valor en el registro B. L0 L1 L2 L3 L4 L5

10

El contenido del registro par HL o L se presenta en pan-talla. C=(00) L en campo de datos. C=(10) L en campo de datos con punto decimal C=(01) HL en campo de direcciones. C=(11) HL en campo de direcciones con punto decimal

12

Espera la pulsación de una tecla y retorna en el A la posición de la tecla.

Debido a que la entrada RST 6.5 es sensible a nivel, la subrutina de servicio

espera que el pulso de solicitud conmute a nivel bajo antes de habilitar las interrup-ciones y retornar desde la rutina de servicio a esta entrada. Esto se logra examinando la entrada SID por medio de la instrucción RIM. Se usan 4 posiciones consecutivas de memoria como contadores:

RED 1/60 SEG segundos MIN minutos HOR horas

Page 490: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

471

Cada vez que se ejecuta la subrutina de la interrupción RST6.5 se incrementa el primer contador (RED) y este se usa para dividir la frecuencia de la red por 60, de modo que cuando RED llegue 60 se incremente en 1 el contador de segundos (SEG), iniciándose la cuenta.

La interrupciones generan un salto al área de memoria 4000H-40FFH, la cual

está reservada por el programa monitor El vector de RST6.5 (0034H) contiene un salto a la RAM: 4004H., aquí se inserta un salto a la rutina de servicio medir. El vec-tor de RST7.5 (003CH) provee un salto a la dirección de memoria RAM: 4006H, desde donde se transfiere el control del programa a salto a la rutina de servicio pon_hm.

El programa se carga en la RAM de usuario a partir de la dirección 6002H.

Para simplificar el código se escribe una rutina escrb_cad, la cual presenta en pantalla la cadena de caracteres apuntada por el registro par HL: si B = (00), en el campo de direcciones y si B = (01), en el campo de datos. El listado de la rutina se muestra a continuación:

;-------------------------------------------- ; Rutina ESCRB_CAD ;-------------------------------------------- escrb_cad: push b push d push psw mov a,b ani 1 jnz camp_dat mvi b,0 mvi d,4 jmp escr camp_dat: mvi b,4 mvi d,6 escr: mov c,m mvi a,9 rst 7 inx h inr b mov a,b cmp d jnz escr pop psw pop d pop b ret

Del manual de usuario del MPR-85 se extrajeron los códigos de los caracteres

a presentar, estos son: A 77H H 76H I 13H M 37H n 54H O 3FH r 50H U 3EH

Page 491: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

472

El programa del reloj digital es el siguiente:

;************************************************************************* ; Programa reloj digital para MPR-85 PLUS ;************************************************************************* flecha equ ; Tecla (↓) ¿A equ 77h ; Letra A H equ 76h ; Letra H I equ 13h ; Letra I M equ 37h ; Letra M n equ 54h ; Letra n 0 equ 3fH ; Letra O (cero) r equ 50h ; Letra r U equ 3eh ; Letra U ;************************************************************************* ; Vectores de interrupción ;************************************************************************* org 4004 h jmp medir ; salto a rutina de servicio para medir tiempo org 4006 h jmp pon_hm ; A rutina de servicio RST7.5 para ajustar hor/min ;************************************************************************* ;************************************************************************* ; Programa principal ;************************************************************************* org 6002h inicio: lxi sp,6500h mvi a,8 ; Se desenmascaran las interrupciones sim ei ; Se habilitan las interrupciones phm: lhld seg ; A registro L contador de segundos mvi c,0 ; Se presentan segundos en campo de datos mvi a,0ah rst 7 lhld min ; cargar en minutos en L y horas en H mvi c,1 ; Presentar en campo de direcciones mvi a,0ah

rst 7 jmp inicio ; Presentar hh:mm:ss ;************************************************************************* ;************************************************************************* ; Rutina de servicio RST6.5 ;************************************************************************* medir: push h ; Salvar registros push d push b push psw mvi b,3 ; Se repite el mismo lazo para red, seg y min lxi h,red ; Apuntar a contador red seguir: mov a,m ; Cargar en A: red/seg/min inr a ; Incrementar contador daa ; Cuenta en decimal mov m,a ; Actualizar: red, seg, min cpi 60h ; Comparar con 60

Page 492: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

473

jc sal ; Si menor presentar hh:mm:ss mvi m,0 ; Si llego a 60, cargar 0 en: red/seg/min inx h ; Apuntar contador siguiente dcr b ; Decrementar contador de lazo jnz seguir ; No es cero, seguir con:seg/min mov a,m ; Es cero, al A contador de horas inr a ; incrementar hora daa ; Cuenta en decimal mov m,a ; Actualizar hora cpi 24h ; Comparar con 24 jc sal ; Si menor presentar hh:mm:ss mvi m,0 ; Si es 60, cargar cero en hora sal: rim ; Esperar que RST6.5 sea cero ana a ; habilitar interrupciones jm sal pop psw ; Recuperar registros pop b pop d pop h ei ; Habilitar interrupciones ret ; Retornar ;*************************************************************************** ; Los contadores se inician en cero red: db 0 ; Contador 1/60 seg: db 0 ; Contador de segundos min: db 0 ; Contador de minutos hor: db 0 ; Contador de horas temp: ds 1 ; Almacén temporal ;************************************************************************* ; Rutina de servicio RST7.5 ;************************************************************************* pon_hm: push psw ; Salvar registros push b push d push h mvi a,0eh ; Se enmascaran las interrupciones sim lxi h,msj_h ; Apuntar a mensaje HorA mvi b,0 ; Se usará campo de direcciones call escrb_cad ; Imprimir mensaje HorA lda hor ; Contador hor al acumulador may24: call hm ; Modificar hora cpi 24h ; Comparar hora con 24 jnc may24 ; Es mayor, modificar hora sta hor ; Es menor, actualizar hora lxi h,msj_m ; Apuntar a mensaje MinU mvi b,0 ; Se usará campo de direcciones call escrb_cad ; Imprimir mensaje MinU lda min ; Contador min al acumulador may60: call hm ; Modificar minutos cpi 60h ; comparar con 60 jnc may60 ; Es mayor, modificar minutos sta min ; Es menor, actualizar minutos xra a ; Acumulador a cero

Page 493: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

474

sta red ; Contadores red y seg a cero sta seg pop h ; Recuperar registros pop d pop b pop psw ei ; Habilitar interrupciones ret hm: push h ; Salvar registros push b push d otro: sta temp ; Salvar hor/min mvi c,0 ; Se presentar hor/min mvi a,0ah ; en campo de rst 7 ; datos esper: mvi a,12 ; Esperar tecla rst 7 cpi 0ah ; Comparar con diez jc men_diez ; Es un dígito decimal cpi flecha ; Es mayor que 9, comparar con flecha jz es_flecha ; Es flecha, listo jmp esper ; No es flecha, ni dígito decimal, leer teclado men_diez: mov b,a ; Preservar ultimo dígito decimal lda temp ; Cargar en A hor/min anterior add a ; Suprimir dígito de más peso add a add a add a ora b ; Insertar nuevo dígito decimal jmp otro ; Siguiente valor es_flecha: lda temp ; Nueva hor/min al acumulador pop d ; Recuperar registros pop b pop h ret ; Retornar con nueva hor/min en el A ;************************************************************************** ; Mensajes ;************************************************************************** msj_h: db ?H,o,r,?A msj_m: db ?M,i,n,u ;************************************************************************* En esta sección se han mostrados las ventajas de la técnica de interrupciones

para gestión de entrada y salida. El procesador responde en forma rápida a las solici-tudes. Se gasta menos tiempo en examinar bits de estados y puede eliminar la necesi-dad de rutinas de retardo. La desventaja principal de las interrupciones es que al ser un evento de naturaleza asincrónica no se puede precisar el momento cuando ocu-rren, lo cual hace que los programas de las aplicaciones sean difíciles de depurar. Las rutinas de servicio de interrupción deben tener código extra para asegurar la preser-vación de los registros y banderas de estado con independencia del momento que ocurra la interrupción. Puede ser complicado establecer cuando una determinada in-terrupción debe estar habilitada. Si la velocidad de transferencia es muy alta, el uso

Page 494: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

475

de interrupciones puede ser ineficiente o imposible de realizar. Finalmente, en algu-nos casos puede requerirse circuitos adicionales para el control de las interrupciones.

8.2.2 El controlador de interrupciones 8259A

En aplicaciones complejas que requieran el uso de un número de entradas de interrupciones superior a las del procesador, puede usarse un circuito LSI controlador de interrupciones 8259A, el cual se encarga de administrar hasta ocho líneas de soli-citudes de interrupción e informar al procesador, aplicando su salida INT a la entrada INTR del µP, cuando un periférico necesita servicio. Es posible conectar varios 8259A en cascada para aumentar el número de fuentes de interrupción hasta 64. Las cuatro funciones más relevantes del controlador son:

• Recibe solicitudes de interrupción de 8 fuentes.

• Asigna las prioridades y controla la cola de solicitudes simultáneas.

• Pone la máscara a interrupciones por solicitud del programa.

• Genera una señal de interrupción aplicada a la entrada INTR y cuando la salida INTA del µP se activa, coloca sobre el bus de datos una instrucción CALL dirección, con la dirección programada por el usuario.

Hasta los PC diseñados con microprocesadores 80486, el sistema incluía al

menos dos 8259A en cascada para controlar la única entrada de interrupción INTR del procesador. La otra entrada de interrupción NMI es similar a TRAP. A partir del Pentium se incorporó dentro del chip un controlador local de interrupciones APIC (Advanced Programmable Interrupt Controller) compatible con el 8259A. La figura 8.32 muestra el diagrama funcional y la distribución de terminales del 8259A.

Fig.8.32. El controlador de interrupciones 8259A.

Page 495: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

476

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8259A VCC

GND + 5 V Tierra

CS Un nivel bajo en este terminal permite la comunicación entre el µP y el 8259A.

WR Cuando CS está activo, un cero en esta entrada autoriza al 8259A para aceptar comandos desde el µP.

RD Cuando CS está activo, un cero en esta entrada habilita al 8259A para colocar información de estado en el bus de datos del sistema.

D0-D7 Es el bus de datos bidireccional por medio del cual se transfieren comandos, información de estados y los vectores de interrupción.

CAS0-CAS2

Líneas de cascada que permiten controlar una estructura multinivel de 8259s. Son salidas para el dispositivo maestro y entradas para los esclavos.

ENSP/

Terminal con doble función. Cuando se usa en sistemas grandes que requieren el uso de buffers en el

bus de datos, puede ser usado como salida EN para habilitar los buffers. Cuando se usa el modo sin buffers es una entrada de identificación de maestro ( =1) o de esclavo ( =0). SP SP SP

INT

Salida usada para interrumpir al µP. Se activa a nivel alto cuando se realiza una solicitud válida de interrupción. Debe conectarse a la entrada de interrupción del CPU.

IR0-IR7

Son líneas de solicitudes de interrupción. En el modo de disparo por flanco, se conmuta la entrada de 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.

INTA Entrada de reconocimiento de interrupción. Habilita al 8259ª para cargar en el bus de datos el vector de

interrupción por medio de una secuencia de pulsos INTA suministrados por el µP. A0 En conjunto con las entradas CS , WR y RD conforman un código que permite al µP escribir

comandos y leer información de estado de los registros del controlador. Usualmente se conecta a la salida A0 del 8085A.

Interconexión con el sistema 8085A.

El 8259A se conecta fácilmente a un sistema 8085A como ilustra la figura

8.33. El controlador se conecta al puerto 40H y la entrada ENSP/ se lleva a nivel alto para indicar que el dispositivo es un maestro.

Los pasos de la secuencia de interrupción son los siguientes:

• Uno o varias de las líneas IR0-7 conmutan a nivel alto, activando el bit correspondiente en el registro de solicitud de interrupción IRR (Interrupt Request Register). Este re-gistro almacena todos los niveles de interrupción que han solicitado servicio.

• Si es procedente el 8259A genera una señal activa en alto en la salida INT para inte-

rrumpir al µP. • El CPU reconoce la solicitud y activa la salida INTA . • Al recibir el pulso INTA , el bit de más alta prioridad del registro ISR (In Service Re-

gister) es puesto. El ISR almacena todos los niveles de interrupción que están siendo atendidos. Simultáneamente el bit correspondiente del IRR es llevado a cero. Tam-bién, el 8259A carga en el bus de datos el código de una instrucción CALL dirección.

• La instrucción CALL libera dos pulsos INTA adicionales, el primero de los cuales

causa que el controlador coloque en el bus de datos el byte menos significativo de la

Page 496: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

477

dirección preprogramada de la rutina de servicio de interrupción. El segundo INTA permite la carga de los ocho bits de orden alto de la dirección de la RSI.

• Con esto se completa la carga de los tres bytes de la instrucción CALL dirección. Si el

controlador funciona en el modo de fin automático de interrupción (AEOI), el bit ISR es cargado con cero al final del tercer pulso INTA . En caso contrario, el bit del ISR permanecerá en uno hasta cuando un comando EOI sea ejecutado al final de la se-cuencia de interrupción.

Fig.8.33. Interconexión de un controlador de interrupciones 8259A con el µP 8085A. Direcciones de las rutinas de servicio El 8259A suministra la dirección de la rutina de servicio sincronizados por los pulsos INTA generados por el µP, como se expone a continuación:

• Primer pulso INTA :

El código de operación CDH de la instrucción CALL dirección es cargado sobre el bus de datos. El contenido de AD0-7 será el siguiente.

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

1 1 0 0 1 1 0 1

Fig.8.34. Primer byte del vector de interrupción.

Page 497: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

478

• Segundo pulso INTA : Durante este evento se coloca en el bus de datos los ocho bits de menos peso de la rutina de servicio. Los ocho niveles de interrupción generarán CALLs a 8 posiciones de memoria igualmente espaciadas.

Fig.8.35. Segundo byte del vector de interrupción

El número de bytes de espaciamiento entre los vectores de interrupción puede ser selec-cionado por programa entre 4 u 8. Si el intervalo seleccionado es de 4, los bits de dirección A5-A7 son programados por el usuario mientras que A0-A4 son insertados por el controlador. Cuando el intervalo es 8, A6-A7 son programados por el usuario mientras que A0-A5 son implantados por el 8259A. La figura 8.40 muestra los bits a programar del byte bajo de la dirección de la RSI, De acuerdo con el intervalo seleccionado.

• Tercer pulso INTA :

El byte de orden alto de la dirección de la RSI se carga en el bus de datos. Este byte es programado previamente por el usuario en la secuencia de inicio.

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

A15 A14 A13 A12 A11 A10 A9 A8

Fig.8.36 Tercer byte del vector de interrupción.

El diagrama de tiempos de la secuencia de INTA se muestra en la figura 8.37.

Varios controladores 8259A pueden conectarse en cascada para aumentar el número de fuentes de interrupción. Con nueve chips se arma una estructura de 64

Page 498: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

479

fuentes de interrupción. En este caso la salida INT del maestro se conecta a la entrada INTR del µP y las salidas INT de cada esclavo se aplican a entradas IR específicas del maestro. De este modo cualquier petición de interrupción proveniente desde un esclavo es primero notificada al maestro, el cual se encarga de iniciar la secuencia de interrupción. Si los 8259s están correctamente programados, durante el primer pulso el maestro debe colocar el código de operación la instrucción CALL en el bus de da-tos y depositar en las líneas C0-C2 la identificación del esclavo que realizó la solicitud de interrupción. El control es tomado entonces por el esclavo, el cual se encarga de cargar en el bus de datos el vector de interrupción correspondiente.

Fig.8.37 La señal INTA sincroniza la carga sobre el bus de datos de la instrucción CALL dir

Programación del 8259A

Al contrario de otros dispositivos LSI de E/S, el 8259A debe ser programado antes de ser utilizado. Esto se logra usando las palabras de órdenes de inicio ICWs (Initialization Command Words), las cuales consisten de una secuencia de 2 a 4 bytes que se cargan en el dispositivo bajo la sincronización de WR . Una vez inicializado por las ICWS, el 8259A entra, por defecto, en operación en un modo denominado completamente jerarquizado en el cual se asigna la mayor prioridad a la entrada IR0 y menor prioridad a IR7. Este esquema de prioridades alcanza a los chips conectados en cascada.

Un nuevo modo de operación puede asignarse al controlador en funciona-

miento por medio de las palabras de órdenes de operación OCWs (Operacional Command Words). Estos modos son:

1. Modo completamente jerarquizado:

A IR0 se la asigna la mayor prioridad y a IR7, la menor.

Page 499: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

Fig.8.38 Formato de ICW1 e ICW2.

Cuando una orden es dada al controlador con A0 igual cero y D4 en uno, como

ilustra la figura 8.38, se interpreta como ICW1, la cual arranca la secuencia de inicio.

480

2. Modo con prioridad igual rotante:

Todos los dispositivos tienen la misma prioridad, a la interrupción en ejecución se le asig-na la menor prioridad una vez culminada la ejecución de su RSI.

3. Modo con prioridad especificada rotante:

La prioridad puede ser asignada una vez ejecutada la RSI. 4. Modo básico de máscara:

Cualquiera de las ocho entradas IR pueden ser enmascaradas.

5. Modo especial de máscara:

Permite que una interrupción de prioridad más baja interrumpa una interrupción de una prioridad más alta

6. Modo de consulta:

En este modo la línea de salida INT no se utiliza. En lugar un puerto de estado que puede ser consultado proporciona a una indicación de cual interrupción ha ocurrido.

Palabras de órdenes de inicio

En la figura 8.39 se presentan los formatos de las cuatro palabras de órde-nes de inicio. Las dos primeras ICW1 – ICW2 son obligatorias mientras que las otras son opcionales. Palabras ICW1 e ICW2

Page 500: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

481

Fig.8.39 Formatos de palabra de los comandos de inicialización.

Page 501: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

482

El bit ADI selecciona el espaciamiento entre las instrucciones CALL genera-das por cada solicitud de interrupción. Un valor de 1 selecciona un intervalo de cuatro posiciones de memoria y un valor 0 de ocho localizaciones. Los bits A5-7 fijan el va-lor del byte bajo del vector de interrupción según indica la tabla de la figura 8.35. El byte alto de la dirección de salto A8-15 es programado por el usuario por medio de ICW2, la cual se aplica con A0 igual a 1. LTIM en 1 deshabilita la lógica de detección de flanco y las entradas IR serán disparadas por nivel. Si SNGL está en 1, existe un solo 8259A y no será necesario programar la palabra de inicio ICW3, la cual define el modo de cascada cuando SNLG es 0. El bit IC4 de ICW1 se pone a 0 cuando no es necesario usar ICW4, en caso contrario debe ir a 1.

Ejemplo: ICW1 = 16H = 0 0 0 1 0 1 1 0 ICW2 = 10H = 0 0 0 1 0 0 0 0 Vectores de interrupción a partir de 1000H (IR0). Disparo por flanco. Intervalo de 4. Un solo chip Sin ICW4. Después de programar esta secuencia, el 8259A puede ser usado en una estructura de un con-trolador operando en el modo completamente jerarquizado.

Palabra ICW3

Es aceptada cuando existe más de un controlador en la estructura de interrup-

ción, lo cual significa que fue programado en el modo cascada (ICW1, SNGL es 0). La función de los bits de ICW3 varía si el controlador a programar es el maestro o un esclavo.

Si el dispositivo es un maestro, porque el terminal EN/SP es llevado a uno o

en el modo con acoplador cuando M/S = 1 en ICW4, los bits S0-7 permiten indicar cuales entradas IR del maestro tiene salidas INT de esclavos conectadas a éstas. Si un esclavo se conecta a la entrada IR5, entonces el bit S5 debe ser puesto a 1. Si el dispo-sitivo es un esclavo, porque el terminal EN/SP es llevado a 0 en el modo con aco-plador cuando M/S = 0 en ICW4, los bits ID0-2 identifican al esclavo. Para el ejemplo anterior, ID2 = 1, ID1 = 0, ID0 = 1 para establecer que este esclavo está conectado a la entrada IR5 del maestro.

Palabra ICW4

Procede si el bit IC4 de ICW1 fue programado como 1. Esta palabra permite

seleccionar varios modos de operación. La función de los bits son las siguientes:

Page 502: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

483

µPM: Es puesto a 0 para uso en sistemas 80/85. En 1 selecciona el modo MCS-86-88. AEOI: Cuando está en 1 selecciona el modo de fin automático de interrupción. Cuando es

puesto a 0, un comando EOI (End Of Interrupt) debe ejecutarse al final de la RSI. Estos son comandos aplicados con palabras OWCs para notificar al 8259A la cul-minación de la rutina de servicio de interrupción.

M/S: Se usa en conjunto con el modo con acoplador. Este modo se utiliza en sistemas

grandes donde se requiere acopladores bidireccionales para el bus de datos. En ese caso el terminal EN/SP se usa para habilitar los acopladores y M/S se usa para establecer cuando el controlador es un maestro o un esclavo. Cuando M/S es 1, el 8259A opera como maestro y como esclavo cuando M/S es 0. Si no se pro-grama el modo con acoplador, el estado de este bit no es considerado.

BUF: Si este bit es puesto a 1 se programa el modo con acoplador y el terminal

EN/SP se usa para habilitar los acopladores bidireccionales. Si por el contrario,

BUF es puesto a 0 no se selecciona el modo con acoplador y EN/SP establece si el dispositivo opera como maestro o esclavo. En el caso que no se use ICW4 tam-bién EN/PS define operación como maestro o esclavo.

SFNM: Permite tener una verdadera estructura completamente jerarquizada entre las en-

tradas IR de los esclavos cuando se opera en cascada. Si este bit es 1 se selecciona un modo especial completamente jerarquizado, si es 0 este modo no es selecciona-do. Sólo el maestro deberá ser programado en este modo. La necesidad de este modo especial se debe a que si un esclavo recibe una interrupción de mayor priori-dad que aquella que está siendo atendida (generada a través del mismo esclavo), está no será reconocida por el maestro. Esto se debe a que el bit ISR de la interrup-ción servida está en 1, ignorándose toda solicitud de igual o mayor prioridad. De modo que la petición de mayor prioridad no será atendida hasta que el bit ISR res-pectivo sea puesto a cero por un comando EOI ejecutado al final de la RSI de me-nor prioridad. Usando el modo especial completamente jerarquizado el maestro so-lo ignorará solicitudes de menor prioridad que la que esté en servicio y responderá a solicitudes de igual o mayor prioridad. Así, si un esclavo recibe una solicitud de mayor prioridad que la atendida, esta será procesada.

Palabras de órdenes de operación

Luego que el 8259A es iniciado por la secuencia de ICWs, estará listo para operación en el modo completamente jerarquizado. En cualquier momento este modo puede ser cambiado por medio de tres OCWs. La figura 8.40 muestra los formatos de las palabras OCWs disponibles.

Palabra OCW1

Se usa para activar/desactivar los bits de máscaras del registro de máscara de

interrupción IMR. Los bits Mi de OCW1 se usan para controlar la máscara de las en-tradas IR. Si Mi es 1, la entrada IR correspondiente es deshabilitada. Si Mi es cero el canal IRi es habilitada.

Page 503: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

484

Fig.8.40 Formatos de palabra de los comandos de operación.

Page 504: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

485

Fig.8.41 Formato de OCW1.

Palabra OCW2

Permitir definir por medio de los bits R, SL y EOI las operaciones de fin e in-

terrupción, rotación automática y rotación específica. Comandos asociados y las mo-dalidades de estas operaciones (exceptuando ICW4, AEOI) se seleccionan usando una combinación de los bits de OCW2.

Fig.8.42 Formato de OCW2.

La definición de los bits de OCW2 son las siguientes: L0-L2: Especifican, cuando el bit SL está en 1, el nivel de interrupción (0-7) para la opera-

ción seleccionada por R, SL y EOI,. EOI: Se usa para toda orden de final de interrupción (excepto el modo AEOI). Cuando

está en 1, una forma del comando de fin de interrupción será ejecutado dependien-do del estado de R y SL. Si EOI es 0, no se ejecutará una orden de fin de interrup-ción.

SL: Especifica un nivel de interrupción para una operación determinada. Cuando es 1,

los bits L0-2 son habilitados y la operación seleccionada por los bits EOI y R será ejecutada sobre el nivel de interrupción indicado. Cuando SL es 0, los bits L0-2 son deshabilitados.

R: Controla las operaciones de rotación del 8259A. Si R está en 1, una forma de rota-

ción de prioridad será ejecutada dependiendo del estado de los bits SL y EOI. Si R es cero no se ejecuta la rotación.

Palabra OCW3

Es usada para determinar el estado del proceso de interrupción y para selec-cionar el modo especial de enmascaramiento. La función de cada bit de OWC3 se indica a continuación:

Fig.8.43 Formato de OCW3.

Page 505: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

486

RIS: Se usa para especificar el registro comando a leer entre el ISR (cuando RIS está en 1) y el IRR (cuando RIS es 0). El estado del bit RIS se considera si el bit RR es 1.

RR: Cuando es puesto a 1 indica que el registro comando indicado por el bit RIS se va a

leer. Si es 0, no se leerá el registro comando. P: Un nivel 1 en este bit ejecuta un comando de consulta. En el modo de consulta el

CPU deshabilita su entrada de interrupción. El servicio al dispositivo es realizado por programa por medio de un comando de consulta, en el cual se habilita al si-guiente pulso de RD (por medio de una instrucción IN puerto) para leer el valor BCD de la solicitud de mayor prioridad y poner a 1 el bit ISR correspondiente. Pa-ra operar en el modo de consulta una palabra OCW3 deberá ser escrita previo a ca-da lectura

SMM: Se usa para habilitar el modo especial de máscara. Si SMM está en 1, selecciona el

modo especial de máscara, si está en 0 no lo selecciona. El estado de SMM sólo se considera si el bit ESMM está en 1.

ESMM: Habilita (cuando está en 1) o deshabilita (cuando es 0) al bit EMM.

Para completar la presentación del modo de programación se describen algu-

nos modos asociados con las OWCs. Modo completamente jerarquizado

Este es el modo de operación en el cual entra por defecto el 8259A después de

la secuencia de inicio programada usando las ICWs. Las prioridades de las ocho en-tradas IR son asignadas desde la más alta a IR0 hasta la más baja a IR7. Cuando una interrupción es reconocida, la solicitud de mayor prioridad es determinada desde el IRR y su rutina de servicio es ejecutada. Además, el bit correspondiente del registro ISR es activado para señalar la rutina en servicio. Este bit permanecerá activado hasta cuando un comando EOI de fin de interrupción sea ejecutado. Mientras el bit del ISR esté habilitado, solicitudes de servicio de igual o menor prioridad no serán atendidas. Una petición de mayor prioridad generará una interrupción y la ejecución de la rutina de servicio asociada si se ha ejecutado una instrucción EI en la RSI que estaba siendo procesada antes de ocurrir la interrupción de mayor prioridad.

Considere que en el modo totalmente jerarquizado ocurre una interrupción en

la entrada IR5 durante la ejecución del programa principal. Si las interrupciones están habilitadas se ejecutará la rutina de servicio RSI5. Durante la ejecución de RSI5 se produce una solicitud en la entrada IR4 y se mantiene hasta ser reconocida. Como IR4 tiene mayor prioridad que IR5, generará una interrupción en la línea INTR, la cual será reconocida después de la ejecución de EI en la rutina RSI5.

Cuando la solicitud en IR5 es reconocida, el bit ISR5 es activado. Al recono-

cerse la petición en IR4 se activara además ISR4, debido a que ninguna de las dos ruti-nas de servicio se ha completado. Un comando EOI al final de RSI4 deberá desactivar el bit ISR4 para notificar al controlador que la rutina servida ha culminado. La ins-

Page 506: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

487

trucción final RET en RSI4 transfiere el control del programa a la rutina RSI5. En este momento el único bit del registro ISR que permanece activado es el ISR4, el cual será desactivado por el comando EOI al final de RSI5, cuya instrucción RET retornará el programa al programa principal. Esta forma de operación indica que en el modo totalmente jerárquico, el más reciente nivel reconocido y atendido siempre es el de mayor prioridad.

Fin de interrupción

Al completarse una RSI, el 8259A debe ser notificado para que actualice el re-gistro ISR. Esto se realiza con un seguimiento de cuales niveles de interrupción están en proceso y su prioridad relativa. Existen tres tipos de comandos EOI:

1. Comando EOI no especifico. 2. Comando EOI especifico. 3. Modo EOI automático.

Comando EOI no especifico:

Con este comando el programa indica al 8259A cuando la rutina de servicio ha culminado sin especificar el nivel de de la interrupción. El controlador deberá de-terminar el nivel de la interrupción y desactivará el bit ISR correspondiente. El co-mando EOI no específico sólo debe ser usado cuando el último nivel reconocido y servido sea el de mayor prioridad. Cuando el 8259A recibe este comando desactiva el bit ISR de mayor prioridad para indicar la finalización de la rutina de mayor priori-dad entre las que están siendo atendidas. De modo que si se opera en el modo total-mente jerárquico el comando EOI no específico puede ser utilizado.

Ejemplo: OCW2 = 20H = 0 0 1 0 0 0 0 0

Comando EOI especifico:

Contrario al anterior, este comando notifica cuando la RSI de un nivel deter-minado ha culminado. Es decir, este comando indica el bit del registro ISR que debe ser desactivado. Esta orden se usa en situaciones cuando el controlador no puede determinar el bit ISR que debe ser borrado. Por ejemplo, si la rutina RSI en ejecución cambia las prioridades de los niveles de interrupción y existen otras RSI atendidas, un EOI no específico puede desactivar el bit ISR incorrecto.

Ejemplo: OCW2 = 3xH = 0 0 1 1 0 L2 L1 L0

Page 507: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

488

Modo EOI automático:

Cuando AEOI e 1 en ICW4, se operará en el modo AEOI. La programación de este modo elimina la necesidad de que el programa notifique la culminación de la rutina servida. En su lugar el controlador ejecuta un comando EOI no específico en el flanco de subida del tercer pulso de la señal INTA (modo 80/85). Este comando sólo debe usarse cuando no se requiere una estructura multinivel jerarquizada. Considere que el bit ISR de la rutina en servicio es desactivado inmediatamente después de su reconocimiento de modo que no que da indicación en el ISR de cual RSI está en eje-cución. Si en este momento ocurre una interrupción, está será atendida independien-temente de su prioridad.

Rotación automática-Prioridad igual: Este modo es útil en aplicaciones donde los periféricos atendidos tienen la igual prioridad. Después que un dispositivo es atendido, no se le dará servicio de nuevo hasta cuando, en el peor caso, al resto de igual prioridad, hayan sido asistidos. Esto se logra asignándole la menor prioridad al último periférico atendido. Existen dos formas de rotación automático de acuerdo con su combinación con el comando EOI, estas son: Rotar en comando EOI no específico y Rotar en modo EOI automáti-co. Rotar en comando EOI no específico: Cuando este modo es programado el bit ISR de más prioridad es desactivado, como lo hace un comando EOI no especifico, y al nivel IR se le asigna la menor prioridad. Las prioridades de los otros IR son rotadas para ajustarse al modo completamente jerarquizado con base en la prioridad más baja que fue asignada. Si están en servicio las rutinas RSI5 (prioridad 5) y RS3 (prioridad 3) y en RS3 se ejecuta un comando ro-tar en EOI no especifico entonces el bit ISR3 es desactivado y a IR3 se le asigna la prioridad más baja quedando ISR4 como el nivel de mayor prioridad. Rotar en modo EOI automático: Es similar al anterior, con la diferencia que la rotación de prioridad se realiza de manera automática pasado el tercer pulso de INTA (modo 80/85) de una secuen-cia de interrupción. Se puede entrar en este modo fijando en la palabra OCW2 los bits R SL EOI = 1 0 0 y salir del modo con R SL EOI = 01 0 0. Rotación específica (Prioridad específica) El programa puede modificar las prioridades asignando la más baja. Las res-tantes se asignarán automáticamente: si IRi es la de menor prioridad, entonces IRi+1 será la de mayor prioridad. El comando poner prioridad se programa usando OCW2 por medio de los bits R SL EOI sobre el nivel indicado por L2 L1 L0.

Page 508: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

489

Ejemplo: OCW2 = 6xH = 0 1 1 0 0 L2 L1 L0

Esta horma es independiente del comando EOI también seleccionado por OCW2. Si se desea modificar loa prioridad durante un comando EOI se puede usar el comando rotar en comando EOI específico:

Ejemplo: OCW2 = 7xH = 0 1 1 1 0 L2 L1 L0

Ejemplo 8.7

Escribir el código de inicio y la tabla de saltos (inicio en 1000H) de una es-tructura con un controlador 8259A para ocho niveles de interrupción. El sistema se interconecta como muestra la figura 8.33. Deben usarse las palabras ICW1, ICW2 y OCW2.

;---------------------------------------------------------------------------------------------------------------- ; Ejemplo 8.7 ;---------------------------------------------------------------------------------------------------------------- p8259_A0_0 equ 40H ; puerto del 8259A con A0=0 p8259_A0_1 equ 41H ; puerto del 8259A con A0=1 icw1 equ 16h ; palabra de orden de inicio ; ICW1: A7,A6,A5=0; disparo por flanco; ; intervalo de 4, un solo chip y sin ICW4 icw2 equ 10h ; ICW2: A15-A8=10H. Dirección IR0=1000H ocw2 equ 20h ; Comando EOI no especifico ;---------------------------------------------------------------------------------------------------------------- ; Programa principal ;---------------------------------------------------------------------------------------------------------------- lxi sp,tope_pila ; pila en RWM call inic_8259 ; programar secuencia de inicio del 8259. ; modo totalmente jerarquizado ei . . . ; continúa programa principal . . . ;---------------------------------------------------------------------------------------------------------------- ; Rutina de inicialización del 8259A ;---------------------------------------------------------------------------------------------------------------- inic_8259: mvi a, icw1 out p8259_A0_0 ; Escribir ICW1 mvi a, icw2 out p8259_A0_1 ; Escribir ICW2 ret ;----------------------------------------------------------------------------------------------------------------

Page 509: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

490

Fig.8.44 Cascada de 8259As.

Page 510: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

491

;---------------------------------------------------------------------------------------------------------------- ; Rutina RSI0 ;---------------------------------------------------------------------------------------------------------------- RSI0: push .. ; Preservar registros push .. . . . ei ; rehabilitar interrupciones mvi a,ocw2 out p8259_A0_0 ; Programar EOI no específico pop .. ; Restaurar registros pop .. ret ; Retornar desde interrupción ;---------------------------------------------------------------------------------------------------------------- ; Se escribe una rutina para cada RSI ;----------------------------------------------------------------------------------------------------------------;Tabla de vectores de interrupción ; --------------------------------------------------------------------------------------------------------------- org 1000h jmp RSI0 ; salto a RSI de IR0 nop jmp RSI1 nop jmp RSI2 nop jmp RSI3 nop jmp RSI4 nop jmp RSI5 nop jmp RSI6 nop jmp RSI7 nop ;---------------------------------------------------------------------------------------------------------------- El 8259A se programa para que el vector de interrupción de IR0 esté en la di-

rección 1000h y los vectores de interrupción estén espaciados 4 posiciones de memo-ria. La tabla de saltos se inicia en 1000H y contiene un salto para cada RSI, ocupando 32 bytes de memoria. La estructura funciona por defecto en el modo completamente jerarquizado de modo que se utiliza un EOI no específico para indicar el fin de la

Page 511: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

492

RSI. Al inicio se habilita el sistema de interrupciones y cada RSI debe habilitarlo de nuevo.

En la figura 8.44 se presenta una estructura de interrupciones con 22 niveles.

Un maestro U1 y dos esclavos U2-3 están conectados en cascada. El terminal EN/SP del maestro se conecta a 5 voltios y los pines EN/SP de loa esclavos se llevan a tie-rra. La salida INT de cada esclavo se aplica a una entrada IR del maestro. Las líneas de control de cascada CAS0-2 del maestro actúan como salidas y se conectan a los terminales correspondientes en los esclavos, donde son entradas. La salida INT del maestro va a la entrada de interrupción INTR del µP y cada 8259A recibe la señal INTA .

Cada controlador debe recibir su propia secuencia de inicio. Para la programa-

ción del modo en cascada se usa la palabra ICW3 en el maestro para indicar cuales de las líneas IR del maestro reciben solicitudes desde la salida INT de los esclavos. A los esclavos se les debe ser identificado con el código de la entrada IR del maestro al cual está conectada su salida INT. La única consideración que se debe tener en estructura donde las IR del maestro no sólo reciben solicitudes de interrupción desde los escla-vos sino que algunas IR aceptan peticiones directamente desde periféricos es que la entrada IR0 desde el maestro no debe usarse para solicitudes desde esclavos. Esto debido a que cuando una entrada IR sin esclavo recibe una solicitud, las líneas CAS0-2 no se activarán permaneciendo el direccionamiento por defecto para IR0 (esclavo IR0). Si un esclavo es conectado a IR0, cuando se genere una interrupción sobre una línea sin esclavo, pueden presentarse fallas. La programación de la rutina de inicio y la tabla de saltos para el arreglo de la figura 8.48 se deja al lector como ejercicio.

8.3 ACCESO DIRECTO A MEMORIA

El DMA es una técnica de entrada y salida en la cual un dispositivo LSI de propósito específico, denominado controlador de DMA, ejecuta toda la operación. Durante una operación de acceso directo a memoria, el microprocesador cede el con-trol de los buses al controlador, el cual transfiere los datos directamente entre el peri-férico y el subsistema de memoria. Para que el controlador transmita bloques de datos deberá suministrar direcciones y señales de control. Por ejemplo, la dirección de me-moria inicial y el número de palabras ha enviar, así como el inicio y final de la opera-ción.

El hecho que el controlador de DMA ejecuta todas las tareas de la transferen-

cia de datos sin intervención del procesador (el hardware sustituye al programa), siendo el tiempo de acceso del circuito de memoria la única restricción para la velo-cidad a la cual se ejecuta la operación; convierten a esta técnica en el modo más rápi-do de ejecutar operaciones de E/S. Las operaciones de DMA no se realizan de una sola vez, más bien el controlador sustrae ciclos de reloj al CPU hasta completar la

Page 512: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

493

transmisión. Usualmente el controlador dispone de varios canales para atender más de un periférico.

Las tareas del controlador durante una operación de DMA son: • Solicitar al procesador el inicio del DMA. • Realizar el control de los buses del sistema de modo que no obstaculicen el funcionamiento

del µP. • Indicar la ubicación y tamaño de los datos a transferir. • Señalar el final de la operación El método DMA más sencillo consiste en usar los ciclos de reloj cuando el µP

no realiza accesos a la memoria. Esta técnica se conoce como robo de ciclos (Cycle stealing) y la CPU puede usar los buses del sistema sin notificar al µP. Pero esta mo-dalidad puede requerir circuitos adicionales para detectar los estados internos durante los cuales la CPU no accede a la memoria. Además este tipo de operaciones de DMA son ocasionales y el tamaño de la transferencia es variable. Un modo más eficiente de realizar DMA es solicitar al µP que ceda al controlador el control de los buses. En un sistema 8085, esto se logra aplicando un nivel alto en la entrada HOLD. Después de finalizar el ciclo de máquina en progreso, la CPU atenderá la solicitud poniendo en estado de alta impedancia las líneas A8-A15, AD0-AD7, RD , WR , e M/IO y sube a nivel alto la salida HLDA para indicar al controlador de DMA que reconoce la peti-ción de DMA. El terminal HLDA se mantiene en alto durante toda la operación.

Fig.8.45 Controlador de DMA 8237 de INTEL.

Page 513: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

494

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8237

CLK Reloj.

CS Entrada de selección de chip.

RESET Inicia los registros de comando, estado, solicitud y los temporales; pone a cero la bande-ra last/first y el contador de registro de modo; el registro de máscara se asigna para igno-rar las solicitudes. El 8237 queda en Ciclo Inactivo.

READY Entrada de solicitud de estados de espera HLDA Reconocimiento de solicitud de DMA. DREQ0-3: Líneas asincrónicas para solicitud de DMA. En el modo de prioridad fija, DREQ0 tiene

la mayor y DREQ3 la menor. Los periféricos solicitan el servicio de DMA en estas lí-neas y esperan a bajarlas hasta el correspondiente DACK. La polaridad de DREQ es programable. Las líneas no usadas deben ser enmascaradas.

DB0-7 Bus de datos. Durante los ciclos de DMA, los 8 bits más significativos de la dirección son cargados en el bus de datos con objeto de ser almacenados en un latch externo con-trolado por ADSTB. En las operaciones memoria-memoria, el bus de datos recibe y envía los bytes a transferir.

IOR I En el ciclo inactivo es una entrada empleada por la CPU para leer los registros de con-trol; en el ciclo activo actúa como línea de salida para que el 8237 controle la lectura de datos de los periféricos.

IOW En el ciclo inactivo es una entrada empleada por la CPU para escribir los registros del 8237; en el ciclo activo actúa como línea de salida para que el 8237 controle la escritura de datos en los periféricos.

EOP End Of Process. Línea bidireccional que informa de la finalización del servicio DMA. El 8237 permite que un ente exterior fuerce el final de un servicio bajando esta línea. El propio 8237 genera un pulso en ella cuando se alcanza un TC (Terminal Count, fin de cuenta) en algún canal, salvo en el modo memoria-memoria del canal 0 (en ese caso, la señal se produce al alcanzarse el TC del canal 1). Esta patilla está conectada en el inter-ior del chip a un transistor en colector abierto, por lo que requiere una resistencia exter-na. Cuando llega una señal -EOP, el 8237 finaliza el servicio aunque en el modo de auto-inicialización los registros base volverán a ser escritos en los registros en curso del canal implicado. El canal resulta enmascarado salvo en el caso del modo de autoinicialización.

A0-.A3 A4-A7

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. 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.

Salida parra acceder a la memoria durante la escritura o las transferencias memoria-memoria.

MEMW

Un dispositivo DMA compatible con sistemas basados en el 8085A es el 8237, el cual es un controlador de 4 canales, programables en tres modos, con posibilidad

Page 514: Microprocesadores-Luis Urdaneta

Técnicas de gestión de Entrada y Salida

495

de conexión de varios chips en cascada. El 8237 realiza también transferencias me-moria-memoria, incluyendo llenar un bloque de la memoria con un dato. La interco-nexión con el µP, los modos de funcionamiento y la programación del controlador DMA 8237 no se tratarán en este trabajo. Para mayor información usar la hoja técnica del fabricante.

Page 515: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

496

En este capítulo se presentarán aplicaciones prácticas que usan dispositivos

programables para interconexión de E/S. El modo de operación de tales circuitos es programado al inicio del código y puede ser modificado en cualquier momento. El uso de estos chips simplifica el circuito de interconexión y reduce el número de líneas del programa de control.

En el interior del encapsulado de los dispositivos microcontroladores moder-

nos se integra un grupo de circuitos programables los cuales realizan las funciones mínimas necesarias para resolver una tarea típica de control de complejidad baja. Es-tas funciones son: E/S digital, control de tiempo, conversión D/A y modulación por ancho de pulso. En contraposición, para que un microprocesador pueda ser usado en aplicaciones de control es necesario interconectar a la CPU circuitos LSI externos para que realicen las distintas tareas bajo la dirección del µP. También en caso que los recursos de un microcontrolador no sean suficientes para una aplicación determi-nada, es necesario convertir el µctrl en un microprocesador y conectarle hardware externo.

Aunque estos dispositivos externos pueden ser simples acopladores de tres es-

tados o registros paralelos, el desarrollo de la tecnología del µP introdujo desde hace 30 años un grupo de dispositivos programables para interconexión de E/S, los cuales pueden realizar en forma eficiente cualquier tarea que involucre gestión de E/S. Aun-que cada fabricante de semiconductores (Intel, Motorola y Zilog entre otros) introdu-jo su propio grupo de chips programables durante la década de los setenta. En este capítulo se prestará atención a los circuitos programables diseñados originalmente por INTEL para la serie MCS-80/85, adoptados luego por los sistemas MCS-86/88 y que han sido incorporados, bien sea dentro del µP o en el conjunto de chips, a los moder-nos sistemas Pentium.

DDiissppoossiittiivvooss ddee EE//SS PPrrooggrraammaabblleess

Page 516: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

497

El circuito de interconexión de E/S paralela PPI 8255A, el controlador de inte-

rrupciones PIC 8259A, el USART 8251, el temporizador programable 8253/54 o ver-siones avanzadas de estos componentes son ejemplos de dispositivos que cumplen funciones en sistemas PCs modernos y que son compatibles con sistemas basados en el 8085A. El avance en la tecnología de fabricación de circuitos integrados ha hecho obsoletos a muchos de estos chips (controladores de CRT y de discos). No obstante algunos componentes como el USART 8251A y el PPI 8255A mantienen hoy en día toda su funcionalidad y son usados en aplicaciones con µPs como controladores de periféricos. En el caso del controlador de interrupciones, las funciones del PIC8259A se incorporaron al µP Pentium como una unidad funcional interna. En este capítulo se discutirá el uso de estos chips en ejemplos del mundo real.

9.1 CIRCUITO PARA INTERCONEXIÓN DE PERIFÉRICOS 8255

EL PPI 8255A (Peripheral Interface Programmable) fue diseñado original-mente para µPs INTEL, pero ha siso usado en aplicaciones realizadas con la mayoría de los microprocesadores existentes. El 8255A ofrece 24 terminales de E/S las cuales pueden programarse en dos grupos (A y B) de 12 líneas. El dispositivo puede operar en tres modos diferentes (0, 1 y 2). La figura 9.1 muestra el diagrama de bloques y la distribución de terminales del 8255A.

Fig.9.1. El PPI 8255A.

8255

Page 517: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

498

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8255A

VCC GND

+ 5 V Tierra

CS Un nivel bajo en este terminal permite la comunicación entre el µP y el 8255A.

WR Esta entrada se activa a cero durante una operación de escritura del µP.

RD Entrada activa en cero durante una operación de lectura del µP.

D0-D7 Es el bus de datos bidireccional y tres estados por medio del cual se transfieren comandos y/o datos entre el PPI y el µP.

RESET Un nivel alto en esta entrada inicia el registro de control con todos los puertos en el modo de entrada. A0 –A1 En conjunto con las entradas CS , WR y RD controlan el acceso a uno de los tres puertos de E/S o

al registro de control. Usualmente se conectan a las salidas A0-1 del 8085A. PA0-PA7 Puerto A: Ocho bits de un latch de salida, buffer y un latch de entrada. PB0-PB7 Puerto C : Ocho bits de un latch de salida , buffer y un latch de entrada. PC0-PC7 Puerto C: Ocho bits de un latch de salida, y buffer de entrada. Puede usarse como dos puertos de 4

bits.

Al grupo A pertenecen el puerto A: PA0-PA7 y los cuatro bits más significati-vos del puerto C (PC4-PC7); el grupo B agrupa las ocho líneas del puerto B: PB0-PB7 y los cuatro bits de orden bajo del puerto C (PC0-PC3). Además de los puertos, el 8255A contiene un registro de comandos para la programación del dispositivo. Para que el 8085A pueda tener acceso a uno de los registros para programar el dispositivo, o usar uno de los puertos, la entrada de habilitación CS debe ponerse a nivel bajo. La selección del registro de comando o de un puerto de E/S particular, se realiza por me-dio de las entradas de dirección A0 y A1, según lo indicado por la tabla 9.1.

Tabla. 9.1 Direcciones de los registros internos del PPI 82550

El tipo de operación a realizar es determinado por la activación de una de las

entradas de control: RD o WR . Estas líneas de entrada puede conectarse a los termi-nales de igual nombre del µP o a las salidas de control de lectura y escritura en puer-to de E/S: IORD e IOWR , de acuerdo con el modo que se decodifica la dirección del dispositivo. Las ocho líneas de datos D0-D7 van al bus de direcciones/datos AD0-AD7 y permanecerán en estado de alta impedancia cuando CS no esté activa; o en caso que RD y WR estén ambas en uno, independientemente del estado de CS . La tabla de estados del funcionamiento básico del 8255, se ofrece en la tabla 9.2.

El modo en el cual el PPI se interconecta con la CPU se muestra en la figura

5.21, donde se usa selección lineal para habilitar el 8255A. Cuando al sistema se le

A7 A6 A5 A4 A3 A2 A1 A0

x x x x x x 0 0 Puerto A de E/S x x x x x x 0 1 Puerto B de E/S x x x x x x 1 0 Puerto C de E/S x x x x x x 1 1 Registro de comando

Registro seleccionado Dirección del puerto de E/S

Page 518: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

499

aplica energía, la línea RESET OUT del µP sube a nivel alto y obliga al 8255A a iniciarse con todos los puertos programados como entrada. Si tal configuración no es la deseada para la aplicación, el PPI debe ser reprogramado escribiendo un cierto pa-trón de bits en el registro de comando.

Tabla. 9.2 Operación del PPI 8255A.

9.1.1 Puertos de entrada y salida

El 8255A tiene tres puertos A, B, C de ocho bits, pudiendo dividirse el puerto C en dos registros de E/S de cuatro bits cada uno. Los cuatro puertos se organizan como dos grupos A y B, donde cada grupo es formado por un puerto de ocho bits y otro de cuatro líneas. Como ilustra la figura 9.1, el grupo A está compuesto por el puerto A y el nibble más alto del puerto C. Al grupo B lo forma el puerto B y los cua-tro bits de orden bajo del puerto C.

Grupo A: PA0-7 + PC4-7 Grupo B: PB0-7 + PC0-3

La función de las líneas de cada grupo la fija una palabra de control que se

carga en el registro de comando (A0-1=112), para operación en tres modos diferentes.

9.1.2 Modos de operación del 8255A

El código de la aplicación puede programar los grupos A y B del 8255A para que funcione en uno de tres modos de operación. Estos son:

1. Modo 0 E/S normal. 2. Modo 1 E/S con protocolo de enlace. 3. Modo 2 Transferencia bidireccional.

Page 519: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

500

Modo 0 Los terminales de los puertos A, B y C pueden programarse como entradas o

salidas con retención (sólo las salidas) de los datos. El puerto C puede usarse como dos puertos de 4 bits, con posibilidad de activar/desactivar cualquiera de las líneas individualmente. Son posibles 16 configuraciones diferentes de E/S en este modo. Modo 1

La transferencia desde/hacia los puertos A y B es controlada por un protocolo de enlace usando las líneas del puerto C. Los grupos A y B pueden ser programados en forma independiente para usar el puerto de ocho bits para transferencias controla-das por las cuatros líneas del puerto C del grupo correspondiente. El puerto A y B puede ser entrada o salida, ambas con retención de datos. Los terminales del puerto C respectivo se usan como señales de control o de estado del puerto de ocho bits.

Modo 2

El puerto A puede programarse para transmisión o recepción de datos sobre las mismas líneas. Tanto las entradas como las salidas son retenidas y se usan cinco líneas del puerto para controlar y examinar el estado de la transferencia a través del puerto A.

9.1.3 Programación del 8255A

La palabra escrita en el registro de control es decodificada por la lógica inter-na del dispositivo para establecer cual de dos funciones posibles será realizada. Estas son:

1. Definición de modo de operación. 2. Activación/desactivación de bits del puerto C. Cuando el bit más significativo (D7) de la palabra de control es uno, esta se

interpreta como un byte de definición de modo de operación. El formato de esta pala-bra se muestra en la figura 9.2

Se puede configurar al componente para operación en un modo o en una com-

binación de estos. La figura 9.3 muestra un ejemplo de selección de modo. En este caso los grupos A y B se configuran como entradas/salidas en el modo 0. Si la direc-ción del puerto de control es 0BH y la palabra de control es 91H, el siguiente código realizará la programación de chip.

pctrl_8255 equ 0bh ; Dirección del registro de control mvi a,10010001b ; Dalabra de control al acumulador out pctrl_8255 ; Se programa el dispositivo

Page 520: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

501

Fig. 9.2 Palabra de definición del modo de operación.

Fig. 9.3 Ejemplo de configuración en modo 0.

Page 521: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

502

Cuando el bit D7 de la palabra de control es cero lógico, los circuitos internos del PPI la entienden como una orden de activación/desactivación de uno de los bits del puerto C. El formato de este comando se muestra en la figura 9.4. Esta función se denomina bit set/reset, y permite poner a uno o a cero cualquiera de las líneas del puerto C.

Fig. 9.4 Formato de la palabra de control para activar/desactivar un bit del puerto C.

Suponga que se desea generar un pulso de nivel alto en el terminal 2 del puer-

to C. El siguiente programa realizará la tarea. ;---------------------------------------------------------------------------------------------- pctrl_8255 equ 0bh ; Dirección del registro de control. ; Pulso se inicia en cero mvi a,00000100b ; Palabra de control al acumulador out pctrl_8255 ; Bit 2 a cero, al inicio. ; Poner bit a nivel alto mvi a,00000101b ; Palabra de control al acumulador out pctrl_8255 ; Bit 2 a uno. ; Poner bit a nivel bajo mvi a,00000100b ; Palabra de control al acumulador out pctrl_8255 ; Bit 2 a cero al final del pulso. ;----------------------------------------------------------------------------------------------

Page 522: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

503

9.1.4 Aplicaciones del 8255 A continuación se presentan un grupo de ejemplos prácticos que ilustran el

uso del PPI 8255A en sus diferentes modos de operación.

Operación en el modo 0

La primera aplicación del modo 0 consiste en la interconexión de un teclado al sistema usando un 8255A y la rutina de lectura del teclado.

Ejemplo 9.1

Se debe escribir un programa para la lectura del teclado numérico de la figura

9.5. Cuando se pulse una tecla, debe retornarse su valor en el registro acumulador.

(a) (b) Fig. 9.5 Teclado numérico. a) Aspecto mecánico. b) Símbolo eléctrico.

El teclado de la figura 9.5 se usa para introducir al µC información numérica en representación hexadecimal. El periférico de entrada está formado por 16 pulsado-res conectados en una matriz 4 x 4. La presión de un pulsador conectará la fila donde se encuentra la tecla, con la columna correspondiente.

Las funciones que debe realizar el programa de control de teclado son:

• Detectar la pulsación de una tecla. • Suprimir los rebotes de contactos. • Identificar la tecla. • Generar el código correspondiente. • En forma opcional: proteger al sistema contra pulsaciones simultáneas de teclas distintas. Para conectar el teclado, se usa el puerto C del 8255 funcionando en modo 0.

Las filas del se conectan a los terminales PC0-3 y las columnas a las líneas PC4-7, co-mo indica la figura 9.6. Tanto las filas como las columnas se fuerzan a +5 V por me-dio de resistores.

Page 523: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

504

Fig. 9.6 Un PPI 8255 funciona como puerto para el teclado.

Page 524: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

505

El programa esperará en un lazo hasta que ocurra la pulsación de una tecla. La activación de un pulsador conectará la fila donde éste se ubica con la columna corres-pondiente. A cada elemento de la matriz le corresponde un número para indicar su ubicación y un código que representa el valor de la tecla.

Las teclas se numeran: 0 0, 1 1,…F F. De modo que para este caso, el có-

digo de la tecla se corresponde con su número. Por ejemplo la tecla 6 (número 6) es-tará en la fila 1 columna 2. El algoritmo para determinar el valor de una tecla consis-te en identificar la fila y la columna de la tecla presionada. El número (posición en la matriz) del pulsador viene dado por:

ColumnaladeNColumnasdeNúmeroFilaladeNN +×=

La tecla de valor 6 tendrá como número 1 x 4 + 2 = 6. En este caso el nú-

mero corresponde con el valor. Si el teclado tiene teclas de función será necesario el uso de una tabla, a la cual se entra con el número de la tecla para encontrar el valor correspondiente.

Identificación de la fila:

• PCbajo: Entrada • PCalto: Salida

Fig. 9.7 Identificación de la fila.

Se escribe el patrón de bits 0000 en el puerto PCalto y se procede a leer en el

puerto PCbajo: 1101. El bit 1 estará en nivel bajo debido a que la tecla 6 fue pulsada.

Page 525: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

506

El valor en el acumulador permite identificar la fila a la cual pertenece el pul-sador activado. Identificación de la columna:

• PCbajo: Salida • PCalto: Entrada

Fig. 9.8 Identificación de la columna.

Se escribe el patrón 0000 en el puerto PCbajo y se lee en el puerto PCalto: 1011. El bit 2 estará en cero debido a que la tecla 6 fue pulsada. Una vez identificadas la fila y la columna puede calcularse el número del pulsador como se describe en la página previa.

En la figura 9.9 se muestra el diagrama de flujo del programa tecla, el cual es-

pera por la presión de una tecla y suprime el efecto del rebote del interruptor o una activación falsa por ruido. Si ocurre una pulsación válida, se procede a determinar el número del pulsador como se indicó. El código de la rutina Tecla se presenta a conti-nuación y considera que el 8255 de la figura 9.6 se decodifica en la dirección 0. La posición de la tecla pulsada es cargada en el registro acumulador.

El teclado del ejemplo 9.1 solo permite introducir al sistema números del có-digo hexadecimal. En la práctica, es usual que las aplicaciones requieran teclados con pulsadores de función. Por ejemplo una tecla puede validar un número previamente introducido. Otras pueden permitir: el borrado de la pantalla, el desplazamiento en un menú de opciones, la ejecución de un programa, especificar la dirección de giro de un motor o calcular la raíz cuadrada del valor cargado previamente.

Page 526: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

507

Fig. 9.9 Rutina tecla para detectar activación, eliminar rebote e identificar pulsador.

Page 527: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

508

;---------------------------------------------------------------------------------------------------------------------------; Rutina de lectura de teclado 4x4 ;--------------------------------------------------------------------------------------------------------------------------- palb_ctrl1 equ 91h palb_ctrl2 equ 8ah pc_8255 equ 2 pctrl_8255 equ 3 ;--------------------------------------------------------------------------------------------------------------------------- tecla: mvi a,palb_ctrl1 ;PCL:entrada, PCH:salida out pctrl_8255 mvi a,0fh ; Nibble alto del acumulador a cero out pc_8255 ; Todas las columnas a cero leer: in pc_8255 ; Leer filas ani 0fh ; Poner mascara cpi 0fh jnz leer ; Si tecla pulsada, leer call r20ms ; Teclas liberadas, esperar 20 ms releer: in pc_8255 ; Leer filas ani 0fh ; Poner mascara cpi 0fh ; Detectar tecla pulsada jz releer ; Tecla no pulsada, leer puerto call r20ms ; Tecla pulsada, esperar 20 ms in pc_8255 ; Detectar error por ruido ani 0fh cpi 0fh ; Detectar pulsación falsa jz releer ; Si ruido, leer puerto mov c,a ; Cargar patrón de filas en C mvi a,palb_ctrl2 ; PCL:salida, PCH:entrada out pctrl_8255 mvi a,0f0h ; Todas las filas en cero out pc_8255 in pc_8255 ; Patrón de columnas en A ; Identificar columna mvi b,3 ; Contador de columnas a 3 iden_c: ral ; Desplazar a la izquierda jnc fila ; Si CY=0, en B numero de columna dcr b ; Si CY=1, restar 1 a contador de colum. jmp iden_c ; Volver a desplazar ; Identificar fila fila: mov a,c ; Patrón de filas en acumulador mvi c,0 ; Contador de filas a cero iden_f: rar ; Desplazar a la derecha jnc listo ; Si CY=0, en C numero de fila inr c ; Si CY=1, incrementar contador de filas jmp iden_f ; Desplazar listo: mov a,c ; Numero de fila al acumulador ral ; Numero de la fila x 4 ral ora b ; Sumar número de columna ret ; Número de tecla en registro A

Page 528: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

509

El ejemplo que sigue describe el modo de interconexión al sistema y el pro-grama de control de un teclado con teclas cuyas funciones son especificadas por el diseñador. Ejemplo 9.2

La figura 9.10 presenta un teclado de 20 teclas arregladas en una matriz de 4x5

con cuatro pulsadores de función. Escriba una rutina que lea el teclado y cargue el código de la tecla en el registro acumulador.

Fig. 9.10 Matriz de 20 teclas con cuatro funciones. Debido a la distribución de los pulsadores en la matriz, el número que indica la posición no corresponde con el valor que debe retornar la tecla. Por ejemplo la te-cla número 4 es F4 y la número 5 tiene el valor 4. Esto determina que una vez deter-minada la posición del elemento en la matriz, debe usarse una tabla de búsqueda para encontrar el código correspondiente. También deben usarse cuatro líneas del puerto A para las filas y cinco del puerto B para las columnas. El siguiente código realiza la tarea solicitada en el ejemplo. ;---------------------------------------------------------------------------------------------------------------------------; Sección de programa principal que llama a rutina tecla. ; Con el número del pulsador entra en una tabla de consulta y encuentra el código de la tecla activada y ; lo retorna en el registro acumulador. ;--------------------------------------------------------------------------------------------------------------------------- tope_pila equ 300h ;--------------------------------------------------------------------------------------------------------------------------- lxi sp,tope_pila call tecla lxi h,cod_tecla add l mov l,a mov a,m . . .

Page 529: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

510

;---------------------------------------------------------------------------------------------------------------------------; Tabla de código de tecla ;--------------------------------------------------------------------------------------------------------------------------- cod_tecla: db 00h ; tecla 0 db 01h ; tecla 1 db 02h ; tecla 2 db 03h ; tecla 3 db 10h ; tecla f1 db 04h ; tecla 4 db 05h ; tecla 5 db 06h ; tecla 6 db 07h ; tecla 7 db 11h ; tecla f2 db 08h ; tecla 8 db 09h ; tecla 9 db 0ah ; tecla a db 0bh ; tecla b db 12h ; tecla f3 db 0ch ; tecla c db 0dh ; tecla d db 0eh ; tecla e db 0fh ; tecla f db 13h ; tecla f4 ;---------------------------------------------------------------------------------------------------------------------------; Rutina de lectura de teclado 4x5. Retorna número de tecla en el acumulador ;--------------------------------------------------------------------------------------------------------------------------- palb_ctrl1 equ 91h palb_ctrl2 equ 8ah pa_8255 equ 0 pb_8255 equ 1 pctrl_8255 equ 3 ;--------------------------------------------------------------------------------------------------------------------------- tecla: mvi a, palb_ctrl1 out pctrl_8255 xra a out pb_8255 leer: in pa_8255 ani 1fh cpi 1fh jnz leer call r20ms releer: in in pa_8255 ani 1fh cpi 1fh jz releer call r20ms in pa_8255 ani 1fh cpi 1fh jz releer mov c,a mvi a, palb_ctrl2 out pctrl_8255 xra a

Page 530: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

511

out pa_8255 in pb_8255 mvi b,0 iden_c: rar jnc fila inr b jmp iden_c fila: mov a,c mvi c,0 iden_f: rar jnc listo inr c jmp iden_f listo: mov a,c ral ;Numero de la fila x 5 ral add c add b ;Sumar número de columna ret

Observe que a las cuatro teclas de función se les asigna códigos arbitrarios y diferentes a los dígitos del sistema hexadecimal. Por ejemplo 10H para F1, 11H para F2, 12H para F3 y 13H para F4. Estos valores permiten al programador conocer cual función fue seleccionada en cualquier momento.

Es usual que una aplicación basada en µPs requiera además de periféricos de

entrada algún tipo de dispositivo para exhibición de información. Los sistemas de bajo costo usan módulos LCD o indicadores de siete segmentos. Aún cuando las pan-tallas LCD de 2 a 4 íneas han disminuido en costo y no requieren refrescar continua-mente los datos presentados, los visualizadores con diodos 7-segmentos son de uso difundido en el medio industrial sobre todo cuando la luz ambiental es deficiente. Puede considerarse que la presentación con dispositivos tipo LEDs permanecerá du-rante muchos años como una opción válida para el despliegue de información en sis-temas e instrumentos electrónicos de bajo costo. El ejemplo siguiente ilustra el uso de tales indicadores para exposición de información alfanumérica. Ejemplo 9.3

La figura 9.11 muestra un circuito visualizador de ocho dígitos con indicadores de siete segmentos tipo ánodo común, conectados a un PPI 82C55. Para minimizar el número de líneas de interconexión se usa la técnica de multiplexado de los datos a presentar. Se debe escribir una rutina para el control de exhibidor, mostrando en la pantalla el mensaje: Udo 2005.

Al multiplexar en el tiempo, cada indicador es seleccionado durante un lapso

determinado, pero debido a la persistencia de la imagen en la retina humana, éste apa-renta estar continuamente activado. Los segmentos de todos los LEDs se conectan en ocho líneas comunes y cada dígito se activa a una frecuencia fmux.

Page 531: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

512

Fig. 9.11. Circuito de presentación con ocho caracteres alfanuméricos.

Page 532: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

513

Para una presentación con parpadeo mínimo, la frecuencia de multiplexado debe estar comprendida entre 100 Hz y 1.5 KHz. Esto significa que si los N indicado-res se activan en intervalos Tx de 500 µs, la frecuencia fmux será igual:

x

1T N1000 250 Hz0.5 8

mux

mux

f

f

= =×

El circuito debe estar sincronizado. Esto significa que debe cargarse en el

puerto A del 82C55 (funcionando en modo 0) el complemento del código de 7 seg-mentos del caracter a presentar en un LED y simultáneamente debe aplicarse un nivel bajo, por medio de una línea del puerto B, en la base del transistor que aplica energía al indicador correspondiente. Este proceso se repite para cada dígito, a una frecuencia Nfmux.

Como se observa en la figura 9.11, el puerto A del 82C55 se usa para activar

los segmentos. Para proveer la corriente necesaria para los segmentos se usa un cir-cuito amplificador ULN2003 el cual puede manejar con comodidad corrientes de sa-lida de hasta 500 mA. Debido a que el chip solo tiene siete pares darlington, se usa un transistor discreto Q2N222A para el punto decimal. La selección de dígitos se logra activando con un nivel bajo en el terminal correspondiente del puerto B, uno de los transistores PNP Q2N4405.

La selección de la corriente que debe circular por cada segmento para garanti-

zar una brillantez adecuada ante el observador, depende de distintos factores físicos y humanos. La distancia de observación, el ángulo de visión, la altura del carácter, la iluminación ambiental y la razón de contraste entre el indicador y el color del fondo ambiental son algunos de los parámetros a considerar para fijar el valor adecuado de la corriente por segmento. En nuestro caso se considera que, de acuerdo con las espe-cificaciones del fabricante del indicador, una intensidad de If =10 mA por segmento garantizará un brillo aceptable. La corriente If es provista por los amplificadores del ULN2003 y por el transistor Q2N222A. La corriente que circula por el circuito de colector de los transistores Q2N4405 de manejo de dígito será igual a kIf con k igual al número de segmentos iluminados en el indicador correspondiente.

Debido a que cada LED permanece apagado la mayor parte del tiempo, la co-

rriente promedio que circula por un segmento será mucho menor que 10 mA y en consecuencia la iluminación percibida por el observador será deficiente. Para com-pensar el efecto del multiplexado sobre el nivel de corriente directa, se calcula la re-sistencia Rp de modo el pico de corriente en el segmento produzca una intensidad promedio de 10 mA. La corriente que circula en promedio durante un periodo de mul-tiplexado es:

NI

ITN

TI pico

picof =×=

Page 533: Microprocesadores-Luis Urdaneta

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:

fpico INI ×=

Para calcular el valor del resistor limitador de corriente Rp se usa el circuito de

la figura 9.12 que muestra la trayectoria de la corriente por un segmento de un indi-cador.

Fig. 9.12 Circuito equivalente para el cálculo de Rp.

El transistor Q1 de la figura 9.12 conduce por la aplicación de un nivel bajo en

su base. Esta tensión proviene de una línea del puerto B. El transistor Q2 del par dar-lington del ULN2003 está activado cerrando el camino de la corriente a través del segmento a. Para iluminar un segmento, se aplica un nivel alto a la entrada del ULN2003. El valor del resistor de 510 Ω en la base de Q1 se calcula para que cuando todos los segmentos del indicador estén activados, circule una ICQ1 = 8x80 mA= 640 mA. El VCESATQ1, bajo estas condiciones, es de aproximadamente 600 mV, mientras que la tensión de saturación de Q2 a una corriente de 80 mA, es de 0.8 V. Con estos valores se calcula Rp:

Ω=−−−

=−−−

= 15mA80

V)8.04.26.05(I

VVVV5R

pico

2CEsatQF1CEsatQP

Page 534: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

515

La resistencia en la base del transistor que maneja el punto decimal se calcula de modo que una tensión de 4.6 V en la línea PA7 produzca una intensidad de 80 mA en el circuito de colector del Q2N2222 con una tensión colector-emisor de 0.8 V.

El programa de control para el circuito de la figura 9.11 se muestra a conti-

nuación. Este presenta el mensaje especificado con una frecuencia de multiplexado de 250 Hz. La presentación se inicia por el indicador del extremo derecho.

;---------------------------------------------------------------------------------------------------------------- ; Este programa presenta el mensaje Udo 2005 en ; una pantalla de indicadores de 7-segmentos. ;---------------------------------------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------------------------------------i_stack equ 8fbh ; Inicio de la pila num_dig equ 8 plbr_ctrl equ 80h ;---------------------------------------------------------------------------------------------------------------- ; Definición de segmentos defseg puertos,start=0, class=iospace ; 8255 en dirección 0 defseg stack, start=i_stack ; La pila reside en la RWM defseg progr, class=code, start=0 ;---------------------------------------------------------------------------------------------------------------- ; Puertos del 8255 seg puertos pa_8255 ds 1 ; Salidas a segmentos pb_8255 ds 2 ; Selección de dígitos pctrl_8255 ds 1 ; Puerto de control ;---------------------------------------------------------------------------------------------------------------- ; Los 8 bytes últimos de RWM soportan el stack. seg stack ds 8 t_stack:equ $-1 ; Base de la pila ;---------------------------------------------------------------------------------------------------------------- ; Segmento de código en EPROM seg progr lxi sp,t_stack ; Se inicia el apuntador de pila mvi a,plbr_ctrl ; Palabra de control del 8255 out pctrl_8255 ; Se programan puertos A y B como salidas rep: lxi h,msj ; Registro par H apunta a primer caracter del mensaje call visual ; Presentar mensaje jmp rep ; Repetir por siempre ;----------------------------------------------------------------------------------------------------------------; Rutina visual ;----------------------------------------------------------------------------------------------------------------visual: mvi b,num_dig ; Registro B es el contador de dígitos mvi a,0feh ; Primero se activa el dígito 0 mov c,a ; Salvar patrón de selección de indicador pres: out pb_8255 ; Activar dígito n mov a,m ; Al registro acumulador primer caracter del mensaje xchg ; Salvar dirección del mensaje en registro par DE

Page 535: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

516

lxi h,cod_7seg ; HL apunta al inicio de la tabla de códigos 7-segmentos add l ; Sumar desplazamiento mov l,a mov a,m ; Código de 7-seg al registro acumulador out pa_8255 ; Sacar por puerto A xchg ; Recuperar dirección de caracter del mensaje call r500us ; Esperar 500 µs mov a,c ; Recuperar patrón de selección de dígito rlc ; Se activará el dígito siguiente mov c,a ; Guardar patrón inr l ; Apuntar siguiente caracter del mensaje dcr b ; Contador de caracteres menos 1 jnz pres ; Si no cero, siguiente caracter ret ; Retornar si caracter final. ;---------------------------------------------------------------------------------------------------------------- ; Mensaje ;----------------------------------------------------------------------------------------------------------------msj: db u,?d,o,espac,dos,cero,cero,cinco ;----------------------------------------------------------------------------------------------------------------; Tabla de códigos de siete segmentos ;----------------------------------------------------------------------------------------------------------------cod_7Seg: cero equ $-cod_7Seg db 0f3h db 60h dos equ $-cod_7Seg db 0b5h db 0f4h cuatro equ $-cod_7Seg db 66h cinco equ $-cod_7Seg S equ $-cod_7Seg db 0d6h db 0d7h db 70h ocho equ $-cod_7Seg db 0f7h db 7eh ?A equ $-cod_7Seg db 77h ?B equ $-cod_7Seg db 0c7h ?C equ $-cod_7Seg db 93h ?d equ $-cod_7Seg db 0e5h ?E equ $-cod_7Seg db 97h F equ $-cod_7Seg db 17h g equ $-cod_7Seg db 0f6h ?H equ $-cod_7Seg db 67h ?L equ $-cod_7Seg

Page 536: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

517

db 85h ?M equ $-cod_7Seg db 0e6h n equ $-cod_7Seg db 45h i equ $-cod_7Seg db 20h J equ $-cod_7Seg db 0e1h o equ $-cod_7Seg db 0e4h P equ $-cod_7Seg db 37h q equ $-cod_7Seg db 76h r equ $-cod_7Seg db 05h t equ $-cod_7Seg db 44h u equ $-cod_7Seg db 0Eh ¿ equ $-cod_7Seg db 0a3h _ equ $-cod_7Seg db 80H espac equ $-cod_7Seg db 00h end ;----------------------------------------------------------------------------------------------------------------

Ejemplo 9.4

En este ejemplo se mide y presenta el valor de una tensión continua positiva

en el rango de 0 a +5 V. Se construirá y programará un convertidor análogo digital por aproximaciones sucesivas (AS). El método de AS usa un conversor digital analó-gico y un comparador como ilustra la figura 9.13. El proceso de conversión se realiza en un número de pasos igual al de bits (en este caso ocho) que tenga el CDA.

Fig. 9.13. Convertidor A/D por aproximaciones sucesivas.

Page 537: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

518

Algoritmo: Al inicio del proceso de conversión se aplica a las entradas del CDA un valor digital con el bit más significativo puesto a nivel alto y los bits restantes a cero y se lee la salida del comparador. Un nivel lógico 1/0 indica que la señal de entrada es mayor/menor que la generada por el CDA. El valor lógico de la salida del compara-dor se asigna en la siguiente etapa al bit que se procesa. A continuación se repite el proceso con el siguiente bit y así sucesivamente hasta el menos significativo. El prin-cipio de AS está basado en un método de ensayo y error que aproxima el valor de la señal de entrada a la mitad superior e inferior del rango de representación de cada etapa. En la figura 9.15 se presenta el diagrama de transiciones para un convertidor análogo digital por aproximaciones sucesivas de cuatro bits. Las señales Vo y Vr re-presentan las salidas del circuito comparador y del conversor digital análogo respecti-vamente. La primera sólo puede tomar valores 1 ó 0, según la tensión de entrada sea mayor o menor que la generada por el CDA y la segunda es la tensión generada por este conversor.

Fig.9.14. Circuito del convertidor A/D por aproximaciones sucesivas.

Existen convertidores analógico digital del tipo descrito presentados como un chip en el cual el controlador se realiza por hardware y se integra al encapsulado. En este caso se usa el µP como controlador, conectando un DAC0808 al puerto de salida B (01H) de un 8255A y examinando la salida del comparador LM311 por el bit 7 del puerto de entrada C (02H), como ilustra la figura 9.14. El PPI 8255A funcionará en modo 0 y no se muestra en el diagrama.

EL convertidor D/A tiene una resolución de 8 bits y se configura para entregar

una corriente de salida IOUT desde 0 hasta IFS cuando las entradas A8-1 van desde 00 hasta FFH. El amplificador operacional LM741 a la salida del CDA es un conversor de corriente a voltaje y provee una tensión de salida igual a:

10base10basenREF

S

OUTS

A2565A

2V

V

K6.5IV

×=×=

×=

Page 538: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

519

Fig. 9.15. Diagrama de transiciones para un CAD por aproximaciones sucesivas.

Los objetivos de este ejemplo son: 1 Escribir un programa en ensamblador para obtener el valor binario de la

tensión analógica de entrada Vi usando el µP para resolver el algoritmo de aproximaciones sucesivas.

2 Desarrollar una rutina que convierta el valor binario de Vi en tres dígitos

BCD y los almacene en memoria. 3 Realizar un programa que permita presentar el valor BCD de tres dígitos en

el circuito de exposición visual de la figura 9.16.

Page 539: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

520

Fig. 9.16. Pantalla de tres dígitos con indicadores tipo cátodo común.

El módulo de presentación está formado por un display que contiene tres indi-

cadores de 7 segmentos cátodo común y es especialmente fabricado para uso con la técnica de multiplexado. El circuito usa un decodificador CMOS 4511 para generar el código de 7 segmentos. La frecuencia de multiplexado debe ser 333.33 Hz (1000/3). Solución:

El programa de control para el voltímetro de corriente continua del ejemplo consta de 4 módulos, estos son:

• Programa principal

Configura el 8255A para operar en el modo 0 con los puertos A y B como salidas y el puer-to C como entrada. Llama a la rutina ADC, la cual realiza el algoritmo de consultas sucesivas y retorna el valor digital de la muestra. Convierte el valor del voltaje de entrada desde binario a BCD y lo almacena en memoria. Para la conversión a decimal se usa el hecho que dada la salida A del convertidor A/D, el va-lor del voltaje de entrada es:

10basei A2565V ×=

En representación hexadecimal se tiene:

16basei AH100

5V ×=

Page 540: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

521

Si el resultado de la conversión es 25510 = FFH, entonces el valor del voltaje es:

Volt98.42552565Vi =×=

Un número de 8 bits, al ser multiplicado por 5 ó por 10 siempre producirá un resultado (su-puesto de 12 bits) cuyo dígito más significativo es un número BCD. De modo que bastará ejecutar el producto 5 x FFH = 4FBH para obtener el primer dígito BCD (4) del resultado. El valor FBH es el residuo después de la división por 256. En realidad esta última operación no se realiza sino que el remanente FBH se multiplica por diez, resultando 9CEH. La divi-sión entera de este valor por 256 entrega el dígito BCD (9) de las décimas de voltios y un residuo de C0H. Repitiendo el proceso con el nuevo residuo resulta el valor 80CH y se ob-tienen las centesimas (8) de voltios. Con este algoritmo sencillo puede convertirse el dato entregado por el ADC a un voltaje en BCD.

• Rutina ADC

Realiza el algoritmo de aproximaciones sucesivas y retorna en el registro acumulador la re-presentación digital del voltaje Vi de entrada. Esta técnica pone a 1 el bit más significativo del puerto conectado al convertidor D/A, de modo que la salida del DAC tendrá la tensión de media escala. Este nivel es comparado con el valor del voltaje desconocido de entrada. Si el voltaje de prueba a la salida del CDA es demasiado bajo, el bit es puesto a 1 permanen-temente y se prueba el bit menos significativo siguiente. En caso contrario, el bit más signi-ficativo es puesto a cero y se procede con el próximo. Este proceso continúa tratándose to-dos los bits de izquierda a derecha, hasta el último.

• Rutina POR5

Multiplica por 5 el contenido del registro L y retorna el resultado en el registro par HL. También es llamada para ejecutar el producto por 10. En este caso el valor de 16 bits retor-nado por el programa POR5, se desplaza un bit hacia la izquierda.

• Rutina VISUAL

Es llamada por el programa principal para presentar el valor de la tensión almacenado en BCD en la memoria del sistema. Una subrutina RET1MS genera el retardo de 1ms para fijar la frecuencia de multiplexado deseada. Para disminuir el parpadeo del dígito menos signifi-cativo, el periodo de muestreo del voltaje de entrada se ajusta aproximadamente a 1 segun-do. La rutina de retardo forma parte del mismo módulo que VISUAL. A continuación se presentan el contenido de cada módulo, en el mismo or-

den como se describieron: ;-------------------------------------------------------------------------------------------------------------- $title(Voltímetro DC) ; Modulo de programa principal ;--------------------------------------------------------------------------------------------------------------

public pa_8255,pb_8255,pc_8255,temp,num_dig extern adc,por5,visual

;-------------------------------------------------------------------------------------------------------------- i_stack equ 8500H ; Inicio de la pila i_rwm equ 8000H ; Dirección de inicio de RWM para datos num_dig equ 3 ; Número de indicadores LEDs plbr_ctrl equ 89H ; PA y PB: Salidas PC: Entradas ;--------------------------------------------------------------------------------------------------------------

Page 541: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

522

; Definición de segmentos defseg puertos,start=0, class=iospace ; 8255 en dirección 0 defseg stack, start=i_stack ; La pila reside en la RWM defseg datos, class=data, start=i_rwm ; Datos a partir de 8000H defseg progr, class=code, start=6002H ; Primera posición de RWM de

; usuario en el MPR-85 PLUS ;-------------------------------------------------------------------------------------------------------------- ; Puertos del 8255 seg puertos pa_8255 ds 1 ; Salida de datos BCD y selección de indicadores pb_8255 ds 1 ; Salida a convertidor D/A pc_8255 ds 1 ; Línea PC0 = P2.0, salida del comparador p_ctrl ds 1 ; Puerto de control del 8255 ;-------------------------------------------------------------------------------------------------------------- ; Los 16 bytes últimos de RWM soportan el stack. seg stack ds 10H t_stack:equ $-1 ; Base de la pila ;-------------------------------------------------------------------------------------------------------------- ; Segmento de datos en RWM seg datos temp ds 3 ; Dirección de almacenamiento de valor medido ;-------------------------------------------------------------------------------------------------------------- ; Segmento de código cargado en RWM de usuario del MPR-85 PLUS seg progr lxi sp,t_stack ; Se carga el apuntador de pila mvi a,plbr_ctrl ; Palabra de control al A out p_ctrl ; Se programa el 8255 prpal: call adc ; Adquirir muestra de la entrada mov l,a ; Valor digital de muestra al registro L call por5 ; Se inicia conversión de binario a BCD mov a,h ; Dígito más significativo al A sta temp ; Dígito más significativo a memoria call por5 ; Remanente se multiplica por 10 (x5) dad h ; Resultado se multiplica x2 mov a,h ; Dígito siguiente al A sta temp+1 ; Dígito siguiente a memoria call por5 ; Nuevo residuo x10 (x5) dad h ; Resultado x2 mov a,h ; Dígito menos significativo al A sta temp+2 ; Dígito menos significativo a memoria call visual ; Presentar resultado de la medida jmp prpal ; Buscar muestra siguiente end ;-------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------- ;Rutina ADC ;-------------------------------------------------------------------------------------------------------------- public adc extern pb_8255,pc_8255 defseg progr seg progr adc: lxi b,8000h ; Patrón de media escala en B, registro C a cero mov a,b ; Salvar patrón de media escala.

Page 542: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

523

prob: ora c ; Sumar valor anterior de prueba out pb_8255 ; Valor de prueba al convertidor D/A in pc_8255 ; Se lee salida del comparador. Tp-->0 ani 1 ; Se pone máscara jz alto ; Saltar si valor de prueba es mayor que el ; desconocido mov a,b ; Recuperar valor de prueba actual ora c ; Formar el total hasta ahora mov c,a ; Salvar total alto: mov a,b ; Recuperar último valor de prueba rar ; Desplazar hacia próximo bit menos significativo mov b,a ; Guardar nuevo patrón jnc prob ; Si acarreo es 1, es el último bit mov a,c ; Valor de tensión al registro A ret end ;-------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------- ; Rutina POR5 ;-------------------------------------------------------------------------------------------------------------- public por5 defseg progr seg progr por5: mvi h,0 ; Byte alto de nultiplicando a cero mov d,h ; Multiplicando a registro par DE mov e,l dad h ; Multiplicando x2 dad h ; Multiplicando x2 dad d ; Sumar multiplicando.

; mulx2 + mul x2 + mul = mulx5 ret end ;-------------------------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------------------------- ; Rutina VISUAL ;-------------------------------------------------------------------------------------------------------------- public visual extern temp,pa_8255,num_dig defseg progr seg progr visual: lxi d,327 rep: push d ; Salvar contador de 16 bits mvi b,num_dig ; Número de dígitos al registro B lxi h,temp ; Apuntar digito 1 en memoria mvi c,40h ; Patrón de selección de LED 1 precib: mov a,m ; Dígito n en BCD (D0-D3) al acumulador ora c ; Agregar al acumulador (D4-D6) patrón

; de selección de indicador out pa_8255 ; Salida de código BCD y selección de display call f_mux ; Presentar durante 1/(3 x fmux) mov a,c ; Patrón de selección actual al A rar ; Rotar hacia la derecha

Page 543: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

524

mov c,a ; Patrón de selección de dígito siguiente a C inx h ; Apuntar dirección del caracter siguiente dcr b ; Contador de dígitos -1 jnz precib ; No es el último dígito, continuar pop d ; Último dígito, recuperar contador dcx d ; Contador menos uno mov a,d ; Probar si alcanzó cero ora e jnz rep ; No es cero, seguir presentando muestra ret ; Es 0, retornar en búsqueda de muestra siguiente ;-------------------------------------------------------------------------------------------------------------- ; Rutina de retardo ;-------------------------------------------------------------------------------------------------------------- f_mux: lxi d,80H fmux: dcx d mov a,d ora e jnz fmux ret end ;--------------------------------------------------------------------------------------------------------------

Fig. 9.17. Ventana principal de MICRO-IDE con el proyecto del ejemplo 9.4. Los circuitos de la figuras 9.14 y 916 fueron construidos e interconectados al

µC MPR85-PLUS. Los módulos del proyecto fueron compilados y enlazados usando la herramienta Micro-IDE. El programa ejecutable resultante fue descargado por el

Page 544: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

525

puerto serie del PC en la memoria del MPR-85 PLUS. El diseño fue probado y funcio-nó en forma correcta, presentado en pantalla el valor del voltaje fijado en el potenció-metro. Contrastando la lectura con la de un voltímetro comercial, no se aprecia error alguno. Este ejemplo fue un ejercicio didáctico donde se mostró como pueden usarse circuitos integrados CDA de bajo costo para que, con apoyo de código, puedan reali-zarse funciones más complejas como la conversión analógica digital. En la práctica los voltímetros se construyen con CAD de doble pendiente, los cuales vienen integrados en chips multifunción. Por ejemplo, además de la conversión proveen salidas en BCD e incluso señales y temporización para la pantalla multiplexada.

El modo 0 del PPI 8255A también puede usarse para el control de periféricos

que requieran un protocolo de enlace sin uso de interrupciones. El ejemplo siguiente ilustra el uso del PPI para la interconexión de un sistema 8085A a una impresora para-lela.

Ejemplo 9.5

Realizar la interconexión de una impresora CENTRONICS a un µP8085A

usando un 8255A funcionando en el modo cero. Escribir una rutina para enviar al periférico el carácter cuyo código ASCII se encuentra en el registro B.

CENTRONICS es un estándar usado por muchos años para enviar datos desde

un µC hacia una impresora paralela. Su uso es tan extendido que la mayoría de las impresoras hasta hace dos años usaban este protocolo. Las impresoras modernas ofre-cen además un puerto USB. EL puerto paralelo puede realizarse con un 8255A bajo el control del programa de transferencia. La figura 9.18 muestra un diagrama de tiempos de una transferencia CENTRONICS y en la figura 9.19 se indican las funciones de las líneas del bus y su ubicación en el conector CANON DB-25.

Fig. 9.18. Transferencia de un carácter a una impresora usando el protocolo de enlace CENTRONICS.

Page 545: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

526

Terminal Señal E/S1 Función

1

STB : DATASTROBE

S

Salida normalmente en nivel alto. Es puesta a cero por el µC durante 1 µs para notificar que se envió un dato.

2-9

DATA 0 – DATA 7

S

Salidas de los ocho bits de datos. Deben ser estables al menos 0.5 µs antes y des-

pués del pulso STB .

10

ACK : EACKNOWLEDG

E

Señal activa en bajo generada por la im-presora cuando está lista para recibir un nuevo carácter. Es generada cuando la línea BUSY va a nivel bajo.

11

BUSY

E

Entrada OCUPADA que indica la disponi-bilidad de la impresora. Está en nivel alto cuando ésta no puede recibir datos.

12

PO: PAPER OUT

E

Entrada que cuando está en nivel alto notifica que no hay papel en la bandeja de la impresora.

13

SLCT: SELECT

E

Indica el estado de la impresora. Cuando está en línea, la señal conmuta a uno lógico.

ON LINE: • Al energizar la impresora. • Cuando se aplica un RESET . • Al presionar el interruptor ON LINE.

OFF LINE: • Impresora sin papel. • Cubierta exterior abierta • La impresora es colocada en OFF LINE.

14

AFD : TAUTOFEED X

S

Salida que indica con un nivel bajo si a cada comando de retorno de carro (CR) le seguirá uno de alimentación de línea (LF).

15

ERROR

E

Activa en bajo por la ocurrencia de un error. Condiciones de error son: • Ausencia de papel en la bandeja. • Impresora en OFF LINE. • Estado de sobrecarga. • Cubierta exterior abierta

16 RESET S En cero inicializa la impresora. Detiene el equipo y borra el buffer de datos.

17

SL

S Cuando es cero se selecciona la impresora. Si está en nivel alto la transferencia de datos no es aceptada.

18-25 TIERRA – Fig. 9.19. Conector CANON DB25 hembra y descripción de las señales del estándar CENTRONICS.

1 Entrada/Salida con respecto al microcomputador

Page 546: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

527

Nota: La tarjeta de impresora debe tener resistores conectados a +5V en todas las entradas. Fig. 9.20 Puerto de impresora

Page 547: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

528

El protocolo CENTRONICS trasmite en paralelo los datos a imprimir y ade-más presenta varias señales para que el µP controle la transferencia, y un grupo de líneas de salida desde la impresora indican en cualquier momento el estado del perifé-rico.

Como ilustra el diagrama de tiempos de la figura 9.18, el código ASCII del ca-

rácter a imprimir es presentado por el µP en las líneas de datos DATA0-7 y entonces se examina la entrada BUSY para verificar, si está en cero lógico, que la impresora esté disponible. En este caso, el procesador coloca en nivel bajo la salida STB durante al menos 1 µs, para sincronizar la transferencia del dato. La impresora lee el dato durante el flanco positivo de STB . Si la línea BUSY está en alto, porque la impresora está ocupada, el µP permanecerá en espera hasta cuando BUSY retorne a cero. Cuando la impresora ha aceptado un carácter, activa a cero durante 5 µs la señal de reconocimien-to ACK .

Debido a que ACK es disparada en el flanco posterior de BUSY, puede ser

tratada como una notificación de lista para recibir un nuevo dato, al igual que BUSY. Esto significa que durante la transferencia de datos a la impresora, ACK puede ser ignorada y el programa sólo tiene que examinar si la impresora está libre, colocar el dato y generar la señal STB .

El puerto de conexión a la impresora se muestra en la figura 9.20 Los bits del

carácter a imprimir se entregan por el PA del 8255A, el cual debe ser configurado para operación en el modo 0. La salida BUSY de la impresora se aplica a la línea PC0 del puerto de entrada C, y por el terminal PC4 se genera la señal de sincronización STB . Se utilizan buffers de colector abierto en todas las salidas del 8255A. Los resistores de colector se encuentran en el circuito de entrada a la impresora.

;---------------------------------------------------------------------------------------------------------------- ; Rutina SAL_IMPR de salida a impresora ; Imprime bloque a partir de dirección 2000h ; Carácter de escape ; NULL 0 ;---------------------------------------------------------------------------------------------------------------- inic_blq equ 2000h ; Dirección de primer caracter a imprimir pa_8255 equ 80h ; Puerto A pc_8255 equ 82h ; Puerto C pctrl_8255 equ 83h ; Registro de control plbr_ctrl equ 83h ; Palabra de control. modo 0, PA:salida

; PCL:entrada, PCH:salida stb_cero equ 8 ; Activar STB stb_uno equ 9 ; Desactivar STB escap equ 0 ; Caracter de escape. ;----------------------------------------------------------------------------------------------------------------

Page 548: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

529

mvi a,plbr_ctrl out pctrl_8255 ; Se programa 8255A mvi a,stb_uno out pctrl_8255 ; STB se pone a uno lxi h, inic_blq ; Apuntar primer caracter a imprimir prox: mov b,m ; Caracter de memoria a registro B

mov a,b ; Examinar caracter cpi escap ; ¿Es el byte de escape? jz cont ; Si, continuar programa principal call sal_impr ; No, Imprimir byte en registro B inr l ; Apuntar siguiente caracter jmp prox ; Continuar impresión cont: ;. ;. ;. sal_impr: in pc_8255 ; Leer estado de BUSY ani 1 ; Poner máscara jnz sal_impr ; Si BUSY es alto, esperar mov a,b ; BUSY es cero out pa_8255 ; Enviar caracter a impresora mvi a,stb_cero out pctrl_8255 ; Poner señal STB en cero mvi a,stb_uno out pctrl_8255 ; Desactivar línea STB ret ;---------------------------------------------------------------------------------------------------------------- El código anterior imprime un bloque de memoria de una página máximo y

continúa ejecutando el código de usuario. El carácter NULL señala el final del bloque a imprimir. La rutina de salida a impresora examina el estado de la línea BUSY. Si está en nivel alto, se mantiene la prueba hasta cuando BUSY retorne a cero. En este mo-mento, conmuta a cero lógico la línea STB , la cual se mantiene en bajo por un tiempo superior a 1 µs, instante cuando se retorna al programa principal.

Con el ejercicio 9.5 finalizan los ejemplos de operación del 8255A en modo

cero. Lo presentado es una muestra pequeña que en modo alguno agota las posibilida-des del uso práctico del modo cero en combinación con el programa para control de periféricos. Este modo puede usarse para el control de motores por paso o servomoto-res o para el control de de la potencia suministrada a cargas de corriente alterna.

Operación en el modo 1 El último ejemplo del modo 0, fue una muestra de una operación de entrada y

salida con un periférico que requiere un protocolo de enlace para realizar las transfe-rencias. El modo 1 de operación está especialmente diseñado para la realización de transmisiones y recepciones de información, usando señales de dialogo generadas por el microprocesador y por el equipo de E/S. En este caso, la transferencia desde/hacia

Page 549: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

530

los puertos A y B es controlado por un protocolo de enlace, realizado usando los termi-nales del puerto C.

Como se expuso en páginas anteriores ambos grupos A y B pueden progra-

marse para funcionamiento en este modo, como se indica a continuación: • Grupos A y B. • Cada grupo con un puerto de 8 bits de datos y puerto de 4 bits de control/datos. • Los puertos de 8 bits (PA y PB) pueden ser entradas o salidas, ambas con retención. • El puerto de 4 bits (PCH y PCL) se usa para control/estado del puerto de datos de 8 bits.

Modo 1: Entrada

La figura 9.21muestra los formatos de la palabra de entrada para la configura-ción de los grupos A y B para operación en el modo 1. Observe que tanto el puerto A como el B se programan como entradas, si ambos grupos operan en modo 1. Tres bits de PCH o de PCL se usan para controlar la transferencia de datos desde el periférico hacia el sistema a través de los puertos PA y PB, respectivamente. Las dos líneas res-tantes, PC6-7, del puerto C quedan disponibles para ser usadas como líneas de E/S.

Fig. 9.21 Formatos de palabra de control para operación en el modo 1 de entrada.

Page 550: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

531

Aunque en este caso se considera que ambos grupos se configuran en el modo 1 de entrada, en la práctica pueden programarse una combinación de modo 1, en cuyo caso uno de los grupos se programa como entrada y el otro como salida. La función de las señales de control y el diagrama de tiempo de una transferencia de entrada en el modo 1 se muestra en la figura 9.22.

Strobe Input

Cuando se activa esta entrada el dato entregado por el periférico es cargado en el registro latch del puerto de entrada.

Input Buffer Full

Salida que notifica la presencia de un dato en el registro de entrada. Es una señal

de reconocimiento activada como respuesta a la entrada STB y es llevada a cerocuando el µP lee el puerto.

INTR Interrupt Request

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ónpermite que con solo cargar un dato en el puerto, un periférico interrumpa alCPU. Las interrupciones deben estar habilitadas por:

INTE A: bit set/reset de PC4 INTE B: bit set/reset de PC2

PC7 y PC6 Líneas disponibles para E/S.

Fig. 9.22. Entrada en modo 1.

El modo 1 de operación permite que el dato desde el periférico se almacene en el puerto A o en el puerto B hasta cuando el µP pueda leerlo. Al inicio de la transfe-rencia, el periférico coloca el dato en los terminales del puerto de entrada y pone en nivel bajo al línea STB para cargar el byte en el registro de entrada. A continuación, una señal de reconocimiento IBF se pone en alto para indicar la presencia de un dato en el latch de entrada. Al retornar STB a uno lógico, se dispara la señal INTR de so-licitud de interrupción, si las interrupciones están habilitadas.

El µP puede detectar cuando el periférico transmite un dato, mediante un pro-

grama que examine el estado de IBF o al ser interrumpido por INTR. El flanco de

IBF

STB

Page 551: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

532

subida de RD desactiva la señal IBF, mientras que el flanco de caída de RD remue-ve la solicitud de interrupción. Observe que en el modo de interrupción, la solicitud es realizada con sólo cargar el dato en el registro de entrada. Ejemplo 9.6

Escriba una rutina para leer un dato desde un dispositivo de entrada. Cada vez que el periférico coloca un byte en las líneas del puerto de entrada, genera un pulso negativo.

Esta situación es apropiada para el uso del modo 1. Como ilustra el diagrama

simplificado de la figura 9.23, las salidas de datos se aplican al PB configurado como entrada y la señal de sincronización LISTODATO se conecta al terminal PC2 o BSTB .

Fig. 9.23 Entrada en modo 1.

Si el periférico es un teclado, este entregará al puerto B el código ASCII y una

señal de habilitación a PC2 cada vez que una tecla es presionada. Los circuitos elec-trónicos asociados al teclado, detectan la prsión de la tecla, la identifican, le asignan el código correspondiente, suprimen el efecto de los rebotes de contactos y protegen contra la pulsación simultánea de varios pulsadores. El siguiente programa carga el dato D0-D7 en el registro acumulador, cada vez que una tecla es activada.

;--------------------------------------------- ------------------------------------------------------------------ ; Rutina de lectura de teclado ;--------------------------------------------- ------------------------------------------------------------------ pb_8255 equ 81h ; Puerto B pc_8255 equ 82h ; Puerto C pctrl_8255 equ 83h ; Registro de control plbr_ctrl equ 10000110b ; Palabra de control. Modo 1, PB:entrada ;--------------------------------------------- ------------------------------------------------------------------ teclado: mvi a,86H ;Puerto B, Modo 1:Entrada out pctrl_8255 exam_IBF: in pc_8255 ;Leer puerto C ani 2 ;Examinar IBF jz exam_IBF ;Si IBF=0, registro vacío in pb_8255 ;Si IBF=1, leer el latch de PB ret ;--------------------------------------------- ------------------------------------------------------------------

Page 552: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

533

Modo 1: Salida El puerto A o el B se configuran como salidas y tres señales del puerto PCH o

PCL, respectivamente, controlan la salida de datos hacia el periférico. Al igual que el el modo 1 de entrada, pueden usarse interrupciones durante la transferencia.

En la figura 9.24 se muestran las señales de control del puerto C para cada

grupo y el formato de la palabra de control para los grupos A y B.

Fig. 9.24. Formatos de palabra de control para operación en el modo 1 de salida.

Las funciones de las señales de control y el diagrama de tiempo de la transfe-rencia de datos en el modo 1 de salida, se muestran en la figura 9.25.

Observe que cada vez que el µProcesador escribe un dato en el puerto A o en

el puerto B, la salida OBF respectiva, conmuta a nivel bajo para indicar existe un dato disponible en el registro de salida. Esto ocurre durante el flanco de subida de WR .

Cuando el periférico acepta el dato, coloca en estado cero la señal de recono-

cimiento ACK , la cual desactiva la línea OBF notificando que el dato fue recibido y que el registro está vacío. La señal INTR puede usarse para interrumpir al µP cuando el periférico ha leído el dato enviado por la CPU. El terminal INTR es puesto a 1

Page 553: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

534

cuando la salida de reconocimiento ACK , la línea de indicación de latch lleno OBF y el bit INTE, son todas uno. Es llevada a cero, por el flanco de caída de WR .

OBF Output Buffer Full

Salida en nivel bajo cuando el µP escribe un dato en el puerto A o B. Es activada

por el flanco posterior de WR y desactivada por el flanco de bajada de la señal de

reconocimiento ACK generada por el periférico.

ACK Acknowledge Input

El dispositivo externo pone a nivel bajo está entrada para indicar al µP que el dato en el puerto A o B ha sido recibido.

INTR Interrupt Request

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-ción permite interrumpir al CPU cuando un periférico acepta un dato transferido por el µP. Las interrupciones deben estar habilitadas por:

INTE A: bit set/reset de PC4 INTE B: bit set/reset de PC2

PC4 y PC5 Líneas disponibles para E/S.

Fig. 9.25. Formatos de palabra de control y diagrama de tiempos de salida en modo 1

Ejemplo 9.7

Usar el modo 1 de salida, para enviar un bloque de datos a una impresora pa-

ralela. Escribir la rutina de salida de datos a la impresora. Como puede verse en la figura 9.26, para la interconexión a la impresora se

usa el grupo A, programado en el modo 1. La impresora recibe el código ASCII del carácter a imprimir por las 8 líneas del puerto A. Para la línea de sincronización de transmisión de datos STB del puerto CENTRONICS, se usa el bit PC5. Aunque la señal OBF indica que existe un dato válido en el registro de salida, ésta no puede ser

Page 554: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

535

usada como STB , porque se requiere un pulso para indicar a la impresora que hay un dato listo. Por tal razón se usa PC5.

Una vez que la impresora acepta el dato genera la señal de reconocimiento

ACK para indicar que está lista para recibir otro dato. Esta salida se conecta a la en-trada AACK o PC6 del 8255A y cuando se activa retorna a nivel alto a OBF .

Fig. 9.26. Salida a impresora en modo 1

El programa examinará OBF para detectar si la impresora está disponible.

Esto ocurre cuando la impresora acepta el dato y borra el registro de salida. Con la impresora libre el µP carga el dato en el registro de salida PA y genera por PC5 el comando STB . El código de la rutina se muestra a continuación.

;---------------------------------------------------------------------------------------------------------------- ; Rutina SAL_IMPR de salida a impresora ; Imprime bloque a partir de dirección 2000h ; Carácter de escape ; NULL 0 ;---------------------------------------------------------------------------------------------------------------- inic_blq equ 2000h ; Dirección de primer caracter a imprimir pa_8255 equ 80h ; Puerto A pc_8255 equ 82h ; Puerto C pctrl_8255 equ 83h ; Registro de control plbr_ctrl equ 0A0h ; Palabra de control. modo 1, PA:salida

; PCH:salida stb_cero equ 10 ; Activar STB stb_uno equ 11 ; Desactivar STB escap equ 0 ; Caracter de escape. ;---------------------------------------------------------------------------------------------------------------- mvi a,plbr_ctrl out pctrl_8255 ; Se programa 8255A mvi a,stb_uno out pctrl_8255 ; STB se pone a uno lxi h, inic_blq ; Apuntar primer caracter a imprimir

Page 555: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

536

prox: mov b,m ; Caracter de memoria a registro B mov a,b ; Examinar caracter

cpi escap ; ¿Es el byte de escape? jz cont ; Si, continuar programa principal call sal_impr ; No, Imprimir byte en registro B inr l ; Apuntar siguiente caracter jmp prox ; Continuar impresión cont: ;. ;. ;. sal_impr: in pc_8255 ; Leer estado de OBF ani 80h ; Poner máscara jnz sal_impr ; Si OBF es bajo, esperar mov a,b ; OBF es cero out pa_8255 ; Enviar caracter a impresora mvi a,stb_cero out pctrl_8255 ; Poner señal STB en cero mvi a,stb_uno out pctrl_8255 ; Desactivar línea STB ret ;----------------------------------------------------------------------------------------------------------------

Operación en el modo 2 Es el modo de transferencia bidireccional sobre los terminales del puerto A.

Ejemplos del uso de este modo de operación es la interconexión con un controlador de discos flexibles, transferencias paralelas con el estándar para instrumentación de propósito general GPIB (IEEE-448) y para la comunicación entre computadores. En la figura 9.27 se muestran las señales asociadas al modo 2 y la palabra de control para operación en ambas direcciones.

Fig. 9.27. Palabra de control y señales asociadas con el modo 2 de operación.

Page 556: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

537

OBF Output Buffer Full

Salida en nivel bajo cuando el µP escribe un dato en el puerto Aindicando que el latch de salida está lleno.

ACK Acknowledge Input

Entrada que en cero lógico habilita los buffer de tres estados de salida del puerto A. Si ACK está en alto, las salidas de PA perma-necen en alta impedancia.

Strobe Input

Cuando se activa esta entrada el dato entregado por el periférico es cargado en el registro latch del puerto A-

IBF Input Buffer Full

Un alto en esta salida indica que un dato ha sido cargado en el registro de entrada.

INTR Interrupt Request

Salida activa que en nivel alto puede usarse para interrumpir al µP durante transferencias tanto de entrada como de salida.

INTE 1: Bit set/reset PC6 INTE 2: Bit set/reset PC4

PC2, PC1 y PC0 Líneas disponibles para E/S controladas por bit set/reset.

Fig. 9.28. Formatos de palabra de control y diagrama de tiempos para el modo 2

Debido a que la conexión de una unida de disquetes al sistema y la comunica-ción interprocesador son aplicaciones fuera del alcance de este trabajo, el siguiente ejemplo se limita a la presentación de rutinas de transmisión y recepción en el modo de operación 2.

STB

Page 557: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

538

Ejemplo 9.8 1. Escribir un programa que transmita por las líneas bidireccionales del puerto

A el dato cargado en el registro acumulador.

2. Una rutina debe recibir por las líneas bidireccionales del puerto A el dato enviado por un dispositivo externo.

Sin mayores comentarios se presenta el código de transferencia en el modo 2

de operación.

;----------------------------------------------------------------------------------------------------------- ; Ejemplo en modo 2 ;----------------------------------------------------------------------------------------------------------- pa_8255 equ 80h ; Puerto A pc_8255 equ 82h ; Puerto C pctrl_8255 equ 83h ; Registro de control ;----------------------------------------------------------------------------------------------------------- ; Programa principal mvi a,plbr_ctrl out pctrl_8255 ; Se programa 8255A ; . ; . ; . ;----------------------------------------------------------------------------------------------------------- ; Rutina TRASM. Transmite el dato en el registro B por las líneas del puerto A ;----------------------------------------------------------------------------------------------------------- trasm: in pc_8255 ; Leer puert C ani 80h ; Examinar OBF jz trasm ; Si OBF es 0, registro de salida lleno mov a,b ; Si OBF es 1. Próximo dato al acumulador out pa_8255 ; Transmitir byte ret ;----------------------------------------------------------------------------------------------------------- ; Rutina RECIB. Recibe el dato por las líneas del puerto A y lo retorna en el acumulador ;----------------------------------------------------------------------------------------------------------- recib: in pc_8255 ; Leer puerto C ani 20h ; Examinar IBF jnz recib ; Si IBF es 0, registro de entrada vacío in pa_8255 ; Si IBF es 1, leer dato ret ;----------------------------------------------------------------------------------------------------

El lector debe haber notado que para detectar el estado de las señales de con-

trol, en los modos de operación 1 y 2, basta con realizar una lectura convencional del puerto C. La figura 9.29 muestra los formatos de la palabra de estado para los modos 1 y 2.

Page 558: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

539

Fig. 9.29. Formatos de las palabras de estado para los modos 1 y 2.

9.2 DISPOSITIVO 8155: SRAM/PUERTOS DE E/S/TIMER

Es conocido por el lector, que el circuito integrado 8155/56 es un dispositivo de funciones múltiples, diseñado para compatibilidad pin a pin con el µP 8085A. Es fabricado por varias empresas, en incluso la compañía INTERSIL ofrece una versión (HS-81C55RH) con alta resistente a la radiación cósmica, destinada al diseño de ins-trumentos y controles que viajan al espacio.

Fig.9.30. El dispositivo multifunción 8155.

Page 559: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

540

Los recursos ofrecidos por el 8155/56 son:

Fig.9.31. Secciones del 8155/56

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8155

VCC

GND

+ 5 V Tierra

CS Un nivel bajo en este terminal permite la comunicación entre el µP y el 8155. Para el 8156 esta entrada 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 M/IO .

RD Esta entrada en cero con CS activado habilita los buffers de salida AD0-AD7. Si el terminal

M/IO 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.

MIO/ Selecciona la RWM si es cero y los puertos de E/S y el registro comando/estado si está en alto.

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.

RESET

Un nivel alto en esta entrada durante al menos dos pulsos de reloj inicia el registro de control con todos 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 M/IO . 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

OUTTIMER Salida de onda cuadrada o pulso según el modo seleccionado para el temporiza-dor..

• 2Kbits de memoria RWM estáti-

ca arregladas como 256x8 bytes. • 2 puertos programables de 8 bits

para E/S. • 1 puerto programable de 6 bits

para E/S. • 1 temporizador/contador binario

programable de 14 bits. • Registro latch interno controlado

por ALE para decodificar el by-te bajo de direcciones.

• Registro de comando/estado

Page 560: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

541

El acceso a la zona de memoria RWM, con M/IO en nivel bajo, o a los puer-tos de E/S, cuando M/IO conmuta a nivel alto, se realiza a través del bus multiplexa-do AD0-AD7, bajo el control de las señales: ALE, la cual indica si el bus contiene datos o direcciones, y WR y RD que señalan cuando el acceso corresponde a una operación de escritura o de lectura.

Como ilustra la figura 9.32, el dispositivo 8155 contiene una memoria RAM estática de 256 bytes y siete registros internos. Estos son: dos puertos de E/S: PA y PB de 8 bits, un puerto PC de 6 bits, los registros de comando/estado (C/S) para la programación y examen del estado del dispositivo, y un contador/temporizador de 14 bits. El circuito integrado no requiere lógica externa para conectarse al μP 8085, el estado lógico de la señal M/IO distingue cuando la dirección presente en las líneas AD0-AD7 corresponde una posición de la memoria SRAM o hace referencia a uno de los registros internos del circuito.

La entrada ALE se aplica a un registro latch interno para demultiplexar el byte

de orden bajo A0-A7 del bus de direcciones, una dirección válida se presenta en las líneas de direcciones en el flanco anterior de ALE, mientras que esta información, y los estados de M/IO y CS se aplican a la lógica interna del chip durante el flanco posterior de ALE.

9.2.1 Sección de entrada y salida del 8155 Las direcciones asignadas a los registros internos del 8155 se muestran en la

tabla 9.3 y en el capítulo 5 se expone todo lo relacionado con el diseño del decodifi-cador de direcciones para el 8155/56.

Tabla. 9.3 Direcciones de los registros internos del 8155

El 8155/56 tiene tres puertos programables de E/S. Los puertos A y B son de 8 bits y pueden ser usados para transferencias de E/S controladas por programa según el modo programado en el circuito. Los 6 bits del puerto C pueden a su vez funcionar como entradas o salidas de propósito general o como líneas de control y estado para transferencias sobre el puerto A y B, de acuerdo con la configuración del 8155.

Dirección del Puerto de E/S AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

x x x x x 0 0 0 Registro de Comando/Estado x x x x x 0 0 1 Puerto A de E/S x x x x x 0 1 0 Puerto B de E/S x x x x x 0 1 1 Puerto C de E/S x x x x x 1 0 0 8 bits de orden bajo del temporizador/contador x x x x x 1 0 1 6 bits de orden alto del temporizdor/contador y 2 bits del modo temporizador.

Registro seleccionado

Page 561: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

542

Registro de comando Los registros de comando y de estado tienen la misma dirección, pero son uni-

dades independientes. La información transferida al registro de comando durante una operación de escritura en puerto, permite programar las funciones de los puertos de E/S, de acuerdo con el formato de palabra mostrado en la figura 9.32 Los bits 0 a 3 definen el modo de los puertos, los bits 4 y 5 habilitan o no las interrupciones desde el puerto C cuando éste es usado como puerto de control y los dos bits más a la dere-cha son destinados para el control del temporizador.

Fig. 9.32 Formato de la palabra de control del 8155.

El puerto A puede ser usado como entrada o salida según establezca el bit 0 de

registro C/S, y de acuerdo con las función seleccionada para el puerto C, puede fun-cionar en el modo básico de E/S o en el modo con protocolo de enlace. El puerto B tiene las mismas características mencionadas para el puerto A. Su dirección la esta-

Page 562: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

543

blece el estado del bit 1 del registro de C/S. Las seis lineas del puerto C pueden con-figurarse como entradas o salidas convencionales (ALT1 Y ALT2) o como señales de control de los puertos PA y PB (ALT3 y ALT4) de acuerdo con el estado de los bits 2 y 3 del registro de comando.

Los modos de funcionamiento del puerto C o ALTn (alternatives) se presentan a continuación.

Tabla. 9.4 Modos del puerto C

TERMINAL ALT1 ALT2 ALT3 ALT4 PC0 ENTRADA SALIDA INTRA INTRA PC1 ENTRADA SALIDA BFA BFA PC2 ENTRADA SALIDA

ASTB ASTB PC3 ENTRADA SALIDA SALIDA INTRB PC4 ENTRADA SALIDA SALIDA BFB PC5 ENTRADA SALIDA SALIDA

BSTB

INTR: Salida de SOLICITUD DE INTERRUPCIÓN del puerto A o B. Un alto en esta línea

indica que el periférico ha enviado un dato pero este aún no ha sido leído por el µP o que el dato escrito en el puerto por la CPU ha sido aceptado por el periférico.

BF: Salida BUFFER LLENO que en nivel alto notifica que un dato ha sido cargado en por el µP/periférico en el latch del puerto pero aun no ha sido transferido al periféri-co/µProcesador.

STB : Entrada STROBE que se activa en nivel bajo para indicar la disponibilidad de un dato de entrada o la aceptación de un dato de salida.

Los modos que usan el puerto C para controlar la transferencia a los puertos A

y B son ALT3 (solo puerto A) y ALT4 (puertos A y B). Cuando se usan estos modos tres bits del puerto C se asignan a control del puerto A y los tres restantes al puerto B. En el modo ALT3 donde solo se controla el puerto A, los bits PC3-5 funcionan como salidas. En las figuras 9.36 se muestran los diagramas de tiempos para transferencias de E/S bajo control del puerto C.

Como se observa en los diagramas de tiempos de la figura 9.33, el funciona-

miento en los modos ALT3 y ALT4 es similar al modo 1 del 8255A. La única diferen-cia es en la nomenclatura de las señales. Por ejemplo, la señal de buffer lleno se de-nomina BF tanto para entrada como para salida (OBF e IBF en el 8255A) y la señal de reconocimiento en modo salida, llamada ACK en el 8255, se nombra STB para el 8155.

Dada la similitud en los modos de operación de ambos dispositivos, se consi-

dera que los ejemplos presentados para el 8255, operando en los modos 0 y 1, pueden adaptarse con facilidad al 8155.

Page 563: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

544

Fig. 9.33 Formas de ondas para transferencias de entrada y salida bajo el control del puerto C.

Registro de estado Una operación de lectura al registro de estado de siete bits, entrega informa-

ción de estados de los puertos de E/S y el temporizador. El programa puede examinar esta información en cualquier momento. El µP no puede escribirse sobre este registro, porque al compartir la misma dirección con el registro comando, la escritura sería a este último. El formato de la palabra de estado se muestra en la figura 9.34.

Una lectura del registro de estado puede indicar si en el latch de entrada o sa-

lida existe un dato aun no transferido al receptor, el estado de las líneas de interrup-ciones y si éstas están habilitadas. Pudiéndose además detectar cuando el temporiza-

Page 564: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

545

dor contador llega a la cuenta final después de haber sido iniciado. Esto último se logra detectando el estado del bit 6 del registro de estado.

Fig. 9.34. Formato de la palabra de estado del 8155.

Ejemplo 9.9

Se debe controlar la presentación de información alfanumérica en una pantalla

de cristal líquido.

Fig. 9.35. Pantalla de cristal líquido conectada a un 8155.

Page 565: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

546

1. Realizar la interconexión a un sistema 8085A, de un módulo de cristal lí-quido de 16x2 caracteres (controlador HD44780U), basándose en el dia-grama simplificado de la figura 9.35.

2. Escribir el programa de control de presentación, e imprima la temperatura

en dos puntos de un proceso. Los valores de temperatura son de dos dígitos y está almacenados a partir de la dirección de memoria MEM. El dígito más significativo en la posición más baja. El formato de presentación es el de la figura 9.36.

Fig. 9.36. Valores de temperatura y estado del proceso. Solución:

La pantalla LCD de la figura 9.36 es de 16x2 caracteres, lo cual significa que

puede presentar 2 líneas de 16 caracteres cada una. El carácter se construye en una matriz de 5x7 puntos Existe un gran número de módulos LCD producidos por dife-rentes fabricantes y existe un estándar que facilita la interconexión entre el dispositi-vo y un µP o µCtrl, independientemente del modelo. Tal estándar se conoce como HD44780U.

Este es un sistema microcontrolador y manejador de pantallas LCD, para pre-

sentación de caracteres alfanuméricos y símbolos. Esta unidad provee todas las fun-ciones como memoria de presentación, generador de caracteres y los manejadores de cristal líquido necesarios para el control de una matriz de puntos, por lo cual se sim-plifica la interconexión del LCD con el sistema procesador.

Como ilustra la figura 9.35, para comunicarse con el módulo LCD se requie-

ren tres líneas de control: E, RS, W/R y ocho líneas para datos y comandos. El códi-go de la aplicación puede programar al dispositivo para operación con datos de 4 bits, en cuyo caso sólo serán necesarias siete líneas de interconexión. Las funciones y dis-tribución de los terminales del dispositivo LM032L se muestran en la figura 9.37.

El HD44780U tiene dos registros de 8 bits: Registro de Datos (DR) Contiene temporalmente los datos a ser leídos o escritos en la memoria RAM de datos a presentar (DDRAM: Display Data RAM) y en la memoria RAM del

Page 566: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

547

VDD: Alimentación de 2.7 V a 5.5 V. VSS: Tierra. VEE: Regulación de contraste de la pantalla (0-5 V) RS: Selects registers.

Cuando es 0 se escriben comandos en el registro de instrucción (IR) o se leen desde IR el esta-do de la bandera de ocupado y del contador de direcciones.

Cuando es 1 se escribe o lee desde el registro de datos (DR) WR/ : Read/Write

Selección de operaciones de lectura y escritura. 0: Escritura. 1: Lectura. E: Enable.

Inicia las operaciones de lectura y escritura. D4-D7: Nibble mas significativo del bus de datos bidireccional. Comunica el µP con el HD44780U. El

bit D7 puede usarse como bandera de ocupado. D0-D3: Nibble bajo del bus de datos bidireccional. Comunica el µP con el HD44780U. Estas 4 líneas

no se usan durante el modo de operación con transferencias de 4 bits.

Fig. 9.37. El dispositivo LM032L usa el estándar HD44780U.

generador de caracteres (CGRAM: Character Generador RAM). La CGRAM contiene caracteres definidos por el usuario. Cualquier información cargada en el DR por el µP, es almacenada automáti-camente en la DDRAM o en la CGRAM. Cuando el µP lee datos desde la DDRAM o CGRAM, estos son transferidos al DR. Registro de Instrucciones (IR) Almacena los códigos de las instrucciones, como por ejemplo: limpiar panta-lla, ocultar cursor o desplazar cursor; y direcciones para la DDRAM o la CGRAM. Cuando una dirección es escrita en el IR, un dato es leído desde la DDRAM o CGRAM y cargado en el DR para ser transferido al µP. Una vez que el µP lee el dato, el contenido de la siguiente posición de la memoria se envía al DR para una próxima lectura por el sistema. La línea de control RS permite seleccionar uno de los registros como indica la

tabla 9.5.

Page 567: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

548

Tabla. 9.5. Selección de registros.

Cuando el HD44780U está realizando una operación interna, la bandera de

ocupado estará en alto y el controlador no aceptará transferencia alguna hasta cuando BF retorne a nivel bajo. Como se expone en la tabla 9.5, el estado de BF y del conta-dor de direcciones puede ser examinado por el programa.

El contador de direcciones (AC:Address Counter) es un apuntador de direc-

ciones para la DDRAM y la CGRAM. Cuando el µP escribe la dirección de una ins-trucción en el IR, ésta es cargada en el AC. La propia instrucción especifica si el des-tino es la DDRAM o la CGRAM. El AC es incrementado/disminuido en 1, por cada operación de escritura/lectura.

El diagrama de tiempos de una operación de escritura al módulo LCD se pre-

senta en la figura 9.39. Una escritura en el módulo, puede tener dos propósitos: uno, la presentación de un caracter ASCII en la pantalla (Operación de escritura al DR con RS =1); el otro, la ejecución de una instrucción (Borrar pantalla, por ejemplo. Opera-ción de escritura en el IR con RS =0). El procedimiento implica: poner RS en el esta-do correspondiente, llevar la línea W/R a cero, poner la entrada E en alto, cargar el dato en el bus D0-D7 y retornar E a cero lógico. En la práctica está secuencia no es crítica. Por ejemplo, se puede activar E, fijar el estado de RS y W/R , colocar el da-to, y al final retornar a cero la línea E. Es en realidad el flanco de caída de la señal E, el evento que ejecuta las operaciones internas.

La memoria de datos a presentar o DDRAM contiene los códigos de 8 bits de

los caracteres en pantalla. Su máxima capacidad son 80 caracteres. Todo texto escrito en el HD44780U se almacena en esta memoria y el µCtrl a continuación leerá la DDRAM y presentará el mensaje en el LCD. Para el dispositivo de 16x2 caracteres, la DDRAM puede representarse con el siguiente mapa de memoria.

Fig. 9.38. Memoria DDRAM

RS WR/ OPERACIÓN 0 0 Escritura de instrucción o dirección en el IR

0 1 Lectura de la bandera de ocupado BF (D7) y del conta-dor de direcciones (D0-D6).

1 0 Escritura en el DR (Dato desde el DR a la DDRAM o CGRAM)

1 1 Lectura del DR (Dato desde DDRAM o CGRAM hacia el DR)

Page 568: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

549

Fig. 9.39. Ciclo de escritura en el HD44780U. El área más oscura en la figura 9.38 corresponde a los caracteres visibles o 16x2 caracteres, y el número indica la dirección de la memoria que corresponde a cada posición en la pantalla. El primer caracter pertenece a la posición 0, el segundo a la 1 y así sucesivamente.

Si escribimos un carácter el la dirección 0FH, éste aparecerá en la ultima posi-ción de la línea 1, el siguiente carácter enviado no aparecerá al comienzo de la segun-da línea (dirección 40H) debido a que fue escrito en la dirección 10H. En este caso antes de enviar el caracter debe ejecutarse un comando que desplace el cursor hacia la primera posición de la línea 2. El área que no se usa para presentar caracteres puede usarse como RAM de propósito general. Los caracteres imprimibles se muestran en la tabla de la figura 9.40.

Las instrucciones disponibles, sus códigos y el número de ciclos de reloj in-vertidos en la ejecución de cada una, se muestran en la tabla 9.6.

Page 569: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

550

Fig. 9.40. Patrones en la ROM del generador de caracteres.

Page 570: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

551

Tabla. 9.6. Conjunto de instrucciones del módulo LCD.

I/D: 1 = Avance del cursor. 0 = Retroceso del cursor. S: 1 = Desplaza el contenido de la pantalla con cada nueva escritura de dato. 0 = Presentación normal. D: 1 = Pantalla activada. 0 = “ apagada. C: 1 = Cursor está activo. 0 = Cursor oculto. B: 1 = Cursor parpadea si está activo. 0 = Cursor normal. S/C: 1 = Desplaza el contenido de la pantalla. 0 = Mueve el cursor. R/L: 1 = Desplazamiento hacia la derecha. 0 = “ “ “ izquierda. BF: 1 = Módulo LCD está ocupado. 0 = Dispositivo libre para aceptar comandos o datos. DL: 1 = Bus de 8 bits. 0 = Bus de 4 bits. N: 1 = Presenta 2 líneas de caracteres. 0 = Muestra 1 línea de caracteres. F: 1 = Caracteres de 5 x 10 puntos. 0 = “ “ 5 x 7 puntos.

Page 571: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

552

Configurando el módulo LCD

Antes de usar la pantalla de cristal líquido, el HD44780U debe ser configura-do por medio de una secuencia de instrucciones enviada al controlador del módulo. En principio, se usa la instrucción Function Set para especificar que se usa un ancho de 8 bits para el bus de datos, 2 líneas de caracteres y una matriz de 5x7 puntos. Esto se corresponde con el byte 38H=000011102, como se deduce de la tabla 9.6.

La instrucción siguiente de la secuencia de inicio corresponde al comando

0EH=000011102 de la instrucción Display Control, la cual activa la pantalla y mues-tra el cursor. Finalmente, un comando 06H=000001102 de la instrucción Entry Mode Set, establece, que cada vez que se presente un nuevo carácter, la posición del cursor se mueva hacia la derecha.

Para borrar la pantalla en cualquier momento, se ejecuta Clear Display, cuyo

código es 01H=000000012. Esta orden limpia la pantalla y coloca al cursor en la po-sición del primer carácter de la primera línea. Si se escribe en la línea 1 y se desea que el carácter que sigue se presente en la posición 5 de la segunda línea se usa la función Set DDRAM Addr o C5H=110001012 (Dirección DDRAM= 45H).

El manual de usuario del HD44780U especifica que un circuito interno de

RESET inicia dispositivo, al aplicársele energía. En este caso, se ejecuta una sucesión de instrucciones que lleva al módulo LCD, por defecto, a un estado inicial. También se indica, que si no se satisfacen las condiciones de la fuente de alimentación para la operación del circuito de RESET interno, el programa de la aplicación deberá ejecutar las instrucciones de configuración del LCD. La secuencia de inicio por instrucciones, sugerida por el fabricante, para el modo de 8 bits, es la siguiente:

Esperar 15 ms después que VCC alcance 4.7 V. Ejecutar la instrucción Function Set (30H: bus 8 bits). Esperar al menos 4.1 ms. Ejecutar la instrucción Function Set (30H: bus 8 bits). Esperar al menos 100 µs. Ejecutar la instrucción Function Set(* ) (30H: bus 8 bits). Esperar al menos 40 µs. Ejecutar la instrucción Function Set (38H: bus 8 bits, 2 líneas matriz 5x7). Esperar al menos 40 µs. Ejecutar la instrucción Display Control (08H: pantalla y cursor desactivados). Esperar al menos 40 µs. Ejecutar la instrucción Clear Display (01H: borrar pantalla). Esperar al menos 1.64 ms. Ejecutar la instrucción Display Control (0EH: Activar pantalla y mostrar cursor). Esperar al menos 40 µs. Ejecutar la instrucción Entry Mode set (06H:Auto incremento. Avanzar el cursor). Esperar al menos 40 µs. * Antes de esta instrucción los tiempos de espera deben cumplirse. No basta con examinar la bandera de

ocupado BF para detectar cuando el módulo está disponible. Los tiempos de espera después de esta instrucción se corresponden con el tiempo de ejecución de la misma, por lo cual es suficiente con veri-ficar a BF.

Page 572: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

553

El programa desarrollado para establecer la comunicación entre el µP y el HD44780U y presentar el texto de la figura 9.36 consta nueve módulos, los cuales se describen a continuación:

• LCD

Programa principal.

• INIC_LCD

Rutina de inicio. Configura el módulo LCD y lo deja listo para ser usado.

• SAL_CMD

Escribe en el registro de intrucciones IR, el comando cuyo código está cargado en el registro acumulador. Antes de ejecutar una instrucción determinada se detecta si el dispositivo está libre.

• SAL_DATO

Escribe en el registro de datos DR el código ASCII del carácter a presentar, el cual debe cargarse en el acumulador. Antes de ejecutar la transferencia se verifica que el LCD esté disponible.

• LCD_OCUP

Verifica el estado de la bandera de ocupado. Si BF está en uno, espera hasta cuando retorne a cero para continuar la ejecución del programa.

• PULSO_E

Genera un pulso de nivel alto en la línea de control ENABLE (E).

• TEXTO1

Envía al LCD la cadena de caracteres cuyo primer elemento está almacenado en la posición con dirección de memoria apuntada por el registro par HL. El carácter de escape es NULL (00H).

• TEXTO2

Envía al LCD la cadena de caracteres BCD de longitud especificada por el contenido del re-gistro C y cuyo primer elemento está almacenado en la dirección de memoria especificada por el registro par HL.

• ESP_5MS

Retardo de 5 ms (>4.1ms) para permitir satisfacer los tiempos especificados en la rutina de inicio. El programa consta de 9 módulos ensamblados con el AVMAC85 y enlaza-

dos con el AVLINK. El archivo resultante en de formato hex se cargó en el programa 8085SimulatorIde el cual emula un módulo LCD. El resultado se presenta en la figura 9.41, la interconexión del LCD con el 8085A en la figura 9.42. Las instrucciones del programa de control del módulo LCD, se muestran a continuación.

Page 573: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

554

$title(Manejo LCD) $subtitle(Módulo LCD) ;--------------------------------------------------------------------------------------------------------------------- ; Modulo de programa principal ;--------------------------------------------------------------------------------------------------------------------- public pa_8155,pc_8155,escrb_cmd,escrb_dat,E_alto,E_bajo,escap,bcd_ascii,leer_dato1 public func_set1,func_set2,dspy_ctrl1,dspy_ctrl2,clr_dspy,ent_mod_set,leer_dato2 extern inic_lcd,sal_cmd,texto1,texto2 ;--------------------------------------------------------------------------------------------------------------------- ; Definición de etiquetas ;---------------------------------------------------------------------------------------------------------------------i_stack equ 08F0H ; Inicio de la pila i_rwm equ 0800H ; Dirección de inicio de RWM func_set1 equ 30h ; Interconexión de 8 líneas func_set2 equ 38h ; Interconexión de 8 bits, 2 líneas de 5x7 puntos dspy_ctrl1 equ 8 ; Pantalla off y cursor oculto dspy_ctrl2 equ 0EH ; Pantalla on y mostrar cursor clr_dspy equ 1 ; Borrar pantalla cursor a la esquina izquierda ent_mod_set equ 6 ; Autoincremento y avanzar cursor escrb_cmd equ 0 ; Líneas de control para escribir comando escrb_dat equ 2 ; Líneas de control para escribir dato E_alto equ 4 ; Máscara para activar línea enable E_bajo equ 0fbh ; Máscara para llevar enable a cero leer_dato1 equ 5 ; Líneas de contro (E=1) para leer LCD leer_dato2 equ 1 ; Líneas de contro (E=0) para leer LCD escap equ 0 ; Caracter de escape para texto1 bcd_ascii equ 30h ; Conversión BCD a ASCII ;--------------------------------------------------------------------------------------------------------------------- ; Definición de segmentos ;--------------------------------------------------------------------------------------------------------------------- defseg puertos,start=50h, class=iospace ; 8155 en dirección 50h defseg stack, start=i_stack ; La pila reside en la RWM defseg datos, class=data, start=i_rwm ; RWM a partir de 0800H defseg progr, class=code, start=0 ; 2k de EPROM desde 0000H ;--------------------------------------------------------------------------------------------------------------------- ; Puertos del 8155 ;--------------------------------------------------------------------------------------------------------------------- seg puertos pctrl_8155 ds 1 ; Puerto de control del 8155 pa_8155 ds 2 ; Líneas de datos del módulo LCD pc_8155 ds 1 ; PC0-->RW ; PC1-->RS ; PC2-->EN ;--------------------------------------------------------------------------------------------------------------------- ; Área de la pila ;--------------------------------------------------------------------------------------------------------------------- seg stack ds 10H t_stack:equ $-1 ; Base de la pila ;---------------------------------------------------------------------------------------------------------------------

Page 574: Microprocesadores-Luis Urdaneta

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 ;---------------------------------------------------------------------------------------------------------------------

Page 575: Microprocesadores-Luis Urdaneta

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 ;----------------------------------------------------------------------------------------------------------------------

Page 576: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

557

;---------------------------------------------------------------------------------------------------------------------- ; Rutina SAL_DATO ;---------------------------------------------------------------------------------------------------------------------- public sal_dato extern lcd_ocup,escrb_dat,temp,pa_8155,pc_8155,pulso_E defseg progr seg progr ;---------------------------------------------------------------------------------------------------------------------- sal_dato: mov b,a ; Salvar dato call lcd_ocup ; Espera que el módulo esté libre mvi a,escrb_dat ; Estado de líneas de control para inicio de enviar dato sta temp ; Salvar estado de RS y RW out pc_8155 ; E=0, RS=1, RW=0 mov a,b ; Recuperar dato out pa_8155 ; Cargar dato en el bus call pulso_E ; Generar un pulso en E ret end ;---------------------------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------------------------- ; Rutina LCD_OCUP ;---------------------------------------------------------------------------------------------------------------------- public lcd_ocup extern pa_8155,pc_8155,leer_dato1,leer_dato2 defseg progr seg progr ;---------------------------------------------------------------------------------------------------------------------- lcd_ocup: mvi a,0cH ; Pa:entrada Pc:salida out pctrl_8155 ; Programar 8155 para lectura mvi a,leer_dato1 ; E=1, RS=0, RW=1 out pc_8155 nop ; Tiempo extra in pa_8155 ; Leer estado de bandera de ocupado mov e,a ; salvar BF en registro E mvi a,leer_dato2 ; E=0, RS=0, RW=1 out pc_8155 mov a,e ; Recuperar BF rlc ; BF a la bandera de acarreo jc lcd_ocup ; Si BF es 1, esperar mvi a,0dH ; Pa:salida Pc:salida out pctrl_8155 ; Programar 8155 para escritura ret end ;-------------------------------------------------------------------------------------------------------

Page 577: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

558

;---------------------------------------------------------------------------------------------------------------------- ; Rutina PULSO_E ;---------------------------------------------------------------------------------------------------------------------- public pulso_E extern temp,E_alto,E_bajo,pa_8155,pc_8155 defseg progr seg progr ;---------------------------------------------------------------------------------------------------------------------- pulso_E: lda temp ; Recuperar estado de RS y R/W ori E_alto ; Máscara con E = 1 out pc_8155 ; E=1, RS, RW nop ; Tiempo adicional ani E_bajo ; Máscara con E = 0 out pc_8155 ; E=0, RS, RW ret end ;---------------------------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------------------------- ; Rutina TEXTO1 ;---------------------------------------------------------------------------------------------------------------------- public texto1 extern escap,sal_dato defseg progr seg progr ;---------------------------------------------------------------------------------------------------------------------- texto1: mov a,m ; Caracter desde la memoria al acumulador cpi escap ; Probar si es el último caracter del mensaje rz ; Retornar si fin de cadena call sal_dato ; Presentar caractes inx h ; Apuntar siguiente elemento de la cadena jmp texto1 ; Continuar presentando end ;---------------------------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------------------------- ; Rutina TEXTO2 ;---------------------------------------------------------------------------------------------------------------------- public texto2 extern escap,sal_dato,bcd_ascii defseg progr seg progr ;---------------------------------------------------------------------------------------------------------------------- texto2: mov a,m ; Dígito BCD desde memoria al acumulador adi bcd_ascii ; Convertir a ASCII call sal_dato ; Presentar dígito inx h ; Apuntar dígito siguiente dcr c ; Cuenta de valores presentados jnz texto2 ; Si no es el último valor, continuar presentando ret ; Es el último, retornar. end ;----------------------------------------------------------------------------------------------------------------------

Page 578: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

559

;---------------------------------------------------------------------------------------------------------------------- ; Rutina ESP_5MS ;---------------------------------------------------------------------------------------------------------------------- public esp_5ms defseg progr seg progr ;---------------------------------------------------------------------------------------------------------------------- esp_5ms: push d lxi d,281h esp: dcx d mov a,e ora d jnz esp pop d ret end ;----------------------------------------------------------------------------------------------------------------------

Fig. 9.41. Módulo LCD del programa 8085Simulator Ide.

Fig. 9.42. Puerto de conexión del módulo LCD.

Page 579: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

560

9.2.2 Sección del temporizador-contador del 8155

Además de 256 bytes de memoria RWM y de 3 puertos de E/S, el 8155 tiene un temporizador contador programable que puede usarse en aplicaciones que requie-ran control de tiempo. Las aplicaciones de un temporizador son diversas. Entre las funciones básicas del dispositivo se tienen:

• Generar retardos y medir el tiempo transcurrido entre dos eventos. • Realizar la cuenta de eventos. • Generar velocidades de baudios para el canal de comunicación serie.

En la práctica, el uso de un temporizador sólo lo limita la imaginación del di-señador. Este puede usarse para generar sonido, medir variables físicas como tempe-ratura y humedad, convertir de voltaje a frecuencia, controlar servomotores; y en ge-neral, está presente en toda aplicación que involucre generación y control de tiempo. El uso de un circuito para generar, por ejemplo: tiempos de espera, libera al µP de la tarea de mantenerse en un lazo sin hacer nada por la duración del retardo. La CPU sólo debe programar el modo de operación, arrancar el temporizador y esperar que éste le indique el final del retardo.

La sección del timer del 8155 es un temporizador contador binario descenden-

te de 14 bits, el cual registra los pulsos de entrada y al culminar la cuenta, entrega a su salida una onda cuadrada o un pulso, de acuerdo con el modo de operación pre-viamente programado. La figura 9.43 muestra las líneas de entrada y salida del tem-porizador. Los terminales TIMER IN y OUTTIMER − son externos. Al primero se conectan los pulsos a contar y en el segundo se presenta la señal de salida.

Fig. 9.43. Entradas y salidas de la sección del timer del 8155.

Las entradas AD0-AD7 corresponden a los terminales del 8155 y permiten el acceso a los registros. TH y TL son señales internas al 8155 y se usan para seleccio-

AD0-AD7

TH

TIMER-IN

OUTTIMER −

Registro TH

Registro TL

TL

Page 580: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

561

nar los registros del contador. Debido a que la programación del temporizador se rea-liza por programa, desde el punto de vista del hardware, este puede verse como un componente con una entrada de reloj y una salida, como ilustra la figura 9.44.

Fig. 9.44. Entradas y salidas externas de la sección del timer del 8155.

Programación del temporizador-contador

Antes de ser puesto en operación, el dispositivo debe ser programado para in-dicarle el modo de operación y la longitud de la cuenta. Esta configuración se realiza cargando palabras de control en los registros internos del contador, de acuerdo con el formato mostrado en la figura 9.45. En el registro TL se cargan primero los ocho bits menos significativos de la cuenta y en TH los seis bits restantes. Los dos bits altos de TH, establecen el modo de operación.

Fig. 9.45. Formato de los registros internos del timer.

Como se observa en la figura 9.32, los dos bits de orden alto (TM2-TM1) del registro de comando se usan para funciones del contador. De modo que para arrancar o parar el temporizador, basta con escribir la palabra de control adecuada en el regis-tro de comandos. En la tabla 9.7 se especifican los cuatro comandos disponibles. De-bido a que el programa puede iniciar o parar al timer en cualquier momento, debe

TIMER-IN

OUTTIMER − TEMPORIZADOR

Page 581: Microprocesadores-Luis Urdaneta

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.

1 1 Carga el modo y longitud de la cuenta. Si el timer está corriendo se espera el final de la cuenta antes de cargar el nuevo modo y longitud.

La longitud de la cuenta puede ser un valor entre 2 y 3FFFH. La salida

OUTTIMER − está normalmente en nivel alto y se puede seleccionar uno entre cuatro modos de operación, como se especifica en la tabla 9.8.

Tabla. 9.8. Modos de operación del temporizador.

M2 M1 0 0 Onda cuadrada. Pone la salida en cero durante la segunda

mitad de la cuenta. 0 1 Onda cuadrada con auto recarga. El periodo de la onda

cuadrada es igual a la longitud de la cuenta, la cual es recargada automáticamente al final del conteo.

1 0 Pulso único en nivel bajo cuando se alcanza el final de la cuenta.

1 1 Pulso en nivel bajo con auto recarga al final de la cuenta. Como se observa en la figura 9.46, cuando el modo 0 es seleccionado, se pro-

duce a la salida un ciclo de onda cuadrada. Por ejemplo, si la longitud de la cuenta es 4, durante los primeros 2 ciclos de reloj la salida permanecerá en alto y durante los siguientes 2 pulsos se pondrá en bajo. Para una longitud de 5, el tiempo en uno lógico será de 3 periodos de reloj y el tiempo en cero de dos ciclos de reloj. Para modo 1,

Fig. 9.46. Formas de ondas de salida según el modo seleccionado.. se recarga la longitud y se repite el ciclo continuamente hasta cuando se pare el con-tador. Para el modo 2, con una cuenta de 5, la salida permanecerá en alto durante 4

Page 582: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

563

periodos de reloj y en cero durante el quinto ciclo. En el modo 3 se recarga la longi-tud generándose un tren de pulsos, con las características descritas. Ejemplo 9.10

Se tiene un 8155 decodificado en la dirección 40H y se usará el temporizador

para generar una señal de reloj de frecuencia seleccionada por la posición de tres in-terruptores S0-2 conectados a las líneas PA0-2 del puerto A. Considere que la frecuen-cia de oscilación del cristal externo del µP es de 6.144 MHz. La tabla 9.9 indica co-mo se selecciona la frecuencia de salida y la figura 9.47 muestra el circuito de gene-ración de señales.

Tabla. 9.9. Selección de la frecuencia de salida.

S2 S1 S0 Frecuencia (Hz) 0 0 0 300 0 0 1 600 0 1 0 1200 0 1 1 2400 1 0 0 4800 1 0 1 9600 1 1 0 9600 1 1 1 9600

Fig. 9.47. Generador de reloj de frecuencia variable.

Page 583: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

564

Solución:

El temporizador funciona en el modo de onda cuadrada con auto recarga y de-be generarse una tabla de valores para la longitud de la cuenta, en función del estado de cada interruptor. Para una frecuencia fx la longitud de la cuenta se calcula con:

fclklcfx

=

Para una frecuencia de 4800 Hz y un reloj externo de 6.144 Mz se tiene,

6404800

10072.3lc6=

×=

Usando la ecuación se obtiene la siguiente tabla.

Tabla. 9.9. Frecuencia de salida en función de la longitud de la cuenta.

Frecuencia (Hz)

Longitud decimal de la cuenta

300 10240 600 5120 1200 2560 2400 1280 4800 640 9600 320

La subrutina CLK lee los interruptores y encuentra en la tabla la longitud co-

rrespondiente. A continuación se cargan los registros TL y TH y se arranca el tempo-rizador.

; Generador de reloj ;---------------------------------------------------------------------------------------------------------------------------; Definición de etiquetas ;---------------------------------------------------------------------------------------------------------------------------modo_timer equ 40h ; Onda cuadrada con autorecarga inic_timer equ 0C0h ; Arrancar timer palb_ctrl equ 2 tope_pila equ 200h ;---------------------------------------------------------------------------------------------------------------------------; Definición de segmentos ;--------------------------------------------------------------------------------------------------------------------------- defseg puertos,start=40h, class=iospace ; 8155 en dirección 40h defseg progr, class=code, start=0 ; Segmento de código

Page 584: Microprocesadores-Luis Urdaneta

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 ;---------------------------------------------------------------------------------------------------------------------------

Page 585: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

566

El temporizador puede ser usado para interrumpir al µP en intervalos específi-cos para realizar una función determinada. En estos casos, la salida del temporizador se conecta a una entrada de interrupción de la CPU. Usando la entrada RST7.5, cada vez que la salida se coloque en alto, se realizará al microprocesador una solicitud de interrupción. Ejemplo 9.11

Una aplicación requiere incrementar en uno, cada 32 µs, un contador de 16

bits. El inicio de la cuenta lo marca el flanco posterior de un pulso generado por el µP en el bit PB0 de un 8155. Esta señal afecta un circuito externo no mostrado. Transcu-rrido un tiempo tx, la red coloca la entrada PA0 en nivel lógico uno notificando el fi-nal de la cuenta. En este instante, el contenido del registro DE, usado como contador, debe almacenarse a partir de la dirección de memoria MEM.

Solución: Para resolver el problema, se usa el temporizador del 8155 con su salida co-nectada a la entrada de interrupción RST 7.5, como ilustra la figura 9.48. El timer es configurado para entregar, cada 32 µs, un pulso de salida con auto recarga. La rutina de servicio de interrupción deberá incrementar en uno el registro par DE. Una vez iniciada la cuenta, el programa se mantendrá examinando la línea PA0, en espera que conmute a nivel alto para detener el timer y almacenar la cuenta final en memoria.

Fig. 9.48. Circuito para el ejemplo 9.11

Page 586: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

567

El código del programa se muestra a continuación. El registro DE se usa como contador y el resultado se almacena en la dirección de memoria 200H y siguiente. Al final de la cuenta, el programa para el timer y entra en un estado de parada. La ins-trucción HLT al final, se usa para detener la simulación del programa y examinar el valor final de la cuenta en memoria. En la práctica, el valor registrado puede conver-tirse a BCD y presentarse en una pantalla y reiniciar el proceso con un nuevo ciclo de medida.

; Ejemplo 9.11 ;--------------------------------------------------------------------------------------------------------------------------- ; Definición de etiquetas ;--------------------------------------------------------------------------------------------------------------------------- modo_timer equ 0c0h ; Un pulso al final de la cuenta inic_timer equ 0C0h ; Arrancar timer parar_timer equ 40h ; Parar timer palb_ctrl equ 2 ; PA:entrada PB:salida mem equ 200h long equ 100 ; Longitud de la cuenta tope_pila equ 300h ;--------------------------------------------------------------------------------------------------------------------------- ; Definición de segmentos ;--------------------------------------------------------------------------------------------------------------------------- defseg int, start=3ch ; Vector de interrupción defseg puertos,start=50h, class=iospace ; 8155 en dirección 50h defseg progr, class=code, start=100h ; Segmento de código ;--------------------------------------------------------------------------------------------------------------------------- ; Puertos del 8155 ;--------------------------------------------------------------------------------------------------------------------------- seg puertos pctrl_8155 ds 1 ; Puerto de control del 8155 pa_8155 ds 1 ; Puerto de entrada pb_8155 ds 2 ; Puerto de salida timer_bajo ds 1 ; Registro bajo del contador timer_alto ds 1 ; Registro alto del contador ;--------------------------------------------------------------------------------------------------------------------------- ; Rutina de servicio de interrupción ;--------------------------------------------------------------------------------------------------------------------------- seg int inx d ; Incrementar contador ei ; Rehabilitar interrupciones ret ; Retornar desde interrupción ;--------------------------------------------------------------------------------------------------------------------------- ; Programa principal ;--------------------------------------------------------------------------------------------------------------------------- seg progr lxi sp,tope_pila ; Iniciar apuntador de pila mvi a,palb_ctrl ; Cargar e A la palabra de control out pctrl_8155 ; Programar ; PA:entrada PB:salida ori 1 out pb_8155 ; Pulso de inicio a nivel alto lxi d,0 ; Contador a cero mvi a,long ; Byte bajo de Longitud de cuenta al acumulador out timer_bajo ; Cargar byte bajo de cuenta en TL

Page 587: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

568

mvi a, modo_timer ; Cargar modo en el acumulador out timer_alto ; Cargar modo y byte alto de cuenta en TH xra a ; Cero al acumulador out pb_8155 ; Pulso de inicio a cero mvi a,inic_timer or palb_ctrl out pctrl_8155 ; Arrancar timer mvi a,0bh ; Máscara de interrupción sim ; Desenmascarar entrada RST 7.5 ei ; Habilitar interrupciones esp: in pa_8155 ; Leer Puerto A rar ; Bit 0 a la bandera de acarreo jnc esp ; Si es cero, esperar mvi a,parar_timer or palb_ctrl out pctrl_8155 ; Si es uno, parar timer xchg ; Cuenta final al registro HL shld mem ; Almacenar cuenta final en memoria hlt end ;--------------------------------------------------------------------------------------------------------------------------- Ejemplo 9.12

Se debe construir y programar un generador de forma de ondas usando el 8155 #2 del microcomputador MPR-85 PLUS. El instrumento debe tener dos entradas: la primera es un pulsador para selección del tipo de señal de salida entre: seno, cuadra-da, triangular o diente de sierra. Al aplicarse energía al circuito debe generarse una onda seno. Las activaciones subsecuentes del pulsador seleccionarán una salida dife-rente en el orden especificado. La segunda entrada es un arreglo de siete interruptores lógicos que permite variar la frecuencia de la señal de salida. La figura 9.49 muestra el circuito del generador. Solución:

Para el diseño del instrumento se utiliza el circuito integrado de E/S PPI 8155 #2 del MPR-85 PLUS, el cual es decodificado en la dirección 50H. Como se observa en la figura 9.49, el puerto A (51H) se configura como salida con sus terminales co-nectados a las entradas de convertidor análogo digital DAC0808. Los interruptores SW1-SW7, para variar la frecuencia de la salida, se acoplan a los siete bits bajos del puerto de entrada 52H (Puerto B del 8155) y la salida de la red de supresión de rebo-tes del pulsador S1 de selección de forma de onda, es cableado a la línea P52.7 del mismo puerto.

Para generar una tensión analógica en VS basta con escribir el valor digital co-rrespondiente en el puerto A del 8155. El circuito DAC0808 tiene una resolución de 8 bits y es configurado para entregar una corriente de salida IOUT desde 0 hasta la co-rriente de final de escala IFS. Las entradas A1-8 toman valores entre 00 y FFH. La co-rriente OUTI es complementaria de IOUT de modo que:

Page 588: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

569

Fig. 9.49. Circuito para el generador de forma de onda

Page 589: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

570

OUTOUTFS III += , para toda entrada.

La corriente de fin de escala viene dada por la ecuación:

2

2RV

I

22II

5.6K refR 5.0VrefV , n

1n

ref

refFS

n

1n

refFS

==−

×=

×=

La intensidad de salida para cualquier valor de entrada es:

n10base

ref

refOUT 2

ARV

I ×=

El amplificador operacional a la salida del CAD entrega una tensión VS entre 0 y +IFS×5.6K.

10base810basenref

S

OUTS

A25A

2V

V

K6.5IV

×=×=

×=

Para una entrada digital 100101112 = 15110 la tensión de salida será igual a:

V95.21512565VS +=×=

Debido a que se usa un paso para representar el voltaje cero, la tensión máxi-

ma de salida será:

V98.42552565V máxS +=×=

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.

Page 590: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

571

Fig. 9.50. Se genera una muestra cada tx.

El tiempo tx entre muestras lo fija el valor cargado en los registros del tempo-rizador/contador, configurado para pulso único con auto recarga. Los 7 bits de mayor orden del registro TL corresponden al estado de los interruptores SW7-SW1 y el bit menos significativo de TL se pone a cero. Los 6 bits altos del contador se cargan con ceros. Para detectar cuando se debe escribir la siguiente muestra, se puede conectar la salida del timer a la entrada de interrupción RST 7.5, para que se realice una solicitud de interrupción cada vez que el contador alcance el final de la cuenta. En este caso, se usa la instrucción RIM para examinar si existen interrupciones pendientes. Otro mo-do, el utilizado en este ejemplo, es examinar el estado del bit D6 del registro de estado del 8155 y producir la siguiente muestra cada vez que D6 se coloque en uno.

Para seleccionar el tipo de onda, se usa un contador de módulo 3 que registra el orden en el cual es activado el pulsador. Al inicio el contador está en 0, indicando salida seno. Las subsecuentes activaciones lo pone en 1 para onda cuadrada, en 2 para triangular y en 3 para diente sierra. Al presionarse S1 por cuarta vez el contador vuel-ve a 0 reiniciándose la secuencia con salida seno. Con el programa en ejecución, se lee el tipo de onda y su frecuencia y se genera un ciclo de la forma de onda deseada a la frecuencia especificada. A continuación se vuelve a leer el estado de los interrupto-res SW1-7 y S1 para generar el siguiente periodo de la misma señal o el primer ciclo de nueva onda de salida.

Para generar la onda seno se utiliza una tabla de valores. La k-ésima muestra

Nk se obtiene con la siguiente ecuación, donde n es el número de muestras en un pe-riodo:

Page 591: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

572

Para que la frecuencia seleccionada sea la misma para todos los tipos de on-das, es necesario generar el mismo número de muestras por ciclo y escribir una mues-tra cada T/n, donde T es el periodo de la forma de onda. Se desea una amplitud de la salida de 5.0 V (4.98 V) con 128 muestras por ciclo. Con la señal seno no hay pro-blema en usar una tabla de 64 valores (medio ciclo) y con la onda cuadrada basta con escribir 64 muestras en nivel bajo y otras 64 en alto. Pero en el caso de la forma de onda triangular, para obtener la amplitud deseada, la señal debe variar entre 0 y FFH cada medio ciclo, lo cual equivale a 512 muestras por ciclo.

Para ajustar el número de muestras a 128, se carga (para la pendiente positi-

va) en el DAC los valores 0,4,8,0CH,…,FCH,…0CH,8,4,0; lo cual representa 64 muestras en el semiciclo ascendente y 64 muestras en el descendente. Como resultado la amplitud se reduce a 4.93 V. Para que toda salida tenga igual amplitud se ajusta la tabla de valores de la onda seno y el valor de del nivel alto de la onda cuadrada. En el caso de la señal diente de sierra se carga a la entrada del DAC la secuencia 0,2,4,5,8,0AH,…,0FEH para 128 muestras por ciclo.

El código del generador consta de un programa principal para detectar el tipo

y frecuencia de la onda y generar la señal correspondiente y una subrutina que escribe el valor digital de la muestra en el puerto A, cada vez que el temporizador alcanza el final de la cuenta.

$title(Generador de onda) ;--------------------------------------------------------------------------------------------------------------------------- i_stack equ 8FF0H ; Inicio de la pila modo_timer equ 0C0h ; Pulso único con autorecarga inic_timer equ 0CDh ; Palabra de control para arrancar temporizador ;--------------------------------------------------------------------------------------------------------------------------- ; Definición de segmentos defseg puertos,start=50h, class=iospace, absolute defseg pila, start=i_stack defseg progr, class=code, start=6002h ;--------------------------------------------------------------------------------------------------------------------------- ; Puertos de entrada del sistema seg puertos pctrl_8155: ds 1 ; Registro de control del 8155. pa_8155: ds 1 ; El CDA se conecta al puerto de salida A. pb_8155: ds 2 ; Puerto B entrada para selección de tipo y frecuencia de la onda. timer_bajo: ds 1 ; Modo del temporizador y 6 bits altos de longitud de la cuenta timer_alto: ds 1 ; Byte menos semicl_2ificativo de longitud de la cuenta. ;--------------------------------------------------------------------------------------------------------------------------- ; Los 16 bytes últimos de RWM soportan el stack. seg pila ds 10H ;--------------------------------------------------------------------------------------------------------------------------- t_stack:equ $-1 ; Base de la pila ;---------------------------------------------------------------------------------------------------------------------------

Page 592: Microprocesadores-Luis Urdaneta

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

Page 593: Microprocesadores-Luis Urdaneta

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 ;---------------------------------------------------------------------------------------------------------------------------

Page 594: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

575

Fig. 9.51. Formas de onda como se ven en un osciloscopio. 2 V/div, 5 ms/div.

Page 595: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

576

Fig. 9.52. Forma de onda seno.

Page 596: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

577

Fig. 9.53. Salida onda cuadrada.

Page 597: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

578

Fig. 9.54. Señal triangular.

Page 598: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

579

Fig. 9.55. Onda diente de sierra

Page 599: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

580

9.3 CONTROLADOR DE TECLADO Y PANTALLA 8279 En el diseño aplicaciones de sistemas empotrados donde el µP deba realizar

operaciones de lectura de teclado y presentación de información en pantallas multi-plexadas de indicadores de siete segmentos, conviene considerar el uso de un contro-lador de teclado/display, para reducir el tamaño del código y liberar al µP de realizar estas tareas, para que pueda dedicarse a otras funciones. El circuito 8279, es un con-trolador de teclado/pantalla diseñado para sistemas MCS 85/86 y que en la práctica puede interconectarse con facilidad a cualquier microprocesador. El dispositivo origi-nalmente introducido por INTEL, es ofrecido por las empresas Alliance Core y Aldec, entre otras, como un módulo lógico especialmente diseñado para FPGAs, facilitando la actualización o diseño de la aplicación, al permitir al diseñador incorporar las fun-ciones del 8279 y otras unidades lógicas en dispositivos programables modernos. Las características resaltantes de controlador 8279 son:

• Operaciones simultaneas sobre teclado y pantalla.

• Modos de barrido de teclado y matriz de sensores.

• Interconexión de un teclado de hasta 64 teclas (8x8).

• Control de pantallas de hasta 16 dígitos.

• Dos memorias pequeñas contienen los caracteres a presentarse y las entradas de teclado:

1. La memoria RAM de display puede almacenar hasta 16 bytes. Contiene los códigos 7- segmentos de los caracteres a presentar.

2. Una memoria FIFO/RAM de teclado almacena las últimas 8 teclas activadas,

• Protección contra pulsación simultaneas de teclas y supresión del rebote de contactos.

• Modo de operación y temporización seleccionadas por programa.

• Salida de interrupción al pulsarse una tecla.

Fig. 9.56. Símbolo lógico y distribución de terminales del 8279.

Page 600: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

581

El 8279 es básicamente una técnica hardware para conectar al µP una matriz de teclado y una pantalla multiplexada de indicadores incandescentes. Las funciones realizadas por el chip, de exploración de la matriz de teclas y actualización periódica del display, aumentan el rendimiento de la CPU, al reducir el tamaño y complejidad del código. El diagrama de bloques del controlador se muestra en la figura 9.57.

Fig. 9.57. Diagrama funcional del 8279.

DEFINICIÓN FUNCIONAL DE LOS TERMINALES DEL 8279 CS Un nivel bajo en este terminal permite la comunicación entre el µP y el 8279.

WR / RD Estas entradas se activan a cero durante una operación de escritura/lectura del µP.

CLK Entrada de reloj para sincronización interna.

BD Un nivel en esta salida apaga los indicadores durante la conmutación entre dígitos o en la ejecución de un comando de apagado

DB[7:0]

Es el bus de datos bidireccional y tres estados por medio del cual se transfieren comandos y/o datos entre el controlador y el µP.

A0 Dirección del buffer: Un nivel alto en esta entrada indica que la información de E/S son comandos o condiciones de estado. Un uno lógico notifica que deben interpretarse como datos.

RESET Un alto en esta entrada inicia el controlador en modos de operación y de sincronización por defecto. A0 Dirección del buffer: Un nivel alto en esta entrada indica que la información de E/S son comandos o

condiciones de estado. Un uno lógico notifica que deben interpretarse como datos. IRQ Salida de solicitud de interrupción: En el modo de teclado sube a nivel alto cuando hay datos en la

RAM FIFO y retorna a bajo con cada lectura de la FIFO. Vuelve a uno si quedan datos sin leer en la RAM. En el modo SENSOR va a alto si se detecta un cambio en un sensor.

SL[3:0] Líneas de barrido: salidas usadas para explorar el teclado y para activar los indicadores de la pantalla. RL[7:0]

Líneas de retorno: Entradas desde la matriz de teclado o de sensores. Son conectadas a SL[3:0] por la presión de una tecla. También provee un byte de entrada en el modo de entrada STROBE.

SHIFT

En el modo de teclado, el estado de esta entrada es almacenado junto con la posición de la tecla presio-nada.

CNT/STB

En el modo de teclado, el estado de esta entrada CONTROL es almacenado junto con la posición de la tecla presionada. También sirve como entrada de habilitación para cargar datos en la FIFO en el modo de entrada STROBE.

OUTA[3:0], OUTB[3:0]

El contenido de la RAM de display se presenta en estas salidas sincronizadas con las líneas de barrido.

Page 601: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

582

9.3.1 Funcionamiento del 8279 El controlador de teclado/pantalla es un circuito complejo con múltiples mo-

dos de operación y que puede ser interconectado a matrices de pulsadores, teclados codificados o arreglo de sensores y a pantallas multiplexadas de hasta 16 dígitos. En esta sección, se discuten algunos aspectos del modo de funcionamiento y de la pro-gramación del circuito. Para acceder una descripción detalla del controlador se reco-mienda al lector examinar la hoja técnica de datos del chip.

Como ilustran las figuras 9.56 y 9.57, el 8279 tiene terminales de E/S para in-

terconexión con el µP, teclado e indicadores luminosos. El controlador requiere una señal de 100 KHz para su sincronización. La frecuencia del reloj externo aplicado al terminal CLK del circuito integrado, es dividida internamente para obtener los 100 KHz necesarios. El valor del divisor del reloj es cargado por una palabra de control durante la programación inicial del chip.

Fig. 9.58. Diagrama simplificado del 8279. Un nivel alto aplicado a le entrada RESET inicia al 8279 con la siguiente con-

figuración: • Presentación de 16 caracteres de 8 bits. Entrada por la izquierda. • Exploración codificada de teclado con protección contra pulsación simultánea de 2 teclas (2-

key lockout). • El divisor de reloj se carga con 31. El controlador puede operar con pantallas multiplexadas de 8 ó 16 caracteres,

con salidas por dos puertos de 4 bits (OUTA[3:0], OUTB[3:0]) o un puerto de 8 bits (A3=D7,B0=D0); y con la entrada de dígitos por la derecha o por la izquierda. El 8279 tiene un bloque RAM de 16 x 8 la cual contiene los códigos de los caracteres que se presentan en los indicadores de la pantalla y la cual puede ser escrita o leída por el µP en cualquier momento. Es posible programar el auto incremento del conta-

Page 602: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

583

dor de direcciones con cada operación de E/S. Cada dígito de la pantalla tiene asigna-da una posición de la memoria de display.

Con el formato de entrada por la derecha, el número del indicador (0-F) se co-

rresponde con la dirección de la RAM de display. La posición 0 de la memoria alma-cena el código del carácter presentado en el dígito más a la izquierda (L0), la direc-ción 1 con el siguiente (L1) y así sucesivamente. Si se programa el auto incremento del contador de direcciones, cada nueva entrada se cargará en posiciones consecutivas de la RAM a partir de la celda inicial.

Una vez actualizada la posición final (7 ó 15), según el modo de salida pro-

gramado (8 ó 16 dígitos) se sobrescribe la dirección 0. Sin auto incremento, es posi-ble presentar un carácter en cualquier dígito usando un comando de escritura en la RAM de display. En entrada por la izquierda, el primer caracter se presenta en el dígi-to más a la derecha. Con auto incremento, la siguiente entrada se carga en la misma posición de la RAM de display donde está el dato anterior y éste se mueve a la si-guiente localidad.

El 8279 puede operar con tres tipos de dispositivos de entrada: con una matriz

de pulsadores, con un teclado con entrada por señal estroboscópica o con una matriz de sensores. Con una matriz de teclas, las salidas del contador de exploración SL [0:3], son usadas para realizar un barrido de las filas del teclado y detectar, por las líneas de retorno, la columna a la cual pertenece la tecla presionada. Este contador puede programarse en dos modalidades.

Con exploración codificada, se presenta una cuenta binaria entre 0 y 15, de

modo que debe usarse un circuito decodificador 1 de 8 para generar las señales de exploración aplicadas a cada fila, y un decodificador 1 de16 para actualizar los dis-plays. En esta forma el controlador 8279 puede manejar un teclado de hasta 8 filas (8 x 8) y presentar 16 caracteres. En este modo, el 8279 coloca un cero en una de las filas conectadas a las líneas SL [0:3] y examina el estado de las teclas, leyendo las entradas de retorno RL[0:7].

Las entradas RL[0:7] están conectadas a 5 V por resistores internos, de modo

que si cualquiera de estos terminales está en cero, indicará la activación de una tecla. Entonces, el controlador espera un tiempo de 10 ms para suprimir el efecto de rebote de contactos y lee de nuevo RL[0:7]. Si la misma tecla permanece pulsada, se alma-cena su posición en la FIFO/RAM.

La memoria FIFO/RAM funciona como una estructura FIFO de 8 bits y pro-

fundidad de 8, cuando se opera en el modo teclado o entrada por señal STROBE. Los datos son cargados dentro de la FIFO y posteriormente son leídos en el mismo orden en el cual fueron almacenados. En el modo de exploración de teclado, el byte cargado en la FIFO indica la posición del pulsador en el teclado y el estado de las entradas SHIFT y CNTL a las cuales se supone conectadas las teclas SHIFT y CTRL. La figura 9.59 muestra el formato del dato en la FIFO.

Page 603: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

584

D7 D6 D5 D4 D3 D2 D1 D0

CNTL SHIFT FILA COLUMNA 0 0 0 1 1 1 0 0

Fig. 9.59. Formato del dato en la FIFO.

Cuando no se usan las entradas CNTL y SHIFT, estas se conectan a tierra, de

modo que si se presiona la tecla en la fila 3 y columna 4, el byte en la FIFO será 1CH Además de realizar la supresión del rebote, el 8279 puede ser programado pa-

ra protección contra activación simultánea de teclas. Existen dos modalidades dispo-nibles: 2-key lockout/N-key rollover. El primer modo bloquea el reconocimiento y la carga en la FIFO, si dos teclas son presionadas simultáneamente. Una tecla debe ser liberada antes que la proxima tecla activada sea procesada. Sólo se acepta como váli-da la última tecla activada. El segundo modo acepta todas las teclas presionadas. Si dos teclas son activadas casi al mismo tiempo, ambas son aceptadas como válidas y sus códigos son almacenados en la FIFO, en el orden en el cual éstas fueron pulsadas.

La segunda modalidad del contador con salidas SL [0:3], es el de exploración

decodificada, cuando se decodifican los dos bits de orden bajo del contador para pre-sentar una salida 1 de 4. Con esta forma de barrido, se activa, a la vez, a nivel alto uno de los terminales SL [0:3]. Como estos pines se usan tanto para explorar el tecla-do como para refrescar la pantalla, el barrido decodificado limita a 4 el número de filas del teclado y de indicadores de la pantalla.

Cuando se conecta al 8279 una matriz de sensores, durante la exploración de

las filas no se realiza la protección contra rebotes. En este modo, la FIFO/RAM fun-ciona como una memoria RAM de 8 bytes. Cada fila de la RAM es cargada con el esta-do de los sensores de la fila correspondiente en la matriz. A medida que el arreglo de sensores es explorado, el complemento del estado de las líneas de retorno RL[0:7] es cargado en la posición de la RAM, cuya dirección es especificada por el contador de exploración. Esto significa, que la memoria contiene una imagen del estado de los sen-sores de cada fila. Si el dispositivo de entrada es un teclado con señal STROBE, el es-tado invertido de las entradas RL[0:7] (código de la tecla) es almacenado en la FIFO/RAM (operando como FIFO), durante el flanco de subida de la señal de habili-tación conectada al terminal STB/CNTL .

En los modos de teclado, la señal de salida IRQ se pone en nivel alto cuando

hay datos en la FIFO. IRQ es regresada a cero con cada lectura de la FIFO y retorna a nivel alto si permanecen posiciones sin leer en la FIFO. En el modo de matriz de sen-sores IRQ es activada cuando se detecta un cambio en el sensor.

El bloque estado de la FIFO/RAM en la figura 9.57, mantiene al día las condi-

ciones operativas de la FIFO. El µP puede leer la palabra de estados de la FIFO con A0 en nivel alto. Además de indicaciones de error, este byte puede usarse en los mo-

Page 604: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

585

dos de teclado para detectar la activación de una tecla sin necesidad de recurrir al uso de interrupciones. La función de cada bit de la palabra de estados se indica en la figura 9.60.

D7 D6 D5 D4 D3 D2 D1 D0 DU S/E O U F N N N

Fig. 9.60. Palabra de estados de la FIFO/RAM.

Los bits D2:0 (NNN) indican el número de teclas válidas activadas. El bit F (D3)

se activa cuando la FIFO está llena. D5:4 son indicaciones de error: O (overrun) notifi-ca que se intentó escribir en la FIFO cuando estaba llena, U (underrun) señala que se quiso leer la FIFO estando vacía. En el modo especial de error. El bit S/E indica que se presionaron varias teclas a la vez. D7 es una bandera que advierte que la RAM de display no esta disponible porque la pantalla está apagada o en proceso de apagado.

9.3.2 Programación del 8279 El 8279 debe ser programado antes de usarse por medio de comandos enviados

al circuito integrado con la CS en cero y A0 en nivel alto. Los primeros tres bits del byte cargado en el registro de control del 8279 en el flaco de subida de WR seleccio-nan una de ocho comandos disponibles, los cuales se describen en la siguiente tabla.

Tabla.9.10.Palabras de control del 8279.

D7 D6 D5 Función Propósito 0 0 0 Seleccionar modo Fija el modo de teclado. El número de caracteres de la pantalla y

el tipo de exploración. 0 0 1 Reloj Programa el divisor de reloj interno.

0 1 0 Lectura de FIFO Habilita la lectura de la FIFO/RAM. Indica la dirección que se va a leer.

0 1 1 Lectura de RAM de d display

Habilita la lectura de la RAM de display. Indica la dirección que se va a leer.

1 0 0 Escritura en RAM de display

Habilita la escritura de la RAM de display. Indica la dirección q que se va a leer.

1 0 1 Deshabilita escritura de display Inhibe la presentación de caracteres y apaga la pantalla.

1 1 0 Borrado Limpia la RAM de display o la FIFO.

1 1 1 Fin de interrupción. Modo especial de error. Desactiva la salida IRQ. Activa el modo especial de error.

Número de entra-das en la FIFO. Error

lectura.

Errorescritura.

FIFO llena.

RAMdisplay no

disponible.

Bandera

cierre sensor/Bandera error pulsaciones

múltiples.

Page 605: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

586

1. Selección de modo teclado/pantalla

D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 D D K K K

KKK MODOS 000 Teclado con exploración codificada - 2 key lockout. 001 Teclado con exploración decodificada - 2 key lockout. 010 Teclado con exploración codificada - N key rollover. 011 Teclado con exploración decodificada - N key rollover. 100 Matriz de sensores con exploración codificada. 101 Matriz de sensores con exploración decodificada. 110 Entrada por señal STROBE. Barrido codificado de pantalla. 111 Entrada por señal STROBE. Barrido decodificado de pantalla. DD 00 Pantalla de 8 caracteres de 8 bits. Entrada por la izquierda. 01 Pantalla de 16 caracteres de 8 bits. Entrada por la izquierda. 10 Pantalla de 8 caracteres de 8 bits. Entrada por la derecha. 11 Pantalla de 16 caracteres de 8 bits. Entrada por la derecha.

Fig.9.61.Modos de teclado y pantalla. 2. Programación del reloj

D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 P P P P P

Fig.9.62.Divisor del reloj.

Un divisor de frecuencia programable genera el reloj de sincronización interna a partir de la señal aplicada a la entrada CLK. El valor del divisor es fijado por los bits PPPPP de esta palabra de control. Por ejemplo para un reloj externo de 2.5 MHz, debe cargarse 00111001 en el registro de control. Si el µP funciona con un reloj in-terno de 3.125 MHz o 3.070 MHz como en nuestro caso, no es necesario usar este comando porque después de un reset el divisor es cargado por defecto con el valor 31.

3. Lectura de la memoria FIFO/RAM

D7 D6 D5 D4 D3 D2 D1 D0 0 1 0 AI X A A A

Fig.9.63. Palabra de control para lectura de la memoria FIFO/RAM.

Dirección de la FIFO/RAM.

Auto incremento de la dirección.

Page 606: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

587

Una operación de lectura realizada después de este comando retorna en el acumulador el contenido de dirección AAA de la FIFO/RAM. Si el bit AI está en uno, subsiguientes lecturas entregan el contenido de las subsecuentes localizaciones.

4. Lectura de la memoria RAM de pantalla

D7 D6 D5 D4 D3 D2 D1 D0 0 1 1 AI A A A A

Fig.9.64. Comando para lectura de la memoria RAM de display.

Si luego de enviar este comando al 8279 se realiza una operación de lectura, el

dispositivo retorna en el acumulador el contenido de la posición de memoria RAM de pantalla con dirección AAAA. Si el bit AI es uno, la dirección se incrementa en uno después de cada lectura.

5. Escritura de la memoria RAM de pantalla

D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 AI A A A A

Fig.9.65. Formato de la palabra de control para escritura de la memoria RAM de display.

Después de ejecutar este comando, el dato enviado al controlador es almace-

nado en la posición con dirección AAAA de la RAM de pantalla. Si el bit AI es pues-to a 1, se seleccionará la siguiente localización con cada escritura en la memoria.

6. Inhibición de escritura y apagado de pantalla

D7 D6 D5 D4 D3 D2 D1 D0 1 0 1 X IWA IWB BLA BLB

Fig.9.66. Bloqueo y apagado de pantalla.

Dirección de la RAM de pantalla.

Auto incremento de la dirección.

Dirección de la RAM de pantalla.

Auto incremento de la dirección.

Page 607: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

588

Los bits IWA e IWB se usan para enmascarar los puertos de 4 bits A o B, en aplicaciones que usan puertos separados de pantalla con 4 bits. Cuando se activan estos bits, los caracteres mostrados por el puerto correspondiente no varían aún cuan-do se cambie el contenido de la RAM de display.

Los bits BL se usan para el apagado de cada puerto. El último comando de bo-

rrado determina el código de apagado. Después de un reset, el código es cero.

7. Borrado

D7 D6 D5 D4 D3 D2 D1 D0 1 1 0 CD CD CD CF CA

Fig.9.67 Comando para borrado de las memorias internas del 8279.

Si el bit D4 está en uno, este comando cargará en todas las posiciones de la RAM de display el valor elegido por los dos bits CD de menor peso de acuerdo con: si D3-2 es 0X2 se cargará en la RAM el valor 000000002, si D3-2 es 102 se almacena en la RAM 001000002 y si D3-2 es 112 todas las posiciones de la RAM se llenarán con 111111112. Si el bit CF es puesto a uno, se limpia la memoria FIFO y se desactiva la salida IRQ. En el modo de matriz de sensores además el apuntador de direcciones selecciona la fila cero de la RAM. El bit CA activa una combinación de los efectos de CD y CF. En la práctica borra todas las memorias internas del 8279. 8. Fin de interrupción/Puesta en modo de error

D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 E X X X X

Fig.9.68. Palabra de control para desactivar solicitud de interrupción en modo sensor.

En el modo matriz de sensores, esta palabra de control lleva a cero la salida IRQ de solicitud de interrupción y habilita escrituras posteriores en la RAM (en este modo IRQ se activa cuando se detecta un cambio en el sensor inhibiendo además las escrituras en la RAM hasta un reset). Para el modo N key rollover, si E =1 el 8279 funcionará en el modo especial de error.

Ejemplo 9.13

Una matriz de teclado de 20 pulsadores se conecta al µP 8085 a través de un 8279, como se muestra en la figura 9.69. El reloj del sistema es 2.0 MHz y la salida IRQ del controlador de teclado se conecta ala línea de interrupción RST 6.5. El 8279 está decodificado en la dirección 20H. Escriba una subrutina de lectura de teclado que retorne el código de la tecla en el registro acumulador.

Page 608: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

589

Fig.9.69. interconexión de un teclado de 20 teclas al 8279.

Page 609: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

590

;---------------------------------------------------------------------------------------------------------------- ; Programa de lectura de teclado. ;---------------------------------------------------------------------------------------------------------------- pdato_8279 equ 20h ; Puerto de datos del 8279. pctrl_8279 equ 21h ; Puerto de comandos del 8279. div_reloj equ 00110100b ; Reloj de 2 Mhz. Divisor 20. modo_tcld equ 0 ; Teclado con exploración codificada leer_fifo equ 01010000b ; Se lee la FIFO. borra_fifo equ 11000010b ; Borrar FIFO. ;---------------------------------------------------------------------------------------------------------------- jmp inicio org 34h in pdato_8279 ; Leer dato desde teclado ret ; y retornar ;---------------------------------------------------------------------------------------------------------------- inicio: lxi sp,t_pila ; Cargar el apuntador de pila mvi a,div_reloj ; Divisor de reloj en 20. out pctrl_8279 mvi a,modo_tcld ; Modo de teclado out pctrl_8279 mvi a,borra_fifo ; Borrar la FIFO out pctrl_8279 mvi a,leer_fifo ; Activar lectura de la FIFO. out pctrl_8279 mvi a,0dh ; Desenmascarar interrupción RST 6.5. sim call leer_tcld ; Leer teclado. . . . ;---------------------------------------------------------------------------------------------------------------- ; Lee caracter desde teclado ;---------------------------------------------------------------------------------------------------------------- leer_tcld: ei ; Se habilitan las interrupciones hlt ; Se espera por pulsación de una tecla ret ; Retorno con código de tecla en el acumulador ;---------------------------------------------------------------------------------------------------------------- Muchas aplicaciones prácticas incorporan una pantalla de varios caracteres,

además del teclado. El 8279 puede controlar en forma simultánea ambos tipos de pe-riféricos. El ejemplo anterior, sólo con teclado, se presentó para mostrar el uso de la salida IRQ para la detección de la activación de una tecla. A continuación se expone un ejemplo del uso del 8279 en el manejo de teclado y pantalla. Debido a que la apli-cación siguiente es el programa monitor de una tarjeta de evaluación para aplicacio-nes basadas en el 8085, se dejan libres para el usuario las interrupciones (excepto TRAP). La detección de la presión de una tecla se realiza leyendo la palabra de esta-dos del 8279, cuyo formato se muestra en la figura 9.60. El programa mon85.asm es un monitor para cargar en la EPROM del microcomputador µPro 85 y ejecuta todas las funciones presentes en sistemas de desarrollo de bajo costo para carga, ejecución y depuración del código de aplicaciones con microprocesadores.

Page 610: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

591

Ejemplo 9.14 Se debe escribir un programa monitor para el control de un microcomputador

µPro 85 basado en el µP 8085. El µC tiene un teclado de 20 teclas y una pantalla de 6 caracteres, bajo el control de un 8279.

Fig.9.70. Teclado y pantalla del µPro 85. En este ejemplo no se presenta la arquitectura de la tarjeta del µC, exceptuan-

do la sección de teclado/pantalla, cuyo diagrama eléctrico se muestra en la figura 9.72. El resto del diseño se deja como ejercicio para los estudiantes del curso Siste-mas de µProcesadores. El µPro 85 es un µC con CPU 8085 y tiene 8 Kbytes de EPROM, 16 Kbytes de RWM, 12 puertos de E/S y 2 temporizadores. El mapa de me-moria y de puertos se muestra en la figura 9.71 y en la tabla 9.11, respectivamente.

Fig.9.71.Mapa de memoria del µPro 85. Los 8155 sólo ocupan 256 bytes de los bloques de 2 K. 0000H

1FFFH2000H

27FFH

2800H

2FFFH

3000H

6FFFH

FFFFH

7000H

EPROM

1 x 2764 8K

SRWM 1 x 8155

256 bytes

SRWM 2 x 6264

16K

LIBRE 36K

SRWM 1 x 8155

256 bytes

Page 611: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

592

Fig.9.72 Sección de teclado/pantalla del µPro 85.

Page 612: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

593

Tabla.9.11Direcciopnes de los puertos del µPro 85.

La entrada de interrupción TRAP es usada por el monitor para realizar la fun-ción de ejecución de programas por pasos, mientras que las instrucciones RST 1 y RST 7 se reservan para terminar un programa devolviendo el control al monitor y para la llamada de las rutinas de usuario, respectivamente. Todas las demás entradas e instrucciones de interrupción se dejan libres para su uso en el desarrollo de las aplica-ciones.

El programa monitor ejecuta saltos a la memoria SRWM del 8155 #1 como

respuesta a una solicitud de interrupción. Las direcciones de SWRM donde el usuario puede colocar una instrucción JMP hacia a la RSI que corresponda, se especifican en la siguiente tabla.

Tabla.9.12 Interrupciones del µPro 85.

INTERRUPCIÓN DIRECCIÓN INTERRUPCIÓN DIRECCIÓN RST 0 Reset por programa. RST 5.5 2025H RST 1 Reservada RST 6.0 2028H RST 2 2019H RST 6.5 202BH RST 3 201CH RST 7.0 Reservada RST 4 201FH RST 7.5 202EH RST 5 2022H TRAP Reservada

El monitor del microcomputador µPro 85 ofrece un grupo de subrutinas, las cuales pueden ser invocadas por el diseñador, para reducir el esfuerzo de desarrollo del programa de la aplicación. Estos programas de usuario son identificados con un número n: 0,…,4 y se llaman por medio del siguiente código:

mvi e, n rst 7

PUERTO FUNCIÓN DISPOSITIVO PUERTO FUNCIÓN DISPOSITIVO

00H PUERTO DATOS 28H CONTROL 01H PUERTO CONTROL 8279 29H PUERTO A 20H CONTROL 2AH PUERTO B 21H PUERTO A 2BH PUERTO C 8155 N° 2 22H PUERTO B 2CH LSB TIMER 23H PUERTO C 8155 N° 1 2DH MSB DEL TIMER 24H LSB TIMER 30H PUERTO A 25H MSB DEL TIMER 31H PUERTO B

32H PUERTO C 8255 N° 1 33H COMANDO 50H PUERTO A 51H PUERTO B 52H PUERTO C 8255 N° 2 53H COMANDO

Page 613: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

594

En la tabla 9.13 se describe la función de cada rutina de usuario y se indica el valor se n por medio del cual pueden ejecutarse.

Tabla.9.13 Rutinas de monitor del µPro 85.

Rutina n Descripción LEER_TCLD

0 Espera por la pulsación de una tecla y retorna su código en el registro acumulador.

MSTR_DR

1 Presenta el contenido del registro par HL en el campo de direcciones de la pantalla.

MSTR:_DT

2 Presenta el contenido del registro acumulador en el cam-po de datos de la pantalla.

CAMP_DIR 3 Muestra en el campo de direcciones de la pantalla la cadena de caracteres apuntada por el registro par HL.

CAMP_DAT 4 Muestra en el campo de datos de la pantalla la cadena de caracteres apuntada por el registro par HL.

La pantalla del microcomputador µPro 85 consta de seis indicadores incan-

descentes, agrupados en dos campos, como indica la parte superior de la figura 9.73. Para la realización de los programas que usen el teclado, el usuario debe conocer los códigos retornados por la activación de cada tecla. Estos son mostrados en la misma figura.

Fig.9.73 Campos de la pantalla. Leyenda y códigos de retorno del teclado del µPro 85.

Page 614: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

595

El mapa de caracteres de la tabla 9.14 muestra los códigos de los caracteres que pueden presentarse usando las rutinas CAMP_DIR y CAMP_DAT. En realidad este número corresponde a la posición del carácter en la tabla de códigos de siete segmentos. Es posible que el usuario desee presentar caracteres distintos a los mos-trados. Esto puede hacerlo, realizando accesos al 8279.

Tabla.9.14 Mapa de caracteres de µPro 85 Caracter en

pantalla Código Caracter en

pantalla Código

0 00H g 10H 1 01H H 11H 2 02H L 12H 3 03H M 13H 4 04H n 14H 5 05H i 15H 6 06H J 16H 7 07H o 17H 8 08H P 18H 9 09H q 19H A 0AH r 1AH B 0BH t 1BH C 0CH u 1CH D 0DH ¿ 1DH E 0EH _ 1EH F 0FH espacio 1FH

El modo en el cual se realizan las interconexiones entre el los indicadores y el

controlador 8279, determina el número que identifica a cada LED de la pantalla y el formato de los datos presentados en los displays de siete segmentos. Esta información se muestra en la figura 9.74.

Fig.9.74 Numeración de los LEDs y correspondencia entre las salidas del 8279 y los segmentos del

display.

Page 615: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

596

El µPro 85 genera algunos mensajes para comunicarse con el usuario. Estos se presentan en el campo de direcciones, y son los siguientes:

Fig.9.75 Mensajes del µPro 85. Las operaciones básicas que el ususario puede realizar con el microcomputa-

dor µPro 85 se describen a continuación: • Examinar y modificar el contenido de la memoria SWRM. • Examinar y modificar el contenido de los registros internos del µProcesador. • Ejecutar un programa de usuario a partir de una dirección determinada hasta encontrar una

instrucción RST 1 o HLT. • Ejecutar un programa de usuario por pasos.

Para ejecutar cada una de estas funciones, el usuario usa el teclado para intro-ducir comandos al µC. Algunos ejemplos de comandos son los siguientes:

1. <EXAM><M> <2> <0><0> <0> <↓> <↓><↓> <↓> <↵> Presenta en el campo de datos en forma sucesiva el contenido de la dirección de memoria

2000H, 2001H, 20021H, 2003H y devuelve el control al monitor mostrando el mensaje de identificación.

2. <EXAM> <M> <2> <0> <0> <0> <↓> <4> <5> <↓> <↵> Presenta en el campo de datos el byte en la posición 8000H de la SWRM, introduce el va-

lor 45H mostrándolo en el campo de datos y lo carga en la dirección 8000H presentándose el contenido de 8001H para finalmente devolver el control al monitor.

3. <EXAM> <R> <A> <↓> <↓><↓> <↓> <7> <F><↓ > <↵> Muestra en secuencia el contenido del registro acumulador A, de B, de C, de D, y del re-

gistro E. Sustituye por 7FH el valor almacenado en el registro E y devuelve el control a monitor.

Error. Introducir dirección de memoria. Espera tecla de registro. Programa de usuario en ejecución. Respuesta a tecla <EXAM>. Examinar registro: <R> o memoria: <M> Respuesta a tecla <EJEC>. Ejecución normal: <N> o paso a paso: <PP>

Page 616: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

597

4. <EJEC> <N> <↵> Ejecuta un programa en el modo de corrida libre, cuya primera instrucción se encuentra en

la posición de memoria cuya dirección muestra el campo de direcciones de la pantalla. 5. <EJEC> <N> <↓> <5> <0> <0> <0> <↵> Ejecuta un programa en corrida libre cuya primera instrucción se encuentra en la dirección

de memoria 5000H. 6. <EJEC> <PP> <↓> <↓><↓> <↓> <↓> <↵> Ejecuta, una por una, las cinco primeras instrucciones de un programa cuya primera ins-

trucción se encuentra en la posición de memoria indicada por el campo de direcciones de la pantalla, y luego devuelve el control al monitor.

7. <EJEC> <PP> <*> <5><0> <0> <0> <↓> <↓><↓> <↓> <↓> <↵> Ejecuta, una por una, las cinco primeras instrucciones de un programa, cuya primera ins-

truí ción se encuentra en la dirección de memoria 5000H. Al final se devuelve el control al monitor.

<*> cualquier tecla excepto <↓> El código en el archivo mon85.asm constituye el programa de mayor tamaño

presentado en este trabajo. Se supone que este monitor puede ser grabado en la EPROM del µPro 85 para proveer en la práctica todas las funciones de microcompu-tador. Aunque el µPro 85 no ha sido construido, el lector puede tener la seguridad que el programa que se presenta en las páginas siguientes funcionará en forma correc-ta al ser probado en el mundo real. Lo rotundo de la afirmación, se sustenta en el hecho que el monitor fue exhaustivamente evaluado en simulaciones realizadas usan-do el programa WSIM85. Aunque este simulador no es un software profesional de costo elevado, sino una versión de evaluación descargada de Internet, el autor ha rea-lizado con éste simulaciones de al menos cien programas y sólo ha encontrado un error en la ejecución de la instrucción DAD y ésto sólo bajo ciertas condiciones.

Asumiendo que el WSIM85 simula en forma correcta el repertorio de instruc-

ciones del 8085, en realidad son el resto de los recursos que ofrece el simulador, lo que lo convierten en una herramienta de gran poder para desarrollar aplicaciones ba-sadas en el 8085. WSIM85 permite especificar un sistema µC con hasta cuatro bancos de memorias EPROM y SWRM, hasta cinco dispositivos PPI 8255, un circuito multi-función 8155, un controlador de teclado/pantalla 8279 además de timers 8253, con-trolador de comunicaciones 8251 y módulo LCD.

Para configurar un sistema el usuario sólo debe especificar las direcciones de

cada circuito de memoria y de puerto y las conexiones necesarias. Por ejemplo puede acoplarse la salida del temporizador del 8155 o la IRQ del 8279 a una de las líneas de interrupciones del µP. También puede especificarse un divisor del reloj de la CPU, para fijar la frecuencia de la señal de entrada al timer.

Page 617: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

598

Una vez configurado el simulador de acuerdo con el hardware del µPRO 85, el código fue exhaustivamente evaluado en sesiones de simulación hasta obtenerse la versión final completamente operativa. El monitor fue depurado y se ejecutaron pro-gramas que usan como entrada el teclado del µPro 85 y que presentan resultados en su pantalla. Por ejemplo se cargó el código del reloj digital en la memoria del µPro 85 y se ejecutó, presentándose la hora en la ventana del 8279 del WSIM85.

En la práctica, la única manera de cargar un programa en la memoria del µPro

85 es introduciendo en memoria el código de operación en hexadecimal de cada ins-trucción. Esto es una ardua tarea, aun para aplicaciones como el reloj digital. Usual-mente los kits de evaluación como el µPro 85 pueden aceptar por un puerto de comu-nicación serie, la descarga de un archivo en formato HEX INTEL desde un PC. En el caso presente, si el lector desea ejecutar un programa extenso usando el µPro 85, coloque el código del programa a ser cargado en la SWRM del µPRO 85, al final del listado del monitor, de modo que se cargue en memoria junto con éste. Una vez en memoria, el programa puede ser ejecutado como se indicó.

Una de las desventajas del simulador WSIM85 es que no tiene un teclado co-

mo el 8085 Virtual KIT, por ejemplo. En su lugar, para emular la activación de una tecla se edita el 8279 y entonces el programa solicita, por medio de la ventana de dia-logo de la figura 9.76, la posición en la matriz de teclado del pulsador activado.

Fig.9.76 Ventana de activación de una tecla en WSIM85. Con este método se puede usar cualquier teclado con cualquier modo de inter-

conexión al 8279. La ventana de configuració del 8279 también permite especificar la dirección del circuito, los códigos siete segmentos de los caracteres a presentar en pantalla y la conexión, si se requiere, de la salida IRQ.

Como se observa en la figura 9.72, el µPro 85 utiliza como dispositivo de en-

trada un teclado que viene ensamblado de fábrica como una matriz 4 x 5 de pulsado-res, similar al teclado mostrado en la figura 9.10. Se deduce del diagrama eléctrico de la sección de teclado/pantalla, que se usa exploración codificada de las 4 filas de la matriz y se interconectan las cinco líneas de columnas a las correspondientes entradas de retorno RL[4:0]. Las líneas restantes, correspondientes a los tres bits de mayor peso de RL, permanecen sin conexión y forzadas a nivel alto por los resistores en el interior del 8279.

Page 618: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

599

Fig.9.77 El µPro 85 tiene un 8279 en la dirección 00H y no usa la salida IRQ.

Fig.9.78 Posiciones de las teclas del µPro 85.

Este modo de interconexión del periférico al 8279 determina que la posición de las teclas no se corresponde con su código como en el circuito de la figura 9.69. De modo que para asignar los códigos a las teclas debe usarse una tabla de consulta. Observe que las filas no tienen ocho pulsadores sino cinco, en consecuencia la tabla debe considerar la posición de las teclas que no existen en cada fila.

Como se observa en la figura 9.73, la pantalla del µPro 85 consta de seis in-dicadores de siete segmentos arreglados en dos campos: direcciones (L0-L3) y datos (L4-L5). El modo de interconexión de las líneas de selección de dígito a los LEDs, asigna el número de cada cual. Como el usuario de la tarjeta siempre estará muy cer-ca de ésta, no se requiere que los diodos luminosos produzcan un gran nivel de ilumi-nación. Los valores de los resistores en los segmentos garantizan una visibilidad ade-cuada de los caracteres de la pantalla. El circuito 74LS244 se usa para suministrar la corriente necesaria por segmento. La información suministrada sobre el hardware de la tarjeta de evaluación se considera sufiente para escribir el programa de control del microcomputador.

El programa monitor está organizado en un solo módulo y está compuesto por

subrutinas. Un diagrama simplificado del código se presenta en las figura 9.79 y 9.80.

Page 619: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

600

Fig.9.79 Diagrama de flujo del programa monitor.

Al inicio se carga el apuntador de pila y se programa el controlador 8279. Se configura para teclado con exploración codificada con protección para activación de dos teclas y pantalla de ocho caracteres con entrada por la izquierda. A continuación se borra la RAM de display y la FIFO.

El proceso de programación del 8279 debería indicar que se va a leer la FIFO

para poder obtener la posición de la tecla pulsada. Pero si esto se hace al inicio del programa y posteriormente un código de usuario activa la lectura de la RAM de dis-play, cuando el control regrese a monitor (a la rutina Orden), las operaciones de lec-tura al 8279 retornarán el contenido de la RAM de pantalla y no el de la FIFO. Por esta razón, la activación de la lectura de la FIFO se realiza cada vez que se invoca la rutina de lectura de teclado.

Page 620: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

601

Fig.9.80 Diagrama de flujo del programa monitor.

Page 621: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

602

Continuando con el proceso de inicio, se debe programar el 8155. El monitor no usa los puertos del 8155, sólo la sección de RAM y el temporizador. Pero debido a que cuando se arranca o para el timer, a la vez se modifica la configuración de los puertos, el monitor realiza una programación de éstos por defecto y almacena la pala-bra de control com_ini en la posición de memoria ctrl_usu. Si un programa de usuario usa los puertos del 8251 #1, deberá actualizar esta posición de memoria con el byte que usa para configurar los puertos. De este modo, cuando el monitor arranca o detie-ne el timer del 8155 #1, se usará el contenido de ctrl_usu para mantener la configura-ción de los puertos impuesta por el programa de usuario.Una vez finalizada la pro-gramación inicial, se salva el contenido de los registros internos del procesador y se transfiere el control a la rutina Orden en espera de un comando de teclado. La rutina Salvar_reg debe determinar desde donde fue invocada. Se usa una bandera de retorno en la posición de memoria flag, la cual se inicia en cero y es puesta a 1 por la rutina Paso antes de llamar a Salvar_reg, al retorno Paso vuelve a cero a flag.

La rutina Orden espera continuamente un comando válido desde teclado. Si

este no se produce Orden permanece en espera. Las teclas válidas son <EXAM> y <EJEC>. Si una de estas teclas es activada, la rutina Orden procesa el comando dis-criminando entre examinar memoria o registros y ejecución normal o por pasos. Si la sintaxis del comando no es correcta se genera un mensaje de error. En caso contrario se redirige el control del programa a una de cuatro rutinas: Exam_mem,, Exam_reg Ejec o Paso. $title(Programa monitor para µPro 85) $subtitle(Monitor básico) $ALLPUBLIC ;************************************************************************************* ; Monitor para µPro 85. ; Un microcomputador que puede ser simulado con el programa WSIM85 ;************************************************************************************* ; Funciones: ; Examina y modifica la memoria ; Examina y modifica los registros ; Ejecuta un programa desde una dirección determinada hasta encontrar una ; Instrucción HLT o RST 1 ; Ejecuta un programa por pasos desde una dirección dada ;************************************************************************************* ; El µC tiene un teclado de 20 teclas y ; una pantalla de seis indicadores de siete segmentos ; Ambos bajo control de un 8279 ;************************************************************************************* ; Distribución de teclas. Observe que la tecla < ↵ > se sustituye por < OK >. ;+---+---+---+---+----+ ;| C | D | E | F |EJEC| ;+---+---+---+---+----+ ;| 8 | 9 | A | B |EXAM| ;|pch|pcl| | | | ;+---+---+---+---+----+

;| 4 | 5 | 6 | 7 | ! | ;| h | l |sph|spl| | ;+---+---+---+---+----+

;| 0 | 1 | 2 | 3 | OK | ;| r | m | n |pp | | ;+---+---+---+---+----+

Page 622: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

603

; Códigos retornados por cada tecla ;+---+---+---+---+---+ ;|0CH|0DH|0EH|0FH|13H| ;+---+---+---+---+---+ ;| 8 | 9 |0AH|0BH|12H| ;+---+---+---+---+---+ ;| 4 | 5 | 6 | 7 |11H| ;+---+---+---+---+---+ ;| 0 | 1 | 2 | 3 |10H| ;+---+---+---+---+---+ ; Posición o número de la tecla (Para simular teclado con WSIM85) +---+---+---+---+---+ ;|18H|19H|1AH|1BH|1CH| ;+---+---+---+---+---+ ;|10H|11H|12H|13H|14H| ;+---+---+---+---+---+ ;| 8 | 9 |0AH|0BH|0CH| ;+---+---+---+---+---+ ;| 0 | 1 | 2 | 3 | 4 | ;+---+---+---+---+---+ ;************************************************************************************* ; No se usa la salida INTR del 8279 para detectar pulsación de una tecla. Se lee la ; ; palabra de estados. ;************************************************************************************* tope_rwm equ 20ffh ; RWM del 8155 #1 reservada para variables de monitor. i_rwm equ 2000h ; Inicio RWM 8155 #1 i_stack equ tope_rwm-12 ; Inicio de la pila (6 niveles) modo_tcld equ 0 ; Teclado codificado con protección para activación de

; dos teclas. Ocho indicadores con entrada por la iz- ; quierda

inic_8279 equ 0d3h ; Borra RAM de display y FIFO. leer_fifo equ 50h ; Se leerá la FIFO. ram_dig0 equ 90h ; Indicadores 0-3: Campo de direcciones. ram_dig6 equ 96h ; Indicadores 6-7: Campo de datos. ; En realidad debe ser 94H. ; Para separar los campos en la simulación se usa 96H. okey equ 10h ; Tecla ↵ flecha equ 11h ; Tecla ↓ exam equ 12h ; Tecla EXAM ejec equ 13h ; Tecla EJEC no_hex equ 0 ; Bandera número hex inválido hex equ 1 ; Bandera número hex válido bandera_dir equ 80h ; Indica impresión en campo direcciones bandera_dat equ 0 ; Indica impresión en campo de datos com_ini equ 40h ; Palabra de control inicial de usuario. modo_timer equ 80h ; Un pulso al final de la cuenta inic_timer equ 0C0h ; Arrancar timer parar_timer equ 40h ; Detener timer estd_alto: equ 1 ; Número de estados (186H) para cuenta del timer estd_bajo equ 86h ;************************************************************************************* ; Definición de segmentos ;************************************************************************************* defseg x8279,start=0, class=iospace ; 8279 en dirección 50h defseg p8155,start=20h,class=iospace ; 8155 en direcciòn 20h defseg stack, start=i_stack ; La pila reside en la RWM del

; 8155 #1 defseg datos, class=data,start=i_rwm ; RWM reservada por el monitor defseg progr, class=code,absolute ; 8K de EPROM desde 0000H ;*************************************************************************************

Page 623: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

604

;************************************************************************************* ; Registros del 8279 ;************************************************************************************* seg x8279 x8279_dato ds 1 ; Registro de datos del 8279 x8279_cntrl ds 1 ; Registro de control del 8279 ;------------------------------------------------------------------------------------- ;************************************************************************************* ; Registros del 8155 ;************************************************************************************* seg p8155 ; Puertos A, B y C libres pctrl_8155 ds 4 timer_bajo ds 1 ; Usado por rutina Paso timer_alto ds 1 ; Usado por rutina Paso ;************************************************************************************* ; Los 12 bytes últimos de RWM de 8155 #1 soportan el stack. ;************************************************************************************* seg stack ds 12 ;************************************************************************************* ; Segmento de datos en RWM de 8155 #1 ;************************************************************************************* seg datos direcc ds 2 ; Dirección actual dato ds 1 ; Dato actual val_hex ds 1 ; Contiene bandera que indica si el numero desde

; teclado es un valor hex válido. posic ds 1 ; Indica posición del registro seleccionado en la tabla

; de nombres de registro mem_hex ds 2 ; Almacena los últimos cuatro dígitos hex obtenidos

; desde teclado ctrl_usu ds 1 ; Programación inicial del 8155 flag db 0 ; Indica si la rutina salv_reg fue llamada desde Paso. ;------------------------------------------------------------------------------------- ;************************************************************************************* ; Area de memoria imagen de registros ;************************************************************************************* regh: ds 1 ; Registro H regL: ds 1 sph: ds 1 spl: ds 1 pch: ds 1 pcl: ds 1 regA: ds 1 regB: ds 1 regC: ds 1 regD: ds 1 regE ds 1 regF ds 1 ;************************************************************************************* ; Area para colocar saltos a rutinas de servicio de interrupción ; La interrupción RST1 es usada para terminar los programas de usuario. ; En la práctica regresa el control al monitor ; La interrupción RST 7 está reservada para ejecución de rutinas de usuario. ; La entrada de interrupción TRAP está conectada a la salida deñ Timer del 8155 #1. ; El resto de RST n y de las interrupciones hardware están libres. ;************************************************************************************* rst2: ds 3 rst3: ds 3 rst4 ds 3 rst5 ds 3 rst5.5: ds 3 rst6: ds 3 rst6.5: ds 3 rst7.5: ds 3 ;*************************************************************************************

Page 624: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

605

;************************************************************************************* ; Código en EPROM ;------------------------------------------------------------------------------------- seg progr reset: jmp inicio ; Vector de reset ;********************************** ; Vectores de interrupción ;********************************** ; Vector de interrupción RST 1 org 8 rst1: jmp salv_reg ; La ejecución de RST1 salva los regs. y espera comando ; Vector de interrupción RST 2 org 10h jmp rst2 ; Vector de interrupción RST 3 org 18h jmp rst3 ; Vector de interrupción RST 4 org 20h jmp rst4 ; Vector de interrupción TRAP org 24h jmp int_trap ; Salto a rutina Paso ; Vector de interrupción RST 5 org 28h jmp rst5 ; Vector de interrupción RST5.5 org 2ch jmp rst5.5 ; Vector de interrupción RST 6 org 30h jmp rst6 ; Vector de interrupción RST6.5 org 34h jmp rst6.5 ; Vector de interrupción RST 7 org 38h jmp funcion ; Salto a tabla de saltos de rutinas de monitor ; Vector de interrupción RST7.5 org 3ch jmp rst7.5 ;************************************************************************************* ; Se programa el 8279 ;************************************************************************************* org 100h inicio: lxi sp,tope_rwm-1 ; Se inicia el apuntador de pila mvi a,modo_tcld out x8279_cntrl ; Se programa modo de display y de teclado mvi a,inic_8279 ; Se inicia 8279 out x8279_cntrl mvi a,com_ini sta ctrl_usu ; Valor inicial de comando de usuario out pctrl_8155 ; Se programa el 8155 jmp salv_reg ; salvar registros ;*************************************************************************************

Page 625: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

606

;************************************************************************************* ;Rutina de espera de comando ;************************************************************************************* orden: call logo ; Imprime mensaje [µPro 85] de_err: call leer_tcld ; Se espera comando cpi exam ; Compara con <exam> jz reg_mem ; Preguntar si reg o mem cpi ejec ; No es <exam>, comparar con <ejec> jnz orden ; Ni <exam> ni <ejec>, esperar comando call apagar ; Es <ejec>, apagar pantalla lxi h,normal_paso ; Apuntar a mensaje call camp_dir ; Imprimir N¿PP call leer_tcld ; Espera tecla: corrida libre o por paso cpi 2 ; Comparar tecla con 1 jz ejecut ; Es 2 (N), salto a corrida libre cpi 3 ; No es 2, comparar con 3 (pp) jz paso ; Es 3 (PP), ejecutar por pasos jmp orden ; Ni 2 (N) ni 3 (PP), esperar comando reg_mem: call apagar ; Apagar pantalla lxi h,regmem ; Cargar dirección de mensaje call camp_dir ; Imprimir quE call leer_tcld ; Esperar tecla cpi 1 ; Comparar con 1 (M) jz exam_mem ; Es 1 (M), a examinar memoria cpi 0 ; No es 1 (M), comparar con 0 (R) jz exam_reg ; Es 0 (R), a examinar registros jmp error ; Ni 0 (R) ni 1 (M), Mensaje de error ;************************************************************************************* ; Ejecuta programa ;************************************************************************************* ejecut: call apagar ; Borrar pantalla lhld direcc ; cargar en HL dirección de usuario call format_dig ; Separar dígitos de direcciones call camp_dir ; Presentar dirección call leer_tcld ; Espera tecla cpi okey ; Comparar con <okey> jz pc_actual ; Si <okey> ejecutar el programa cpi flecha ; No <okey>, comparar con <flecha> jnz error ; No <okey> ni <flecha>; emitir mensaje de error call apagar ; Es <flecha>, borrar pantalla lxi h,orgexam ; Apuntar a mensaje dir call camp_dir ; Presentar dir mvi c,bandera_dir ; Se insertará nueva dirección call modif ; Introducir dirección cpi okey ; ¿Última tecla fue <okey>? jnz error ; No, emitir mensaje [Err] pc_actual: call apagar ; Si, apagar pantalla lxi h,exe ; Presentar mensaje call camp_dir ; [EJEC] en campo de direcciones lhld direcc ; Guardar nueva dirección en call interc_hl ; la memoria imagen shld pch ; del contador de programa jmp obtener_reg ; Recuperar registros antes de ejecutar ;************************************************************************************* ; Ejecuta programa por pasos ;************************************************************************************* paso: call apagar ; Apagar pantalla lhld pch ; Contador de programa de usuario a HL call interc_hl shld direcc ; Hacer HL dirección actual call format_dig call camp_dir ; Presentar dirección actual en pantalla call mostr_dat ; Mostrar contenido de direcc en campo de datos call leer_tcld ; Esperar tecla cpi okey ; Comparar con <okey> jz orden ; Si <okey>, presentar logo y esperar comando cpi flecha ; No <okey>, comparar con <flecha> jz timer ; Es <flecha>, arrancar timer call apagar ; No es <flecha>, apagar pantalla lxi h,orgexam ; Presentar mensaje

Page 626: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

607

call camp_dir ; [dir] mvi c,bandera_dir ; Introducir nueva dirección call modif. call interc_hl ; Nueva dirección en HL shld pch ; Guardar como contador de programa cpi flecha ; Última tecla fue <flecha> jnz error ; No, presentar [Err] call mostr_dat ; Si, mostrar dato timer: mvi a,modo_timer or estd_alto ; Modo y 6 bits altos del timer out timer_alto ; Programar timer mvi a,estd_bajo ; Byte bajo del timer out timer_bajo ; Programar timer lda ctrl_usu ; Al A palabra de control de usuario ori inic_timer ; Incoporar comando de arranque del timer out pctrl_8155 ; Arrancar timer y mantener palabra de usuario jmp obtener_reg ; Recuperar registros y ejecutar una instrucción int_trap: push psw ; PSW a la pila. Retorno desde interrupción lda ctrl_usu ; Al A palabra de control de usuario ani 3fh ; Poner a cero A7 y A6 ori parar_timer ; Cargar comando de parada de timer out pctrl_8155 ; Parar timer mvi a,1 ; Uno al acumulador sta flag ; Bandera Flag a 1 pop psw ; Recuperar PSW jmp salv_reg ; Salvar registros vuelta: xra a ; Flag es 1, retorno aqui desde salv_reg sta flag ; Flag a 0 jmp paso ; A ejectar siguiente instrucción ;************************************************************************************* ; Mensaje de identificación µPro 85 ;************************************************************************************* logo: lxi h,mpro ; Dirección de identificación call camp_dir ; Mostrar [µPro] lxi h,_85 call camp_dat ; Mostrar [85] ret ;************************************************************************************* ; Actualiza campo de direcciones ;************************************************************************************* mostr_dir: lda dato ; Cargar en acumulador dato actual lhld direcc ; Cargar en HL dirección actual mov m,A ; Mover dato a memoria cmp m ; Comparar memoria con dato escrito jnz error ; Son diferentes, Err inx h ; Apuntar posición de memoria siguiente shld direcc ; Hacer dirección actual mstrdr: call format_dig call camp_dir ; Presentar en campo de direcciones ret ; retornar ;************************************************************************************* ; Actualiza campo de datos ;************************************************************************************* mostr_dat: lhld direcc ; En HL dirección actual mov a,m ; Recuperar dato sta dato ; Actualizar dato mstrdt: mvi b,0 ; Se usará campo de datos mov h,a ; Dato en H call format_dig ; Separa valor en dígitos call camp_dat ; Presentar contenido de dirección actual ret ; Retornar ;************************************************************************************* ; Guarda contenido de registros en memoria ;************************************************************************************* salv_reg: shld regh ; Cargar HL en memoria imagen pop h ; Contador de programa a HL shld pch ; Salvar PC push d ; DE a la pila

Page 627: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

608

push b ; BC a la pila pop h ; BC de la pila a HL shld regb ; BC a memoria imagen pop h ; DE de la pila a HL shld regd ; DE a memoria imagen lxi h,0 ; HL en cero dad sp ; A HL el contenido del SP shld sph ; El SP desde HL a memoria imagen push psw ; PSW a la pila pop h ; Banderas a L mov a,h ; Carga acumulador con valor desde la pila sta rega ; A a memoria de registro A mov a,l ; Banderas al acumulador sta reg ; Banderas a memoria imagen call orden_regs ; Ordenar memoria de registros lda flag ; Al acumulador bit de estado FLAG cpi 1 ; Probar si la rutina fue llamada desde Paso jz vuelta ; Si, regresar a paso jmp orden ; No, esperar comando. ;************************************************************************************* ; Recuperar registros ;************************************************************************************* obtener_reg: lhld regd ; Recuperar registros D y E mov d,l mov e,h lhld regb ; Obtener registros B y C mov b,l mov c,h lhld rega ; Registro A a L lda regf ; Banderas al acumulador mov h,l ; Acumulador al registro H mov l,a ; Banderas al registro L push h ; PSW a la pila pop psw ; Recuperar PSW lhld sph ; Cargar imagen de apuntador de pila en HL call interc_hl sphl ; Cargar HL en apuntador de pila lhld pch ; El Contador de programa en HL call interc_hl push h ; EL contador de programa ala pila lhld regh ; Recuperar registros H y L call interc_hl ret ; Ejecutar Programa ;************************************************************************************* ;************************************************************************************* ; Examina la memoria y modifica la RAM ;************************************************************************************* exam_mem: call apagar ; Apagar indicadores lxi h,orgexam ; Cargar en HL dirección del mensaje exam call camp_dir ; Presentarlo: [][d][i][r] [][] mvi c,bandera_dir ; Se usará el campo de direcciones call modif ; Especificar dirección de memoria deseada. mov d,a ; Salvar última tecla pulsada. lda val_hex ; Cargar en A bandera de número hex cpi no_hex ; Probar si dirección es un número hex válido jz error ; No hex, emitir mensaje Err y esperar comando mov a,d ; Hex, recuperar última tecla pulsada cpi flecha ; ¿Flecha hacia abajo? o tecla ¿OK? jnz salir ; Si tecla OK retornar a esperar nuevo comando call mostr_dat ; Si Flecha... presentar contenido de la posición ; de Memoria seleccionada después de [][d][i][r] mvi c,bandera_dat ; Se usará el campo de datos prox_pos: call modif ; Exam/Modif contenido de la dirección actual cpi flecha ; Ultima tecla: ¿Flecha hacia abajo? o tecla ¿OK? jnz salir ; Si tecla OK retornar a esperar nuevo comando call mostr_dir ; Si Flecha... presentar dirección y contenido de call mostr_dat ; La posición de memoria siguiente. jmp prox_pos ; Continuar Exam/Modif memoria

Page 628: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

609

salir: jmp orden ; Salir a esoerar comando ;************************************************************************************* ; Examina y modifica los registros ;************************************************************************************* exam_reg: call apagar ; Apagar indicadores lxi h,orgexar ; Cargar en HL dirección del mensaje reg call camp_dir ; Presentar [rEg] call leer_tcld ; Esperar registro cpi 10h ; Es un dígito hex jnc error ; No, [Err] cpi 4 ; Comparar con tecla 4 jc error ; Si es menor, no es un registro sui 4 ; Restar 4 para determinar posición en tabla de

; registros exm_regh: sta posic ; Salvar posición lxi h,nombreg ; Cargar en HL inicio de tabla de nombre de reg add a ; Multiplicar posición por cuatro add a add l ; Sumar nuevo valor a dirección inicial de tabla mov l,a ; Apuntar registro seleccionado prox_reg: push h ; Dirección en la tabla de nombre regs a la pila call camp_dir ; Presentar nombre de reg en campo de direcciones lxi h,regh ; Cargar en HL dirección de memoria imagen de H lda posic ; Cargar en acumulador posición de registro

; seleccionado/siguiente add l ; Sumar posición de registro actual a dirección

; imagen de registro H mov l,a ; HL contiene dirección de memoria imagen del

; registro seleccionado lda posic ; Al acumulador posición del registro actual inr a ; Siguiente registro sta posic ; Se guarda posición del siguiente registro mov a,m ; Se recupera contenido del registro seleccionado sta dato ; Esto es el dato actual push h ; Se guarda dirección imagen del registro actual call mstrdt ; Se muestra el contenido del registro actual en

; el campo de datos mvi c,bandera_dat ; Se modificará el dato call modif ; Modificar dato cpi flecha ; Última tecla fue <flecha>? jnz orden ; No ,fue <ok>. Ir a esperar comando pop h ; Fue <flecha>, Recuperar dirección imagen del ; registro actual lda dato ; Cargar en el acumulador nuevo dato mov m,a ; Actualizar dirección imagen de registro pop h ; Recuperar dirección del registro en tabla de

; nombres mov a,l cpi ultreg ; Probar si es el último registro jnz no_ultimo ; No es el último (F); seguir xra a ; Es el último, la siguiente posición es la 0 (H) jmp exm_regh ; Salto a examinar registro H no_ultimo: lxi d,4 ; No es el último dad d ; HL apunta al siguiente registro jmp prox_reg ; Examinar próximo registro. ;************************************************************************************* ; Convierte una cadena de dígitos de teclados en direcciones ; o datos y los presenta en el campo correspondiente. ;************************************************************************************* modif: lxi h,0 ; Cargar cero en HL shld mem_hex ; Guardar HL en posición que contiene valor hex xra a ; Limpiar acumulador sta val_hex ; Bandera Val_hex a cero prox_hex: call leer_tcld ; Esperar tecla cpi okey ; Comparar con <okey> jnc no_numero ; Mayor o igual que 16, no es un dígito Hex lxi h,val_hex ; Es un dígito hex. Apuntar dirección de bandera

; de número válido mvi m,hex ; Bandera de en Val_hex indica que se tecleó un

; número válido

Page 629: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

610

lhld mem_hex ; Cargar en HL valor hex dad h ; Eliminar digito de mayor orden y poner cero en

; dígito de orden menor. dad h dad h dad h ora l ; Empacar en A, el número desde teclado y el

; dígito 2 en registro L mov l,a ; Insertar dígito desde teclado en HL shld mem_hex ; Salvar nuevo valor Hex mov a,c ; Determinar si se trata de una dirección o dato rlc ; Obtener acarreo jc modf_dir ; Si uno, es una dirección mov h,l ; Si cero, es un dato que se mueve a H mov a,h ; Dato al acumulador sta dato ; Convertir en dato actual call format_dig call camp_dat ; Presentar dato jmp prox_hex ; Esperar próximo dígito de datos modf_dir: shld direcc ; Guardar valor hex en direcc call format_dig call camp_dir ; Presentar nueva dirección jmp prox_hex ; Salto a esperar introducción de nuevo dígito de

; dirección no_numero: cpi exam ; Comparar comando con <exam> jnc error ; Si es mayor, mensaje de error lhld mem_hex ; Si menor, es <flecha> ret ; retornar ;************************************************************************************* ; Presenta caracteres en campo de direcciones ;************************************************************************************* camp_dir: ori bandera_dir ; Se presentará una dirección call visual ; presentar ret ;************************************************************************************* ; Presenta caracteres en campo de datos ;************************************************************************************* camp_dat: xra a ; Se presentará un dato call visual ; Presentar ret ;************************************************************************************* ;************************************************************************************* ; Apaga los indicadores ;************************************************************************************* apagar: lxi h,apag ; Apuntar caracteres de espacio call camp_dir ; Borrar campo de direcciones lxi h,apag ; Apuntar espacio en blanco call camp_dat ; Borrar campo de datos ret ;************************************************************************************* ; Presenta mensaje de error ;************************************************************************************* error: call apagar ; Apagar pantalla lxi h,err ; Apuntar mensaje de error call camp_dir ; Presentar Err jmp de_err ; Retorno a esperar comando ;************************************************************************************* ; Salida de caracter a display ;************************************************************************************* visual: jm vis_dir ; Detectar si se imprime en campo de

; direcciones o de datos mvi b,2 ; Campo de datos, dos dígitos mvi a,ram_dig6 ; Se presenta primero en L6 jmp prog_disp ; Salto a programar controlador de display vis_dir: mvi b,4 ; Campo de direcciones, 4 dígitos mvi a,ram_dig0 ; Se presenta primero en L0 prog_disp: out x8279_cntrl ; Se presenta dígito L0/L6 con autoincremento prox_dig: mov a,m ; Mover al acumulador L0/L6 xchg ; Preservar HL: Dirección de dígito a presentar

Page 630: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

611

lxi h,cod_7Seg ; Apuntar tabla de conversión a 7-seg add l ; Desplazarse en la tabla mov l,a mov a,m ; Obtener código de 7-seg cma out x8279_dato ; Presentar en indicador xchg ; Recuperar HL inx h ; Apuntar siguiente dígito dcr b ; Contador_ dígitos = Contador_dígitos-1 jnz prox_dig ; No cero, obtener próximo caracter ret ; Si cero,retornar ;************************************************************************************* ;Lee caracter desde teclado ;************************************************************************************* leer_tcld: mvi a,leer_fifo ; Se leerá la FIFO out x8279_cntrl ; del teclado in x8279_cntrl ; Se lee la palabra de estado. ani 7 ; Máscara para NNN:número de cracateres en FIFO jz leer_tcld ; Si cero, esperar activación de tecla in x8279_dato ; No cero, leer posición de tecla lxi h,tecla ; Apuntar a posición inicial de tabla de teclado add l ; Desplazarse hasta la tecla presionada mov l,a mov a,m ; Obtener código de la tecla ret ; Retornar ;************************************************************************************* ; El número hexadecimal de 4 bits en HL es separado en ; dígitos individuales los cuales se cargan en memoria ; a partir de la dirección mem_dig. Este formato es el ; adecuado para presentación en los indicadores de 7-SEG ; ; Contenido de HL es un valor de 4 dígitos hexadecimales ; H L ; (D3D2)(D1D0) ;************************************************************************************* format_dig: mov a,h ; Cargar en acumulador D3D2 rar ; Rotar 4 bits a la derecha rar rar rar ani 0FH ; En A (0D3) lxi d,mem_dig ; Apuntar dirección de 0D3 stax d ; Cargar 0D3 en memoria de pantalla mov a,h ; Cargar en acumulador D3D2 ani 0FH ; Convertir en 0D2 inx d ; Apuntar dirección de 0D2 stax d ; Copiar 0D2 en memoria mov a,l ; Mover al A D1D0 rar ; Rotar 4 bits a la derecha rar rar rar ani 0FH ; En A (0D1) inx d ; Apuntar dirección de 0D1 stax d ; Cargar 0D1 en memoria de pantalla mov a,l ; Mover al A D1D0 ani 0FH ; Convertir en 0D0 inx d ; Apuntar dirección de 0D0 stax d ; Copiar 0D0en memoria lxi h,mem_dig ; HL apunta a posición de D0 ret ; Retornar ;************************************************************************************* ; Intercambiar H y L ;************************************************************************************* interc_hl: push b ; Salvar BC mov b,h ; Cargar H en B mov h,l ; Copiar L en H mov l,b ; Copiar H en L pop b ; Recuperar BC

Page 631: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

612

ret ; Retornar ;************************************************************************************* ; Ordenar registros ; Los registros en memoria están: ; L H SPL SPH PCL PCH A C B E D F ; Deben ordenarse para efectos de presentación como: ; H L SPH SPL PCH PCL A B C D E F ;************************************************************************************* orden_regs: mvi e,5 ; Se intercambian 5 registros lxi h,regh ; HL apunta a regH lxi b,regl ; BC apunta a regL prox: mov d,m ; Intercambiar regH con regL ldax b ; . mov m,a ; . mov a,d ; . stax b ; . dcr e ; Decrementar contador rz ; Si cero,retornar inr l ; Apuntar siguiente inr l ; Registro SPH, PCH o D inr c ; Apuntar siguiente registro inr c ; SPL, PCL o E mov a,e ; Mover contador al acumulador cpi 2 ; Probar si se apunta al regA jnz prox ; No, intercambiar próximos registro inr l ; Si omitir acumulador. Apuntar a B inr c ; Apuntar a C jmp prox ; Continuar con siguiente ;************************************************************************************* ; funcion = Tabla de saltos para rutinas de monitor ;************************************************************************************* ; Para ejecutar rutinas de monitor ; mvi e,n cargar en e el número de la rutina y ejecutar ; rst 7 ; n = ; (0) leer_tcld: Espera la pulsación de una tecla y retorna el valor en A. ; (1) mstrdr: Presenta el contenido del registro par HL en el campo de direc- ; ciones. ; (2) mstrdt: Presenta el contenido del A en el campo de datos. ; (3) camp_dir: Presenta una cadena de caracteres en el campo de direcciones ; HL contiene la dirección del primer caracter. ; (4) camp_dat: Presenta una cadena de caracteres en el campo de datos ; HL contiene la dirección del primer caracter ;************************************************************************************* funcion: push h mvi d,0; ; Byte alto del desplazamiento de la tabla a cero. lxi h,tabla ; Cargar HL con la base de la tabla. dad d ; Sumar el desplazamiento a la base de la tabla. dad d ; Sumar de nuevo mov e,m ; El byte bajo de la dirección de salto en E. inx h ; HL apunta a dirección siguiente. mov d,m ; El byte alto de la dirección de salto en D. pop h ; Recuperar HL push d ; Dirección de salto a la pila. ret ; Saltar al proceso. tabla: dw leer_tcld,mstrdr,mstrdt,camp_dir,camp_dat

Page 632: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

613

;************************************************************************************* ; Tabla de códigos de siete segmentos ;************************************************************************************* org 0500h cod_7Seg: cero equ $-cod_7Seg db 0f3h db 60h db 0b5h db 0f4h cuatro equ $-cod_7Seg db 66h cinco equ $-cod_7Seg S equ $-cod_7Seg db 0d6h db 0d7h db 70h ocho equ $-cod_7Seg db 0f7h db 7eh ?A equ $-cod_7Seg db 77h ?B equ $-cod_7Seg db 0c7h ?C equ $-cod_7Seg db 93h ?d equ $-cod_7Seg db 0e5h ?E equ $-cod_7Seg db 97h F equ $-cod_7Seg db 17h g equ $-cod_7Seg db 0f6h ?H equ $-cod_7Seg db 67h ?L equ $-cod_7Seg db 85h ?M equ $-cod_7Seg db 0e6h n equ $-cod_7Seg db 45h i equ $-cod_7Seg db 20h J equ $-cod_7Seg db 0e1h o equ $-cod_7Seg db 0e4h P equ $-cod_7Seg db 37h q equ $-cod_7Seg db 76h r equ $-cod_7Seg db 05h t equ $-cod_7Seg db 44h u equ $-cod_7Seg db 0Eh ¿ equ $-cod_7Seg db 0A3h _ equ $-cod_7Seg db 80H

Page 633: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

614

espac equ $-cod_7Seg db 00h ;************************************************************************************* ; nombre de registros ;************************************************************************************* nombreg: db espac,espac,espac,?H db espac,espac,espac,?L db espac,S,P,?H db espac,S,P,?L db espac,P,?C,?H db espac,P,?C,?L db espac,espac,espac,?A db espac,espac,espac,?B db espac,espac,espac,?C db espac,espac,espac,?D db espac,espac,espac,?E ultreg equ low($) db espac,espac,espac,F ;************************************************************************************* ; Códigos de teclado ;************************************************************************************* ORG 600H tecla: db 0 ; Tecla <0> db 1 ; Tecla <1> db 2 ; Tecla <2> db 3 ; Tecla <3> db 10H ; Tecla <↵> db 14H ; Tecla no existe db 14H ; Tecla no existe db 14H ; Tecla no existe db 4 ; Tecla <4> db 5 ; Tecla <5> db 6 ; Tecla <6> db 7 ; Tecla <7> db 11H ; Tecla <flecha hacia abajo> db 14H ; Tecla no existe db 14H ; Tecla no existe db 14H ; Tecla no existe db 8 ; Tecla <8> db 9 ; Tecla <9> db 0AH ; Tecla <A> db 0BH ; Tecla <B> db 12H ; Tecla <EXAM> db 14H ; Tecla no existe db 14H ; Tecla no existe db 14H ; Tecla no existe db 0CH ; Tecla <C> db 0DH ; Tecla <D> db 0EH ; Tecla <E> db 0FH ; Tecla <F> db 13H ; Tecla <EJEC> ;************************************************************************************* ; Area de mensajes ;************************************************************************************* orgexam: db ?d,i,r,espac ; [d][i][r][] orgexar: db r,?E,G,espac ; [r][E][G][] regmem: db espac,q,u,?E ; [][q][u][E] err: db espac,?E,r,r ; [][E][r][r] exe: db ?E,J,?E,?C ; [E][J][E][C] apag: db espac,espac,espac,espac mpro: db u,P,r,o ; [u][P][r][o] _85: db ocho,cinco ; [8][5] normal_paso: db n,¿,P,P ; [n][¿][P][P] end ;************* Fin de monitor********************************************************

Page 634: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

615

Los comentarios del programa permiten un fácil seguimiento de los algorit-mos. En este trabajo no hay espacio para una exposición completa del modo de fun-cionamiento de cada rutina. Sólo se discuten las rutinas de lectura de teclado: LEER_TLCD y de presentación en pantalla: VISUAL. Mayores detalles sobre el pro-grama se discutirán en las sesiones de clases del curso Sistemas de µProcesadores.

Fig. 9.81 Diagrama de flujo de la rutina LEER_TCLD.

Este código es invocado por varias rutinas del monitor. Su función es esperar por la activación de una tecla y cuando esto ocurra debe retornar en el registro acu-mulador el código del pulsador activado. Como indica la figura 9.81, al inicio se indi-

Page 635: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

616

ca al 8279 que se va a leer la FIFO y de inmediato se obtiene la palabra de estados del 8279.

Como se aprecia la figura 9.60, si los tres bits de menor peso (NNN) de la pala-

bra de estado están en cero, indica que no se ha producido la activación de una tecla. La rutina LEER_TCLD examina el valor de NNN y procede a leer desde la FIFO la posición del pulsador cuando se ha producido la presión de una tecla. En caso contra-rio, la rutina permanece en espera que se presione un interruptor del teclado. El nú-mero de la tecla se usa como entrada a una tabla de consulta para obtener el código correspondiente.

Fig. 9.82 Diagrama de flujo de la rutina VISUAL.

La rutina VISUAL presenta en el campo de direcciones (S = 1) o en el campo de datos (S =0) la cadena de caracteres cuyo primer elemento está en la dirección de memoria apuntada por el registro par HL. Al inicio examina el estado de la bandera

Page 636: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

617

de signo y si está activa se presentará en el campo de direcciones, cargándose el con-tador de caracteres con 4. En caso contrario, se usará el campo de datos y el contador se inicia en 2. Luego de cargar el contador se indica al 8279 en cual LED se inicia la presentación (L0): direcciones, L4: datos). A continuación se obtiene desde memoria el carácter y se carga en el registro acumulador. Con el contenido del A se entra en una tabla de consultas que contiene los códigos siete segmentos de los caracteres y se obtiene el que corresponde, el cual es cargado en la memoria de display y presentado en el L0 o en L4. De seguido se incrementa el apuntador de memoria para seleccionar la posición del carácter siguiente y se disminuye en 1 el contador de caracteres, el caracter se presenta en L1 o en L5 y sucesivamente el proceso se repite hasta cuando el contador de caracteres llega a cero.

La rutina VISUAL no sólo presenta mensajes en la pantalla del µPro 85 sino

que es el código que se encarga de presentar las entradas de teclado en el campo de direcciones o datos, según convenga. El µC mantiene en la posició de memoria direcc y direcc+1 la dirección actual entrada desde teclado y en la posición dato el conteni-do de esta localización o el contenido de un registro. El monitor mantiene continua-mente actualizada la pantalla presentando en el campo correspondiente el contenido de estas direcciones. Para esto previamente se formatea la posición direcc y direcc +1 o la posición dato de modo que cada dígito de 4 bits ocupe una localidad de memoria a partir de mem_dig. La rutina VISUAL es entonces llamada para presentar el conte-nido de mem_dig y mem_dig +1 en el campo de datos o el contenido de mem_dig, mem_dig +1, mem_dig +2 y mem_dig +3 en el campo de direcciones.

Como se explica antes, la simulación en WSIM85 es tediosa por lo lento del

proceso de introducir comandos mientras que la gran ventaja es que se simulan peri-féricos reales. Para solventar tal situación, se adaptó el monitor presentado para ser cargado en la memoria ROM del microcomputador virtual SAD 85. Aunque este mi-crocomputador no usa circuitos reales, tiene un teclado para facilitar la introducción de comandos. En cierta forma es una mejora del monitor pues se puede usar la tecla <Prev> para examinar direcciones en retroceso y además se incorporó la posibilidad de modificar y examinar los registros usando la tecla <Block>, función esta no reali-zada por el 8085 Virtual Kit en su versión original. Las siguientes páginas muestran el resultado de sesiones de simulación con ambas versiones del monitor.

Los nombres con los cuales el µPro 85 identifica lor registros internos del mi-

croprocesador 8085 se muestran a continuación:

Tabla. 9.15 Nombre y orden con el cual se muestran los registros en pantalla. Símbolo Descripción Símbolo Descripción H Registro H A Registro A. L Registro L B Registro B. SPH Byte alto del apuntador de pila. C Registro C. SPL Byte bajo del apuntador de pila. D Registro D. PCH Byte alto del contador de programa. E RegistroE. PCL Byte bajo del contador de programa. F Registro de banderas.

Page 637: Microprocesadores-Luis Urdaneta

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..

Page 638: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

619

Fig. 9.84 La pantalla del µPro 85 muestra el contenido del registro acumulador.

Page 639: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

620

Fig. 9.85 Mensaje de identificación del µPro 85 en la ventana del 8085 Virtual Kit..

Page 640: Microprocesadores-Luis Urdaneta

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..

Page 641: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

622

La versión del monitor para el 8085 Virtual Kit realiza la lectura del teclado por medio de la interrupción RST 5.5 y las llamadas a las subrutinas de monitor se realizan en forma convencional, usando la instrucción CALL dirección.

Los dos ejemplos finales de este capitulo, ilustran el manejo del controlador

8279. Ambos ejemplos se escriben para ejecución en el microcomputador MPR-85, aunque con las limitaciones para simulación de la interfaz analógica, el código puede ser ejecutado en el µPro 85. La primera aplicación es un medidor de temperatura ambiente y la segunda un medidor de capacidad. Ambos presentan su lectura en el campo de direcciones de la pantalla del MPR-85.

Ejemplo 9.15 Diseñar y programar un medidor de temperatura ambiente. El instrumento de-

be presentar la temperatura en °C en el campo de direcciones de la pantalla del MPR-85 PLUS, como indica la figura 9.87. Como sensor se usa un transistor bipolar tipo 2N3904.

Fig. 9.87 Presentación de la temperatura ambiente en el display del MPR-85 PLUS.

Las siguientes especificaciones se aplican al instrumento: Rango de medida: Para permitir el uso del medidor en cualquier lugar del planeta, el rango de medida ha sido ex-tendido al máximo posible. Se selecciona para el termómetro un rango de -40 °C ≤ T ≤ 60 °C. Resolución: El cambio mínimo detectable de temperatura debe ser de 0.5 °C, valor apropiado para un me-didor de temperatura ambiente.

Solución:

El sensor usado en el instrumento es un transistor BJT conectado como diodo como se observa en la figura 9.88. Un sensor tipo diodo, por el cual circula una co-rriente constante, presentará una variación del voltaje terminal de aproximadamente -2.2 mV/°C. Al contrario del comportamiento no lineal de los termistores y termocu-plas, el coeficiente constante convierte al diodo en un excelente sensor para tempera-turas bajas.

Page 642: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

623

Fig.9.88. Sensor de temperatura tipo diodo.

Para el diseño del instrumento se requiere conocer para el transistor 2N3904: el coeficiente de temperatura (CT) a corriente constante y el valor de VBE a una tem-peratura de referencia. La hoja técnica del dispositivo incluye una curva que muestra la variación del CT con los cambios de la corriente terminal. Debido a que tal curva no permite determinar con precisión el valor de CT a la corriente seleccionada de 100 µA, se opto por obtener, mediante una simulación PSPICE, las variaciones de la ten-sión VBE cuando la temperatura cambia entre -40 °C y 60 °C. El circuito usado se muestra en la figura 9.89 y los resultados de la simulación en la figura 9.90.

Fig.9.89. Ventana gráfica del PSPICE mostrando el circuito simulado.

Page 643: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

624

Fig.9.90. Variación de VBE en función de la temperatura, a una corriente constante de 100 µA.

La resistencia de 44K en el circuito de la figura 9.89, se calcula suponiendo una tensión VBE constante de 600mV. En la práctica, la corriente que cruza el sensor sólo es aproximadamente constante y es posible demostrar que tal variación tiene un efecto despreciable en los resultados de la medida. Si se desea mejorar la precisión debe usarse una fuente de corriente constante. De la figura 9.90 se encuentra el CT del BJT, este es:

mVV 1.9086 TCBEΔ = − × Δ VBE(25°C) = 0.609 V

Los valores de VBE para los límites del rango de medida pueden obtenerse a partir de esta ecuación, o directamente de la curva:

VBE(-40°C) = 0.733 V VBE(60°C) = 0.542 V

Estos resultados indican que una variación en la temperatura de 100 °C pro-duce un cambio de 191 mV en los terminales del sensor. Debido a que el instrumento debe usar un circuito conversor análogo digital para adquirir la tensión a la salida del sensor, el cambio en la caída de tensión a través del BJT es demasiado pequeño (1.91mV por °C) comparado con la señal de entrada que debe aplicarse a la entrada de un conversor A/D de 8 bits, cuya resolución es de 19.531 mV. Esto es, para que el valor de la salida digital del convertidor aumente/disminuya en uno, la entrada ana-lógica debe variar ± 0.01953 V.

Page 644: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

625

Para lograr una resolución de 0.5 °C en la medida, la lectura del Nadc debe abarcar 200 pasos en el intervalo de variación de 100 °C de la temperatura ambiente. El convertidor A/D tiene 28=256 pasos entre 0 y 5 V. Al asignar dos pasos por cada grado de variación de temperatura, se obtiene una resolución de 0.5 °C/paso. Esto puede lograrse usando un circuito amplificador para acoplar la salida del sensor a la entrada del CAD. Seleccionando una correspondencia de 27 entre el valor digital de salida del conversor y la entrada VBE(-40°C ) de 0.733 mV, se tiene que para los ex-tremos del rango de medición, la salida del circuito de acondicionamiento de entrada debe ser:

Para V ( 40 C)BE

5V ( 40 C) 27 0.527 Vadc 256

Para V (60 C)BE5

V (60 C) 227 4.434 Vadc 256

• −

− = × =

= × =

Los niveles de las señales se indican en la figura 9.91.

Fig.9.91. Señales del sensor y del ADC.

Un circuito apropiado para procesar la tensión del sensor y obtener los niveles de voltaje especificados, se muestra en la figura 9.92.

Page 645: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

626

Fig. 9.92. Circuito de acoplamiento.

Para el amplificador de la figura 9.92, se tiene que:

La corriente I de entrada es igual a :e

V VePIe R1

La corriente I en R es :s 2

V Vs PIs R2

Considerando que no fluye corriente por la entrada inversora, se tiene :

V V V Ve sP PR R1 2

R R2 2V 1 V Vs ePR R1 1

V

−=

−=

− −=

= + × − ×⎛ ⎞⎜ ⎟⎜ ⎟⎝ ⎠

( )A 1 V A Vs v v eP= + × − ×

La ecuación de la señal de salida del circuito acoplador tiene dos incógnitas:

la ganancia en lazo cerrado Av del amplificador operacional y la tensión de polariza-

Page 646: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

627

ción VP de la entrada inversora. Para determinar sus valores, se considera el siguiente sistema de ecuaciones:

( )

( )

4.434 A 1 V A 0.542v vP

0.527 A 1 V A 0.733v vP

= + × − ×

= + × − ×

Resolviendo, se obtiene: A 20.46 V 0.723 Vv P = = En la figura 9.93 se muestra el circuito amplificador de entrada, donde se ob-

serva el uso de potenciómetros para fijar los valores de la ganancia y de la tensión de polarización.

Fig. 9.93. La salida del sensor se conecta a la entrada del circuito de acoplamiento.

El circuito de entrada del termómetro, mostrado en la figura 9.93, amplifica y

desplaza el nivel del voltaje de salida del sensor de modo que este abarque la mayor parte del rango de operación de entrada del convertidor análogo digital. Una vez que el conversor de datos convierte la entrada al dominio un valor digital, el código de la aplicación debe calcular el valor correspondiente de la temperatura ambiente y pre-sentarlo en representación decimal en la pantalla del MPR-85. El uso del amplificador operacional LMC660 permite que el circuito de entrada se alimente con +5 V. Otro

Page 647: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

628

operacional, el LM234 por ejemplo, alimentado a esta tensión entrega un voltaje de salida máximo de 3.5 V.

En la figura 9.94 se observa el diagrama funcional del instrumento. El pro-

grama usa como entrada la lectura del Nadc y calcula el valor de la temperatura en grados centigrados.

Fig.9.94. Diagrama funcional del termómetro.

Existe una relación lineal entre la temperatura y la tensión del sensorl, por lo

cual también hay una correspondencia lineal entre la lectura del sensor Nadc y la tem-peratura ambiente T, como lo ilustra la gráfica de la figura 9.95.

Fig.9.95. Relación entre la salida del conversor A/D y la temperatura ambiente.

Page 648: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

629

Para efectos del cálculo a realizar por el µP, se debe tener en forma analítica la dependencia mostrada en la gráfica. La expresión de la temperatura como función de Nadc es la siguiente:

T 40 0.5 (N 27)adc

T 0.5 N 53.5adc

= − + × −

= × −

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 535adc= × − Como resultado se obtendrá el valor de T multiplicado por 10. El programa

colocará convenientemente el punto decimal de modo que se presente en pantalla el valor correcto de la temperatura.

El diagrama final del circuito de procesamiento y adquisición de la variable

temperatura se muestra en la figura 9.96. Se usa el convertidor analógico digital ADC0804, a cuya entrada positiva se conecta la salida del amplificador. La entrada negativa se lleva a tierra. Este circuito se comunica con el µP por medio del 8155 #2 del MPR-85, el cual está decodificado en la dirección 50H.

Las salidas DB0-DB7 van al puerto A (51H). Por la línea 0 del puerto B (52H)

se genera la señal de inicio de conversión y el terminal que notifica el fin de la con-versión se conecta al la entrada 0 del puerto C (53H). Observe que el ADC0804 asi como los buffers de salida del chip están habilitados permanentemente al tener las entradas RDyCS forzadas a nivel bajo.

La temperatura varía en forma lenta por lo cual el periodo de muestreo puede

ser de horas, minutos o segundos dependiendo de la aplicación. En este caso se fija el tiempo de muestreo en 1 segundo. Se usa el temporizador del 8155 #2, con su salida conectada a la entrada RST 7.5, para establecer el tiempo entre muestras.El tempori-zador se programa para interrumpir al µP cada 5 mS y se arranca al final de la con-versión. La rutina de servicio incrementa un contador en cada interrupción. Cuando la cuenta alcance 200 habrá pasado 1 segundo y entonces se toma la siguiente muestra.

Se creó un proyecto en MicroIde para el control de termómetro. Los 6 módu-

los incluidos en el proyecto son:

Page 649: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

630

Fig. 9.96. Medidor de temperatura.

Page 650: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

631

• Programa principal

Al inicio configura el 8155 con puertos A y C como entradas y el puerto B como salida y llama a la rutina ESCRB_CAD para mostrar las unidades de medida en el campo de datos del MPR-85. Adquiere la muestra del voltaje del sensor y calcula el valor en binario de la temperatura ambiente correspondiente a la muestra. Llama a las rutinas BIN_BCD para convertir el resultado de la medida a decimal e invoca a los subprogramas PTO_DEC y CEROS para colocar el punto decimal y el signo negativo cuando sea necesario. A continuación habilita las interrupciones, arranca el timer y espera que transcurra un se-gundo para adquirir la muestra siguiente.

• Rutina ESCRB_CAD

Muestra en pantalla la cadena de caracteres apuntada por el registro par HL. Si B = 01 usa el campo de datos. Si B = 00 usa el campo de direcciones.

• Rutina POR5

Multiplica por 5 el contenido del registro L y retorna el resultado en el registro par HL.

• Rutina BIN_BCD

Es llamada por el programa principal para convertir a BCD valor de la tensión almacenado en binario en la memoria del sistema.

• Rutina PTO_DEC

Coloca el punto decimal al número mostrado por el LED L2.

• Rutina CEROS

Elimina los ceros que anteceden al dígito con el punto decimal. Si la variable signo es cero coloca el signo (-) en el LED L0; en caso contrario apaga el LED.

El listado de los módulos que constituyen el proyecto en el programa MicroI-de, se muestra a continuación.

;-----------------------------------------------------------------------------------------------------------------------$title(Medidor de temperatura) ;Modulo de programa principal public temp,nbytes_dec,nbytes_bin,dir_dec,dir_bin,pdatos_8279,pctrl_8279 extern bin_bcd,por5,pto_dec,ceros,escrb_cad ;----------------------------------------------------------------------------------------------------------------------- ; Declaración de constantes T535 equ -535

Page 651: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

632

i_stack equ 8FF0H ; Inicio de la pila i_rwm equ 8000H ; Dirección de RWM para datos modo_timer equ 0fch inic_timer equ 0C2h parar_timer equ 42h nbytes_dec equ 2 nbytes_bin equ 2 ;----------------------------------------------------------------------------------------------------------------------- Definición de segmentos defseg puertos,start=50h, class=iospace, absolute defseg stack, start=i_stack defseg datos, class=data, start=i_rwm defseg int, start=4006h defseg progr, class=code, start=6002h ;----------------------------------------------------------------------------------------------------------------------- Puertos de entrada del sistema seg puertos pctrl_8155 ds 1 pa_8155 ds 1 pb_8155 ds 1 pc_8155 ds 1 timer_bajo ds 1 timer_alto ds 1 org 60h pdatos_8279 ds 1 pctrl_8279 ds 1 ;----------------------------------------------------------------------------------------------------------------------- Los 16 bytes últimos de RWM soportan el stack. seg stack ds 10H ;----------------------------------------------------------------------------------------------------------------------- t_stack:equ $-1 ; Base de la pila ;----------------------------------------------------------------------------------------------------------------------- Segmento de datos en RWM seg datos dir_dec ds 4 dir_bin ds 2 signo ds 1 ;----------------------------------------------------------------------------------------------------------------------- seg int jmp rst7.5 ;----------------------------------------------------------------------------------------------------------------------- ; Segmento de código en EPROM ;----------------------------------------------------------------------------------------------------------------------- seg progr inicio: lxi sp,t_stack mvi a,parar_timer ; Parar timer out pctrl_8155 lxi h,grados ; Presentar unidades mvi b,1 call escrb_cad ; Medida (grados centigrados) mvi a,0 ; Señal de inicio de conversión a nivel bajo

Page 652: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

633

out pb_8155 nop ; Ancho de pulso de iniciar conversión ori 1 out pb_8155 ; Volver a nivel alto el pulso de inicio leer: in pc_8155 ; Leer estado de INTR ani 1 jnz leer ; Si es uno, esperar in pa_8155 ; Es cero, leer dato lxi d,T585 ; El registro DE se carga con -535 mvi h,0 ; Parte alta de HL a cero mov l,a ; Mover dato a L call por5 ; Multiplicar dato por 5 dad d ; Sumar el valor -535 mov a,h ; Examinar el signo del resultado ani 80h jz seg1 ; Si es positivo, variable signo se pone a 1 xra a ; Es negativo, variable signo se pone a 0 sta signo mov a,l ; Al valor cma ; negativo mov l,a ; se le mov a,h ; extrae cma ; el mov h,a ; valor inx h ; absoluto jmp seg2 ; Seguir seg1: ori 1 ; Signo positivo sta signo seg2: shld dir_bin ; Convertir dato en binario a decimal call bin_bcd mvi c,1 ; Presentar mvi a,0ah ; en lhld dir_dec ; campo de direcciones rst 7 ; de la pantalla del MPR-85 call pto_dec ; Poner punto decimal call ceros ; Poner signo (-) si la valor es negativo. Eliminar ceros

; antes del pd. xra a ; Programar timer out timer_bajo mvi a,modo_timer out timer_alto mvi a,inic_timer ; Arrancar timer out pctrl_8155 mvi a,11 ; Desenmascarar RST 7.5 sim ei ; Habilitar interrupciones mvi b,0 ; Contador se inicia en cero. es_int: jmp es_int ; Esperar interrupción ;----------------------------------------------------------------------------------------------------------------------- vector de interrupción rst7.5 ;-----------------------------------------------------------------------------------------------------------------------rst7.5: inr b ; Incrementar contador mov a,b cpi 200 ; Comparar con 200 jz inicio ; Si llego a 200, buscar próxima muestra

Page 653: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

634

ei ; Si aun no llega a 200, habilitar interrupciones ret ; Retornar. ;----------------------------------------------------------------------------------------------------------------------- Área de mensajes ;-----------------------------------------------------------------------------------------------------------------------grados: db 63h,39h end ;----------------------------------------------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------------------------------------------- ; Módulo PTO_DEC. ;----------------------------------------------------------------------------------------------------------------------- ; Coloca el punto decimal en dígito L2. ;----------------------------------------------------------------------------------------------------------------------- public pto_dec extern pdatos_8279,pctrl_8279 defseg progr seg progr pto_dec: push psw ; Salvar registro A y banderas. mvi a,01100010B out pctrl_8279 ; Se leerá la dirección 2 (L2) de la RWM de display.

in pdatos_8279 ; Leer RWM. ani 0f7h ; Se active punto decimal. out pdatos_8279 ; Se muestra el punto decimal. pop psw ; Recuperar desde de la pila ret ; Retornar. end

;----------------------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------------------- ; Módulo CEROS ;---------------------------------------------------------------------------------------------------------------- ; Coloca signo negativo y oculta ceros que precedan ; al dígito con punto decimal ;---------------------------------------------------------------------------------------------------------------- public ceros extern signo,pdatos_8279,pctrl_8279 defseg progr seg progr ceros: mvi a,90h ; Se escribirá en dirección 0 (L0) de la RWM out pctrl_8279 ; de display del 8279. lda signo cpi 1 ; Examinar variable signo. jz pos ; Si es 1, valor es positivo mvi a,0fbh ; Valor es negativo. out pdatos_8279 : Mostrar signo negativo en L0. jmp cer pos: mvi a,0ffh ; Positivo .Se apaga dígito L0. out pdatos_8279 cer: mvi a,61h ; Se leerá dirección 1 (L1) de la RWM out pctrl_8279 in pdatos_8279 ; L1 al acumulador

Page 654: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

635

cpi 0ch ; Verificar siu L1 muestra cero. rnz ; No es cero, retornar. mvi a,0ffh ; Es cero. apagar L1. out pdatos_8279 ret end

Los otros tres módulos: ESCRB_CAD, POR5 y BIN_BCD, fueron presenta-

dos en ejemplos anteriores de este trabajo.El circuito de la figura 9.96 fue construído y el programa de control fue descargado en la memoria del MPR-85 y ejecutado. Las lecturas de temperatura fueron comparadas con las realizadas por un medidor comer-cial de igual resolución y no se mostraron errores apreciables. Por esto, se concluye que el instrumento diseñado en este ejemplo funciona en forma adecuada.

Como dato curioso, las pruebas experimentales realizadas mostraron que el

coeficiente de temperatura del transistor 2N3904 se acercó más al valor obtenido de la simulación que al coeficiente suministrado por la hoja tecnica del dispositivo. Esto se comprobó midiendo la tensión VBE para distintas temperaturas y comparando los resultados de las medidas con los valores teóricos calculados usando ambos coefi-cientes.

Ejemplo 9.16

Un medidor digital de capacidad es un instrumento de presencia obligada en el

banco de trabajo de un diseñador de equipos electrónicos. Aunque los multímetros digitales ususalmente miden valores de capacidad, sólo lo hacen para valores peque-ños, hasta 20 µF. En este ejemplo se presenta el diseño de un instrumento que mide y muestra valores de capacidad entre 1 nF y 1000 µF usando el microcomputador MPR-85.

El instrumento tiene dos escalas mostradas en la figura 9.97. Un interruptor

lógico se usa para seleccionar la escala. Debe diseñarse el circuito de medida y escri-birse el programa de control del medidor de capacidad. Se usan los puertos y el timer del 8155 #2 del del MPR-85, el cual está decodificado en la dirección 50H.

E1: 0.001 µF – 9.999 µF

E2: 0.1 µF – 999.9 µF

Fig.9.97. El instrumento tiene dos escalas de medida.

Page 655: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

636

Solución: El método mas sencillo para medir capacitancia es contabilizar el tiempo que

el componente Cx, de valor desconocido, tarda en cargarse hasta una tensión de refe-rencia Vr. Debido a que el tiempo de carga es función de la capacidad, es posible de-terminar el valor del capacitor.

El circuito de medida se muestra en la figura 9.98. El transistor Q1 permite

descargar a Cx cuando el programa pone en uno la salida P51.0 conectada al resistor R1. Para realizar una medida es necesario que el capacitor esté inicialmente descarga-do. Cuando Q1 está cortado, Cx se carga hacia +5 V a través R2. Cuando la tensión VCx alcanza el valor del voltaje de referencia Vr, la salida del comparador LM311 sube a nivel alto indicando al µP por medio de la línea P52.0 el final del proceso de medida. El interruptor S1 permite al ususario seleccionar la escala baja E1, cuando P52.3 está en cero o la alta E2, cuando P52.3 está nivel alto.

El tiempo que tarda el capacitor en cargarse desde cero hasta Vr es dado por la expresión:

1t R C lnx x2 Vr1

5

= ×−

⎛ ⎞⎜ ⎟⎜ ⎟⎜ ⎟⎝ ⎠

Si con la escala E1 seleccionada y con Cx igual a 1 nF se ajusta R2 hasta cuan-

do tx sea 32 µS, entonces:

E3 1t 32 10 C 32 Sx xmin

E3 2t 32 10 C 3.2mSx xmin

= × × = μ

= × × =

Con el instrumento en la escala E1, el µP debe ser programado para que

cuando se inicie la carga del Cx incremente en uno un contador cada 32 µS (cada 3.2 mS en la escala E2). Si estando seleccionada la escala E1, se conecta en los terminales de medida un capacitor de 1.357 µF, este tardará en cargarse a Vr un tiempo de 43.424 mS y el contador debe registrar una cuenta de 1357, precisamente el valor de Cx. Como se observa en la figura 9.98, el timer registra los pulsos de la señal de reloj del sistema cuyo periodo es de 0.32 µS. Si en la escala E1, el temporizador se carga con 100 generará una solicitud de interrupción cada 32 µS. Si la rutina de servicio incrementa un contador de 16 bits en cada interrupción, entonces el contador alcan-zará el valor 1357 en el momento que la salida del comparador suba anivel alto. Ob-serve que la calibración realizada para la escala baja se mantiene para la otra escala. Un valor de 10000 debe cargarse en el timer cuando se use la escala E2.

Page 656: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

637

Fig.9.98. Circuito del medidor de capacidad.

Page 657: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

638

Se creó un proyecto en MicroIde para el control del capacimetro. Los 6 mó-dulos incluidos en el proyecto son:

• Programa principal

Al inicio configura el 8155 con puertos A como salida y el puerto B como entrada, muestra el valor 0000 (colocando el punto de acuerdo con la escala) en el campo de direcciones de la pantalla) y llama a la rutina ESCRB_CAD para mostrar las unidades de medida en el campo de datos del MPR-85. Luego se descarga el capacitor y se espera la activación de cualquier tecla para iniciar el proceso de medida. Con la presión de un pulsador del teclado, el código programa y arranca el timer, inicia la carga de Cx y habilita las interrupciones. E eAdquiere la muestra del voltaje del sensor y cal-cula el valor en binario de la temperatura anste punto, el µP permanece examinando el esta-do de la salida del comparador mientras esta esté en cero. Cuando la salida del comporador sube a nivel alto, el µP verifica si la medida está dentro del rango. Si este no es el caso se genera un mensaje de error. Para una medida válida, se llama a las rutinas BIN_BCD para convertir el resultado a deci-mal y se ejecuta la rutina PTO_DEC para colocar el punto decimal de acuerdo con la escala seleccionada y si el instrumento está en la escala E2 se invoca al subprograma CEROS para eliminar los ceros antes del dígito L2. En este punto el programa espera la activación de cualquier tecla para reiniciar el proceso de medida.

• Rutina ESCRB_CAD

Muestra en pantalla la cadena de caracteres apuntada por el registro par HL. Si B = 01 usa el campo de datos. Si B = 00 usa el campo de direcciones.

• Rutina BIN_BCD

Es llamada por el programa principal para convertir a BCD valor de la tensión almacenado en binario en la memoria del sistema.

• Rutina PTO_DEC

Coloca/quita el punto decimal en el dígito indicado por el registro B. Si el registro C contie-ne 8 pone el punto, si C es 0 lo quita.

• Rutina CEROS

En la escala E2, oculta los ceros que anteceden al dígito L2.

Los listados de los módulos del programa principal y de las rutinas PTO_DEC

y CEROS, se presentan a continuación:

Page 658: Microprocesadores-Luis Urdaneta

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

Page 659: Microprocesadores-Luis Urdaneta

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.

Page 660: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

641

mvi a,parar_timer ; Si P52.0 está en uno, parar timer. out pctrl_8155 mov a,d ; Detectar fuera de rango. cpi 27h jc seg1 mov a,e cpi 10h jc seg1 ; Si medida dentro del rango, continuar. lxi h,error ; Medida está sobre el rango mvi b,0 ; Generar mensaje de error. call escrb_cad lxi h,borrar ; Borrar campo de datos durante error. mvi b,1 call escrb_cad ; Esperar tecla. mvi a,12 rst 7 jmp inicio ; A inicio desde error. seg1: xchg shld dir_bin call bin_bcd ; Convertir valor de la medida a BCD. mvi c,1 ; Presentar valor BCD en campo de direcciones. mvi a,0ah lhld dir_dec rst 7 lda temp ; Recuperar escala. mov c,a ; Poner punto decimal según escala. mvi b,dig2 call pto_dec mov a,c xri 8 mov c,a mvi b,dig0 call pto_dec lda temp ; Recuperar escala. ani 8 jz tecla ; Si escala es E1, seguir. call ceros ; Eliminar ceros si escala es E2. tecla: mvi a,0ch ; Esperar por activación de tecla. rst 7 jmp inicio ; Iniciar presentando 0000. ; --------------------------------------------------------------------------------------------------------------------------; Rutina de servicio de interrupción RST 7.5 ; -------------------------------------------------------------------------------------------------------------------------- rst7.5: inx d ; Incrementar contador. ei : Habilitar interrupciones. ret ; --------------------------------------------------------------------------------------------------------------------------; Área de mensajes ; -------------------------------------------------------------------------------------------------------------------------- uf: db 3eh,71h ; Unidades de medida (µF) error: db 0,79h,50h,50h ; Mensaje de error. borrar: db 0,0 end ; --------------------------------------------------------------------------------------------------------------------------

Page 661: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

642

; --------------------------------------------------------------------------------------------------------------------------; Módulo PTO_DEC. ; -------------------------------------------------------------------------------------------------------------------------- ; Coloca el punto decimal en dígito indicado por registro B ; Si C=8 pone el punto. Si C=0 no pone punto ; -------------------------------------------------------------------------------------------------------------------------- public pto_dec extern pdatos_8279,pctrl_8279 defseg progr seg progr pto_dec: push b ; Salvar registros y banderas. push psw mov a,c ; Si C = 8, activa bit de punto. cma ; Si C = 0, desactiva bit de punto. mov c,a ; Guarda estado de bit de punto decimal. mov a,b ; Carga en el acumulador número del dígito. ori 60h out pctrl_8279 ; Programa lectura de dígito. in pdatos_8279 ; Lee código del dígito. ori 8 ; Si tiene punto, lo quita. ana c ; Pone punto cuando indique el contenido de C. out pdatos_8279 ; Presenta dígito con/sin punto decimal. pop psw ; recupera registros y banderas. pop b ret end ; -------------------------------------------------------------------------------------------------------------------------- ; Módulo CEROS ; -------------------------------------------------------------------------------------------------------------------------- ; En la escala E2, oculta los ceros que precedan al dígito con punto decimal (L2) ; --------------------------------------------------------------------------------------------------------------------------

public ceros extern pdatos_8279,pctrl_8279 defseg progr seg progr ceros: mvi b,-1 mvi c,2 ; Se examinan dos digitos: L0 y L1. rep: inr b ; Selección de dígito mov a,b : Se programa lectura de código de dígito en B. ori 60h out pctrl_8279 in pdatos_8279 ; Se lee código 7-segmentos. cpi 0ch ; Se compara con cero. rnz ; Si dígito L1 no es cero, retornar. mvi a,0ffh ; Como es cero… out pdatos_8279 ; … se apaga LED. dcr c ; Contador de digitos menos 1. jnz rep ; Examinar L1. ret ; Contador en cero, retornar. end

Page 662: Microprocesadores-Luis Urdaneta

Dispositivos de E/S Programables

643

Si el capacitor conectado a los terminales de prueba es mayor que 9.999 µF, estando la escala E1 seleccionada; o es mayor a 999.9 µF en escala E2, la pantalla mostrará en el campo de direcciones un mensaje de error y permanecerá en espera de la activación de una tecla para continuar. El ususario debe conectar un capacitor de menor valor o cambiar la escala, según corresponda, y presionar una tecla para reini-ciar la medida.

El medidor de capacidad fue ensamblado y probado. Las lecturas del instru-

mento fueron contrastadas con las medidas realizadas con un capacímetro digital co-mercial y los resultados fueron excelentes. El equipo mide capacidad con alta preci-sión.

Page 663: Microprocesadores-Luis Urdaneta

Bibliografía 644

Bibliografía Aho, A. Sethi, R. Ullman, J. "Compiladores. Principios, técnicas y Herramientas". Addison-

Wesley Iberoaméricana. USA. 1990. ISBN 0-201-62903-8. Ángulo, J. "Microprocesadores. Fundamentos, Diseño y Aplicaciones en la In-

dustria y en los Microcomputadores". Paraninfo S.A. Madrid. 1981. ISBN 84-283-1148-X.

Ángulo, J. "Microprocesadores Avanzados 386 y 486. Introducción al Pentium y

Pentium Pro". Paraninfo S.A. Madrid. 1998. ISBN 84-283-2374-X. Brey, B. "Los Microprocesadores de INTEL. Arquitectura, Programación e

Interface. Prentice Hall Hispanoaméricana S.A. Naucalpan de Juarez. Estado de Mexico. 1995. ISBN 968-880-481-9.

Brown, P. "Writing Interactive Compilers and Interpreters". John Wiley & Sons.

USA. 1979. ISBN 0-471-27609-X. Coffron, J. "Microprocessor Programming, Troubleshooting, & Interfacing: The

Z80, 8080, & 8085". Prentice Hall. USA. 1997. ISBN 0135819768. Dixon, A. Antonakos, J. "Digital Electronics with Microprocessor Applications". John Wiley.

USA. 1987.

Gaonkar, R. “Microprocessor Architecture, Programming, & Applications with the 8085". Prentice Hall. USA. 2001. ISBN 0130195707.

Gil, A. "Electrónica General. Dispositivos y Sistemas Digitales". McGraw-Hill. Interamericana de España. Madrid. 1989. ISBN 84-7615-329-5.

Goody, R. "The Microcomputer Laboratory Manual: Based on the 8085 Micro-

processor". Science Research Associate. USA. 1987. Graham, N. "Microprocessors Programming". Tab Books. USA. 1980. ISBN 0-

8306-7952-9. Hennessy, J. Patterson, D. "Computer Architecture: A quantitative Approach". Morgan Kauf-

mann Publishers. USA. 2002. ISBN 1558605967.

Page 664: Microprocesadores-Luis Urdaneta

Bibliografía 645

Hennessy, J. Patterson, D. "Organización y diseño de Computadores. La Interfaz Hardware y

Software". McGraw-Hill. Interamericana de España. Madrid. 1994. ISBN 84-481-1829-4.

Hordeski, M. "Microprocessor Cookbook. Tab Books. USA. 1979. ISBN 0-8306-

9778-0. Intel. “The 8080/8085 Microprocessor Book ". John Wiley. USA. 1980. Intel. “Peripheral Design Handbook ". Intel Corporation. Santa Clara C.A.

1980. AFN 0-1300A-1. Intel. “MCS-85 User´s Manual". Intel Corporation. Santa Clara C.A. 1978. Intel. “8080/8085 Assembly Language Programming Manual". Intel Cor-

poration. Santa Clara C.A. 1979.

Kleitz, W. "Microprocessor and Microcontroller Fundamentals: The 8085 and 8051 Hardware and Software. Prentice Hall. USA. 1997. ISBN 0132628252.

Krutz, R. "Interfacing Techniques in Digital Design with Emphasis on Micro-processors". John Wiley & Sons. USA. 1988. ISBN 0-471-08289-9.

Kuecken, J. "Handbook of Microprocessors Applications. Tab Books. USA.

1980. ISBN 0-8306-9935-X. Leventhal, L. Walsh, C. "Microcomputer Experimentation with INTEL SDK-85. Prentice

Hall Inc. New Jersey, USA. 1980. ISBN 0-13-580860-X. Leventhal, L "Introduction to Microprocessors. Prentice Hall. International Edi-

tions. Londres. 1978. ISBN 0-13-487876-O. Loeliger, R. "Threaded Interpretive Languages". BYTE Publications Inc. USA.

1981. ISBN 0-07-038360-X. Peatman, J. "The Design of Digital Systems". McGraw-Hill. USA.1972. ISBN 07-

049136-4. Robin, M. Maurin, T. "Interconexión de Microprocesadores". Paraninfo S.A. Madrid. 1985.

ISBN 84-283-1224-9. Stallings, W. "Computer Organization and Architecture.Designing for Perfoman-

ce". Prentice Hall. USA. 2002. ISBN 0-13-049307-4.

Page 665: Microprocesadores-Luis Urdaneta

Bibliografía 646

Tanenbaum, A. "Organización de Computadoras. Un Enfoque Estructurado". Prentice Hall Hispanoamericana S.A. Naucalpan de Juarez. Estado de Mexico. 2000. ISBN 0-13095990-1.

Tokheim, R. "Fundamentos de los Microprocesadores". McGraw-Hill. Interameri-

cana de España. Madrid. 1991. ISBN 84-7615-592-2. Tracton, K. "Display Electronics. Tab Books. USA. 1977. ISBN 0-8306-7861-1. Uffenbeck, J. "Microcomputers & Microprocessors: The 8080, 8085, & Z-80 Pro-

gramming, Interfacing, & Troubleshooting". Prentice Hall. USA. 1999. ISBN 0132091984.