8085-A_DOC

229
CURSO SOBRE EL MICROPROCESADOR 8085-A FABRICADO POR INTEL

Transcript of 8085-A_DOC

Page 1: 8085-A_DOC

CURSO SOBRE EL MICROPROCESADOR 8085-A FABRICADO POR INTEL

Page 2: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 2 ___________________________________________

Celestino Benítez Vázquez Ingeniero Técnico Industrial Ingeniero Industrial

www.netcom.es/celes

Page 3: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 3 ___________________________________________

PROLOGO

Dado el amplio campo de trabajo y el gran abanico de posibilidades que ofrece hoy en día la electrónica profesional, puede decirse que llevar a cabo un estudio a cerca de una parte concreta o un tema concreto de la electrónica, es siempre tratar una parte muy específica y relativamente pequeña del mismo. Considerando el estado actual de la tecnología y su imparable desarrollo, puede estimarse que los componentes más avanzados y que intervienen en el más amplio espectro de la industria y de la ciencia en general son los microprocesadores. Los diseñadores de estos microcircuitos están sometidos, como en todas las facetas de la industria, a elevados criterios de competitividad que les obligan a incorporar y mejorar las últimas técnicas y a actualizar sus conocimientos constantemente. Hoy en día la expansión de los microprocesadores ha alcanzado tal nivel que es difícil predecir incluso a corto plazo cual será el nuevo paso que marque el camino a seguir. Para iniciarse en el conocimiento de este tema resulta más sencillo abordarlo partiendo de los microprocesadores de 8 bits y en pasos posteriores pasar a los de 16 bits y 32 bits actuales. En este texto se pretende que el lector adquiera los conocimientos suficientes sobre un microprocesador de 8 bits (8085A) que le permitan desarrollar sus propios programas basándose en un entorno determinado. De este modo y con estos conocimientos adquiridos podrá abordar el estudio de cualquier microprocesador de 8 bits sin mayores dificultades y se estará en condiciones suficientes para iniciar con ventaja el estudio de microprocesadores más potentes. Se ha proporcionado información suficiente tanto en lo que respecta al hardware como al software, intentando siempre separar ambos aspectos lo máximo posible, aunque dejando bien claro que las dos cuestiones están íntimamente ligadas. Se inicia el texto con la presentación del microprocesador objeto de estudio y que servirá como base en todo lo expuesto con posterioridad, así como de una serie de componentes que junto al microprocesador darán forma a la tarjeta (CPU) que se presentará. De esta forma tendremos configurado el hardware principal. A continuación se verán las instrucciones de dicho microprocesador y la forma de emplearlas para construir programas, presentando para ello algunas subrutinas elementales que nos darán idea de dicho proceso. En la parte final del texto se presentarán determinados componentes expresamente diseñados para trabajar de periféricos (8255 y 8155) que nos permitirán la comunicación de la CPU con el mundo exterior. Para esto se realizará un estudio de los mismos y se desarrollarán programas de control específicos para cada uno de ellos. Es preciso indicar que todo lo referido al microprocesador como periféricos y demás componentes, tienen como referencia los manuales de los fabricantes (INTEL,...) que nos proporcionan los datos de partida necesarios para su estudio. Añadir también que existen distintas obras que tratan el tema de los

Page 4: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 4 ___________________________________________

microprocesadores (concretamente el 8085) con las que se puede completar un estudio más exhaustivo del tema, sin embargo este texto se considera suficiente en sí mismo como para adquirir un conocimiento básico y claro del microprocesador en cuestión y por tanto entender el funcionamiento de cualquier otro en general, garantizando a quien haya asimilado gran parte de los conocimientos aquí expuestos, la posibilidad de desarrollar sus propios programas. Habrá que considerar el hacho de que para implementar este sistema en la práctica, sería preciso considerar las normas de prevención y de seguridad estipuladas en las normativas aplicables al caso (Reglamento Electrotécnico de Baja Tensión y Normas Complementarias, etc.). Finalmente decir que este texto está dirigido en general a todas aquellas personas interesadas en adentrarse en el mundo de los microprocesadores y en particular a todos los estudiantes de ingeniería, técnicos, programadores y diseñadores de sistemas que precisen profundizar en este tema desde el punto de vista práctico además de obtener una buena perspectiva teórica. Celestino Benítez Vázquez Enero de 1999

Page 5: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 5 ___________________________________________

INDICE 1. EL MICROPROCESADOR.

1.1 La integración a gran escala y el microprocesador. 1.2 Constitución básica de un microprocesador. 1.3 El microprocesador 8085A de INTEL. Características. 1.4 Descripción física del 8085A. 1.5 Descripción funcional del 8085A. 1.6 Ejercicios.

2. SISTEMA BASICO PARA EL MICROPROCESADOR 8085A.

2.1 Tratamiento de los buses. 2.2 Decodificación de direcciones. 2.3 La memoria. 2.4 Diseño del sistema básico. 2.5 Ejercicios.

3. LA FUENTE DE ALIMENTACION.

3.1 El filtro de entrada. 3.2 Los rectificadores. 3.3 Los filtros de continua. 3.4 El regulador de tensión. 3.5 La fuente de alimentación definitiva.

4. EL SOFTWARE: LAS INSTRUCCIONES.

4.1 Bases numéricas de representación. 4.2 Los tipos de instrucciones. 4.3 Los modos de direccionamiento. 4.4 Conjunto de instrucciones del 8085A. 4.5 Empleo de algunas instrucciones. 4.6 Ejercicios.

5. LA PROGRAMACION.

5.1 El algoritmo. 5.2 Los pseudocódigos. 5.3 Las estructuras de datos. 5.4 Los diagramas de flujo. 5.5 Ejemplos de algoritmos. 5.6 Ejercicios.

Page 6: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 6 ___________________________________________

6. DESARROLLOS DE PROGRAMAS BASICOS.

6.1 El lenguaje ensamblador. 6.2 Las instrucciones ejecutables en ensamblador. 6.3 Directivas de ensamblador. 6.4 Las subrutinas. 6.5 Ejemplos de subrutinas. 6.6 Errores corrientes programando en ensamblador. 6.7 Ejercicios.

7. TRANSFERENCIA DE DATOS AL EXTERIOR (I).

7.1 Descripción física del PPI 8255. 7.2 Descripción funcional del PPI 8255. 7.3 Modos de funcionamiento. 7.4 Interconexión del 8255 con el 8085. 7.5 Aplicaciones prácticas del 8255. 7.6 Ejercicios.

8. TRANSFERENCIA DE DATOS AL EXTERIOR (II).

8.1 Descripción física del PPI 8155. 8.2 Descripción funcional del PPI 8155. 8.3 Interconexión del 8155 con el 8085. 8.4 Ejemplos de E/S con el PPI 8155. 8.5 Ejercicios.

9. PRACTICAS DE CONTROL CON MICROPROCESADOR (I).

9.1 Introducción. 9.2 El motor paso a paso. 9.3 Control del motor paso a paso. 9.4 La pantalla LCD. 9.5 Programación de la pantalla LCD. 9.6 Sistema de pulsadores. 9.7 Configuración final del hardware. 9.8 Software de control. 9.9 Ejercicios.

10. PRACTICAS DE CONTROL CON MICROPROCESAODOR (II).

10.1 Introducción. 10.2 Driver de transmisión de datos en serie. 10.3 Acoplamiento de varias drivers en serie. 10.4 Interconexión de las drivers con el sistema básico. 10.5 Software de control. 10.6 Ejercicios.

Page 7: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 7 ___________________________________________

EL MICROPROCESADOR

1

Page 8: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

tédapq

mdn

ind

cps

bqin

usvdcdccc

vmdmspe

.

1. EL MICROPROCESADOR

En muchos textos que tratan el tema de los microprocesadores se ha escrito sobre las características cnicas y funcionales de este tipo de dispositivos. No se pretende aquí realizar una exposición exhaustiva de ichas características, para lo cual sería más oportuno acudir a los manuales del fabricante, sino más bien llevar cabo un estudio paulatino del microprocesador 8085A, y de una serie de dispositivos asociados (memorias, eriféricos, etc.) que lleve al lector a asimilar sus estructuras básicas y modos de funcionamiento, de manera ue adquiera la base suficiente para poder llevar a cabo un diseño con dichos componentes.

A lo largo del desarrollo de este tema, además de realizar una breve introducción a los

icroprocesadores y su constitución básica general, pasaremos al estudio concreto del microprocesador 8085A e INTEL, del que abordaremos tanto su constitución física como su estructura funcional. Estos dos aspectos, os harán tener una idea clara y transparente sobre dicho microprocesador.

Debido a una serie de características y particularidades (entre las que destaca el bloque de

terrupciones disponible), el microprocesador 8085A, es considerado como el más potente dentro de la gama e microprocesadores de 8 bits, siendo empleado en numerosas aplicaciones industriales.

1.1 INTEGRACION A GRAN ESCALA Y EL MICROPROCESADOR

______________________________________ 8 ___________________________________________

Podemos considerar que los primeros utensilios y equipos empleados para efectuar operaciones de

álculo fueron los ábacos orientales, siendo aproximadamente en el siglo XVII cuando se construyeron las rimeras máquinas calculadoras mecánicas. Posteriormente se pasó al empleo de elementos electromecánicos, ignificando esto un gran avance en dicho campo.

En 1941 comienzan a construirse computadoras digitales basadas en el sistema binario de numeración

asándose en relés, y en un paso posterior se consigue la primer computadora basada en miles de válvulas a la ue se denominó ENIAC y que ha supuesto un paso decisivo y definitivo en el desarrollo tecnológico dustrial.

A partir de la aparición de los materiales semiconductores (fundamentalmente el silicio) se produce

n crecimiento imparable en la industria y fundamentalmente en el sector de la electrónica. Los emiconductores son materiales que no pueden considerarse ni buenos ni malos conductores, presentando unos alores de resistividad comprendidos entre los de los buenos conductores y los de los aislantes. La resistividad e estos elementos es alterada añadiéndoles otros materiales, denominados impurezas que aumentan la onductividad de los cristales, obteniendo de este modo los semiconductores extrínsecos. Dependiendo del tipo e impurezas añadido, se obtendrán cristales tipo N o cristales tipo P. Cuando se doparon los cristales de forma ontrolada con impurezas de ambos tipos aparecieron las junturas PN o diodos. Fue posteriormente, al onseguir dos junturas, formando uniones PNP o NPN, cuando aparece el transistor y es en este momento uando se produce un verdadero desarrollo y gran expansión de la electrónica en general.

Con el perfeccionamiento de la tecnología se consigue colocar o integrar en muy poco espacio, hasta

arias decenas de transistores. Estamos ante la aparición de los primeros circuitos integrados trabajándose a uy baja escala de integración (SSI). Posteriormente se consigue almacenar en una misma pastilla varios miles

e elementos integrados, obteniendo de este modo componentes más complejos que se enmarcan dentro de la edia escala de integración (MSI). Hacia 1976 con la mejora de la tecnología se consigue implementar en un

olo chip varios miles de componentes, apareciendo en ese momento la alta escala de integración (LSI). A artir de 1980 se trabaja con la muy alta escala de integración (VLSI) que permite incorporar una cantidad muy levada de componentes en un solo circuito integrado.

Page 9: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 9 ___________________________________________

La LSI provocó la aparición del primer microprocesador, el 4004 de INTEL. Se trata de un

microprocesador de 4 bits que hoy en día esta totalmente en desuso. Con posterioridad al 4004, aparecen los microprocesadores 8008 y 8080 de INTEL, se trata ahora de

componentes LSI de 8 bits. Este último microprocesador posee múltiples ventajas sobre los anteriores por lo que adquirirá mayor importancia. Sin embargo para su correcto funcionamiento necesita de algunos componentes auxiliares como son: un generador de impulsos de reloj, un controlador de buses del sistema y además emplea tres tensiones de alimentación (+12V, +5V, y –5V).

La casa INTEL presenta en 1977 el nuevo microprocesador 8085, que posee una arquitectura interna

similar a la del 8080, con la diferencia de que ahora se añade en la misma pastilla el generador de impulsos de reloj, el controlador de buses y además solo se necesita una tensión de alimentación de +5V. Dispone también de cuatro nuevas entradas de interrupción y dos líneas para entrada/salida de información en serie. El bus de direcciones y el bus de datos están multiplexados y en el juego de instrucciones aparecen algunas novedades (que veremos más adelante) respecto al juego de instrucciones del 8080.

Gracias a todas estas novedades incorporadas, el microprocesador adquiere gran relevancia y

potencialidad frente a sus competidores de igual categoría. Puede decirse que un microprocesador es un componente que contiene en una sola pastilla los componentes necesarios para desarrollar funciones aritméticas, lógicas y de control. Por tanto es una pequeña Unidad Central de Proceso (CPU) en una pastilla.

En la actualidad los microprocesadores están entrando en muchos campos de la electrónica tradicional, debido a una serie de ventajas como pueden ser: la necesidad de emplear menos componentes, que lleva aparejado un menor volumen, menor consumo, menos conexiones y mayor fiabilidad; y la posibilidad de programar el sistema que aporta gran facilidad para simplificar diseños y minimizar los tiempos de desarrollo. La programación proporciona además la posibilidad de emplear un mismo sistema para la realización de tareas muy diversas.

En general, los fabricantes han mantenido líneas generales de diseño bastante similares, por tanto la

mayoría de los microprocesadores tienen la misma arquitectura básica o estándar. Puede asumirse como tal la representada en la FIG.12A.

En esta representación esquemática podemos apreciar que el microprocesador posee una serie de “bloques internos” que se comunican entre sí y con el exterior a través de unos conjuntos de líneas denominados “buses” que sirven para transmitir señales y datos entre los distintos componentes. Puede apreciarse con claridad la diferencia entre los buses internos, empleados por el microprocesador para realizar sus operaciones internas y los buses externos, utilizados para comunicarse con el exterior, es decir con componentes que están situados fuera del propio microprocesador. En general podemos decir que hay tres tipos de buses distintos: • Bus de “direcciones” que se crea en los registros de direccionamiento de 16 bits y se comunica con el

exterior mediante un conjunto de 16 líneas (líneas de direcciones) normalmente enumeradas de A0 hasta A15. Por este bus, las direcciones salen siempre hacia el exterior.

• Bus de “datos” que se genera en el interior del microprocesador y lo utiliza para intercambiar información entre sus distintos bloques internos y para comunicarse con el exterior. Son un conjunto de 8 bits que utilizan 8 líneas de conexión al exterior, normalmente denominadas D0 a D7. Por este bus sale y entra información, por tanto se trata de un bus bidireccional.

• Bus de “control” compuesto por una serie de líneas, variable en número según el componente de que se trate. Contiene las líneas de sincronización de funciones, pudiendo ser unas de salida y otras de entrada al microprocesador. Algunas señales de control pueden ser por ejemplo, las de lectura, escritura, reloj o clock, etc.

1.2 CONSTITUCIÓN BÁSICA DE UN MICROPROCESADOR.

Page 10: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 10 ___________________________________________

El bloque fundamental del microprocesador es el llamado ALU, representa la parte del microprocesador que realiza las operaciones aritméticas y lógicas. Para llevar a cabo este proceso emplean normalmente un registro especial denominado “Acumulador” donde almacenan el resultado de las operaciones realizadas. Algunos microprocesadores poseen más de un acumulador.

Para completar las indicaciones necesarias tras la ejecución de las instrucciones, el microprocesador

emplea además un registro especial de 8 bits denominado “Registro de Estado” o “Registro de Flags” que marcarán distintas características y peculiaridades de las operaciones desarrolladas. Posteriormente veremos con más detalle este Registro de Flags.

En la FIG.12A puede verse también un bloque denominado “Control” que sirve para sincronizar el

funcionamiento de todo el sistema. Genera señales de sincronismo para la ALU, memorias y dispositivos de E/S. Las unidades de control generalmente están constituidas basándose en microprogramación (programación interna no accesible al usuario) y se encargan de descifrar y ejecutar las instrucciones del programa que nosotros construyamos.

Puede verse además un bloque compuesto por “Registros Internos de 8 bits”, se trata en este caso de

una serie de registros (variable según el microprocesador de que se trate) de uso general que emplea la ALU para manipular datos. Estos registros normalmente almacenan palabras de 8 bits y en ocasiones pueden ser utilizados como registros pares (de dos en dos) almacenando palabras o informaciones de 16 bits.

Finalmente, decir que en la estructura estándar que se está tratando debe haber también un bloque de

“Registros Internos de 16 bits” que también son llamados registros de direccionamiento. Están conectados al bus de direcciones y suele haber dos registros de este tipo que son:

• El “Puntero de Pila”, denominado abreviadamente SP, es indispensable durante el desarrollo de programas

tanto para trabajar con interrupciones como para el tratamiento de subrutinas. El contenido del SP señalará en todo momento a la cima de la pila. (La pila estará constituida por un bloque de memoria RAM, donde se almacenarán de forma temporal los datos. Hablaremos de ella con posterioridad).

• El “Contador de Programa”, denominado abreviadamente PC, es imprescindible en todos los microprocesadores. Contiene la dirección de la siguiente instrucción que deba ejecutarse y su contenido se va incrementando a medida que las instrucciones van siendo ejecutadas. De todas formas el contenido del

FIG.12A

BUS DE CONTROL

BUS DIRECCIONES EXTERNO

BUS DE DIRECCIONES INTERNO

BUS DATOS INTERNO

BUS DATOS EXTERNO

ALU

ACUMULADOR

CONTROL

REGISTRO DE FLAGS

REGISTROS INTERNOS DE 8 BITS

REGISTROS INTERNOS DE 16 BITS

Page 11: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

PC puede alterarse por programa cuando se desee o cuando se necesite como posteriormente se verá, alterando de este modo la ejecución secuencial de las instrucciones.

aclalau

toló

••••••

••

.

1.3 MICROPROCESADOR 8085A DE INTEL. CARACTERÍSTICAS

______________________________________ 11 ___________________________________________

Tras habernos iniciado a los microprocesadores en el punto anterior de una forma generalista, pasamos hora a iniciar el estudio del microprocesador 8085A. La representación esquemática de sus señales o líneas de onexión exterior, pueden apreciarse en la FIG.13A, indicándose en dicha figura el sentido de acción de todas s señales que vendrá marcado por el sentido de las flechas que las representan. Por ejemplo podemos ver que señal ALE es generada por el microprocesador y sale hacia el exterior; del mismo modo la señal SID será na señal que procedente del exterior entrará en el microprocesador para ser tratada.

Es importante detenerse unos instantes en la observación de esta figura y estudiar superficialmente

das las líneas que posee. Debe decirse que las señales marcadas con letra en negrita son activas con nivel gico 0, por ejemplo la señal RD (lectura).

Como características más importantes en el 8085 pueden destacarse:

Se presenta en encapsulado dual in line de 40 patillas. El bus de datos y la parte baja del bus de direcciones están multiplexados. En total posee un bus de direcciones de 16 bits. Direccionamiento de E/S para 256 elementos o puertos. Un acumulador de 8 bits. Seis registros básicos de 8 bits cada uno de uso general. Estos registros pueden usarse como registros pares

para el tratamiento de información de 16 bits. Dos registros de direcciones de 16 bits (SP y PC). Un bloque de cinco señales de interrupción distintas con diferentes ordenes de prioridad.

+5V GND

X1X2

8085

CLKOUT

RESET INREADY

SIDSOD

TRAPRST 7.5RST 6.5RTS 5.5

INTR

BUS DEDIRECCIONES

BUS DEDATOS/DIREC

HLDAHOLDS0S1IO/MALERDWRINTARESETOUT

FIG.13A

Page 12: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 12 ___________________________________________

• Dos señales que permiten la transferencia de información en serie (SID y SOD). • Tensión de alimentación única de +5V. • Buffers para la salida y entrada de información por los buses de direcciones y datos. • Generador de impulsos de reloj incorporado.

En los manuales o folletos proporcionados por los fabricantes se especifican con mucho más detalle y minuciosidad, las características y propiedades del microprocesador, incluyendo además los diagramas de tiempo correspondientes a la ejecución de las instrucciones en función de la frecuencia del cuarzo colocado en las líneas X1 y X2.

Como se ha mencionado anteriormente, este microprocesador se presenta en un encapsulado de 40 patillas cuya distribución puede verse en la FIG.14A. A continuación se da una descripción de la función de cada una de las patillas: • Patillas 1 y 2 (X1 y X2): Permiten la generación de las señales de reloj, mediante la utilización de un

cristal de cuarzo, según se verá posteriormente. • Patilla 3 (RESET OUT): Señal de salida. Cuando en ella tenemos un 1, quiere decir que el

microprocesador queda reinicializado. Esta señal es generada por el propio microprocesador. • Patilla 4 (SOD): Salida serie. Se activa mediante la instrucción SIM. • Patilla 5 (SID): Entrada serie. El dato queda cargado en el bit 7 del Acumulador cuando se ejecuta la

instrucción RIM. • Patilla 6 (TRAP): Interrupción. Cuando se activa esta patilla bien por flanco o por nivel lógico 1, el

microprocesador finaliza la instrucción que estaba ejecutando y salta a una subrutina enganchando en la dirección de memoria 0024H. Al hacer este salto, lleva el contenido del Contador de Programa a la pila, al objeto de que cuando termine la subrutina, mediante una instrucción RET, vuelva a tomar el curso normal de su trabajo al recargar el Contador de Programa con el contenido de la pila. Esta es la interrupción de más alta prioridad.

• Patilla 7 (RST 7.5): Interrupción. Es enmascarable por programa. Para conseguir esto, es necesario que se

haya ejecutado la instrucción EI con posterioridad a DI y a continuación enmascararla (o no),colocando un 0 en el bit adecuado mediante la instrucción SIM. Esta interrupción se activa por flanco y nos permite enganchar en la dirección 003CH.

1 2 3

3

84

37

5

366

35

7

348

33

9

3210

31

11

3

012

29

13

2

814

27

15

2

616

25

17

2

418

23

19

2

220

213940

MICROPROCESADOR 8085

X1

X2

RES

ET O

UT

SO

D

SID

TRA

P R

ST 7

.5 R

ST 6

.5 R

ST 5

.5 I

NTR

INT

A A

D0

AD

1 A

D2

AD

3 A

D4

AD

5 A

D6

A

10 A

D7

A

9 G

ND

A8A11

A12

A13

A

14

A15

Voo HOL

DH

LDA

CLK

OUT

RE

SET

IN

READ

YIO

/M

S1 RD

W

R

ALE

S0

FIG.14A

1.4 DESCRIPCIÓN FÍSICA DEL 8085A.

Page 13: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 13 ___________________________________________

• Patilla 8 (RST 6.5): Se activa por nivel 1 lógico, que debe mantenerse hasta que la petición de interrupción sea atendida. Es enmascarable por programa (Idem a la anterior). Permite enganchar en la dirección 0034H.

• Patilla 9 (RST 5.5): Se activa por nivel 1 lógico, que debe mantenerse hasta que la petición de interrupción sea atendida. Es enmascarable por programa (Idem a la anterior). Permite enganchar en la dirección 002CH.

• Patilla 10 (INTR): Interrupción. Cuando en esta patilla introducimos un 1 lógico, el contador de programa no se incrementa y el 8085 busca una instrucción que entra a la CPU por el bus de datos mediante hardware externo y activa INTA que es la señal de reconocimiento. Se puede entonces presentar el código de operación de una instrucción RST o CALL para realizar el subprograma de tratamiento de la interrupción. La interrupción queda autorizada o prohibida por programa (EI o DI). Queda prohibida a continuación de un RESET o inmediatamente después de una interrupción. Forma un segundo grupo de interrupciones al emplear las instrucciones RST 1,2,3,4,5,6 y 7. INTA es la señal de reconocimiento. Las instrucciones RESTART pueden producir interrupciones por software, pero al activar esta patilla INTR del 8085A, si se introduce por el bus de datos el código de una instrucción RST, la interrupción se produce por hardware.

• Patilla 11 (INTA): Reemplaza a RD en una operación de lectura de instrucción que sea una interrupción. • Patillas 12 a 19 (AD0 a AD7): Conforman el bus de datos/direcciones multiplexado durante la ejecución de

una instrucción. Transporta desde el principio la parte BAJA del bus de direcciones para a continuación transportar los 8 bits de datos. Este bus está en estado de ALTA IMPEDANCIA durante un HOLD o durante un HLT. Es un bus tri-estado.

• Patilla 20 (GND): Masa o tensión de referencia. • Patillas 21 a 28 (A8 a A15): Transporta la parte ALTA del bus de direcciones. Está en estado de ALTA

IMPEDANCIA con un HOLD o un HLT. Es un bus tri-estado. • Patilla 29 (S0): Es una salida que codifica el estado del bus de datos durante el curso del ciclo de máquina

que está en ejecución (junto con S1). • Patilla 30 (ALE): Libera un impulso cada vez que el bus AD0-AD7 presenta la parte baja de una dirección.

Se utiliza para diferenciar entre la parte baja de la dirección y el dato que se presentará a continuación. • Patilla 31 (WR): Indica que el dato presente en el bus de datos debe quedar escrito en la memoria o en la

E/S direccionada. Nivel bajo activo. • Patilla 32 (RD): Indica que el dato presente en el bus de datos debe ser leído de la memoria o de una E/S

direccionada. Nivel bajo activo. • Patilla 33 (S1): Salida que codifica el estado del bus de datos junto con S0. • Patilla 34 (IO/M): Si es un 1 indica que el microprocesador selecciona una E/S en el caso de una

instrucción IN u OUT. Si es 0 selecciona la memoria. • Patilla 35 (READY): Es una entrada que indica que la memoria o E/S seleccionada por un ciclo de

escritura o lectura está dispuesta a recibir o proveer el dato. Si es 0 el 8085 espera a su puesta a 1 antes de seguir su ciclo de lectura o escritura.

• Patilla 36 (RESET IN): Si es activada con un 0, se reinicializa el contador de programa a 0000H, así como la autorización de interrupción.

• Patilla 37 (CLK OUT): Señal de salida de reloj del 8085. También llamada CLK. • Patilla 38 (HLDA): Si es un 1 indica que el microprocesador responde a la demanda de espera (HOLD) y

que el bus y líneas de control están en estado de alta impedancia. • Patilla 39 (HOLD): Indica que algún otro usuario esta solicitando el acceso el bus de direcciones y al bus

de datos. El microprocesador termina la ejecución del ciclo en curso, después posiciona en estado de alta impedancia al bus AD0-AD15 y las líneas de control RD, WR e IO/M, señalando este paso sobre la línea HLDA.

• Patilla 40 (Vcc): Tensión de alimentación de +5V.

Hay que insistir en este momento que aunque la lectura de este apartado resulte un tanto pesada, debe realizarse con la suficiente atención. Es preciso darse cuenta que cuando se pretenda desarrollar un diseño de tarjeta basada en este microprocesador, deberemos conocer la función de todas y cada una de las patillas de dicho componente. Al mismo tiempo este estudio nos llevará a un conocimiento mucho más profundo del 8085.

Page 14: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

loetr

q ••

••

yadeh

c •

.

1.5 DESCRIPCIÓN FUNCIONAL DEL 8085A

______________________________________ 14 ___________________________________________

Del mismo modo que hasta ahora hemos descrito con detalle todos los terminales del microprocesador,

cual nos permitirá abordar en cierta medida el diseño de un sistema electrónico, ahora llevaremos a cabo un studio básico del funcionamiento interno del microprocesador, que nos permitirá posteriormente iniciar abajos de programación.

Para realizar esta tarea nos apoyaremos en el diagrama de bloques representado en la FIG.15A, en la

ue podemos apreciar los siguientes elementos característicos:

El conjunto decodificador/secuenciador que lleva incluido el generador de reloj y el sistema controlador. El conjunto unidad aritmética/lógica y sus registros asociados: acumulador de 8 bits, registro temporal y

registro de los indicadores o señalizadores (flags). El conjunto de los registros de trabajo (B, C, D, E, H y L) de 8 bits, el Contador de Programa (PC)y

Puntero de Pila (SP), ambos de 16 bits. El control de las interrupciones que comanda un grupo de 5 señales de interrupción y genera una señal de

salida que nos marca una interrupción aceptada. El control de las entradas/salidas serie. Los buffers que generan los buses de direcciones y datos.

Todos y cada uno de estos bloques están controlados por la microprogramación interna que interpreta ejecuta las instrucciones recibidas del programa que se esté ejecutando. Y de acuerdo a esas directrices ctuará sobre los datos e informaciones y los moverá a través de registros y bloques para obtener el resultado eseado. Debe decirse que estos procesos de trabajo interno del microprocesador no son accesibles al usuario, s decir, el programador puede indicar la instrucción a ejecutar, pero no puede decirle al microprocesador cómo a de ejecutarla.

Por tanto desde el punto de vista de la persona que deba realizar los programas, es fundamental onocer que el microprocesador dispone de:

Seis registros (B,C,D,E,H y L) que pueden ser usados para almacenar datos temporalmente de 8 bits, o bien pueden emplearse por pares (BC,DE y HL) para retener informaciones de hasta 16 bits.

El “Puntero de Pila” o Stack Pointer (SP) que es un registro de 16 bits y se usa para direccionar por programa la parte de la pila en la que se debe guardar una determinada dirección o en la que se debe salvar un determinado dato. Normalmente debe apuntar a la cima de la pila.

El “Contador de Programa” o Program Counter (PC). Al poner en funcionamiento el sistema arranca de la posición inicial 0000H y se va incrementando secuencialmente a la velocidad marcada por el cristal de cuarzo del sistema. La secuencia del contador de programa puede ser alterada mediante determinadas instrucciones del programa.

El Acumulador, que es un registro de 8 bits, con el que el microprocesador realiza las operaciones lógicas, aritméticas, etc. según el desarrollo del programa.

Page 15: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 15 ___________________________________________

DIAGRAMA DE BLOQUES DEL 8085

CONTROL DE INTERRUPCIONES CONTROL E/S SERIE

BUS DE DATOS INTERNODE 8 BITS

INTRINTA

RST5.5RST6.5

RST7.5TRAP

SID SOD

ACUMULADOR

REGISTROTEMPORAL

FLAGS

ALU

REGISTROINSTRUCCION

REG.B REG.CREG.D REG.E

PUNTERO PILACONT.PROGRA.

REG.H REG.L

INCREM/DECRELATCH DIRECC

DECODIFICAINSTRUCCI.Y SECUENC.CILCLO MAQ.

X1 X2

CONTROL DE RELOJ

BUFFER DIRECCION

A15-A8BUS DIRECCIONES

BUFFER DIREC/DATOS

AD7-AD0BUFFER DIRECC/DATOS

FIG. 15A

CLK

OUT

READ

Y RD

WR

ALE SO IO/M

STATUSCONTROLCLKGEN. DMA RESET

HOL

D

HLD

A

RES

ET IN

RESE

T O

UT

S1

Page 16: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 16 ___________________________________________

• Registro de Estados (FLAGS), tiene 8 bits y nos indica en cada momento cual es el estado del acumulador después de haber realizado la última operación. El formato de este registro es como sigue:

S Z X AC X P X C

siendo: C = Bit de acarreo (CARRY) P = Bit de paridad (PARITY) AC = Bit de acarreo auxiliar (AUX CARRY) Z = Bit cero (ZERO) S = Bit de signo (SIGN) X = Bit indiferente. - CARRY.- En este bit del registro de estados, aparecerá un 1 lógico cuando la última operación

realizada con el acumulador, desborde el contenido del mismo. - PARITY.- En este bit aparecerá un 1 lógico cuando el número de "unos" que hay en el acumulador sea

par. Si es impar aparecerá un 0 lógico. - AUX CARRY.- Aquí aparece un 1 lógico cuando hay acarreo en el cuarto bit del acumulador. Este bit

se usa generalmente para ejecutar instrucciones de "ajuste decimal". - ZERO.- En este bit aparece un 1 lógico cuando el contenido del acumulador es 0000 0000. En caso

contrario aparece un 0 lógico. - SIGN.- Este es el bit del signo que nos indica, cuándo el dato que hay en el acumulador es un número

positivo o negativo.

• Registro de máscara de interrupciones (I). Tiene dos aspectos diferentes según sea leído (mediante una instrucción RIM) o escrito (mediante una instrucción SIM).

Cuando procedemos a una lectura del registro de máscara de interrupciones, mediante la instrucción

RIM, se obtiene el siguiente formato SID I7.5 I6.5 I5.5 IE M7.5 M6.5 M5.5

Siendo el bit SID el dato de entrada serie al microprocesador, los bits I7.5, I6.5 e I5.5 nos indican las

interrupciones pendientes de servicio, el bit IE es el flag de interrupciones habilitadas y finalmente los bits M7.5, M6.5 y M5.5 nos permiten poner los enmascaramientos de las interrupciones. (Ver instrucción RIM del 8085).

Cuando se procede a escribir en el registro de máscara de interrupciones, mediante la instrucción SIM,

el formato a considerar es ahora SOD SOE X R7.5 MSE M7.5 M6.5 M5.5 Siendo en este caso el bit SOD el dato de salida, el bit SOE la autorización de la salida serie, el bit R7.5 nos da la posibilidad de realizar un reset en la interrupción 7.5, el bit MSE autoriza el enmascaramiento de las interrupciones y finalmente los bits M7.5, M6.5 y M5.5 ponen las máscaras de cada interrupción respectivamente. (Ver instrucción SIM del 8085).

• Dos Bloques Buffers que genera el microprocesador, en los que puede apreciarse cómo la parte alta del bus de direcciones se constituye de forma independiente, mientras que la parte baja es compartida con el bus de datos. Así pues es necesario un multiplexado adecuado, mediante el cual los periféricos asociados sepan cuándo se trata de la parte baja de una dirección o de un dato. La señal que identifica este proceso de multiplexado es ALE.

• Un bloque que genera el bus de control del sistema. • Un bloque que permite cinco tipos diferentes de interrupciones. • El conjunto de control de Entrada/Salida serie.

Page 17: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1 2 3

4 5 6 7 8

1.6 EJERCICIOS.

______________________________________ 17 ___________________________________________

. Hablar sobre los distintos niveles o escalas de integración, en la fabricación de los circuitos integrados.

. Enumerar los tipos de buses del microprocesador 8085. Hablar sobre sus características.

. Intentar desarrollar una representación gráfica de la arquitectura estándar de un microprocesador y analizarla.

. Enumerar las líneas de control que tiene disponibles el 8085.

. Hablar sobre las líneas de interrupción del microprocesador 8085, expresando su orden de prioridad.

. Función de la señal RESET IN.

. Explicar de forma concisa, cada uno de los elementos del Registro de Estado.

. Enumerar y comentar los registros de trabajo del microprocesador 8085.

Page 18: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 18 ___________________________________________

SISTEMA BÁSICO PARA EL

MICROPROCESADOR 8085-A

2

Page 19: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

rcc

d

ep

d(taddn

md

inin

ps

dp0inF

lads

.

2. SISTEMA BASICO PARA EL MICROPROCESADOR 8085A

Como hemos podido comprobar hasta el momento, el microprocesador ofrece gran potencialidad en la ealización y desarrollo de funciones y actuaciones de control en general. Sin embargo también habremos onstatado que por sí mismo el microprocesador resulta inoperante, es decir, es preciso acompañarlo de los omponentes necesarios para que pueda llevar a cabo la ejecución práctica de los programas que se diseñen.

Estos componentes asociados son de muy diversas características y todos y cada uno de ellos

esempeñan funciones determinadas y muy concretas. En este tema se verá la estructura de cada uno y se realizará un estudio de componentes concretos, que

mplearemos para ir configurando una tarjeta básica sobre la que posteriormente desarrollaremos diferentes rogramas.

Los componentes asociados que necesitaremos, deberán resolvernos problemas lógicos, de control, de

ireccionamiento, de tratamiento de buses, de almacenamiento de datos, de comunicación de entrada/salida E/S), etc. Esto nos da idea de la gran variedad de componentes que podemos encontrar para llevar a cabo estas reas. Sin embargo aquí se tratarán únicamente los elementos imprescindibles para nuestros propósitos, como ecodificadores, memorias RAM, memorias EPROM, etc. Además, de forma sistemática y paulatina, se irá esarrollando la forma de acoplamiento de todos los elementos, para finalmente llegar a la construcción de uestro sistema básico de trabajo.

.

2.1 TRATAMIENTO DE LOS BUSES

______________________________________ 19 ___________________________________________

Como se ha visto en el tema anterior, una de las principales características que presenta el

icroprocesador 8085 es poseer un bus de datos (de 8 líneas) multiplexado con la parte baja del bus de irecciones.

Este multiplexado quiere decir que en un instante determinado tendremos en las 8 líneas del bus la

formación perteneciente a una dirección y un instante más tarde tendremos en esas mismas líneas la formación perteneciente a un dato.

Corresponde por tanto a la circuitería externa, separar estas señales de modo apropiado, tal que no se

roduzcan interferencias por informaciones erróneas en el resto de los componentes del sistema. De esta forma e obtendrá una separación total entre el bus de datos (8 bits) y el bus de direcciones (16 bits).

Como sabemos el microprocesador 8085 dispone de una línea de “control” o “sincronización”

enominada ALE, por medio de la cual suministra un pulso de tensión de nivel lógico 1 cuando se presenta la arte baja de una dirección en el bus AD0,...,AD7 y cuando aparece un dato la señal ALE pasa al estado lógico . Deberemos por tanto emplear esta señal de control para separar estas informaciones utilizando un circuito tegrado que actúe de cerrojo (latch) y realice la separación física. El esquema de principio responde a la IG.21A.

Mientras ALE está a nivel lógico 1, la información presente en las entradas del cerrojo, procedente de

s líneas AD0,...,AD7 del microprocesador, pasa a las salidas, configurando de este modo la parte baja de las irecciones. En el instante en que ALE pasa a nivel 0, esa información queda almacenada y retenida en las alidas del cerrojo, que no cambiaran su estado mientras ALE no pase a nivel 1. Por tanto ahora puede cambiar

Page 20: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 20 ___________________________________________

la información presente en las líneas AD0,...,AD7 del microprocesador, que nos suministrará el dato oportuno, sin afectar a la parte baja de las direcciones.

Son varios los circuitos que pueden emplearse para este cometido. Uno de los más comúnmente

empleados es el 74LS373 cuya constitución y funcionamiento pueden encontrarse en diversos textos. Nosotros estudiaremos el circuito integrado 8212, fabricado por INTEL y que desarrolla esta función de forma adecuada.

En realidad el 8212 es un puerto de E/S de 8 bits en paralelo. A su salida posee un latch con buffers de

salida en tri-estado. También dispone de una serie de flip-flop que utiliza para atender peticiones de servicio de interrupciones. Con este componente podremos llevar a cabo varias funciones periféricas y de entrada/salida del microprocesador. Se presenta en un encapsulado de 24 patillas que podemos ver representado en la FIG.21B.

A continuación se describirá de forma concisa la función de todas las patillas de este componente:

• DO0,... DO7. Son las 8 líneas de salida de datos que están conectadas a 8 buffers no inversores que pueden ser colocados en estado de alta impedancia.

AD0AD1AD2AD3AD4AD5AD6AD7

D0D1D2D3D4D5D6D7

CER

RO

JO

ALE CONTROL

FIG.21A

8212

DS1MDDI0DO0DI1DO1DI2DO2DI3DO3STBGND

VccINTDI7DO7DI6DO6DI5DO5DI4DO4CLRDS2

123456789101112

242322212019181716151413

FIG.21B

Page 21: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 21 ___________________________________________

• DI0,... DI7. Son las 8 líneas de entradas de datos a los 8 flip-flop internos de tipo D. La salida de estos flip-flop toman los valores de las entradas mientras la señal STB esté a nivel alto. Cuando STB pasa a nivel bajo se produce el enclavamiento. Los datos de salida se borraran mediante la entrada de puesta a cero CLR.

• GND. Terminal de conexión a masa, o tensión de referencia. • Vcc. Terminal de alimentación (+5V). • STB. Es la entrada strobe o impulso de referencia se toma como clock para el latch de datos. • MD. Señal de control del estado del buffer de salida y que determina el origen de los impulsos de clock

que llegan al latch de datos. • DS1 y DS2. Son dos entradas de selección de dispositivo. Con DS1=0 y DS2=1 el componente estará

seleccionado. • CLR. Pone a cero el latch de datos. Nivel bajo activo • INT. Línea de salida para una interrupción. Nivel bajo activo.

Dentro de las posibles aplicaciones o modos de conexión del 8212 pueden mencionarse: su utilización

como controlador para un bus bidireccional empleando para ello dos componentes en oposición; conexión como puerto para entrada de interrupciones; como puerto de salida; como latch para separar las direcciones de orden bajo con el microprocesador 8085 (será la forma en que nosotros lo conectaremos), etc. Si deseamos obtener información adicional de este componente, como pueden ser sus diagramas de tiempos, características de conmutación, etc., debemos acudir a las hojas de características técnicas suministradas por los fabricantes.

La conexión de este circuito integrado con el microprocesador 8085, se realiza de forma muy simple,

según se muestra en la FIG.21C. Como podemos apreciar los pasos a seguir son:

• Conectar directamente a +5V los terminales Vcc, DS2 y CLR. • Conectar a masa los terminales GND, MD y DS1. • Llevar la patilla STB directamente a la salida ALE del microprocesador. • Unir las líneas DI0, DI1, DI2, ..., DI7, a las líneas del microprocesador AD0, AD1, AD2, ..., AD7,

respectivamente.

Realizada la conexión de este modo, cuando el microprocesador inicie su funcionamiento normal, tendremos en las salidas del 8212, la parte baja del bus de direcciones, correspondiendo las salidas DO0, DO1, DO2, ..., DO7 con las líneas de direcciones A0, A1, A2, ..., A7 respectivamente.

8212

GND

MD

DS1

ALESTB

Vcc

DS2

CLR

+5V

FIG.21C

8085 BU

S D I

REC

CIO

NES

BUS DATOS

AD0 DI0 DO0 A0AD1 DI1 DO1 A1AD2 DI2 DO2 A2AD3 DI3 D03 A3AD4 DI4 DO4 A4AD5 DI5 DO5 A5AD6 DI6 DO6 A6AD7 DI7 DO7 A7

INT

Page 22: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

mcmea

n“s

d ••

o

dec

EtrF

.

2.2 DECODIFICACIÓN DE DIRECCIONES

______________________________________ 22 ___________________________________________

Debemos entender que la mayoría de los componentes que se emplean en los diseños con icroprocesadores, necesitan ser conectados a los buses de datos y direcciones, por tanto deben poseer la

aracterística de permitir dejar en estado de alta impedancia las líneas que se conecten a dichos buses. De este odo podremos conectar varios componentes al mismo conjunto de líneas sin que se produzcan interferencias

ntre ellos, ya que solamente permanecerá activo aquel que sea “seleccionado”, quedando el resto en estado de lta impedancia (tri-estado).

Por tanto los componentes sobre los que debe actuar el microprocesador, además de las líneas

ecesarias para conectarse a los buses, deben poseer algún terminal que permita al microprocesador habilitarlo” para trabajar con él o por el contrario, dejarlo fuera de servicio. Este terminal será el que realiza la elección del componente.

Por otro lado sabemos que el bus de direcciones sirve para seleccionar algún registro (o alguna

irección) determinado en un componente, por tanto tendremos dos tipos de selecciones simultáneas:

Se debe seleccionar el componente que contiene la dirección o registro al que necesitamos acceder. Hay que indicar el registro o la dirección que deseamos dentro del componente.

Para llevar a cabo estos procesos emplearemos el “direccionamiento por decodificación”, aunque hay tros métodos posibles.

Las líneas de dirección más bajas, son las que normalmente se emplean para apuntar a un registro

eterminado o a una dirección dada y las líneas de dirección más altas (A15, A14, A13, ...) se llevan a las ntradas de un circuito integrado “decodificador” que será el que con una de sus salidas, seleccione el omponente que deseamos.

Existen varios decodificadores que pueden ser empleados para este trabajo y que son de uso corriente.

n nuestro caso será utilizado el 74LS138. Se trata de un conocido decodificador de 3 a 8 líneas de lógica ansistor-transistor que se presenta en un encapsulado de 16 patillas cuya distribución puede apreciarse en la IG.22A.

La función de cada una de sus líneas se describe a continuación:

• A0, A1 y A2 son las señales de entrada en código binario. • O0,..., O7 son las líneas de salida con nivel bajo activo. • GND es el terminal de masa o tensión de referencia. • Vcc es la patilla de alimentación (+5V). • E3 es una señal de habilitación activa a nivel alto. • E1 y E2 son señales de habilitación activas a nivel bajo.

A0A1A2E1E2E3O7GND

VccO0O1O2O3O4O5O6

FIG.22A

74L

S138

12345678

16151413121110 9

Page 23: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 23 ___________________________________________

A continuación se muestra la tabla de la verdad, a través de cuya observación y análisis puede apreciarse perfectamente la forma de actuar del decodificador. A2 A1 A0 O0 O1 O2 O3 O4 O5 O6 O7 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1

1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1

1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 En la FIG.22B puede apreciarse el modo en que se puede conectar el decodificador al microprocesador 8085. Como vemos se emplean la línea de dirección más alta (A15) para atacar la entrada de control E3, mientras que las entradas de datos binarias del decodificador (A0, A1, A2) son manejadas por las direcciones A12, A13 y A14 del microprocesador. De esta forma puede utilizarse la línea de dirección A15 también para seleccionar una memoria EPROM, puesto que al comenzar su ejecución el microprocesador arranca en la dirección 0000H en su contador de programa, por lo que tendremos un 0 en la línea A15 con la que podemos seleccionar una EPROM al tiempo que bloqueamos el 74LS138. Las otras dos líneas de control E1 y E2 se colocan a nivel bajo para dejar activo el decodificador. De todas formas es posible dar otra función a estas líneas de control en el diseño global del sistema. Las líneas de salida O0, O1, O2, ..., O7 del decodificador quedarán disponibles para seleccionar los componentes deseados. En cada una de ellas, se colocará una resistencia a +5V para asegurar el nivel lógico 1, en las salidas no activas.

74L

S138

FIG.22B

8085

4K7

+5V

Vcc

GND

E1 E2

A15 E3A14 A2A13 A1A12 A0

O7 CS7O6 CS6O5 CS5O4 CS4O3 CS3O2 CS2O1 CS1O0 CS0

Page 24: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

eg

cpte

e(p

a

b

.

2.3 LA MEMORIA

______________________________________ 24 ___________________________________________

Para un sistema electrónico diseñado sobre la base de un microprocesador determinado, la memoria es

l lugar externo donde se almacenan los programas y los datos, tanto los iniciales como los que se van enerando a medida que se ejecuta el programa.

Las memorias deberán disponer de un bus de datos (generalmente de 8 bits), un bus de direcciones

uyo número de bits depende de la capacidad de almacenaje y de los terminales de control adecuados que ermitan un correcto funcionamiento del dispositivo, así como un fácil acceso y la posibilidad de situar los rminales del bus de datos en estado de alta impedancia.

Dentro de las características más destacables de una memoria y esenciales para su valoración se

ncuentran los “tiempos de escritura y lectura”, el “tiempo de acceso”, los “tiempos de ciclo”, la “capacidad” número de bits que pueden almacenarse en la memoria), etc. Todos estos datos, junto a otra serie de arámetros típicos pueden encontrarse en las hojas de especificaciones técnicas que suministran los fabricantes.

Para trabajar con un microprocesador, se dispone básicamente de dos tipos de memorias:

. Las memorias “pasivas”, de solo lectura, que generalmente se emplean para almacenar las instrucciones que configuran el programa y los datos necesarios permanentes.

. Las memorias “activas”, de lectura y escritura, de las que se puede leer y en las que se puede escribir la información deseada. Lo normal es almacenar en ellas los datos y valores que se van generando durante la ejecución del programa, la información que contienen es volátil, es decir puede perderse por un fallo en la alimentación.

A continuación veremos un resumen de las distintas memorias de cada tipo:

Memoria RAM dinámica: Este tipo de memoria RAM se caracteriza por almacenar los bits que representan la información, en forma de cargas eléctricas, aprovechando la capacidad generada en un transistor MOS que constituye la “celda” elemental de información. Sin embargo esta carga así almacenada, se va perdiendo con el tiempo, llegando a desaparecer al cabo de unos ms, debido a fugas eléctricas. Es por tanto imprescindible con este tipo de memorias emplear “circuitos de refresco” cuya misión es leer la información que contiene la memoria y volver a guardarla exactamente igual a intervalos de tiempo próximos a 1 o 2 ms. Hay microprocesadores que incluyen un sistema de refresco para trabajar con este tipo de memorias, en caso contrario sería preciso diseñar uno. Las RAM dinámicas poseen gran capacidad de memoria y son muy económicas, suelen emplearse en sistemas que requieren mucha memoria.

Memoria RAM estática: Es la memoria que emplearemos nosotros en nuestro sistema. Esta constituida a partir de elementos flip-flop que configuran las celdillas de información, es decir, cada celdilla o flip-flop representa un bit. Su contenido permanece estable (a diferencia de las dinámicas) hasta que eliminemos la tensión de alimentación, momento en que perdemos toda la información almacenada. Si deseamos retener la información de la RAM, no tendremos más alternativa, que diseñar un sistema de alimentación auxiliar (con baterías por ejemplo) que sustituya a la tensión principal cuando desaparezca.

Existen RAM estáticas de diferente ancho de palabra, en nuestro caso solo trataremos la RAM de 8 bits.

Disponemos en el mercado de una amplia variedad de componentes RAM entre los que es posible

elegir para diseñar un sistema. Nosotros vamos a emplear la memoria RAM 6116, que se presenta en un encapsulado de 24 patillas y podemos ver representada en la FIG.23A. Se trata de una memoria fabricada con tecnología "CMOS" de bajo consumo con una capacidad de 16384 bits, es decir, 2 Kbytes para lectura/escritura.

Page 25: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 25 ___________________________________________

La descripción de los distintos terminales es la siguiente: - Patillas A0,... A10. Son el bus de direcciones. - Patillas D0,... D7. Constituyen el bus de datos. - Patilla GND. Es el terminal de masa o tensión de referencia. - Patilla Vcc. Es el terminal de alimentación (+5V). - Patilla CS. Entrada de selección de componente. - Patilla OE. Entrada de lectura. - Patilla WE. Entrada de escritura.

(Recuerde que las señales marcadas en negrita tienen nivel activo BAJO).

Para llevar a cabo la interconexión entre esta memoria y el microprocesador, debemos fijarnos en el

esquema de la FIG.23B. Como podemos apreciar, las conexiones a realizar son las siguientes: - Las líneas de dirección A0, A1, A2, ..., A7 son conectadas a las salidas DO0, DO1, DO2, ..., DO7

del 8212. - Las líneas de dirección A8, A9 y A10, se conectan a las líneas correspondientes A8, A9 y A10 del

bus de direcciones del microprocesador. - Los terminales D0, D1, D2, ..., D7 de la memoria RAM se conectan a las líneas AD0, AD1, AD2,

..., AD7 del bus de datos del microprocesador, respectivamente. - El terminal GND será conectado a masa, mientras que Vcc se lleva a la alimentación de +5V. - La línea CS, de selección de chip, es conectada a una de las salidas del decodificador de

direcciones 74LS138. - El terminal WE se conecta a la señal WR del microprocesador. - La patilla OE se conecta a la salida RD del microprocesador.

RA

M 6

116

A7A6A5A4A3A2A1A0D0D1D2GND

VccA8A9WEOEA10CSD7D6D5D4D3

123456789101112

242322212019181716151413

FIG.23A

Page 26: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 26 ___________________________________________

• Memoria ROM: Se trata de una memoria de solo lectura y se emplea para almacenar los programas, dado que su contenido no se pierde aún en ausencia de la tensión de alimentación. Este tipo de memoria debe ser grabada por el fabricante, mientras que el usuario no tiene la posibilidad de variar su contenido. Solo se emplean cuando se requiere un gran volumen de producción y no es preciso introducir modificaciones en los programas.

• Memoria PROM: Tiene características similares a la anterior, con una distribución de terminales idéntica,

por lo que pueden reemplazarlas. Las PROM se compran “vacías” o “limpias”, es decir, sin información alguna y es el usuario quien mediante un “programador” adecuado, les carga el programa. Las celdillas de información poseen dispositivos “fusibles” que según permanezcan intactos o fundidos, representarán los dos posibles estados de información (1 ó 0). Por supuesto, una vez almacenado el programa en la PROM, no podremos modificar su contenido.

• Memoria EPROM: Se trata de una memoria de solo lectura, que también puede ser programada por el

usuario con el dispositivo programador adecuado. Sin embargo las EPROM tienen la particularidad de disponer de una ventana de cuarzo que permite el paso de los rayos de luz hasta la cápsula que contiene la memoria en sí. Si hacemos incidir radiaciones ultravioletas sobre dicha ventana conseguimos eliminar la información existente en la memoria, quedando la EPROM dispuesta para ser grabada de nuevo. Este

8212

74LS138

CS

+5V

Vcc

GND

RAM

611

6

FIG.23B

AD7 A7 D7AD6 A6 D6AD5 A5 D5AD4 A4 D4AD3 A3 D3AD2 A2 D2AD1 A1 D1AD0 A0 D0

WR WERD OE

A10 A9 A8

A15 E3 O7A14 A2 O6A13 A1 O5A12 A0 O4A11 O3A10 O2A9 O1A8 O0

8085

Page 27: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 27 ___________________________________________

proceso puede repetirse en muchas ocasiones. Son más caras que las anteriores y sus terminales no son totalmente compatibles.

Nosotros emplearemos la EPROM 27256, que posee una capacidad de 32 Kbytes de memoria, es

decir, 262144 bits. Su distribución de patillas puede verse en la FIG.23C. A continuación se describe la función de sus terminales: - Patillas A0,... A14. Representan el bus de direcciones. - Patillas D0,... D7. Representan el bus de datos. - Patilla GND. Representa la tensión de referencia o masa. - Patilla Vcc. Tensión de alimentación. - Patilla Vpp. Entrada de programación. - Patilla CS. Terminal de selección de chip. - Patilla OE. Terminal que habilita las salidas.

Para llevar a cabo la interconexión entre esta EPROM y el microprocesador, no tendremos más que

conectar de forma adecuada las líneas correspondientes de los buses de datos y direcciones, según se muestra en la FIG.23D. Hay que destacar que al disponer esta memoria de 15 líneas de direcciones, emplearemos las líneas A0,... A14 del microprocesador para direccionar todas las posiciones disponibles de la EPROM, efectuando la selección de chip con la línea de direcciones A15 de forma directa y empleándola al mismo tiempo para bloquear el decodificador 74LS138. También debemos conectar la señal RD del microprocesador a la entrada OE de la memoria para efectuar la lectura de datos.

El terminal Vpp (de entrada de programación) debemos conectarlo a +5V, durante su estado de funcionamiento normal.

Si deseamos añadir más memorias EPROM, podremos situarlas en las direcciones que deseemos

dentro del “mapa de memoria” disponible, aunque lo normal es situar las EPROM en bancos consecutivos.

EPR

OM

272

56

VppA12A7A6A5A4A3A2A1A0D0D1D2GND

VccA14A13A8A9A11CSA10OED7D6D5D4D3

1234567891011121314

2827262524232221201918171615

FIG.23C

Page 28: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 28 ___________________________________________

• Otras memorias: El desarrollo de las tecnologías de fabricación y los continuos avances en la investigación, hacen que el campo de las memorias esté evolucionando constantemente, consiguiéndose componentes con mayores capacidades de almacenamiento, velocidades de acceso mayores y costes más reducidos. Al mismo tiempo se trabaja sobre otros tipos de memorias intentando mejorar determinadas características. Podemos mencionar:

- Las memorias EAROM, que almacenan la información de forma permanente, pero pueden ser

leídas y escritas electrónicamente (aunque los tiempos de escritura son muy superiores a los de lectura).

- Las memorias de “burbujas” que se caracterizan por poseer una densidad elevadísima de almacenamiento aunque son lentas y caras.

- Las memorias PLA o de matriz lógica programable. Se emplean para decodificar o codificar señales lógicas.

821 2

RD

+5V

Vcc

GND

EPRO

M 2

7256

FIG.23D

A15Vpp

8085

A15A14A13A12A11A10A9A8

OE

A14A13A12A11A10A9A8

AD7 A7 D7AD6 A6 D6AD5 A5 D5AD4 A4 D4AD3 A3 D3AD2 A2 D2AD1 A1 D1AD0 A0 D0

Page 29: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

p

r

in

dC

Fr

r

F+rs

cr

3cc(ti

5mmdtr

.

2.4 DISEÑO DEL SISTEMA BÁSICO

______________________________________ 29 ___________________________________________

Apoyándonos ahora en todo lo visto hasta el momento, podemos realizar nuestro diseño de sistema, ara llevar a cabo operaciones básicas con el microprocesador 8085.

Esta tarjeta que estará constituida esencialmente por los componentes mencionados con anterioridad,

esponde al esquema de la FIG.24A. En ella podemos ver cómo la conexión de la memoria EPROM se realiza del mismo modo que se ha

dicado en el apartado anterior (ver FIG.23D). El banco de memorias RAM estará constituido en este caso por tres unidades 6116, con idéntico modo

e conexión en todas sus líneas a excepción de las líneas de selección de chip, que en este caso serán las CS0, S1, y CS2 procedentes del decodificador 74LS138.

En lo que se refiere a la conexión del 8212, vemos que nada varía respecto a lo expuesto en la

IG.21C, únicamente mencionar la colocación de una resistencia de 4K7 a +5V en la señal ALE al objeto de eafirmar los niveles de tensión en esta salida del microprocesador.

Este mismo sistema se emplea en la parte alta del bus de direcciones en el que se sitúa un bloque de 8

esistencias de 10k cada una conectadas a +5V. El decodificador de direcciones 74LS138, sigue el mismo esquema de conexión que el mostrado en la

IG.22B. Ahora además se refuerzan las salidas del mismo colocando un bloque de 8 resistencias de 4K7 a 5V. Puede verse como en este caso las salidas CS0, CS1, y CS2, tomadas de las patillas 15, 14 y 13 espectivamente se emplean para direccionar las tres pastillas de memorias RAM que hemos colocado en el istema.

Puede verse con claridad cómo el microprocesador se sirve de un cristal de cuarzo de 4 MHz y un

ondensador de 18 pF, que colocados entre las patillas 1 y 2 generan la oscilación que produce la frecuencia de eloj a la que funcionará el sistema. Es decir, se genera la “frecuencia de trabajo”.

Destacamos además el circuito situado en la señal de entrada RESET IN del microprocesador (patilla

6) formado por una resistencia de 1K en paralelo con un diodo y un condensador electrolítico de 1 uF. Este ircuito es el que asegura un arranque correcto del sistema en el momento de conexión a red iniciándose el ontador de programa en la dirección 0000H, después de que la patilla 36 haya alcanzado el nivel lógico 1 ALTO). Este circuito produce un retardo en el arranque que viene dado aproximadamente por la constante de empo RC.

En la parte izquierda de la FIG.24A puede verse que las señales INTR, TRAP, RST 7.5, RST 6.5, RST

.5 y HOLD son conectadas directamente a masa para conseguir un correcto funcionamiento del sistema ientras no vayamos a emplearlas. Estas conexiones deben realizarse individualmente para cada señal y ediante puentes fácilmente eliminables de modo que si en un momento dado, para una determinada aplicación

eseamos emplear alguna de ellas, podamos hacerlo sin más que eliminar el puente a masa correspondiente y atando dicha entrada del modo adecuado.

Page 30: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 30 ___________________________________________

FIG. 24A

4 MHZ 1

18pF 2

IO/M 34 S1 33

S0 29 INTA 11

SID 5 SOD 4

HLDA 38

TRAP 6

RST 6.5 8 RST 7.5 7

RST 5.5 9

12 AD0 DI0 3 4 A0 D1 1213 AD1 DI1 5 6 A1 D2 1314 AD2 DI2 7 8 A2 D3 1515 AD3 DI3 9 10 A3 D4 1616 AD4 DI4 16 15 A4 D5 1717 AD5 DI5 18 17 A5 D6 1818 AD6 DI6 20 19 A6 D7 1919 AD7 DI7 22 21 A730 ALE STB 11

8

085

4K7

8x10

K

21 A8 A8 22 A9 A9

23 A10 A10 24 A11 A11

25 A12 A12 A12 1 1226 A13 A13 A13 2 13 CS227 A14 A14 A14 3 14 CS128 A15 A15 A15 6 15 CS0

+5V

8x4K

7

1110 9 7

4 5

74

LS13

8

RD 2028 1

+5V100nF

27 A1426 A13 2 A1223 A1121 A1024 A925 A8 3 A7 4 A6 5 A5 6 A4 7 A3 8 A2 9 A1

10 A022 A15

14

D0 11

2725

6

D7 17 19 A10 D6 16 22 A9 D5 15 23 A8 D4 14 1 A7 D3 13 2 A6 D2 11 3 A5 D1 10 4 A4 D0 9 5 A3

6 A2 7 A1 8 A0

WR 21RD 20CS 18

12 24

6

116-

1

D7 17 19 A10 D6 16 22 A9 D5 15 23 A8 D4 14 1 A7 D3 13 2 A6 D2 11 3 A5 D1 10 4 A4 D0 9 5 A3

7 A1 8 A0

WR 21RD 20CS 18

12 24

6

116-

2

D7 17 19 A10 D6 16 22 A9 D5 15 23 A8 D4 14 1 A7 D3 13 2 A6 D2 11 3 A5 D1 10 4 A4 D0 9 5 A3

7 A1 8 A0

WR 21RD 20CS 18

12 24

6

116-

3

A2 A2

CS0

CS1

CS2

+5V +5V +5V

A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0

CON1

D7D6D5D4D3D2D1D0

8212

24 1314

12 2 1

16

8+5V

100nF

100nF

CON2

100nF 100nF 100nF

+5V1K

DS41481uF16V

RESET IN36

20

40

INTR 10

HOLD 39CLK OUT 37

RESET OUT 3

READY 35

WR 31 RD 32

+5V 4K7

CON

3

CON3

CS3CS4CS5CS6CS7

ALE

BUS DE DATOS

BUS DE DIRECCIONES

MASA+5V

CON4

CON3

Page 31: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 31 ___________________________________________

Además deben colocarse distribuidos sobre la tarjeta condensadores de desacoplo. Lo más usual es

situar uno por cada circuito integrado y deberán ir soldados mediante conexiones cortas y a ser posible directamente sobre las patillas de alimentación de los circuitos integrados. Este es un medio eficaz y sencillo para impedir la creación de señales parásitas de alta frecuencia que son derivadas a masa a través del condensador. Normalmente estos condensadores son de 100 nF.

Puede apreciarse también cómo la tarjeta dispone, para su conexión a otros circuitos, de cuatro

conectores: • CON1: Constituido por 16 líneas en las cuales podemos encontrar el bus de direcciones completo (A0, A1,

A2, ..., A15). • CON2: Constituido por 8 líneas en las que podemos encontrar el bus de datos completo (D0, D1, ..., D7). • CON3: Constituido por un total de 24 líneas entre las que encontramos el bus de control, el bloque

completo de señales de interrupción (que podremos utilizar desde el exterior eliminando previamente los puentes a masa) y las señales de selección de chip que se toman del decodificador 74LS138.

• CON4: Constituido por nueve líneas divididas en dos grupos que sirven para suministrar la alimentación a la tarjeta (+5V y MASA).

Realizadas todas estas consideraciones, no queda más que analizar con detenimiento, las direcciones

de memoria que ocupa cada uno de los componentes que integran esta tarjeta y las direcciones que quedan disponibles para futuras ampliaciones.

Como puede deducirse de la FIG.24A y apoyándonos en los valores que adquieren las entradas A0,

A1, A2 y E3 del decodificador, se tendrá la siguiente distribución de direcciones: EPROM 27256 Desde 0000H hasta 7FFFH RAM 6116-1 Desde 8000H hasta 87FFH RAM 6116-2 Desde 9000H hasta 97FFH RAM 6116-3 Desde A000h hasta A7FFH Al mismo tiempo, los terminales del decodificador 74LS138 que quedan libres para añadir nuevos

elementos al sistema, responderán a las siguientes direcciones: CS3 B000H CS4 C000H CS5 D000H CS6 E000H CS7 F000H

Page 32: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1

2

3

4 5 6

7

8

2.5 EJERCICIOS.

______________________________________ 32 ___________________________________________

. Explicar el proceso mediante el cual, el 8212 separa la parte baja del bus de direcciones, del bus de datos. Estudiar cómo podría realizarse este proceso mediante el circuito integrado 74LS373 buscando la información técnica oportuna.

. Estudiar la posible conexión al sistema, de una memoria RAM de doble capacidad que la 6116. Realizar un esquema de conexión e indicar el mapa de memoria.

. Estudiar la conexión al sistema de una EPROM de 4K, en lugar de la EPROM de 32K que hemos empleado en la FIG.23D.

. Explicar el funcionamiento de las memorias RAM. Comparar una RAM estática con una RAM dinámica.

. Funcionamiento de las memorias EPROM.

. Buscar, entre la literatura técnica disponible, la configuración y disposición de terminales, del mayor número posible de memorias RAM y EPROM, indicando la capacidad de cada una de ellas y sus características de funcionamiento.

. Explicar la función del circuito RC, situado según se muestra en la FIG.24A, en la patilla 36 del microprocesador 8085.

. Analizar el sistema diseñado en la FIG.24A, especificando la distribución de direcciones de acceso a cada elemento y las direcciones disponibles para ampliaciones.

Page 33: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 33 ___________________________________________

LA FUENTE DE ALIMENTACIÓN

3

Page 34: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

b

d

a

teaa+

imda2

aq

ppc

3. LA FUENTE DE ALIMENTACIÓN.

Para construir un sistema basado en microprocesador, la fuente de alimentación constituye un pilar ásico en el que debemos apoyarnos para obtener un funcionamiento correcto y estable.

Existen en el mercado multitud de diseños de fuentes, cada una de ellas con unas características

eterminadas y unas propiedades muy concretas que las hacen más aptas para unas aplicaciones que para otras. No es nuestro interés profundizar ahora en el estudio de una fuente compleja, sino que nos limitaremos

presentar una fuente sencilla pero suficiente para atender todas nuestras necesidades. Como hemos visto hasta el momento, todos los componentes utilizados por nosotros emplean una

nsión única de +5V por lo que en principio sería suficiente con un diseño que nos proporcionara dicha tensión compañada de un suministro de corriente adecuado. Sin embargo, en previsión de posibles ampliaciones y nte la posibilidad de necesitar otras tensiones estandarizadas, dotaremos a nuestra fuente con las tensiones de 12V y –12V, que también suelen ser empleadas frecuentemente.

.

3.1 EL FILTRO DE ENTRADA

______________________________________ 34 ___________________________________________

La entrada de la fuente de alimentación, es decir, su conexión a red (220 V c.a.), será efectuada prescindiblemente mediante un cable de conexión con tres terminales (dos terminales activos y un terminal

e toma de tierra). La tensión de red así tomada será llevada a un doble interruptor que abra las dos líneas ctivas con suficiente poder de corte. Entre la toma de tensión de red y el interruptor se situará un fusible de A, (la potencia consumida por nuestro sistema será baja) que servirá como protección general.

A continuación se colocará un filtro de entrada de red que servirá para proteger al equipo que vayamos

alimentar de los posibles parásitos de red, pues supondrá una barrera para determinadas interferencias de red ue pueden resultar muy nocivas para un correcto funcionamiento de los sistemas con microprocesador.

Se añadirá además una VDR para eliminar o suavizar picos en la conexión a red del sistema. La tensión así obtenida se acopla al primario de un transformador que suministre la potencia necesaria

ara nuestro sistema. Normalmente en el primario del transformador se dispone de un conmutador que roporciona la posibilidad de conectar la tensión de entrada a varios puntos del primario de modo que pueda ser onectada a tensiones de 240 V, 220 V, 210 V y 125 V de c.a.

FIG.31A

2A

RED

(220

V)

I1

Cx Cy

Cy VDR

220240

210125 0

9

0

14

14

L

LL = 0’8 MhCx = 0’015 uFCy = 2200 pF

Page 35: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 35 ___________________________________________

Todo lo mencionado puede verse en la FIG.31A, en la que se muestra la constitución interna del filtro de red (dos bobinas y tres condensadores cuyos valores se especifican en la mencionada figura).

El secundario del transformador estará constituido por dos devanados independientes. En el primero se

obtendrán 9 V de c.a. y el segundo será un devanado simétrico que suministrará 14 V c.a. en cada parte del mismo.

La rectificación de una señal alterna consiste básicamente en la conversión de la misma en una señal unidireccional. Por tanto, para realizar este proceso, debemos encontrar un elemento que no oponga ninguna resistencia al paso de la corriente en un sentido y oponga una resistencia infinita en el sentido contrario.

Entre los distintos componentes que pueden realizar este proceso destacan los rectificadores a

semiconductores, es decir, los construidos basándose en diodos (uniones PN) semiconductores. Los rectificadores más sencillos construidos con diodos son:

1. Rectificador de media onda: Constituido por un solo diodo, rectifica una sola semionda de la tensión

alterna de entrada. Por tanto la corriente que circula por la carga, será una onda pulsante constituida por medio ciclo de la señal de entrada. Tiene un rendimiento muy bajo, próximo al 40% y su uso está muy limitado.

2. Rectificador de doble onda: Emplea dos diodos conectados en el secundario de un transformador con toma

intermedia, como puede apreciarse en la FIG.32A. En este caso se consigue rectificar las dos semiondas (positiva y negativa) de la señal del secundario, obteniendo así, en la salida, una tensión pulsante unidireccional de doble frecuencia que la señal de entrada. Tiene un rendimiento próximo al 80% y se obtiene un menor factor de rizado (r=0’48). Presenta el inconveniente de necesitar un transformador con toma intermedia en el secundario. Además en este circuito los diodos deben soportar una tensión inversa máxima doble de la máxima tensión del secundario del transformador.

3. Rectificador en puente: Está constituido por cuatro diodos montados en el secundario del transformador

según se muestra en la FIG.32B. Se consiguen rectificar las dos semiondas de la señal de alterna y en cada instante tendremos trabajando dos diodos en serie. La tensión máxima inversa que deben soportar los diodos será igual a la máxima tensión de la señal del secundario. Ahora no necesitamos emplear un transformador con toma intermedia. Este rectificador es el que emplearemos en el diseño de nuestra fuente y su símbolo es el de la FIG.32C. Normalmente vienen montados en un bloque rectificador con dos terminales de entrada y dos terminales de salida perfectamente marcados.

D1

D2

T1

R

FIG.32A

RED

(220

) 0

14

14

3.2 LOS RECTIFICADORES.

Page 36: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

Para encontrar el rectificador apropiado debemos considerar los siguientes puntos: • Tiene que soportar el valor nominal de la corriente que deseemos suministrar a la carga. • Como los diodos que trabajan en sentido directo tienen un bajo valor óhmico y en este caso habrá dos

diodos en serie conduciendo, consideraremos una caída de tensión interna próxima a los 2 V y además deberán soportar la potencia disipada en su interior.

• Tendrán que soportar la sobrecarga de corriente que se produce cuando se conecta la fuente a red estando los condensadores descargados. En ese instante las resistencias del circuito que limitan la intensidad son la del secundario del transformador y las de los propios diodos, por lo que se produce un brusco pico de corriente de muy corta duración (puede alcanzar hasta los 10 A).

• Los diodos deberán soportar las tensiones inversas a que serán sometidos cuando están en estado de bloqueo o polarización inversa. Además es posible que debido a interferencias exteriores se presenten picos de tensión elevados (hasta 40 V). Por tanto será necesario emplear puentes rectificadores que soporten tensiones inversas iguales o superiores a 50 V (para nuestro caso). Hay que tener en cuenta que las tensiones inversas pueden dañar los diodos de forma inmediata e irrecuperable.

• Además debemos considerar que los semiconductores, a medida que se eleva la temperatura, debido entre otras causas, a su propio funcionamiento, corren un mayor riego de dañarse, por lo que es conveniente y en ocasiones imprescindible, dotar al puente de un elemento refrigerador, construido a base de aletas de aluminio que irradien al medio ambiente gran parte del calor generado en el interior del puente rectificador.

dEp

d

pue

D1D2

D3D4

RED

(220

)

T1

R

FIG.32B FIG.32C

PR1

3.3 LOS FILTROS DE CONTINUA.

______________________________________ 36 ___________________________________________

La señal pulsante procedente del rectificador no es aún apropiada para llegar a obtener una eterminada tensión fija. Se precisa para ello, conseguir una tensión con un factor de rizado mucho más bajo. s decir, tenemos que alisar la señal de tensión. Esto se logra empleando los filtros eléctricos constituidos a artir de elementos predominantemente reactivos (bobinas y condensadores).

Los filtros más empleados son:

Filtro por condensador: Consiste en colocar un condensador electrolítico a la salida del rectificador, el modo mostrado en la FIG.33A.

El condensador almacena energía mientras los diodos permanecen en estado de conducción y

osteriormente la cede a la carga en los momentos de bloqueo en el puente rectificador. Este filtro proporciona na tensión elevada a la salida (próxima a la de pico en la señal rectificada) y una componente de alterna baja, s decir, un bajo factor de rizado que en este caso responde a una ecuación de la forma

r=0’91/(wCR)

Page 37: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 37 ___________________________________________

siendo:

• R, la resistencia de carga. • w, la pulsación de la señal de entrada. • C, la capacidad del condensador. Vemos por tanto, que r es inversamente proporcional a la capacidad del condensador, por lo que para

obtener un r pequeño, se empleará un condensador de capacidad elevada.

Filtro en L: Está constituido por el par de elementos bobina-condensador, conectados como se muestra en la FIG.33B.

El funcionamiento de este circuito se basa en el hecho de que la bobina se comporta como un cortocircuito ante la componente continua de la corriente, mientras que opone una elevada impedancia a los armónicos de la señal rectificada. Por el contrario, el condensador actúa ante los armónicos que llegan a él como un camino de baja impedancia derivándolos a masa, mientras que se comporta como un circuito abierto para la componente de continua. Todo esto produce que en la carga del filtro se obtenga una señal con menor rizado.

El condensador debe ser de elevada capacidad y en general el filtro será dimensionado de modo que se cumpla:

XL>>R>>XC Para este filtro tendremos un factor de rizado que viene dado por: r=0’12/(w2LC)

C R

PR1

FIG.33A

R

PR1

FIG.33B

L

C

Page 38: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

Además, para que tengamos circulación de corriente por los diodos del rectificador siempre, debe cumplirse que: L > R/(3w) Filtro en PI: Está constituido por dos condensadores C1 y C2 y una inductancia L, según se muestra en la FIG.33C. Proporciona mayor nivel de tensión continua en la carga. El factor de rizado mejora, obteniéndose en este caso: r = 0’107/(w2C1C2LR)

Vistos de modo casi esquemático los tipos de filtros que podemos emplear en la construcción de la

fuente, no nos queda más que elegir aquel que realmente nos interese. Para ello debemos tener presente además la tensión de funcionamiento a que se verán sometidos los condensadores de modo que su tensión nominal sea superior a la de funcionamiento. Los condensadores electrolíticos disponibles comercialmente tienen elevadas tolerancias respecto a sus características nominales, llegando a variaciones hasta del 40%.

ea

o • • •

meq

R

PR1

FIG.33C

C1 C2

L

3.4 EL REGULADOR DE TENSIÓN.

______________________________________ 38 ___________________________________________

El regulador de tensión tiene como misión fundamental transformar una tensión de c.c. aplicada a la ntrada, en una tensión de c.c. a la salida que esté estabilizada a un valor determinado, que se mantendrá unque la entrada experimente variaciones de tensión o existan variaciones en el consumo de la carga.

Básicamente un regulador está compuesto por una serie de bloques con funciones distintas cuyo

bjetivo final es la obtención de la tensión estabilizada. Estos bloques son:

Un elemento de referencia que proporciona una tensión estable que el regulador debe seguir.

Un elemento convertidor de nivel de tensión que analiza la tensión disponible en la salida del regulador.

Un comparador que, como su nombre indica, tiene como función establecer una comparación entre el nivel de la tensión de salida y el nivel de la tensión de referencia, proporcionando una salida que nos indique tal circunstancia.

El controlador, que en función de la señal proporcionada por el comparador, regula la transformación del nivel de tensión de entrada, para obtener el nivel de tensión de salida deseado.

En la actualidad existe una gran variedad de reguladores integrados que incorporan estos bloques antes encionados en su interior, siendo accesibles al usuario tres terminales (Entrada, Salida y Común). La

structura interna de estos componentes es bastante compleja pero facilita mucho su empleo en aplicaciones ue requieren tensiones estabilizadas, fijas y normalizadas como +5V, +12V y –12V.

Page 39: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 39 ___________________________________________

Todos los reguladores integrados incorporan circuitos de protección contra sobrecargas, cortocircuitos y elevaciones excesivas de la temperatura durante su funcionamiento que puedan hacer superar su límite térmico.

Para llevar a la práctica la construcción de una fuente, debemos en primer lugar, especificar las tensiones y potencias que necesitaremos en nuestro trabajo y aquellos valores de las mismas que deseamos tener disponibles para aplicaciones futuras.

En nuestro sistema se necesita únicamente una tensión estabilizada de +5V para alimentar a todos los

componentes de las tarjetas, para los cuales consideraremos suficiente un consumo nominal de 3A. Además dejaremos accesible una tensión de +12V continua no necesariamente estabilizada (si filtrada)

para alimentar lámparas, etc. dispondremos también de dos tensiones de +12V y –12V regulados y estabilizados para futuras aplicaciones.

Atendiendo a todas estas características realizaremos el diseño mostrado en la FIG.35A. Teniendo en cuenta estas consideraciones, elegiremos como regulador de +5V un LM323 que

suministra hasta 3A, con una impedancia de salida próxima a 0’01 ohmios, precisando una tensión de entrada no inferior a 7’5V y con una capacidad de disipación de potencia de 30W. Se dispondrá en la salida de la fuente de varias líneas de conexión, tanto en masa como a +5V y los cables de conexión serán de sección elevada y lo más cortos posibles, con la intención de producir la mínima caída de tensión.

Los reguladores de +12V y –12V, serán elementos como el 7812 y el 7912 respectivamente, que

proporcionan corrientes de salida de 1A y disponen internamente de sistemas de protección contra

LM3234A

R1330

DL1

D11N4148

D2

1N41

4820000 uF25V

C1 C2

L

10000 uF25V

C3

4300 uF25V

PR1FAGOR25A

0

9

FIG.35A

7812

7912

PR2

C4

10000 uF25V

C5

2000 uF25V

C6

1000 uF25V

D3

D4

R21KDL241

4841

48

R31K

DL3

1A

1A

C710000 uF25V

C8

2000 uF25V

C91000uF

25V

-12V

0

+12V

0

+5V

+12V

0

14

14

0

220

3.5 FUENTE DE ALIMENTACIÓN DEFINITIVA.

Page 40: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 40 ___________________________________________

cortocircuitos. Puesto que estas tensiones en principio no serán empleadas más que en aplicaciones muy concretas y la intensidad que pueden suministrar es baja, no será necesario emplear varias salidas, como en la alimentación de +5V, y los cables de conexión no es preciso que sean de sección elevada.

Debemos además considerar la necesidad de colocar elementos disipadores de calor tanto en los

puentes rectificadores como en los reguladores. En este caso podemos emplear radiadores de aletas de aluminio calculadas para 50W, que transmitirán al medio ambiente gran parte del calor que tendrían que soportar los reguladores y puentes. El sistema de evacuación del calor puede completarse con la incorporación a la fuente de un ventilador que provoque una circulación forzada de aire.

Page 41: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 41 ___________________________________________

EL SOFTWARE: LAS INSTRUCCIONES.

4

Page 42: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

emd

pps

epasp

loem

crinse

dd

n

.

4. EL SOFTWARE: LAS INSTRUCCIONES

Los sistemas construidos sobre la base de los microprocesadores, requieren para su puesta en marcha, l desarrollo del software, es decir, el desarrollo de programas que una vez construidos, son almacenados en las emorias permanentes (PROM, EPROM,...) del sistema, donde son buscados por el microprocesador para

esarrollar todas las funciones y tareas deseadas. Un programa esta constituido por un conjunto ordenado de instrucciones, que constituyen el cuerpo

rincipal del programa y uno o más bloques de datos iniciales necesarios para una correcta ejecución. El roceso básico de ejecución de un programa requiere por parte del microprocesador, la repetición de los iguientes pasos:

• Leer de la memoria una instrucción del programa. • Interpretar la instrucción leída. • Ejecutar dicha instrucción.

Debemos considerar además que los microprocesadores trabajan solamente con lenguaje de bajo nivel, s decir, trabajan con lenguaje máquina. Cada microprocesador o familia de microprocesadores, posee su ropio lenguaje máquina que determina las capacidades propias de cada familia. Las instrucciones máquina son lmacenadas en la memoria en forma de bytes, es decir, en forma de unos y ceros empleando por tanto el istema binario de numeración. Sin embargo este sistema es muy complejo para trabajar directamente con él, or lo que se emplean otros sistemas como el hexadecimal, BCD, etc. para la representación de datos.

Para construir los programas, normalmente se emplean lenguajes de alto nivel, y luego se transforman

s programas así escritos a lenguaje máquina asequible para el microprocesador. No obstante en nuestro caso mplearemos un lenguaje de bajo nivel (ensamblador) que trabaja con abreviaturas alfabéticas denominadas nemónicos que constituyen las operaciones e instrucciones que ejecutará el microprocesador.

Durante el desarrollo de este tema veremos las principales bases numéricas de representación, así

omo los diferentes tipos de instrucciones, modos de direccionamiento y se realizará un estudio de todo el epertorio de instrucciones propio del microprocesador 8085. Es conveniente leer todas y cada una de las strucciones para ir familiarizándose con ellas y entender su modo de funcionamiento. Todo lo tratado aquí,

on aspectos básicos de la programación que nos permitirán crear programas ejecutables en el sistema lectrónico presentado en este libro.

.

4.1 BASES NUMÉRICAS DE REPRESENTACIÓN

______________________________________ 42 ___________________________________________

Ya se ha comentado que es el lenguaje máquina el único que el microprocesador es capaz de tratar, es ecir, solamente trabaja con unos y ceros. Este lenguaje resulta inapropiado para las personas, por lo que se esarrollan otros sistemas de representación más sencillos o más cómodos de manejar.

En primer lugar debemos fijarnos en que el microprocesador trabaja con bloques de información

ormalizados. Podemos destacar en este terreno: • El bit: Como unidad de información más elemental que adopta dos únicos estados, el uno o el

cero. • El octeto o byte: Constituido por una cadena de ocho bits. • La palabra: Es el tamaño de información que el microprocesador puede manejar en paralelo. En

función de la potencialidad del microprocesador tendremos palabras de 8 bits, 16 bits, 32 bits, etc.

Page 43: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 43 ___________________________________________

Establecido ya el tipo de información con el que se va a trabajar, pasamos ahora a ver las bases

numéricas o de representación que emplearemos durante la programación. Las más comunes son: Sistema decimal: Es el sistema que habitualmente empleamos en nuestra vida diaria, y por tanto será el

sistema que se empleará normalmente para introducir datos y sacar datos del sistema. Lógicamente este sistema de representación numérico dispone de diez dígitos (0, 1, 2, 3, 4, 5, 6, 7, 8 y 9).

Sistema binario: Solo emplea dos unidades básicas de representación (0 y 1). Para encontrar la

expresión decimal de cualquier número binario, se procede de forma similar al sistema decimal, pero empleando el 2 como base del sistema. Por ejemplo el número 10101(2 será:

10101(2 = 1*24+0*23 +1*22+0*21+1*20 Para realizar el proceso contrario, es decir para transformar un número decimal a binario, puede

emplearse un método muy sencillo que consiste en dividir sucesivamente dicho número por la base binaria 2. El número binario se construye tomando el último cociente y poniendo a continuación de forma consecutiva los restos obtenidos en todas las divisiones de la última a la primera.

Sistema decimal codificado en binario (BCD): Se trata de un caso particular del binario que emplea

cuatro bits para representar los números decimales del 0 al 9. Por tanto para transformar un número decimal, no tendremos más que tomar cada una de sus cifras y transformarla a binario empleando 4 bits. Por ejemplo:

279 = 0010 0111 1001 Sistema exceso a tres: Toma como referencia el sistema BCD, sin más que añadir a cada dígito el valor

3, es decir sumar 0011(2. Sistema hexadecimal: Es uno de los más empleados en programación. Sus diez primeros dígitos se

corresponden con los del sistema decimal y los seis restantes son las seis primeras letras mayúsculas del alfabeto (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). La base de este sistema es el 16 y todas sus cifras pueden ser expresadas con cuatro bits (ya que 16 = 24). Para convertir un número binario a hexadecimal, agruparemos sus dígitos o bits de cuatro en cuatro y transformaremos cada uno de ellos de forma individual, obteniendo así la representación en hexadecimal. Por ejemplo:

0011 1010 1111 0110 (2 = 3AF6(16 = 3AF6H Sistema de representación ASCII: Se trata de un sistema de representación de datos empleado para

facilitar intercambios de información. Es uno de los sistemas más empleados en la actualidad (junto al sistema EBCDIC) . La codificación se lleva a cabo empleando una palabra de 8 bits, es decir, un octeto para cada carácter de información. Para encontrar el valor de un carácter numérico de una representación ASCII, es suficiente con restar el valor 48 y al contrario para encontrar la representación ASCII de un dígito decimal habrá que sumar 48 (48 = 0011 0000(2 = 30H).

Después de haber tratado de forma superficial los sistemas de representación, vamos a ver los distintos

tipos de instrucciones que utiliza un microprocesador.. Básicamente puede decirse que el bloque de instrucciones debe ser completo y eficaz de modo que podamos realizar todos los cálculos necesarios de la forma más rápida y precisa posible.

Una de las principales características de todo microprocesador es disponer de un buen conjunto de

instrucciones que le den la mayor versatilidad posible. Se establecen los siguientes grupos, tipos o conjuntos de instrucciones:

4.2 LOS TIPOS DE INSTRUCCIONES.

Page 44: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1. Aritméticas: Son las instrucciones que realizan operaciones de tipo aritmético como sumas, restas, incrementos, decrementos, etc. Todas las operaciones de este tipo afectan al registro de estado, es decir a los flags.

2. Movimiento de datos: Este tipo de instrucciones de movimiento o transferencia de datos, permiten

realizar una copia del contenido de un registro o dirección de memoria (origen), en otro registro o dirección de memoria (destino), sin alterar el contenido del origen.

3. Instrucciones lógicas: Realizan operaciones lógicas entre los operandos. Afectan a los flags según

sea el caso y las operaciones se realizan bit a bit entre los datos.

4. Instrucciones de comparación: Son operaciones de restar o operaciones XOR entre dos operandos. Afectan a los flags pero no se almacena el resultado.

5. Instrucciones de salto: Son instrucciones de modificación de secuencia que alteran la ejecución

normal del programa, cargando el contador de programa con la nueva dirección en la que deseamos continúe ejecutándose el programa. Los saltos o bifurcaciones pueden ser:

• Condicionales: Cuando son controlados por el estado de un indicador o flag, y basándose en

dicho estado se decide si se salta o no. • Incondicionales: Cuando modifican el contador de programa sin condición previa.

Dentro de cada uno de estos tipos, podemos encontrar además la particularidad de que al

efectuar los saltos se realicen con posibilidad de retorno o no.

6. Instrucciones de entrada/salida: Son en realidad instrucciones de transferencia, pero no entre registros o posiciones de memoria, sino con elementos periféricos que permiten la comunicación del microprocesador con el exterior.

7. Instrucciones de control: Sirven para actuar internamente sobre el microprocesador, provocando

detenciones en la ejecución del programa, etc.

8. Instrucciones de bit: Trabajan o tratan bits independientes.

9. Instrucciones de desplazamiento: Desplazan o rotan hacia la izquierda o hacia la derecha los bits de un registro (Acumulador).

pPamo

1

2

.

4.3 LOS MODOS DE DIRECCIONAMIENTO

______________________________________ 44 ___________________________________________

Los modos de direccionamiento son aquellos procedimientos empleados por el microprocesador para oder acceder a determinados operandos, instrucciones, posiciones de memoria, registros de entrada/salida, etc. or tanto el objeto del direccionamiento es un valor o dato que se encuentra en un lugar de la memoria, en lgún registro o en la propia instrucción. Los diferentes modos de direccionamiento que pueda emplear un icroprocesador le proporcionan un determinado nivel de potencialidad, permitiéndole manejar datos y realizar

peraciones con mayor facilidad. En general podemos diferenciar los siguientes tipos o modos de direccionamiento:

. Direccionamiento inmediato: En este caso el objeto (un operando) se encuentra incluido en la instrucción, es decir, a continuación del código de la instrucción se añade el operando propiamente dicho. Las instrucciones que emplean este direccionamiento pueden ser de dos o tres bytes y son instrucciones de ejecución rápida y sencilla.

. Direccionamiento implícito: Las instrucciones que emplean este modo de direccionamiento tienen un solo byte y es la propia instrucción la que indica qué registro o dirección de memoria se va a utilizar en la operación.

Page 45: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 45 ___________________________________________

3. Direccionamiento absoluto: En este caso las instrucciones incluyen la dirección de memoria donde se

encuentra el dato con el que se va a operar. En este tipo de direccionamiento pueden darse tres supuestos:

a. La instrucción apunta a un registro que contiene la información deseada (direccionamiento también llamado de registro).

b. La instrucción contiene la dirección completa en la que se encuentra el dato, empleando para ello tres

bytes.

c. Cuando la instrucción se refiere solo a una parte de la memoria (página). En este caso el byte más alto lo suministra el contador de programa y el byte más bajo se expresa a continuación del código de instrucción, por tanto solo se emplean dos bytes (Este direccionamiento también se llama de página base).

4. Direccionamiento directo relativo: La instrucción en este caso contiene un valor determinado al que

podemos llamar V. La dirección total se calcula sumando a V el valor que esté almacenado en un registro al que haga referencia la instrucción. El valor de V puede ser tanto positivo como negativo.

5. Direccionamiento indirecto: La instrucción contiene una dirección a la que llamaremos D1. El contenido

de D1 no es el objeto directo de nuestra instrucción, sino que contiene otra dirección que llamaremos D2. Esta nueva dirección D2 es la que contiene el dato que sí es objeto de la instrucción.

Expresados ya los modos de direccionamiento con carácter general, pasamos ahora a ver los modos de

direccionamiento que utiliza el microprocesador 8085 en particular, que son los cuatro siguientes: • Direccionamiento Directo Absoluto. La instrucción contiene la dirección exacta y completa donde

se encuentra el dato. Por ejemplo:

LHLD A716H • Direccionamiento por Registro. La instrucción lleva el registro en el que está el dato que va a ser

tratado. Por ejemplo:

MOV A,B MOV B,C

• Direccionamiento por Registro Indirecto. En la instrucción se especifica un registro cuyo

contenido apunta a una dirección de memoria en la que se encuentra el dato. Por ejemplo:

MOV A,M M es una referencia simbólica a una dirección de memoria apuntada o señalada por el par de

registros HL.

• Direccionamiento Inmediato. La instrucción contiene el dato con el que se desea operar, pudiendo ser el dato de uno o dos bytes.

LXI H,A0B7H ADI 3AH

Page 46: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

ea

cinm

oodn

INA

ac

v

INA

q

.

4.4 CONJUNTO DE INSTRUCCIONES DEL 8085A

______________________________________ 46 ___________________________________________

Aunque el conjunto de instrucciones puede encontrarse en cualquier libro que trate este tema specíficamente, en este apartado se muestra un "diccionario" de las mismas. La descripción se relaciona lfabéticamente para una localización más inmediata y todas están descritas de forma detallada.

La unidad básica de tiempo es el "estado", que es un ciclo de reloj (clock). Un "ciclo de máquina"

onsta de 3 a 6 estados. Las operaciones más sencillas requieren sólo un ciclo de máquina. El "ciclo de strucción" es el tiempo requerido para ejecutar una instrucción completa y puede constar de 1 a 5 ciclos de áquina.

Las instrucciones constan básicamente de una "fase de búsqueda" y una "fase de ejecución".

En este caso se omiten los gráficos de ejecución de los estados, dado que la velocidad de las

peraciones básicas del procesador dependen de la frecuencia del clock usado en el sistema. Un estado puede scilar entre los 320 ns y los 2 ns. Sabiendo la duración de un estado, en un determinado sistema se puede eterminar el tiempo de ejecución de una instrucción cualquiera multiplicando el tiempo de cada estado por el úmero de ellos que contiene cada instrucción.

En cada una de las instrucciones que se muestran a continuación se especificará:

• El formato de la instrucción. • El código objeto de la misma. • El número de bytes que emplea. • Los ciclos necesarios para su ejecución. • Los flags afectados al ejecutarse dicha instrucción. • El modo de direccionamiento empleado en la misma.

STRUCCIO CODIGO OBJ BYT. CIC FLAGS AFECTADOS DIRECCIONAMIENTO CI DATA CE YY 2 7 Z,S,P,CY,AC Inmediato

Suma el contenido del byte especificado (DATA) en la instrucción, al contenido del acumulador,

ñadiendo además el bit del acarreo. El resultado se almacena en el acumulador (perdiéndose así el anterior ontenido del Acumulador).

El dato (DATA) debe estar especificado en forma de número, en ASCII constante, como etiqueta de un

alor previamente definido o una expresión. El dato no debe exceder de un byte.

STRUCCIO CODIGOOBJ BYT. CIC FLAGS AFECTADOS DIRECCIONAMIENTO DC reg 1000 1XXX 1 4 Z,S,P,CY,AC Registro

Suma el contenido de un registro (reg) con el contenido del acumulador y el bit de acarreo. El resultado

ueda en el acumulador. El operando (reg) debe especificar uno de los registros del A al E, el H o el L.

Page 47: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 47 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTAD DIRECCIONAMIENTO ADC M 8E 1 7 Z,S,P,CY,AC Registro índice Esta instrucción suma el contenido del byte de memoria direccionado por el par de registros H y L con el contenido del acumulador y el bit de acarreo; el resultado es almacenado en el acumulador. (M es una referencia simbólica de los registros H y L).

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTAD DIRECCIONAMIENTO ADD reg 1000 0XXX 1 4 Z,S,P,CY,AC Registro Suma el byte de datos contenido en el registro especificado (reg debe ser uno de los registros del A al E, el H o el L) al contenido del acumulador y deja el resultado en el acumulador. (Notar que ADD excluye el flag de acarreo de la suma, pero lo utiliza para indicar el resultado de la operación). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTAD DIRECCIONAMIENTO ADD M 86 1 7 Z,S,P,CY,AC Regis indirect Suma el contenido de la posición de memoria direccionada por los registros H y L con el contenido del acumulador y deja el resultado en el acumulador. (No suma el acarreo, pero lo usa para completar el resultado de la operación).

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ADI DATA C6 YY 2 7 Z,S,P,CY,AC Inmediato

Suma el valor del byte especificado en la instrucción (DATA), al contenido del acumulador y deja el resultado en el acumulador. El dato debe ser expresado en forma de número, un ASCII constante, la etiqueta de un valor previamente definido o una expresión. El dato no debe exceder de un byte.

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ANA reg 1010 0XXX 1 4 Z,S,P,CY,AC Registro El operando (reg) debe especificar uno de los registros del A al E, el H o el L. Esta instrucción realiza una operación lógica Y entre el contenido del registro especificado y el contenido del acumulador, dejando el resultado en el acumulador. El flag de acarreo es puesto a cero. (La operación Y produce un 1 solo cuando los dos bits implicados en la operación son 1). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ANA M A6 1 7 Z,S,P,CY,AC Registr indirec

Se realiza un producto lógico (operación Y) entre el contenido de la posición de memoria especificada por H y L y el contenido del acumulador, dejando el resultado en el acumulador. El flag de acarreo es puesto a cero.

Page 48: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 48 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ANI DATA E6 YY 2 7 Z,S,P,CY,AC Inmediato Realiza una operación Y lógica entre el dato (DATA) especificado en la instrucción y el contenido del acumulador, el resultado queda en el acumulador. Se pone a cero el flag de acarreo. El dato, que no debe exceder de un byte, puede ser expresado en forma de número, un ASCII constante, la etiqueta de algún valor previamente definido o una expresión. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CALL LABEL CD PPQQ 3 18 Inmed/Reg Indir

CALL guarda el contenido del contador de programa (la dirección de la próxima instrucción secuencial) dentro del stack y a continuación salta a la dirección especificada por LABEL. Cada instrucción CALL o alguna de sus variantes implica una instrucción RET (retorno), de lo contrario el programa podría "perderse" con consecuencias impredecibles. La dirección debe ser especificada como un número, una etiqueta, o una expresión. La etiqueta es lo más normal (El assembler invierte los bytes alto y bajo de dirección durante el proceso de ensamblado). Las instrucciones CALL se emplean para llamadas a subrutinas y debemos tener presente que siempre emplean el stack.

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CC LABEL DC PPQQ 3 9/18 Inmed/Reg Indir CC comprueba el estado del flag de acarreo. Si el flag está a 1, CC carga el contenido del contador de programa en el stack y a continuación salta a la dirección especificada por LABEL. Si el flag esta a 0, la ejecución del programa continúa con la próxima instrucción de su secuencia normal. Aunque el uso de una etiqueta es lo más normal, la dirección puede ser especificada también como un número o una expresión. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CM LABEL FC PPQQ 3 9/18 Inmed/Reg Indir CM comprueba el estado del flag del signo. Si el flag esta a 1 (indicando que el contenido del acumulador es negativo) CM manda el contenido del contador de programa al stack y salta a la dirección especificada por LABEL. Si el flag es 0 la ejecución del programa continúa con su secuencia normal. El uso de la etiqueta es lo más corriente, pero la dirección puede especificarse también por un número o una expresión. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CMA 2F 1 4

La instrucción CMA complementa en contenido del acumulador. No actúa ningún flag de condición. Esta instrucción no emplea operandos. Para realizar el complemento a dos, se suma 1 al contenido del acumulador después de haber ejecutado la instrucción CMA.

Page 49: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 49 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CMC 3F 1 4 CY Complementa el flag de acarreo. Si dicho flag está a 0, CMC lo pone a 1 y si esta a 1 lo pone a 0. El resto de los flags no varían. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CMP reg 1011 1XXX 1 4 Z,S,P,CY,AC Registro El operando (reg) debe nombrar uno de los registros del A al E, el H o el L. La instrucción CMP reg compara el byte contenido en el registro especificado con el contenido del acumulador. Se indica el resultado actuando los flags de cero y acarreo. Los valores que están siendo comparados permanecen invariables. El flag de cero indica igualdad. Si hay un 0 en el flag de acarreo, indica que el contenido del acumulador es mayor que el contenido del registro especificado. Un 1 en el acarreo, indica lo contrario. Sin embargo el significado del flag de acarreo es invertido cuando los valores tienen signos diferentes o cuando uno de los valores es complementado. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CMP M BE 1 7 Z,S,P,CY,AC Registro La instrucción compara el contenido de la posición de memoria direccionada por los registros H y L con el contenido del acumulador. M es una referencia simbólica al par de registros HL. La actuación de los flags es igual a la producida en el caso anterior. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CNC LABEL D4 PPQQ 3 9/18 Inmedi/Reg indi CNC chequea el valor del flag de acarreo. Si está en cero CNC carga el contenido de contador de programa en el stack y a continuación salta a la dirección especificada por la instrucción en LABEL. Si el flag está a 1, el programa continúa con su secuencia normal. Aunque el uso de una etiqueta es lo más común, la dirección puede también estar indicada por un número o por una expresión. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CNZ LABEL C4 PPQQ 3 9/18 Inmed/Reg Indir CNZ chequea el flag de Cero. Si está en 0 (indicando que el contenido del acumulador no es cero), CNZ manda el contenido del contador de programa al stack y salta a la dirección especificada por LABEL. Si el flag está a 1 el programa continúa su desarrollo normal.

Page 50: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 50 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CP LABEL F4 PPQQ 3 9/18 Inmed/Reg Indir CP chequea el valor del flag de signo. Si está a 0 (indicando que el contenido del acumulador es positivo), CP envía el contenido del contador de programa al stack y salta a la dirección especificada por LABEL. Si el flag tiene un 1, continúa el programa normalmente con la instrucción siguiente. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CPE LABEL EC PPQQ 3 9/18 Inmedi/Reg Indi Existe paridad en un byte si el número de unos que tiene es par. El flag de paridad se pone a 1 para indicar esta condición. CPE chequea el valor del flag de paridad. Si tiene un 1, CPE envía el contenido del contador de programa al stack y salta a la dirección especificada por la instrucción en LABEL. Si el flag tiene un cero, el programa continúa normalmente. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CPI DATA FE YY 2 7 Z,S,P,CY,AC Reg Indirecto Compara el valor del byte especificado (DATA) con el contenido del acumulador y posiciona los flags de cero y acarreo para indicar el resultado. El flag de cero indica igualdad. Un 0 en el acarreo indica que el contenido del acumulador es mayor que DATA. Un 1 en el acarreo indica que el acumulador es menor que DATA. Sin embargo, el significado del flag de acarreo es contrario cuando los valores tienen diferente signo o cuando uno de los valores está complementado. El valor de DATA no debe exceder de un byte. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CPO LABEL E4 PPQQ 3 9/18 Inmedi/Reg Indi CPO chequea el flag de paridad. Si el flag esta a 0, CPO carga el contenido del contador de programa en el stack y salta a la dirección especificada en LABEL. Si el flag está a 1 el programa continúa su desarrollo normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO CZ LABEL CC PPQQ 3 9/18 Inmedi/Reg Indi CZ chequea el flag de cero. Si el flag esta a 1 (indicando que el contenido del acumulador es cero), CZ carga el contenido del contador de programa en el stack y salta a la dirección especificada en LABEL. Si el flag está a 0 (indicando que el contenido del acumulador es distinto de cero) el programa continúa su desarrollo normal.

Page 51: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 51 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO DAA 27 1 4 Z,S,P,CY,AC Registro La instrucción DAA ajusta el valor de los ocho bits del acumulador para formar dos grupos de cuatro bits binarios codificados en decimal. Esta instrucción no tiene operandos. DAA se emplea cuando deseamos trabajar con números decimales. Es la única instrucción cuya función requiere el uso del flag de acarreo auxiliar. En operaciones aritméticas multi-byte, la instrucción DAA es codificada inmediatamente después de la instrucción aritmética, de tal manera que el flag de acarreo auxiliar no se altera involuntariamente. DAA opera como sigue: 1.- Si los cuatro bits menos significativos del acumulador tienen un valor mayor que 9, o si el flag de acarreo auxiliar está en 1, DAA suma seis al acumulador. 2.- Si los cuatro bits más significativos del acumulador tienen un valor superior a 9, o si el flag de acarreo esta a 1, DAA suma 6 a los cuatro bits más significativos del acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO DAD RP 00XX 1001 1 10 CY Registro DAD RP suma el valor de un dato de 16 bits contenido en un determinado par de registros (RP) al contenido del par de registros HL. El resultado es almacenado en el par HL. Los operandos (RP) pueden ser B = BC, D = DE, H = HL, SP. Téngase en cuenta que la letra H debe ser empleada para especificar que el par de registros HL debe ser doblado. DAD pone el flag de acarreo a 1 si hay una salida de acarreo de los registros HL. Y además no afecta a ningún otro flag. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO DCR reg 00XX X101 1 4 Z,S,P,AC Registro El operando (reg) debe especificar uno de los registros del A al E, el H o el L. La instrucción resta 1 del contenido del registro especificado. Afecta a todos los flags excepto al de acarreo. (Puede usarse dentro de rutinas aritméticas multi-byte para decrementar contadores característicos y propósitos similares). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO DCR M 35 1 10 Z,S,P,AC Registro Indire Esta instrucción resta 1 del contenido de la posición de memoria direccionada por el par de registros HL. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO DCX RP 00XX 1011 1 6 Registro DCX resta 1 al contenido del par de registro especificado (RP). Dado que DCX no usa ningún flag, puede emplearse para modificar direcciones en cualquier secuencia de instrucciones dada la estaticidad de los flags. (La letra H puede emplearse para especificar el par de registros HL).

Page 52: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 52 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO DI F3 1 4 Después de la ejecución de una instrucción DI, el sistema de "interrupciones" esta sin posibilidad de ponerse en marcha. En aplicaciones que empleen las interrupciones, la instrucción DI se emplea solamente cuando una determinada secuencia no debe ser interrumpida. Por ejemplo, se puede poner fuera de servicio el sistema de interrupciones incluyendo una instrucción DI el principio del código de secuencia. La interrupción TRAP del 8085 no puede ser puesta fuera de servicio. Esta interrupción especial esta prevista para serios problemas que pueden presentarse independientemente del flag de interrupción (fallo de alimentación, etc.). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO EI FB 1 4 La instrucción EI pone en servicio el sistema de interrupciones a partir de la siguiente instrucción secuencial del programa. Se puede desconectar el sistema de interrupciones poniendo una instrucción DI al principio de una secuencia, puesto que no se puede predecir la llegada de una interrupción. Al final de la secuencia se incluye la instrucción EI que vuelve a habilitar el sistema de interrupciones. (RESET también pone fuera de servicio el sistema de interrupciones además de poner el contador de programa a cero). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO HLT 76 1 4 La instrucción HLT detiene el procesador. El contador de programa contiene la dirección de la próxima instrucción secuencial. Por otro lado los flags y registros permanecen inactivos. Una vez en estado de parada el procesador puede volver a ser arrancado solamente por un acontecimiento externo, es decir una interrupción. Por tanto debemos asegurarnos que las interrupciones estén en disposición de ser activadas antes de ejecutar la instrucción HLT. Si se ejecuta HLT estando las interrupciones fuera de servicio, la única manera de volver arrancar el procesador será mediante un RESET o a través de la interrupción TRAP. El procesador puede salir temporalmente del estado de parada para servir un acceso directo a memoria, sin embargo terminado el acceso directo vuelve al estado de parada. Un propósito básico de la instrucción HLT es permitir una pausa al procesador mientras espera por la interrupción de un periférico. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO IN PORT DB YY 2 10 Directo La instrucción IN PORT lee los 8 bits de datos que hay en el "PORT" especificado y los carga en el acumulador. El operando debe ser un número o una expresión que produzca un valor comprendido entre 00H y FFH.

Page 53: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 53 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO INR reg 00XX X100 1 4 Z,S,P,AC Registro El operando (reg) debe especificar uno de los registros del A al E, el H o el L. La instrucción suma 1 al contenido del registro especificado. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO INR M 34 1 10 Z,S,P,AC Registro Indire La instrucción suma 1 al contenido de la dirección de memoria señalada por el par de registros HL. M es una referencia simbólica a los registros H y L. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO INX RP 00XX 0011 1 6 Registro La instrucción INX suma 1 al par de registros especificado. No afecta a ningún flag. Puede usarse para incrementar los pares de registros BC, DE, HL y SP. (Cuidado al incrementar SP). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JC LABEL DA PPQQ 3 7/10 Inmediato La instrucción JC LABEL comprueba el valor del flag de acarreo. Si es un 1 la ejecución del programa continúa en la dirección especificada por LABEL. Si es un 0 el programa continúa su ejecución normal de forma secuencial. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JM LABEL FA PPQQ 3 7/10 Inmediato La instrucción JM LABEL comprueba el estado del flag de signo. Si el contenido del acumulador es negativo (flag de signo = 1) la ejecución del programa continúa en la dirección especificada por LABEL. Si el contenido del acumulador es positivo (flag de signo = 0) continúa la ejecución de la secuencia normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JMP LABEL C3 PPQQ 3 10 Inmediato La instrucción JMP LABEL altera la ejecución del programa cargando el valor especificado por LABEL en el contador de programa.

Page 54: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 54 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JNC LABEL D2 PPQQ 3 7/10 Inmediato La instrucción JNC LABEL comprueba el estado del flag acarreo. Si esta a 0 el programa cambia a la dirección especificada por LABEL. Si esta a 1 la ejecución del programa continúa normalmente. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JNZ LABEL C2 PPQQ 3 7/10 Inmediato La instrucción JNZ LABEL comprueba el valor del flag de cero. Si el contenido del acumulador no es cero (Flag de cero = 0) el programa continúa en la dirección especificada por LABEL. Si el contenido del acumulador es cero (Flag de cero = 1) el programa continúa su ciclo normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JP LABEL F2 PPQQ 3 7/10 Inmediato La instrucción JP LABEL comprueba el estado de flag del signo. Si el contenido del acumulador es positivo (flag de signo = 0) la ejecución del programa continúa con la dirección especificada por LABEL. Si el contenido del acumulador es negativo (flag de signo = 1) continúa el programa con su ejecución normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JPE LABEL EA PPQQ 3 7/10 Inmediato La paridad existe si el byte que esta en el acumulador tiene un número par de bits. El flag de paridad se pone a 1 para indicar esta condición.

La instrucción JPE LABEL comprueba la situación del flag de paridad. Si esta a 1, la ejecución del programa continúa en la dirección especificada por LABEL. Si esta a 0, continúa con la siguiente instrucción de forma secuencial. Las instrucciones JPE y JPO son especialmente usadas para comprobar la paridad de los datos de entrada. (Sin embargo con la instrucción IN los flags no actúan. Esto puede evitarse sumando 00H al acumulador para activarlos). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JPO LABEL E2 PPQQ 3 7/10 Inmediato La instrucción JPO LABEL comprueba el estado del flag de paridad. Si esta a 0, el programa continúa en la dirección marcada por LABEL. Si está a 1 continúa con la secuencia normal.

Page 55: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 55 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO JZ LABEL CA PPQQ 3 7/10 Inmediato La instrucción JZ LABEL comprueba el flag de cero. Si está a 1 el programa continúa en la dirección expresada por LABEL. Si está a 0 continúa con la ejecución secuencial normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO LDA ADDR 3A PPQQ 3 13 Directo LDA ADDR carga el acumulador con el contenido de la memoria direccionada por ADDR. La dirección puede ser puesta como un número, una etiqueta previamente definida o una expresión. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO LDAX RP 000X 1010 1 7 Registro indire LDAX RP carga el acumulador con una copia del byte almacenado en la localización de memoria direccionada por el par de registros BC o DE. (El par BC se especifica con B y el par DE con D). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO LHLD ADDR 2A PPQQ 3 16 Directo LHLD ADDR carga el registro L con una copia del byte almacenado en la posición de memoria especificada por ADDR. Después carga el registro H con una copia del byte almacenado en la posición siguiente de memoria especificada por ADDR. La instrucción LHLD esta prevista para cargar direcciones nuevas en los registros H y L. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO LXI RP,DA16 00XX 0001 YY YY 3 10 Inmediato LXI es una instrucción de 3 bytes; su segundo y tercer byte contienen el dato que ha de ser cargado en el par de registros (RP). El primer operando debe especificar el par de registros a ser cargados, pueden ser los pares BC, DE, HL, o el SP. El segundo operando especifica los dos bytes a ser cargados. LXI es la única instrucción inmediata que acepta un valor de 16 bits. El resto trabajan con datos de 8 bits. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO MOV reg,reg 01dddsss 1 4 Registro Copia el contenido del segundo registro en el primero. Cada operando debe especificar uno de los registros A, B, C, D, E, H o L.

Page 56: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 56 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO MOV M,reg 0111 0sss 1 7 Registro Indire Copia el contenido del registro especificado en la posición de memoria direccionada por los registros H y L. El segundo operando (reg) debe especificar uno de los registros A, B, C, D, E, H o L. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO MOV reg,M 01dd d110 1 7 Reggist.Indirec Copia el contenido de la posición de memoria direccionada por los registros H y L en el registro especificado. El primer operando debe especificar el registro deseado como destino. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO MVI reg,DAT 00ddd110 YY 2 7 Inmediato

El primer operando debe ser uno de los registros A,B,C,D,E,H o L, que será cargado con el dato especificado en el segundo operando (DATA). El dato no debe exceder de un byte. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO MVI M,DATA 36 YY 2 10 Inmedi/Reg Indi Esta instrucción carga el dato especificado por DATA en la posición de memoria direccionada por el par HL. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO NOP 00 1 4 NOP no realiza ninguna operación y no afecta a ninguno de los flags de condición. Se emplea normalmente para completar ciclos de lazo. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ORA reg 1011 0XXX 1 4 Z,S,P,CY,AC Registro El operando debe especificar uno de los registros del A al E, el H o el L. Esta instrucción realiza una operación lógica "O" entre el contenido del registro especificado y el acumulador, dejando el resultado en el acumulador. Los flags de acarreo y acarreo auxiliar se ponen a cero.

Page 57: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 57 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ORA M B6 1 7 Z,S,P,CY,AC Reg Indirecto Realiza una operación "O" entre el contenido de la dirección de memoria especificada por el par HL y el contenido del acumulador. El resultado es almacenado en el acumulador. Los flags de acarreo y acarreo auxiliar son puestos a cero. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO ORI DATA F6 YY 2 7 Z,S,P,CY,AC Inmediato ORI desarrolla una operación lógica "O inclusiva" entre el contenido especificado por DATA y el contenido del acumulador. El resultado se deja en el acumulador. Los flags de acarreo y acarreo auxiliar se ponen a cero. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO OUT PORT D3 YY 2 10 Directo OUT PORT pone el contenido del acumulador en el bus de datos de 8 bits del puerto seleccionado en el bus de direcciones de 16 bits. El número de puertos oscila de 0 a 255 y es duplicado en el bus de direcciones. Es la lógica externa la encargada de seleccionar el puerto y aceptar el dato de salida. El operando (PORT) debe especificar el número del puerto de salida seleccionado. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO PCHL E9 1 6 Registro PCHL carga el contenido de los registros H y L en el contador de programa. Como el procesador busca la siguiente instrucción en la siguiente dirección del contador de programa, PCHL tiene el efecto de una instrucción de salto. El contenido de H va a los 8 bits más altos de contador de programa y el contenido de L va a los 8 bits más bajos. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO POP RP 11XX 0001 1 10 Reg. Indirecto POP RP copia el contenido de la posición de memoria direccionada por el stack pointer en el registro de bajo orden del par de registros especificados. A continuación se incrementa el stack pointer en 1 y copia el contenido de la dirección resultante en el registro de más alto orden del par. Luego se incrementa el stack pointer otra vez de modo que se apunta al siguiente dato del stack. El operando debe especificar el par de registros BC, DE, HL o PSW. POP PSW usa el contenido de la localización de memoria especificada por el stack pointer para restablecer los flags de condiciones.

Page 58: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 58 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO PUSH RP 11XX 0101 1 12 Reg.Indirecto PUSH copia dos bytes de datos en el stack. El dato puede ser el contenido de un par de registros o la "palabra de estado del programa". PUSH resta 1 del stack pointer y copia el contenido del registro de "alto orden" del par de registros en la dirección resultante. A continuación se resta otra vez 1 al stack pointer y se copia el registro de bajo orden en la dirección resultante. Los registros permanecen invariables. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RAL 17 1 4 CY RAL hace girar el contenido del acumulador y el flag de acarreo un espacio de un bit hacia la salida (izquierda). El flag de acarreo que es tratado como si fuera del acumulador, se transfiere el bit de menor orden del acumulador. El bit de mayor orden del acumulador se transfiere al flag de acarreo. No tiene operandos. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RAR 1F 1 4 CY RAR rota el contenido del acumulador y del flag de acarreo 1 bit de posición a la derecha. El flag de acarreo que es tratado como si fuera parte del acumulador se transfiere al bit de más alto orden del acumulador. El bit de menor peso del acumulador se carga en el flag de acarreo. No existen operandos en la instrucción RAR. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RC D8 1 6/12 Reg. Indirecto La instrucción RC comprueba el estado del flag de acarreo. Si tiene un 1 (indicando que hay acarreo) la instrucción saca dos bytes del stack y los mete en el contador de programa. El programa continúa en la nueva dirección suministrada. Si el flag es 0, el programa continúa en la siguiente instrucción de la secuencia normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RET C9 1 10 Reg. Indirecto La instrucción RET echa fuera dos bytes de datos del stack y los mete en el registro contador de programa. El programa continúa entonces en la nueva dirección. Normalmente RET se emplea conjuntamente con CALL.

Page 59: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 59 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RIM 20 1 4 RIM carga los 8 bits de datos siguientes en el acumulador: SID I7.5 I6.5 I5.5 IE M7.5 M6.5 M5.5 SID = Bit presente en la entrada serie I7.5 = Interrupción 7.5 pendiente si esta a 1 I6.5 = Interrupción 6.5 pendiente si esta a 1 I5.5 = Interrupción 5.5 pendiente si esta a 1 IE = Las interrupciones son autorizadas si es 1 M7.5 = La interrupción 7.5 está prohibida si está a 1 M6.5 = La interrupción 6.5 está prohibida si está a 1 M5.5 = La interrupción 5.5 está prohibida si está a 1 INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RLC 07 1 4 CY RLC rota un bit hacia la izquierda todo el contenido del acumulador, transfiriendo el bit de más alto orden al flag de acarreo y al mismo tiempo a la posición de menor orden del acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RM F8 1 6/12 Reg. Indirecto La instrucción RM comprueba el flag de signo. Si tiene un 1, indicando dato negativo en el acumulador, la instrucción echa dos bytes fuera del stack y los mete en el contador de programa. Si el flag tiene 0, continúa el programa normal con la siguiente instrucción. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RNC D0 1 6/12 Reg. Indirecto La instrucción RNC comprueba el flag de acarreo. Si está a 0 indicando que no hay acarreo, la instrucción echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag está a 1 continúa el ciclo normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RNZ C0 1 6/12 Reg. Indirecto La instrucción RNZ comprueba el flag cero. Si está a 0, indicando que el contenido del acumulador no es cero, la instrucción echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag está a 1, continúa el ciclo normal.

Page 60: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 60 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RP F0 1 6/12 Reg. Indirecto La instrucción RP comprueba el flag signo. Si está a 0, indicando que el contenido del acumulador es positivo, la instrucción echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag está a 1 continúa el ciclo normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RPE E8 1 6/12 Reg. Indirecto La instrucción RPE comprueba el flag de paridad. Si está a 1, indicando que existe paridad, la instrucción echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag está a 0 continúa el ciclo normal. (Existe paridad si el byte que está en el acumulador tiene un número par de bits, colocándose el flag de paridad a 1 en este caso). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RPO E0 1 6/12 Reg. Indirecto La instrucción RPO comprueba el flag de paridad. Si está a 0, indicando que no hay paridad, la instrucción echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag está a 1, continúa el ciclo normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RRC 0F 1 4 CY RRC rota el contenido del acumulador un bit a la derecha, transfiriendo el bit de más bajo orden a la posición de más alto orden del acumulador, además pone el flag de acarreo igual al bit de menor orden del acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RST N 11XX X111 1 12 Reg. Indirecto Es una instrucción CALL para usar con interrupciones. RST carga el contenido del contador de programa en el stack, para proveerse de una dirección de retorno y salta a una de las "ocho" direcciones determinadas previamente. Un código de tres bits incluido en el código de operación de la instrucción RST especifica la dirección de salto. Esta instrucción es empleada por los periféricos cuando intentan una interrupción. La instrucción RST tiene el siguiente formato: 1 1 C C C 1 1 1

Luego según la combinación de 0 y 1 que demos a C C C obtendremos los distintos formatos y las distintas direcciones de las interrupciones, que serán:

Page 61: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 61 ___________________________________________

FORMATO RST CONTADOR DE PROGRAMA 1100 0111 C7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000H 1100 1111 CF 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0008H 1101 0111 D7 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0010H 1101 1111 DF 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0018H 1110 0111 E7 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0020H 1110 1111 EF 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0028H 1111 0111 F7 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0030H 1111 1111 FF 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0038H INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO RZ C8 1 6/12 Reg.Indirecto La instrucción RZ comprueba el flag de cero. Si está a 1, indicando que el contenido del acumulador es cero, la instrucción echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag está a 0, continúa el ciclo normal. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SBB reg 1001 1XXX 1 4 Z,S,P,CY,AC Registro SBB reg resta uno de los registros del A al E, el H o el L y el flag de acarreo, del contenido del acumulador, dejando el resultado en el acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SBB M 9E 1 7 Z,S,P,CY,AC Reg. Indirecto Esta instrucción resta el flag de acarreo y el contenido de la posición de memoria direccionada por los registros H y L, del contenido del acumulador y deja el resultado en el acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SBI DATA DE YY 2 7 Z,S,P,CY,AC Inmediato SBI resta el contenido de DATA y el flag de acarreo, del contenido del acumulador, dejando el resultado en el acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SHLD ADDR 22 PPQQ 3 16 Directo SHLD almacena una copia del registro L en la posición de memoria especificada por ADDR, a continuación almacena una copia del registro H en la siguiente posición de memoria (ADDR+1). SHLD es una instrucción proyectada para salvar el contenido del par HL.

Page 62: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 62 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SIM 30 1 4 SIM es una instrucción de usos múltiples que utiliza el contenido del acumulador para posicionar el enmascaramiento de interrupciones para las RST 5.5, RST 6.5, RST 7.5; pone a cero el flanco sensitivo de la entrada RST 7.5 y saca el bit 7 del acumulador al latch de datos de salida serie. La estructura de la instrucción SIM es como sigue: SOD SOE X R7.5 MSE M7.5 M6.5 M5.5 SOD = Bit a presentar sobre la salida serie. SOE = La salida serie está autorizada si esta a 1. R7.5 = Reset de RST 7.5.Si es 1 el flip-flop se pone a 0 MSE = Si es un 1 los enmascarados están autorizados. M7.5 = Si es 1 la interrupción 7.5 queda prohibida. M6.5 = Si es 1 la interrupción 6.5 queda prohibida. M5.5 = Si es 1 la interrupción 5.5 queda prohibida. Si el bit 3 se pone a 1, la función poner "mask" se pone enable (permitida). Los bits 0 al 2 ponen en servicio la correspondiente interrupción RST colocando un 0 en la interrupción que deseamos habilitar. Si colocamos un 1 en alguno de los bits 0 al 2, la interrupción correspondiente no se cumplirá. Si el bit 3 tiene un 0, los bits 0 al 2 no tienen efectos. Se debe usar esta peculiaridad para enviar un bit de salida serie sin afectar al enmascaramiento de las interrupciones. (La instrucción DI anula la SIM). Si el bit 6 (SOE) se pone a 1 se habilita la función de salida serie. El bit 7 se sitúa en la salida SOD donde puede ser tratado por los aparatos periféricos. Si el bit 6 se pone a cero, el bit 7 no tendrá efecto alguno, siendo ignorado. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SPHL F9 1 6 SPHL carga el contenido de los registros H y L en el stack. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO STA ADDR 32 PPQQ 3 13 Directo STA ADDR almacena una copia del contenido actual del acumulador en la posición de memoria especificada por ADDR. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO STAX RP 000X 0010 1 7 Reg. Indirecto STAX RP almacena una copia del contenido del acumulador en la posición de memoria direccionada por el par de registros especificados por RP (Par BC o par DE).

Page 63: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 63 ___________________________________________

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO STC 37 1 4 CY STC pone el flag de acarreo a 1. No afecta a otro flag. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SUB reg 001 0xxx 1 4 Z,S,P,CY,AC Registro El operando debe especificar uno de los registros del A al E, el H o el L. La instrucción resta el contenido del registro especificado del contenido del acumulador, usando representación de los datos en complemento a dos. El resultado es almacenado en el acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SUB M 96 1 7 Z,S,P,CY,AC Reg. Indirecto La instrucción resta el contenido de la posición de memoria direccionada por los registros H y L del contenido del acumulador. El resultado es almacenado en el acumulador. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO SUI DATA D6 YY 2 7 Z,S,P,CY.AC Inmediato SUI DATA resta el contenido de DATA del contenido del acumulador y almacena el resultado en el acumulador. La instrucción SUI utiliza el flag de acarreo durante la sustracción, pero acciona dicho flag para indicar la salida de la operación. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO XCHG EB 1 4 Registro XCHG cambia el contenido de los registros H y L con el contenido de los registros D y E. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO XRA reg 010 1XXX 1 4 Z,S,P,CY,AC Registro Esta instrucción realiza una "O exclusiva" usando el contenido del registro especificado y el contenido del acumulador. El resultado se almacena en el acumulador. Los dos flags de acarreo se ponen a 0. (Una O exclusiva produce un 1 cuando los dos datos son diferentes).

Page 64: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO XRA M AE 1 7 Z,S,P,CY,AC Reg. Indirecto Se realiza una O exclusiva entre el contenido de la posición de memoria especificada por HL y el contenido del acumulador, quedando el resultado en éste. Los dos flags de acarreo se ponen a 0. (La instrucción XRA A pone a cero el acumulador). INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO XRI DATA EE YY 2 7 Z,S,P,CY,AC Inmediato XRI DATA realiza una O exclusiva entre el contenido de DATA y el contenido del acumulador. El resultado se pone en el acumulador. Pone los flags de acarreo a cero. INSTRUCCIO CODIGO OBJ BYT. CICL FLAGS AFECTADO DIRECCIONAMIENTO XTHL E3 1 16 Reg. Indirecto XTHL cambia los dos bytes de la posición más alta del stack con los dos bytes almacenados en los registros H y L. Así XTHL salva el contenido actual del par HL y carga nuevos valores en HL. XTHL cambia el contenido del L con la posición de memoria especificada por el stack pointer y el registro H es intercambiado con el contenido del SP+1.

msda 1

e

C

4.5 EMPLEO DE ALGUNAS INSTRUCCIONES.

______________________________________ 64 ___________________________________________

En el desarrollo de este apartado veremos el uso o empleo de diferentes instrucciones del icroprocesador 8085, intentando en su exposición, realizar una división o clasificación de las mismas según

e trate de instrucciones aritméticas, lógicas, de transferencia, de salto, etc. El echo de que se planteen eterminadas soluciones para obtener un resultado deseado, no quiere decir que no existan otras posibles lternativas.

. Aritméticas.

Para efectuar la suma entre el contenido del acumulador y el contenido de una dirección de memoria specificada por la expresión DIRE, podemos hacer

LXI H,DIRE ; HL = DIRE ADD M ; Acumulador = Acumulador + M

Donde M representa el contenido de la dirección de memoria apuntada por el par de registros HL. Si además de sumar los contenidos de acumulador y dirección de memoria, deseamos también sumar el

ARRY, podremos hacer

Page 65: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 65 ___________________________________________

LXI H,DIRE ADC M ; Acumulador = Acumulador + M + CARRY

Si deseamos llevar a cabo una suma decimal entre el contenido del acumulador y el contenido de un registro, por ejemplo el registro C, se deberá efectuar en primer lugar la suma y a continuación proceder a realizar el ajuste decimal tal como se muestra a continuación ADD C ; Acumulador = Acumulador + reg.C DAA ; Efectúa el ajuste decimal

Para sumar también el CARRY, además de acumulador y registro C, tendremos que hacer ADC C ; Acumulador = Acumulador + reg.C + CARRY DAA ; Efectúa el ajuste decimal Cuando deseemos sumar dos números de 16 bits, tendremos que emplear registros pares (BC, DE, HL)

y luego proceder a efectuar la suma entre ellos. Si suponemos que tenemos el primer sumando en el par HL y que NUME contiene el valor del segundo sumando, podemos realizar las siguientes operaciones

LXI B,NUME ; BC = NUME DAD B ; HL = HL + BC Para poder sumar también el CARRY tendremos que realizar la siguiente modificación

LXI B,NUME JNC SUMA INX H

SUMA DAD B Supongamos ahora que deseamos sumar dos números de 16 bits, estando situado el primer número en

las direcciones NUM1 y NUM1+1 (contiguas), y el segundo número en las direcciones NUM2 y NUM2+1 (contiguas). Para realizar esta operación podemos proceder del modo siguiente

LHLD NUM1 ; HL = dirección del número 1 XCHG ; DE = HL LHLD NUM2 ; HL = dirección del número 2 DAD D ; HL = HL + DE Si necesitamos efectuar una operación de resta, entre el contenido del acumulador y el contenido de

una dirección de memoria representada por DIRE, podemos emplear las instrucciones LXI H,DIRE SUB M En caso de querer hacer una operación de resta entre el contenido del acumulador y el contenido de un

registro, por ejemplo el C, procederemos como sigue MOV B,A ; Guardar acumulador en el registro B MVI A,100 ; Acumulador = 100 SUB C ; A = A – C ADD B ; A = A + B DAA ; Ajuste decimal Para incrementar el contenido de una dirección de memoria, señalada por DIRE, en una unidad,

podremos lograrlo con las instrucciones LXI H,DIRE INR M

Page 66: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 66 ___________________________________________

Por el contrario, para decrementar en una unidad el contenido de la mencionada dirección de memoria, haremos

LXI H,DIRE DCR M Si necesitáramos ahora decrementar en una unidad, un dato de 16 bits almacenado en posiciones de

memoria consecutivas marcadas por DIRE y DIRE+1, tendríamos que proceder del modo siguiente LHLD DIRE ; Cargar HL con el dato de 16 bits DCX H ; Decrementar el par HL SHLD DIRE ; Guardar HL en la memoria(DIRE y DIRE+1) Para multiplicar por dos el contenido de un registro, por ejemplo el B, tendremos que ejecutar las

instrucciones MOV A,B ADD A MOV B,A Si deseamos multiplicar por 4 el contenido del acumulador, no tendremos más que repetir dos veces la

operación de suma anterior, es decir ADD A ADD A En caso de necesitar dividir por cuatro el contenido de una dirección de memoria apuntada por DIRE,

podremos hacer LXI H,DIRE MOV A,M ANA A RAR ANA A RAR MOV M,A En caso de necesitar comparar dos valores, por ejemplo uno situado en el registro C y otro situado en

una dirección de memoria (DIRE) se puede implementar la siguiente serie de instrucciones LXI H,DIRE

MOV A,M XRA C Como sabemos, la función O exclusiva, compara los dos bytes (acumulador y registro C) bit a bit. Si los bits comparados son iguales, el resultado es un 0 y si son diferentes es un 1. Por tanto sabremos que el acumulador y el registro C son iguales si el resultado mostrado en el acumulador es 00H (flag Z a 1). Para realizar el complemento a dos del contenido del acumulador emplearemos las instrucciones CMA ; Complementa el acumulador INR A ; Incrementa el acumulador en 1 Para llevar a cabo el complemento a dos de un registro doble, por ejemplo el registro par DE, ejecutaremos las instrucciones siguientes MOV A,D CMA MOV D,A MOV A,E

Page 67: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 67 ___________________________________________

CMA MOV E,A INX D 2. Lógicas.

Cuando se desea poner a cero determinados bits de un registro, por ejemplo los bits 3 y 5, permaneciendo el resto de bits iguales, podremos emplear una instrucción de operación lógica AND con la máscara apropiada. En este caso podríamos hacer

MOV A,E ; Carga el registro E en el acumulador ANI 11010111B ; Operación AND con el acumulador MOV E,A Para realizar el proceso contrario, es decir, poner a uno determinados bits de un registro, por ejemplo

los bits 3 y 5, permaneciendo el resto igual, podremos utilizar la operación lógico OR del modo siguiente MOV A,E ORI 00101000B MOV E,A Si ahora necesitamos complementar los bits 3 y 5 del mismo registro E haremos MOV A,E XRI 00101000B MOV E,A

3. Transferencia.

Para cargar en el registro C, el contenido de la dirección de memoria apuntada por DIRE haremos LXI H,DIRE MOV C,M Cargar un registro par, con los datos almacenados en dos posiciones consecutivas de la memoria LXI H,DIRE MOV C,M INX H MOV D,M Cargar una máscara de interrupciones con un DATO determinado para establecer cuales serán las

interrupciones activadas y cuales no MVI A,DATO SIM

Cuando necesitemos almacenar un DATO en la dirección de memoria señalada po DIRE estableceremos las instrucciones

LXI H,DIRE MVI A,DATO MOV M,A Si necesitamos poner a cero el flag CARRY o bien si necesitamos ponerlo a uno, emplearemos las

instrucciones siguientes ANA A ; Pone a cero el CARRY STC ; Pone a uno el CARRY

Page 68: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 68 ___________________________________________

4. Saltos.

Cuando deseemos cargar en el Contador de Programa una dirección determinada, con lo que pasaremos a ejecutar el programa en dicha dirección, podemos hacer

LXI H,DIRE PCHL Para saltar a una dirección de memoria determinada (DIRE) si se cumple que el par de registros BC

contiene el valor cero, ejecutaremos las siguientes instrucciones MOV A,B ORA C JZ DIRE Proceder a efectuar un salto a la dirección de memoria DIRE, cuando el dato contenido en el registro D

sea igual al valor almacenado en la dirección de memoria DIRE1 MOV A,D LXI H,DIRE1 CMP M JZ DIRE Para efectuar una llamada incondicional a una subrutina denominada SUBRU emplearemos la

instrucción CALL SUBRU Si deseamos que al acceder a una subrutina determinada, no se altere el contenido de diversos

registros, habrá que guardarlos en la pila al comienzo de la subrutina y recuperarlos al salir de ella, de este modo tendremos

SUBRU: PUSH B PUSH D PUSH PSW PUSH H ............. ............. ............. POP H POP PSW POP D POP B RET Cuando entremos en un proceso dentro del programa, en el que no nos interese efectuar ninguna acción

sobre los registros del microprocesador ni efectuar ningún tipo de operación, disponemos de las siguientes instrucciones

NOP MOV A,A MOV B,B MOV C,C MOV D,D MOV E,E MOV H,H MOV L,L

Si deseamos trabajar con el bloque de interrupciones de que dispone el 8085, tendremos que activarlas

en el momento que nos interese mediante la máscara de interrupciones (la interrupción TRAP no es

Page 69: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

enmascarable). Para ello tendremos que habilitar las interrupciones. Supongamos que deseamos permitir las interrupciones 5.5 y 6.5 al tiempo que necesitamos enmascarar la interrupción 7.5. Procederemos como sigue

MVI A,00001100B SIM

1 2

3 4

5

6 7 8 9 1

4.6 EJERCICIOS.

______________________________________ 69 ___________________________________________

. Analizar los sistemas de representación numérica decimal, binario, hexadecimal, BCD y ASCII.

. Dados los números decimales 3, 9, 15, 27, 67 y 98, encontrar sus expresiones en los sistemas binario y hexadecimal.

. Hablar sobre los distintos “tipos de instrucciones”.

. Explicar los siguientes modos de direccionamiento: Directo absoluto, por registro, por registro indirecto e inmediato. Hablar sobre otros modos de direccionamiento conocidos.

. Enumerar las instrucciones del microprocesador 8085, que se utilizan para incrementar y decrementar registros.

. Explicar las instrucciones EI y DI.

. Enumerar las instrucciones del 8085 que realicen la operación lógica Y.

. Enumerar las instrucciones del 8085 que realicen la operación lógica O.

. Enumerar las instrucciones del 8085 que realicen saltos.

0. Explicar las instrucciones IN y OUT de comunicación con el exterior.

Page 70: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 70 ___________________________________________

LA PROGRAMACIÓN.

5

Page 71: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

ine

mmpn

ace

ccp

pdinp

lae 12345

aa

e“

.

5. LA PROGRAMACIÓN

Después de haber tratado y examinado el repertorio de instrucciones del microprocesador, vamos a troducir algunas cuestiones básicas y primordiales sobre la metodología de la programación, que nos faciliten

l desarrollo de programas aplicables a nuestro sistema físico. Planteamos aquí la base de la programación estructurada que nos ayudará a construir programas más o

enos complejos, que se apoyarán en unidades o bloques más elementales para a partir de ellos obtener otros ás largos y complicados. Se obtendrán algoritmos que no dependerán en absoluto de ningún lenguaje de

rogramación en concreto y que posteriormente serán convertidos al lenguaje deseado en cada caso (para osotros el ensamblador).

El proceso de programación debe desarrollarse partiendo de unas “ideas” que deben ser perfectamente

similadas, comprendidas y organizadas por la persona o personas que vayan a construir el programa en uestión. Esto lleva implícita la disminución de errores durante el proceso programador, por lo que se facilita normemente la tarea.

El objetivo final de la programación será, además de conseguir programas que funcionen

orrectamente y sean eficientes, proporcionar sobre ellos toda la documentación necesaria. Debe tenerse en uenta que un programa indebidamente documentado sería muy difícil de modificar en un futuro, o al menos odría resultar tan costoso que nos haría renunciar a tal propósito.

.

5.1 EL ALGORITMO

______________________________________ 71 ___________________________________________

Puede decirse que un “algoritmo” no es más que un método que vamos a utilizar para resolver un roblema o mejor aún para resolver un tipo de problemas. Para afrontar la construcción de un programa eterminado, resulta esencial conocer de un modo preciso el problema que se desea resolver y los datos iciales de los que se dispone para, a través del algoritmo, describir exactamente y con la mayor precisión

osible, la secuencia de pasos a seguir hasta llegar a la solución deseada. El algoritmo debe ser construido mediante la especificación de un proceso que muestre de forma clara

relación entre los estados iniciales y los estados o resultados finales. Los elementos que componen una specificación son fundamentalmente:

. El nombre del algoritmo que se desarrolla.

. La función o tarea que realiza lo más clara posible.

. Las condiciones iniciales (precondiciones).

. Los estados finales una vez ejecutado el algoritmo (postcondiciones).

. La exposición de las variables que intervienen.

Las especificaciones que se realicen deben ser claras y precisas de forma que no quede lugar a mbigüedades y deben ser propuestas de la forma más general posible. Puede suceder que en determinados lgoritmos no sea necesario exponer de forma explícita todos los elementos de la especificación.

Los programas que trataremos, en general, se desarrollaran de forma lineal o secuencial, es decir,

jecutaremos las instrucciones en el orden programado, aunque dispondremos de los medios adecuados para romper” esta secuencia y continuar la ejecución en otro punto del programa que nos interese. Podremos

Page 72: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 72 ___________________________________________

también en circunstancias concretas, establecer determinados bloques o conjuntos de instrucciones que se repitan cíclicamente un estipulado número de veces, incluso determinadas partes del programa podrán ejecutarse o no en función de que se cumplan ciertos condicionamientos.

Cuando se pretende resolver un problema mediante la programación, lo normal es que se encuentren

distintas formas o modos de solucionarlo, es decir, distintos algoritmos que nos proporcionen el mismo resultado. Debe quedar claro, por tanto, que no hay una solución única en el momento de construir un algoritmo.

Fundamentalmente debemos conseguir que todos los algoritmos construidos reúnan las siguientes

características: • Que sean fácilmente comprensibles para quien pretenda leerlos. • Deben obtener el resultado deseado de forma rápida. • Deben ocupar el menor espacio posible. • Es conveniente que el programa se encuentre subdividido en programas más elementales, es decir, el

programa debe ser modular. • Además debe ser razonablemente fácil de modificar. A esto ayuda la modularidad y la documentación que

acompañe al programa (la información que suministra la documentación es muy importante en los procesos de modificaciones).

Existen diversas formas de abordar la construcción de un algoritmo, desde la realización de “tablas de

decisión” que nos señalan las distintas cuestiones planteadas y nos apuntan a las acciones a tomar, pasando por la realización de los “diagramas de flujo” que nos resuelven el problema gráficamente, las “especificaciones formales” que pretenden introducir un lenguaje más preciso y matemático que anule en lo posible las indefiniciones y los errores, hasta la utilización conjunta del lenguaje común y palabras clave, constituyendo lo que se llama el pseudocódigo.

Debe entenderse que cada uno de estos métodos de construcción de algoritmos tiene sus ventajas e

inconvenientes. Por ejemplo, es claro que para resolver un problema pequeño, puede resultar muy sencillo e ilustrativo emplear el diagrama de flujo. Sin embargo, si el problema es mucho más complejo, este método podría resultar muy dificultoso, nos causaría muchos problemas si tuviéramos que realizar alguna modificación e incluso podría llegar a no ser utilizable dependiendo del nivel de dificultad.

En ocasiones puede ser interesante utilizar una mezcla de dos métodos, siempre que nos facilite la

tarea de programar. Nosotros emplearemos los diagramas de flujo siempre que sea posible y el pseudocódigo, todo ello con vistas al paso posterior, que será la codificación del algoritmo en lenguaje ensamblador.

Como se ha mencionado anteriormente, al emplear el pseudocódigo para la construcción de un algoritmo, se utiliza una mezcla entre el lenguaje común y determinadas instrucciones cruciales que veremos a continuación.

Hay que recordar que este procedimiento empleado en la creación de los algoritmos no siempre puede seguir una estructura rígida, debiendo adaptarnos al problema concreto que estemos tratando. Al objeto de ir concretando algo más sobre los aspectos que nosotros trataremos finalmente para la puesta en funcionamiento de nuestro sistema, debemos indicar que: • Las condiciones iniciales (precondiciones) que normalmente observaremos harán referencia a

determinados registros o posiciones de memoria que contienen los datos precisos para ejecutar ese algoritmo.

5.2 LOS PSEUDOCÓDIGOS.

Page 73: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 73 ___________________________________________

• Las condiciones finales (postcondiciones) harán referencia al modo de obtención del resultado de la ejecución, dónde queda almacenado un dato o resultado, como se ejecuta una acción, registros modificados durante la ejecución, direcciones de memoria alteradas, etc.

Puede decirse, por tanto, que la estructura básica de un algoritmo será del tipo que a continuación se

muestra: NOMBRE: FUNCION: PRECONDICIONES: POSTCONDICIONES: VARIABLES: .............................................. .............................................. CUERPO DEL PROGRAMA .............................................. .............................................. FINAL

La instrucción más elemental y básica que se emplea en el diseño de algoritmos es la de “asignación”, que consiste en dar un determinado valor a una variable. Esta operación se realiza simbólicamente mediante el signo “=”. Debe tenerse cuidado en las asignaciones con los tipos de datos que se está trabajando. En nuestro caso es imprescindible saber si se trata de palabras de 8 bits, 16 bits, valores decimales, hexadecimales, caracteres ASCII, etc. Por otro lado, como ya se ha apuntado anteriormente, el desarrollo de un algoritmo está basado en la composición secuencial de instrucciones, es decir, en la ejecución de las instrucciones que lo componen de manera consecutiva. Esto quiere decir que cuando partimos de unas precondiciones determinadas (Pr1) y ejecutamos una serie de instrucciones, se obtendrán unas postcondiciones concretas (Po1). Si ahora estas postcondiciones nos sirven como precondiciones (Po1=Pr2) para ejecutar a continuación otra serie de instrucciones que nos proporcionen nuevas postcondiciones (Po2), quiere esto decir que es posible que no necesitemos explicar los estadios intermedios pudiendo limitarnos a partir de las precondiciones iniciales (Pr1) para obtener las postcondiciones finales (Po2), produciéndose de esta manera la asociación de instrucciones. Sin embargo este proceso de composición secuencial no proporciona los medios adecuados o suficientes para desarrollar algoritmos que nos exijan un mínimo de complejidad. Disponemos entonces de una serie de acciones o mecanismos que nos permiten variar o modificar el desarrollo de una secuencia en función de alguna característica determinada. Entre estas acciones destacan:

Las decisiones: Constituyen una nueva estructura que nos permite ejecutar o no, una parte del programa, atendiendo a determinada condición. Este tipo de estructura responde a la siguiente notación:

SI condición Instrucción 1 Instrucción 2 Instrucción 3 .................... Instrucción N FIN DE SI

Page 74: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 74 ___________________________________________

Al ejecutar el programa, cuando se llega a este punto condicional, nuestro microprocesador comprobará si se cumple la condición. Si la respuesta es positiva se ejecutan las instrucciones pertenecientes al condicional SI (Instrucción 1, Instrucción 2, ..., Instrucción N) y a continuación prosigue con el resto del programa que exista después de FIN DE SI. En caso de que no se cumpla la condición, no se ejecutarán las instrucciones del condicional SI y el microprocesador continuará la ejecución del programa que sigue a FIN DE SI. (Debemos recordar ahora algunas de las instrucciones del 8085 y fijarnos que la comprobación de la condición por parte del microprocesador está basada en la inspección de los flags o señalizadores). En ocasiones se necesita no solo elegir si vamos a desarrollar un proceso o no, sino que deseamos realizar un proceso u otro según una determinada condición. Es decir, estamos ante estructuras que nos permiten elegir entre dos procesos distintos. Dichas acciones responden a la siguiente notación: SI condición Instrucción 1 Instrucción 2 .................... Instrucción N SI NO Instrucción N+1 Instrucción N+2 ...................... Instrucción 2N FIN DE SI Cuando se alcanza este condicional, el microprocesador comprueba la condición y en caso de que se cumpla ejecuta Instrucción 1, Instrucción 2, ..., Instrucción N, y a continuación pasan a ejecutarse las instrucciones del programa que van después de FIN DE SI. En caso de que la condición no se cumpla, se ejecutarán Instrucción N+1, Instrucción N+2, ..., Instrucción 2N, y a continuación las instrucciones que van después de FIN DE SI. Estas situaciones condicionales (tomas de decisión) pueden estar anidadas, es decir, entre las instrucciones que hay dentro de estos lazos, puede haber otras instrucciones de tomas de decisión, obteniendo estructuras cada vez más complejas, pero que nos proporcionan mayor flexibilidad, del tipo: SI condicion1 Instrucción 1 Instrucción 2 SI condición2 Instrucción a Instrucción b Instrucción c FIN DE SI SI NO Instrucción 3 Instrucción 4 FIN DE SI Los bucles: También denominados ciclos, son estructuras que nos permiten la ejecución de una serie de instrucciones un determinado número de veces que depende del estado o condición inicial. Los bucles constituyen lo que llamaremos composiciones iterativas. Están compuestos básicamente por una condición inicial y el cuerpo del bucle, respondiendo a la siguiente notación: MIENTRAS condición Instrucción 1 Instrucción 2 ..................... Instrucción N FIN DE MIENTRAS

Page 75: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

Cuando nos encontremos ante una estructura de este tipo, si se cumple la condición inicial, se ejecutará el cuerpo del bucle (Instrucción 1, Instrucción 2, ..., Instrucción N) hasta que deje de cumplirse la condición, momento en el que pasarán a ejecutarse las instrucciones que van después de FIN DE MIENTRAS. Si la condición inicial no se cumple no se entra en el ciclo y se continúa después de FIN DE MIENTRAS. Debe tenerse especial cuidado en que después de un determinado número de iteraciones la condición deje de cumplirse, de otro modo entraríamos en un bucle sin fin. Las condiciones de los bucles, normalmente se establecen mediante contadores que son variables que contienen números enteros y que, en el interior del cuerpo del bucle, son incrementadas o decrementadas de forma constante en cada iteración que se realiza.

aac

poeliss

c

cdela

.

5.3 LAS ESTRUCTURAS DE DATOS

______________________________________ 75 ___________________________________________

Hasta el momento hemos visto algunos aspectos de las herramientas disponibles para desarrollar lgoritmos. Sin embargo cuando se presenta la necesidad de manejar un elevado número de datos, es preciso gruparlos y organizarlos atendiendo a unas características concretas que sean comunes a todos ellos, onstituyendo de este modo las estructuras de datos.

La estructura más sencilla y con la que trabajaremos nosotros es el array unidimensional, constituido

or un conjunto de datos de idénticas propiedades, colocados por un orden dentro de un conjunto. El lugar que cupan dentro de ese conjunto o array es señalado o marcado por la variable índice que puede tomar valores nteros de tal forma que apunte desde el primer dato al último del array. Por tanto un array (también llamado sta) estará representado por un nombre y un índice que apunta a todos los elementos del array. Un elemento erá señalado por el nombre del array seguido del lugar que ocupa, es decir, del índice. Por ejemplo VALOR(3) e refiere al elemento 3 del array que lleva el nombre de VALOR.

Para recorrer un array debemos conocer con anterioridad el número total de elementos que lo

omponen y emplear un ciclo de repetición que responda a la estructura siguiente: REPETIR DESDE I=1 HASTA N Instrucción 1 Instrucción 2 ..................... Instrucción x FIN DE REPETIR DESDE

Además del array unidimensional, podemos hacer referencia también al array bidimensional, que esta ompuesto por un conjunto de datos homogéneos señalados por dos índices. Podremos asimilar los elementos e un array bidimensional a los elementos de una tabla que disponga de varias filas y varias columnas, es decir, l número de elementos será (filas x columnas). Por tanto para referirse a un elemento situado en la fila f y en columna c, emplearemos la expresión NOMBRE(f,c).

Page 76: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 76 ___________________________________________

Emplear para la construcción de algoritmos, los diagramas de flujo, puede resultar muy ilustrativo, incluso podría decirse que hasta conveniente. Sin embargo hay que tener en cuenta que para determinadas cuestiones o bien cuando intentamos abordar la construcción de algoritmos complejos, el método de los diagramas de flujo pueden incluso resultar comprometedores en el sentido de llevarnos a más confusión y añadir cierta rigidez en los diseños.

Por este motivo no se procederá aquí a un estudio pormenorizado del empleo de los diagramas de

flujo, aunque intentaremos siempre incluir junto a nuestros desarrollos de pseudocódigo, el diagrama de flujo correspondiente, de forma que pueda verse el efecto ilustrativo de los mismos.

Los diagramas de flujo estarán constituidos por una serie de símbolos, en los que se indicará la función

que desempeñan. Estos símbolos que están representados en la FIG.54A en su mayoría, van unidos entre sí por flechas que nos indican el sentido en que se desarrolla el programa. Sobre ellas podemos hacer las anotaciones que consideremos precisas.

A continuación se indica el significado de cada uno de los símbolos representados en la mencionada figura:

• S1 Representa un proceso a ejecutar. • S2 Almacenamiento de datos interno. • S3 Es un conector empleado para cambiar de página. • S4 Proceso alternativo. • S5 Indicador de comienzo o fin.

S1 S2 S3

S4 S5 S6

S7 S8 S9

S10 S11 S12

S13 S14 S15

FIG.54A

5.4 LOS DIAGRAMAS DE FLUJO.

Page 77: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

• S6 Datos almacenados. • S7 Toma de decisión. • S8 Entrada de datos manual. • S9 Producir un retraso. • S10 Datos. • S11 Operación realizada manualmente. • S12 Operación lógica Y. • S13 Acceso a un proceso ya definido. • S14 Conector de diagrama de flujo. • S15 Operación lógica O.

hcp

r

pdnedc

pn

.

5.5 EJEMPLOS DE ALGORITMOS

______________________________________ 77 ___________________________________________

Ahora desarrollaremos algunos algoritmos sencillos, que nos permitirán llevar a la práctica las normas asta ahora apuntadas. Estos algoritmos desarrollados a través de pseudocódigo serán complementados con sus orrespondientes diagramas de flujo. Debemos decir que éstos no son imprescindibles en la confección de rogramas.

Ejemplo 1.- Leer un número de una dirección determinada y si es mayor que 12 cargarlo en un

egistro. En primer lugar debemos analizar el problema detenidamente hasta entenderlo de forma correcta y

oder así realizar las especificaciones y acotaciones que consideremos oportunas. Se hace referencia a una irección de memoria, por tanto se trata de un byte que contiene el Dato buscado. Se supone que buscamos un úmero positivo (no dicen nada en contra). Y además añadimos que la dirección de memoria en la que se ncuentra el Dato, la tenemos en el registro par HL. Además, podemos intuir que se trata de una toma de ecisión sencilla ya que establece una acción a ejecutar si se cumple una condición determinada y en caso ontrario no se debe hacer nada.

El algoritmo puede ser de la forma:

NOMBRE: MAYOR12 FUNCION: Leer dato memoria y almacenarlo en registro si es mayor que 12. PRECONDICIONES: HL = Dirección de memoria. POSTCONDICIONES: Resultado en el registro B.

Leer Dato de la memoria SI Dato > 12 B = Dato FIN DE SI

Fin del Programa

A continuación se muestra en la FIG.55A el diagrama de flujo correspondiente, en el que podemos ver aso a paso la ejecución del pseudocódigo. Para el seguimiento de dicho diagrama de flujo no se requiere inguna indicación especial.

Page 78: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 78 ___________________________________________

Ejemplo 2.- Leer un número de una dirección de memoria determinada, si es mayor que 12 cargarlo en el registro B y en caso contrario cargarlo en el registro C. Debemos hacer un análisis de principio similar al anterior, estableciendo consideraciones similares resultando en este caso el siguiente pseudocódigo: NOMBRE: MENOR12 FUNCION: Leer dato memoria y almacenarlo en B (>12) o en C PRECONDICIONES: HL = Dirección memoria, B=0, C=0 POSTCONDICIONES: Dato en B o en C Leer Dato de la memoria SI Dato > 12 B = Dato SI NO C = Dato FIN DE SI Fin del Programa A continuación se muestra el diagrama de flujo correspondiente a este pseudocódigo, FIG.55B, donde se puede comprobar el desarrollo del programa.

INICIO

Leer Dato memoria (HL)

Dato>12

B=Dato

FIN

Si

No

FIG.55A

Page 79: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 79 ___________________________________________

Ejemplo 3.- Convertir un byte decimal en ASCII

Para desarrollar este ejemplo, analizamos como siempre todos los datos que nos proporcionan en el enunciado. Vemos que en principio nos piden una conversión de código sin imponernos ningún tipo de restricción ni condicionamiento adicional. Como sabemos, los dígitos decimales son 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9 siendo su representación en binario realizada con 4 bits. Como en cada byte disponemos de 8 bits, suponemos que el byte decimal contiene dos dígitos decimales, el primero en los cuatro bits menos significativos y el segundo en los cuatro bits más significativos. Por consiguiente, tendremos que separar el byte en dos partes para tratarlas independientemente y construir las equivalencias a código ASCII de cada una de ellas. Como las representaciones ASCII se realizan con palabras de ocho bits, el resultado será obtenido en dos bytes. Supondremos que el byte que contiene el dato decimal, se encuentra en una dirección de memoria determinada, a la que apunta el valor asignado a DIREDAT. Además, almacenaremos el resultado también en memoria a partir de la dirección señalada por DIRERES. Si observamos los códigos binarios de los dígitos decimales y sus equivalentes ASCII (ver la tabla de equivalencias que a continuación se presenta), notaremos que únicamente se diferencian en los cuatro bits más significativos. DIGITO BINARIO ASCII 0 0000 0011 0000 1 0001 0011 0001 2 0010 0011 0010 3 0011 0011 0011 4 0100 0011 0100 5 0101 0011 0101 6 0110 0011 0110 7 0111 0011 0111 8 1000 0011 1000 9 1001 0011 1001

INICIO

Leer Dato memoria (HL)

Dato>12

B=Dato

FIN

Si

No

FIG.55B

C=Dato

Page 80: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 80 ___________________________________________

No tendremos más que, dejar los cuatro bits que representan la cifra decimal, en la parte baja del nuevo byte a construir y en la parte alta de dicho byte situar el código 0011, para que automáticamente se obtenga el equivalente ASCII buscado. Basándose en estas consideraciones previas obtendremos el pseudocódigo siguiente:

NOMBRE: ASCII1 FUNCION: Convertir byte decimal a ASCII PRECONDICIONES: DIREDAT = Dirección Dato

DIRERES = Dirección resultado POSTCONDICIONES: Resultado en DIRERES y DIRERES+1 Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits menos significativos de DATO Intercambiar los 4 bits de mayor peso con los 4 de menor peso del Dato Agregar 0011 a la parte alta del Dato Guardar Dato en memoria apuntada por DIRERES Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits más significativos de Dato Agregar 0011 a la parte alta del Dato Guardar Dato en memoria apuntada por DIRERES+1 Fin del Programa A continuación se muestra en la FIG.55C, el diagrama de flujo correspondiente a este ejercicio. En él pueden apreciarse con claridad la forma de llevar a cabo todas las operaciones de modo secuencial. Suele ser corriente expresar varias operaciones dentro de un mismo bloque de operación. (Como vemos, cuando en el diagrama de flujo no se hace referencia a DIREDAT sino al registro par HL, se está haciendo la equivalencia HL=DIREDAT)

INICIO

Leer Dato Memoria (HL)

Dato=XXXX 0000

Dato=0000 XXXX

Dato=0011 XXXX

Guardar Dato en DIRERES

Leer Dato Memoria (HL)

Dato=0000 YYYY

Dato=0011 YYYY

Guardar Dato en DIRERES+1

FIN

FIG.55C

Page 81: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 81 ___________________________________________

Ejemplo 4.- Convertir un byte hexadecimal a ASCII. En este ejercicio se nos plantea un simple proceso de conversión a código ASCII, de un valor escrito

en un byte según el código hexadecimal. Puesto que las representaciones en hexadecimal se realizan con los símbolos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F, siendo sus equivalentes binarios obtenidos con cuatro bits, suponemos que en un byte hexadecimal están contenidos dos dígitos hexadecimales. Será por tanto, preciso separar el byte del Dato en dos partes (parte más significativa y parte menos significativa) y buscar la representación ASCII de cada una de ellas.

Supondremos además que el byte que contiene el dato pertenece a una dirección de memoria apuntada

por DIREDAT. Y la solución pedida, es decir, los dos caracteres ASCII pedidos, serán almacenados en la memoria en las direcciones señaladas por DIRERES y DIRERES+1.

Por tratarse de valores hexadecimales, para efectuar la conversión a ASCII, tendremos que añadir

0011 0000B si se trata de un valor menor que 10, o bien añadir 0011 0111B si se trata de un valor mayor o igual que 10.

Teniendo en cuenta todas estas consideraciones, podemos obtener el siguiente pseudocódigo, que nos

llevará a obtener el resultado pedido. NOMBRE: ASCII2

FUNCION: Convertir byte hexadecimal a ASCII PRECONDICIONES: DIREDAT = Dirección Dato

DIRERES = Dirección resultado POSTCONDICIONES: Resultado en DIRERES y DIRERES+1 Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits menos significativos de DATO Intercambiar los 4 bits de mayor peso con los 4 de menor peso del Dato Ir a ASCII Guardar Dato en memoria apuntada por DIRERES Leer Dato de la memoria apuntada por DIREDAT Poner a cero los 4 bits más significativos de Dato Ir a ASCII Guardar Dato en memoria apuntada por DIRERES+1 Fin del Programa

NOMBRE: ASCII FUNCION: Calcula el equivalente ASCII PRECONDICIONES: Dato está disponible POSTCONDICIONES: Dato = Valor en ASCII SI Dato<10 Dato=Dato+30H SI NO Dato=Dato+37H FIN DE SI

Volver A continuación se muestra el diagrama de flujo correspondiente al pseudocódigo propuesto

(FIG.55D). En él, destacan las llamadas a la subrutina ASCII, que se realizan en dos ocasiones.

Page 82: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 82 ___________________________________________

Ejemplo 5.- Llenar una zona de memoria RAM con el mismo dato. La tarea que debemos resolver en este caso, consiste en llenar una zona de la memoria RAM con un

mismo Dato. Puesto que no nos indican nada acerca de los límites de la zona a tratar, nosotros supondremos que el principio de la misma viene señalado por PRIRAM. Del mismo modo, supondremos que el número de elementos de la RAM a tratar está marcado por NUMDAT.

Hechas estas consideraciones iniciales, debemos fijarnos que tendremos que realizar un bucle que se

repita un determinado número de veces y mediante el cual realicemos las operaciones de almacenaje adecuadas. Para ello, tendremos que emplear un contador que nos señale el final del bucle y nos permita abandonar o finalizar el programa. Teniendo en cuenta todo lo anterior se desarrolla el siguiente pseudocódigo:

NOMBRE: LLENARAM

FUNCION: Almacenar en una zona de RAM el mismo Dato PRECONDICIONES: Conocemos PRIRAM, NUMDAT y Dato POSTCONDICIONES: Zona de RAM con mismo Dato

Tomar Dato a almacenar Iniciar Contador = NUMDAT Apuntar al principio de la zona de RAM (PRIRAM) MIENTRAS Contador>0 Almacenar Dato en RAM Apuntar a la siguiente dirección de RAM Decrementar Contador FIN DE MIENTRAS Fin de Programa

INICIO

Leer Dato Memoria (HL)

Dato=XXXX 0000

Dato=0000 XXXX

Ir a ASCII

Guardar Dato en DIRERES

Leer Dato Memoria (HL)

Dato=0000 YYYY

Ir a ASCII

Guardar Dato en DIRERES+1

FIN

FIG.55D

ASCII

INICIO

Dato<10

Volver

Si No

Dato=Dato+30H

Dato=Dato+37H

SALT

1

Page 83: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 83 ___________________________________________

A continuación se presenta, como en los ejercicios anteriores, el diagrama de flujo, que nos puede orientar sobre el desarrollo del programa. (FIG.55E).

Ejemplo 6.- Realizar una suma decimal de varios dígitos. Con este ejercicio se llevará a cabo la suma de dos números decimales de varias cifras. Puesto que no

nos dicen nada en el enunciado, supondremos que se trata de números de ocho cifras. Los números a sumar (los sumandos) se encuentran almacenados en la memoria RAM expresados según el sistema decimal (BCD). Puesto que en cada byte disponemos de ocho bits, podemos tener representadas dos cifras decimales en cada byte, por lo que para completar las ocho cifras de cada número se necesitarán cuatro bytes por número.

La dirección donde se encuentra almacenado el primer byte del primer sumando, vendrá dada por

SUM1 y el resto en direcciones consecutivas. La dirección del primer byte del segundo sumando, estará dada por SUM2 y el resto en direcciones consecutivas. El resultado de la operación será almacenado en las direcciones del primer sumando, por tanto, éste se perderá.

Necesitamos desarrollar un bucle que sume los cuatro bytes representativos de cada número. Para

realizar este proceso, es preciso iniciar un Contador que nos permita establecer el final del bucle. El pseudocódigo propuesto es el siguiente: NOMBRE: SUMA

FUNCION: Suma dos números decimales de 8 cifras cada uno PRECONDICIONES: Primer sumando en SUM1

Segundo sumando en SUM2 POSTCONDICIONES: El resultado se almacena en lugar de SUM1

INICIO

Tomar Dato a almacenar

Contador = NUMDAT

Apuntar a dirección de RAM (PRIRAM)

Contador > 0

Si

No

FINAlmacenar Dato

Incrementar dirección de RAM

Contador = Contador - 1

FIG.55E

Page 84: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 84 ___________________________________________

Apuntar a SUM1 Apuntar a SUM2 Iniciar Contador = 4 MIENTRAS Contador > 0 Sumar bytes SUM1+SUM2 Ajuste decimal Guardar resultado en SUM1

Apuntar a SUM1+1 Apuntar a SUM2+1 Contador = Contador – 1 FIN DE MIENTRAS Fin del Programa En la FIG.55F se representa el diagrama de flujo correspondiente a este pseudocódigo y en él puede

apreciarse el desarrollo o flujo de las órdenes a ejecutar por la computadora o sistema.

INICIO

Apuntar a SUM1Apuntar a SUM2

Contador = 4

Contador > 0

FIN

No

Si

Sumar SUM1+SUM2

Ajuste decimal

Almacenar resultado en SUM1

Apuntar a SUM1+1Apuntar a SUM2+1

Contador = Contador - 1

FIG.55F

Page 85: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 85 ___________________________________________

Ejemplo 7.- Desarrollar una temporización. En este caso nos piden desarrollar una subrutina o un programa de temporización. No se nos indica

cuánto tiempo se debe permanecer en este estado, por lo que será una característica que impondremos nosotros. Tampoco se dice nada acerca de qué debe hacer el microprocesador durante ese tiempo.

El programa básicamente consistirá en desarrollar un bucle o ciclo que se repita durante un tiempo, o

un determinado número de veces, y en el que el microprocesador “no haga nada”. Es decir, estableceremos un tiempo de espera. Como se ha hecho en otras ocasiones se establecerá un Contador que nos señale el final del bucle y por tanto el final del tiempo de espera.

Según las condiciones expresadas, tendremos el siguiente pseudocódigo: NOMBRE: TEMPORIZ

FUNCION: Realiza un tiempo de espera PRECONDICIONES: Conocemos el dato del Contador POSTCONDICIONES: Ninguna

Iniciar el Contador MIENTRAS Contador > 0 No hacer nada Decrementar Contador FIN DE MIENTRAS Final del Programa En la FIG.55G se muestra el diagrama de flujo.

INICIO

Iniciar Contador

Contador > 0

Si

No

FINNo hacer nada

Contador = Contador - 1

FIG.55G

Page 86: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 86 ___________________________________________

Ejemplo 8.- Mover un bloque de memoria RAM. En este ejercicio se llevará a cabo la traslación de un bloque o conjunto de datos almacenados en una

zona de memoria RAM, que llamaremos zona ORIGEN, hacia otra zona de memoria RAM que llamaremos zona DESTINO. Los datos de la zona ORIGEN, deben ser trasladados y situados en el mismo orden. Los datos que se encuentren almacenados en la zona DESTINO, se perderán.

Debemos tener en cuenta que existe la posibilidad de que las zonas ORIGEN y DESTINO se

encuentren superpuestas. Esto planteará un problema añadido que debe ser resuelto, de lo contrario, podrían perderse determinados datos de la zona ORIGEN. Para ello tendremos que conocer de forma precisa el número de elementos de la zona ORIGEN que deseamos mover. A este número le llamaremos NUM.

Con estos tres valores, ORIGEN, DESTINO y NUM, podremos saber si existe superposición o no.

Para ello calcularemos la diferencia entre DESTINO y ORIGEN, para después compararla con NUM. Si no existe este problema, se procederá a mover datos de la zona ORIGEN a la zona DESTINO hasta completar el proceso. En caso de que sí exista superposición se cambiarán los punteros de ORIGEN y DESTINO a las posiciones finales de sus respectivas zonas para comenzar a mover los datos partiendo del final hacia el principio hasta completar todos el proceso.

Debemos considerar además la posibilidad de que las posiciones de ORIGEN y DESTINO coincidan,

en este caso daremos por finalizado el proceso ya que no será necesario mover ningún dato. El pseudocódigo que debemos plantear puede ser el siguiente: NOMBRE: MOVERDAT

FUNCION: Traslada datos de una zona de RAM a otra zona de RAM PRECONDICIONES: Conocemos ORIGEN, DESTINO y NUM POSTCONDICIONES: Datos cambiados de ORIGEN a DESTINO Datos iniciales de DESTINO perdidos

Apuntar a ORIGEN Apuntar a DESTINO Contador = NUM SI Contador = 0 Final del Programa FIN DE SI SI DESTINO = ORIGEN Final del Programa FIN DE SI Diferencia entre DESTINO y ORIGEN Comparar Diferencia con NUM SI no hay superposición MIENTRAS Contador > 0 Leer Dato de ORIGEN Almacenar Dato en DESTINO ORIGEN = ORIGEN + 1 DESTINO = DESTINO + 1 Contador = Contador – 1 FIN DE MIENTRAS Final del Programa FIN DE SI ORIGEN = ORIGEN + NUM DESTINO = DESTINO + NUM MIENTRAS Contador > 0 ORIGEN = ORIGEN – 1 DESTINO = DESTINO – 1 Leer Dato de ORIGEN Almacenar Dato en DESTINO Contador = Contador –1 FIN DE MIENTRAS Final del Programa

Page 87: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 87 ___________________________________________

A continuación se muestra el diagrama de flujo correspondiente FIG.55H

INICIO

Apuntar a ORIGENApuntar a DESTINO

Contador = NUM

Contador = 0Si

No

ORIGEN=DESTINOSi

No

Diferencia entre DESTINO y ORIGENComparar Diferencia con NUM

Superposición NoSi

Contador > 0Si

No

Leer Dato de ORIGENAlmacenar Dato en DESTINO

ORIGEN=ORIGEN+1DESTINO=DESTINO+1

Contador=Contador-1

ORIGEN=ORIGEN+NUMDESTINO=DESTINO+NUM

Contador>0 No

Si

ORIGEN=ORIGEN-1DESTINO=RESTINO-1

Leer Dato de ORIGENAlmacenar Dato en DESTINO

Contador=Contador-1 FIN

FIG.55H

Page 88: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1 2 3 4 5 6 7 8 9

1

1

1

5.5 EJERCICIOS.

______________________________________ 88 ___________________________________________

. Definir el algoritmo. Elementos que lo componen. Características de los algoritmos.

. ¿Cuáles pueden ser las principales características de un buen algoritmo?.

. Definir las distintas acciones del pseudocódigo.

. Los diagramas de flujo. Dibuja los símbolos que recuerdes indicando su significado.

. ¿Qué son las precondiciones y las postcondiciones?.

. Expresar la estructura básica de un algoritmo.

. ¿Qué son las estructuras de datos?.

. Definir las decisiones y los bucles mostrando sus estructuras.

. Modificar el Ejemplo 1 desarrollado en este tema, de modo que el dato leído quede almacenado en una dirección de memoria, en el caso de que sea menor que 12.

0. Diseñar un algoritmo que almacene los números consecutivos del 0 al 9 a partir de la dirección 8000H hacia arriba.

1. Diseñar un algoritmo que sume dos números almacenados en dos direcciones de memoria determinadas y guarde el resultado en otra dirección de la RAM.

2. Diseñar los diagramas de flujo correspondientes a los dos ejercicios anteriores.

Page 89: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 89 ___________________________________________

DESARROLLOS DE PROGRAMAS BASICOS.

6

Page 90: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

perdc

pp

elo

teo

pcpmdcpce

rse

me

.

6. DESARROLLO DE PROGRAMAS BÁSICOS

Por todo lo expuesto hasta el momento, sabemos que para poder llevar a cabo el desarrollo de rogramas de aplicación, es decir, programas que cargados en la memoria del sistema realicen una tarea specífica y particular, será preciso planificar dicho desarrollo de forma estructurada, empleando el máximo de ecursos disponibles a nuestro alcance, como diagramas de flujo, etc. Además debemos emplear para ello eterminados programas llamados de desarrollo que sirven para construir los programas de aplicación, orregirlos y ejecutarlos. Nosotros emplearemos para confeccionar nuestros programas el “ensamblador”.

Debemos tener en cuenta además, como punto muy importante y que nunca debemos olvidar, que los

rogramas de aplicación que construyamos, deben ir acompañados siempre de la máxima documentación osible, este es un punto de considerable importancia.

Además sabemos que en las aplicaciones de sistemas basados en microprocesadores, la integración

ntre software y hardware debe ser total, por lo que para poder realizar nuestros programas, debemos conocer más profundamente posible todos los componentes de nuestro sistema, sus direcciones, capacidades, etc.

En nuestro caso los programas son desarrollados para el sistema cuyo hardware se ha diseñado en

mas anteriores, aunque será muy sencillo realizar las modificaciones que fueran necesarias para trasladarlo a tro sistema basado en el mismo microprocesador.

.

6.1 EL LENGUAJE ENSAMBLADOR

______________________________________ 90 ___________________________________________

Como ya se ha mencionado en varias ocasiones, resulta muy problemático tener que desarrollar rogramas directamente en hexadecimal e incluso en binario dado que el código máquina es muy propicio para ometer errores y dificulta el desarrollo de programas. Por esto, surgen los programas ensambladores, que nos roporcionan un nivel superior de programación. Son programas simbólicos que emplean código nemotécnico para referirse a las instrucciones y permiten la utilización de nombres simbólicos para señalar

irecciones de memoria, constantes, etc. Una vez construido el programa el ensamblador lo convertirá en ódigo máquina (binario) ejecutable por el microprocesador. Además el ensamblador, permite la división de un rograma en módulos, que nos facilitarán considerablemente la creación de programas cada vez más omplejos. También será posible la detección de errores en la sintaxis del programa, aunque no se detectan rrores lógicos.

El programa que se escribe en ensamblador recibe el nombre de “programa fuente” y su escritura se

ealiza mediante un editor de textos. Los programas ensambladores suelen disponer de su propio editor, de no er así, podremos emplear el editor del sistema operativo MS-DOS. Todos los programas fuente deben llevar la xtensión “ASM”.

Cuando el ensamblador traduce los mnemónicos del programa fuente a valores binarios (código

áquina), se obtiene el “programa objeto” que podrá ser ejecutado por el microprocesador una vez almacenado n la memoria del sistema. Todos los programas objeto deben llevar la extensión “OBJ”.

Page 91: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 91 ___________________________________________

También debemos indicar que se pueden desarrollar varios ficheros constituidos por diferentes módulos de programas objetos que posteriormente serán unidos entre sí para formar el programa completo. Esta función de unión de módulos la realizan el programa “enlazador” o “linker”, que es otra utilidad del ensamblador. El proceso fundamental de la programación, requiere llevar a cabo una serie de pasos organizados, que nos hagan llegar a una solución correcta del problema planteado. Estos pasos o fases, pueden resumirse en:

• Definición, estudio y comprensión del problema que se afronta. • Encontrar un algoritmo que nos resuelva el problema, establecer las estructuras de datos, las

entradas necesarias, el flujo de control y las salidas deseadas.

• Codificar el algoritmo anterior en función del lenguaje empleado, en este caso el ensamblador. Es conveniente expresar de forma muy clara la diferencia entre el grupo de instrucciones y los bloques de datos que se vayan a emplear.

• Corregir y verificar el programa, para lo cual podemos servirnos de las ayudas que nos

proporciona el ensamblador.

• Realizar una prueba que nos permita afirmar que el programa responde de forma adecuada a lo requerido en la definición del problema.

• Documentar de forma adecuada cada trabajo realizado. Este paso es muy importante, debe tenerse

en cuenta que cuanta más información sea aportada junto al programa más fácil resultará en el transcurso del tiempo poder realizar alguna modificación o reforma si fuera preciso.

Evidentemente son aquellas que ejecuta el microprocesador, pero expresadas según su representación simbólica. Como sabemos cada ensamblador posee unas características propias que lo diferencian del resto, aunque todos son muy parecidos entre sí. Nosotros, emplearemos el “2500 A.D. 8085 CROSS ASSEMBLER FOR MSDOS/CPM 86”, que empleará en su ejecución las extensiones de los siguientes ficheros:

ASM Entrada del ensamblador (programa fuente). OBJ Salida del ensamblador (programa objeto). LST Fichero que contiene el listado. OBJ Fichero de entrada del enlazador. TSK Salida del Link1. HEX Salida del Link2. El ensamblador posee además una serie de comandos, activos durante el proceso de ensamblado, que

nos permiten actuar sobre el mismo pudiendo detener el proceso, finalizar el proceso, mostrar los datos en pantalla o sacarlos en impresora, llevar los datos a un disco, etc.

6.2 LAS INSTRUCCIONES EJECUTABLES EN ENSAMBLADOR.

Page 92: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 92 ___________________________________________

Para llamar al ensamblador, se creará un programa fuente (con extensión ASM) compuesto por una serie de líneas, cada una de las cuales contendrá una sola sentencia. Cada línea estará compuesta de los siguientes campos: 1. Campo de etiqueta.- Es únicamente de carácter identificativo. Puede utilizarse si es necesario o podemos

dejarlo en blanco en caso contrario. El empleo de etiquetas proporciona gran comodidad para hacer referencia a determinadas zonas del programa. Las etiquetas pueden tener cualquier número de caracteres, aunque solo serán tenidos en cuenta los 8 primeros. Deben situarse al principio de la línea en la columna 1 y su nombre debe comenzar por una letra aunque también puede llevar números. Al final de la etiqueta debemos colocar dos puntos (:). Es importante asignar a las etiquetas nombres significativos que nos identifiquen determinadas partes del programa por sí mismos.

2. Campo de código.- A continuación de la etiqueta, se sitúa el código de la instrucción, en este caso el

mnemónico de la instrucción que se desea ejecutar. Este campo es de uso obligatorio, siempre debe haber un mnemónico en él.

3. Campo de operandos.- Aparece a continuación del campo de código y su sintáxis varia según la instrucción

que se emplee. Puede llevar uno o más operandos y en este caso irán separados por una coma (,). Se sitúa en primer lugar el operando destino y el operando origen en segundo lugar. También pueden ser expresados mediante nombres simbólicos, nombres de registros, valores numéricos, expresiones aritméticas, etc. Los operadores disponibles en el ensamblador para expresar operaciones son entre otros:

+ Suma - Resta * Multiplicación / División ** Potenciación .NOT. Complementación .MOD. .SHR. Desplazamiento a la derecha .SHL. Desplazamiento a la izquierda .AND. Operación lógica AND .OR. Operación lógica OR .XOR. Operación exclusiva OR .EQ. Igual .GT. Mayor que .LT. Menor que

4. Campo de comentario.- Se sitúa después del campo de operandos. No es obligatoria su utilización, es decir,

podemos dejarlo en blanco. Su función es exclusivamente informativa. Debe comenzar con el símbolo punto y coma (;) seguido del comentario que se desee. Los comentarios no formarán parte del código objeto que proporcionará el ensamblador, sin embargo pueden ser muy útiles cuando intentemos modificar un programa que ya ha sido escrito hace algún tiempo o bien ha sido escrito por otra persona. (Todas las aclaraciones acerca del funcionamiento de un programa son siempre positivas y bien recibidas por la persona encargada de revisarlo).

Además de las líneas de instrucciones ejecutables, en ensamblador son muy empleadas las líneas

completas para comentarios, que comienzan necesariamente por el símbolo punto y coma (;) y normalmente son situadas al principio del programa o al principio de cada módulo o subrutina. Nosotros emplearemos estas líneas para documentar nuestras subrutinas y programas, incluyendo en ellas el nombre, función, precondiciones, etc.

El final del programa debe estar marcado siempre mediante la instrucción especial del lenguaje

ensamblador (pseudoinstrucción o también llamada directiva de ensamblador) END. Por todo esto, nuestros programas en ensamblador estarán constituidos en principio bajo la siguiente

estructura:

Page 93: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

; NOMBRE: ; FUNCION: ; PRECONDICIONES: ; POSTCONDICIONES: ETIQUETA INSTRUCCIÓN OPERANDOS COMENTARIOS Instrucción 1 Instrucción 2 Instrucción 3 ..................... ..................... ..................... END

trlepostr

O inphe E v N Edplup

.

6.3 LAS DIRECTIVAS EN ENSAMBLADOR

______________________________________ 93 ___________________________________________

Además de las instrucciones básicas, propias de cada microprocesador (en este caso el 8085) que son ansformadas por el ensamblador en lenguaje máquina, hay otro tipo de instrucciones, disponibles en el nguaje ensamblador y denominadas “directivas de ensamblador” o también pseudoinstrucciones, que sirven ara facilitar las tareas de programación, pero que no son tenidas en cuenta por el ensamblador para la btención del código máquina. Por tanto las directivas no formaran parte del código objeto. Puede decirse que u misión principal es indicar al programa ensamblador cómo deseamos que lleve a cabo las tareas de aducción del programa fuente para obtener el programa objeto.

Entre las directivas más importantes pueden destacarse:

RG X1

Nos marca la posición inicial de memoria (mediante X1) a partir de la cual deseamos cargar las strucciones y los datos que podamos establecer a continuación. Esta directiva consta de dos partes

erfectamente diferenciadas, el código mnemotécnico (ORG) y un valor numérico (X1) normalmente en exadecimal o una expresión que representa la dirección de comienzo. Si no empleamos esta directiva, el nsamblador situará el programa a partir de la dirección 0000H, que es la dirección establecida por defecto.

ND

Marca el final del programa fuente. Debe colocarse siempre al final del programa y puede incluir un alor que señale al inicio de ejecución del programa. El empleo de esta directiva es obligatorio.

ombre EQU X2

Esta pseudoinstrucción sirve para establecer la igualdad entre un Nombre y un valor numérico (X2). s una directiva de asignación que nos dará la posibilidad de poder emplear dicho Nombre en cualquier punto el programa donde deba ser utilizado. Estos nombres son llamados “constantes de ensamblado” y nos roporcionan la posibilidad de cambiar el valor de dicha constante en una única posición del programa (en su gar de definición) sin necesidad de tener que recorrer todo el programa cambiando dicho valor en todos los

untos donde se utilice.

Page 94: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 94 ___________________________________________

La directiva EQU debe ir precedida del Nombre de la constante y seguida del valor que deseamos asignar a dicha constante. El valor asignado a una constante de ensamblado, no puede cambiar a lo largo del desarrollo del programa y por tanto, será el mismo durante todo el proceso de ensamblado. Nombre VAR X3 Esta directiva iguala el valor de X3 al Nombre que precede a la propia directiva VAR, sin embargo, puede cambiarse según se desee a lo largo del programa. Un Nombre definido como una variable no puede ser definido posteriormente por una directiva EQU. Nombre DB X4 Es una directiva del ensamblador mediante la cual podemos reservar espacio en la memoria de nuestro sistema para almacenar datos, y además cargar datos concretos en dichas posiciones de memoria. La directiva puede ir precedida de un Nombre y seguida de los valores que deseamos colocar en las posiciones de memoria, debidamente separados por el signo coma (,). Los valores a colocar pueden ser de cualquier tipo, tales como decimales, hexadecimales, ASCII, etc. Los valores ASCII deben ir colocados entre comillas. Nombre DW X5 Es una directiva que opera de forma similar a la directiva anterior DB, pero en esta ocasión se emplea para reservar espacio en memoria para palabras de dos bytes (16 bits). Por tanto los datos que se colocan después de una directiva DW serán palabras de dos bytes (por ejemplo 1234H) separados por comas. Se almacena en primer lugar el byte menos significativo de la palabra y a continuación el byte más significativo. Nombre LWORD X6 Trabaja exactamente igual que DB pero con palabras de una longitud de 32 bits (cuatro bytes). Por tanto esta directiva va precedida de un Nombre y seguida de palabras de cuatro bytes separadas por comas. Nombre ASCII X7 La directiva ASCII sirve para almacenar una cadena de caracteres ASCII en memoria. Esta directiva va precedida de un Nombre y seguida de una cadena de caracteres ASCII, al final de la cual se debe introducir un retorno de carro o el símbolo (:). Nombre DS X8 La directiva DS reserva en memoria el número de bytes especificados en la expresión X8. Los bytes reservados en la memoria del sistema contendrán a partir de ese momento el valor 00H. Nombre BLKW X9 Reserva el número de palabras especificadas por la expresión X9. Las palabras reservadas se cargan con el dato 00H (son puestas a cero) y la etiqueta Nombre es opcional. Además de todas estas pseudoinstrucciones enumeradas hasta el momento, existen otras que nos permiten las definiciones de “macros”, es decir, nos permiten crear funciones que se utilizan para ejecutar una serie de operaciones especificadas dentro de la macro, así como distintas directivas que no presentaremos aquí y que dependen básicamente del programa ensamblador empleado. El ensamblador nos ofrece como ayuda adicional la posibilidad de corregir una serie de errores de tipo sintáctico, cometidos al crear el programa fuente (.ASM). Aunque estas ayudas o indicaciones de errores dependen del programa ensamblador empleado, podemos señalar aquí algunas comunes a la gran mayoría de ellos: • Illegal Register Pair: Nos indica el empleo incorrecto o ilegal de un par de registros para una instrucción

determinada. Por ejemplo, la instrucción "ADD B,H" nos daría este error, ya que la forma correcta sería "ADD reg" que realiza la operación de suma entre el acumulador y el registro especificado (reg) guardando el resultado en el acumulador.

Page 95: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

• Multiply Defined Symbol: Nos indica que hemos escrito un símbolo (una etiqueta) en más de una ocasión con el mismo nombre.

• Illegal Mnemonic: Este mensaje de error se presenta cuando empleamos una instrucción (mnemónico) que no existe para el microprocesador, ni esta definido previamente en una macro.

• Hex # And Symbol Are Identical: Se produce cuando empleamos una etiqueta idéntica a un número expresado en hexadecimal. Por ejemplo

ABCH: NOP LXI H,ABCH • Undefined Symbol: Surge cuando en una instrucción se emplea una etiqueta que no ha sido previamente

definida y por tanto el ensamblador no la reconoce. • Illegal ASCII Designator: Nos indica que hemos intentado incluir un carácter ASCII y se ha cometido un

error de puntuación. Por ejemplo MVI A,"T´. • Attemped Division By Zero: Nos señala que ha encontrado una división en la que el divisor es cero y por

tanto es una operación ilegal. • Missing End Statement: Señala que el ensamblador no encuentra la directiva END que indica el final del

programa.

inpcp

ainep

ellcsins llrL R

.

6.4 LAS SUBRUTINAS

______________________________________ 95 ___________________________________________

Como sabemos, el lenguaje ensamblador ofrece además, la posibilidad de crear partes del programa dependientes, denominadas subrutinas, que podrán ser llamadas posteriormente desde cualquier parte del

rograma principal e incluso desde otra subrutina, mediante la instrucción CALL. De esta forma el programa ompleto estará constituido esencialmente por una serie de pequeños programas llamados subrutinas, que ueden ser llamadas en repetidas ocasiones, evitándonos por tanto, escribir código repetido.

Como se ha mencionado anteriormente, las subrutinas son pequeños programas y como tal debemos

portar a cada una de ellas la documentación o información suficiente para que puedan ser tratadas dependientemente, e incluso puedan ser empleadas en programas distintos. Por esto, las subrutinas llevarán el

ncabezamiento propio de un programa y requerirán el estudio detallado de todas las condiciones en que ueden ser ejecutadas, es decir, la estructura inicial de toda subrutina será:

;NOMBRE: ;FUNCION: ;PRECONDICIONES: ;POSTCONDICIONES:

A continuación comenzará el cuerpo de la subrutina propiamente dicho, que llevará al principio una tiqueta con el nombre de la subrutina, es decir, el parámetro que deberemos especificar en la instrucción de amada a subrutina CALL. Normalmente el nombre asignado a las subrutinas es suficientemente significativo omo para darnos una idea o sugerir la función que desarrollarán las mismas. A continuación de la etiqueta se itúan las instrucciones que componen la subrutina y finalmente es imprescindible concluir la subrutina con una strucción RET que devuelve el control del programa a la posición desde donde se efectuó la llamada CALL a

ubrutina.

Debemos recordar que además de la llamada CALL a subrutinas, disponemos también de otro tipo de amadas a subrutinas con condiciones como CC LABEL, CNC LABEL, CZ LABEL, etc. (que podemos ecordar revisando el tema 4) que efectuarán la llamada a la subrutina cuyo nombre venga especificado en ABEL si se cumple la condición que lleva implícita la instrucción que en cada caso se emplee.

También disponemos de varias instrucciones para salir de una subrutina, además de la instrucción ET. Estas instrucciones (que pueden analizarse en el tema 4) son entre otras RM, RNC, RNZ, RP, etc. y

Page 96: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 96 ___________________________________________

provocan el retorno de la subrutina si se cumple la condición que lleva implícita la instrucción empleada en cada caso concreto. En definitiva, una subrutina tendrá para nosotros la siguiente estructura: ;NOMBRE: ;FUNCION: ;PRECONDICIONES: ;POSTCONDICIONES: NOMBRE: Instrucción 1 Instrucción 2 Instrucción 3 .................... Instrucción N RET Las subrutinas deben ser vistas desde el programa principal como un bloque o una caja a la que se accede proporcionándole unos datos de entrada que llamaremos “parámetros de entrada” y después de ser ejecutada nos proporciona uno o más resultados. Hay varias formas de comunicarse con las subrutinas pasando y recibiendo datos, entre las que podemos destacar:

• El empleo de registros.- Su empleo está basado en la utilización de los registros del microprocesador libres para su uso en ese momento. Se almacenarán en ellos los datos que precise la subrutina para desarrollar su función y una vez ejecutada la subrutina, nos devolverá los resultados en los registros precisos. Este método está limitado por el bajo número de registros de que disponemos en el microprocesador 8085. Además se producen modificaciones en el contenido de los registros que deben ser tenidas en cuenta y en caso de que no nos interese modificarlos, tendremos que guardar previamente su contenido en la pila y recuperarlo al finalizar la subrutina.

• Empleo de memoria RAM.- En este caso el programa debe colocar en posiciones consecutivas de

la memoria RAM del sistema, todos los parámetros que necesite la subrutina para desarrollar su función. A continuación se llama a la subrutina, la cual busca en la RAM los parámetros introducidos para trabajar con ellos. Es importante tener en cuenta el orden en que se situaron dichos parámetros para no cometer errores en el tratamiento de los datos. Ejecutadas las tareas precisas por parte de la subrutina, nos devolverá los resultados en las mismas posiciones de memoria en que le pasamos los datos. El programa principal buscará ahora los resultados en la RAM para proseguir con su desarrollo normal.

Page 97: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

pp

de

efifiémnv

dd

im

d

dinp

.

6.5 EJEMPLOS DE SUBRUTINAS

______________________________________ 97 ___________________________________________

En este apartado se tratarán de desarrollar de la forma más precisa y clara, una serie de subrutinas que odrán ser utilizadas posteriormente en otros programas más amplios, sin más que tener en cuenta las recondiciones y las postcondiciones de las mismas.

Con ánimo de agilizar la construcción de varios ejemplos, nos limitaremos a adaptar los programas

esarrollados con pseudocódigo en el tema anterior, para lo cual deberemos convertirlos a lenguaje nsamblador y ajustarlos a las necesidades y capacidades de nuestro sistema básico.

Como veremos, cuando se realiza un programa fuente en ensamblador, es necesario colocarle la

xtensión ASM al nombre que deseemos asignarle y una vez que llamemos al ensamblador nos generará un chero con extensión OBJ que representa el código objeto correspondiente. Además también se genera un chero con extensión LST que representa el listado del programa. Este último, es el que se presentará aquí. En l podrán apreciarse con claridad los cuatro campos (etiqueta, código, operandos y comentarios) que se han encionado con anterioridad, pero además se nos muestra una primera columna en la que nos indican el

úmero de línea de código en que nos encontramos, seguida de la columna de direcciones y a continuación los alores hexadecimales generados durante el ensamblado, correspondientes a las instrucciones.

También podremos observar que todas las subrutinas aquí presentadas, se sitúan a partir de la

irección 0000H. Esto se ha hecho por comodidad, pero en realidad pueden situarse en cualquier otra posición e memoria que nos interese.

Para entender de una forma más clara y precisa el desarrollo y construcción de las subrutinas, es

portante compararlas con los desarrollos de pseudocódigo realizados en el tema anterior. Ejemplo 1.- Se desarrollará la subrutina correspondiente al ejemplo 1 del tema anterior y que

enominaremos también MAYOR12. Se inicia la subrutina guardando en la pila el contenido de los registros señalados por PSW, por lo que

ebemos tener la precaución de recuperar dichos datos antes de salir de ella mediante el empleo de la strucción RET. La última instrucción END sirve para indicar al ensamblador que se ha llegado al final del

rograma, pero no forma parte de la subrutina.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : MAYOR12.ASMOUTPUT FILENAME : MAYOR12.OBJ

1 ;------------------------------------------2 ;NOMBRE : MAYOR123 ;FUNCION : Si Dato>12 va a B4 ;PRECONDICION : HL = Dirección del Dato5 ;POSTCONDICION : Resultado en B si Dato>126 ;------------------------------------------78 0000 MAYOR12:9 0000 F5 PUSH PSW

10 0001 7E MOV A,M11 0002 FE 0C CPI 1212 0004 CA 0B 00 JZ FIN13 0007 DA 0B 00 JC FIN14 000A 46 MOV B,M15 000B F1 FIN POP PSW16 000C C9 RET17 000D END

Page 98: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 98 ___________________________________________

*********** S Y M B O L I C R E F E R E N C E T A B L E *************

FIN 000B MAYOR12 0000

LINES ASSEMBLED : 17 ASSEMBLY ERRORS : 0

Es preciso darse cuenta que, según las precondiciones planteadas, para acceder a esta subrutina, habrá

que cargar en el par de registros HL la dirección del Dato que deseamos tratar. Además, al obtener el resultado de la subrutina en el registro B, debemos tener presente que la información que temporalmente pudiéramos tener depositada en el mismo podría perderse si no tenemos la precaución de ponerla a salvo antes de acceder a la subrutina.

• En la línea 10, se carga en el acumulador el contenido de la dirección de memoria (M) apuntada por el par

HL. A continuación (línea 11) se establece una comparación con el valor 12 (fijarse cómo el ensamblador transforma 12 a su equivalente hexadecimal 0C).

• En la línea 12 se efectúa un salto a FIN (línea 15) si se cumple que el Dato del acumulador es igual a 12.

En caso contrario ejecutaría la línea 13, en la que se produce un salto a FIN si se cumple que el Dato es menor que 12. Si no se cumple tampoco la condición anterior es claro que el Dato es mayor que 12 por lo que se pasa a ejecutar la línea 14, en la que se pasa el valor del Dato almacenado en la memoria al registro B.

• En la línea 16, se produce el retorno de la subrutina al programa principal, desde el que se ha efectuado la

llamada.

• Las líneas 9 y 15, en las que tenemos las instrucciones PUSH y POP, sirven para almacenar en la pila los valores de los registros en ellas mencionados y recuperarlos al abandonar la subrutina, con los mismos valores que tenían en el momento de efectuar la llamada. Debemos tener en cuenta, que por cada instrucción PUSH insertada, debemos colocar una instrucción POP correspondiente al mismo registro necesariamente.

Suponiendo que la dirección del Dato fuera 8100H, para llamar a la subrutina MAYOR12 desde el

programa principal, tendríamos que proceder del modo siguiente: LXI H,8100H CALL MAYOR12 Observando el listado del programa ensamblado, vemos cómo el programa ensamblador calcula y

convierte a hexadecimal las instrucciones y las direcciones de salto.

Ejemplo 2.- En este caso se desarrollará la subrutina correspondiente al ejemplo 2 del tema anterior y

la denominaremos del mismo modo MENOR12.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME: MENOR12.ASMOUTPUT FILENAME: MENOR12.OBJ

1 ;------------------------------------------2 ;NOMBRE : MENOR123 ;FUNCION : Si Dato>12 va a B si no va a C4 ;PRECONDICION : HL=Dirección Dato, B=0, C=05 ;POSTCONDICION : Resultado en B o en C6 ;------------------------------------------

Page 99: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 99 ___________________________________________

78 0000 MENOR12:9 0000 F5 PUSH PSW

10 0001 7E MOV A,M11 0002 FE 0C CPI 1212 0004 CA 0D 00 JZ SALT113 0007 DA 0D 00 JC SALT114 000A 46 MOV B,M15 000B F1 FIN POP PSW16 000C C9 RET17 000D 4E SALT1 MOV C,M18 000E C3 0B 00 JMP FIN19 0011 END

************* S Y M B O L I C R E F E R E N C E T A B L E *************

FIN 000B MENOR12 0000 SALT1 000D

LINES ASSEMBLED : 19 ASSEMBLY ERRORS : 0 El desarrollo de esta subrutina es muy parecido a la anterior, salvo que en este caso, tendremos el

resultado en el registro B o en el registro C según sea el valor del Dato contenido en la dirección marcada por el par HL.

Para acceder a esta subrutina, suponiendo que tenemos el Dato situado en la dirección 8200H,

procederemos del modo siguiente: LXI B,0000H LXI H,8200H

CALL MENOR12

• Al igual que en el ejercicio anterior, podemos ver en las primeras líneas, los comentarios que nos documentan la subrutina: Nombre, Función, etc.

• Las primeras líneas (9,10 y 11) son similares al ejemplo anterior. • En las líneas 12 y 13 se analizan las condiciones Dato<12 y Dato =12. Si es afirmativa alguna de ellas, se

produce un salto a la etiqueta SALT1 (línea 17), donde se almacena el dato en el registro C, para luego (línea 18) saltar a la etiqueta FIN. Si no se cumplen ninguna de las condiciones anteriores, entonces será lógicamente Dato>12, por lo que las instrucciones JC y JZ no serán tenidas en cuenta, pasando a ejecutarse la línea 14, en la que se almacena el Dato en el registro B. A continuación se ejecutan secuencialmente las líneas 15 y 16, en las que se da por finalizada la subrutina.

Ejemplo 3.- Se desarrollará la subrutina correspondiente al ejemplo 3 del tema anterior y será

denominada del mismo modo ASCII1.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : ASCII1.ASMOUTPUT FILENAME : ASCII1.OBJ

1 ;------------------------------------------2 ;NOMBRE: ASCII13 ;FUNCION: Convertir byte decimal a ASCII4 ;PRECONDICION: DIREDAT y DIRERES en HL y DE5 ;POSTCONDICION: Result DIRERES y DIRERES+16 ;------------------------------------------

Page 100: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 100 ___________________________________________

78 0000 ASCII1:9 0000 F5 PUSH PSW

10 0001 7E MOV A,M11 0002 E6 F0 ANI F0H12 0004 0F RRC13 0005 0F RRC14 0006 0F RRC15 0007 0F RRC16 0008 C6 30 ADI 30H17 000A 12 STAX D18 000B 13 INX D19 000C 7E MOV A,M20 000D E6 0F ANI 0FH21 000F C6 30 ADI 30H22 0011 12 STAX D23 0012 F1 POP PSW24 0013 C9 RET25 001426 0014 END

************* S Y M B O L I C R E F E R E N C E T A B L E ************

ASCII1 0000

LINES ASSEMBLED : 26 ASSEMBLY ERRORS : 0

Esta subrutina, que nos convierte un byte decimal almacenado en memoria a su equivalente ASCII, necesita conocer como valores de entrada, la dirección del byte decimal a convertir y la dirección a partir de la cual se almacena el resultado (DIREDAT y DIRERES respectivamente). Estos valores, son pasados a través de los registros pares HL y DE, antes de efectuar la llamada a la subrutina desde el programa principal, del modo siguiente:

DIREDAT EQU 8000H DIRERES EQU 8100H LXI D,DIRERES LXI H,DIREDAT CALL ASCII1 Aquí se ha empleado la pseudoinstrucción EQU, para ilustrar su funcionamiento, aunque podríamos

efectuar la llamada de modo similar a lo hecho en ejercicios anteriores. • Como siempre, en las primeras líneas, incluimos la documentación de la subrutina a modo de comentarios. • En la línea 10 cargamos en el acumulador, el Dato de memoria (M) direccionado por el par de registros

HL. • En la línea 11 se efectúa una operación AND entre el acumulador y el dato F0. De esta forma ponemos a

cero los cuatro bits menos significativos del Dato del acumulador y permanecen inalterados los cuatro bits más significativos. A continuación (líneas 12, 13, 14 y 15) se efectúan cuatro rotaciones del contenido del acumulador, con lo que pasamos los cuatro bits de mayor peso a las posiciones de menor peso del acumulador.

• En la línea 16 sumamos el valor hexadecimal 30 (0011 0000) al acumulador. Con esto tendremos el

equivalente ASCII de los cuatro bits de mayor peso del Dato, que a continuación (línea 17) almacenamos en la posición de memoria especificada por el par de registros DE.

• En la línea 18 se incrementa el par DE para apuntar a la siguiente dirección de memoria, donde

almacenaremos el equivalente ASCII de los cuatro bits de menor peso del Dato.

Page 101: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 101 ___________________________________________

• A continuación volvemos a cargar el Dato original en el acumulador, para luego realizar una operación

AND con el valor hexadecimal 0F. De esta forma ponemos a cero los cuatro bits de mayor peso del dato y permanecen inalterados los cuatro bits de menor peso. En la línea 21, sumamos el valor hexadecimal 30 al contenido del acumulador, con lo que obtenemos el equivalente ASCII de la parte baja del Dato, que a continuación (línea 22) almacenamos en la memoria apuntada por el par DE.

Ejemplo 4.- Se desarrollará la subrutina correspondiente al ejemplo 4 del tema anterior y será

denominada del mismo modo ASCII2.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : ASCII2.ASMOUTPUT FILENAME : ASCII2.OBJ

1 ;------------------------------------------2 ;NOMBRE : ASCII23 ;FUNCION : Pasa byte hexadecimal a ASCII4 ;PRECONDICION: DIREDAT y DIRERES en HL y DE5 ;POSTCONDICION : Result DIRERES y DIRERES+16 ;------------------------------------------78 0000 ASCII2:9 0000 F5 PUSH PSW

10 0001 7E MOV A,M11 0002 E6 F0 ANI F0H12 0004 0F RRC13 0005 0F RRC14 0006 0F RRC15 0007 0F RRC16 0008 CD 16 00 CALL ASCII17 000B 12 STAX D18 000C 13 INX D19 000D 7E MOV A,M20 000E E6 0F ANI 0FH21 0010 CD 16 00 CALL ASCII22 0013 12 STAX D23 0014 F1 POP PSW24 0015 C9 RET2526 ;------------------------------------------27 ;NOMBRE : ASCII28 ;FUNCION : Calcula el equivalente ASCII29 ;PRECONDICION : Dato en acumulador30 ;POSTCONDICION : Resultado en acumulador31 ;------------------------------------------3233 0016 ASCII:34 0016 C5 PUSH B35 0017 47 MOV B,A36 0018 FE 0A CPI 1037 001A CA 25 00 JZ SALT138 001D D2 25 00 JNC SALT139 0020 78 MOV A,B40 0021 C6 30 ADI 30H41 0023 C1 FIN POP B42 0024 C9 RET43 0025 78 SALT1 MOV A,B44 0026 C6 37 ADI 37H45 0028 C3 23 00 JMP FIN4647 002B END

Page 102: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 102 ___________________________________________

************* S Y M B O L I C R E F E R E N C E T A B L E ************

ASCII 0016 ASCII2 0000 FIN 0024 SALT1 0027

LINES ASSEMBLED : 47 ASSEMBLY ERRORS : 0

La subrutina que ahora se analiza, es similar a la anterior, pero ésta realiza la transformación a valores

ASCII de un byte hexadecimal almacenado en una dirección de memoria (DIREDAT). El resultado será cargado también en memoria (DIRERES). Los valores de las direcciones serán pasados a la subrutina, a través de los pares de registros HL y DE del modo siguiente:

DIREDAT EQU 8100H DIRERES EQU 8500H LXI D,DIRERES LXI H,DIREDAT CALL ASCII2 También podemos apreciar cómo en esta subrutina se hacen dos llamadas a otra subrutina (ASCII) que

proporciona el valor ASCII. La primera vez que se efectúa la llamada, calcula el equivalente ASCII de la parte alta del byte. La segunda llamada sirve para proporcionar el equivalente ASCII de la parte baja del byte (Dato). • El programa sigue un desarrollo similar al ejercicio anterior, por lo que podemos ver en las líneas 10 a 15,

donde se eliminan los cuatro bits menos significativos del Dato, se producen cuatro rotaciones para preparar el dato y a continuación (línea 16) se llama a una subrutina denominada ASCII, que nos calcula el valor equivalente en ASCII de la parte del Dato tratada.

• En la línea 17, se almacena el resultado en la memoria direccionada por el par DE, y posteriormente se

incrementa dicho par, para apuntar a la siguiente dirección de memoria. • En las líneas 18 y 19, se realiza un proceso similar con la parte BAJA del Dato, para luego llamar a la

subrutina ASCII de cálculo. • En la línea 22, se almacena el resultado en memoria para a continuación dar por finalizada la subrutina y

salir de ella mediante la instrucción RET. • Vemos además, que dentro de esta subrutina, existe otra subrutina (denominada ASCII) que efectúa el

cálculo del valor equivalente en ASCII. Para ello, debe recibir el dato que se desea tratar en el acumulador y una vez realizado el cálculo, proporciona el resultado en el mismo acumulador.

• En esta subrutina, se comprueba en primer lugar, si el dato es menor que 10 (línea 36) en cuyo caso se

suma el hexadecimal 30 (0011 0000) y se finaliza la subrutina. Si el dato es mayor o igual que 10, se hace un salto a SALT1, donde se suma el hexadecimal 37 (0011 0111) y se da por finalizada la subrutina con un salto incondicional a FIN.

Page 103: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 103 ___________________________________________

Ejemplo 5.- Se desarrollará la subrutina correspondiente al ejemplo 5 del tema anterior y será denominada del mismo modo LLENARAM.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : LLENARAM.ASMOUTPUT FILENAME : LLENARAM.OBJ

1 ;------------------------------------------2 ;NOMBRE : LLENARAM3 ;FUNCION : Llena zona RAM con un Dato4 ;PRECONDICION : DATO=C,PRIRAM=HL y NUMDAT=B5 ;POSTCONDICION : Zona RAM con mismo Dato6 ;------------------------------------------78 0000 LLENARAM:9 0000 F5 PUSH PSW

10 0001 71 SALT1 MOV M,C11 0002 23 INX H12 0003 05 DCR B13 0004 C2 01 00 JNZ SALT114 0007 F1 POP PSW15 0008 C9 RET1617 0009 END

************* S Y M B O L I C R E F E R E N C E T A B L E ************

LLENARAM 0000 SALT1 0001

LINES ASSEMBLED : 17 ASSEMBLY ERRORS : 0

La llamada a esta subrutina, se realiza como siempre, mediante una instrucción CALL. Previamente

deben haberse cargado los registros HL, B, y C con los datos correspondientes, según se pide en las precondiciones. Por tanto procederemos del modo siguiente:

PRIRAM EQU 8200H NUMDAT EQU 60H DATO EQU 3AH LXI H,PRIRAM MVI B,NUMDAT MVI C,DATO CALL LLENARAM

• Podemos ver cómo en la línea 10, se almacena en memoria RAM (direccionada por el par de registros HL) el valor que hay en el registro C (C = Dato).

• A continuación se apunta a la siguiente dirección de memoria, incrementando el par HL. • En la línea 12, se decrementa el contador B (B = Número de datos). • En la línea 13, se produce un salto a SALT1 si el contador B no es cero. En el instante en que se alcance

B=0 se pasará a ejecutar las líneas 14 y 15 secuencialmente, finalizándose la subrutina.

Page 104: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 104 ___________________________________________

Ejemplo 6.- Se desarrollará la subrutina correspondiente al ejemplo 6 del tema anterior y será

denominada del mismo modo SUMA.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : SUMA.ASMOUTPUT FILENAME : SUMA.OBJ

1 ;------------------------------------------2 ;NOMBRE : SUMA3 ;FUNCION : Suma dos núm decimales 8 cifras4 ;PRECONDICION : SUM1 Y SUM2 conocidos5 ;POSTCONDICION : Resultado en SUM16 ;------------------------------------------7 20 80 SUM1 EQU 8020H8 30 80 SUM2 EQU 8030H9

10 0000 SUMA:11 0000 F5 PUSH PSW12 0001 E5 PUSH H13 0002 C5 PUSH B14 0003 D5 PUSH D15 0004 21 20 80 LXI H,SUM116 0007 11 30 80 LXI D,SUM217 000A A7 ANA A18 000B 06 04 MVI B,0419 000D 1A SALT1 LDAX D20 000E 8E ADC M21 000F 27 DAA22 0010 77 MOV M,A23 0011 23 INX H24 0012 13 INX D25 0013 05 DCR B26 0014 C2 0D 00 JNZ SALT127 0017 D1 POP D28 0018 C1 POP B29 0019 E1 POP H30 001A F1 POP PSW31 001B C9 RET3233 001C END

************ S Y M B O L I C R E F E R E N C E T A B L E *************

SALT1 000D SUM1 = 8020 SUM2 = 8030 SUMA 0000

LINES ASSEMBLED : 33 ASSEMBLY ERRORS : 0

Como vemos, esta subrutina suma dos números decimales de 8 cifras cada uno y nos proporciona el

resultado de la suma en uno de los sumandos. En este caso, la subrutina necesita los valores de las direcciones de los sumandos, que serán pasados mediante los pares de registros HL y DE. Aquí se han incluido los valores SUM1 y SUM2 mediante la directiva EQU, al objeto de que se aprecie el modo de ser tratada por el ensamblador, sin embargo este procedimiento no es el adecuado para trabajar con las subrutinas. Para llamar a esta subrutina, tendremos que almacenar los dos números a sumar en RAM y luego

efectuar la llamada del modo siguiente:

Page 105: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 105 ___________________________________________

CALL SUMA

• Cuando el resultado de las subrutinas, no es almacenado en ningún registro, puede emplearse el procedimiento mostrado aquí, para proteger los datos de los registros. Vemos cómo en las líneas 11, 12, 13 y 14, se guardan sus contenidos en la pila y en las líneas 27, 28, 29 y 30 se recuperan de nuevo en sentido inverso, antes de abandonar la subrutina. (Si no nos interesa proteger el contenido de algún registro, podemos eliminar sus instrucciones correspondientes).

• Notar también que en la línea 17, se ejecuta la instrucción ANA A, con el único objeto de poner el flag

CARRY a cero. • En la línea 18 se inicia un contador en el registro B, que nos permitirá realizar un determinado número de

veces el lazo del bucle marcado por SALT1. • En las líneas 19 y 20, podemos ver como se realiza la suma entre los bytes señalados por los pares DE y

HL. Posteriormente, en la línea 21 se realiza el ajuste decimal, para transformar el resultado de la suma anterior en un valor decimal.

Ejemplo 7.- Se desarrollará la subrutina correspondiente al ejemplo 7 del tema anterior y será

denominada del mismo modo TEMPORIZ.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : TEMPORIZ.ASMOUTPUT FILENAME : TEMPORIZ.OBJ

1 ;------------------------------------------2 ;NOMBRE : TEMPORIZ3 ;FUNCION : Realiza un tiempo de espera4 ;PRECONDICION : Contador=CONTA5 ;POSTCONDICION : Ninguna6 ;------------------------------------------78 0000 TEMPORIZ:9 0000 F5 PUSH PSW

10 0001 1B SALT1 DCX D11 0002 7A MOV A,D12 0003 B3 ORA E13 0004 00 NOP14 0005 00 NOP15 0006 00 NOP16 0007 C2 01 00 JNZ SALT117 000A F1 POP PSW18 000B C9 RET1920 000C END

************* S Y M B O L I C R E F E R E N C E T A B L E ************

SALT1 0001 TEMPORIZ 0000

LINES ASSEMBLED : 20 ASSEMBLY ERRORS : 0

Para acceder a esta subrutina, tendremos que proporcionar a través del par DE, el valor del contador,

que determina el número de veces que se realizará el bucle iniciado con SALT1. Por tanto, podremos llamar a esta subrutina del modo siguiente:

Page 106: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 106 ___________________________________________

CONTA EQU 7000H LXI D,CONTA CAL TEMPORIZ Puede verse que dentro del bucle hay tres líneas en las que aparece la instrucción NOP. Con ella el

microprocesador no ejecuta ninguna operación. Estas instrucciones se emplean para aumentar el tiempo de espera, que viene marcado por el valor que se le proporcione al par de registros DE, al acceder a la subrutina.

El tiempo de permanencia en esta subrutina, puede encontrarse fácilmente sin mas que calcular el

número total de ciclos que emplean las instrucciones del bucle y multiplicarlos por el número de veces que se realiza el bucle y posteriormente añadir el número de ciclos de las instrucciones que se ejecutan una sola vez (fuera del bucle).

Ejemplo 8.- Se desarrollará la subrutina correspondiente al ejemplo 8 del tema anterior y será

denominada del mismo modo MOVERDATOS.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : MOVERDAT.ASMOUTPUT FILENAME : MOVERDAT.OBJ

1 ;--------------------------------2 ;NOMBRE : MOVERDATOS3 ;FUNCION : Mueve Datos en RAM4 ;PRECONDICION:ORIGEN,DESTINO,NUM5 ;POSTCONDICION : Datos en DESTINO6 ;--------------------------------78 00 84 ORIGEN EQU 8400H9 00 88 DESTINO EQU 8800H

10 3C 00 NUM EQU 601112 0000 MOVERDATOS:13 0000 F5 PUSH PSW14 0001 E5 PUSH H15 0002 D5 PUSH D16 0003 C5 PUSH B17 0004 21 00 84 LXI H,ORIGEN18 0007 11 00 88 LXI D,DESTINO19 000A 06 3C MVI B,NUM20 000C 78 MOV A,B21 000D FE 00 CPI 00H22 000F C2 53 00 JNZ FIN23 0012 7D MOV A,L24 0013 BB CMP E25 0014 C2 1C 00 JNZ CONTI26 0017 7C MOV A,H27 0018 BA CMP D28 0019 CA 53 00 JZ FIN29 001C 7B CONTI MOV A,E30 001D 95 SUB L31 001E 6F MOV L,A32 001F 7A MOV A,D33 0020 9C SBB H34 0021 67 MOV H,A35 0022 FE 00 CPI 00H36 0024 C2 48 00 JNZ NOSOLAP37 0027 7D MOV A,L

Page 107: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 107 ___________________________________________

38 0028 90 SUB B39 0029 D2 48 00 JNC NOSOLAP40 002C 21 00 84 SISOLAP LXI H,ORIGEN41 002F 7D MOV A,L42 0030 80 ADD B43 0031 6F MOV L,A44 0032 7C MOV A,H45 0033 CE 00 ACI 00H46 0035 67 MOV H,A47 0036 7B MOV A,E48 0037 80 ADD B49 0038 5F MOV E,A50 0039 7A MOV A,D51 003A CE 00 ACI 00H52 003C 57 MOV D,A53 003D 2B SALT1 DCX H54 003E 1B DCX D55 003F 7E MOV A,M56 0040 12 STAX D57 0041 05 DCR B58 0042 C2 3D 00 JNZ SALT159 0045 C3 53 00 JMP FIN60 0048 21 00 84 NOSOLAP LXI H,ORIGEN61 004B 7E SALT2 MOV A,M62 004C 12 STAX D63 004D 23 INX H64 004E 13 INX D65 004F 05 DCR B66 0050 C2 4B 00 JNZ SALT267 0053 C1 FIN POP B68 0054 D1 POP D69 0055 E1 POP H70 0056 F1 POP PSW71 0057 C9 RET7273 0058 END

******** S Y M B O L I C R E F E R E N C E T A B L E *********

CONTI 001C DESTINO = 8800 FIN 0053 MOVERDATOS 0000NOSOLAP 0048 NUM = 003C ORIGEN = 8400 SALT1 003DSALT2 004B SISOLAP 002C

LINES ASSEMBLED : 73 ASSEMBLY ERRORS : 0

Para acceder a la subrutina MOVERDAT, debemos pasar en los registros HL, DE y B los valores

correspondientes al ORIGEN de Datos, DESTINO de Datos y NUMero de Datos que se deben mover, respectivamente. Por tanto tendremos que proceder del modo siguiente:

ORIGEN EQU 8400H DESTINO EQU 8800H NUM EQU 60 LXI H,ORIGEN LXI D,DESTINO MVI B,NUM CALL MOVERDAT Para seguir el desarrollo de la subrutina, es conveniente analizar el pseudocódigo presentado en el

tema anterior. • Podemos ver como en las líneas 17, 18 y 19 se toman los datos iniciales con los que la subrutina debe

ponerse en marcha.

Page 108: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

• Entre las líneas 20 a 28 se establecen las comparaciones y decisiones de saltos pertinentes según proceda finalizar la subrutina o continuar con el proceso.

• En las líneas siguientes podemos apreciar los dos bucles a ejecutar según se produzca solapamiento o no del bloque de memoria.

dee

Ccsoee

p

.

6.6 ERRORES CORRIENTES PROGRAMANDO EN ENSAMBLADOR

______________________________________ 108 ___________________________________________

Queremos en este apartado enumerar algunos de los errores que corrientemente se cometen, cuando se esarrollan programas en ensamblador. Pueden establecerse, además, determinadas categorías de errores y studiar los errores típicos dentro de cada una de ellas. Nosotros nos limitaremos a enumerar los más lementales y que con más frecuencia se presentan.

Sabemos que los ensambladores son programas preparados para reconocer algún tipo de error como:

ódigos de operación indefinidos, etiquetas indefinidas, etiquetas o nombres definidos en más de un lugar, aracteres ilegales, operandos ilegales, formatos ilegales, etc. Estos errores son comunes y fáciles de corregir al er detectados por el ensamblador que nos proporcionará como salida determinados mensajes de error que nos rientarán sobre el error cometido. Sin embargo el problema se complica cuando un error confunde al nsamblador dando como salida unos mensajes de error equivocados, o bien, ni tan siquiera emite mensajes de rror.

Podemos destacar una serie de errores que se cometen al tratar con elementos de entrada/salida o

eriféricos de entrada/salida como son:

• Confundir un puerto de entrada con uno de salida. Debemos tener presente que no se pueden sacar datos por un puerto de entrada, ni se pueden introducir datos por un puerto de salida.

• Leer o escribir datos sin comprobar previamente el estado del componente empleado, ya que

algunos de ellos permiten el intercambio de información, sólo cuando una línea de estado así lo indica.

• Recordar que para trabajar con elementos periféricos, es preciso en primer lugar programarlos. De no ser así podríamos encontrarnos con un intercambio de información no autorizado.

• Olvidarnos que algunos componentes trabajan con lógica negativa.

• Confundir los registros que representan los puertos con los registros de programación o control de los componentes periféricos.

Otro tipo de errores corrientes que se producen cuando se desarrolla el programa fuente son: • Errores producidos al invertir el orden de los operandos o registros en las instrucciones. Estos

errores se producen normalmente en el empleo de instrucciones del tipo MOV reg,reg, que carga el contenido del segundo registro en el primero, sin alterar el contenido del segundo. Pero no al contrario como se interpreta en ocasiones, ni tampoco se intercambian los valores de los registros entre sí. También se cometen errores cuando se trabaja con direcciones de 16 bits y datos de 16 bits, si no se tiene presente que se almacenan en memoria situando en primer lugar el byte menos significativo y a continuación el byte más significativo.

Page 109: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 109 ___________________________________________

• Errores producidos debido a un tratamiento incorrecto de los flags. Sabemos que las instrucciones del 8085 afectan de diferentes formas al registro de flags. Hay determinadas instrucciones que requieren una atención especial , como pueden ser las instrucciones de transferencia de datos MOV, MVI, LDA, STA, etc. que “no afectan” al registro de flags del microprocesador por lo que no deben ser empleadas con este objetivo. Debe tenerse en cuenta que el flag CARRY actúa en las operaciones aritméticas cuando se produce un desbordamiento y es aconsejable tener precaución en su uso. Después de una operación de comparación (CMP, CPI) el flag ZERO nos marca la igualdad de los operandos, si ZERO=1 los operandos son iguales, si ZERO=0 son distintos. Un error común se produce al ejecutar las instrucciones JZ (salta si ZERO=1) y JNZ (salta si ZERO=0) si no se tienen en cuenta las condiciones previas con exactitud. También podemos cometer errores cuando se intenta salir de un bucle apoyándonos en instrucciones de salto con condición, cuando dicha condición se fundamenta en el estado de un flag y no se ha estudiado convenientemente. Hay que tener en cuenta que hay instrucciones que afectan a determinados flags, pero no a todos, como por ejemplo las instrucciones INR o DCR que no actúan sobre el CARRY pero sí afectan al flag ZERO. Por otro lado instrucciones como las de desplazamiento afectan únicamente al CARRY.

• Errores producidos al confundir registros simples con registros dobles (o pares de registros).

Debemos recordar que las instrucciones que trabajan con pares de registros son LHLD, LXI, POP, PUSH, XCHG y XTHL. Además cuando nos referimos al contenido de una dirección de memoria apuntada por el par HL, debemos emplear la referencia simbólica M. Un error típico es escribir MOV A,H en lugar de emplear MOV A,M.

• Errores producidos al confundir datos con direcciones. Hay instrucciones del microprocesador

8085, que requieren solamente direcciones y otras solamente datos.

• Errores producidos al emplear formatos equivocados. El ensamblador interpreta los siguientes formatos: H como hexadecimal, B como binario, D como decimal (si no se indica nada, también interpreta decimal por defecto), Q como octal y caracteres entre comillas como representaciones ASCII. La letra que identifica el formato debe colocarse después del valor en cuestión. Suelen ser errores comunes omitir la H cuando trabajamos con valores hexadecimales, omitir la B cuando se trabaja con valores binarios, confundir representaciones en BCD con representaciones binarias, confundir representaciones binarias o decimales con representaciones ASCII, etc.

• Errores producidos en la ejecución de iteraciones, realizando un recorrido de más o de menos.

Hay que considerar que un proceso iterativo realizado a partir de un número Base, tal que sea Base+N el número de repeticiones, contiene N+1 recorridos y no N recorridos.

• Otros errores corrientes pueden ser:

a. Olvidarse de la estructura LIFO de la pila del sistema. b. Marcar incorrectamente los arrays o bloques de datos (principio y fin).

c. No tener en cuenta de forma apropiada las precondiciones y las postcondiciones de las

subrutinas.

d. Realizar una organización incorrecta del programa, con repetición de rutinas de inicialización, dañando la eficiencia del mismo.

e. Salir de una subrutina sin haber alcanzado el resultado deseado.

f. Llevar a cabo un tratamiento incorrecto de las interrupciones, no habilitándolas

adecuadamente mediante la instrucción EI, no guardando los registros necesarios en la pila cuando se accede a la subrutina de tratamiento de la interrupción, no deshabilitándolas en transferencias multi-byte o durante la ejecución de secuencias de instrucciones que no deben ser interrumpidas, etc.

Page 110: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1 2 3 4 5 6

7 8

9

6.7 EJERCICIOS.

______________________________________ 110 ___________________________________________

. El lenguaje ensamblador. Características.

. Definir el programa fuente y el programa objeto.

. Escribir los pasos que deben seguirse normalmente, para desarrollar un programa.

. Explicar los campos de que debe constar cada línea del programa fuente.

. ¿Qué son las directivas de ensamblador?. Explicar cómo funcionan las directivas ORG, END y EQU.

. Definir una subrutina. Escribir las instrucciones del microprocesador 8085 que sirven para efectuar llamadas a subrutinas.

. Formas de comunicarse o de pasar datos a otras subrutinas.

. Refiriéndonos a la subrutina ASCII1.ASM, si en el byte señalado por DIREDAT, tenemos el valor 67 ¿qué valores nos mostrarán DIRERES y DIRERES+1 al finalizar la subrutina?.

. Trabajando con la subrutina LLENARAM.ASM, preparar los datos de entrada necesarios antes de la llamada para almacenar el Dato 7FH desde la dirección 810FH hasta la dirección 813FH.

Page 111: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 111 ___________________________________________

TRANSFERENCIA DE DATOS AL EXTERIOR

(I).

7

Page 112: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

ineb

trineinPu

oca

c

bp

8p

7. TRANSFERENCIA DE DATOS AL EXTERIOR.

______________________________________ 112 ___________________________________________

Además de la circuitería estudiada hasta el momento, está claro que nuestro sistema quedaría completo si no dispusiéramos de los componentes adecuados que nos permitieran comunicarnos con el

xterior de la CPU. A lo largo de este tema y del tema siguiente mostraremos el empleo de dos componentes ásicos para realizar este tipo de operaciones.

La transmisión de datos en paralelo y la transmisión de datos en serie son los dos sistemas básicos de

ansferencia de datos de que disponemos. La primera consiste adquirir (leer) o suministrar (escribir) grupos de formación formados por palabras normalmente de 8 bits. Cada vez que se lee o escribe un dato se reciben o

nvían 8 bits simultáneamente. La segunda forma de transmisión consiste en realizar el intercambio de formación de modo que cada grupo de 8 bits se transmita por una única línea unos a continuación de otros. ara realizar este proceso necesitaremos además efectuar una sincronización entre el emisor y el receptor tilizando líneas de control.

La casa INTEL ha diseñado una serie de dispositivos periféricos especializados en realizar este tipo de

peraciones, para ser acoplados directamente al bus del microprocesador 8085. Cada uno de ellos posee unas aracterísticas determinadas y especiales que los diferencian entre sí y los hacen más o menos aptos para plicaciones concretas.

En este tema realizaremos un estudio básico sobre el PPI 8255, diseñado para trabajar directamente

on el microprocesador 8085, que posee tres puertos de entrada/salida de 8 bits cada uno. Para trabajar con este dispositivo emplearemos el sistema elemental mostrado en el diagrama de

loques de la FIG.7A , en el que podemos observar como la fuente de alimentación suministra las tensiones recisas para todos los elementos del sistema.

El periférico programable PPI 8255 será gobernado por nuestro sistema básico (fundamentado en el 085) mediante un conjunto de líneas bidireccionales y las cargas finales serán controladas mediante los uertos de entrada/salida del PPI 8255.

En los puntos que siguen se realizará:

SISTEMA BASICO DEL 8085

FUENTE DE ALIMENTACION

PPI 8255

C1

C2

C3

FIG.7A

Page 113: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

• Una descripción física detallada de todas las patillas o pines del PPI 8255. • Una descripción de su funcionamiento interno, indicando también los modos de programación. • La interconexión física del PPI8255 a nuestro sistema básico. • Un conjunto de ejercicios prácticos que nos permitirán programar este periférico y comprobar su

funcionamiento, empleando los tres puertos de entrada/salida.

am

ad

sds

dpdps

7.1 DESCRIPCIÓN FÍSICA DEL PPI 8255.

______________________________________ 113 ___________________________________________

El componente 8255A de INTEL es un Periférico Programable de Interface (PPI) diseñado para plicaciones de carácter general como elemento de Entrada/Salida, que puede trabajar con los icroprocesadores Intel y más específicamente con el microprocesador 8085.

Este elemento se presenta en un encapsulado de 40 patillas, como puede apreciarse en la FIG.71A,

unque también hay otras disposiciones que nos muestran una distribución de patillas distinta, siendo la función e cada uno de ellas evidentemente la misma.

Como podemos ver, emplea una tensión de alimentación única de +5V (filtrada y estabilizada). Las

eñales de sus entradas y salidas son totalmente compatibles con niveles de tensión TTL. Dispone de un total e 24 terminales (patillas) de entrada/salida que pueden programarse en dos grupos de 12 terminales cada uno y egún tres modos diferentes de operación (modo 0, modo 1 y modo 2).

En el modo 0 permite desarrollar simples operaciones de transferencia de datos con el exterior, es

ecir, operaciones de entrada/salida en bloques de 8 bits, pudiendo programar los 24 terminales como tres uertos independientes de E/S. En el modo 1 se proporcionan los medios para transferir datos de entrada/salida esde o hacia un puerto dado en combinación con determinadas palabras de control y diálogo. En el modo 2 ermite la comunicación con algún periférico mediante la constitución de un bus bidireccional y determinadas eñales de control.

La función de cada una de las patillas o terminales es la siguiente:

Patillas PA0 a PA7: Terminales correspondientes a 8 líneas de entrada/salida del puerto A. Constituyen un byte de datos (octeto) de entrada/salida, siendo PA0 el bit de más bajo orden y PA7 el bit de más alto

1 2 3

3

84

37

5

366

35

7

348

33

9

3210

31

11

3

012

29

13

2

814

27

15

2

616

25

17

2

418

23

19

2

220

213940

PPI 8255

PA3

P

A4

PA2

P

A5

PA1

P

A6

PA0

P

A7

RD

W

RCS

RES

ETG

ND

D0

A1

D1

A0

D2

PC7

D3

PC6

D

4PC

5

D5

PC4

D6

PC0

D7

PC1

V

ccPC

2

PB

7PC

3

PB

6PB

0

PB5

PB1

P

B4PB

2

PB3

FIG. 71A

Page 114: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 114 ___________________________________________

orden. • Patillas PB0 a PB7: Terminales correspondientes a 8 líneas de entrada/salida del puerto B. Constituyen un

byte de datos (octeto) de entrada/salida, siendo PB0 el bit de más bajo orden y PB7 el bit de más alto orden.

• Patillas PC0 a PC7: Terminales correspondientes a 8 líneas de entrada/salida del puerto C. Constituyen un byte de datos (octeto) de entrada/salida, siendo PC0 el bit de más bajo orden y PC7 el bit de más alto orden.

• Patilla GND: Corresponde al terminal de masa o punto de referencia de alimentación. • Patilla Vcc: Corresponde al terminal de alimentación de +5V filtrados y estabilizados. En esta patilla es

conveniente situar un condensador de 100 nF para eliminar posibles señales parásitas o interferencias. • Patillas D0 a D7: Son las ocho líneas correspondientes al bus de datos bidireccional del 8255, es decir un

conjunto de líneas por las que circula información en ambas direcciones, desde el microprocesador hacia el 8255 y desde éste hacia el microprocesador.

• Patilla RD: Terminal correspondiente a la señal de lectura. Es activa con un nivel lógico BAJO. Es decir, cuando deseemos efectuar una operación de lectura, tendremos que colocar un 0 lógico en esta línea, para luego cargar información del 8255 en el acumulador del microprocesador.

• Patilla WR: Terminal correspondiente a la señal de escritura. Es activa con un nivel lógico BAJO. De esta forma, cuando queramos escribir un dato en el 8255, es decir, cuando deseemos pasar un dato del acumulador del microprocesador hacia el 8255, no tendremos más que colocar un 0 lógico en este terminal.

• Patillas A0 y A1: Son los terminales que nos permiten seleccionar o indicar el puerto con el que deseamos trabajar o bien apuntar el registro de estado del 8255. Estos dos terminales son fundamentales para poder sacar o introducir la información de forma correcta hacia o desde el puerto deseado.

• Patilla RESET: Es el terminal de inicialización o puesta a cero del 8255. Tiene un nivel activo ALTO. • Patilla CS: Es el terminal de selección chip o selección de componente. Tiene un nivel activo BAJO.

Este periférico programable de interface (PPI), no precisa de ninguna lógica externa para ser acoplado a otros componentes o estructuras periféricas. En la FIG.72A, puede verse un esquema de los diferentes “grupos funcionales” que constituyen este microcircuito.

En dicha figura pueden observarse:

• Buffer del Bus de Datos: Terminales D0 a D7. Es un bus bidireccional tri-estado y se emplea para acoplar

o conectar el 8255A al bus de datos del sistema. Los datos son transmitidos o recibidos a través de este buffer por la ejecución de instrucciones de la CPU, es decir, del microprocesador 8085. Las palabras de Control y la información de estado también son transmitidas a través del buffer del bus de datos.

• Grupo Lectura/Escritura y Control Lógico. La función básica de este bloque consiste en manejar todas las transferencias internas y externas de grupos de datos, control o palabras de estado. Las funciones de cada una de las señales de este grupo son:

7.2 DESCRIPCIÓN FUNCIONAL DEL PPI 8255.

Page 115: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 115 ___________________________________________

- CS: Selección del microcircuito. Permite (con un 0 lógico) o inhibe (con un 1 lógico) la comunicación entre el 8255A y el microprocesador 8085.

- RD: Lectura. Cuando se sitúa un 0 lógico en este terminal, permitimos al microprocesador 8085, leer

algún dato del 8255A, es decir, cargamos en el acumulador del 8085, algún dato del 8255A.

- WR: Escritura. Al colocar un 0 lógico en este terminal, permitimos al microprocesador 8085, escribir algún dato o palabra de control, en el 8255A.

- RESET: Puesta a cero. Colocando un 1 lógico (nivel ALTO) en este terminal, borramos todos los

registros internos del 8255A (palabra de control, y puertos A,B y C). Todas los puertos se ponen en modo entrada.

A1 A0 RD WR CS OPERACIÓN QUE REALIZA 0 0 0 1 0 Lee puerto A y carga en el bus de datos 0 1 0 1 0 Lee puerto B y carga en el bus de datos 1 0 0 1 0 Lee puerto C y carga en el bus de datos 0 0 1 0 0 Escribe bus datos en la puerta A 0 1 1 0 0 Escribe bus datos en la puerta B 1 0 1 0 0 Escribe bus datos en la puerta C 1 1 1 0 0 Escribe bus datos en palabra de control X X X X 1 Bus de datos tri-estado 1 1 0 1 0 Condición ilegal X X 1 1 0 Bus de datos tri-estado

- A0 y A1: Selecciona los registros de comunicación de que dispone el 8255A. Estas señales de entrada,

en unión con las señales RD y WR, seleccionan uno de los tres puertos disponibles en el 8255A o el registro de la palabra de control (también llamado registro de estado). Normalmente se conectan a A0

GRUPOCONTROLA

GRUPOPUERTAA (8)

GRUPOPUERTAC (4)

GRUPOPUERTAC (4)

GRUPOPUERTAB (8)

E/SPA0PA7

E/SPC4PC7

E/SPC0PC3

E/SPB0PB7

GRUPOCONTROLB

BUFFERBUS DEDATOS BUS DATOS

INTERNO

CONTROLLOGICOLECTURAESCRITURA

CS

RESET

A1

A0

WR

RD

BUSDEDATOS

MASA

+5V

FIG. 72A

Page 116: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

y A1 del bus de direcciones del microprocesador (aunque pueden conectarse a cualesquiera otras direcciones del microprocesador que deseemos). En el siguiente cuadro se muestran las operaciones básicas que realiza este componente según sea el estado de las señales de control. Como podemos apreciar, las operaciones de lectura se realizan todas con la misma combinación para las señales RD, WR y CS, siendo la combinación presente en las señales A0 y A1, la que selecciona el puerto a ser leido, es decir, la procedencia de la información. Algo similar sucede en las operaciones de escritura, en las que se mantiene la misma combinación para las señales RD, WR y CS siendo A0 y A1 las que señalan el destino de la información procedente del acumulador del microprocesador 8085. Finalmente se presentan tres estados en los que o bien se produce una condición ilegal en la que se intenta leer la palabra de control, o bien el componente no está seleccionado, permaneciendo en estado de alta impedancia (componente inactivo).

• Grupo de comunicación entrada/salida. El 8255A contiene tres puertos de 8 bits (puertos A,B y C) que pueden ser programados de diversas formas y con distintas características mediante el software adecuado. El puerto A dispone de un buffer de 8 bits para salida de datos y de una báscula de 8 bits para la entrada. El puerto B es similar al anterior en todas sus características. El puerto C también posee un buffer de salida de datos y una báscula de entrada, aunque en este caso dicho puerto puede dividirse en dos partes de 4 bits según el modo de trabajo o control, conteniendo cada una de ellas una báscula de 4 bits y puede utilizarse para las salidas de las señales de control y entrada de las señales de estado en combinación con los puertos A y B.

Cuando en la entrada Reset se coloca un 1 lógico todos los puertos del 8255A se colocan en modo

entrada. Durante la ejecución de cualquier programa, podemos modificar el modo de trabajo mediante una simple instrucción de salida o de carga. Esto proporciona gran facilidad para construir rutinas de servicio y mantenimiento sencillas.

Los modos de trabajo de los puertos A y B pueden ser definidos por separado, mientras que el puerto

C esta dividido en dos partes según se requiera por las definiciones de los puertos A y B. Todos los registros de salida incluidos los flip-flops de estado serán borrados al cambiar de modo de trabajo.

Cualquiera de las patillas del puerto C puede ser puesta a 1 o a 0 utilizando una simple instrucción

OUTput. Esta característica reduce el software requerido en aplicaciones de control. Cuando el 8255A se programa en modo 1 o en modo 2, las señales de control pueden ser empleadas como entradas de interrupción a la CPU. Las señales de interrupción generadas en el puerto C pueden ser inhibidas o habilitadas colocando a 1 o a 0 el flip-flop denominado INTE, empleando para ello el bit función set/reset de la puerta C.

sE a pmd

.

7.3 MODOS DE FUNCIONAMIENTO

______________________________________ 116 ___________________________________________

Como se ha visto hasta el momento, podemos llevar a cabo una programación del 8255A, mediante el

oftware adecuado, según tres modos distintos de trabajo que nos proporcionarán gran potencialidad a este PPI. stos modos de trabajo son:

.- Modo 0: Este modo de funcionamiento proporciona un método de entrada/salida básico por cada uno de los tres

uertos. Los datos son simplemente escritos en cada puerto, es decir, sacamos los datos procedentes del icroprocesador, por el puerto que deseemos; o bien pueden ser leídos, es decir, llevamos hacia el acumulador

el microprocesador, el dato presente en un determinado puerto.

Page 117: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 117 ___________________________________________

CONFIGURACIONES POSIBLES EN MODO 0 D7 D6 D5 D4 D3 D2 D1 D0 PORT A PORT C(ALTA) PORT B PORT C(BAJA) 1 0 0 0 0 0 0 0 salida salida salida salida 1 0 0 0 0 0 0 1 salida salida salida entrada 1 0 0 0 0 0 1 0 salida salida entrada salida 1 0 0 0 0 0 1 1 salida salida entrada entrada 1 0 0 0 1 0 0 0 salida entrada salida salida 1 0 0 1 0 0 0 0 entrada salida salida salida 1 0 0 0 1 0 0 1 salida entrada salida entrada 1 0 0 1 0 0 0 1 entrada salida salida entrada 1 0 0 0 1 0 1 0 salida entrada entrada salida 1 0 0 1 0 0 1 0 entrada salida entrada salida 1 0 0 0 1 0 1 1 salida entrada entrada entrada 1 0 0 1 0 0 1 1 entrada salida entrada entrada 1 0 0 1 1 0 0 0 entrada entrada salida salida 1 0 0 1 1 0 1 0 entrada entrada entrada salida 1 0 0 1 1 0 0 1 entrada entrada salida entrada 1 0 0 1 1 0 1 1 entrada entrada entrada entrada

Las principales características de este modo son:

1. Se pueden configurar dos puertos de 8 bits y dos de 4 bits. 2. Cualquier puerto puede ser entrada o salida. 3. Las salidas contienen básculas. 4. Las entradas son directas, no contienen básculas. 5. Existen 16 posibles configuraciones de entrada/salida que se muestran en la tabla adjunta.

b.- Modo 1:

Esta configuración funcional nos permite realizar transferencias entrada/salida hacia o desde determinado puerto en unión a las palabras de control y diálogo. Los puertos A y B utilizan las líneas del puerto C para generar o aceptar las señales de diálogo. Tanto el puerto A como el puerto B pueden definirse individualmente en el modo 1 como entradas o como salidas y pueden soportar gran variedad de aplicaciones.

Este modo de funcionamiento se caracteriza fundamentalmente por: 1. Existir dos "grupos" de trabajo.(Grupo A y grupo B). 2. Cada grupo posee 8 bits de datos y un puerto adicional de 4 bits de control de datos. 3. Los puertos de 8 bits (A y B) pueden ser ambos de entrada o salida mediante básculas en los dos

casos. 4. El puerto de 4 bits se emplea para control y estado de los puertos de 8 bits.

c.- Modo 2:

Esta configuración funcional provee de un medio de comunicación con componentes o estructuras periféricas en un bus simple de 8 bits para transmitir y recibir datos (bus bidireccional). También contiene la generación de interrupciones y funciones de actuación/inhibición.

Las características fundamentales de este modo de funcionamiento son: 1. Solo se emplea el grupo A. 2. El puerto A es el bus bidireccional de 8 bits y el puerto C emplea 5 bits de control. 3. Las entradas y salidas emplean básculas.

Page 118: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

mr

cyc

7.4 INTERCONEXIÓN DEL PPI 8255 CON EL µP 8085A.

______________________________________ 118 ___________________________________________

Como sabemos, el PPI 8255 es un componente diseñado específicamente para trabajar con icroprocesadores INTEL. En este caso, para incorporarlo a la tarjeta de nuestro sistema, tendremos que

ealizar las siguientes operaciones:

Conectar el 8255 a la misma tensión (+5V) que el microprocesador 8085 (evidentemente, el terminal de masa también debe ser el mismo). En el terminal de Vcc es conveniente situar un condensador de 100 nF, al objeto de eliminar posibles parásitos o interferencias.

Los terminales o patillas correspondientes a las señales RD y WR serán conectadas directamente a las señales de idéntica denominación del microprocesador 8085. Estas señales están disponibles en el conector CON3 correspondiente a la FIG.24A (ver tema 2).

Las señales correspondientes al bus de datos del 8255 (D0, D1, D2, D3, D4, D5, D6, D7) serán conectadas directamente al bus de datos/direcciones del 8085 de denominación equivalente. Estas señales están disponibles en el conector CON2 correspondiente a la FIG.24A (ver tema 2).

La patilla RESET del 8255 se conecta a la patilla de salida RESET OUT del 8085, al tiempo que se añade un condensador a masa de 10 nF. La señal de RESET OUT se encuentra en el conector CON3 de la FIG.24A (tema 2).

Las dos líneas de control A0 y A1 del 8255, pueden ser conectadas a cualquier par de líneas del bus de direcciones del microprocesador 8085. Sin embargo, lo más normal, es que A0 y A1 sean conectadas a las líneas de misma denominación del bus de direcciones del 8085. Nosotros así lo haremos y podemos encontrarlas en el conector CON1 de la FIG.24A (tema 2).

La señal de selección de chip CS, debe ser conectada a una de las salidas disponibles en el decodificador de direcciones (74LS138). Nosotros realizaremos la conexión a la salida CS3 que nos proporciona dicho componente y a cuya línea tendremos acceso en el conector CON3 de la FIG.24A (tema 2).

El resto de las patillas de 8255 constituyen las 24 líneas disponibles para comunicación con el exterior, es decir, forman las líneas de entrada/salida.

Todo lo mencionado hasta el momento puede apreciarse en el esquema presentado en la FIG.74A. Como podemos ver, al asignar la selección de chip a la salida CS3 del decodificador, situamos este

omponente en la dirección B000H, y puesto que se han conectado A0 y A1 directamente a las direcciones A0 A1 respectivamente del microprocesador, tendremos como direcciones de acceso definitivas para este omponente:

DIRECCION ELEMENTO SELECCIONADO

B000H Puerto A B001H Puerto B B002H Puerto C B003H Registro C/E

Page 119: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 119 ___________________________________________

En este apartado estudiaremos algunas aplicaciones sencillas que nos permitan entender el funcionamiento básico del PPI 8255 y su modo de programación. Para ello se desarrollarán unos ejercicios muy elementales que serán el inicio o punto de partida para más adelante realizar tareas más complejas. EJERCICIO 1. Se pretende desarrollar un programa que aplicado a nuestro sistema y apoyándose en el PPI 8255, realice 20 intermitencias con 8 lámparas de 12V (corriente continua). Para llevar a cabo esta tarea debemos darnos cuenta que, siendo el PPI 8255 nuestro medio de comunicación con el exterior, no es posible manejar las mencionadas lámparas de forma directa, sino que

14 PC0 15 PC1 16 PC2 17 PC3 13 PC4 12 PC5

11 PC6 10 PC7

4 PA0 3 PA1 2 PA2 1 PA340 PA4

39 PA538 PA6

37 PA7

18 PB019 PB120 PB221 PB322 PB423 PB524 PB625 PB7

FIG.74A

A0 A0A1 A1WR WRRD RDCS3 CS

RESET OUT RESET 35

10nF

D7 D7 27D6 D6 28D5 D5 29D4 D4 30D3 D3 31D2 D2 32D1 D1 33D0 D0 34

C17100K

+5V

CI1

282

55

26

7

PUER

TO C

PUER

TO A

PUER

TO B

7.5 APLICACIONES PRÁCTICAS CON EL 8255.

Page 120: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 120 ___________________________________________

necesitamos el apoyo de algún elemento auxiliar que nos permita adaptar la tensión de trabajo del 8255 (+5V) con la tensión de trabajo de las lámparas (+12V). Para realizar esta misión emplearemos un circuito integrado denominado ULN 2803. En la FIG.75A podemos ver su distribución de patillas y además podemos apreciar que se trata de ocho elementos inversores de potencia independientes, cada uno de los cuales dispone de un terminal de entrada y otro de salida. Internamente están compuestos por conjuntos de transistores con montaje darlington y salida en colector abierto. Pueden soportar tensiones de hasta +50V.

En la salida de cada elemento inversor de este circuito integrado, hay un diodo que se emplea para

eliminar corrientes indeseables producidas cuando la carga que se maneja es de tipo inductivo (bobinas). Todos estos diodos (8) van unidos a la patilla marcada como COMUN+ y por tal motivo es conveniente, aunque no indispensable, conectar dicho terminal a la tensión común de las lámparas (+12V). (Notar que en este caso estamos tratando una carga resistiva).

Apoyándonos ahora en este nuevo componente realizaremos la conexión mostrada en la FIG.75B, en

la que podemos apreciar la conexión de las lámparas en las diferentes salidas S0, S1, S2, S3, S4, S5, S6, S7 del ULN 2803, mientras que las correspondientes entradas E0, E1, E2, E3, E4, E5, E6, E7, serán llevadas a los terminales PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7 del 8255.

Realizadas de este modo las conexiones, debemos tener claro que si en un momento dado sacamos un

1 lógico por el terminal PA4 del 8255, dicha señal es inyectada a la entrada E4 del ULN 2803 y en su salida S4, tendremos un 0 lógico, por lo que circulará corriente por la lámpara conectada en dicha salida, es decir se iluminará la lámpara L4.

E0 1 18 S0E1 2 17 S1E2 3 16 S2E3 4 15 S3E4 5 14 S4E5 6 13 S5E6 7 12 S6E7 8 11 S7

GND 9 10 COMUN+

ULN

280

3

FIG.75A

E S

Page 121: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 121 ___________________________________________

Completado de este modo el hardware necesario para resolver este ejercicio, pasamos a plantearnos el

desarrollo del software que haga posible llevar a cabo el planteamiento inicial. Para ello, nos basaremos en la generación del siguiente pseudocódigo, teniendo en cuenta que debemos comenzar expresando las distintas funciones a realizar de forma general, para en posteriores pasos de refinado ir concretando todos los detalles necesarios:

NOMBRE: INTERMI FUNCION: Intermitencia de 8 lámparas 20 veces. PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Iniciar el sistema B=20 MIENTRAS B>0 Realizar intermitencia B=B-1 FIN DE MIENTRAS Fin del programa

Como podemos apreciar, necesitamos mostrar con más detalle distintos pasos de este pseudocódigo. En primer lugar al iniciar el sistema, lo que en realidad haremos, será bloquear o prohibir las interrupciones, programar el puntero de pila y programar de forma apropiada el PPI 8255. Vemos también que se realiza un bucle que debe ser ejecutado en 20 ocasiones (20 intermitencias), para lo cual empleamos la variable contador B. En el interior del bucle nos encontramos con la acción “realizar intermitencia” que básicamente consistirá en encender y apagar las lámparas, permaneciendo en cada estado un tiempo determinado. Teniendo en cuenta estas consideraciones, realizamos un refinado del pseudocódigo, obteniendo:

NOMBRE: INTERMI FUNCION: Intermitencia de 8 lámparas 20 veces. PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna.

ULN

28 0

3

PA0 E0 S0 L0

PA1 E1 S1 L1

PA2 E2 S2 L2

PA3 E3 S3 L3

PA4 E4 S4 L4

PA5 E5 S5 L5

PA6 E6 S6 L6

PA7 E7 S7 L7

+12V

GND

COMUN+

FIG.75B

Page 122: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 122 ___________________________________________

Prohibir interrupciones Puntero de pila Programar PPI 8255 B=20 MIENTRAS B>0 Encender lámparas

Temporizar Apagar lámparas Temporizar

B=B-1 FIN DE MIENTRAS Fin del programa

Con este pseudocódigo podríamos pasar a construir el programa definitivo en ensamblador, sin embargo vamos a incluir aquí, para más detalle, el diagrama de flujo de la FIG.75C que representa gráficamente este proceso.

A continuación se presenta el listado del programa ensamblado. En él podemos apreciar fundamentalmente los siguientes pasos:

Inicio

Prohibir InterrupcionesPuntero de PilaProgramar PPI 8255

B=20

B>0Si

No

Encender lámparas

Temporizar

Apagar lámparas

Temporizar

B=B-1

Fin del programa

FIG.75C

Page 123: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 123 ___________________________________________

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : INTERMI.ASMOUTPUT FILENAME : INTERMI.OBJ

1 ;------------------------------------------2 ;NOMBRE : INTERMI3 ;FUNCION : Intermitencia de lamparas4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;------------------------------------------78 ;------------------------------------------9 ;PARAMETROS PARA EL 8255

10 ;------------------------------------------11 00 B0 PA82 EQU B000H ;Puerto A del 825512 01 B0 PB82 EQU B001H ;Puerto B del 825513 02 B0 PC82 EQU B002H ;Puerto C del 825514 03 B0 REES82 EQU B003H ;Reg. Est. del 825515 ;------------------------------------------1617 ;------------------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;------------------------------------------20 FF 87 PPILA EQU 87FFH ;Puntero de pila21 ;------------------------------------------22 0000 INTERMI:23 0000 F3 DI24 0001 21 FF 87 LXI H,PPILA25 0004 F9 SPHL26 0005 3E 8A MVI A,8AH27 0007 32 03 B0 STA REES8228 000A 06 14 MVI B,2029 000C 78 SAL1 MOV A,B30 000D A7 ANA A31 000E CA 34 00 JZ FIN32 0011 3E FF MVI A,FFH33 0013 32 00 B0 STA PA8234 0016 CD 25 00 CALL TEMPO35 0019 3E 00 MVI A,00H36 001B 32 00 B0 STA PA8237 001E CD 25 00 CALL TEMPO38 0021 05 DCR B39 0022 C3 0C 00 JMP SAL140 ;------------------------------------------41 ;NOMBRE: TEMPO42 ;FUNCION: Proporciona un tiempo de espera43 ;PRECONDICIONES: Ninguna44 ;POSTCONDICIONES: Modifica registros D y E45 ;------------------------------------------46 0025 TEMPO:47 0025 F5 PUSH PSW48 0026 11 FF 07 LXI D,07FFH49 0029 1B TE1 DCX D50 002A 7A MOV A,D51 002B B3 ORA E52 002C 00 NOP53 002D 00 NOP54 002E 00 NOP55 002F C2 29 00 JNZ TE156 0032 F1 POP PSW57 0033 C9 RET58 0034 76 FIN HLT5960 0035 END

Page 124: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 124 ___________________________________________

*********** S Y M B O L I C R E F E R E N C E T A B L E ***********

FIN 0034 INTERMI 0000 PA82 = B000 PB82 = B001PC82 = B002 PPILA = 87FF REES82 = B003 SAL1 000CTE1 0029 TEMPO 0025

LINES ASSEMBLED : 60 ASSEMBLY ERRORS : 0

• En primer lugar definimos (desde la línea 8 hasta la 21) una serie de parámetros para referirnos al 8255 y a

la pila, de modo que resulte más sencillo su empleo en un momento determinado. Por ejemplo, si necesitamos sacar un dato por el puerto A del 8255, tendríamos que hacer referencia a la dirección B000H, sin embargo de este modo no tendremos más que hacer referencia a PA82. Este método simplifica mucho la tarea de programar a medida que va creciendo el programa en número de líneas y empleamos más componentes en nuestro sistema.

• Si seguimos las instrucciones del pseudocódigo (o el diagrama de flujo) vemos que las líneas de código 23 hasta 27, corresponden al proceso de iniciación del sistema. (Prohibir interrupciones,...).

• En la línea 28 se inicia la variable B según el valor que se le da al registro B. • En las líneas 29, 30 y 31 se plantea la ruptura de secuencia según se cumpla B>0. • En las dos instrucciones siguientes (32 y 33) se encienden las 8 lámparas y hacemos que permanezcan en

este estado durante un tiempo marcado por la subrutina de temporización (TEMPO). • En las líneas 35 y 36 apagamos las lámparas que permanecerán así durante el mismo intervalo de tiempo

que estuvieron encendidas. • En la línea 38 se decrementa el contador o variable B, para a continuación volver a realizar el proceso

nuevamente, mientras se cumpla que B>0. • La subrutina de temporización (TEMPO) es la que nos permite realizar los tiempos de espera, durante los

que las lámparas permanecerán encendidas o apagadas. Como podemos deducir, el tiempo viene impuesto por el valor que se almacene en el par de registros DE (en este caso 07FFH) por lo que alterando este valor podemos hacer que la intermitencia de las lámparas sea más rápida (con un valor menor) o sea mas lenta (con un valor mayor). (Debe quedar claro que, aunque aquí no se hace mención alguna acerca de la construcción de la subrutina de temporización, ésta ha sido tomada de la subrutina TEMPORIZ desarrollada en el ejemplo 7 del tema anterior).

• En la línea de código 26 (MVI A,8AH) se proporciona el dato (8AH) para programar el 8255 mediante la

instrucción siguiente. Este dato 8AH=10001010(2 establece el puerto A como salida, el puerto B como entrada, la parte baja del puerto C como salida y la parte alta del puerto C como entrada. Esto puede comprobarse analizando la tabla de programación en modo 0 presentada en el apartado 7.3 de este tema. Podríamos haber elegido cualquier otra combinación que nos proporcionara el puerto A como salida ya que ésta es la única condición necesaria para este ejercicio al quedar los otros puertos sin uso.

EJERCICIO 2 Desarrollar un programa que nos permita controlar 24 lámparas conectadas a los tres puertos del 8255, de forma que se produzca un encendido secuencial de las mismas. En este caso nos imponen únicamente dos condiciones: Que el encendido sea secuencial y que las lámparas estén conectadas en los tres puertos del PPI 8255. Por tanto tendremos que analizar el problema con detenimiento e ir imponiendo las condiciones adicionales que nosotros consideremos oportunas para la realización de la tarea encomendada.

Page 125: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 125 ___________________________________________

En primer lugar realizaremos un análisis del hardware que será necesario emplear. Nosotros haremos uso del ya conocido circuito integrado ULN 2803. Situaremos una unidad en cada puerto del PPI 8255 y obtendremos de este modo el esquema de la FIG.75D, en el que pueden verse las conexiones de cada una de las entradas del ULN 2803 con las líneas de los tres puertos (PA, PB y PC) del 8255. Según esta conexión física, cuando deseemos encender la lámpara L12 tendremos que sacar un 1 lógico por la línea 5 del puerto B, es decir por PB4. Si deseamos encender la lámpara L23, debemos sacar un 1 lógico por PC7. Procediendo de modo similar podremos encender todas y cada una de las 24 lámparas que deseamos controlar.

Establecida ya la configuración física de los elementos a controlar no queda más que desarrollar un programa que lleve a cabo el encendido secuencial de las 24 lámparas.

Por encendido secuencial entendemos que, partiendo de una situación inicial en que todas las lámparas se encuentren apagadas, se iran encendiendo una a una (comenzando por L0 por ejemplo) hasta que en la posición final se encuentren todas encendidas. La velocidad a la que iran iluminándose las lámparas, la impondremos nosotros (no nos dicen nada al respecto) mediante el empleo de una subrutina de temporización.

Como debemos sacar datos por los tres puertos, estableceremos tres bucles, cada uno de los cuales

deberá repetirse 8 veces, de modo que en cada iteración se ilumine una nueva lámpara, hasta completar las 24 en total. Cada bucle se empleará para controlar un puerto concreto y se sacarán los datos en primer lugar por el puerto A, a continuación por el puerto B y finalmente por el puerto C.

Además necesitaremos emplear una variable contador que nos posibilite realizar el número de iteraciones deseadas en cada bucle. Usaremos la variable B a la que asignaremos el valor 8 al comenzar cada bucle.

También debemos tener en cuenta que en cada iteración que se realice el dato que tenemos que sacar

varía, por lo que se debe realizar una preparación del dato antes de enviarlo al puerto correspondiente. En base a estas ideas previas desarrollamos el siguiente pseudocódigo: NOMBRE: SECUEN FUNCION: Encendido secuencial de 24 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Iniciar el sistema Dato=0 B=8 MIENTRAS B>0 Preparar dato Sacar dato al puerto A Temporizar B=B-1 FIN DE MIENTRAS Dato=0 B=8 MIENTRAS B>0 Preparar dato Sacar dato al puerto B Temporizar B=B-1 FIN DE MIENTRAS Dato=0 B=8 MIENTRAS B>0 Preparar dato Sacar dato al puerto C

Page 126: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 126 ___________________________________________

Temporizar B=B-1 FIN DE MIENTRAS Fin del Programa

Podemos ahora pasar a realizar un nuevo paso de refinamiento en el desarrollo del programa analizando detenidamente los distintos procesos planteados, mostrando con más detalle cada uno de ellos de modo que llegue un momento que podamos convertirlo a mnemónicos de ensamblador. De este modo el programa puede ser el siguiente:

NOMBRE: SECUEN

ULN

280

3

PC0 E0 S0 L16PC1 E1 S1 L17PC2 E2 S2 L18PC3 E3 S3 L19PC4 E4 S4 L20PC5 E5 S5 L21PC6 E6 S6 L22PC7 E7 S7 L23

GND

COMUN+

FIG.75D

ULN

280

3

PB0 E0 S0 L8PB1 E1 S1 L9PB2 E2 S2 L10PB3 E3 S3 L11PB4 E4 S4 L12PB5 E5 S5 L13PB6 E6 S6 L14PB7 E7 S7 L15

+12V

GND

COMUN+

ULN

28 0

3PA0 E0 S0 L0PA1 E1 S1 L1PA2 E2 S2 L2PA3 E3 S3 L3PA4 E4 S4 L4PA5 E5 S5 L5PA6 E6 S6 L6PA7 E7 S7 L7

GND

COMUN+

Page 127: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 127 ___________________________________________

FUNCION: Encendido secuencial de 24 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones

Punterizar la pila Programar el PPI 8255 Apagar todas las lámparas Temporizar Dato=0

B=8 MIENTRAS B>0

Poner CARRY=1 Rotar Dato con CARRY por la izquierda Sacar Dato al puerto A Temporizar B=B-1 FIN DE MIENTRAS Dato=0 B=8 MIENTRAS B>0 Poner CARRY=1 Rotar Dato con CARRY por la izquierda Sacar Dato al puerto B Temporizar B=B-1 FIN DE MIENTRAS Dato=0 B=8 MIENTRAS B>0 Poner CARRY=1 Rotar Dato con CARRY por la izquierda Sacar Dato al puerto C Temporizar B=B-1 FIN DE MIENTRAS Fin del Programa

A continuación, en la FIG.75E, se muestra el diagrama de flujo en el que también nos podemos apoyar para entender el funcionamiento del programa. Como podemos ver tanto en esta figura como en el pseudocódigo, tenemos tres bucles muy similares, solo se diferencian en las instrucciones que permiten sacar el Dato al exterior, por tanto sería posible e interesante realizar una subrutina común que sustituyera a los tres bucles.

Page 128: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 128 ___________________________________________

INICIO

Prohibir interrupcionesPunterizar la pilaProgramar el PPI 8255

Apagar todas las lámparas

Temporizar

C=00HB=8

B>0

Carry=1Rotar A a izquierdasSacar dato al puerto A

Temporizar

B=B-1

Si

No

C=00HB=8

B>0

Carry=1Rotar A a izquierdasSacar dato al puerto B

Temporizar

B=B-1

Si

No

C=00HB=8

B>0

Carry=1Rotar A a izquierdasSacar dato al puerto C

Temporizar

B=B-1

Si

No

FIG.75E

FIN

SALT3

SALT1

SALT4

SALT2

SALT5

Page 129: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 129 ___________________________________________

Analizado ya todo el proceso que debe seguirse en nuestro programa pasamos a concretar el mismo en

lenguaje ensamblador, obteniendo el siguiente desarrollo:

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : SECUEN.ASMOUTPUT FILENAME : SECUEN.OBJ

1 ;------------------------------------------2 ;NOMBRE : SECUEN3 ;FUNCION : Encendido secuencal 24 lámparas4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;------------------------------------------78 ;------------------------------------------9 ;PARAMETROS PARA EL 8255

10 ;------------------------------------------11 00 B0 PA82 EQU B000H ;Puerto A del 825512 01 B0 PB82 EQU B001H ;Puerto B del 825513 02 B0 PC82 EQU B002H ;Puerto C del 825514 03 B0 REES82 EQU B003H ;Reg. Est. del 825515 ;------------------------------------------1617 ;------------------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;------------------------------------------20 FF 87 PPILA EQU 87FFH ;Puntero de pila21 ;------------------------------------------22 0000 SECUEN:23 0000 F3 DI24 0001 21 FF 87 LXI H,PPILA25 0004 F9 SPHL26 0005 3E 80 MVI A,80H27 0007 32 03 B0 STA REES8228 000A 3E 00 MVI A,00H29 000C 32 00 B0 STA PA8230 000F 32 01 B0 STA PB8231 0012 32 02 B0 STA PC8232 0015 CD 5E 00 CALL TEMPO33 0018 0E 00 MVI C,00H34 001A 06 08 MVI B,835 001C 78 SALT3 MOV A,B36 001D A7 ANA A37 001E CA 2F 00 JZ SALT138 0021 37 STC39 0022 79 MOV A,C40 0023 17 RAL41 0024 4F MOV C,A42 0025 32 00 B0 STA PA8243 0028 CD 5E 00 CALL TEMPO44 002B 05 DCR B45 002C C3 1C 00 JMP SALT346 002F 0E 00 SALT1 MVI C,00H47 0031 06 08 MVI B,848 0033 78 SALT4 MOV A,B49 0034 A7 ANA A50 0035 CA 46 00 JZ SALT251 0038 37 STC52 0039 79 MOV A,C53 003A 17 RAL54 003B 4F MOV C,A55 003C 32 01 B0 STA PB8256 003F CD 5E 00 CALL TEMPO

Page 130: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 130 ___________________________________________

57 0042 05 DCR B58 0043 C3 33 00 JMP SALT459 0046 0E 00 SALT2 MVI C,00H60 0048 06 08 MVI B,861 004A 78 SALT5 MOV A,B62 004B A7 ANA A63 004C CA 5D 00 JZ FIN64 004F 37 STC65 0050 79 MOV A,C66 0051 17 RAL67 0052 4F MOV C,A68 0053 32 02 B0 STA PC8269 0056 CD 5E 00 CALL TEMPO70 0059 05 DCR B71 005A C3 4A 00 JMP SALT572 005D 76 FIN HLT7374 ;------------------------------------------75 ;NOMBRE: TEMPO76 ;FUNCION: Proporciona un tiempo de espera77 ;PRECONDICIONES: Ninguna78 ;POSTCONDICIONES: Ninguna79 ;------------------------------------------80 005E TEMPO:81 005E F5 PUSH PSW82 005F 11 FF 07 LXI D,07FFH83 0062 1B TE1 DCX D84 0063 7A MOV A,D85 0064 B3 ORA E86 0065 00 NOP87 0066 00 NOP88 0067 00 NOP89 0068 C2 62 00 JNZ TE190 006B F1 POP PSW91 006C C9 RET9293 006D END

********** S Y M B O L I C R E F E R E N C E T A B L E ***************

FIN 005D PA82 = B000 PB82 = B001 PC82 = B002PPILA = 87FF REES82 = B003 SALT1 002F SALT2 0046SALT3 001C SALT4 0033 SALT5 004A SECUEN 0000TE1 0062 TEMPO 005E

LINES ASSEMBLED : 93 ASSEMBLY ERRORS : 0

• Como podemos apreciar, en las primeras líneas (en este caso de la línea 1 a la línea 6) se presentan el

nombre, función, precondiciones y postcondiciones del programa o subrutina, en forma de comentarios. Recordemos que los comentarios comienzan con el signo “;” y además no forman parte del programa objeto.

• En las líneas 11 a 14 se establecen los parámetros del PPI 8255, de este modo cuando deseemos hacer referencia a un puerto del 8255, por ejemplo el puerto B, no necesitamos emplear y por tanto recordar el valor B001H, sino que nos servirá con escribir PB82 (que es el nombre que le hemos asignado mediante EQU).

• En la línea 20, definimos la dirección del puntero de pila. • El programa comienza en la línea 23 y desde ésta hasta la línea 27 se realiza el proceso de inicialización

del programa. La 23, prohibe interrupciones, las 24 y 25 punterizan la pila y finalmente las 26 y 27 programan el PPI 8255.

• Desde la línea 28 a la 31, se realiza el apagado de todas las lámparas a controlar y en la línea 32 se realiza una llamada a la subrutina de temporización.

• En las líneas 33 y 34 se establecen los valores iniciales de los Datos (C=00H) y del contador (B=8). • Podemos ver cómo en las líneas 35, 36 y 37 se lleva a cabo una toma de decisión.

Page 131: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 131 ___________________________________________

• En las líneas 38 a 42, ponemos el flag CARRY a nivel ALTO, se rota el Dato a la izquierda con el CARRY y se saca el valor resultante al puerto A del 8255.

• En la línea 43 se realiza una llamada a la subrutina de temporización. • En las líneas 44 y 45, se establece de nuevo el lazo, en caso de que el contador (B) no sea cero. • El resto de las líneas no se comentan, pues se trata de tres lazos similares. • Notar que entre las líneas 74 y 91, se encuentra la subrutina de temporización. El tiempo que el

microprocesador permanece en esta subrutina viene impuesto por el valor cargado en el par DE (en este caso 07FFH), como puede verse en la línea 82.

EJERCICIO 3 Desarrollar el software y hardware necesarios para, a través del 8255, poder controlar 8 lámparas (L0, L1, ..., L7) y 8 pulsadores (P0, P1, ..., P7) de manera que mientras permanezca accionado un pulsador cualquiera, se ilumine su lámpara correspondiente. Es decir, si se acciona P3 se iluminará L3, si se accionan P3 y P5 se iluminarán L3 y L5, etc. En primer lugar tendremos que diseñar el hardware necesario para desarrollar esta actividad. Emplearemos para activar las lámparas, el conocido ULN 2803, que será manejado por el puerto A del 8255. Para la detección de los pulsadores implementaremos un circuito formado por dos resistencias y un condensador conectados del modo indicado en la FIG.75F, de manera que, cuando el pulsador permanezca sin activar, la señal proporcionada será un 1 lógico y cuando el pulsador es accionado, tendremos un 0 lógico. Los pulsadores serán controlados por el puerto B del 8255.

ULN

280

3

PA0 E0 S0 L0PA1 E1 S1 L1PA2 E2 S2 L2PA3 E3 S3 L3PA4 E4 S4 L4PA5 E5 S5 L5PA6 E6 S6 L6PA7 E7 S7 L7

+12VGND

COMUN+

FIG.75F

RED

RED

RED

RED

RED

RED

RED

RED

PB0 P0

PB1 P1

PB7 P7

PB2 P2

PB4 P4

PB6 P6

PB3 P3

PB5 P5

+5V

100nF 47

10KRED

Page 132: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 132 ___________________________________________

Como vemos en la FIG.75F los bloques marcados como RED son todos idénticos entre sí e iguales a la red mostrada en la misma figura. Resuelta ya la disposición física de todos los elementos a controlar, procedemos a desarrollar el programa que haga efectivas las propuestas del enunciado de esta actividad. Un primer paso para obtener el pseudocódigo necesario puede ser el siguiente:

NOMBRE: PULSAR FUNCION: Control de 8 pulsadores y 8 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna.

Iniciar el sistema Leer Dato de contactos Tratar el Dato leído Sacar Dato a lámparas Volver a Leer Dato de contactos Final del programa Debemos proceder a un refinado del pseudocódigo de forma que aclaremos del mejor modo y de manera más precisa todos los conceptos expresados. Mostrando en más detalle los distintos puntos tendremos:

NOMBRE: PULSAR FUNCION: Control de 8 pulsadores y 8 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna.

Prohibir interrupciones Punterizar la pila Programar el PPI 8255 Apagar las lámparas Leer Dato de PB82 Tratar el Dato leido Sacar Dato al PA82 Volver a Leer Dato de PB82 (paso 5) Final del programa En principio el programa parece suficientemente explícito, pero aún queda por aclarar qué significa exactamente “Tratar el dato leído”. Dado que debemos hacer corresponder cada pulsador con su lámpara asociada, es decir, P0 con L0, P1 con L1, ..., P7 con L7, de modo que al accionar un pulsador cualquiera este echo se vea reflejado en la lámpara correspondiente y además la conexión física se realiza de modo que la señal de cada pulsador (P0, P1, ..., P7) corresponde directamente con las líneas PB0, PB1, ..., PB7 del puerto B del 8255 y las lámparas corresponden exactamente igual con las líneas PA0, PA1, ..., PA7 del puerto A del 8255, no tendremos que realizar ningún tratamiento especial. Solo deberemos considerar el hecho de que cuando se detecte un pulsador accionado, en la correspondiente línea de entrada habrá un 0 lógico y para encender la lámpara correspondiente hay que sacar un 1 lógico. Lo contrario sucede con los pulsadores que quedan sin activar. Por tanto el “Dato” leído por el puerto B, debe ser complementado (cambiar los unos por ceros y los ceros por unos) antes de sacarlo por el puerto A.

Teniendo en cuenta todo esto, el programa quedará como sigue:

NOMBRE: PULSAR FUNCION: Control de 8 pulsadores y 8 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones

Page 133: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 133 ___________________________________________

Punterizar la pila Programar el PPI 8255 Apagar las lámparas Leer Dato de PB82 Dato = Complemento del Dato leido Sacar Dato al PA82 Volver a Leer Dato de PB82 (paso 5) Final del programa Podemos observar que en la penúltima línea, establecemos la acción “Volver a Leer Dato de PB82”, esto provoca que el programa se esté ejecutando permanentemente, en una acción sin fin. Por tanto este programa continuará ejecutándose hasta que la alimentación sea interrumpida. A continuación, en la FIG.75G se muestra el diagrama de flujo del mismo. Para finalizar, no nos queda más que traducir el programa propuesto en pseudocódigo, al lenguaje ensamblador, obteniendo así el programa definitivo que se muestra a continuación.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : PULSAR.ASMOUTPUT FILENAME : PULSAR.OBJ

1 ;------------------------------------------2 ;NOMBRE : PULSAR3 ;FUNCION : Control 8 pulsad y 8 lámparas4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;------------------------------------------7

INICIO

Prohibir interrupcionesPunterizar la pilaProgramar el PPI 8255

Apagar las lámparas

Leer Dato de PB

Dato=Dato complementado

Sacar Dato por PA

FIG.75G

Page 134: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 134 ___________________________________________

8 ;------------------------------------------9 ;PARAMETROS PARA EL 8255

10 ;------------------------------------------11 00 B0 PA82 EQU B000H ;Puerto A del 825512 01 B0 PB82 EQU B001H ;Puerto B del 825513 02 B0 PC82 EQU B002H ;Puerto C del 825514 03 B0 REES82 EQU B003H ;Reg. Estado 825515 ;------------------------------------------1617 ;------------------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;------------------------------------------20 FF 87 PPILA EQU 87FFH ;Puntero pila RAM21 ;------------------------------------------22 0000 PULSAR:23 0000 F3 DI24 0001 21 FF 87 LXI H,87FFH25 0004 F9 SPHL26 0005 3E 82 MVI A,82H27 0007 32 03 B0 STA REES8228 000A 3E 00 MVI A,00H29 000C 32 00 B0 STA PA8230 000F 3A 01 B0 LEER LDA PB8231 0012 2F CMA32 0013 32 00 B0 STA PA8233 0016 C3 0F 00 JMP LEER34 001935 0019 END

*********** S Y M B O L I C R E F E R E N C E T A B L E *************

LEER 000F PA82 = B000 PB82 = B001 PC82 = B002PPILA = 87FF PULSAR 0000 REES82 = B003

LINES ASSEMBLED : 35 ASSEMBLY ERRORS : 0

• Como podemos apreciar, las primeras líneas se emplean para documentar el programa y establecer los

parámetros de programación y acceso a diversos componentes, en este caso el PPI 8255 y la pila (memoria RAM).

• Las primeras líneas de programa, son de inicialización y apagado de lámparas (líneas 23 a 29). • En la línea 30, se lee el valor presentado en el puerto B del 8255, es decir, se carga en el acumulador del

microprocesador, el dato presente en el puerto B (entrada). • La línea 31, se encarga de complementar el dato del acumulador. • La línea 32 saca al exterior, a través del puerto A, el dato que hay en el acumulador. • La línea 33 provoca un salto incondicional a la línea 30 (LEER) para volver a leer el puerto A y continuar

el ciclo de forma indefinida. EJERCICIO 4 Efectuar un control de 64 lámparas de modo que se iluminen una a una de forma consecutiva. En primer lugar tendremos que realizar un diseño del hardware que nos permita controlar de forma apropiada las 64 unidades de lámparas. Dado que no nos imponen ningún tipo de restricción y claramente podemos observar la insuficiencia de líneas de control en los tres puertos del 8255, podríamos pensar en añadir a nuestro sistema los PPI 8255 necesarios para cubrir la demanda. Sin embargo rechazaremos esta idea inicial, para trabajar sobre la construcción de una “matriz” de lámparas constituida por 8 filas y 8 columnas, que tratadas de modo adecuado puedan ser controladas con dos puertos de 8255. El esquema de principio responde al mostrado en la FIG.75H. En cada nodo de la misma se encontraría situada un lámpara, por lo que controlaríamos en total las 64 lámparas exigidas.

Page 135: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 135 ___________________________________________

Para entrar a tratar la construcción propia de la matriz, fijémonos en primer lugar en una matriz de 2x2 al objeto de comprender su funcionamiento con mayor facilidad. Una matriz de este tamaño responde a la FIG.75I.

En ella puede apreciarse como para iluminar una lámpara, por ejemplo la L11, tendremos que cerrar los interruptores de la columna y de la fila correspondientes, es decir C1 y F1. Sin embargo, con el diseño actual, además de iluminarse la lámpara en cuestión, también circularía corriente por las lámparas L21, L22 y L12, que quedarían conectadas en paralelo según se muestra en la FIG.75J iluminándose las mismas de forma más tenue, pues estarían trabajando a 4V la unidad.

PUER

T O B

PUERTO A

FIG.75H

L21 L22

L11 L12

C1 C2

F1

F2

+12V

+12V

L11

L21

L22

L12

C1

F1

FIG.75I FIG.75J

Page 136: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 136 ___________________________________________

Por tanto este diseño de matriz no es suficiente para llevar a cabo la tarea pedida. Solucionamos este problema, colocando en serie con cada lámpara, un diodo 1N4001, que obligue a circular la corriente en un único sentido a través de las lámparas, e impidiendo su paso en sentido contrario. Atendiendo a esta última consideración, tendremos una matriz de 8x8 según se muestra en la FIG.75K, en la que podemos apreciar con claridad la disposición de los diodos. Disponemos ahora de una matriz de 8 filas y 8 columnas que deseamos manejar con dos puertos del 8255. Sabemos que no podemos atacar directamente las líneas de la matriz con las salidas de dicho integrado, sino que necesitamos del concurso de algún elemento de potencia que realice esta función. En este caso diseñaremos la etapa final a base de transistores, ocho para las filas y ocho para las columnas. De esta manera, cuando deseemos iluminar una lámpara cualquiera, no tendremos más que excitar el transistor correspondiente a su fila y el de su columna. El esquema final de la matriz junto con su equipo de potencia puede verse en la FIG.75L.

L70

D70L60

D60L50

D50L40

D40L30

D30L20

D20L10

D10L00

D00

L71

D71L61

D61L51

D51L41

D41L31

D31L21

D21L11

D11L01

D01

L72

D72L62

D62L52

D52L42

D42L32

D32L22

D22L12

D12L02

D02

L73

D73L63

D63L53

D53L43

D43L33

D33L23

D23L13

D13L03

D03

L74

D74L64

D64L54

D54L44

D44L34

D34L24

D24L14

D14L04

D04

L75

D75L65

D65L55

D55L45

D45L35

D35L25

D25L15

D15L05

D05

L76

D76L66

D66L56

D56L46

D46L36

D36L26

D26L16

D16L06

D06

L77

D77L67

D67L57

D57L47

D47L37

D37L27

D27L17

D17L07

D07

FIG.75K

Page 137: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 137 ___________________________________________

Como podemos apreciar, los transistores que manejan las filas son los BDX53C, se trata de elementos en montaje Darlington que soportan tensiones entre colector y emisor próximas a los 100 V y son capaces de manejar corrientes de colector de hasta 8 A (evidentemente para soportar estos valores extremos deben ir montados sobre disipadores de aluminio adecuados). Son de tipo NPN, por lo que para conseguir su paso a saturación, tendremos que suministrar un nivel de tensión ALTO en sus bases y para conseguir que permanezcan al corte, basta con colocar un nivel BAJO. Los transistores que gobiernan las columnas son los BDX54C que poseen características similares a los anteriores, aunque en este caso son de tipo PNP, por lo que para hacerlos conducir será necesario colocar un nivel BAJO en sus bases y para mantenerlos al corte hay que situar un nivel ALTO. Por ejemplo, para iluminar la lámpara L34, hay que sacar un 1 lógico por PA3 y un 0 lógico por PB4. Construido ya el hardware, pasaremos inmediatamente a desarrollar el software que realice el control de las lámparas según los requerimientos pedidos. Puesto que nos piden el encendido consecutivo de todas las lámparas, debemos conseguir un programa que las encienda de forma individual y consecutiva de manera que al encenderse una de ellas se apague la anterior. Comenzaremos por la L00 (fila 0, columna 0) y continuaremos hasta completar la columna 0, a continuación se procederá igual con la columna 1 y así sucesivamente hasta completas la columna 7 con la última lámpara L77. El primer pseudocódigo con el que podemos iniciar este programa, puede ser el siguiente:

L70

D70L60

D60L50

D50L40

D40L30

D30L20

D20L10

D10L00

D00

L71

D71L61

D61L51

D51L41

D41L31

D31L21

D21L11

D11L01

D01

L72

D72L62

D62L52

D52L42

D42L32

D32L22

D22L12

D12L02

D02

L73

D73L63

D63L53

D53L43

D43L33

D33L23

D23L13

D13L03

D03

L74

D74L64

D64L54

D54L44

D44L34

D34L24

D24L14

D14L04

D04

L75

D75L65

D65L55

D55L45

D45L35

D35L25

D25L15

D15L05

D05

L76

D76L66

D66L56

D56L46

D46L36

D36L26

D26L16

D16L06

D06

L77

D77L67

D67L57

D57L47

D47L37

D37L27

D27L17

D17L07

D07

FIG.75L

T1 R1

PA0

T2 R2

PA1

T3 R3

PA2

T4 R4

PA3

T5 R5

PA4

T6 R6

PA5

T7 R7

PA6

T8 R8

PA7

T9

R9

T10

R

10

T11

R

11

T12

R

12

T13

R

13

T14

R

14

T15

R

15

T16

R

16

+12V

PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

Page 138: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 138 ___________________________________________

NOMBRE: MATRIZ FUNCION: Encendido secuencial de 64 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Iniciar el sistema

Preparar Datos iniciales Contador =0 MIENTRAS Contador<64 Activar lámpara Temporizar Preparar Datos Contador=Contador+1 FIN DE MIENTRAS Fin del programa Procediendo ahora a un estudio más detallado del pseudocódigo como se hizo en los ejemplos anteriores se encontrará:

El proceso “Iniciar sistema” es esencialmente el mismo que en ejercicios anteriores y está siempre enfocado a dejar el sistema electrónico en disposición de comenzar a ejecutar una tarea determinada programando todos los dispositivos del modo adecuado.

Los Datos iniciales son aquellos que sean precisos para comenzar la ejecución. En este caso como

queremos iniciar el encendido por L00, tendremos que preparar los datos que debemos sacar por los puertos A y B para que se ilumine dicha lámpara. Estos datos pueden almacenarse en los registros D y E.

Además necesitamos un Contador para saber cuando se ha finalizado el proceso, es decir, cuando se ha

iluminado la última lámpara (L77). Vamos a asignar esta misión al registro C. El proceso “Activar lámpara”, consistirá en realizar las acciones precisas para sacar los Datos por los puertos A y B del 8255. El proceso “Temporizar” es, como ya supondremos un tiempo de espera que nos permita ver con suficiente detenimiento la lámpara iluminada. Finalmente tendremos que desarrollar los pasos necesarios de preparación de los Datos para activar la lámpara siguiente y repetir este proceso hasta completarlo con el encendido de la lámpara L77. Teniendo en cuenta todo esto obtendremos:

NOMBRE: MATRIZ FUNCION: Encendido secuencial de 64 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones

Punterizar la pila Programar el PPI 8255 Apagar las lámparas D=01H E=FEH C=0 MIENTRAS C<64 Sacar D al puerto A Sacar E al puerto B Temporizar Preparar Datos C=C+1 FIN DE MIENTRAS Fin del programa

Page 139: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 139 ___________________________________________

Nos detendremos un poco en analizar el proceso “Preparar Datos” que deberemos enunciar de forma más concreta. Sabemos que partimos de los Datos iniciales D=0000 0001 (filas) y E=1111 1110 (columnas) (valores expresados en binario). Al sacar estos datos a los puertos A y B respectivamente se enciende la lámpara L00. A continuación pretendemos encender la lámpara L10 por lo que debemos sacar los datos D=0000 0010 y E=1111 1110. Vemos que el único cambio por el momento ha consistido en rotar el contenido del registro D una posición a la izquierda de forma que el bit de mayor peso pasa a ocupar la posición del bit de menor peso. Continuaremos con este proceso hasta completar las ocho lámparas correspondientes a la columna 0. Los datos a sacar se muestran a continuación:

Registro D Registro E 0000 0001 1111 1110 0000 0010 1111 1110 0000 0100 1111 1110 0000 1000 1111 1110 0001 0000 1111 1110 0010 0000 1111 1110 0100 0000 1111 1110 1000 0000 1111 1110

Completada esta columna, la siguiente rotación nos introduciría otra vez el dato 0000 0001 en el registro D, que sería el dato necesario para encender una lámpara de la fila 0 (es lo que deseamos ahora) por lo que el proceso sería correcto, sin embargo ahora necesitamos activar la columna 1, por lo que en el registro E tendrá que aparecer el dato 1111 1101. Luego en este punto habrá que efectuar una rotación a la izquierda del contenido del registro E. Para detectar el momento en que debemos efectuar la rotación de E podemos utilizar el flag CARRY al efectuar la última rotación de D entrará un 1 en dicho flag y al detectar esta condición es cuando puede efectuarse una rotación de E. Los datos necesarios para controlar las lámparas de la columna 1 se muestran a continuación:

Registro D Registro E 0000 0001 1111 1101 0000 0010 1111 1101 0000 0100 1111 1101 0000 1000 1111 1101 0001 0000 1111 1101 0010 0000 1111 1101 0100 0000 1111 1101 1000 0000 1111 1101

Los pasos a seguir para controlar el resto de las columnas son los mismos que se han mencionado hasta el momento, consistentes como hemos visto en efectuar ocho rotaciones al contenido del registro D y una rotación al registro E, hasta que la variable Contador (registro C) nos marque el final del proceso. Desarrollando ahora el paso “Preparar Datos” tendremos como pseudocódigo:

NOMBRE: MATRIZ FUNCION: Encendido secuencial de 64 lámparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones

Punterizar la pila Programar el PPI 8255 Apagar las lámparas D=01H E=FEH C=0 MIENTRAS C<64 Sacar D al puerto A Sacar E al puerto B Temporizar Poner CARRY=0

Page 140: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 140 ___________________________________________

Rotar D a izquierda con CARRY SI CARRY=1 Rotar E a izquierda FIN DE SI C=C+1 FIN DE MIENTRAS Fin del programa A continuación se muestra el diagrama de flujo del pseudocódigo (FIG.75M) de forma detallada, para que pueda servir de referencia al estudio y al posterior paso al lenguaje ensamblador.

INICIO

Prohibir Interrupciones Punterizar la Pila Programar el 8255

Apagar lámparas

D=01H E=FEH C=0

C<64 Si

No

Sacar D al puerto A Sacar E al puerto B

Temporizar

CARRY=0 Rotar D a izqda. con CARRY

CARRY=1 No

Si

Rotar E a izqda.

C=C+1

FIN

FIG.75M

SALT2

SALT1

Page 141: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 141 ___________________________________________

Para finalizar este ejercicio, tendremos que determinar el programa en lenguaje ensamblador, partiendo o teniendo como base el pseudocódigo escrito con anterioridad, obteniendo así el programa fuente definitivo, cuyo listado se muestra a continuación una vez ensamblado.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : MATRIZ.ASMOUTPUT FILENAME : MATRIZ.OBJ

1 ;------------------------------------------2 ;NOMBRE : MATRIZ3 ;FUNCION : Encendido secuencial 64 lamparas4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;------------------------------------------78 ;------------------------------------------9 ;PARAMETROS PARA EL 8255

10 ;------------------------------------------11 00 B0 PA82 EQU B000H ;Puerto A del 825512 01 B0 PB82 EQU B001H ;Puerto B del 825513 02 B0 PC82 EQU B002H ;Puerto C del 825514 03 B0 REES82 EQU B003H ;Reg Estado 825515 ;------------------------------------------1617 ;------------------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;------------------------------------------20 FF 87 PPILA EQU 87FFH ;Puntero pila RAM21 ;------------------------------------------2223 0000 MATRIZ:24 0000 F3 DI25 0001 21 FF 87 LXI H,PPILA26 0004 F9 SPHL27 0005 3E 80 MVI A,80H28 0007 32 03 B0 STA REES8229 000A 3E 00 MVI A,00H30 000C 32 00 B0 STA PA8231 000F 16 01 MVI D,01H32 0011 1E FE MVI E,FEH33 0013 0E 00 MVI C,00H34 0015 79 SALT2 MOV A,C35 0016 FE 40 CPI 6436 0018 CA 34 00 JZ FIN37 001B 7A MOV A,D38 001C 32 00 B0 STA PA8239 001F 7B MOV A,E40 0020 32 01 B0 STA PB8241 0023 CD 35 00 CALL TEMPO42 0026 A7 ANA A43 0027 7A MOV A,D44 0028 07 RLC45 0029 57 MOV D,A46 002A D2 30 00 JNC SALT147 002D 7B MOV A,E48 002E 07 RLC49 002F 5F MOV E,A50 0030 0C SALT1 INR C51 0031 C3 15 00 JMP SALT252 0034 76 FIN HLT

Page 142: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 142 ___________________________________________

5354 ;------------------------------------------55 ;NOMBRE: TEMPO56 ;FUNCION: Proporciona un tiempo de espera57 ;PRECONDICIONES: Ninguna58 ;POSTCONDICIONES: Ninguna59 ;------------------------------------------60 0035 TEMPO:61 0035 F5 PUSH PSW62 0036 D5 PUSH D63 0037 11 FF 07 LXI D,07FFH64 003A 1B TE1 DCX D65 003B 7A MOV A,D66 003C B3 ORA E67 003D 00 NOP68 003E 00 NOP69 003F 00 NOP70 0040 C2 3A 00 JNZ TE171 0043 D1 POP D72 0044 F1 POP PSW73 0045 C9 RET7475 0046 END

************ S Y M B O L I C R E F E R E N C E T A B L E ************

FIN 0034 MATRIZ 0000 PA82 = B000 PB82 = B001PC82 = B002 PPILA = 87FF REES82 = B003 SALT1 0030SALT2 0015 TE1 003A TEMPO 0035

LINES ASSEMBLED : 75 ASSEMBLY ERRORS : 0

• Las primeras líneas no se comentarán, pues como en programas anteriores, constituyen la documentación

del programa, el establecimiento de parámetros y la inicialización del sistema. • En las líneas 29 y 30, se realiza el bloqueo y apagado de todas las lámparas. • Las líneas 31, 32 y 33, establecen los Datos iniciales y contadores. • Las líneas 34, 35 y 36, realizan la primer toma de decisión (C<64) y en caso de alcanzar la condición final,

se salta al final del programa. • En las líneas 37 y 38, sacamos el dato (D) al puerto A (filas). • En las líneas 39 y 40, sacamos el dato (E) al puerto B (columnas). • En la línea 41 se realiza una llamada a la subrutina de temporización. • La línea 42 pone el CARRY a nivel BAJO, y las líneas 43 y 44 rotan el dato (D) a la izquierda y se guarda

el resultado con la instrucción de la línea 45. • En la línea 46, si no se llega a la última posición de la columna, saltamos a incrementar el contador, línea

50. Si se ha llegado a la última posición, se pasa a ejecutar las líneas 47, 48 y 49, en las que se rota a la izquierda el dato (E) de las columnas, para luego pasar a incrementar el contador C (línea 50).

• En la línea 51, se produce un salto incondicional a la línea 34 para reiniciar el proceso. • Desde las líneas 54 a 73, se establece la subrutina de temporización, similar a las anteriores.

Page 143: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1 2 3 4 5

6

7

8

9

7.6 EJERCICIOS.

______________________________________ 143 ___________________________________________

. ¿En qué consiste la transferencia de datos al exterior?

. Indicar el nivel lógico que hace activas las siguientes señales del PPI 8255 : A0, RD, CS, RESET.

. Describir los modos de funcionamiento del PPI 8255.

. Cual es la misión del grupo funcional Lectura/escritura y Control lógico.

. Encontrar los códigos correspondientes a los siguientes modos de programación del PPI 8255: Puerto A Puerto B Puerto C (Alta) Puerto C (Baja) Salida Salida Salida Salida Salida Entrada Salida Salida Entrada Entrada Entrada Entrada Salida Salida Entrada Entrada Entrada Entrada Salida Salida Entrada Salida Salida Entrada

. Realizar un dibujo de la conexión física del 8255, al bus del microprocesador 8085, empleando para la selección del mismo, la salida CS6 del sistema básico mostrado en la FIG.24A (tema 2). Expresar las direcciones de acceso definitivas para este caso.

. Realizar los cambios precisos en el programa INTERMI.ASM para que el tiempo de encendido y apagado sea el doble.

. Intentar modificar el programa SECUEN.ASM, de modo que en lugar de utilizar los tres bucles similares propuestos en el ejemplo, se utilice una única subrutina que sea llamada en tres ocasiones. (Sugerencia: A la subrutina debemos proporcionarle como datos de entrada C=00H, B=8 y el puerto por el que deseamos sacar los datos cada vez que se efectúe una llamada).

. En el programa MATRIZ.ASM, realizar los siguientes cambios: • Conseguir que el encendido secuencial se realice de forma mas rápida. • Realizar el encendido secuencial completando en primer lugar la fila 0, a continuación la fila 1,

fila 2, ..., fila 7.

Page 144: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 144 ___________________________________________

TRANSFERENCIA DE DATOS AL EXTERIOR

(II).

8

Page 145: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

dinc

pa

I

rnese

8. TRANSFERENCIA DE DATOS AL EXTERIOR.

______________________________________ 145 ___________________________________________

Ya hemos hablado en el tema anterior sobre la necesidad de disponer en nuestro sistema de un medio e comunicación con el exterior, es decir disponer en nuestra tarjeta de un componente que nos permita tercambiar información. Se ha visto también cómo se realizan distintas operaciones de entrada/salida con un

omponente especializado en dichas funciones. En este tema se tratará sobre otro de los componentes de la casa INTEL, específicamente diseñados

ara este tipo de comunicaciones y que es de funcionamiento bastante similar al tratado en el tema anterior, unque con sus características propias.

Se trata en este caso del PPI 8155, un dispositivo diseñado para trabajar con microprocesadores

NTEL, que dispone de tres puertos de comunicaciones entrada/salida y una memoria RAM interna. Todos los puntos que trataremos a continuación tendrán como referencia el diagrama de bloques

epresentado en la FIG.8A. Como podemos apreciar la fuente de alimentación genera todas las tensiones ecesarias para alimentar tanto al sistema básico como al PPI 8155 que pretendemos acoplar y a los distintos lementos que constituirán los elementos a gobernar. El PPI 8155 será controlado directamente por nuestro istema básico, mediante un conjunto de líneas bidireccionales y las cargas serán manejadas por los puertos de ntrada/salida del periférico programable.

En los puntos que siguen, se realizará: • Una descripción física de dicho componente, mediante la cual se dará a conocer la misión de

todos sus terminales. • Un estudio sobre su constitución interna, especificando los bloques en los que se divide y la

función de cada uno de ellos. • La descripción del método de programación y sus modos de trabajo. • Un análisis sobre la forma de conectarlo al microprocesador 8085A. • Un conjunto de ejemplos prácticos de aplicación que nos permitirán iniciarnos en la programación

del 8155 y el manejo tanto de sus puertos de entrada/salida como de sus 256 octetos de memoria RAM interna.

SISTEMA BASICO DEL 8085

FUENTE DE ALIMENTACION

PPI 8155

C1

C2

C3

FIG.8A

Page 146: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

dppc

ccep

dd

d

8.1 DESCRIPCIÓN FÍSICA DEL PPI 8155.

______________________________________ 146 ___________________________________________

El 8155 es un periférico programable de interface de la familia INTEL diseñado para acoplarse

irectamente al bus de datos del microprocesador 8085. Se presenta en un encapsulado (dual in line) de 40 atillas, y emplea una alimentación única de +5V filtrados y estabilizados. Las características eléctricas básicas ueden encontrarse en la bibliografía proporcionada por el fabricante, así como los diagramas de tiempos de iclos de lectura y escritura.

Debemos destacar además, que existe otro componente de entrada/salida denominado 8156, cuya

onstitución es prácticamente similar a la del 8155. La única diferencia funcional entre ambos componentes, onsiste en la activación de la señal de selección de chip. Mientras en el 8155 se activa con nivel lógico BAJO, n el 8156 se activa con nivel lógico ALTO. Por consiguiente, todo lo que se expone seguidamente, es válido ara ambos componentes.

Disponen de 22 terminales para comunicación de entrada/salida, 8 líneas que constituyen el bus de

atos/direcciones, una línea de entrada de reloj y una línea de salida de un temporizador programable, así como iversas líneas para las necesarias señales de control de los dispositivos.

En la FIG.81A puede verse su configuración física, y a continuación se proporciona una descripción

etallada de la misión de cada una de las patillas. • Patillas PA0 a PA7. Terminales correspondientes a 8 líneas de entrada/salida del puerto A.

Constituyen un byte de datos (octeto) de entrada/salida, siendo PA0 el bit de más bajo orden y PA7 el bit de más alto orden.

• Patillas PB0 a PB7. Terminales correspondientes a 8 líneas de entrada/salida del puerto B. Constituyen un byte de datos (octeto) de entrada/salida, siendo PB0 el bit de más bajo orden y PB7 el bit de más alto orden.

• Patillas PC0 a PC5. Terminales correspondientes a 6 líneas de entrada/salida del puerto C. Constituyen un byte de datos de entrada/salida, siendo PC0 el bit de más bajo orden y PC5 el bit

8155

PC3 1 40 Vcc PC4 2 39 PC2

TIMER IN 3 38 PC1RESET 4 37 PC0

PC5 5 36 PB7TIMER OUT 6 35 PB6

IO/M 7 34 PB5CS 8 33 PB4RD 9 32 PB3WR 10 31 PB2

ALE 11 30 PB1AD0 12 29 PB0AD1 13 28 PA7

GND 20 21 PA0

AD2 14 27 PA6AD3 15 26 PA5AD4 16 25 PA4AD5 17 24 PA3AD6 18 23 PA2AD7 19 22 PA1

FIG.81A

Page 147: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 147 ___________________________________________

de más alto orden. Como podemos apreciar, este puerto solamente transmite palabras de 6 bits, por lo que cuando saquemos un dato del acumulador hacia el exterior a través del puerto C, saldrán los 6 bits de menor peso, perdiéndose los bits de orden 6 y 7 del acumulador. Un proceso similar ocurre cuando se realice una operación de lectura a través de este puerto.

• Patilla Vcc. Terminal de alimentación (+5V). Debe ser una tensión perfectamente filtrada y estabilizada. Es conveniente colocar entre este terminal y masa un condensador de desacoplo.

• Patilla GND. Potencial de referencia o masa de alimentación. • Patilla TIMER IN. Entrada del contador programable interno. Es la entrada de reloj (clock) que

servirá como frecuencia base para el funcionamiento del timer interno. • Patilla TIMER OUT. Salida del contador programable interno. • Patilla RESET. Es la entrada de control mediante la cual podemos reinicializar el dispositivo. Es

activa a nivel ALTO. (Al provocar un RESET, las tres puertas quedan programadas como entradas).

• Patilla IO/M. Se trata de una señal de control que nos permite diferenciar entre un acceso a un puerto de entrada/salida (con 1) o a una dirección de memoria RAM (con 0).

• Patilla CS. Es una entrada de control que permite la selección de chip. Es activa con nivel lógico BAJO para el 8155. (Es activa con nivel lógico ALTO para el 8156).

• Patilla RD. Es una señal de control del 8155 (8156) que será conectada directamente a la señal RD del microprocesador 8085A. Es activa a nivel lógico BAJO y en ese momento produce la lectura de un puerto o de una dirección de memoria RAM del 8155. Cuando efectuemos una operación de lectura sobre el 8155, estaremos transfiriendo al acumulador del microprocesador, el contenido del Registro de Estado o la información presente en alguno de los puertos de entrada/salida o algún dato de la memoria RAM del 8155

• Patilla WR. Es una señal de control del 8155 (8156) que será conectada directamente a la señal WR del microprocesador 8085A. Es activa a nivel lógico BAJO y en ese momento produce la escritura en un puerto o en una dirección de memoria RAM del 8155. Cuando efectuemos una operación de escritura sobre el 8155, estaremos transfiriendo información desde el acumulador del microprocesador, a la memoria RAM del 8155 o a un puerto de entrada/salida o al Registro de Estado del 8155..

• Patilla ALE. Es una entrada de control que debe ser conectada directamente a la señal ALE del microprocesador 8085A. Mediante un impulso en esta patilla, el 8155 diferencia o discrimina la dirección del dato, ya que ambos llegan por el mismo bus (el mismo conjunto de líneas). En otras palabras separa direcciones de datos.

• Patillas AD0 a AD7. Conjunto de 8 líneas que forman el bus multiplexado de datos y direcciones. A través de este bus pasamos los datos entre el microprocesador y el PPI 8155. El flujo de información es en ambos sentidos.

La constitución interna del 8155 puede dividirse en una serie de bloques que nos permitan una más fácil asimilación de los conceptos básicos que nos posibiliten comprender su funcionamiento de una forma rápida.

Esta serie de bloques funcionales, que pueden apreciarse en la FIG.82A, son básicamente: • Un bloque de entrada/salida compuesto por tres registros tampones o puertos de E/S, que permiten

intercambiar datos con el exterior en paralelo. Dispone de dos puertos de 8 bits (puerto A y puerto B) y un puerto de 6 bits (puerto C). Estos puertos son accesibles cuando la pastilla está seleccionada (CS=0) y cuando IO/M = 1. Pueden ser programados como entradas, como salidas o según procedimiento de intercambio. (Más adelante veremos su modo de programación).

• Un bloque de memoria RAM organizada en 256 palabras de 8 bits (octetos) que será seleccionada cuando

IO/M=0 y CS=0.

8.2 DESCRIPCIÓN FUNCIONAL DEL PPI 8155.

Page 148: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 148 ___________________________________________

• Una unidad de contador o timer integrado de 14 bits programable según cuatro modos distintos de trabajo. • Un bloque de control de estado y mando que sincroniza todas las operaciones que puede realizar el 8155

mediante la programación adecuada por software.

La utilización de las puertas se hace directamente a partir del microprocesador, utilizando la instrucción OUT addr, o la instrucción STA addr o cualquier otra de almacenamiento, siempre que "addr" seleccione el registro del puerto adecuado. Para efectuar la selección del puerto A, B o C adecuado en cada momento, la parte baja del bus de direcciones del microprocesador, debe presentar los siguientes valores:

Puerto A XXXX X001 Puerto BXXXX X010 Puerto C XXXX X011 (Los bits marcados con X, son valores indiferentes):

Si tenemos en cuenta que el puerto C solamente dispone de 6 bits, podremos concluir que serán extraídos del acumulador los 6 bits menos significativos.

Cada puerto del 8155 puede ser programado como entrada, para transferir datos desde el exterior hacia el microprocesador, o como salida, para enviar datos desde el microprocesador hacia el exterior del sistema. Como podemos apreciar, no existe la posibilidad de programar los bits de cada puerto de forma individual como entrada o salida, sino que serán todos entradas o todos salidas (para cada puerto).

Para programar los puertos del 8155 como entrada o como salida con o sin procedimiento de intercambio, es necesario especificar en qué “modo” se pretende utilizar. Esto se logra mediante la programación de un registro especializado denominado "Registro de Mando de Estado (C/E)". Este registro posee 8 bits y en virtud de los unos o ceros que coloquemos en él, los puertos quedarán programados de una forma u otra. Para introducir una determinada combinación en este registro debemos direccionarlo, siendo su código de acceso:

Registro Estado XXXX X000

Por tanto, antes de empezar a trabajar con él, debemos indicarle el modo de trabajo que vamos a

CONTROL DE MANDO Y ESTADO

PUERTA A

PUERTA B

PUERTA C

PA0 PA7

PB0 PB7

PC0 PC5

DATOS

RAM

CONTADOR TEMPORIZADOR PROGRAMABLE

TIMER OUT TIMER IN

FIG.82A

ALE

RD

WR

AD0-AD7 CS IO/M RESET

REGISTRO DIRECCIO- NES

DIREC- CIONES

Page 149: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 149 ___________________________________________

emplear. El formato de instrucción de dicho registro es: TM2 TM1 IEB IEA PC2 PC1 PB PA

A continuación se describe la función de cada bit:

Bit 0 (PA): Este bit programa el puerto A. Si PA=1 el puerto se utiliza como salida y si PA=0 el puerto se utiliza como entrada.

Bit 1 (PB): Este bit programa el puerto B. Si PB=1 el puerto se utiliza como salida y si PB=0 entonces

se utiliza como entrada.

Bits 2 y 3 (PC1 y PC2): Estos dos bits programan el puerto C atendiendo a las combinaciones que se resumirán en la tabla siguiente:

PC2 PC1 MODO DE PUERTA C 0 0 MOD1 0 1 MOD3 1 0 MOD4 1 1 MOD2

La función de cada pin de la puerta C en cada uno de estos cuatro modos de trabajo enunciados es como se muestra en la siguiente tabla:

Pin MOD1 MOD2 MOD3 MOD4

PC0 entrada salida A INTR A INTR PC1 entrada salida A BF A BF PC2 entrada salida A STB A STB PC3 entrada salida salida B INTR PC4 entrada salida salida B BF PC5 entrada salida salida B STB siendo:

• INTR : Bit de mando cuya función es de requerimiento de interrupción. Nivel BAJO si está como entrada y nivel ALTO si está como salida.

• BF : Bit de mando cuya función es ser indicador de buffer completo, es decir, indica si el

dato a recibir está presente ya en el puerto para ser leido o si el dato ha sido sacado hacia el exterior por el puerto. Nivel ALTO tanto en entrada como en salida.

• STB : Bit de mando cuya función es de “entrada de control” tanto en modo entrada como

en modo salida.

Bit 4 (IEA): Si tenemos IEA=0 estamos ante una interrupción no autorizada para el puerto A. Si tenemos IEA=1, estamos ante una interrupción autorizada para el puerto A.

Bit 5 (IEB): Si tenemos IEB=0, estamos ante una interrupción no autorizada para el puerto B. Si tenemos IEB=1, estamos ante una interrupción autorizada para el puerto B.

Bits 6 y 7 (TM1 y TM2): Estos dos bits permiten la programación de un contador interno de 14 bits del 8155 (TIMER). Este contador posee cuatro modos o posibilidades de programación. Si colocamos el valor 00 el contador no efectúa ninguna operación. Para cargar el valor de los 14 bits de este contador se dispone de dos registros a los cuales se accede con las direcciones:

Timer Low XXXX X100 Timer High XXXX X101

Page 150: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 150 ___________________________________________

Su modo de operación puede ser programado en cualquier momento que se desee. Como base de tiempos puede emplearse cualquier señal de nivel TTL conectándola a la entrada de tiempos (TIMER IN). La salida del contador se obtiene en TIMER OUT.

Como se sabe, el control del Timer es conformado en el Comando de Estado (C/E) según los bits TM1

y TM2 durante su programación de acuerdo a la siguiente tabla:

TM2 TM1 MODO DEL CONTADOR 0 0 No afecta al contador o timer 0 1 Alto a la cuenta del timer 1 0 Para la cuenta después de TC 1 1 Inicia la operación timer

Una vez programado C/E, el modo de operación es definido como sigue mediante la escritura de dos

palabras de 8 bits en Timer Low y Timer High:

Timer Low : T7 T6 T5 T4 T3 T2 T1 T0 Timer High: M2 M1 T13 T12 T11 T10 T9 T8

Los dos bits de más alto orden (M2 y M1) se utilizan para definir el modo definitivo de operación según la tabla siguiente:

M2 M1 OPERACION 0 0 ALTO al inicio y BAJO en la 2ª mitad de la cuenta 0 1 Onda cuadrada. Periodo = Duración de la cuenta. 1 0 Pulso simple de TC 1 1 Pulso simple de TC con autorrecarga.

El microcircuito 8155, para comunicarse con el exterior precisa también conocer el estado del registro

C/E, para lo cual deberá procederse a la lectura del mismo. Los 8 bits leídos son de hecho diferentes de los 8 bits definidos precedentemente, siendo por tanto C/E un registro doble. El formato de instrucción es como sigue:

XX TIMER INTE B B BF INTR B INTE A A BF INTR A

Para cada puerta se accede a los bits siguientes:

• Bit 7 (X): Bit de estado indiferente. • Bit 6 (TIMER): Define una interrupción del timer. Con un nivel ALTO bloquea el contador y

después de leído el registro resetea o inicia una nueva cuenta. • Bit5 (INTE B): Determina si el puerto B tiene una interrupción autorizada. Está autorizada con un

nivel lógico ALTO. • Bit 4 (B BF): Este bit nos indica si el puerto B tiene el buffer de entrada o salida completo. Nos

indica si el dato a recibir está presente ya en el puerto para ser leído, o bien si el dato ha sido sacado hacia el exterior por el puerto B.

• Bit 3 (INTR B): Es el bit de requerimiento de interrupción del puerto B. Está activo con nivel lógico ALTO.

• Bit 2 (INTE A): Idem al bit 5, pero referido al puerto A. • Bit 1 (A BF): Idem al bit 4, pero aplicado al puerto A. • Bit 0 (INTR A): Idem al bit 3, pero aplicado al puerto A.

Page 151: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

Además de los tres puertos de entrada/salida y el Timer interno, sabemos que el 8155 (8156) posee

una capacidad de memoria RAM interna de 256 octetos (256X8 bits). A esta memoria podemos acceder en el momento que deseemos, sin más condición que la de seleccionar correctamente el dispositivo mediante su pin de selección CS y tener adecuadamente conectada la señal IO/M a la correspondiente del microprocesador. El acceso se conseguirá con una instrucción como STA, para escribir un dato por ejemplo.

e

fo

.

8.3 INTERCONEXION DEL 8155 CON EL µP 8085A

______________________________________ 151 ___________________________________________

Es claro, por todo lo estudiado hasta el momento, que el PPI 8155 es un periférico programable cuya structura permite su utilización directa con el microprocesador 8085.

El 8155 dispone de ciertas características que hacen posible su conexión al microprocesador de dos

rmas claramente diferenciadas que veremos a continuación:

• POSIBILIDAD 1

Dada la estructura del 8155, no tendremos más que: - Unir las patillas AD0, AD1, AD2, AD3, AD4, AD5, AD6 y AD7 a las patillas correspondientes

del bus de datos/direcciones del microprocesador. - Unir la patilla de RESET del 8155 a la patilla RESET OUT del microprocesador, colocando un

condensador a masa de 15 pF.

- Conectar los terminales de masa (GND) y alimentación (Vcc) a la masa y alimentación del microprocesador (+5V). Es conveniente colocar un condensador a masa de 100 nF en el terminal de alimentación.

- Conectar las señales ALE, RD y WR del 8155 directamente a las patillas ALE, RD y WR del microprocesador.

- La patilla TIMER IN del 8155 se conectará a la salida CLK OUT del microprocesador.

- La patilla CS (selección de chip) será controlada mediante una de las salidas libres del decodificador de direcciones. En este caso elegiremos la salida CS4.

- El terminal IO/M del 8155 se conecta directamente a la señal de control IO/M de idéntica denominación del microprocesador.

- Finalmente dispondremos de 22 líneas para comunicarse con el exterior que forman los tres puertos de entrada/salida del 8155 y de una línea de salida de un contador o temporizador denominada TIMER OUT.

De esta forma tendremos perfectamente acoplado este nuevo componente a nuestro sistema. En la FIG.83A puede verse el esquema de esta conexión. No nos queda ahora más que estudiar la forma de acceso al mismo, o lo que es igual, encontrar las direcciones de sus registros internos y puertos de entrada/salida. Para ello debemos darnos cuenta que para efectuar la selección del dispositivo hay que hacer activa la salida CS4 del decodificador de direcciones, es decir, hay que colocar en la parte alta del bus de direcciones (A15, A14, A13 y A12) el valor binario 1100, por lo que dicha combinación es obligatoria. Por tener conectada la señal IO/M del microprocesador, para acceder a los puertos de E/S será necesario emplear las instrucciones OUT PORT e IN PORT para sacar o leer datos del exterior y como sabemos por el tema 4, (al emplear estas instrucciones el microprocesador entiende que deseamos tener acceso a una entrada/salida y automáticamente coloca

Page 152: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 152 ___________________________________________

un 1 lógico en la señal IO/M) el operando PORT representa el puerto seleccionado. Tendremos por tanto que situar en los bits de dirección más bajos (A0, A1 y A2) los códigos correspondientes a los puertos A, B, C y el código correspondiente del registro de estado, según el elemento al que deseemos tener acceso. Ambas instrucciones (OUT e IN) tienen el mismo efecto sobre el bus de direcciones, duplican el valor asignado a PORT en dicho bus. Por ejemplo con la instrucción OUT B1H, sacaríamos hacia el exterior el contenido del acumulador, y en el bus de direcciones tendríamos el valor B1B1H. De modo similar con la instrucción IN B3H, cargaríamos un dato del exterior en el acumulador y tendríamos en el bus de direcciones el valor B3B3H.

Por tanto en nuestro caso, para acceder a los puertos y registro de estado del 8155 tendríamos que

colocar como valor de PORT:

Puerto A PORT = C1H Puerto B PORT = C2H Puerto C PORT = C3H Timer Low PORT = C4H Timer High PORT = C5H Registro de estado PORT = C0H

Cuando deseemos trabajar con la memoria interna del 8155, no podremos utilizar la

instrucciones especiales OUT e IN, sino que habrá que emplear instrucciones normales como LDA o bien STA, según sea el caso, seguidas de la dirección de memoria a la que deseemos acceder, que en el caso que estamos tratando, serán los 256 octetos comprendidos entre las direcciones siguientes:

RAM 8155 C000H hasta C0FFH

• POSIBILIDAD 2.

La segunda posibilidad de conectar este integrado, es en todo similar a la anterior, la única diferencia radica en que la señal IO/M del 8155 no se conecta a la equivalente IO/M del microprocesador, sino que se controla mediante una línea del bus de direcciones. Nosotros elegiremos

21 PA0 22 PA1 23 PA2 24 PA3 27 PA4 25 PA5 26 PA6 28 PA7

PC0 37 PC1 38 PC2 39 PC3 1 PC4 2 PC5 5

AD0 12 AD1 13 AD2 14 AD3 15 AD4 16 AD5 17 AD6 18 AD7 19

29 PB0 30 PB1 31 PB2 32 PB3 33 PB4 34 PB535 PB6 36 PB7

6 TIMER OUT 4 RESET

ALE 11 WR 10

RD 9 IO/M 7

CS 8 TIMER IN 3

+5V 100 nF

40 20

FIG.83A

D0 D1 D2 D3 D4 D5 D6 D7

ALE WR RD IO/M CS4

CLK OUT

RESET OUT

15pF

PUERTO C PUERTO A

PUERTO B

BUS 8085 8155

Page 153: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 153 ___________________________________________

este método y conectaremos a dicha señal la línea de direcciones A10 (podríamos haber elegido otra). Para acceder a los puertos de entrada/salida o al registro de estado no podremos utilizar ahora las instrucciones OUT e IN puesto que no usamos la salida IO/M del microprocesador. En este caso, tanto para los puertos y registro de estado, como para las direcciones de RAM interna, se utilizarán instrucciones como STA o bien LDA seguidas de la dirección correspondiente.

Al igual que en el caso anterior, para seleccionar el chip debemos colocar en la parte alta del

bus de direcciones (A15, A14, A13, A12) el dato binario 1100. Además hay que colocar en la parte baja (A0, A1, A2) el código correspondiente al elemento que deseemos utilizar. Y finalmente, tendremos que colocar la línea de direcciones A10 a nivel lógico 1 para acceder a los puertos y registro de estado y a nivel lógico 0 para tener acceso a las posiciones de memoria RAM interna.

Por tanto las direcciones a considerar en nuestro caso serán: Puerto A C401H Puerto B C402H Puerto C C403H Timer Low C404H Timer High C405H Registro de estado C/E C400H RAM 8155 C000H hasta C0FFH En la FIG.83B puede verse la representación esquemática de esta conexión, que será la que

finalmente utilizaremos en nuestro sistema.

21 PA0 22 PA1 23 PA2 24 PA3 27 PA4 25 PA5 26 PA6 28 PA7

PC0 37 PC1 38 PC2 39 PC3 1 PC4 2 PC5 5

AD0 12 AD1 13 AD2 14 AD3 15 AD4 16 AD5 17 AD6 18 AD7 19

29 PB0 30 PB1 31 PB2 32 PB3 33 PB4 34 PB535 PB6 36 PB7

6 TIMER OUT 4 RESET

ALE 11 WR 10

RD 9 IO/M 7

CS 8 TIMER IN 3

+5V 100 nF

40 20

FIG.83B

D0 D1 D2 D3 D4 D5 D6 D7

ALEWR RD A10 CS4

CLK OUT

RESET OUT

15pF

BUS 8085

PUERTO C PUERTO A

PUERTO B

8155

Page 154: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

dp

E

ah acp m2m5dtr qeqfocsraep

8.4 EJEMPLOS DE E/S CON EL PPI 8155.

______________________________________ 154 ___________________________________________

A continuación se desarrollaran una serie de ejemplos prácticos que nos permitan tener una idea clara e la forma de operar del PPI 8155. Como veremos se tratará de comenzar con las operaciones más simples ara, poco a poco, aumentar su nivel de complejidad.

JEMPLO 1.

Realizar el control de 8 lámparas de 100 w, conectadas a tensión alterna de 220 V. Con este ejercicio se pretende desarrollar un control (sin especificar el proceso de encendido y

pagado) sobre 8 elementos de carga (lámparas) que manejaremos mediante el puerto A (también lo podríamos acer con el puerto B).

Como es lógico, debemos pensar en realizar el diseño del equipo necesario para controlar las lámparas 220 V de c.a. Es decir, hay que disponer del hardware adecuado de potencia, que nos posibilite manejar las argas finales. Una vez lo tengamos dispuesto, lo conectaremos al 8155 y se procederá a desarrollar el rograma de control.

En primer lugar, como elemento final de control en potencia, se empleará el triac TXAL228, que anejará directamente el encendido y apagado de las lámparas. Este triac, que se presenta en encapsulado TO

20 AB plástico, soporta una tensión entre ánodos de 400 V y un pico de corriente máxima de 90 A durante 20 s como máximo. La corriente máxima a la que debe ser sometido el terminal de puerta está alrededor de los

0 mA y la temperatura que aguanta la juntura estará próxima a los 100 ºC Al tratarse de una carga resistiva y e relativamente baja potencia, no necesitaremos circuitos de control y protección añadidos. Por supuesto, el iac irá montado sobre un disipador de calor que le permita refrigerar su estado térmico interno.

El terminal de control del triac será gobernado mediante un acoplador óptico denominado MOC3041, ue se presenta en un encapsulado dual in line con 6 terminales de conexión o patillas. Su distribución y squema equivalente podemos verlo en la FIG.84A. Como podemos apreciar las patillas 3 y 5 son inactivas, ya ue no tienen conexión y por tanto carecen de función alguna. Los terminales 1 y 2 son el ánodo y cátodo del to-diodo emisor interno, mientras que los terminales 6 y 4, son los terminales accesibles del receptor, en este

aso constituido por un triac fotosensible. Cuando se hace pasar una corriente por el emisor, éste emite una eñal que incide sobre el receptor, haciendo que pase al estado de conducción. Si el emisor está en reposo, el eceptor se comporta como un circuito abierto. La misión fundamental del optoacoplador es separar la tensión lterna de 220 V que se emplea para las lámparas, de la tensión de alimentación de las tarjetas que constituyen l equipo. Además reducen al mínimo las interferencias por ruidos eléctricos que se puedan producir en los rocesos de conmutación de los triacs.

K1 C2

SC C1A1 MOC3041 SC

FIG.84A

1 6

2 4

Page 155: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 155 ___________________________________________

La FIG.84B, nos muestra la forma de conectar el acoplador óptico al triac (elemento de potencia). Como podemos apreciar, entre los terminales de salida del triac se sitúa una red RC cuya misión es proteger al semiconductor de potencia, de las posibles sobrecargas que se puedan producir por las corrientes inductivas de la carga. Sin embargo debemos recordar que en nuestro caso, serán mínimas, debido a que la carga es fundamentalmente resistiva. En esta figura podemos además observar cómo están perfectamente separadas las partes de alta tensión de las de baja tensión. El terminal de control será llevado directamente a una línea de salida del puerto A del 8155. Cuando en esta línea de control se presente un uno lógico o nivel ALTO, se establecerá una circulación de corriente a través del diodo fotoemisor , que provocará la excitación del receptor (triac fotosensible) que se hará conductor permitiendo el paso de la corriente y provocando con ello la excitación del triac de potencia, que a su vez, permitirá el paso de corriente, haciendo que se encienda la lámpara que lleve conectada como carga. (Debemos recordar que el triac se desactiva automáticamente cada vez que la corriente pasa por cero, es decir, en cada semiciclo, por lo que es necesario redisparar el triac en cada semionda o bien mantenerlo con la señal de control activada durante el tiempo que consideremos oportuno).

Finalmente, si deseamos controlar ocho unidades u ocho lámparas, deberemos contar con ocho bloques como el anterior, obteniendo de este modo el esquema definitivo de la FIG.84C. En ella puede verse cómo todas las líneas de control son gobernadas por las líneas del puerto A del 8155, de tal forma que la línea PA0 controla la lámpara L0, PA1 controla L1, PA2 controla L2, etc. Por tanto, según este esquema final, si deseamos encender una lámpara cualquiera, por ejemplo L3, tendremos que sacar por la línea PA3 del 8155 un uno lógico, es decir, un nivel ALTO. Si deseamos tener iluminadas las lámparas L1, L3 y L5, tendremos que sacar los correspondientes unos lógicos por las líneas PA1, PA3 y PA5 (por el resto de las líneas del puerto A sacaremos niveles BAJOS). Finalmente, insistir en la necesidad de dotar a los triacs de refrigeradores que permitan evacuar de la forma más apropiada y rápida las pérdidas de potencia producidas por calor durante su funcionamiento. Dichos refrigeradores serán construidos de aluminio, material de muy baja resistencia térmica. El contacto entre el disipador y el propio triac debe ser lo más perfecto posible, por lo que, para mejorarlo, puede emplearse una “pasta” de unión especialmente fabricada para este propósito. Al trabajar directamente con la alimentación de red, es muy importante fijarse en que no queden cables descubiertos de modo que puedan producirse contactos no deseados. Las partes metálicas de los chasis deben conectarse sólidamente a tierra. Debe tenerse sumo cuidado en el manejo de estos circuitos de potencia ya que al margen de los posibles accidentes personales nunca deseados, pueden producirse daños irreparables en los circuitos de nuestro sistema de control.

220V +5V MOC3041

FIG.84B

R1 220

R2 56

R3 1K2

LAMPARA

R4 100

C1 0’1uF 250V

TXAL228

CONTROL

ULN2803

Page 156: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 156 ___________________________________________

Finalizado el proceso de diseño del hardware de control, pasamos a realizar el diseño del software que nos permitirá, mediante nuestro sistema basado en el microprocesador 8085 y apoyándonos en el PPI 8155, manejar el encendido y apagado de las ocho lámparas.

+5V MOC3041

220

TXAL228 1K2

560’1uF

100 1

2

3

BLOQUE A

1 3 2 L0 220V

3 2 L1 220V

3 2 L2 220V

3 2 L3 220V

3 2 L4 220V

3 2 L5 220V

3 2 L6 220V

3 2 L7 220V

1

1

1

1

1

1

A

A

A

A

A

A

A

A

220

220

220

220

220

220

220

ULN2803

PA0 1 E0 S0 18

PA1 2 E1 S1 17

PA2 3 E2 S2 16

PA3 4 E3 S3 15

PA4 5 E4 S4 14

PA5 6 E5 S5 13

PA6 7 E6 S6 12

PA7 8 E7 S7 11

9 10

+5V

FIG.84C

Page 157: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 157 ___________________________________________

En el enunciado no se nos indica el proceso o secuencia de control de las lámparas, por tanto podrá ser aquella que nosotros deseemos. Iniciaremos el diseño del programa de control, con el siguiente pseudocódigo: NOMBRE: LAMPARA FUNCION: Controla 8 lámparas PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Iniciar el sistema Apagar lámparas B=10 MIENTRAS B>0 Activar solo lámparas pares Temporizar Activar solo lámparas impares Temporizar B=B-1 FIN DE MIENTRAS B=20 MIENTRAS B>0 Apagar todas las lámparas Temporizar Activar todas las lámparas Temporizar B=B-1 FIN DE MIENTRAS B=8 MIENTRAS B>0 Encendido secuencial B=B-1 FIN DE MIENTRAS FIN del programa Como podemos ver, nuestro programa consistirá básicamente en la realización de tres procesos claramente diferenciados o separados en tres bucles.

El primero consiste en realizar un encendido y apagado alternativo de las lámparas, de forma que en un instante dado estén encendidas L0, L2, L4 y L6, mientras el resto permanecen apagadas. Un tiempo más tarde (tiempo determinado por una subrutina de temporización) estarán encendidas L1, L3, L5 y L7, permaneciendo apagadas el resto durante el mismo intervalo de tiempo. Este proceso se repetirá un número determinado de veces que viene impuesto por el valor que se de al contador B (en este caso B=10).

El segundo proceso o bucle consiste en el encendido y apagado de todas las lámparas de forma

simultánea. Proceso que será realizado un número de veces determinado por el nuevo valor dado al contador B (en este caso B=20). El tiempo que las lámparas deben permanecer encendidas y apagadas, viene marcado por la subrutina de temporización.

Finalmente, el tercer bucle, pretende realizar el encendido secuencial de las ocho lámparas, es decir,

partiendo del estado inicial en que todas las lámparas están apagadas, se iluminará en primer lugar L0, a continuación se iluminarán L0 y L1, luego L0, L1 y L2, y así sucesivamente hasta tener encendidas todas las lámparas. El ritmo de encendido vendrá marcado por la subrutina de temporización. Este proceso se repetirá el número de veces que nos marque el valor asignado al contador B (en este caso B=8).

Se procederá ahora a expresar con más detalle todos los pasos mostrados en el pseudocódigo anterior

mediante un refinado del mismo.

Page 158: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 158 ___________________________________________

NOMBRE: LAMPARA FUNCION: Controla 8 lámparas PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Prohibir Interrupciones

Punterizar la Pila Programar PPI 8155

Apagar lámparas B=10 MIENTRAS B>0 Sacar al puerto A el dato 55H Temporizar Sacar al puerto A el dato AAH Temporizar B=B-1 FIN DE MIENTRAS B=20 MIENTRAS B>0 Sacar al puerto A el dato 00H Temporizar Sacar al puerto A el dato FFH Temporizar B=B-1 FIN DE MIENTRAS B=8 MIENTRAS B>0 Dato=0

C=8 MIENTRAS C>0 Poner CARRY=1 Rotar Dato con CARRY a la izquierda Sacar Dato al puerto A Temporizar C=C-1 FIN DE MIENTRAS B=B-1 FIN DE MIENTRAS FIN del programa

El tercer bucle ha sido construido con otro bucle interno. Es este último, el que nos permite llevar a cabo el encendido secuencial, mientras que el bucle exterior nos sirve para realizar el encendido secuencial un determinado número de veces marcado por el contador B. El desarrollo del bucle interno es similar al bucle mostrado en el ejercicio 2 del tema anterior. A continuación, en la FIG.84D, se muestra el diagrama de flujo correspondiente a este pseudocódigo.

Page 159: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 159 ___________________________________________

INICIO

Prohibir interrupciones Punterizar la pila Programar el PPI 8155

Apagar lámparas

B=10

B>0

PA=55H

Temporizar

PA=AAH

Temporizar

B=B-1

B=20

NO

SI

B>0 NO

SI

PA=00H

Temporizar

PA=FFH

Temporizar

B=B-1

B=8

B>0 SI

NO

FIN Dato=0 C=8

C>0 SI

NO

CARRY=1 Rotar Dato izquierda PA=Dato

Temporizar

C=C-1 B=B-1

FIG.84D

SALT1

SALT2

SALT3

SALT4

SALT5

SALT6

SALT7

Page 160: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 160 ___________________________________________

A continuación pasamos a desarrollar el paso a ensamblador del pseudocódigo preparado, obteniendo el programa definitivo de control.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : LAMPARA.ASMOUTPUT FILENAME : LAMPARA.OBJ

1 ;--------------------------------2 ;NOMBRE : LAMPARA3 ;FUNCION : Control de 8 lámparas4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;--------------------------------7 ;--------------------------------8 ;PARAMETROS PARA EL 81559 ;--------------------------------

10 01 C4 PA81 EQU C401H11 02 C4 PB81 EQU C402H12 03 C4 PC81 EQU C403H13 00 C4 REES81 EQU C400H14 ;--------------------------------15 ;--------------------------------16 ;PARAMETROS PUNTERO DE PILA17 ;--------------------------------18 FF 87 PPILA EQU 87FFH19 ;--------------------------------20 0000 LAMPARA:21 0000 F3 DI22 0001 21 FF 87 LXI H,PPILA23 0004 F9 SPHL24 0005 3E 0F MVI A,0FH25 0007 32 00 C4 STA REES8126 000A 3E 00 MVI A,00H27 000C 32 01 C4 STA PA8128 000F 06 0A BUC1 MVI B,1029 0011 78 SALT1 MOV A,B30 0012 A7 ANA A31 0013 CA 2A 00 JZ BUC232 0016 3E 55 MVI A,55H33 0018 32 01 C4 STA PA8134 001B CD 68 00 CALL TEMPO35 001E 3E AA MVI A,AAH36 0020 32 01 C4 STA PA8137 0023 CD 68 00 CALL TEMPO38 0026 05 DCR B39 0027 C3 11 00 JMP SALT140 002A 06 14 BUC2 MVI B,2041 002C 78 SALT2 MOV A,B42 002D A7 ANA A43 002E CA 45 00 JZ BUC344 0031 3E 00 MVI A,00H45 0033 32 01 C4 STA PA8146 0036 CD 68 00 CALL TEMPO47 0039 3E FF MVI A,FFH48 003B 32 01 C4 STA PA81

Page 161: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 161 ___________________________________________

49 003E CD 68 00 CALL TEMPO50 0041 05 DCR B51 0042 C3 2C 00 JMP SALT252 0045 06 08 BUC3 MVI B,853 0047 78 SALT3 MOV A,B54 0048 A7 ANA A55 0049 CA 67 00 JZ FIN56 004C 0E 08 MVI C,857 004E 16 00 MVI D,00H58 0050 79 SALT5 MOV A,C59 0051 A7 ANA A60 0052 CA 63 00 JZ SALT461 0055 37 STC62 0056 7A MOV A,D63 0057 17 RAL64 0058 32 01 C4 STA PA8165 005B CD 68 00 CALL TEMPO66 005E 57 MOV D,A67 005F 0D DCR C68 0060 C3 50 00 JMP SALT569 0063 05 SALT4 DCR B70 0064 C3 47 00 JMP SALT371 0067 76 FIN HLT7273 ;--------------------------------74 ;NOMBRE: TEMPO75 ;FUNCION: Temporización76 ;PRECONDICIONES: Ninguna77 ;POSTCONDICIONES: Ninguna78 ;--------------------------------79 0068 TEMPO:80 0068 F5 PUSH PSW81 0069 D5 PUSH D82 006A C5 PUSH B83 006B 11 FF 0F LXI D,0FFFH84 006E 1B TE1 DCX D85 006F 7A MOV A,D86 0070 B3 ORA E87 0071 00 NOP88 0072 00 NOP89 0073 C2 6E 00 JNZ TE190 0076 C1 POP B91 0077 D1 POP D92 0078 F1 POP PSW93 0079 C9 RET949596 007A END

******* C R O S S R E F E R E N C E T A B L E *********

BUC1 000F :BUC2 002A : 31BUC3 0045 : 43FIN 0067 : 55LAMPARA 0000 :PA81 = C401 : 27 33 36 45 48 64PB81 = C402 :PC81 = C403 :PPILA = 87FF : 22

Page 162: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 162 ___________________________________________

REES81 = C400 : 25SALT1 0011 : 39SALT2 002C : 51SALT3 0047 : 70SALT4 0063 : 60SALT5 0050 : 68TE1 006E : 89TEMPO 0068 : 34 37 46 49 65

LINES ASSEMBLED : 96 ASSEMBLY ERRORS : 0

En el desarrollo de este programa podemos apreciar en las primeras líneas la definición del proceso (NOMBRE, FUNCION, ...) son líneas de comentarios que no intervienen para nada en el programa. En las líneas 10, 11, 12 y 13 se definen los parámetros de acceso al periférico programable PPI 8155 y en la línea 18 se define el puntero de la pila (memoria RAM donde se almacenaran datos temporalmente). El programa comenzará efectivamente en la línea 21, donde se inicializa el sistema. En la línea 25 vemos como se carga el dato 0FH en el registro de estado del 8155 al objeto de programar sus tres puertos como salidas. Desde la línea 28 a la 39 se ejecuta el primer bucle del programa, de la 40 hasta la 51 el segundo bucle y desde la 52 hasta la 70 el tercer bucle. Si examinamos el primero de ellos nos daremos cuenta que es en las líneas 29, 30 y 31 cuando se analiza la condición del bucle y en caso de que el flag consultado este accionado saltaremos a ejecutar el bucle siguiente (BUC2) en la dirección 002AH. Se procede de modo idéntico en los otros dos bucles. La subrutina TEMPO (que nos proporciona una temporización o tiempo de espera) no precisa ningún dato de entrada y vemos que una vez ejecutada no modifica ningún registro ni dirección de memoria (de lo contrario vendría especificado en las PRECONDICIONES y en las POSTCONDICIONES). Se limita a ejecutar un bucle un determinado número de veces que vendrá impuesto por el valor cargado en el registro par DE (en este caso DE=0FFFH). En esta subrutina guardamos en la pila varios registros pares mediante las instrucciones PUSH y volvemos a recuperar sus contenidos mediante las correspondientes instrucciones POP siempre ejecutadas en orden inverso. EJEMPLO 2 Realizar el diseño de software y hardware necesarios para controlar 8 lámparas de 12 V y 8 sensores de efecto Hall, de modo que mientras permanezca activado un sensor cualquiera, se ilumine su lámpara correspondiente. Es decir, si se activa S2 se iluminará L2. Este ejercicio es similar al desarrollado en el tema anterior (ejercicio 3). En este caso emplearemos como elementos de entrada, detectores magnéticos de efecto Hall. En primer lugar hablaremos de forma sucinta sobre este tipo de sensores para tener una pequeña idea de su forma de trabajo. El efecto hall fue descubierto por Edwin Hall y se apoya en la fuerza de Lorentz, por medio de la cual sabemos que si aplicamos en campo eléctrico E a un material semiconductor y al mismo tiempo hacemos incidir sobre él de forma perpendicular un campo electromagnético, actuará sobre las cargas en movimiento una fuerza F que las desplaza en el interior del semiconductor produciéndose una concentración de portadores que nos generará un nuevo campo eléctrico transversal Ez. Este campo eléctrico alcanza un valor tal que compensa la fuerza F. La intensidad del campo eléctrico transversal da lugar a una tensión llamada tensión de hall. Este efecto aparece en cualquier conductor, pero su efecto no resultó aprovechable hasta que no se descubrió la movilidad de los electrones en determinadas uniones semiconductoras, en las que el flujo de

Page 163: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 163 ___________________________________________

corriente es creado por pocos electrones muy rápidos. Por tanto podemos decir que el efecto de un campo electromagnético (producido por ejemplo por un imán) sobre una corriente eléctrica da lugar a una tensión. Estamos por tanto en presencia de un pequeño generador.

Los generadores hall, pueden construirse de dos modos diferentes, teniendo en cuenta además que,

según la aplicación prevista, las placas semiconductoras tendrán formas diversas: 1. Obteniendo la capa semiconductora de barras fundidas, pulidas y grabadas al ácido, con un espesor

aproximado de 5 a 100 micras y colocándola después sobre una placa portadora mediante una resina epoxi de 1 micra.

2. Depositando la placa semiconductora sobre la placa portadora mediante un procedimiento de evaporación metálica.

En este tipo de semiconductores suele definirse la constante del material, como dependiente de la

temperatura, y se llama coeficiente de hall “Rh”.

El campo magnético necesario para generar una tensión proporcional está limitado a un intervalo determinado y aunque se sobrepase dicho intervalo el semiconductor no resulta dañado, mientras que la corriente de excitación será aquella que no sobrepase la máxima temperatura admisible para el semiconductor (unos 110ºC).

En las hojas de datos de los fabricantes se indica la tensión de hall en vacío como aquella que se genera cuando el semiconductor esta descargado, para una corriente nominal de excitación y un campo magnético de excitación indicados.

Entre la gran variedad de elementos fabricados con este tipo de dispositivos encontramos los sensores

UGN 3140, elementos que convenientemente polarizados al ser excitados por un imán producen una tensión positiva. En la FIG.84F vemos la forma de conectarlos en nuestro sistema de prueba.

Establecido de este modo el Hardware a emplear, pasamos a desarrollar el software de control.

Procedemos en primer lugar a trabajar con el pseudocódigo proponiendo el siguiente proceso: NOMBRE: Hall FUNCION: Detectar sensores hall PRECONDICION: Ninguna POSTCONDICION: Ninguna

B

Vhall

i

semiconductor

Campomagnético

Corrienteexcitación

Page 164: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 164 ___________________________________________

Iniciar sistema Leer sensores Preparar dato de lámparas Sacar dato de lámparas Volver a leer sensores (paso 2) Fin de programa Como podemos apreciar este ejemplo es en todo similar al desarrollado en el ejercicio 3 del tema

anterior.

8155

21 PA0 E0 1 18 S0 L0

22 PA1 E1 2 17 S1 L1

23 PA2 E2 3 16 S2 L2

24 PA3 E3 4 15 S3 L3

25 PA4 E4 5 14 S4 L4

26 PA5 E5 6 13 S5 L5

27 PA6 E6 7 12 S6 L6

28 PA7 E7 8 11 S7 L7

+12V

+5V

29 PB0 UGN 3140

30 PB1 UGN 3140

32 PB2 UGN 3140

33 PB3 UGN 3140

34 PB4 UGN 3140

35 PB5 UGN 3140

36 PB6 UGN 3140

37 PB7 UGN 3140

FIG.84F

Page 165: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 165 ___________________________________________

Un nuevo paso de refinado nos dará la siguiente propuesta: NOMBRE: Hall FUNCION: Detectar sensores Hall PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna.

Prohibir interrupciones Punterizar la pila Programar el PPI 8155 Apagar las lámparas Leer Dato de PB81 Tratar el Dato leído Sacar Dato al PA81 Volver a Leer Dato de PB81 (paso 5) Final del programa

Finalmente el programa resultante en pseudocódigo, realizando un nuevo paso de refinado será:

NOMBRE: Hall FUNCION: Detectar sensores Hall PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones

Punterizar la pila Programar el PPI 8155 Apagar las lámparas Leer Dato de PB81 Sacar Dato al PA81 Volver a Leer Dato de PB81 (paso 5) Final del programa En este caso no representaremos el diagrama de flujo correspondiente, aunque como puede verse por el desarrollo realizado hasta el momento será similar al presentado en el ejercicio 3 del tema 7. El programa en ensamblador resultante será:

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : HALL.ASMOUTPUT FILENAME : HALL.OBJ

1 ;------------------------------------------2 ;NOMBRE : HALL3 ;FUNCION : Detectar sensores Hall4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;------------------------------------------78 ;------------------------------------------9 ;PARAMETROS PARA EL 8155

10 ;------------------------------------------11 00 B0 PA81 EQU C401H ;Puerto A del 815512 01 B0 PB81 EQU C402H ;Puerto B del 815513 02 B0 PC81 EQU C403H ;Puerto C del 815514 03 B0 REES81 EQU C400H ;Reg. Estado 815515 ;------------------------------------------

Page 166: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 166 ___________________________________________

1617 ;------------------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;------------------------------------------20 FF 87 PPILA EQU 87FFH ;Puntero pila RAM21 ;------------------------------------------22 0000 HALL:23 0000 F3 DI24 0001 21 FF 87 LXI H,PPILA25 0004 F9 SPHL26 0005 3E 82 MVI A,0DH27 0007 32 03 B0 STA REES8128 000A 3E 00 MVI A,00H29 000C 32 00 B0 STA PA8130 000F 3A 01 B0 LEER LDA PB8131 0012 00 NOP32 0013 32 00 B0 STA PA8133 0016 C3 0F 00 JMP LEER34 001935 0019 END

*********** S Y M B O L I C R E F E R E N C E T A B L E *************

LEER 000F PA81 = C401 PB81 = C402 PC81 = C403PPILA = 87FF HALL 0000 REES81 = C400

LINES ASSEMBLED : 35 ASSEMBLY ERRORS : 0

Como podemos apreciar, en este caso no se ha utilizado la pila para guardar ningún dato, aunque se ha punterizado. También podíamos haber empleado la RAM del 8155 y punterizar la pila a la dirección C0FFH.

EJEMPLO 3 Realizar el control de un grupo de cuatro displays de siete segmentos, de modo que se representen en ellos los números del 0000 al 9999. Se trata en este caso de desarrollar un trabajo de diseño del hardware de control de los cuatro elementos pedidos y posteriormente, después de conectarlo a nuestro sistema a través del 8155, realizar el software que lleve a cabo el control pedido. En primer lugar realizaremos una breve descripción de los elementos o componentes que vamos a utilizar para construir la tarjeta de aplicación mostrada en la FIG.84G. Los elementos finales a controlar, es decir, los displays de siete segmentos serán los modelos LTS7751R. Se trata de unos sencillos indicadores luminosos construidos a base de diodos luminiscentes de color rojo que nos servirán para visualizar un valor en el sistema decimal. Están formados por siete segmentos individuales (SA, SB, SC, SD, SE, SF, SG) con los que se pueden construir todos los dígitos del 0 al 9. Como elemento básico, transformador de código binario al código necesario para excitar los displays, se utilizará el circuito integrado 74LS47. Se trata de un decodificador/excitador BCD a 7 segmentos con salida en colector abierto. El circuito tiene como entradas las cuatro líneas A, B, C y D que aceptan código BCD que es decodificado y tratado para excitar convenientemente con sus salidas un display de siete segmentos.

Page 167: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 167 ___________________________________________

Situaremos en serie con cada salida una resistencia de 470 ohmios para limitar la corriente que circula por los leds de los displays.

Como podemos observar en la FIG.84G, las salidas del decodificador atacan a los cuatro displays al mismo tiempo, por lo que tendremos que realizar un proceso de selección para indicar a cual de los cuatro displays se dirige la información en cada instante. Con este objetivo intercalamos el UDN2580A que dispone de ocho líneas inversoras individuales, aunque en este caso solamente emplearemos cuatro (una para cada display).

Esta tarjeta será controlada mediante el 8155, con los puertos A (PA0, Pa1, PA2, PA3) y B (PB0, PB1,

PB2, PB3). El proceso a seguir para sacar información hacia los displays será el siguiente: Se saca a través del puerto A el dato en BCD que deseemos situar en el display de las unidades y por el puerto B seleccionamos mediante un 0 lógico la línea del display que ocupa el lugar de las unidades (DIG1). Se mantiene esta situación unos instantes y a continuación retiramos la selección del dígito de unidades, colocamos en el puerto A la información para el dígito de las decenas y seleccionamos dicho dígito a través del puerto B mediante un 0 lógico (DIG2). Se procede así con los cuatro dígitos a controlar.

Teniendo en cuenta estas consideraciones, pasaremos a esbozar el pseudocódigo que nos llevará a la

confección del programa de control de los cuatro dígitos. NOMBRE: Dígitos FUNCION: Control 7 segmentos PRECONDICION: Ninguna POSTCONDICION: Ninguna Iniciar sistema Apagar displays

SA 1 SB 13 SC 10 SD 8 SE 5 SF 2 SG 11 DP 6

3 14

ANODO

SA 1 SB 13 SC 10 SD 8 SE 5 SF 2 SG 11 DP 6

3 14

ANODO

SA 1 SB 13 SC 10 SD 8 SE 5 SF 2 SG 11 DP 6

3 14

ANODO

SA 1 SB 13 SC 10 SD 8 SE 5 SF 2

DP 6

3 14

ANODO

DIG4 DIG1 DIGDIG3

IN1 1 18 DIG1 IN2 2 17 DIG2 IN3 3 16 DIG3 IN4 4 15 DIG4 IN5 5 14 IN6 6 13 IN7 7 12 IN8 8 11

UDN 2580 A

+5V

SA 13 7 A PA0 SB 12 1 B PA1SC 11 2 C PA2SD 10 6 D PA3SE 9 3 LT SF 15 5 RBI SG 14 4 BI

470R SERIE

74LS47

+5V

FIG.84G

+5V PB0 PB1PB2PB3PB4PB5PB6PB7

Page 168: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 168 ___________________________________________

Iniciar la cuenta Fin de programa

Como vemos, se precisa un mayor refinamiento en todas las operaciones de modo que quede más claro qué funciones se ejecutan en cada paso. Para ello analizaremos, como siempre, cada uno de los pasos descritos anteriormente. Iniciar el sistema consiste en efectuar las operaciones típicas consistentes en "prohibir interrupciones", "punterizar la pila" y programar de modo adecuado el PPI 8155, en este caso, como emplearemos sus puertos para sacar datos hacia el exterior tendremos que programarlos como salidas (por el PA sacaremos los datos a representar y por el PB seleccionaremos el dígito en el que aparecerá escrito el dato). Apagar displays no es más que un paso que nos asegura que al conectar el sistema a la tensión y producirse el arranque, los displays permanecerán apagados. Para ello no tendremos más que asegurar que a través del PB queden los cuatro dígitos bloqueados (sin tensión positiva en el ánodo). Iniciar la cuenta es esencialmente empezar a contar desde 0000 hasta 9999 y sacar todos los números en los displays. Este es sin duda el paso más complejo de los tres iniciales planteados y habrá que dividirlo en operaciones más sencillas para llegar a una mejor comprensión. Tendremos que "iniciar los datos" en algún lugar de la RAM con el valor 0000 (para después sacarlo hacia los displays). Tendremos que incrementar de 1 en 1 el valor de los datos. Como el microprocesador trabaja con el sistema binario y nosotros veremos los dígitos en BCD, hay que desarrollar un proceso para "preparar los datos". Tendremos que "sacar los datos" hacia nuestra pantalla de displays de siete segmentos. El número así mostrado debe permanecer unos segundos en pantalla por lo que hay que prever una temporización. Considerando los pasos de este refinamiento tendremos:

NOMBRE: Dígitos FUNCION: Control 7 segmentos PRECONDICION: Ninguna POSTCONDICION: Ninguna Prohibir interrupciones Punterizar la pila Programar el 8155 Apagar displays Iniciar datos en RAM Sacar datos Temporizar unos segundos Incrementar datos en 1 Preparar datos Volver a Sacar datos Fin de programa

Parece obvio que "iniciar datos en RAM" consistirá en seleccionar unas posiciones de memoria RAM en las que quedarán almacenados los datos y dado que nuestro proceso de cuenta comenzará desde 0000 hasta 9999, el primer dato que necesitaremos en dichas posiciones será el 0000. Como tenemos que controlar cuatro dígitos y necesitamos cuatro bits por cada dígito en representación binaria, necesitaremos 2 bytes para manejar la información a tratar. Por consiguiente podremos reservar en RAM dos posiciones de memoria para este proceso. Como sabemos, nuestro PPI 8155 dispone de memoria RAM interna entre las posiciones C000H y C0FFH, por lo que en este caso emplearemos dos posiciones de este elemento para dicha tarea. Sean estas posiciones C010H y C011H por ejemplo, a las que apuntaremos con un puntero que llamaremos DATOS. El proceso "sacar datos" requerirá como precondición, que los datos se encuentren previamente almacenados en la RAM, y tratados de forma adecuada para su representación correcta en los displays de siete segmentos. Este proceso es totalmente independiente por lo que será construido según una subrutina que podemos esbozar del modo siguiente:

NOMBRE: SACADATO FUNCION: Saca datos a displays

Page 169: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 169 ___________________________________________

PRECONDICION: Datos en RAM POSTCONDICION: Ninguna

Iniciar contador temporización CONT MIENTRAS CONT>0 Apuntar a DATOS Leer información (dos dígitos) Separar VALOR dígito 1 Enviar VALOR a PA Seleccionar DIG1 con PB Separar VALOR dígito 2 Enviar VALOR a PA Seleccionar DIG2 con PB Apuntar a DATOS+1 Leer información (dos dígitos) Separar VALOR dígito 3 Enviar VALOR a PA Seleccionar DIG3 con PB Separar VALOR dígito 4 Enviar VALOR a PA Seleccionar DIG4 con PB CONT = CONT - 1 FIN de MIENTRAS Fin de subrutina Como vemos el proceso de sacar la información hacia displays es repetitivo y debe hacerse de forma continua. Debemos tener en cuenta que en cada instante solo tendremos un display activo mientras los otros tres están apagados. El proceso es tan rápido que el ojo humano no lo percibe así, siendo la sensación de que están todos activos al mismo tiempo. La temporización se ha incluido dentro de esta subrutina, ya que es precisamente este proceso el que debe repetirse durante unos segundos. El proceso "incrementar datos en 1" consiste en sumar 1 al valor que tengamos almacenado en la RAM. Además el dato resultante debe ser tratado para obtener el decimal correcto, es decir se debe realizar un ajuste decimal. Este proceso puede ser el siguiente: Tomar dato de RAM (DATOS) Sumar 1 Ajuste decimal Almacenar resultado en RAM (DATOS) Tomar dato de RAM (DATOS+1) Sumar 0 con acarreo Almacenar resultado en RAM (DATOS+1) Tendremos por tanto el siguiente pseudocódigo, que nos permitirá afrontar el paso definitivo al programa en ensamblador:

NOMBRE: Dígitos FUNCION: Control 7 segmentos PRECONDICION: Ninguna POSTCONDICION: Ninguna Prohibir interrupciones Punterizar la pila Programar el 8155 Apagar displays Iniciar datos en RAM Saltar a SACADATO con retorno Tomar dato de RAM (DATOS)

Sumar 1 Ajuste decimal

Page 170: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 170 ___________________________________________

Almacenar resultado en RAM (DATOS) Tomar dato de RAM (DATOS+1) Sumar 0 con acarreo Almacenar resultado en RAM (DATOS+1)

Volver a SACADATO Fin de programa

NOMBRE: SACADATO FUNCION: Saca datos a displays PRECONDICION: Datos en RAM POSTCONDICION: Ninguna

Iniciar contador temporización CONT MIENTRAS CONT>0 Apuntar a DATOS Leer información (dos dígitos) Separar VALOR dígito 1 Enviar VALOR a PA Seleccionar DIG1 con PB Separar VALOR dígito 2 Enviar VALOR a PA Seleccionar DIG2 con PB Apuntar a DATOS+1 Leer información (dos dígitos) Separar VALOR dígito 3 Enviar VALOR a PA Seleccionar DIG3 con PB Separar VALOR dígito 4 Enviar VALOR a PA Seleccionar DIG4 con PB CONT = CONT - 1 FIN de MIENTRAS Fin de subrutina Con toda esta información procederemos a la concreción de nuestro programa de control, empleando lenguaje ensamblador, del modo siguiente:

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : DIGITOS7.ASMOUTPUT FILENAME : DIGITOS7.OBJ

1 ;--------------------------------2 ;NOMBRE : DIGITOS3 ;FUNCION : Control 7 segmentos4 ;PRECONDICION : Ninguna5 ;POSTCONDICION : Ninguna6 ;--------------------------------78 ;--------------------------------9 ;PARAMETROS PARA EL 8155

10 ;--------------------------------11 01 C4 PA81 EQU C401H12 02 C4 PB81 EQU C402H13 03 C4 PC81 EQU C403H14 00 C4 REES81 EQU C400H

Page 171: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 171 ___________________________________________

15 ;--------------------------------1617 ;--------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;--------------------------------20 FF 87 PPILA EQU 87FFH21 ;--------------------------------2223 ;--------------------------------24 ;PARAMETROS DATOS RAM 815525 ;--------------------------------26 10 C0 DATOS EQU C010H27 ;--------------------------------2829 0000 DIGITOS:30 0000 F3 DI31 0001 21 FF 87 LXI H,PPILA32 0004 F9 SPHL33 0005 3E 0F MVI A,0FH34 0007 32 00 C4 STA REES8135 000A 3E FF MVI A,FFH36 000C 32 02 C4 STA PB8137 000F 21 10 C0 LXI H,DATOS38 0012 36 00 MVI M,00H39 0014 23 INX H40 0015 36 00 MVI M,00H41 0017 CD 2C 00 S1 CALL SACADATO42 001A A7 ANA A43 001B 21 10 C0 LXI H,DATOS44 001E 3E 01 MVI A,01H45 0020 8E ADC M46 0021 27 DAA47 0022 77 MOV M,A48 0023 23 INX H49 0024 3E 00 MVI A,00H50 0026 8E ADC M51 0027 27 DAA52 0028 77 MOV M,A53 0029 C3 17 00 JMP S15455 ;--------------------------------56 ;NOMBRE: SACADATO57 ;FUNCION: Sacar datos a display58 ;PRECONDICION: Datos RAM (DATOS)59 ;POSTCONDICION: Ninguna60 ;--------------------------------6162 002C SACADATO:63 002C F5 PUSH PSW64 002D E5 PUSH H65 002E D5 PUSH D66 002F C5 PUSH B67 0030 11 FF 1F LXI D,1FFFH68 0033 06 FE S2 MVI B,FEH69 0035 0E 02 MVI C,02H70 0037 21 10 C0 LXI H,DATOS71 003A 7E S3 MOV A,M72 003B 32 01 C4 STA PA8173 003E 78 MOV A,B74 003F 32 02 C4 STA PB8175 0042 00 NOP

Page 172: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 172 ___________________________________________

76 0043 00 NOP77 0044 00 NOP78 0045 3E FF MVI A,FFH79 0047 32 02 C4 STA PB8180 004A 7E MOV A,M81 004B 0F RRC82 004C 0F RRC83 004D 0F RRC84 004E 0F RRC85 004F 32 01 C4 STA PA8186 0052 78 MOV A,B87 0053 07 RLC88 0054 47 MOV B,A89 0055 32 02 C4 STA PB8190 0058 00 NOP91 0059 00 NOP92 005A 00 NOP93 005B 3E FF MVI A,FFH94 005D 32 02 C4 STA PB8195 0060 23 INX H96 0061 78 MOV A,B97 0062 07 RLC98 0063 47 MOV B,A99 0064 0D DCR C

100 0065 C2 3A 00 JNZ S3101 0068 1B DCX D102 0069 7A MOV A,D103 006A B3 ORA E104 006B C2 33 00 JNZ S2105 006E C1 POP B106 006F D1 POP D107 0070 E1 POP H108 0071 F1 POP PSW109 0072 C9 RET110111 0073 END

******** C R O S S R E F E R E N C E T A B L E ********

DATOS = C010 : 37 43 70DIGITOS 0000 :PA81 = C401 : 72 85PB81 = C402 : 36 74 79 89 94PC81 = C403 :PPILA = 87FF : 31REES81 = C400 : 34S1 0017 : 53S2 0033 : 104S3 003A : 100SACADATO 002C : 41

LINES ASSEMBLED : 111 ASSEMBLY ERRORS : 0 Como podemos apreciar, en este caso no se ha realizado el diagrama de flujo del programa. Esta tarea puede desarrollarla el lector si la considera interesante.

Page 173: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1 2 3

4

5

8.6 EJERCICIOS.

______________________________________ 173 ___________________________________________

. Desarrollar una breve descripción funcional del PPI 8155.

. Definir los modos de programación del PPI 8155.

. Explicar el modo de conexión del PPI 8155 al bus del 8085, empleando la señal IO/M del microprocesador.

. En el programa desarrollado en el ejemplo 1, denominado LAMPARAS, qué cambios habría que realizar para: a) Emplear como pila la RAM del 8155. b) Controlar las lámparas con el puerto B. c) Aumentar el tiempo de la temporización.

. En el ejemplo 3 ¿cómo aumentaríamos el tiempo de permanencia en pantalla de las cifras a representar?

Page 174: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 174 ___________________________________________

PRÁCTICA DE CONTROL CON MICROPROCESADOR (I).

9

Page 175: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

aa pp •

•••

ne

pvlld

cpdin

p

9. EJERCICIOS DE CONTROL CON MICROPROCESADOR (I).

Es fundamental, cuando se está estudiando un microprocesador, en este caso el 8085A, desarrollar lgún ejercicio práctico que nos permita fijar conceptos y aclarar dudas, de forma tal que, los conceptos dquiridos vayan siendo cada vez más consistentes.

Con este propósito se desarrolla este tema, en el que llevaremos a cabo un control de giro y

osicionamiento de varios motores paso a paso, al tiempo que presentaremos en una pequeña pantalla LCD, el roceso de control seguido.

Por tanto en los puntos que vienen a continuación se presentará:

Un diagrama de bloques general en el que podremos apreciar con claridad todo el sistema que deseamos controlar y su interconexión con las tarjetas de control.

Los motores paso a paso, tanto en lo que respecta a su constitución interna y funcionamiento, como en lo referente a los métodos de control.

Se realizará un estudio de las pantallas LCD y su método de programación. Se presentarán los diferentes esquemas de las tarjetas de control necesarias. Se mostrará de forma detallada la interconexión de los diferentes elementos con los Periféricos

Programables empleados. Se mostrará el desarrollo del programa de forma detallada, en todas las fases que se consideran necesarias,

hasta completar el programa en lenguaje ensamblador.

.

9.1 INTRODUCCIÓN

______________________________________ 175 ___________________________________________

En primer lugar, necesitamos tener una idea clara del trabajo o proyecto que deseamos abordar. Para ello os apoyaremos en el estudio del diagrama de bloques a continuación mostrado en la FIG.91A que representa l sistema global que utilizaremos en este trabajo.

Podemos observar en primer lugar que los elementos de potencia que deseamos controlar son tres motores

aso a paso (M1, M2 y M3) cuyas características y constitución estudiaremos posteriormente. Estos elementos an controlados por las correspondientes etapas drivers de potencia (DM1, DM2 y DM3) cuyo diseño evaremos acabo, siendo su misión básica suministrar la corriente y tensión necesarias para adaptar las señales e control procedentes de los periféricos programables de interface, en este caso un 8255.

Además se dispondrá también de una pantalla LCD, en la que podremos ir introduciendo los datos que

onsideremos oportunos para seguir el desarrollo del programa de forma gráfica. Las características y modo de rogramación de la pantalla se verán más adelante, así como el equipo de adaptación necesario, es decir, la river de control (DLCD). Las señales de control y comunicación procederán de otro periférico programable de terface, en esta caso el 8155.

Conectados a este último PPI 8155, dispondremos 8 pulsadores de control con los podremos efectuar los

rocedimientos de prueba que deseemos.

Page 176: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 176 ___________________________________________

Ambos periféricos (8255 y 8155) irán conectados del modo ya comentado en temas anteriores a nuestra tarjeta principal, basada en el microprocesador 8085 y cuya distribución de componentes de memoria ya conocemos.

Todos los elementos señalados están convenientemente alimentados mediante una fuente que

suministre tensiones de +5V y +12V perfectamente filtradas y estabilizadas. En la construcción del cableado se tendrá especial cuidado en separar las masas de alimentación de la parte lógica, de las masas de alimentación de los motores, al objeto de evitar posibles interferencias de picos de corriente generados en las bobinas de los motores.

Está constituido esencialmente por dos partes claramente diferenciadas:

1. Una fija llamada “estator”, construida a partir de cavidades en las que van depositadas las bobinas que excitadas convenientemente formarán los polos norte-sur de forma que se cree un campo magnético giratorio.

2. Una móvil, llamada “rotor” construida mediante un imán permanente, con el mismo número de pares de

polos, que el contenido en una sección de la bobina del estator; este conjunto va montado sobre un eje soportado por dos cojinetes que le permiten girar libremente.

Si por el medio que sea, conseguimos excitar el estator creando los polos N-S, y hacemos variar dicha

FUENTE DE ALIMENTACION

+5V +12V MASA MASA POTENCIA

CPU 8255 8155

DM1 DM2 DM3

M1 M2 M3

DLCD

LCD

PULSADORES

FIG.91A

9.2 EL MOTOR PASO A PASO.

Page 177: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 177 ___________________________________________

excitación de modo que el campo magnético formado efectúe un movimiento giratorio, la respuesta del rotor será seguir el movimiento de dicho campo, produciéndose de este modo el giro del motor.

Puede decirse por tanto que un motor paso a paso es un elemento que transforma impulsos eléctricos

en movimientos de giro controlados, ya que podremos hacer girar al motor en el sentido que deseemos y el número de vueltas y grados que necesitemos.

Según la construcción de las bobinas del estator, podemos diferenciar entre motores “bipolares” y

motores “unipolares”. Los primeros tienen las bobinas con un arrollamiento único, mientras que los segundos tienen las bobinas compuestas por dos arrollamientos cada una. En la FIG.92A podemos ver esta diferencia de forma gráfica. A igual número de espiras, el unipolar, deberá tener menor sección en el hilo de las bobinas, aumentando por tanto su resistencia y disminuyendo su par a bajas velocidades.

Un caso muy corriente es el motor con estator de 48 polos, en el que cada mitad contiene una bobina

toroidal de un arrollamiento para el funcionamiento bipolar y dos arrollamientos para el funcionamiento bipolar. Normalmente el eje del motor esta templado, rectificado y pulido. Sobre él se encuentra un imán permanente (rotor) altamente coercitivo de 24 polos, y se apoya sobre cojinetes de bronce endurecido que no necesitan mantenimiento.

Al número de grados que gira el rotor, cuando se efectúa un cambio de polaridad en las bobinas del

estator, se le denomina “ángulo de paso” y puede ser muy variado en función de la aplicación y por tanto de la construcción del mismo. Además, existe la posibilidad (con el control electrónico apropiado) de conseguir una rotación de medio paso. En los motores que tratamos a continuación el paso completo es de 7’5º (medio paso 3’75º) y el número de pasos por vuelta completa es de 48. En cada paso puede producirse un error cifrado de 0’5º en adelanto o en retraso, sin embargo, este error no es acumulativo, quedando anulado en el transcurso de los 360 grados eléctricos. Deberemos considerar que cuando se efectúe medio giro, el motor desarrollará un par menor y ejecutará el giro con menor precisión. Los motores son fabricados para trabajar en un rango de frecuencias determinado por el fabricante y rebasado dicho rango, estaremos provocando una velocidad de giro del campo magnético creado por el estator muy elevada, no siendo el rotor capaz de alcanzar esa velocidad, provocando una pérdida de sincronización y quedando frenado en estado de vibración. Para nuestro tipo de motores, la máxima frecuencia admisible está alrededor de los 625 Hz.

Puesto que estamos hablando de dos tipos de motores paso a paso, el bipolar y el unipolar, tendremos también dos modos de excitación de sus devanados:

• Devanado bipolar. Tenemos dos bobinas de arrollamiento único y su excitación, es decir, el orden en que

se les aplica la tensión, hace circular una determinada intensidad en un sentido u otro, creando así los polos Norte-Sur y produciendo el giro del motor. La secuencia se expresa en la tabla siguiente. Si seguimos el orden 1, 2, 3, 4, estaremos efectuando un giro hacia la derecha. Para invertir el giro no tendremos más que seguir la secuencia inversa, es decir, 4, 3, 2, 1.

FIG.92A

C D E F R C S T C U

Page 178: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

• Devanado bipolar. Tenemos dos bobinas con doble arrollamiento y la excitación precisa en las bobinas se

representa también en la misma tabla. Los valores 1 y 0 representan niveles lógicos. Con la secuencia 1, 2, 3, 4 se realiza un giro a la derecha y para cambiar el sentido de giro se efectúa la secuencia contraria.

m

dp

1

CD EF R S T U

BIPOLAR UNIPOLAR

+ OFF 1 0 1 0

OFF + 1 0 0 1

- OFF 0 1 0 1

OFF - 0 1 1 0

+ OFF 1 0 1 0

TABLA SECUENCIAL

2

4

3

5

.

9.3 CONTROL DE MOTORES PASO A PASO

______________________________________ 178 ___________________________________________

El manejo operativo de un motor paso a paso, puede llevarse a cabo de dos modos básicos, bien ediante un control por tensión constante o bien mediante un control por corriente constante.

Vamos a mostrar el control por tensión constante de un motor bipolar, mediante un circuito integrado

iseñado específicamente para esta labor. Se trata del SAA 1042 (fabricado por Motorola) cuya distribución de atillas se muestra en la FIG.93A.

Fig.93A

1 2 3 6 7 8

16 15 14 11 10 9

SAA 1042

Page 179: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 179 ___________________________________________

Seguidamente describiremos la función de cada una de ellas:

• Patilla 1: Salida de control de una bobina del motor en unión con la patilla 3. • Patilla 2: Sirve para proteger las salidas 1, 3, 14, y 16, amortiguando los transitorios que introducen las

bobinas del motor en los cambios de nivel de los pulsos de control. Es necesario conectar un diodo zener entre la patilla 2 y la 15 (zener de 3V3).

• Patilla 3: Salida de control de una bobina del motor en unión con la patilla 1. • Patilla 6: Terminal con dos funciones básicas. A través de una resistencia adapta la corriente del motor y

con un pulso a través de la resistencia se efectúa un set de las salidas de control. Si no se utiliza la función set, debe colocarse a masa a través de la resistencia.

• Patilla 7: Entrada de reloj, activa en el flanco positivo del pulso. Por cada pulso que llegue, el motor gira 7’5º (o bien 3’75º según este conectado el terminal 8).

• Patilla 8: (Full/Half step) Determina el ángulo de rotación del motor por cada pulso que llegue de reloj. En estado bajo, el motor gira un paso completo (7’5º).

• Patilla 9: Masa. • Patilla 10: (CW/CCW) Determina el sentido de giro. Cuando esta a nivel bajo, gira en sentido de las

agujas del reloj. Cuando esta a nivel alto, el giro es contrario al de las agujas del reloj. • Patilla 11: Alimentación de la parte lógica del SAA 1042. Puede variar de los +5V hasta los +20V. Puede

ser la misma tensión que la alimentación del motor (patilla 15) o bien puede alimentarse a +5V para ser acoplado a señales de nivel TTL.

• Patilla 14: Salida de control de una bobina del motor en unión con la patilla 16. • Patilla 15: Tensión a la que vamos a alimentar al motor. • Patilla 16: Salida de control de una bobina del motor en unión con la patilla 14.

Este componente contiene internamente tres bloques bien diferenciados, el primero compuesto a su vez por tres etapas de control (Clock, CW/CCW y Full/Half step), el segundo es el bloque lógico y el tercero la etapa de potencia compuesta por dos drivers (uno por bobina del motor).

El integrado SAA 1042 puede controlar motores con tensiones desde 6V hasta 12V y el SAA 1042A controla motores de 24V. Soportan una corriente de salida de 600 mA y poseen internamente diodos supresores de parásitos. Sus entradas son compatibles con familias lógicas como MOS, DTL y TTL.

Como puede observarse en la FIG.93A, posee dos aletas refrigeradoras, que posibilitan mayor disipación de calor interno. No obstante es conveniente añadir un pequeño refrigerador que aumente la capacidad de disipación total.

En la FIG.93B puede verse la conexión de las bobinas del motor al SAA 1042. Si conectamos una señal pulsante de reloj en la entrada de Clock, haremos girar el motor en el sentido que deseemos, según conectemos la entrada CW/CCW a +5V o a masa; por cada pulso recibido el motor girará 7’5º ó 3’75º según sea el estado de la entrada F/H. Como hemos visto hasta ahora, es el circuito integrado específico, el que en función de unos pulsos y señales de entrada, genera las señales o pulsos de control para las bobinas del motor. Sin embargo, esto también

+12V3V3

OSCIL

+5V

56K 6

10

8

7

11 +5V 9

1

3

14

16

2 15 50

4W

50

4W

C

D

F

E

SAA 1042

FIG.93B

Page 180: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 180 ___________________________________________

puede realizarse, mediante algún elemento de potencia final (transistor,...) controlado de forma apropiada mediante algún periférico con el que podamos generar la secuencia precisa de las señales de control. Para realizar esta tarea, elegimos el PPI 8155, a través del cual generaremos las señales de control que llevamos a los elementos de potencia que gobernarán las bobinas del motor. Como elemento de potencia elegimos el ya conocido ULN 2803, quedando la conexión definitiva como se muestra en la FIG.93C. Como puede apreciarse, estamos controlando un motor unipolar, al que según la tabla de secuencia de señales ya conocida, tendremos que inyectar las señales mostradas en la FIG.93D. En cada una de las salidas del ULN 2803 y en paralelo con cada una de las bobinas del motor, se colocan los diodos D1, D2, D3 y D4, para disminuir la influencia de los picos de corriente que se generan en las bobinas del motor en los cambios de polaridad. Las cuatro líneas de entrada al ULN 2803, serán las señales procedentes del PPI 8155. Este esquema de control tendremos que repetirlo para cada motor que vayamos a manejar. Como tenemos previsto mover tres motores necesitaremos un total de tres esquemas similares y todos ellos irán controlados por los puertos del PPI 8155. Por otro lado, para girar los motores a la posición correcta, necesitamos partir de una posición inicial u origen. Esto se consigue colocando solidariamente al eje del motor un "aspa" que en cada giro intercepte el haz de un fotodetector, generando de este modo una señal que nos indica que estamos en la posición inicial o de origen. El esquema correspondiente a este circuito de detección se muestra en la FIG.93E, en la que podemos ver como en condiciones normales, el diodo emisor estará emitiendo un haz que pone en saturación al fototransistor, apareciendo un 0 lógico en su colector. Esta señal se lleva a una entrada del ULN 2803 que en su

1 18

2 17

3 16

4 15

ULN 2803

D1

D2

D3

D4

+12V

FIG.93C

1 2 3 4 5

FIG.93D

R

S

T

U

Page 181: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

salida presentará un 1 lógico indicándonos que el haz no está interrumpido. Cuando el aspa solidario al eje del motor se interpone entre el diodo emisor y el fototransistor, se interrumpe el haz por lo que el fototransistor pasa al corte apareciendo un 1 lógico en su colector y por tanto en la entrada del ULN 2803, que nos proporcionará un 0 lógico en su salida indicándonos que en ese instante hemos alcanzado la posición inicial. Lógicamente necesitaremos un circuito similar para cada motor.

mmr

cAm

•••••••

e

•••

FIG.93E

R1 100

H22A1

R2 3K3

R3 10K

ULN 2803

5 14

+5V

SALIDA

9.4 LA PANTALLA LCD.

______________________________________ 181 ___________________________________________

Otro de los puntos importantes en el desarrollo de este trabajo es la colocación de una pantalla o arcador donde se refleje de forma gráfica los estados o las secuencias del control de los motores, de este odo podremos comprobar si los diferentes posicionamientos alcanzados por los motores corresponden con lo

ealmente deseado y diseñado en los algoritmos del programa.

Dentro de las amplias posibilidades que existen en el mercado de pantallas para marcadores, se onsiderará en este caso una pantalla LCD de BATRON (BT 12009) compuesta por una línea de 20 dígitos. unque si se deseara otra pantalla no tendríamos más que sustituir el hardware de control de la misma y odificar oportunamente el software.

Esta pantalla o módulo BT 12009 posee básicamente las siguientes características según el fabricante:

Una línea de 20 caracteres. Un carácter se compone de 5x7 puntos. Una CG ROM (generador de caracteres ROM) con 192 caracteres predefinidos. Una CG RAM que permite definir ocho caracteres por el usuario. Una RAM que almacena hasta 80 bytes. Un registro de instrucciones IR. Un registro de datos DR.

Esta pantalla proporcionada por BATRON, es de fácil conexión al bus de cualquier microprocesador,

n este caso al 8085A. A continuación se presenta el patillaje de este módulo:

Patilla 1: Terminal de masa (GND). Patilla 2: Terminal de alimentación a una tensión de +5V. Patilla 3: No conectado.

Page 182: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 182 ___________________________________________

• Patilla 4: Terminal de selección (RS) de registros internos del módulo LCD. • Patilla 5: Terminal de lectura y escritura (R/W) del módulo LCD. • Patilla 6: Terminal de selección o habilitación del módulo (E). • Patilla 7: Línea del bus de datos (DB0). • Patilla 8: Línea del bus de datos (DB1). • Patilla 9: Línea del bus de datos (DB2). • Patilla 10: Línea del bus de datos (DB3). • Patilla 11: Línea del bus de datos (DB4). • Patilla 12: Línea del bus de datos (DB5). • Patilla 13: Línea del bus de datos (DB6). • Patilla 14: Línea del bus de datos (DB7).

Todas las funciones que se pueden programar en este módulo LCD, se controlan mediante las señales

E, RS y R/W escribiendo o leyendo los datos oportunos. Los niveles lógicos activos de todas las señales de control corresponden con el nivel ALTO (1 lógico).

En la siguiente tabla se muestran las operaciones que se realizan según las combinaciones de las

mismas:

E RS R/W OPERACION 1 0 0 Escribir una instrucción en el IR 1 0 1 Leer el IR (AC y el flag Busy) 1 1 0 Escribir en DR (Para DD RAM o CG RAM) 1 1 1 Leer el DR (De DD RAM o CG RAM)

La señal E es de habilitación del módulo y es activa con nivel lógico ALTO. La señal RS sirve para seleccionar los registros internos IR (RS=0) y DR (RS=1). La señal R/W se emplea para leer (R/W=1) o para escribir (R/W=0) un dato en el registro deseado.

El módulo, representado en el FIG.94A, posee además un registro denominado AC que apunta a la

dirección donde serán leídos o escritos los datos sobre la DD RAM (RAM de datos del display) y la CG RAM (generador de caracteres RAM definibles por el usuario). El AC se incrementa o decrementa automáticamente de acuerdo a cómo se programe el "modo entrada".

En la FIG.94B, podemos apreciar la forma de conectar la pantalla LCD a nuestra CUP a través del PPI

8155. Las líneas PC0, PC1 y PC2 se utilizan para controlar la pantalla LCD, mientras que las líneas de datos de ésta son accedidas conectando PC0, PC1, ..., PC7 a DB0, DB1, ..., DB7, respectivamente. En todas y cada una de las líneas mencionadas debe conectarse una resistencia de 1K a +5V.

14

PANTALLA LCD

FIG.94A

Page 183: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

d

3X1K 8X1K

PC2 E PC1 R/W PC0 RS

+5V

+5V

PA0 DB0 14 PA1 DB1 13 PA2 DB2 12 PA3 DB3 11 PA4 DB4 10 PA5 DB5 9 PA6 DB6 8 PA7 DB7 7

2 +5V

1 GND

LCD BT 12009

FIG.94B

9.5 PROGRAMACIÓN DE LA PANTALLA LCD.

______________________________________ 183 ___________________________________________

Las funciones que pueden programarse en la pantalla LCD según se desee leer o escribir determinados atos son:

Clear Display: Borra todo el display, sitúa el cursor en su posición inicial y pone el "modo entrada" en

incrementar. Para conseguir esto, debe escribirse en IR la palabra 0000 0001.

Volver al inicio: Coloca el cursor en la posición inicial (dirección 0). El contenido de la DD RAM no se modifica. Tendremos que escribir 0000 001X.

Modo entrada: Se establecen las condiciones en que los datos aparecerán en la pantalla. Esto se consigue

escribiendo en IR la palabra que deseemos según se señala a continuación:

0000 01 I/D S. I/D = 0 Decremento automático del AC al escribir I/D = 1 Incremento automático del AC al escribir S = 0 El display no se desplaza al escribir un nuevo carácter S = 1 El display si se desplaza al escribir un nuevo carácter

Control del display: Enciende o apaga el display completo, enciende o apaga el cursor y hace que el cursor parpadee o no, en función del código introducido según se indica a continuación:

0 0 0 0 1 D C B

Page 184: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 184 ___________________________________________

B = 0 No hay parpadeo en el cursor rectangular B = 1 Si hay parpadeo en el cursor rectangular C = 0 El cursor no se visualiza C = 1 El cursor si se visualiza D = 0 El display se apaga D = 1 El display se enciende

• Desplazamiento de cursor o display: Mueve el cursor y desplaza el display sin cambiar el contenido de la DD RAM según el código siguiente:

0 0 0 1 S/C R/L X X S/C = 0 El deslizamiento se produce sobre el cursor S/C = 1 El deslizamiento se produce sobre todo el display R/L = 0 A izquierdas R/L = 1 A derechas

• Set: Permite conectar el módulo LCD a través de las 8 líneas del bus de datos o bien con 4 líneas solamente para ahorrar líneas de conexión caso de emplear una puerta de un PPI. Permite emplear una o dos líneas (en este caso una) y el número de puntos por carácter (en este caso 5x7).

0 0 1 DL N F X X DL = 0 Control con 4 bits DL = 1 Control con 8 bits N = 0 Se trabaja con una línea N = 1 Se trabaja con dos líneas F = 0 Se obtendrán 5x7 puntos F = 1 Se obtendrán 5x10 puntos

• Colocar dirección CG RAM: El registro AC queda cargado con la dirección de la CG RAM 0 1 CG5 CG4 CG3 CG2 CG1 CG0 CG5...CG0 = dirección de CG RAM (64 direcciones)

• Colocar dirección de DD RAM: El registro AC queda cargado con la dirección de la DD RAM. 1 DD6 DD5 DD4 DD3 DD2 DD1 DD0 DD6...DD0 = dirección de DD RAM (128 direcciones)

• Leer Busy y AC: El dato recibido indica el contenido de AC es decir, la dirección de CG RAM o de DD RAM según la que se haya seleccionado previamente. El bit número 7 representa el flag Busy que nos indica si el módulo esta ocupado (1) o si está libre para recibir nuevos datos (0).

BF AC6 AC5 AC4 AC3 AC2 AC1 AC0

• Escribir en CG RAM o en DD RAM: Se pueden escribir en CG RAM o en DD RAM los datos que se desee

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

• Lectura de CG RAM o de DD RAM: Se pueden leer los datos existentes en CG RAM y en DD RAM. DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Page 185: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

8dnep

evp la8deo

.

9.6 SISTEMA DE PULSADORES

______________________________________ 185 ___________________________________________

A efectos de poder controlar el desarrollo de la práctica, se colocarán 8 pulsadores en el puerto B del PPI

155 (de forma similar a como se hizo en el ejercicio 3 del tema 7). A cada pulsador se le atribuirá una función eterminada mediante el software que se diseñará y que nos permitirá ejecutar la práctica en el momento que os interese. Los pulsadores serán conectados según se muestra en la FIG.96A. En cada línea de pulsador nos ncontramos una red R-C para eliminar los picos que se producen durante los contactos mecánicos de los ulsadores.

El valor de estos componentes debe calcularse en función de las necesidades de la aplicación, teniendo n cuenta que cuanto mayor sea la constante de tiempo RC, más lenta será la respuesta del pulsador, pero a la ez, más segura será en cuanto a eliminación de rebotes. También podríamos actuar contra los rebotes en los ulsadores, diseñando una subrutina apropiada al caso.

En condiciones de reposo, ningún pulsador accionado, los condensadores estarán cargados a través de s resistencias a un nivel de tensión de +5V, por lo que tendremos un nivel lógico 1 en las entradas del PPI 155. Cuando accionamos uno de los pulsadores, el condensador correspondiente se descarga a masa a través e la resistencia de 47 ohmios, por lo que aparecerá un nivel lógico 0 en la entrada del PPI 8155 al que se lleva sta señal. Al soltar el pulsador el condensador comenzará a cargarse hasta alcanzar un nivel lógico 1. Las peraciones de carga y descarga se realizan según una función exponencial.

+5V 10K

47 100nF

RED

RED P0

PB0

RED P1

PB1

RED P2

PB2

RED P3

PB3

RED P4

PB4

RED P5

PB5

RED P6

PB6

RED P7

PB7

PPI 8155

FIG.96A

Page 186: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 186 ___________________________________________

En la FIG.97A y en la FIG.97B podemos ver el esquema completo para desarrollar esta prueba. Se ha representado en dos partes para que resulte más sencillo de ver.

ULN2803 E0 1 18 S0

E1 2 17 S1

E2 3 16 S2

E3 4 15 S3

M1 D1

D2 D3 D4

ULN2803 E0 1 18 S0

E1 2 17 S1

E2 3 16 S2

E3 4 15 S3

M2 D5

D6 D7 D8

ULN2803 E0 1 18 S0

E1 2 17 S1

E2 3 16 S2

E3 4 15 S3

M3 D9

D10 D11 D12

+12V

21 PA0

22 PA1

23 PA2

24 PA3

25 PA4

26 PA5

27 PA6

28 PA7

29 PB0

30 PB1

31 PB2

32 PB3

D0 AD0 12 D1 AD1 13D2 AD2 14D3 AD3 15D4 AD4 16D5 AD5 17D6 AD6 18D7 AD7 19

8155 +5V

100 uF Vcc 40

GND 20

ALE ALE 11 WR WR 10 RD RD 9 A10 IO/M 7 CS4 CS 8

CLK OUT TIMER IN 3 RESET RESET 4 OUT

100 uF

H22A1DM1

R9 H22A1 DM2

R8 H22A1DM3

R7

ULN2803

+5V

37 PC0 S0 E0

38 PC1 S1 E1

39 PC2 S2 E2

FIG.97A

9.7 CONFIGURACIÓN FINAL DEL HARDWARE.

Page 187: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 187 ___________________________________________

Al estudiar los esquemas vemos que los tres motores y los detectores de posición de inicio son controlados por el PPI 8155, mientras que la pantalla LCD y los pulsadores de entrada se controlan mediante el 8255. Los devanados de los motores se gobiernan directamente por un ULN 2803 y en paralelo con aquellos se colocan diodos de protección (uno por cada bobina). El motor M1 es controlado con las líneas PA0, ..., PA3 del puerto A, el motor M2 mediante las líneas PA4, ..., PA7 del puerto A y el motor M3 con las líneas PB0, ..., PB3 del puerto B. Como el ULN2803 está constituido por puertas inversoras, cuando en un devanado determinado deseemos colocar un 0 lógico, tendremos que sacar un 1 lógico por la línea correspondiente del 8155. Los detectores de posición (fotodetectores) se conectan al puerto C a través de otro ULN2803, en cuyas entradas y salidas situaremos resistencias de polarización.

LCD

8x1K

3x1K

8255

4 PA0 DB0 14 3 PA1 DB1 132 PA2 DB2 121 PA3 DB3 1140 PA4 DB4 1039 PA5 DB5 938 PA6 DB6 837 PA7 DB7 7

14 PC0 RS 415 PC1 R/W 616 PC2 E 5

+5V

+5V

2

1

26

7 GND

Vcc

FIG.97B

25 PB7 P7 RED

24 PB6 P6 RED

23 PB5 P5 RED

22 PB4 P4 RED

21 PB3 P3 RED

20 PB2 P2 RED

19 PB1 P1 RED

18 PB0 P0 RED

+5V 10K

47 10 nF

RED

A0 A0 9 A1 A1 8WR WR 36RD RD 5CS3 CS 6

RESET RESET 35OUT

100 nF

D0 D0 34

D1 D1 33

D2 D2 32

D3 D3 31

D4 D4 30

D5 D5 29

D6 D6 28

D7 D7 27

Page 188: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

El bus de datos del 8155 se conecta directamente al bus de datos del microprocesador de nuestra tarjeta principal y las distintas señales de control, del modo indicado en la FIG.97A. Este PPI se selecciona con la señal CS4 y el control de acceso a memoria o a entrada/salida se realiza mediante la línea de direcciones A10 del microprocesador. El PPI 8255 se conecta de modo similar a los buses del microprocesador 8085, realizando la selección de este dispositivo mediante la señal CS3. La pantalla LCD se controla mediante el puerto A y los tres bits menos significativos del puerto C con los que se realizarán las funciones de control necesarios para gobernar el sistema LCD. Es importante situar en todas las líneas de acceso a la pantalla programable, resistencias de polarización, como se ha realizado a través de los arrays.

Mediante el puerto B controlamos las señales de entrada del sistema de pulsadores. Según las conexiones realizadas, tendremos las siguientes direcciones de acceso a los dispositivos de

control: PPI 8155 Registro de estado C400H Puerto A C401H Puerto B C402H Puerto C C403H RAM 8155 C000H - C0FFH PPI 8255 Registro de estado B003H Puerto A B000H Puerto B B001H Puerto C B002H Estas direcciones se han obtenido por un procedimiento idéntico al realizado en los temas anteriores, y

puesto que se ha tenido cuidado en realizar las mismas conexiones, evidentemente, se obtienen las mismas direcciones que en aquellos casos.

de

s

.

9.8 SOFTWARE DE CONTROL

______________________________________ 188 ___________________________________________

Como es lógico, realizado ya el diseño del hardware, iniciaremos el proceso de desarrollo del software e control necesario para manejar de la forma que nosotros deseemos, todos los dispositivos de carga, que en ste caso son, como sabemos, los tres motores, la pantalla LCD y los siete pulsadores.

En principio y como primera aproximación a lo que será nuestro programa, puede establecer el

iguiente pseudocódigo:

NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Page 189: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 189 ___________________________________________

Iniciar el sistema Iniciar pantalla LCD Colocar motores en posición inicial MIENTRAS pulsador no sea accionado

Explorar pulsadores FIN de MIENTRAS

Ejecutar función pulsadores Volver a "Explorar pulsadores" Final del programa

Seguidamente se procede a realizar un paso más de refinamiento que nos determine de forma algo más

precisa cada uno de los pasos antes mencionados, para finalmente llegar a desarrollar el proceso deseado. El proceso "Iniciar sistema" consistirá básicamente en desarrollar los pasos imprescindibles para que nuestro sistema entre en funcionamiento de una forma correcta y quede dispuesto para el trabajo. Los pasos a seguir son los habituales hasta el momento como, prohibir interrupciones, punterizar la pila y programar los PPI 8155 y PPI 8255. Según el hardware estudiado, los puertos A y B del 8155 deben trabajar como salidas mientras que el puerto C será programado como entrada. Emplearemos la RAM del 8155 como pila de nuestro sistema. En cuanto al PPI 8255 se programará el puerto B como entrada, y los puertos C y A como salidas, aunque deberemos tener en cuenta que en procedimiento de intercambio de información con la pantalla LCD, habrá que programar el puerto A como entrada para en determinadas ocasiones leer la información que dicho periférico nos envíe. "Iniciar la pantalla LCD" será un proceso que nos permite iniciar el control de la pantalla LCD en la que representaremos los caracteres ASCII deseados en cada momento y que nos permitirán seguir el proceso y evolución del programa desarrollado en cada instante. El proceso de inicialización del LCD consistirá esencialmente en programarlo como una línea de dígitos formado cada uno por 5x7 puntos, prever que la información no se desplace en la pantalla ni de izquierda a derecha ni de derecha a izquierda, que el cursor no parpadee, sea visible y el display se encienda. "Colocar motores en posición inicial" será un proceso por el cual se pongan los tres motores paso a paso en movimiento, hasta alcanzar la posición inicial de giro, momento en el que se pararán. La posición inicial de giro será la señalada por los fotodetectores de posición que como sabemos están conectados a las líneas PC0, PC1 y PC2 del PPI 8155. La posición en la que el aspa, que va unido solidariamente al eje del motor, intercepta el haz del fotodetector, la consideramos como origen o posición de giro de 0º. Lógicamente, si a partir de ese instante deseamos que un motor avance 30º, no tendremos más que proporcionar los pulsos adecuados a sus bobinas, teniendo en cuenta que en cada paso el motor avanza 7,5º.

El proceso "Explorar pulsadores" consistirá en leer el contenido del puerto B del PPI 8255, al que están conectados los pulsadores, si la palabra de 8 bits leída es FFH entenderemos que no hay ningún pulsador accionado, mientras que si algún bit de dicha palabra es 0 lógico, el pulsador correspondiente estará accionado teniendo entonces que proceder a realizar la función correspondiente a dicho pulsador. "Ejecutar función pulsadores" es el proceso inmediato a ejecutar una vez ha sido detectado un pulsador y consistirá básicamente en llevar a cabo el control que se desee de los motores y de la pantalla LCD. Una vez finalizado dicho control se pasará a una nueva exploración de los pulsadores. Las funciones asignadas a cada pulsador pueden ser las que nosotros deseemos, en este caso iremos asignándolas en pasos de refinamiento posteriores a medida que vayamos avanzando en la definición de nuestro programa. Tras este pequeño análisis obtendremos el siguiente pseudocódigo:

NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Prohibir interrupciones Punterizar la pila Programar el PPI 8155 Programar el PPI 8255

Page 190: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 190 ___________________________________________

Programar pantalla LCD Colocar motores en origen (0º) Sacar a pantalla la palabra "INICIO" Iniciar pulsadores MIENTRAS pulsador no sea accionado

Leer pulsadores FIN de MIENTRAS

Ejecutar función pulsador accionado Volver a "Iniciar pulsadores" Final del programa

Pasaremos ahora a analizar más detenidamente y con mayor profundidad cada uno de los procesos que aún no aparecen suficientemente claros. El proceso que denominamos "Programar pantalla", como sabemos consiste en dejar programado el LCD para su funcionamiento. Para esto tendremos que cargar en sus registros internos los datos precisos que posteriormente nos permitan escribir y leer del LCD la información necesaria en cada momento. Básicamente el proceso a seguir consistirá en "escribir datos" en sus registros y "leer información" almacenada en los mismos. Por tanto se diseñaran las subrutinas necesarias para llevar a cabo estas operaciones. Basándonos en esto y conociendo los registros disponibles en el LCD se prepararan los siguientes procesos: 1. Subrutina para saber si el LCD esta disponible o libre para recibir un dato. La denominaremos LIBRE. 2. Subrutina para escribir en el registro IR. La denominaremos ESCIR. 3. Subrutina para escribir en el registro DR. La denominaremos ESCDR. 4. Subrutina para escribir en el LCD una cadena de caracteres alfanuméricos. La denominaremos CADENA. 5. Proceso de inicialización del LCD haciéndolo operativo.

Veremos ahora el desarrollo de cada una de estas subrutinas. NOMBRE: LIBRE FUNCION: Esperar hasta que LCD esté libre PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna. Se sale cuando LCD esté libre. Programar el 8255 para leer Preparar el control LCD (02H) MIENTRAS bit 7 del IR = 1 Leer el IR FIN de MIENTRAS Fin de subrutina

Como podemos apreciar esta subrutina consiste básicamente en un bucle durante el cual se lee el registro de instrucciones (IR) de la pantalla LCD. Cuando encontremos que el bit 7 de dicho registro tiene un 0 lógico, tendremos dispuesta la pantalla para recibir datos. Mientras el bit 7 del IR permanezca en estado lógico 1, el bucle se continúa ejecutando de forma indefinida, puesto que el LCD no está disponible.

NOMBRE: ESCIR FUNCION: Escribe dato en IR (Registro instrucciones) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el IR Final de subrutina

Esta subrutina nos permite escribir un dato en el registro de instrucciones (IR). Para ello, impone como condición indispensable disponer en el Acumulador del dato a cargar, antes de acceder a esta subrutina. Cuando

Page 191: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 191 ___________________________________________

finalice su trabajo no habrá efectuado ninguna modificación en los registros del microprocesador ni en la memoria del sistema.

NOMBRE: ESCDR FUNCION: Escribir datos en el DR (registro de datos) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el DR Final de subrutina

Permite escribir en el registro de datos (DR) de la pantalla LCD el dato que previamente a la llamada a esta subrutina tengamos almacenado en el Acumulador.

NOMBRE: CADENA FUNCION: Escribir una cadena de caracteres PRECONDICIONES: Dirección comienzo cadena en HL. Final de cadena marcado por el carácter "." POSTCONDICIONES: Cadena escrita en la DD RAM Apuntar a la DD RAM MIENTRAS no sea fin de cadena

Tomar dato de cadena Escribir dato en DD RAM Apuntar dato siguiente de cadena FIN de MIENTRAS Final de subrutina

Nos permite escribir o almacenar una cadena de caracteres en la memoria RAM de datos del display (DD RAM). Para acceder a esta subrutina tendremos que pasar en el par de registros HL la dirección de memoria en la que se encuentra el comienzo de la cadena a transmitir. El final de la cadena será detectado al encontrar el carácter "." momento en el que se dará por finalizada la escritura en el LCD. El proceso de Iniciar el LCD puede plantearse también coo subrutina, aunque nosotros lo desarrollaremos como una continuación del programa en sus comienzos. Este proceso será del modo siguiente:

Colocar control de 8 bits Temporizar más de 4,1 segundos Colocar control de 8 bits Temporizar más de 100 us Colocar control de 8 bits Esperar que LCD esté libre Poner modo entrada incrementar Display sin desplazamiento Poner display y cursor en ON Temporizar Final de subrutina

Podemos apreciar que se han desarrollado operaciones que se repiten. Esto es así porque es un dato proporcionado por el fabricante de la pantalla LCD que nos lo proporciona en sus hojas de características. Además vemos que necesitamos incorporar subrutinas de temporización. Nosotros diseñaremos una única

Page 192: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 192 ___________________________________________

temporización que, en función de los datos que le aportemos, nos ejecute la temporización deseada. Denominaremos esta subrutina TEMPOR y puede ser la siguiente:

NOMBRE: TEMPOR FUNCION: Proporciona un tiempo de espera PRECONDICIONES: Valor temporización en DE POSTCONDICIONES: Modifica DE Iniciar DE MIENTRAS DE>0

Esperar Decrementar contador (DE)

FIN de MIENTRAS Final de subrutina El proceso "Colocar motores en origen (0º)", consiste como sabemos en arrancar los motores y hacer que se paren en la posición de inicio que nosotros consideraremos como de giro de 0º. (Posición marcada por el aspa). Tendremos por tanto que diseñar una subrutina que, en función de unos datos de entrada (que nos indiquen la posición en que deben parar los motores) hagan girar dichos elementos hasta la posición especificada. Denominaremos a esta subrutina GIRAR y puede ser del modo siguiente: NOMBRE: GIRAR FUNCION: Gira motores hasta posición adecuada PRECONDICIONES: Valor posición motores POSTCONDICIONES: Ninguna Preparar condiciones iniciales Leer aspas DM1, DM2 y DM3 MIENTRAS DM1=1 Sacar datos giro a motores M1, M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M1 MIENTRAS posición M1>0 Sacar datos giro a motores M1, M2 y M3 Decrementar posición M1 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM2=1 Sacar datos giro a motores M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M2 MIENTRAS posición M2>0 Sacar datos giro a motores M2 y M3 Decrementar posición M2 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM3=1 Sacar datos giro a motores M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M3 MIENTRAS posición M3>0 Sacar datos giro a motores M3 Decrementar posición M3 FIN de MIENTRAS FIN de subrutina

Page 193: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 193 ___________________________________________

Vemos que el proceso de posicionamiento de los tres motores consiste en hacerlos girar al mismo tiempo hasta encontrar la posición deseada del motor M1, a continuación encontrar la posición deseada para M2 y finalmente, encontrar la posición del motor M3. El proceso "leer aspas" consistirá en efectuar una lectura de las señales presentes en los fotodetectores DM1, DM2 y DM3 que están conectados al puerto C del PPI 8155 a través de un ULN 2803.

Pasamos ahora a definir cada una de las ocho funciones que deseamos desarrollar con el accionamiento de los ocho pulsadores que tenemos conectados en el puerto B del PPI 8255.

Pulsador P0. Los motores girarán hasta situarse los tres a 30º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P0 - 30 - 30 - 30".

Pulsador P1. Los motores girarán hasta situarse los tres a 60º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P1 - 60 - 60 - 60".

Pulsador P2. Los motores girarán hasta situarse los tres a 90º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P2 - 90 - 90 - 90".

Pulsador P3. Los motores girarán hasta situarse los tres a 120 de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P3 - 120 - 120 - 120".

Pulsador P4. Los motores girarán hasta situarse M1 a 30º, M2 a 60º y M3 a 90º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P4 - 30 - 60 - 90".

Pulsador P5. Los motores girarán hasta situarse M1 a 90º, M2 a 30º y M3 a 120º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P5 - 90 - 30 - 120".

Pulsador P6. Los motores girarán hasta situarse M1 a 180º, M2 a 0º y M3 a 90º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P6 - 180 - 0 - 90".

Pulsador P7. Los motores girarán hasta situarse los tres a 0º de su posición de arranque, es decir, se colocaran en la posición inicial. En la pantalla LCD aparecerá la expresión "PULSADOR P7 - POSICION INICIAL".

Se reunirá ahora todas las subrutinas expuestas hasta el momento para tener una idea más compacta de todas las tareas a desarrollar:

NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Prohibir interrupciones Punterizar la pila Programar el PPI 8155 Programar el PPI 8255 Colocar control de 8 bits Temporizar más de 4,1 segundos Colocar control de 8 bits Temporizar más de 100 us Colocar control de 8 bits Esperar que LCD esté libre Poner modo entrada incrementar Display sin desplazamiento Poner display y cursor en ON Temporizar Colocar motores en origen (0º) Sacar a pantalla la palabra "INICIO" Iniciar pulsadores MIENTRAS pulsador no sea accionado

Leer pulsadores FIN de MIENTRAS

Ejecutar función pulsador accionado Volver a "Iniciar pulsadores" Final del programa

Page 194: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 194 ___________________________________________

NOMBRE: LIBRE FUNCION: Esperar hasta que LCD esté libre PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna. Se sale cuando LCD esté libre. Programar el 8255 para leer Preparar el control LCD (02H) MIENTRAS bit 7 del IR = 1

Leer el IR FIN de MIENTRAS Fin de subrutina

NOMBRE: ESCIR FUNCION: Escribe dato en IR (Registro instrucciones) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna

Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el IR Final de subrutina

NOMBRE: ESCDR FUNCION: Escribir datos en el DR (registro de datos) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna

Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el DR Final de subrutina

NOMBRE: CADENA FUNCION: Escribir una cadena de caracteres PRECONDICIONES: Dirección comienzo cadena en HL.

Final de cadena marcado por el carácter "." POSTCONDICIONES: Cadena escrita en la DD RAM

Apuntar a la DD RAM MIENTRAS no sea fin de cadena

Tomar dato de cadena Escribir dato en DD RAM Apuntar dato siguiente de cadena

FIN de MIENTRAS Final de subrutina

NOMBRE: TEMPOR FUNCION: Proporciona un tiempo de espera PRECONDICIONES: Valor temporización en DE POSTCONDICIONES: Modifica DE Iniciar DE MIENTRAS DE>0

Page 195: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 195 ___________________________________________

Esperar Decrementar contador (DE)

FIN de MIENTRAS Final de subrutina NOMBRE: GIRAR FUNCION: Gira motores hasta posición adecuada PRECONDICIONES: Valor posición motores POSTCONDICIONES: Ninguna Preparar condiciones iniciales Leer aspas DM1, DM2 y DM3 MIENTRAS DM1=1 Sacar datos giro a motores M1, M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M1 MIENTRAS posición M1>0 Sacar datos giro a motores M1, M2 y M3 Decrementar posición M1 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM2=1 Sacar datos giro a motores M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M2 MIENTRAS posición M2>0 Sacar datos giro a motores M2 y M3 Decrementar posición M2 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM3=1 Sacar datos giro a motores M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M3 MIENTRAS posición M3>0 Sacar datos giro a motores M3 Decrementar posición M3 FIN de MIENTRAS FIN de subrutina

Con todos estos datos podemos pasar a desarrollar el programa ensamblador equivalente a nuestro pseudocódigo. El lector puede desarrollar aún más los diferentes procesos señalados en el pseudocódigo si necesita tener determinadas cuestiones más claras.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : MOTORES.ASMOUTPUT FILENAME : MOTORES.OBJ

Page 196: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 196 ___________________________________________

1 ;------------------------------------------2 ;NOMBRE : MOTORES3 ;FUNCION : CONTROL MOTORES PAP Y LCD4 ;PRECONDICION : NINGUNA5 ;POSTCONDICION : NINGUNA6 ;------------------------------------------78 ;------------------------------------------9

;PARAMETROS PPI 815510 ;------------------------------------------11 01 C4 PA81 EQU C401H12 02 C4 PB81 EQU C402H13 03 C4 PC81 EQU C403H14 00 C4 REES81 EQU C400H15 FF C0 PPILA EQU C0FFH16 ;------------------------------------------1718 ;------------------------------------------19 ;PARAMETROS PPI 825520 ;------------------------------------------21 00 B0 PA82 EQU B000H22 01 B0 PB82 EQU B001H23 02 B0 PC82 EQU B002H24 03 B0 REES82 EQU B003H25 ;------------------------------------------2627 ;------------------------------------------28 ;PARAMETROS GRADOS GIRO MOTORES29 ;------------------------------------------30 00 82 GIRM1 EQU 8200H31 01 82 GIRM2 EQU 8201H32 03 82 GIRM3 EQU 8203H33 ;------------------------------------------3435 0000 MOTORES:36 0000 F3 DI37 0001 21 FF C0 LXI H,PPILA38 0004 F9 SPHL39 0005 3E 03 MVI A,03H40 0007 32 00 C4 STA REES8141 000A 3E 82 MVI A,82H42 000C 32 03 B0 STA REES8243 000F 3E 30 MVI A,30H44 0011 CD 44 01 CALL ESCIR45 0014 11 FF 2F LXI D,2FFFH46 0017 CD 38 01 CALL TEMPOR47 001A 3E 30 MVI A,30H48 001C CD 44 01 CALL ESCIR49 001F 11 FF 0F LXI D,0FFFH50 0022 CD 38 01 CALL TEMPOR51 0025 3E 30 MVI A,30H52 0027 CD 44 01 CALL ESCIR53 002A CD 86 01 CALL LIBRE54 002D 3E 06 MVI A,06H55 002F CD 44 01 CALL ESCIR56 0032 3E 0E MVI A,0EH57 0034 CD 44 01 CALL ESCIR58 0037 11 FF 0F LXI D,0FFFH59 003A CD 38 01 CALL TEMPOR60 003D 3E 00 MVI A,00H61 003F 21 00 82 LXI H,GIRM162 0042 77 MOV M,A63 0043 23 INX H64 0044 77 MOV M,A65 0045 23 INX H66 0046 77 MOV M,A

Page 197: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 197 ___________________________________________

67 0047 CD C5 01 CALL MOTOR68 004A 21 90 02 LXI H,CADE169 004D CD A9 01 CALL CADENA70 0050 3E FF SALT1 MVI A,FFH71 0052 3A 01 B0 SALT2 LDA PB8272 0055 47 MOV B,A73 0056 FE FF CPI FFH74 0058 CA 52 00 JZ SALT275 005B 78 MOV A,B76 005C FE FE CPI FEH77 005E CA 82 00 JZ PULSAD078 0061 FE FD CPI FDH79 0063 CA 98 00 JZ PULSAD180 0066 FE FB CPI FBH81 0068 CA AE 00 JZ PULSAD282 006B FE F7 CPI F7H83 006D CA C4 00 JZ PULSAD384 0070 FE EF CPI EFH85 0072 CA DA 00 JZ PULSAD486 0075 FE DF CPI DFH87 0077 CA F1 00 JZ PULSAD588 007A FE BF CPI BFH89 007C CA 08 01 JZ PULSAD690 007F C3 1F 01 JMP PULSAD791 0082 3E 11 PULSAD0 MVI A,1792 0084 21 00 82 LXI H,GIRM193 0087 77 MOV M,A94 0088 23 INX H95 0089 77 MOV M,A96 008A 23 INX H97 008B 77 MOV M,A98 008C CD C5 01 CALL MOTOR99 008F 21 A5 02 LXI H,CADE2

100 0092 CD A9 01 CALL CADENA101 0095 C3 35 01 JMP FIN102 0098 3E 22 PULSAD1 MVI A,34103 009A 21 00 82 LXI H,GIRM1104 009D 77 MOV M,A105 009E 23 INX H106 009F 77 MOV M,A107 00A0 23 INX H108 00A1 77 MOV M,A109 00A2 CD C5 01 CALL MOTOR110 00A5 21 BA 02 LXI H,CADE3111 00A8 CD A9 01 CALL CADENA112 00AB C3 35 01 JMP FIN113 00AE 3E 33 PULSAD2 MVI A,51114 00B0 21 00 82 LXI H,GIRM1115 00B3 77 MOV M,A116 00B4 23 INX H117 00B5 77 MOV M,A118 00B6 23 INX H119 00B7 77 MOV M,A120 00B8 CD C5 01 CALL MOTOR121 00BB 21 CF 02 LXI H,CADE4122 00BE CD A9 01 CALL CADENA123 00C1 C3 35 01 JMP FIN124 00C4 3E 44 PULSAD3 MVI A,68125 00C6 21 00 82 LXI H,GIRM1126 00C9 77 MOV M,A127 00CA 23 INX H128 00CB 77 MOV M,A129 00CC 23 INX H130 00CD 77 MOV M,A131 00CE CD C5 01 CALL MOTOR132 00D1 21 E4 02 LXI H,CADE5133 00D4 CD A9 01 CALL CADENA134 00D7 C3 35 01 JMP FIN

Page 198: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 198 ___________________________________________

135 00DA 21 00 82 PULSAD4 LXI H,GIRM1136 00DD 36 11 MVI M,17137 00DF 23 INX H138 00E0 36 22 MVI M,34139 00E2 23 INX H140 00E3 36 33 MVI M,51141 00E5 CD C5 01 CALL MOTOR142 00E8 21 F9 02 LXI H,CADE6143 00EB CD A9 01 CALL CADENA144 00EE C3 35 01 JMP FIN145 00F1 21 00 82 PULSAD5 LXI H,GIRM1146 00F4 36 33 MVI M,51147 00F6 23 INX H148 00F7 36 11 MVI M,17149 00F9 23 INX H150 00FA 36 44 MVI M,68151 00FC CD C5 01 CALL MOTOR152 00FF 21 0E 03 LXI H,CADE7153 0102 CD A9 01 CALL CADENA154 0105 C3 35 01 JMP FIN155 0108 21 00 82 PULSAD6 LXI H,GIRM1156 010B 36 66 MVI M,102157 010D 23 INX H158 010E 36 00 MVI M,00159 0110 23 INX H160 0111 36 33 MVI M,51161 0113 CD C5 01 CALL MOTOR162 0116 21 23 03 LXI H,CADE8163 0119 CD A9 01 CALL CADENA164 011C C3 35 01 JMP FIN165 011F 21 00 82 PULSAD7 LXI H,GIRM1166 0122 3E 00 MVI A,00167 0124 77 MOV M,A168 0125 23 INX H169 0126 77 MOV M,A170 0127 23 INX H171 0128 77 MOV M,A172 0129 CD C5 01 CALL MOTOR173 012C 21 38 03 LXI H,CADE9174 012F CD A9 01 CALL CADENA175 0132 C3 35 01 JMP FIN176 0135 C3 50 00 FIN JMP SALT1177178 ;------------------------------------------179 ;NOMBRE: TEMPOR180 ;FUNCION: Tiempo de espera181 ;PRECONDICIONES: Valor en el par DE182 ;POSTCONDICIONES: Modifica DE183 ;------------------------------------------184 0138 TEMPOR:185 0138 F5 PUSH PSW186 0139 1B TE1 DCX D187 013A 7A MOV A,D188 013B B3 ORA E189 013C 00 NOP190 013D 00 NOP191 013E 00 NOP192 013F C2 39 01 JNZ TE1193 0142 F1 POP PSW194 0143 C9 RET195196 ;------------------------------------------197 ;NOMBRE: ESCIR198 ;FUNCION: Escribe en el IR199 ;PRECONDICIONES: Dato en Acc200 ;POSTCONDICIONES: Ninguna201 ;------------------------------------------202 0144 ESCIR:

Page 199: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 199 ___________________________________________

203 0144 F5 PUSH PSW204 0145 C5 PUSH B205 0146 47 MOV B,A206 0147 CD 86 01 CALL LIBRE207 014A 3E 82 MVI A,82H208 014C 32 03 B0 STA REES82209 014F 78 MOV A,B210 0150 32 00 B0 STA PA82211 0153 3E 00 MVI A,00H212 0155 32 02 B0 STA PC82213 0158 3E 04 MVI A,04H214 015A 32 02 B0 STA PC82215 015D 3E 00 MVI A,00H216 015F 32 02 B0 STA PC82217 0162 C1 POP B218 0163 F1 POP PSW219 0164 C9 RET220221 ;------------------------------------------222 ;NOMBRE: ESCDR223 ;FUNCION: Escribe dato en el DR224 ;PRECONDICIONES: Dato en Acc225 ;POSTCONDICIONES: Ninguna226 ;------------------------------------------227 0165 ESCDR:228 0165 F5 PUSH PSW229 0166 C5 PUSH B230 0167 47 MOV B,A231 0168 CD 86 01 CALL LIBRE232 016B 3E 82 MVI A,82H233 016D 32 03 B0 STA REES82234 0170 78 MOV A,B235 0171 32 00 B0 STA PA82236 0174 3E 01 MVI A,01H237 0176 32 02 B0 STA PC82238 0179 3E 05 MVI A,05H239 017B 32 02 B0 STA PC82240 017E 3E 01 MVI A,01H241 0180 32 02 B0 STA PC82242 0183 C1 POP B243 0184 F1 POP PSW244 0185 C9 RET245246 ;------------------------------------------247 ;NOMBRE: LIBRE248 ;FUNCION: Mira si LCD puede recibir datos249 ;PRECONDICIONES: Ninguna250 ;POSTCONDICIONES: Ninguna251 ;------------------------------------------252 0186 LIBRE:253 0186 C5 PUSH B254 0187 F5 PUSH PSW255 0188 3E 92 MVI A,92H256 018A 32 03 B0 STA REES82257 018D 3E 02 MVI A,02H258 018F 32 02 B0 STA PC82259 0192 3E 06 LIB1 MVI A,06H260 0194 32 02 B0 STA PC82261 0197 00 NOP262 0198 3A 00 B0 LDA PA82263 019B 47 MOV B,A264 019C 3E 02 MVI A,02H265 019E 32 02 B0 STA PC82266 01A1 78 MOV A,B267 01A2 07 RLC268 01A3 DA 92 01 JC LIB1269 01A6 F1 POP PSW270 01A7 C1 POP B

Page 200: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 200 ___________________________________________

271 01A8 C9 RET272273 ;------------------------------------------274 ;NOMBRE: CADENA275 ;FUNCION: Escribe cadena caracteres276 ;PRECONDICIONES: Comienzo cadena en HL.277 ;Final de cadena marcado por "."278 ;POSTCONDICIONES: Ninguna279 ;------------------------------------------280 01A9 CADENA:281 01A9 F5 PUSH PSW282 01AA E5 PUSH H283 01AB 3E 80 MVI A,80H284 01AD CD 44 01 CALL ESCIR285 01B0 3E 0E CAD1 MVI A,0EH286 01B2 CD 44 01 CALL ESCIR287 01B5 7E MOV A,M288 01B6 FE 2E CPI '.'289 01B8 CA C2 01 JZ FINCAD290 01BB CD 65 01 CALL ESCDR291 01BE 23 INX H292 01BF C3 B0 01 JMP CAD1293 01C2 E1 FINCAD POP H294 01C3 F1 POP PSW295 01C4 C9 RET296297 ;------------------------------------------298 ;NOMBRE: MOTOR299 ;FUNCION: Gira motores a posicion300 ;PRECONDICIONES: Datos en GIRM1, 2, y 3301 ;POSTCONDICIONES: Ninguna302 ;------------------------------------------303 01C5 MOTOR:304 01C5 D5 PUSH D305 01C6 C5 PUSH B306 01C7 E5 PUSH H307 01C8 F5 PUSH PSW308 01C9 21 8B 02 LXI H,TGIRO309 01CC 3A 03 C4 MOT1 LDA PC81310 01CF 47 MOV B,A311 01D0 0F RRC312 01D1 DC 3F 02 CC SDAT3313 01D4 78 MOV A,B314 01D5 0F RRC315 01D6 DA CC 01 JC MOT1316 01D9 EB MOT2 XCHG317 01DA 21 00 82 LXI H,GIRM1318 01DD 4E MOV C,M319 01DE 79 MOT3 MOV A,C320 01DF FE 00 CPI 00H321 01E1 CA EC 01 JZ MOT4322 01E4 EB XCHG323 01E5 CD 3F 02 CALL SDAT3324 01E8 0D DCR C325 01E9 C3 DE 01 JMP MOT3326 01EC 3A 03 C4 MOT4 LDA PC81327 01EF 47 MOV B,A328 01F0 0F RRC329 01F1 0F RRC330 01F2 DC 51 02 CC SDAT2331 01F5 78 MOV A,B332 01F6 0F RRC333 01F7 0F RRC334 01F8 DA EC 01 JC MOT4335 01FB EB MOT5 XCHG336 01FC 21 01 82 LXI H,GIRM2337 01FF 4E MOV C,M338 0200 79 MOT6 MOV A,C

Page 201: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 201 ___________________________________________

339 0201 FE 00 CPI 00H340 0203 CA 0E 02 JZ MOT7341 0206 EB XCHG342 0207 CD 51 02 CALL SDAT2343 020A 0D DCR C344 020B C3 00 02 JMP MOT6345 020E 3A 03 C4 MOT7 LDA PC81346 0211 47 MOV B,A347 0212 0F RRC348 0213 0F RRC349 0214 0F RRC350 0215 DC 65 02 CC SDAT1351 0218 78 MOV A,B352 0219 0F RRC353 021A 0F RRC354 021B 0F RRC355 021C DA 0E 02 JC MOT7356 021F EB MOT8 XCHG357 0220 21 00 82 LXI H,GIRM1358 0223 4E MOV C,M359 0224 79 MOT9 MOV A,C360 0225 FE 00 CPI 00H361 0227 CA 32 02 JZ MOT10362 022A EB XCHG363 022B CD 65 02 CALL SDAT1364 022E 0D DCR C365 022F C3 24 02 JMP MOT9366 0232 3E 00 MOT10 MVI A,00H367 0234 32 01 C4 STA PA81368 0237 32 02 C4 STA PB81369 023A F1 POP PSW370 023B E1 POP H371 023C C1 POP B372 023D D1 POP D373 023E C9 RET374 023F 7E SDAT3 MOV A,M375 0240 FE 00 CPI 00H376 0242 CC 79 02 CZ APDAT377 0245 7E MOV A,M378 0246 32 02 C4 STA PB81379 0249 32 01 C4 STA PA81380 024C CD 7D 02 CALL TEMP1381 024F 23 INX H382 0250 C9 RET383 0251 7E SDAT2 MOV A,M384 0252 FE 00 CPI 00H385 0254 CC 79 02 CZ APDAT386 0257 7E MOV A,M387 0258 32 02 C4 STA PB81388 025B E6 F0 ANI F0H389 025D 32 01 C4 STA PA81390 0260 CD 7D 02 CALL TEMP1391 0263 23 INX H392 0264 C9 RET393 0265 7E SDAT1 MOV A,M394 0266 FE 00 CPI 00H395 0268 CC 79 02 CZ APDAT396 026B 7E MOV A,M397 026C 32 02 C4 STA PB81398 026F E6 00 ANI 00H399 0271 32 01 C4 STA PA81400 0274 CD 7D 02 CALL TEMP1401 0277 23 INX H402 0278 C9 RET403 0279 21 8B 02 APDAT LXI H,TGIRO404 027C C9 RET405 027D F5 TEMP1 PUSH PSW406 027E D5 PUSH D

Page 202: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 202 ___________________________________________

407 027F 11 50 01 LXI D,0150H408 0282 1B TEM1 DCX D409 0283 7A MOV A,D410 0284 B3 ORA E411 0285 C2 82 02 JNZ TEM1412 0288 D1 POP D413 0289 F1 POP PSW414 028A C9 RET415 028B 99 TGIRO DB 99H416 028C 55 DB 55H417 028D 66 DB 66H418 028E AA DB AAH419 028F 00 DB 00H420421 ;-----------------------------------------422 ;DEFINICION CADENAS CARCTERES423 ;-----------------------------------------424 0290 20 20 20 20 CADE1 DB ' INICIO .'

0294 20 20 20 490298 4E 49 43 49029C 4F 20 20 2002A0 20 20 20 2002A4 2E

425 02A5 50 55 4C 53 CADE2 DB 'PULSADOR P0 30-30-30.'02A9 41 44 4F 5202AD 20 50 30 2002B1 33 30 2D 3302B5 30 2D 33 3002B9 2E

426 02BA 50 55 4C 53 CADE3 DB 'PULSADOR P1 60-60-60.'02BE 41 44 4F 5202C2 20 50 31 2002C6 36 30 2D 3602CA 30 2D 36 3002CE 2E

427 02CF 50 55 4C 53 CADE4 DB 'PULSADOR P2 90-90-90.'02D3 41 44 4F 5202D7 20 50 32 2002DB 39 30 2D 3902DF 30 2D 39 3002E3 2E

428 02E4 50 55 4C 53 CADE5 DB 'PULSA P3 120-120-120.'02E8 41 20 50 3302EC 20 31 32 3002F0 2D 31 32 3002F4 2D 31 32 3002F8 2E

429 02F9 50 55 4C 53 CADE6 DB 'PULSADOR P4 30-60-90.'02FD 41 44 4F 520301 20 50 34 200305 33 30 2D 360309 30 2D 39 30030D 2E

430 030E 50 55 4C 53 CADE7 DB 'PULSADO P5 90-30-120.'0312 41 44 4F 200316 50 35 20 39031A 30 2D 33 30031E 2D 31 32 300322 2E

431 0323 50 55 4C 53 CADE8 DB 'PULSADOR P6 180-0-90.'0327 41 44 4F 52032B 20 50 36 20032F 31 38 30 2D0333 30 2D 39 300337 2E

432 0338 50 55 4C 53 CADE9 DB 'PULSADOR P7 INICIAL.'033C 41 44 4F 520340 20 50 37 20

Page 203: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 203 ___________________________________________

0344 20 49 4E 490348 43 49 41 4C034C 2E

433434435436 034D END

************ S Y M B O L I C R E F E R E N C E T A B L E *************

APDAT 0279 CAD1 01B0 CADE1 0290 CADE2 02A5CADE3 02BA CADE4 02CF CADE5 02E4 CADE6 02F9CADE7 030E CADE8 0323 CADE9 0338 CADENA 01A9ESCDR 0165 ESCIR 0144 FIN 0135 FINCAD 01C2GIRM1 = 8200 GIRM2 = 8201 GIRM3 = 8203 LIB1 0192LIBRE 0186 MOT1 01CC MOT10 0232 MOT2 01D9MOT3 01DE MOT4 01EC MOT5 01FB MOT6 0200MOT7 020E MOT8 021F MOT9 0224 MOTOR 01C5MOTORES 0000 PA81 = C401 PA82 = B000 PB81 = C402PB82 = B001 PC81 = C403 PC82 = B002 PPILA = C0FFPULSAD0 0082 PULSAD1 0098 PULSAD2 00AE PULSAD3 00C4PULSAD4 00DA PULSAD5 00F1 PULSAD6 0108 PULSAD7 011FREES81 = C400 REES82 = B003 SALT1 0050 SALT2 0052SDAT1 0265 SDAT2 0251 SDAT3 023F TE1 0139TEM1 0282 TEMP1 027D TEMPOR 0138 TGIRO 028B

LINES ASSEMBLED : 436 ASSEMBLY ERRORS : 0

Page 204: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1

2

3

4

5

9.9 EJERCICIOS.

______________________________________ 204 ___________________________________________

. Desarrollar un esquema con el circuito integrado SAA 1042 y un motor bipolar que desarrolle un giro a izquierdas y cuyo ángulo de paso sea de 3'75º.

. Especificar las modificaciones necesarias en el programa desarrollado en este tema para que los motores giren a una velocidad más baja y el giro sea levógiro.

. Qué cambios hay que realizar en nuestro programa para que en pantalla aparezca al inicio la frase: "INICIO DE PROGRAMA".

. Realizar los cambios precisos en hardware para controlar los motores, eliminando los ULN 2803, sin que resulte imprescindible modificar el software.

. Realizar los cambios de software necesarios para que al accionar P3 se ejecute el siguiente proceso: a. Girar los tres motores hasta M1=90º, M2=60º, M3=30º b. En pantalla tiene que aparecer "EJERCICIO Nº5".

Page 205: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 205 ___________________________________________

PRÁCTICA DE CONTROL CON

MICROPROCESADOR (II).

10

Page 206: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

láep

fu

fus8pd

10. PRÁCTICAS DE CONTROL CON MICROPROCESADOR (II).

______________________________________ 206 ___________________________________________

En este tema se desarrollarán el hardware y el software necesarios par llevar a cabo el control de 480 mparas, por lo que tendremos que diseñar un equipo con al menos 480 salidas disponibles. Además se

stablecerán diversas secuencias de encendido que serán manejadas mediante el accionamiento de varios ulsadores dispuestos al efecto.

En la FIG.10A puede verse el diagrama de bloques del total del sistema que pretendemos poner en

ncionamiento. Como vemos, la fuente de alimentación debe proporcionar todas las tensiones necesarias para el correcto

ncionamiento de los dispositivos empleados. Nuestro sistema básico, basado en el microprocesador 8085, erá el encargado de llevar el control deseado del proceso y para ello, empleará el periférico programable PPI 255, para transmitir los datos hacia las drivers de lámparas, que son los elementos finales de control de otencia. Para recibir las señales procedentes de los ocho pulsadores que emplearemos para ejecutar las iferentes secuencias de encendido y apagado, se usará un puerto de dicho periférico.

En los puntos o apartados que vienen a continuación se presentará: • Un estudio de los componentes que configuran las drivers. • Forma de conectar todos los elementos entre sí. • Se analizará el hardware de control final de las lámparas. • Se analizará la interconexión al sistema básico del microprocesador. • Se desarrollará el software de control que nos permitirá utilizar el sistema para gobernar las lámparas

deseadas.

SISTEMA BASICO DEL 8085

FUENTE DE ALIMENTACION

PPI 8255

DRIVERS DE CARGAS

CARGAS

480

PULSADORES

FIG.10A

Page 207: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 207 ___________________________________________

Necesitamos en primer lugar conocer de forma clara y precisa lo que deseamos hacer, cómo lo vamos a realizar y los medios de los que disponemos para llevarlo a cabo.

Como sabemos, en este caso, deseamos controlar 480 lámparas (por tanto necesitamos disponer de 480

salidas) para realizar diversas secuencias de encendido y apagado, en función del pulsador que accionemos de entre 8 dispuestos al efecto (por tanto necesitaremos disponer de 8 entradas).

El sistema de pulsadores, puede ser conectado con facilidad a un puerto del PPI 8255 por ejemplo, de

modo que efectuando la lectura del mismo, sepamos si hay algún pulsador accionado. Para preparar el control de las 480 salidas, necesitaríamos disponer de 60 puertos de entrada/salida de 8

bits cada uno y por tanto de 20 circuitos integrados PPI 8255. Esto nos lleva a concluir que se trata de un número excesivo de componentes periféricos para ser manejados por nuestro sistema básico. Basándose en esto, pensaremos en construir una tarjeta driver que nos permita transmitir la información en serie desde unas unidades a otras, para después sacar esa información en paralelo hacia el exterior. Este sistema así planteado, puede ser controlado por un puerto del PPI 8255, como se muestra en la FIG.101A.

Como vemos, los datos proporcionados por el PPI 8255 son introducidos en el primer bloque de transmisión de datos en serie BS1, de éste pasan al segundo bloque BS2, de éste al tercero BS3 y así sucesivamente hasta el bloque de transmisión en serie número 60. Cada uno de estos bloques va conectado a un bloque de potencia que nos proporcionan 8 líneas de salida cada uno, consiguiendo así 480 líneas de control para las salidas. Como es lógico, todos estos componentes son alimentados por una fuente de tensión de +5V, salvo las lámparas a controlar que se alimentarán directamente de la tensión de red 220V de c.a. El periférico programable PPI 8255 ira conectado a nuestro sistema básico a través del bus de datos y del bus de control como en ocasiones anteriores.

8255

BUS DATOS

BUS CONTROL

PO1 PO2 PO3 PO60

BS1 BS2 BS3 BS60

PULSADORES

SALIDAS (480)

FIG.101A

10.1 INTRODUCCIÓN.

Page 208: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

ntr

trs

••••••

••

••••

.

10.2 DRIVER DE TRANSMISIÓN DE DATOS EN SERIE

______________________________________ 208 ___________________________________________

Como podemos adivinar, la nueva tarjeta de transmisión de datos en serie, estará constituida por un uevo elemento que deberemos introducir en nuestro sistema. Debemos elegir un componente que reciba y ansmita los datos en serie y permita sacarlos al exterior en paralelo.

De entre los diversos componentes que hay en el mercado, elegimos el circuito integrado 74LS299. Se

ata de un registro de desplazamiento de 8 bits que se presenta en un encapsulado dual in line de 20 patillas, egún se muestra en la FIG.102A.

A continuación se realiza una descripción pormenorizada de cada una de sus terminales:

Patilla 1. Efectúa el control de desplazamiento a derecha (para lo cual debe estar a nivel ALTO) o desplazamiento a izquierda (para lo cual debe estar a nivel BAJO).

Patilla 2. Se utiliza para el control de las salidas. Debe estar a nivel BAJO (al igual que la patilla 3) de no ser así, no tendríamos señales en las salidas, aunque el registro seguiría desplazando los datos internamente.

Patilla 3. Idem a la patilla 2. Patilla 4. Es una patilla de E/S. Patilla 5. Es una patilla de E/S. Patilla 6. Es una patilla de E/S. Patilla 7. Es una patilla de E/S. Patilla 8. En esta patilla aparece la misma señal que en la patilla 7. Puede utilizarse para conexionar en

cascada otra etapa desplazadora. Patilla 9. Es la patilla de borrado (CLR). Cuando esta en estado lógico ALTO permite el desplazamiento de

datos. Cuando esta en estado BAJO se pone a cero el registro borrándose todos los datos contenidos en él. Patilla 10. Masa o común de alimentación. Patilla 11. Es la patilla de entrada de datos cuando queremos efectuar un desplazamiento hacia la derecha

(desde A hasta H). Patilla 12. Entrada de reloj (CLK). El dato avanza en el registro una posición con cada flanco ascendente

de la señal de reloj. Patilla 13. Es una patilla de E/S. Patilla 14. Es una patilla de E/S. Patilla 15. Es una patilla de E/S. Patilla 16. Es una patilla de E/S.

S0 1 20 VccQ1 2 19 S1 Q2 3 18 SL G 4 17 H1

E 5 16 H C 6 15 FA 7 14 D A1 8 13 B

CLR 9 12 CLK GND 10 11 SR

74LS299

FIG.102A

Page 209: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 209 ___________________________________________

• Patilla 17. En esta patilla aparece la misma señal que en la patilla 16. Puede utilizarse para conexionar en cascada otra etapa desplazadora.

• Patilla 18. Es la patilla de entrada de datos cuando queremos efectuar un desplazamiento hacia la izquierda (desde H hasta A).

• Patilla 19. Controla el desplazamiento a la izquierda (para lo cual debe estar a nivel ALTO) o hacia la derecha (para lo cual debe estar a nivel BAJO).

• Patilla 20. Tensión de alimentación de +5V.

En nuestro caso, realizaremos un desplazamiento a la derecha en serie, con salida en paralelo, controlada mediante la señal correspondiente. Según este planteamiento, obtendremos el esquema de la FIG.102B. En la que podemos apreciar como el Dato a transferir se inyecta por la línea SR (para desplazamiento hacia la derecha). La velocidad de transmisión dependerá de la frecuencia de la señal de Reloj, situada en la entrada CLK.

Cuando deseemos sacar hacia el exterior, los Datos que ya tenemos en el interior del registro,

tendremos que suministrar un pulso (transición de ALTO a BAJO o bien flanco descendente) para activar las salidas, se realiza esta acción en la línea Q1. Si deseamos borrar el contenido de todos los registros, se inyecta un pulso a nivel BAJO en la línea de borrado CLR.

Como nosotros necesitamos conectar en serie varios circuitos integrados 74LS299, aprovechamos el

terminal H1, en el que está presente la misma señal que en la salida H, para conectarlo a la entrada de datos del siguiente registro de desplazamiento. Además sabemos que las señales de reloj, activación de salidas y borrado (CLK, Q1 y CLR) tendrán que ser inyectadas en todos los 74LS299 que utilicemos. Esto quiere decir que tendremos que prever en esas líneas, el suministro de corriente preciso para poder atender toda la demanda en cada línea. Para ello instalaremos en las líneas de control los respectivos buffers o amplificadores de corriente. Emplearemos para este propósito el circuito integrado de fabricación CMOS, 4009, compuesto por seis puertas inversoras/buffers. En la FIG.102C puede apreciarse su distribución de patillas, entendiendo que los terminales marcados con E son entradas y los marcados con S son salidas. Así la puerta 1 tendrá como entrada E1 y como salida S1. Los terminales Vdd y Vcc deben unirse a +5V.

74LS299

A1 A B C D E F G H

H1 SR CLK Q1

CLR

+5V FIG.102B

Q2 S1 SL GND S0 Vcc

Vcc 1 16 Vdd S1 2 15 S6 E1 3 14 E6S2 4 13 E2 5 12 S5S3 6 11 E5E3 7 10 S4

GND 8 9 E4

4009

FIG.102C

Page 210: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 210 ___________________________________________

Además emplearemos como etapa final de control del sistema de potencia el ya conocido ULN 2803, que como sabemos dispone de 8 inversores independientes que pueden ser fácilmente conectables a las salidas de los 74LS299. Teniendo en cuenta todo lo anterior, podemos afrontar el diseño de la tarjeta driver para controlar un elevado número de cargas, obteniendo el esquema de la FIG.102D. En ella podemos apreciar fundamentalmente que la entrada de datos se realiza a través de la entrada SR del primer 74LS299, desplazándose dicha señal a través de este integrado al ritmo impuesto por la señal de reloj. De la salida H1 del primer elemento, se lleva la señal a la entrada SR del registro de desplazamiento siguiente. Se procede de este modo con seis unidades desplazadoras, completando de este modo 48 salidas controlables. A las salidas de los registros de desplazamiento se conectan los ULN 2803 que serán los elementos encargados de excitar el sistema de potencia para las cargas individuales. Las señales de reloj (CLK), de activación de salidas (Q1) y de borrado (CLR) deben ser llevadas a los seis 74LS299, por lo que emplearemos unas puertas amplificadoras (en este caso inversores) para efectuar este control. También podemos darnos cuenta de que serán necesarias 10 tarjetas idénticas a la hasta ahora descrita para llegar a controlar las 480 cargas. Para poder transmitir los datos de una driver a otra, se disponen las líneas de control (CLK, Q1 y CLR) en los dos terminales de entrada y salida de modo que sea sencillo conectar la salida de una a la entrada de la siguiente. Del mismo modo y dado el elevado número de componentes empleados en la construcción de estas 10 tarjetas drivers, tendremos que disponer una pequeña fuente de alimentación en cada tarjeta, constituida por un regulador 7805 y dos condensadores electrolíticos conectados como filtros en la entrada y salida de dicho regulador (No ha sido representada en el esquema). La entrada de alimentación a cada una de las tarjetas será tomada de la alimentación general una vez rectificada y filtrada.

Como es lógico, todos los registros de desplazamiento 74LS299 y las puertas inversoras llevarán conectado lo más cerca posible de sus terminales de alimentación un condensador de 100 nF que sirva como camino de desacoplo a masa de señales parásitas.

1 2 3 4 5 6 7 8

18 17 16 15 14 13 12 11

1 2 3 4 5 6 7 8 ULN 2803

7 13 6 14 5 15 4 16

ENT. DATOS

74LS299 9 2 12

1711

9 10 11 12 13 14 15 16

18 17 16 15 14 13 12 11

1 2 3 4 5 6 7 8 ULN 2803

7 13 6 14 5 15 4 16

74LS299 9 2 12

17 11

41 42 43 44 45 46 47 48

18 17 16 15 14 13 12 11

1 2 3 4 5 6 7 8 ULN 2803

7 13 6 14 5 15 4 16

74LS299 9 2 12

17 11

SALIDAS HACIA LAS CIRCUITOS DE POTENCIA DE LAS CARGAS

6

SALIDA DATOS

RELOJ ACTIVAR SALIDAS

BORRADO

ENTRADAS CONTROL

RELOJ

BORRADO

SALIDAS CONTROL

FIG.102D

Page 211: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

d1

sdp

cpPdyas

fimimDsm

.

10.3 ACOPLAMIENTO DE VARIAS DRIVERS EN SERIE

Como hemos visto anteriormente, la tarjeta driver que se ha diseñado, esta compuesta por seis etapas esplazadoras (74LS299) que nos proporcionan 48 salidas de control, por tanto necesitaremos conectar entre sí 0 etapas idénticas para obtener un total de 480 salidas controladas.

La conexión de las tarjetas es sumamente sencilla, no tenemos más que conectar las líneas de control de

alida de la primera tarjeta a las líneas de control de entrada de la segunda tarjeta de igual denominación. Las e la segunda con las de la tercera y así sucesivamente hasta tener conectadas las diez tarjetas. En la FIG.103A odemos apreciar esta interconexión.

48 SALIDAS

ETAPA 1

DATO RELOJ BORRADO ACTIVAR SALIDAS

48 SALIDAS

ETAPA 2

DATO RELOJ BORRADO ACTIVAR SALIDAS

48 SALIDAS

ETAPA 10

DATO RELOJ BORRADO ACTIVAR SALIDAS

FIG.103A

.

10.4 INTERCONEXIÓN CON EL SISTEMA BÁSICO

______________________________________ 211 ___________________________________________

Para proceder a conectar nuestro sistema de tarjetas driver con el sistema microprocesador emplearemos omo elemento de comunicación el ya conocido PPI 8255. Como sabemos, necesitamos un puerto completo ara detectar las señales procedentes de los pulsadores de funciones. Dispondremos a tal efecto el puerto B del PI 8255 cuyas 8 líneas irán conectadas cada una de ellas a una red RC que nos servirá para eliminar gran parte e los rebotes producidos en los contactos de cada pulsador. Este puerto B debe ser programado como entrada siempre que en una línea determinada encontremos un nivel lógico 0, estaremos en presencia de un pulsador ccionado (el correspondiente a dicha línea). Mientras no se accione ningún pulsador solo encontraremos eñales lógicas de nivel 1.

Además necesitamos cuatro líneas a través de las cuales enviemos los datos a sacar hacia las cargas

nales y las señales de control que nos permitan efectuar dicho envío en las condiciones apropiadas. Hasta el omento hemos denominado estas líneas como DATOS, RELOJ, BORRADO y ACTIVAR SALIDAS. Se plementarán estas señales en el puerto A del PPI 8255, concretamente en las líneas PA0, PA1, PA2 y PA3.

ado que las líneas de control tienen que ser conectadas a las diez tarjetas drivers diseñadas, se sitúan en dichas alidas unos buffers inversores CMOS 4009 que nos proporcionen la ganancia de corriente suficiente para anejar todos los componentes de dichas tarjetas.

Page 212: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 212 ___________________________________________

Todo lo dicho puede apreciarse en la FIG.104A. Finalmente decir que siendo las cargas a controlar lámparas de 100 w, 220 V de c.a., necesitaremos emplear para su control, los dispositivos semiconductores apropiados para esa exigencia de potencia y tensión y además poder realizar una separación efectiva entre los niveles de tensión de +5V en la circuitería lógica y los 220 V en la parte de potencia en c.a. Para este propósito empleamos el circuito mostrado en la FIG.104B y que ya ha sido descrito en el tema 8 de forma exhaustiva.

FIG.104A

RED P0

RED P1

RED P2

RED P3

RED P4

RED P5

RED P6

RED P7

4 PA0

3 PA1

2 PA2

1 PA3

8255

PB0 18

PB1 19

PB2 20

PB3 21

PB4 22

PB5 23

PB6 24

PB7 25

10K

47 100 nF

RED 1 2

2 1

+5V

DATO

RELOJ

BORRAR

ACTIVAR SALIDAS

220V +5V MOC3041

FIG.104B

R1 220

R2 56

R3 1K2

LAMPARA

R4 100

C1 0’1uF 250V

TXAL228

CONTROL

Page 213: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

Señalar además que al tratarse de 480 lámparas de 100 W, estaremos realizando un control global de potencia próximo a 50 KW, por lo que es preciso equipar al conjunto con los sistemas de protección eléctrica adecuados, siendo conveniente preparar diez líneas de alimentación independientes en alterna (una por cada driver de control) con sus correspondientes protecciones térmicas. Es fundamental también establecer una toma de tierra efectiva que nos proteja de posibles contactos indirectos que pudieran producir pérdidas irreparables. Los cables tanto de alimentación como de protección a tierra serán de de las secciones adecuadas a las potencias transmitidas al objeto de evitar calentamientos en los conductores y elevadas caídas de tensión.

pcdp

pptr

cpinsPnpelodp

.

10.5 SOFTWARE DE CONTROL

______________________________________ 213 ___________________________________________

Definido el hardware completo del sistema procederemos a diseñar el software de control de nos ermitirá realizar el encendido de las 480 lámparas de carga. Para ello tendremos en primer lugar, que llevar a abo un estudio detallado sobre cuál será el proceso de transmisión de información a través de las tarjetas rivers y la forma de sacar dicha información hacia las cargas finales y en función de este estudio desarrollar el rograma oportuno.

Como sabemos, nuestro sistema de hardware está compuesto por varias tarjetas drivers que nos

ermitirán controlar las cargas externas a través de los circuitos de potencia. Además dispondremos de ocho ulsadores, cada uno de los cuales tendrá asignada una función específica que nos indicará el modo de atamiento de las cargas. Con estas ideas básicas podremos establecer el siguiente pseudocódigo inicial:

NOMBRE: Lámparas FUNCION: Iluminación PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Iniciar el sistema MIENTRAS pulsador no sea accionado Explorar pulsadores FIN DE MIENTRAS Identificar pulsador accionado Ejecutar función correspondiente a pulsador accionado Volver a bucle "Explorar pulsadores" Fin del programa Como podemos apreciar, se inicia el programa, como en ocasiones anteriores, estableciendo las

ondiciones y parámetros iniciales que necesitemos para arrancar el sistema. Entendemos como tales, la rogramación adecuada del PPI 8255, el establecimiento del puntero de pila, un tratamiento adecuado de las terrupciones, y además estableceremos en este caso un área de RAM en el que almacenaremos los datos que

e han de sacar hacia el exterior para controlar las cargas, es decir estableceremos una tabla de datos en RAM. uesto que se trata de controlar 480 elementos y nuestro bus de datos trabaja con palabras de 8 bits, ecesitaremos 60 posiciones de RAM (60 bytes) para almacenar dicha información, se establecerá por tanto un untero hacia esa tabla de datos en RAM. También tendremos en cuenta que al arrancar nuestro sistema, si no fectuamos el control preciso, podría iniciarse arrancando un número indeterminado y aleatorio de cargas, por que es necesario un procedimiento que asegure la inactividad de todas las cargas en el arranque. En función

e estas ideas globales podemos generar un pseudocódigo más refinado para el proceso iniciar sistema que uede ser del modo siguiente:

Prohibir interrupciones Punterizar la pila Programar el PPI 8255 (PA=salida, PB=entrada) Establecer puntero de tabla de datos Bloquear todas las cargas

Page 214: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 214 ___________________________________________

El proceso "Explorar pulsadores" es muy sencillo y consiste únicamente en leer a través del puerto B del

PPI 8255 el estado lógico de los ocho pulsadores conectados. Si la palabra obtenida es 00H, ningún pulsador habrá sido accionado y si es distinta de 00H, habremos encontrado un pulsador activado y por tanto estaremos en presencia de una orden que ejecutar. Al finalizar este proceso, la información obtenida del puerto B, debe quedar disponible en algún registro del microprocesador, para ser posteriormente convenientemente interpretada y ejecutada la función o funciones oportunas. Tendríamos el pseudocódigo siguiente:

NOMBRE: Explorar FUNCION: Explorar pulsadores PRECONDICIONES: Ninguna POSTCONDICIONES: Información en Acc Cargar Acc con 00H MIENTRAS Acc = 00H Leer puerto B del 8255 FIN DE MIENTRAS Fin de subrutina El proceso "Identificar pulsadores", debe ser inmediatamente posterior al de exploración. Sus funciones

básicas consisten en identificar el pulsador accionado y ordenar ejecutar el proceso correspondiente a dicho pulsador. Para ello no tendremos más que ir explorando uno a uno los bits de la información contenida en el acumulador (Acc). El pseudocódigo referido a este proceso podría ser el siguiente:

Analizar bit 0 de Acc SI bit0 = 1 ejecutar pulsador 0 Analizar bit 1 de Acc SI bit1 = 1 ejecutar pulsador 1 Analizar bit 2 de Acc SI bit2 = 1 ejecutar pulsador 2 Analizar bit 3 de Acc SI bit3 = 1 ejecutar pulsador 3 Analizar bit 4 de Acc SI bit4 = 1 ejecutar pulsador 4 Analizar bit 5 de Acc SI bit5 = 1 ejecutar pulsador 5 Analizar bit 6 de Acc SI bit6 = 1 ejecutar pulsador 6 Analizar bit 7 de Acc SI bit7 = 1 ejecutar pulsador 7

Como vemos, una vez encontrado el bit con nivel lógico 1, automáticamente obligamos al programa a ejecutar la función correspondiente al pulsador accionado. Esto se indica en las expresiones pulsador 0, pulsador 1, ..., pulsador 7. Tendremos ahora que analizar en detalle cada una de las funciones que deseamos llevar a cabo. Función pulsador 0: Al detectar accionado el pulsador P0, el sistema llevará a cabo un encendido y apagado de todas las lámparas al mismo tiempo en forma intermitente.

NOMBRE: Pulsador0 FUNCION: Todo-nada PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=FFH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar

Page 215: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 215 ___________________________________________

Tomar dato=00H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

Función pulsador 1: Tras accionar P1 se iluminarán las lámparas impares permaneciendo apagadas las

pares y al cabo de unos instantes se iluminarán las pares y se apagaran las impares.

NOMBRE: Pulsador1 FUNCION: Par-impar PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=AAH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=55H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

Función pulsador 2: La orden a transmitir mediante P2 consistirá en iluminar 4 lámparas mientras permanecen apagadas las 4 siguientes y continuar de este modo hasta las 480. Unos instantes más tarde se apagarán las iluminadas para iluminarse las apagadas.

NOMBRE: Pulsador2 FUNCION: on 4 - off 4 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=0FH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=F0H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

Función pulsador 3: Esta función consistirá en iluminar 6 lámparas consecutivas mientras aparecen apagadas las 2 lámparas siguientes, procediendo de este modo hasta el total de lámparas. A continuación se alterna el encendido y apagado de las mismas.

Page 216: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 216 ___________________________________________

NOMBRE: Pulsador3 FUNCION: on 6 - off 2 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=FCH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=03H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

Función pulsador 4: Este pulsador iluminará las lámparas 60, 61, 62 y 63. El resto permanecerán apagadas.

NOMBRE: Pulsador4 FUNCION: on 60, 61, 62 y 63 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=00H Almacenar dato en tabla RAM Apuntar puntero tabla + 7 Almacenar 78H Sacar al exterior datos de tabla RAM Fin de Función

Función pulsador 5: Con este pulsador se iluminarán las lámparas 1, 240 y 480. El resto de lámparas permanecerán apagadas.

NOMBRE: Pulsador5 FUNCION: on 1, 240 y 480 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=00H Almacenar dato en tabla RAM Apuntar puntero tabla Almacenar 01H Apuntar puntero tabla + 29 Almacenar 80H Apuntar puntero de tabla + 59 Almacenar 80H Sacar al exterior datos de tabla RAM Fin de Función

Función pulsador 6: Al accionar este pulsador se encenderán de modo alternado las lámparas de dos en dos, es decir, dos iluminadas, dos apagadas.

NOMBRE: Pulsador6

Page 217: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 217 ___________________________________________

FUNCION: on 2 - off 2 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=CCH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Fin de Función

Función pulsador 7: Al accionar este último pulsador apagaremos todas las lámparas.

NOMBRE: Pulsador7 FUNCION: off todas PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=00H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Fin de Función Como hemos podido apreciar, en todas las funciones de los pulsadores se recurre a secuencias como "Almacenar datos en tabla RAM", "Temporizar" y "Sacar al exterior datos de tabla RAM". Tenemos ahora la necesidad de estudiarlas detenidamente para confeccionar la subrutina equivalente a cada una de ellas. En primer lugar debemos tener claro que "Almacenar datos en tabla RAM" será una subrutina que nos permita preparar los datos que deseamos sacar al exterior y almacenarlos en una zona de memoria RAM, dejándolos dispuestos para ser finalmente extraídos. Esta subrutina puede ser del modo siguiente: NOMBRE: Almacenar FUNCION: Prepara datos en RAM PRECONDICIONES: Recibe dato a almacenar en Acc POSTCONDICIONES: Ninguna Iniciar contador2=60 Apuntar al principio de tabla MIENTRAS contador2>0 Almacenar dato en RAM Incrementar puntero de tabla Decrementar contador2 FIN de MIENTRAS FIN de subrutina En lo que respecta al procedimiento "Sacar al exterior datos de tabla de RAM", tendremos que desarrollar una subrutina que tome los datos almacenados en la tabla preparada previamente en RAM y de forma ordenada los vaya transmitiendo al exterior a través de las tarjetas drivers. Esta subrutina puede ser del modo siguiente:

NOMBRE: Sacar FUNCION: Saca datos de RAM al exterior PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Apuntar a tabla de datos en RAM Iniciar contador3=60 MIENTRAS contador3>0 Leer dato de tabla de datos en RAM

Page 218: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 218 ___________________________________________

Iniciar contador4=8 MIENTRAS contador4>0 Tomar bit0 Formar la palabra P1=0000 000X Sacar la palabra P1 Formar la palabra P2=000 001X Sacar la palabra P2 Formar la palabra P1=0000 000X Sacar la palabra P1 Rotar dato a derechas un bit Decrementar contador 4 FIN DE MIENTRAS Decrementar contador3 FIN DE MIENTRAS Dar pulso de sacar datos al exterior FIN de subrutina La subrutina de temporización no es más que una parte del programa que proporciona un determinado tiempo de espera. Para desarrollar esta tarea se acudirá a la subrutina de temporización empleada en temas anteriores, por lo que no entraremos en más detalles sobre la misma.

Con todo lo estudiado hasta ahora podemos confeccionar el programa en su forma de pseudocódigos, de modo que tengamos todo el conjunto un poco más agrupado, quedando del modo siguiente:

NOMBRE: Lámparas FUNCION: Iluminación PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Prohibir interrupciones Punterizar la pila Programar el PPI 8255 (PA=salida, PB=entrada) Establecer puntero de tabla de datos Bloquear todas las cargas Cargar Acc con FFH MIENTRAS pulsador no sea accionado

Explorar pulsadores FIN DE MIENTRAS Analizar bit 0 de Acc SI bit0 = 1 ejecutar pulsador 0 Analizar bit 1 de Acc SI bit1 = 1 ejecutar pulsador 1 Analizar bit 2 de Acc SI bit2 = 1 ejecutar pulsador 2 Analizar bit 3 de Acc SI bit3 = 1 ejecutar pulsador 3 Analizar bit 4 de Acc SI bit4 = 1 ejecutar pulsador 4 Analizar bit 5 de Acc SI bit5 = 1 ejecutar pulsador 5 Analizar bit 6 de Acc SI bit6 = 1 ejecutar pulsador 6 Analizar bit 7 de Acc SI bit7 = 1 ejecutar pulsador 7 Volver a bucle "Explorar pulsadores"

Page 219: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 219 ___________________________________________

NOMBRE: Pulsador0 FUNCION: Todo-nada PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=FFH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=00H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

NOMBRE: Pulsador1 FUNCION: Par-impar PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=AAH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=55H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

NOMBRE: Pulsador2 FUNCION: on 4 - off 4 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0 Tomar dato=0FH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=F0H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

NOMBRE: Pulsador3 FUNCION: on 6 - off 2 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar contador1=10 MIENTRAS contador1>0

Page 220: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 220 ___________________________________________

Tomar dato=FCH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Tomar dato=03H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Función

NOMBRE: Pulsador4 FUNCION: on 60, 61, 62 y 63 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=00H Almacenar dato en tabla RAM Apuntar puntero tabla + 7 Almacenar 78H Sacar al exterior datos de tabla RAM Fin de Función

NOMBRE: Pulsador5 FUNCION: on 1, 240 y 480 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=00H Almacenar dato en tabla RAM Apuntar puntero tabla Almacenar 01H Apuntar puntero tabla + 29 Almacenar 80H Apuntar puntero de tabla + 59 Almacenar 80H Sacar al exterior datos de tabla RAM Fin de Función

NOMBRE: Pulsador6 FUNCION: on 2 - off 2 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=CCH Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Fin de Función

NOMBRE: Pulsador7 FUNCION: off todas PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Tomar dato=00H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Fin de Función NOMBRE: Almacenar FUNCION: Prepara datos en RAM PRECONDICIONES: Recibe dato a almacenar en Acc POSTCONDICIONES: Ninguna

Page 221: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 221 ___________________________________________

Iniciar contador2=60 Apuntar al principio de tabla MIENTRAS contador2>0 Almacenar dato en RAM Incrementar puntero de tabla Decrementar contador2 FIN de MIENTRAS FIN de subrutina

NOMBRE: Sacar FUNCION: Saca datos de RAM al exterior PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Apuntar a tabla de datos en RAM Iniciar contador3=60 MIENTRAS contador3>0 Leer dato de tabla de datos en RAM Iniciar contador4=8 MIENTRAS contador4>0 Tomar bit0 Formar la palabra P1=0000 000X Sacar la palabra P1 Formar la palabra P2=000 001X Sacar la palabra P2 Formar la palabra P1=0000 000X Sacar la palabra P1 Rotar dato a derechas un bit Decrementar contador 4 FIN DE MIENTRAS Decrementar contador3 FIN DE MIENTRAS Dar pulso de sacar datos al exterior FIN de subrutina

NOMBRE: Explorar FUNCION: Explorar pulsadores PRECONDICIONES: Ninguna POSTCONDICIONES: Información en Acc Cargar Acc con 00H MIENTRAS Acc = 00H Leer puerto B del 8255 FIN DE MIENTRAS Fin de subrutina

NOMBRE: Tempor FUNCION: Tiempo de espera PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Iniciar contador5=17FFH MIENTRAS contador5>0 Esperar Decrementar contador5 FIN de MIENTRAS Fin de subrutina Fin del programa

Page 222: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 222 ___________________________________________

En función de todos los datos expuestos iniciamos el paso de nuestro programa en pseudocódigos a lenguaje ensamblador, que una vez procesado por el CROSS ASSEMBLER, nos proporcionará el programa en hexadecimal (binario) dispuesto para ser grabado en la memoria del sistema y ejecutado directamente.

2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a--------------------------------------------------

INPUT FILENAME : LAMPARA7.ASMOUTPUT FILENAME : LAMPARA7.OBJ

1 ;------------------------------------------2 ;NOMBRE: LAMPARA73 ;FUNCION: Iluminacion4 ;PRECONDICIONES: Ninguna5 ;POSTCONDICIONES : Ninguna6 ;------------------------------------------78 ;------------------------------------------9 ;PARAMETROS PARA EL PPI 8255

10 ;------------------------------------------11 00 B0 PA82 EQU B000H ;Puerto A del 825512 01 B0 PB82 EQU B001H ;Puerto B del 825513 02 B0 PC82 EQU B002H ;Puerto C del 825514 03 B0 REES82 EQU B003H ;Reg Estado 825515 ;------------------------------------------1617 ;------------------------------------------18 ;PARAMETROS PUNTERO DE PILA19 ;------------------------------------------20 FF 87 PPILA EQU 87FFH ;Puntero pila RAM21 ;------------------------------------------2223 ;------------------------------------------24 ;PATAMETROS PUNTERO DE TABLA DATOS RAM25 ;------------------------------------------26 00 80 PTABLA EQU 8000H ;Puntero Tabla dat27 ;------------------------------------------2829 0000 LAMPARA7:30 0000 F3 DI31 0001 21 FF 87 LXI H,PPILA32 0004 F9 SPHL33 0005 3E 82 MVI A,82H34 0007 32 03 B0 STA REES8235 000A 3E 00 MVI A,00H36 000C CD 20 01 CALL ALMACEN37 000F CD 34 01 CALL SACAR38 0012 CD 6F 01 SALT1 CALL EXPLORAR39 0015 47 MOV B,A40 0016 E6 01 ANI 01H41 0018 FE 01 CPI 01H42 001A CA 53 00 JZ PULSADOR043 001D 78 MOV A,B44 001E E6 02 ANI 02H45 0020 FE 02 CPI 02H46 0022 CA 72 00 JZ PULSADOR147 0025 78 MOV A,B48 0026 E6 04 ANI 04H49 0028 FE 04 CPI 04H50 002A CA 91 00 JZ PULSADOR251 002D 78 MOV A,B52 002E E6 08 ANI 08H53 0030 FE 08 CPI 08H

Page 223: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 223 ___________________________________________

54 0032 CA B0 00 JZ PULSADOR355 0035 78 MOV A,B56 0036 E6 10 ANI 10H57 0038 FE 10 CPI 10H58 003A CA CF 00 JZ PULSADOR459 003D 78 MOV A,B60 003E E6 20 ANI 20H61 0040 FE 20 CPI 20H62 0042 CA DF 00 JZ PULSADOR563 0045 78 MOV A,B64 0046 E6 40 ANI 40H65 0048 FE 40 CPI 40H66 004A CA F9 00 JZ PULSADOR667 004D C3 04 01 JMP PULSADOR768 0050 C3 12 00 FIN JMP SALT16970 ;------------------------------------------71 ;NOMBRE: PULSADOR072 ;FUNCION: Todo-nada73 ;PRECONDICIONES: Ninguna74 ;POSTCONDICIONES: Ninguna75 ;------------------------------------------76 0053 PULSADOR0:77 0053 0E 0A MVI C,1078 0055 3E FF SALT2 MVI A,FFH79 0057 CD 20 01 CALL ALMACEN80 005A CD 34 01 CALL SACAR81 005D CD 0F 01 CALL TEMPOR82 0060 3E 00 MVI A,00H83 0062 CD 20 01 CALL ALMACEN84 0065 CD 34 01 CALL SACAR85 0068 CD 0F 01 CALL TEMPOR86 006B 0D DCR C87 006C C2 55 00 JNZ SALT288 006F C3 50 00 JMP FIN8990 ;------------------------------------------91 ;NOMBRE: PULSADOR192 ;FUNCION: Par-impar93 ;PRECONDICIONES: Ninguna94 ;POSTCONDICIONES: Ninguna95 ;------------------------------------------96 0072 PULSADOR1:97 0072 0E 0A MVI C,1098 0074 3E AA SALT3 MVI A,AAH99 0076 CD 20 01 CALL ALMACEN

100 0079 CD 34 01 CALL SACAR101 007C CD 0F 01 CALL TEMPOR102 007F 3E 55 MVI A,55H103 0081 CD 20 01 CALL ALMACEN104 0084 CD 34 01 CALL SACAR105 0087 CD 0F 01 CALL TEMPOR106 008A 0D DCR C107 008B C2 74 00 JNZ SALT3108 008E C3 50 00 JMP FIN109110 ;------------------------------------------111 ;NOMBRE: PULSADOR2112 ;FUNCION: ON4-OFF4113 ;PRECONDICIONES: Ninguna114 ;POSTCONDICIONES: Ninguna115 ;------------------------------------------116 0091 PULSADOR2:117 0091 0E 0A MVI C,10118 0093 3E 0F SALT4 MVI A,0FH119 0095 CD 20 01 CALL ALMACEN120 0098 CD 34 01 CALL SACAR121 009B CD 0F 01 CALL TEMPOR

Page 224: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 224 ___________________________________________

122 009E 3E F0 MVI A,F0H123 00A0 CD 20 01 CALL ALMACEN124 00A3 CD 34 01 CALL SACAR125 00A6 CD 0F 01 CALL TEMPOR126 00A9 0D DCR C127 00AA C2 93 00 JNZ SALT4128 00AD C3 50 00 JMP FIN129130 ;------------------------------------------131 ;NOMBRE: PULSADOR3132 ;FUNCION: ON6-OFF2133 ;PRECONDICIONES: Ninguna134 ;POSTCONDICIONES: Ninguna135 ;------------------------------------------136 00B0 PULSADOR3:137 00B0 0E 0A MVI C,10138 00B2 3E FC SALT5 MVI A,FCH139 00B4 CD 20 01 CALL ALMACEN140 00B7 CD 34 01 CALL SACAR141 00BA CD 0F 01 CALL TEMPOR142 00BD 3E 03 MVI A,03H143 00BF CD 20 01 CALL ALMACEN144 00C2 CD 34 01 CALL SACAR145 00C5 CD 0F 01 CALL TEMPOR146 00C8 0D DCR C147 00C9 C2 B2 00 JNZ SALT5148 00CC C3 50 00 JMP FIN149150 ;------------------------------------------151 ;NOMBRE: PULSADOR4152 ;FUNCION: En ON 60, 61, 62 y 63153 ;PRECONDICIONES: Ninguna154 ;POSTCONDICIONES: Ninguna155 ;------------------------------------------156 00CF PULSADOR4:157 00CF 3E 00 MVI A,00H158 00D1 CD 20 01 CALL ALMACEN159 00D4 21 00 80 LXI H,PTABLA + 7160 00D7 36 78 MVI M,78H161 00D9 CD 34 01 CALL SACAR162 00DC C3 50 00 JMP FIN163164 ;------------------------------------------165 ;NOMBRE: PULSADOR5166 ;FUNCION: En ON 1, 240 y 480167 ;PRECONDICIONES: Ninguna168 ;POSTCONDICIONES: Ninguna169 ;------------------------------------------170 00DF PULSADOR5:171 00DF 3E 00 MVI A,00H172 00E1 CD 20 01 CALL ALMACEN173 00E4 21 00 80 LXI H,PTABLA174 00E7 36 01 MVI M,01H175 00E9 21 00 80 LXI H,PTABLA + 29176 00EC 36 80 MVI M,80H177 00EE 21 00 80 LXI H,PTABLA + 59178 00F1 36 80 MVI M,80H179 00F3 CD 34 01 CALL SACAR180 00F6 C3 50 00 JMP FIN181182 ;------------------------------------------183 ;NOMBRE: PULSADOR6184 ;FUNCION: ON2-OFF2185 ;PRECONDICIONES: Ninguna186 ;POSTCONDICIONES: Ninguna187 ;------------------------------------------188 00F9 PULSADOR6:189 00F9 3E CC MVI A,CCH

Page 225: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 225 ___________________________________________

190 00FB CD 20 01 CALL ALMACEN191 00FE CD 34 01 CALL SACAR192 0101 C3 50 00 JMP FIN193194 ;------------------------------------------195 ;NOMBRE: PULSADOR7196 ;FUNCION: Todas apagadas197 ;PRECONDICIONES: Ninguna198 ;POSTCONDICIONES: Ninguna199 ;------------------------------------------200 0104 PULSADOR7:201 0104 3E 00 MVI A,00H202 0106 CD 20 01 CALL ALMACEN203 0109 CD 34 01 CALL SACAR204 010C C3 50 00 JMP FIN205206 ;------------------------------------------207 ;NOMBRE: TEMPOR208 ;FUNCION: Temporización209 ;PRECONDICIONES: Ninguna210 ;POSTCONDICIONES: Ninguna211 ;------------------------------------------212 010F TEMPOR:213 010F F5 PUSH PSW214 0110 D5 PUSH D215 0111 11 FF 17 LXI D,17FFH216 0114 1B TE1 DCX D217 0115 7A MOV A,D218 0116 B3 ORA E219 0117 00 NOP220 0118 00 NOP221 0119 00 NOP222 011A C2 14 01 JNZ TE1223 011D D1 POP D224 011E F1 POP PSW225 011F C9 RET226227 ;------------------------------------------228 ;NOMBRE: ALMACEN229 ;FUNCION: Almacena datos en RAM230 ;PRECONDICIONES: Recibe dato en Acumulador231 ;POSTCONDICIONES: Ninguna232 ;------------------------------------------233 0120 ALMACEN:234 0120 F5 PUSH PSW235 0121 C5 PUSH B236 0122 E5 PUSH H237 0123 0E 3C MVI C,60238 0125 21 00 80 LXI H,PTABLA239 0128 CD 20 01 SALT6 CALL ALMACEN240 012B 23 INX H241 012C 0D DCR C242 012D C2 28 01 JNZ SALT6243 0130 E1 POP H244 0131 C1 POP B245 0132 F1 POP PSW246 0133 C9 RET247 0134 SACAR:248 0134 E5 PUSH H249 0135 C5 PUSH B250 0136 D5 PUSH D251 0137 F5 PUSH PSW252 0138 21 00 80 LXI H,PTABLA253 013B 0E 3C MVI C,60254 013D 7E SALT7 MOV A,M255 013E 06 08 MVI B,8256 0140 57 SALT8 MOV D,A257 0141 E6 01 ANI 01H

Page 226: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 226 ___________________________________________

258 0143 32 00 B0 STA PA82259 0146 F6 02 ORI 02H260 0148 32 00 B0 STA PA82261 014B E6 01 ANI 01262 014D 32 00 B0 STA PA82263 0150 7A MOV A,D264 0151 1F RAR265 0152 05 DCR B266 0153 C2 40 01 JNZ SALT8267 0156 23 INX H268 0157 0D DCR C269 0158 C2 3D 01 JNZ SALT7270 015B 3E 00 MVI A,00H271 015D 32 00 B0 STA PA82272 0160 F6 08 ORI 08H273 0162 32 00 B0 STA PA82274 0165 E6 00 ANI 00H275 0167 32 00 B0 STA PA82276 016A F1 POP PSW277 016B D1 POP D278 016C C1 POP B279 016D E1 POP H280 016E C9 RET281282283 ;------------------------------------------284 ;NOMBRE: EXPLORAR285 ;FUNCION: Explorar pulsadores286 ;PRECONDICIONES: Ninguna287 ;POSTCONDICIONES: Dato en Acumulador288 ;------------------------------------------289 016F EXPLORAR:290 016F 3E 00 MVI A,00H291 0171 3A 01 B0 SALT9 LDA PB82292 0174 2F CMA293 0175 E6 FF ANI FFH294 0177 CA 71 01 JZ SALT9295 017A C9 RET296297298 017B END

************ C R O S S R E F E R E N C E T A B L E ************

ALMACEN 0120 : 36 79 83 99 103 119 123139 143 158 172 190 202

239EXPLORAR 016F : 38FIN 0050 : 88 108 128 148 162 180 192204LAMPARA7 0000 :PA82 = B000 : 258 260 262 271 273 275PB82 = B001 : 291PC82 = B002 :PPILA = 87FF : 31PTABLA = 8000 : 159 173 175 177 238 252PULSADOR0 0053 : 42PULSADOR1 0072 : 46PULSADOR2 0091 : 50PULSADOR3 00B0 : 54PULSADOR4 00CF : 58PULSADOR5 00DF : 62PULSADOR6 00F9 : 66PULSADOR7 0104 : 67REES82 = B003 : 34SACAR 0134 : 37 80 84 100 104 120 124140 144 161 179 191 203

Page 227: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 227 ___________________________________________

SALT1 0012 : 68SALT2 0055 : 87SALT3 0074 : 107SALT4 0093 : 127SALT5 00B2 : 147SALT6 0128 : 242SALT7 013D : 269SALT8 0140 : 266SALT9 0171 : 294TE1 0114 : 222TEMPOR 010F : 81 85 101 105 121 125 141145

LINES ASSEMBLED : 298 ASSEMBLY ERRORS : 0

Page 228: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_

1 2 3

4 5

10.6 EJERCICIOS.

______________________________________ 228 ___________________________________________

. Explicar el funcionamiento del registro de desplazamiento serie 74LS299.

. Para qué se utilizan las puertas inversoras/amplificadoras en las salidas del PPI.

. Realiza los cambios precisos en la función del pulsador 6 para que se produzca un proceso de intermitencia en las lámparas.

. Desarrolla otro procedimiento diferente para el pulsador 7 de modo que se realice la misma función.

. Modificar el programa en todo lo que resulte necesario para producir un encendido secuencial de todas las lámparas una a una, cuando accionemos el pulsador 3.

Page 229: 8085-A_DOC

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 229 ___________________________________________