Sunteți pe pagina 1din 229

CURSO SOBRE EL MICROPROCESADOR 8085-A FABRICADO POR INTEL

____________________ Curso 8085A ____________________________________________________________

Celestino Bentez Vzquez Ingeniero Tcnico Industrial Ingeniero Industrial

www.netcom.es/celes

_______________________________________ 2 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

PROLOGO

Dado el amplio campo de trabajo y el gran abanico de posibilidades que ofrece hoy en da la electrnica profesional, puede decirse que llevar a cabo un estudio a cerca de una parte concreta o un tema concreto de la electrnica, es siempre tratar una parte muy especfica y relativamente pequea del mismo. Considerando el estado actual de la tecnologa y su imparable desarrollo, puede estimarse que los componentes ms avanzados y que intervienen en el ms amplio espectro de la industria y de la ciencia en general son los microprocesadores. Los diseadores de estos microcircuitos estn sometidos, como en todas las facetas de la industria, a elevados criterios de competitividad que les obligan a incorporar y mejorar las ltimas tcnicas y a actualizar sus conocimientos constantemente. Hoy en da la expansin de los microprocesadores ha alcanzado tal nivel que es difcil 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 ms 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 basndose 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 ms potentes. Se ha proporcionado informacin suficiente tanto en lo que respecta al hardware como al software, intentando siempre separar ambos aspectos lo mximo posible, aunque dejando bien claro que las dos cuestiones estn ntimamente ligadas. Se inicia el texto con la presentacin 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 darn forma a la tarjeta (CPU) que se presentar. De esta forma tendremos configurado el hardware principal. A continuacin se vern las instrucciones de dicho microprocesador y la forma de emplearlas para construir programas, presentando para ello algunas subrutinas elementales que nos darn idea de dicho proceso. En la parte final del texto se presentarn determinados componentes expresamente diseados para trabajar de perifricos (8255 y 8155) que nos permitirn la comunicacin de la CPU con el mundo exterior. Para esto se realizar un estudio de los mismos y se desarrollarn programas de control especficos para cada uno de ellos. Es preciso indicar que todo lo referido al microprocesador como perifricos y dems componentes, tienen como referencia los manuales de los fabricantes (INTEL,...) que nos proporcionan los datos de partida necesarios para su estudio. Aadir tambin que existen distintas obras que tratan el tema de los

_______________________________________ 3 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

microprocesadores (concretamente el 8085) con las que se puede completar un estudio ms exhaustivo del tema, sin embargo este texto se considera suficiente en s mismo como para adquirir un conocimiento bsico y claro del microprocesador en cuestin 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 prctica, sera preciso considerar las normas de prevencin y de seguridad estipuladas en las normativas aplicables al caso (Reglamento Electrotcnico de Baja Tensin 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 ingeniera, tcnicos, programadores y diseadores de sistemas que precisen profundizar en este tema desde el punto de vista prctico adems de obtener una buena perspectiva terica.

Celestino Bentez Vzquez Enero de 1999

_______________________________________ 4 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INDICE
1. EL MICROPROCESADOR. 1.1 1.2 1.3 1.4 1.5 1.6 La integracin a gran escala y el microprocesador. Constitucin bsica de un microprocesador. El microprocesador 8085A de INTEL. Caractersticas. Descripcin fsica del 8085A. Descripcin funcional del 8085A. Ejercicios.

2.

SISTEMA BASICO PARA EL MICROPROCESADOR 8085A. 2.1 2.2 2.3 2.4 2.5 Tratamiento de los buses. Decodificacin de direcciones. La memoria. Diseo del sistema bsico. Ejercicios.

3.

LA FUENTE DE ALIMENTACION. 3.1 3.2 3.3 3.4 3.5 El filtro de entrada. Los rectificadores. Los filtros de continua. El regulador de tensin. La fuente de alimentacin definitiva.

4.

EL SOFTWARE: LAS INSTRUCCIONES. 4.1 4.2 4.3 4.4 4.5 4.6 Bases numricas de representacin. Los tipos de instrucciones. Los modos de direccionamiento. Conjunto de instrucciones del 8085A. Empleo de algunas instrucciones. Ejercicios.

5.

LA PROGRAMACION. 5.1 5.2 5.3 5.4 5.5 5.6 El algoritmo. Los pseudocdigos. Las estructuras de datos. Los diagramas de flujo. Ejemplos de algoritmos. Ejercicios.

_______________________________________ 5 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

6.

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

7.

TRANSFERENCIA DE DATOS AL EXTERIOR (I). 7.1 7.2 7.3 7.4 7.5 7.6 Descripcin fsica del PPI 8255. Descripcin funcional del PPI 8255. Modos de funcionamiento. Interconexin del 8255 con el 8085. Aplicaciones prcticas del 8255. Ejercicios.

8.

TRANSFERENCIA DE DATOS AL EXTERIOR (II). 8.1 8.2 8.3 8.4 8.5 Descripcin fsica del PPI 8155. Descripcin funcional del PPI 8155. Interconexin del 8155 con el 8085. Ejemplos de E/S con el PPI 8155. Ejercicios.

9.

PRACTICAS DE CONTROL CON MICROPROCESADOR (I). 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 Introduccin. El motor paso a paso. Control del motor paso a paso. La pantalla LCD. Programacin de la pantalla LCD. Sistema de pulsadores. Configuracin final del hardware. Software de control. Ejercicios.

10. PRACTICAS DE CONTROL CON MICROPROCESAODOR (II). 10.1 Introduccin. 10.2 Driver de transmisin de datos en serie. 10.3 Acoplamiento de varias drivers en serie. 10.4 Interconexin de las drivers con el sistema bsico. 10.5 Software de control. 10.6 Ejercicios.

_______________________________________ 6 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

EL MICROPROCESADOR

_______________________________________ 7 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

1. EL MICROPROCESADOR.
En muchos textos que tratan el tema de los microprocesadores se ha escrito sobre las caractersticas tcnicas y funcionales de este tipo de dispositivos. No se pretende aqu realizar una exposicin exhaustiva de dichas caractersticas, para lo cual sera ms oportuno acudir a los manuales del fabricante, sino ms bien llevar a cabo un estudio paulatino del microprocesador 8085A, y de una serie de dispositivos asociados (memorias, perifricos, etc.) que lleve al lector a asimilar sus estructuras bsicas y modos de funcionamiento, de manera que adquiera la base suficiente para poder llevar a cabo un diseo con dichos componentes. A lo largo del desarrollo de este tema, adems de realizar una breve introduccin a los microprocesadores y su constitucin bsica general, pasaremos al estudio concreto del microprocesador 8085A de INTEL, del que abordaremos tanto su constitucin fsica como su estructura funcional. Estos dos aspectos, nos harn tener una idea clara y transparente sobre dicho microprocesador. Debido a una serie de caractersticas y particularidades (entre las que destaca el bloque de interrupciones disponible), el microprocesador 8085A, es considerado como el ms potente dentro de la gama de microprocesadores de 8 bits, siendo empleado en numerosas aplicaciones industriales.

1.1 INTEGRACION A GRAN ESCALA Y EL MICROPROCESADOR


Podemos considerar que los primeros utensilios y equipos empleados para efectuar operaciones de clculo fueron los bacos orientales, siendo aproximadamente en el siglo XVII cuando se construyeron las primeras mquinas calculadoras mecnicas. Posteriormente se pas al empleo de elementos electromecnicos, significando esto un gran avance en dicho campo. En 1941 comienzan a construirse computadoras digitales basadas en el sistema binario de numeracin basndose en rels, y en un paso posterior se consigue la primer computadora basada en miles de vlvulas a la que se denomin ENIAC y que ha supuesto un paso decisivo y definitivo en el desarrollo tecnolgico industrial. A partir de la aparicin de los materiales semiconductores (fundamentalmente el silicio) se produce un crecimiento imparable en la industria y fundamentalmente en el sector de la electrnica. Los semiconductores son materiales que no pueden considerarse ni buenos ni malos conductores, presentando unos valores de resistividad comprendidos entre los de los buenos conductores y los de los aislantes. La resistividad de estos elementos es alterada aadindoles otros materiales, denominados impurezas que aumentan la conductividad de los cristales, obteniendo de este modo los semiconductores extrnsecos. Dependiendo del tipo de impurezas aadido, se obtendrn cristales tipo N o cristales tipo P. Cuando se doparon los cristales de forma controlada con impurezas de ambos tipos aparecieron las junturas PN o diodos. Fue posteriormente, al conseguir dos junturas, formando uniones PNP o NPN, cuando aparece el transistor y es en este momento cuando se produce un verdadero desarrollo y gran expansin de la electrnica en general. Con el perfeccionamiento de la tecnologa se consigue colocar o integrar en muy poco espacio, hasta varias decenas de transistores. Estamos ante la aparicin de los primeros circuitos integrados trabajndose a muy baja escala de integracin (SSI). Posteriormente se consigue almacenar en una misma pastilla varios miles de elementos integrados, obteniendo de este modo componentes ms complejos que se enmarcan dentro de la media escala de integracin (MSI). Hacia 1976 con la mejora de la tecnologa se consigue implementar en un solo chip varios miles de componentes, apareciendo en ese momento la alta escala de integracin (LSI). A partir de 1980 se trabaja con la muy alta escala de integracin (VLSI) que permite incorporar una cantidad muy elevada de componentes en un solo circuito integrado. _______________________________________ 8 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

La LSI provoc la aparicin del primer microprocesador, el 4004 de INTEL. Se trata de un microprocesador de 4 bits que hoy en da 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 mltiples 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 adems emplea tres tensiones de alimentacin (+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 aade en la misma pastilla el generador de impulsos de reloj, el controlador de buses y adems solo se necesita una tensin de alimentacin de +5V. Dispone tambin de cuatro nuevas entradas de interrupcin y dos lneas para entrada/salida de informacin en serie. El bus de direcciones y el bus de datos estn multiplexados y en el juego de instrucciones aparecen algunas novedades (que veremos ms 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 categora. Puede decirse que un microprocesador es un componente que contiene en una sola pastilla los componentes necesarios para desarrollar funciones aritmticas, lgicas y de control. Por tanto es una pequea Unidad Central de Proceso (CPU) en una pastilla.

1.2 CONSTITUCIN BSICA DE UN MICROPROCESADOR.


En la actualidad los microprocesadores estn entrando en muchos campos de la electrnica 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 diseos y minimizar los tiempos de desarrollo. La programacin proporciona adems la posibilidad de emplear un mismo sistema para la realizacin de tareas muy diversas. En general, los fabricantes han mantenido lneas generales de diseo bastante similares, por tanto la mayora de los microprocesadores tienen la misma arquitectura bsica o estndar. Puede asumirse como tal la representada en la FIG.12A. En esta representacin esquemtica podemos apreciar que el microprocesador posee una serie de bloques internos que se comunican entre s y con el exterior a travs de unos conjuntos de lneas denominados buses que sirven para transmitir seales 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 estn 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 lneas (lneas 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 informacin entre sus distintos bloques internos y para comunicarse con el exterior. Son un conjunto de 8 bits que utilizan 8 lneas de conexin al exterior, normalmente denominadas D0 a D7. Por este bus sale y entra informacin, por tanto se trata de un bus bidireccional. Bus de control compuesto por una serie de lneas, variable en nmero segn el componente de que se trate. Contiene las lneas de sincronizacin de funciones, pudiendo ser unas de salida y otras de entrada al microprocesador. Algunas seales de control pueden ser por ejemplo, las de lectura, escritura, reloj o clock, etc.

_______________________________________ 9 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

BUS DATOS INTERNO

ACUMULADOR REGISTROS INTERNOS DE 8 BITS

BUS DATOS EXTERNO

ALU
REGISTROS INTERNOS DE 16 BITS REGISTRO DE FLAGS

CONTROL

BUS DE DIRECCIONES INTERNO

BUS DE CONTROL

BUS DIRECCIONES EXTERNO

FIG.12A

El bloque fundamental del microprocesador es el llamado ALU, representa la parte del microprocesador que realiza las operaciones aritmticas y lgicas. Para llevar a cabo este proceso emplean normalmente un registro especial denominado Acumulador donde almacenan el resultado de las operaciones realizadas. Algunos microprocesadores poseen ms de un acumulador. Para completar las indicaciones necesarias tras la ejecucin de las instrucciones, el microprocesador emplea adems un registro especial de 8 bits denominado Registro de Estado o Registro de Flags que marcarn distintas caractersticas y peculiaridades de las operaciones desarrolladas. Posteriormente veremos con ms detalle este Registro de Flags. En la FIG.12A puede verse tambin un bloque denominado Control que sirve para sincronizar el funcionamiento de todo el sistema. Genera seales de sincronismo para la ALU, memorias y dispositivos de E/S. Las unidades de control generalmente estn constituidas basndose en microprogramacin (programacin interna no accesible al usuario) y se encargan de descifrar y ejecutar las instrucciones del programa que nosotros construyamos. Puede verse adems un bloque compuesto por Registros Internos de 8 bits, se trata en este caso de una serie de registros (variable segn 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 estndar que se est tratando debe haber tambin un bloque de Registros Internos de 16 bits que tambin son llamados registros de direccionamiento. Estn 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 sealar en todo momento a la cima de la pila. (La pila estar constituida por un bloque de memoria RAM, donde se almacenarn 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 direccin de la siguiente instruccin que deba ejecutarse y su contenido se va incrementando a medida que las instrucciones van siendo ejecutadas. De todas formas el contenido del

_______________________________________ 10 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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

1.3 MICROPROCESADOR 8085A DE INTEL. CARACTERSTICAS.


Tras habernos iniciado a los microprocesadores en el punto anterior de una forma generalista, pasamos ahora a iniciar el estudio del microprocesador 8085A. La representacin esquemtica de sus seales o lneas de conexin exterior, pueden apreciarse en la FIG.13A, indicndose en dicha figura el sentido de accin de todas las seales que vendr marcado por el sentido de las flechas que las representan. Por ejemplo podemos ver que la seal ALE es generada por el microprocesador y sale hacia el exterior; del mismo modo la seal SID ser una seal que procedente del exterior entrar en el microprocesador para ser tratada.

+5V

GND

X1 X2 CLK OUT RESET IN READY

BUS DE DIRECCIONES BUS DE DATOS/DIREC HLDA HOLD S0 S1 IO/M ALE RD WR INTA RESET OUT

TRAP RST 7.5 RST 6.5 RTS 5.5 INTR

FIG.13A

Es importante detenerse unos instantes en la observacin de esta figura y estudiar superficialmente todas las lneas que posee. Debe decirse que las seales marcadas con letra en negrita son activas con nivel lgico 0, por ejemplo la seal RD (lectura). Como caractersticas ms 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 estn 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 bsicos de 8 bits cada uno de uso general. Estos registros pueden usarse como registros pares para el tratamiento de informacin de 16 bits. Dos registros de direcciones de 16 bits (SP y PC). Un bloque de cinco seales de interrupcin distintas con diferentes ordenes de prioridad.

_______________________________________ 11 ___________________________________________

8085

SID SOD

____________________ Curso 8085A ____________________________________________________________

Dos seales que permiten la transferencia de informacin en serie (SID y SOD). Tensin de alimentacin nica de +5V. Buffers para la salida y entrada de informacin 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 ms detalle y minuciosidad, las caractersticas y propiedades del microprocesador, incluyendo adems los diagramas de tiempo correspondientes a la ejecucin de las instrucciones en funcin de la frecuencia del cuarzo colocado en las lneas X1 y X2.

1.4 DESCRIPCIN FSICA DEL 8085A.


Como se ha mencionado anteriormente, este microprocesador se presenta en un encapsulado de 40 patillas cuya distribucin puede verse en la FIG.14A. A continuacin se da una descripcin de la funcin de cada una de las patillas: Patillas 1 y 2 (X1 y X2): Permiten la generacin de las seales de reloj, mediante la utilizacin de un cristal de cuarzo, segn se ver posteriormente. Patilla 3 (RESET OUT): Seal de salida. Cuando en ella tenemos un 1, quiere decir que el microprocesador queda reinicializado. Esta seal es generada por el propio microprocesador. Patilla 4 (SOD): Salida serie. Se activa mediante la instruccin SIM. Patilla 5 (SID): Entrada serie. El dato queda cargado en el bit 7 del Acumulador cuando se ejecuta la instruccin RIM. Patilla 6 (TRAP): Interrupcin. Cuando se activa esta patilla bien por flanco o por nivel lgico 1, el microprocesador finaliza la instruccin que estaba ejecutando y salta a una subrutina enganchando en la direccin 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 instruccin 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 interrupcin de ms alta prioridad.

Voo HOLD HLDA CLK OUT RESET IN READY IO/M S1 RD WR ALE S0


40 39

X1 X2 RESET OUT SOD SID TRAP RST 7.5 RST 6.5 RST 5.5 INTR INTA AD0 AD1 AD2 AD3

FIG.14A

Patilla 7 (RST 7.5): Interrupcin. Es enmascarable por programa. Para conseguir esto, es necesario que se haya ejecutado la instruccin EI con posterioridad a DI y a continuacin enmascararla (o no),colocando un 0 en el bit adecuado mediante la instruccin SIM. Esta interrupcin se activa por flanco y nos permite enganchar en la direccin 003CH.

_______________________________________ 12 ___________________________________________

AD4 AD5 AD6 AD7 GND

15 16 17 18 19 20

3 4 5 6 7 8 9 10 11 12 13 14

1 2

38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

MICROPROCESADOR 8085

A15 A14 A13 A12 A11 A10 A9 A8

____________________ Curso 8085A ____________________________________________________________

Patilla 8 (RST 6.5): Se activa por nivel 1 lgico, que debe mantenerse hasta que la peticin de interrupcin sea atendida. Es enmascarable por programa (Idem a la anterior). Permite enganchar en la direccin 0034H. Patilla 9 (RST 5.5): Se activa por nivel 1 lgico, que debe mantenerse hasta que la peticin de interrupcin sea atendida. Es enmascarable por programa (Idem a la anterior). Permite enganchar en la direccin 002CH. Patilla 10 (INTR): Interrupcin. Cuando en esta patilla introducimos un 1 lgico, el contador de programa no se incrementa y el 8085 busca una instruccin que entra a la CPU por el bus de datos mediante hardware externo y activa INTA que es la seal de reconocimiento. Se puede entonces presentar el cdigo de operacin de una instruccin RST o CALL para realizar el subprograma de tratamiento de la interrupcin. La interrupcin queda autorizada o prohibida por programa (EI o DI). Queda prohibida a continuacin de un RESET o inmediatamente despus de una interrupcin. Forma un segundo grupo de interrupciones al emplear las instrucciones RST 1,2,3,4,5,6 y 7. INTA es la seal 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 cdigo de una instruccin RST, la interrupcin se produce por hardware. Patilla 11 (INTA): Reemplaza a RD en una operacin de lectura de instruccin que sea una interrupcin. Patillas 12 a 19 (AD0 a AD7): Conforman el bus de datos/direcciones multiplexado durante la ejecucin de una instruccin. Transporta desde el principio la parte BAJA del bus de direcciones para a continuacin 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 tensin 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 mquina que est en ejecucin (junto con S1). Patilla 30 (ALE): Libera un impulso cada vez que el bus AD0-AD7 presenta la parte baja de una direccin. Se utiliza para diferenciar entre la parte baja de la direccin y el dato que se presentar a continuacin. 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 ledo 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 instruccin 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 autorizacin de interrupcin. Patilla 37 (CLK OUT): Seal de salida de reloj del 8085. Tambin 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 lneas de control estn en estado de alta impedancia. Patilla 39 (HOLD): Indica que algn otro usuario esta solicitando el acceso el bus de direcciones y al bus de datos. El microprocesador termina la ejecucin del ciclo en curso, despus posiciona en estado de alta impedancia al bus AD0-AD15 y las lneas de control RD, WR e IO/M, sealando este paso sobre la lnea HLDA. Patilla 40 (Vcc): Tensin de alimentacin de +5V.

Hay que insistir en este momento que aunque la lectura de este apartado resulte un tanto pesada, debe realizarse con la suficiente atencin. Es preciso darse cuenta que cuando se pretenda desarrollar un diseo de tarjeta basada en este microprocesador, deberemos conocer la funcin de todas y cada una de las patillas de dicho componente. Al mismo tiempo este estudio nos llevar a un conocimiento mucho ms profundo del 8085.

_______________________________________ 13 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

1.5 DESCRIPCIN FUNCIONAL DEL 8085A.

Del mismo modo que hasta ahora hemos descrito con detalle todos los terminales del microprocesador, lo cual nos permitir abordar en cierta medida el diseo de un sistema electrnico, ahora llevaremos a cabo un estudio bsico del funcionamiento interno del microprocesador, que nos permitir posteriormente iniciar trabajos de programacin. Para realizar esta tarea nos apoyaremos en el diagrama de bloques representado en la FIG.15A, en la que podemos apreciar los siguientes elementos caractersticos: El conjunto decodificador/secuenciador que lleva incluido el generador de reloj y el sistema controlador. El conjunto unidad aritmtica/lgica y sus registros asociados: acumulador de 8 bits, registro temporal y registro de los indicadores o sealizadores (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 seales de interrupcin y genera una seal de salida que nos marca una interrupcin 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 estn controlados por la microprogramacin interna que interpreta y ejecuta las instrucciones recibidas del programa que se est ejecutando. Y de acuerdo a esas directrices actuar sobre los datos e informaciones y los mover a travs de registros y bloques para obtener el resultado deseado. Debe decirse que estos procesos de trabajo interno del microprocesador no son accesibles al usuario, es decir, el programador puede indicar la instruccin a ejecutar, pero no puede decirle al microprocesador cmo ha de ejecutarla. Por tanto desde el punto de vista de la persona que deba realizar los programas, es fundamental conocer 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 direccin 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 posicin 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 lgicas, aritmticas, etc. segn el desarrollo del programa.

_______________________________________ 14 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

DIAGRAMA DE BLOQUES DEL 8085


INTA RST6.5 TRAP INTR RST5.5 RST7.5 SID SOD

CONTROL DE INTERRUPCIONES

CONTROL E/S SERIE

BUS DE DATOS INTERNO DE 8 BITS

REGISTRO TEMPORAL

FLAGS

REGISTRO INSTRUCCION

REG.B REG.C REG.D REG.E REG.H REG.L PUNTERO PILA CONT.PROGRA. INCREM/DECRE LATCH DIRECC

ACUMULADOR ALU

DECODIFICA INSTRUCCI. Y SECUENC. CILCLO MAQ.

X1

X2

BUFFER DIRECCION

CONTROL DE RELOJ CLK GEN. CONTROL STATUS DMA RESET

A15-A8 BUS DIRECCIONES

BUFFER DIREC/DATOS

WR

ALE

IO/M

RESET IN

RESET OUT

RD

CLK OUT

READY

HOLD

HLDA

SO

S1

AD7-AD0 BUFFER DIRECC/DATOS

FIG. 15A

_______________________________________ 15 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Registro de Estados (FLAGS), tiene 8 bits y nos indica en cada momento cual es el estado del acumulador despus de haber realizado la ltima operacin. El formato de este registro es como sigue: S siendo: C P AC Z S X = = = = = = Bit de acarreo (CARRY) Bit de paridad (PARITY) Bit de acarreo auxiliar (AUX CARRY) Bit cero (ZERO) Bit de signo (SIGN) Bit indiferente. Z X AC X P X C

CARRY.- En este bit del registro de estados, aparecer un 1 lgico cuando la ltima operacin realizada con el acumulador, desborde el contenido del mismo. PARITY.- En este bit aparecer un 1 lgico cuando el nmero de "unos" que hay en el acumulador sea par. Si es impar aparecer un 0 lgico. AUX CARRY.- Aqu aparece un 1 lgico 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 lgico cuando el contenido del acumulador es 0000 0000. En caso contrario aparece un 0 lgico. SIGN.- Este es el bit del signo que nos indica, cundo el dato que hay en el acumulador es un nmero positivo o negativo. Registro de mscara de interrupciones (I). Tiene dos aspectos diferentes segn sea ledo (mediante una instruccin RIM) o escrito (mediante una instruccin SIM).

Cuando procedemos a una lectura del registro de mscara de interrupciones, mediante la instruccin 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 instruccin RIM del 8085). Cuando se procede a escribir en el registro de mscara de interrupciones, mediante la instruccin 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 autorizacin de la salida serie, el bit R7.5 nos da la posibilidad de realizar un reset en la interrupcin 7.5, el bit MSE autoriza el enmascaramiento de las interrupciones y finalmente los bits M7.5, M6.5 y M5.5 ponen las mscaras de cada interrupcin respectivamente. (Ver instruccin SIM del 8085). Dos Bloques Buffers que genera el microprocesador, en los que puede apreciarse cmo 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 perifricos asociados sepan cundo se trata de la parte baja de una direccin o de un dato. La seal 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.

_______________________________________ 16 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

1.6 EJERCICIOS.

1. 2. 3.

Hablar sobre los distintos niveles o escalas de integracin, en la fabricacin de los circuitos integrados. Enumerar los tipos de buses del microprocesador 8085. Hablar sobre sus caractersticas. Intentar desarrollar una representacin grfica de la arquitectura estndar de un microprocesador y analizarla. Enumerar las lneas de control que tiene disponibles el 8085. Hablar sobre las lneas de interrupcin del microprocesador 8085, expresando su orden de prioridad. Funcin de la seal 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.

4. 5. 6. 7. 8.

_______________________________________ 17 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

SISTEMA BSICO PARA EL MICROPROCESADOR 8085-A

_______________________________________ 18 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

2. SISTEMA BASICO PARA EL MICROPROCESADOR 8085A.


Como hemos podido comprobar hasta el momento, el microprocesador ofrece gran potencialidad en la realizacin y desarrollo de funciones y actuaciones de control en general. Sin embargo tambin habremos constatado que por s mismo el microprocesador resulta inoperante, es decir, es preciso acompaarlo de los componentes necesarios para que pueda llevar a cabo la ejecucin prctica de los programas que se diseen. Estos componentes asociados son de muy diversas caractersticas y todos y cada uno de ellos desempean funciones determinadas y muy concretas. En este tema se ver la estructura de cada uno y se realizar un estudio de componentes concretos, que emplearemos para ir configurando una tarjeta bsica sobre la que posteriormente desarrollaremos diferentes programas. Los componentes asociados que necesitaremos, debern resolvernos problemas lgicos, de control, de direccionamiento, de tratamiento de buses, de almacenamiento de datos, de comunicacin de entrada/salida (E/S), etc. Esto nos da idea de la gran variedad de componentes que podemos encontrar para llevar a cabo estas tareas. Sin embargo aqu se tratarn nicamente los elementos imprescindibles para nuestros propsitos, como decodificadores, memorias RAM, memorias EPROM, etc. Adems, de forma sistemtica y paulatina, se ir desarrollando la forma de acoplamiento de todos los elementos, para finalmente llegar a la construccin de nuestro sistema bsico de trabajo.

2.1 TRATAMIENTO DE LOS BUSES.


Como se ha visto en el tema anterior, una de las principales caractersticas que presenta el microprocesador 8085 es poseer un bus de datos (de 8 lneas) multiplexado con la parte baja del bus de direcciones. Este multiplexado quiere decir que en un instante determinado tendremos en las 8 lneas del bus la informacin perteneciente a una direccin y un instante ms tarde tendremos en esas mismas lneas la informacin perteneciente a un dato. Corresponde por tanto a la circuitera externa, separar estas seales de modo apropiado, tal que no se produzcan interferencias por informaciones errneas en el resto de los componentes del sistema. De esta forma se obtendr una separacin total entre el bus de datos (8 bits) y el bus de direcciones (16 bits). Como sabemos el microprocesador 8085 dispone de una lnea de control o sincronizacin denominada ALE, por medio de la cual suministra un pulso de tensin de nivel lgico 1 cuando se presenta la parte baja de una direccin en el bus AD0,...,AD7 y cuando aparece un dato la seal ALE pasa al estado lgico 0. Deberemos por tanto emplear esta seal de control para separar estas informaciones utilizando un circuito integrado que acte de cerrojo (latch) y realice la separacin fsica. El esquema de principio responde a la FIG.21A. Mientras ALE est a nivel lgico 1, la informacin presente en las entradas del cerrojo, procedente de las lneas AD0,...,AD7 del microprocesador, pasa a las salidas, configurando de este modo la parte baja de las direcciones. En el instante en que ALE pasa a nivel 0, esa informacin queda almacenada y retenida en las salidas del cerrojo, que no cambiaran su estado mientras ALE no pase a nivel 1. Por tanto ahora puede cambiar

_______________________________________ 19 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

la informacin presente en las lneas AD0,...,AD7 del microprocesador, que nos suministrar el dato oportuno, sin afectar a la parte baja de las direcciones.

ALE

CONTROL

AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

D0 D1 D2 D3 D4 D5 D6 D7

FIG.21A

Son varios los circuitos que pueden emplearse para este cometido. Uno de los ms comnmente empleados es el 74LS373 cuya constitucin y funcionamiento pueden encontrarse en diversos textos. Nosotros estudiaremos el circuito integrado 8212, fabricado por INTEL y que desarrolla esta funcin 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. Tambin 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 perifricas y de entrada/salida del microprocesador. Se presenta en un encapsulado de 24 patillas que podemos ver representado en la FIG.21B.

DS1 MD DI0 DO0 DI1 DO1 DI2 DO2 DI3 DO3 STB GND

CERROJO

1 2 3 4 5 6 7 8 9 10 11 12

24 23 22 21 20 19 18 17 16 15 14 13

Vcc INT DI7 DO7 DI6 DO6 DI5 DO5 DI4 DO4 CLR DS2

FIG.21B

A continuacin se describir de forma concisa la funcin de todas las patillas de este componente: DO0,... DO7. Son las 8 lneas de salida de datos que estn conectadas a 8 buffers no inversores que pueden ser colocados en estado de alta impedancia.

_______________________________________ 20 ___________________________________________

8212

____________________ Curso 8085A ____________________________________________________________

DI0,... DI7. Son las 8 lneas de entradas de datos a los 8 flip-flop internos de tipo D. La salida de estos flipflop toman los valores de las entradas mientras la seal 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 conexin a masa, o tensin de referencia. Vcc. Terminal de alimentacin (+5V). STB. Es la entrada strobe o impulso de referencia se toma como clock para el latch de datos. MD. Seal 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 seleccin de dispositivo. Con DS1=0 y DS2=1 el componente estar seleccionado. CLR. Pone a cero el latch de datos. Nivel bajo activo INT. Lnea de salida para una interrupcin. Nivel bajo activo.

Dentro de las posibles aplicaciones o modos de conexin del 8212 pueden mencionarse: su utilizacin como controlador para un bus bidireccional empleando para ello dos componentes en oposicin; conexin 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 informacin adicional de este componente, como pueden ser sus diagramas de tiempos, caractersticas de conmutacin, etc., debemos acudir a las hojas de caractersticas tcnicas suministradas por los fabricantes. La conexin de este circuito integrado con el microprocesador 8085, se realiza de forma muy simple, segn se muestra en la FIG.21C. Como podemos apreciar los pasos a seguir son:

+5V

ALE

STB INT

8085

AD3 AD4 AD5 AD6 AD7 BUS DATOS

DI3 DI4 DI5 DI6 DI7

8212

AD0 AD1 AD2

DI0 DI1 DI2

DO0 DO1 DO2 D03 DO4 DO5 DO6 DO7

BUS DIRECCIONES

CLR

DS2

Vcc

A0 A1 A2 A3 A4 A5 A6 A7

GND

FIG.21C

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 lneas DI0, DI1, DI2, ..., DI7, a las lneas del microprocesador AD0, AD1, AD2, ..., AD7, respectivamente.

Realizada la conexin 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 lneas de direcciones A0, A1, A2, ..., A7 respectivamente.

_______________________________________ 21 ___________________________________________

DS1

MD

____________________ Curso 8085A ____________________________________________________________

2.2 DECODIFICACIN DE DIRECCIONES.


Debemos entender que la mayora de los componentes que se emplean en los diseos con microprocesadores, necesitan ser conectados a los buses de datos y direcciones, por tanto deben poseer la caracterstica de permitir dejar en estado de alta impedancia las lneas que se conecten a dichos buses. De este modo podremos conectar varios componentes al mismo conjunto de lneas sin que se produzcan interferencias entre ellos, ya que solamente permanecer activo aquel que sea seleccionado, quedando el resto en estado de alta impedancia (tri-estado). Por tanto los componentes sobre los que debe actuar el microprocesador, adems de las lneas necesarias para conectarse a los buses, deben poseer algn 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 seleccin del componente. Por otro lado sabemos que el bus de direcciones sirve para seleccionar algn registro (o alguna direccin) determinado en un componente, por tanto tendremos dos tipos de selecciones simultneas: Se debe seleccionar el componente que contiene la direccin o registro al que necesitamos acceder. Hay que indicar el registro o la direccin que deseamos dentro del componente.

Para llevar a cabo estos procesos emplearemos el direccionamiento por decodificacin, aunque hay otros mtodos posibles. Las lneas de direccin ms bajas, son las que normalmente se emplean para apuntar a un registro determinado o a una direccin dada y las lneas de direccin ms altas (A15, A14, A13, ...) se llevan a las entradas de un circuito integrado decodificador que ser el que con una de sus salidas, seleccione el componente que deseamos. Existen varios decodificadores que pueden ser empleados para este trabajo y que son de uso corriente. En nuestro caso ser utilizado el 74LS138. Se trata de un conocido decodificador de 3 a 8 lneas de lgica transistor-transistor que se presenta en un encapsulado de 16 patillas cuya distribucin puede apreciarse en la FIG.22A.
A0 A1 A2 E1 E2 E3 O7 GND 1 2 3 4 5 6 7 8 16 15 14 13 12 11 10 9 Vcc O0 O1 O2 O3 O4 O5 O6

FIG.22A

La funcin de cada una de sus lneas se describe a continuacin: A0, A1 y A2 son las seales de entrada en cdigo binario. O0,..., O7 son las lneas de salida con nivel bajo activo. GND es el terminal de masa o tensin de referencia. Vcc es la patilla de alimentacin (+5V). E3 es una seal de habilitacin activa a nivel alto. E1 y E2 son seales de habilitacin activas a nivel bajo.

_______________________________________ 22 ___________________________________________

74LS138

____________________ Curso 8085A ____________________________________________________________

A continuacin se muestra la tabla de la verdad, a travs de cuya observacin y anlisis puede apreciarse perfectamente la forma de actuar del decodificador.

A2 A1 A0 O0 O1 O2 O3 O4 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1

O5 1 1 1 1 1 0 1 1

O6 1 1 1 1 1 1 0 1

O7 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 lnea de direccin ms 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 lnea de direccin A15 tambin para seleccionar una memoria EPROM, puesto que al comenzar su ejecucin el microprocesador arranca en la direccin 0000H en su contador de programa, por lo que tendremos un 0 en la lnea A15 con la que podemos seleccionar una EPROM al tiempo que bloqueamos el 74LS138. Las otras dos lneas de control E1 y E2 se colocan a nivel bajo para dejar activo el decodificador. De todas formas es posible dar otra funcin a estas lneas de control en el diseo global del sistema. Las lneas de salida O0, O1, O2, ..., O7 del decodificador quedarn disponibles para seleccionar los componentes deseados. En cada una de ellas, se colocar una resistencia a +5V para asegurar el nivel lgico 1, en las salidas no activas.
+5V

Vcc A15 A14 A13 A12 E3 A2 A1 A0

74LS138

8085

O3 O2 O1 O0

4K7

O7 O6 O5 O4

CS7 CS6 CS5 CS4 CS3 CS2 CS1 CS0

GND

E1

FIG.22B

_______________________________________ 23 ___________________________________________

E2

____________________ Curso 8085A ____________________________________________________________

2.3 LA MEMORIA.
Para un sistema electrnico diseado sobre la base de un microprocesador determinado, la memoria es el lugar externo donde se almacenan los programas y los datos, tanto los iniciales como los que se van generando a medida que se ejecuta el programa. Las memorias debern disponer de un bus de datos (generalmente de 8 bits), un bus de direcciones cuyo nmero de bits depende de la capacidad de almacenaje y de los terminales de control adecuados que permitan un correcto funcionamiento del dispositivo, as como un fcil acceso y la posibilidad de situar los terminales del bus de datos en estado de alta impedancia. Dentro de las caractersticas ms destacables de una memoria y esenciales para su valoracin se encuentran los tiempos de escritura y lectura, el tiempo de acceso, los tiempos de ciclo, la capacidad (nmero de bits que pueden almacenarse en la memoria), etc. Todos estos datos, junto a otra serie de parmetros tpicos pueden encontrarse en las hojas de especificaciones tcnicas que suministran los fabricantes. Para trabajar con un microprocesador, se dispone bsicamente 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 informacin deseada. Lo normal es almacenar en ellas los datos y valores que se van generando durante la ejecucin del programa, la informacin que contienen es voltil, es decir puede perderse por un fallo en la alimentacin. A continuacin veremos un resumen de las distintas memorias de cada tipo: Memoria RAM dinmica: Este tipo de memoria RAM se caracteriza por almacenar los bits que representan la informacin, en forma de cargas elctricas, aprovechando la capacidad generada en un transistor MOS que constituye la celda elemental de informacin. Sin embargo esta carga as almacenada, se va perdiendo con el tiempo, llegando a desaparecer al cabo de unos ms, debido a fugas elctricas. Es por tanto imprescindible con este tipo de memorias emplear circuitos de refresco cuya misin es leer la informacin que contiene la memoria y volver a guardarla exactamente igual a intervalos de tiempo prximos a 1 o 2 ms. Hay microprocesadores que incluyen un sistema de refresco para trabajar con este tipo de memorias, en caso contrario sera preciso disear uno. Las RAM dinmicas poseen gran capacidad de memoria y son muy econmicas, suelen emplearse en sistemas que requieren mucha memoria. Memoria RAM esttica: Es la memoria que emplearemos nosotros en nuestro sistema. Esta constituida a partir de elementos flip-flop que configuran las celdillas de informacin, es decir, cada celdilla o flip-flop representa un bit. Su contenido permanece estable (a diferencia de las dinmicas) hasta que eliminemos la tensin de alimentacin, momento en que perdemos toda la informacin almacenada. Si deseamos retener la informacin de la RAM, no tendremos ms alternativa, que disear un sistema de alimentacin auxiliar (con bateras por ejemplo) que sustituya a la tensin principal cuando desaparezca. Existen RAM estticas 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 disear 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 tecnologa "CMOS" de bajo consumo con una capacidad de 16384 bits, es decir, 2 Kbytes para lectura/escritura.

a. b.

_______________________________________ 24 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

La descripcin 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 tensin de referencia. Patilla Vcc. Es el terminal de alimentacin (+5V). Patilla CS. Entrada de seleccin de componente. Patilla OE. Entrada de lectura. Patilla WE. Entrada de escritura.

(Recuerde que las seales marcadas en negrita tienen nivel activo BAJO).

A7 A6 A5 A4 A3 A2 A1 A0 D0 D1 D2 GND

1 2 3 4 5 6 7 8 9 10 11 12

24 23 22 21 20 19 18 17 16 15 14 13

Vcc A8 A9 WE OE A10 CS D7 D6 D5 D4 D3

FIG.23A

Para llevar a cabo la interconexin 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 lneas de direccin A0, A1, A2, ..., A7 son conectadas a las salidas DO0, DO1, DO2, ..., DO7 del 8212. Las lneas de direccin A8, A9 y A10, se conectan a las lneas 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 lneas 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 alimentacin de +5V. La lnea CS, de seleccin de chip, es conectada a una de las salidas del decodificador de direcciones 74LS138. El terminal WE se conecta a la seal WR del microprocesador. La patilla OE se conecta a la salida RD del microprocesador.

_______________________________________ 25 ___________________________________________

RAM 6116

____________________ Curso 8085A ____________________________________________________________

A15 A14 A13 A12 A11 A10 A9 A8

E3 A2 A1 A0

O7 O6 O5 O4 O3 O2 O1 O0 CS

+5V

Vcc GND

74LS138 A10 A9 A8

8085

WR RD

WE OE

AD3 AD2 AD1 AD0

8212

AD7 AD6 AD5 AD4

A7 A6 A5 A4 A3 A2 A1 A0

FIG.23B

Memoria ROM: Se trata de una memoria de solo lectura y se emplea para almacenar los programas, dado que su contenido no se pierde an en ausencia de la tensin de alimentacin. 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 produccin y no es preciso introducir modificaciones en los programas. Memoria PROM: Tiene caractersticas similares a la anterior, con una distribucin de terminales idntica, por lo que pueden reemplazarlas. Las PROM se compran vacas o limpias, es decir, sin informacin alguna y es el usuario quien mediante un programador adecuado, les carga el programa. Las celdillas de informacin poseen dispositivos fusibles que segn permanezcan intactos o fundidos, representarn los dos posibles estados de informacin (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 tambin 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 cpsula que contiene la memoria en s. Si hacemos incidir radiaciones ultravioletas sobre dicha ventana conseguimos eliminar la informacin existente en la memoria, quedando la EPROM dispuesta para ser grabada de nuevo. Este

_______________________________________ 26 ___________________________________________

RAM 6116
D7 D6 D5 D4 D3 D2 D1 D0

____________________ Curso 8085A ____________________________________________________________

proceso puede repetirse en muchas ocasiones. Son ms 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 distribucin de patillas puede verse en la FIG.23C.

Vpp A12 A7 A6 A5 A4 A3 A2 A1 A0 D0 D1 D2 GND

1 2 3 4 5 6 7 8 9 10 11 12 13 14

28 27 26 25 24 23 22 21 20 19 18 17 16 15

Vcc A14 A13 A8 A9 A11 CS A10 OE D7 D6 D5 D4 D3

FIG.23C

A continuacin se describe la funcin de sus terminales: Patillas A0,... A14. Representan el bus de direcciones. Patillas D0,... D7. Representan el bus de datos. Patilla GND. Representa la tensin de referencia o masa. Patilla Vcc. Tensin de alimentacin. Patilla Vpp. Entrada de programacin. Patilla CS. Terminal de seleccin de chip. Patilla OE. Terminal que habilita las salidas.

Para llevar a cabo la interconexin entre esta EPROM y el microprocesador, no tendremos ms que conectar de forma adecuada las lneas correspondientes de los buses de datos y direcciones, segn se muestra en la FIG.23D. Hay que destacar que al disponer esta memoria de 15 lneas de direcciones, emplearemos las lneas A0,... A14 del microprocesador para direccionar todas las posiciones disponibles de la EPROM, efectuando la seleccin de chip con la lnea de direcciones A15 de forma directa y emplendola al mismo tiempo para bloquear el decodificador 74LS138. Tambin debemos conectar la seal RD del microprocesador a la entrada OE de la memoria para efectuar la lectura de datos. El terminal Vpp (de entrada de programacin) debemos conectarlo a +5V, durante su estado de funcionamiento normal. Si deseamos aadir ms 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.

_______________________________________ 27 ___________________________________________

EPROM 27256

____________________ Curso 8085A ____________________________________________________________

A15 A14 A13 A12 A11 A10 A9 A8

+5V

A15 A14 A13 A12 A11 A10 A9 A8

Vcc Vpp

8085

RD

OE

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

A7 A6 A5 A4 A3 A2 A1 A0 GND

8212

FIG.23D

Otras memorias: El desarrollo de las tecnologas de fabricacin y los continuos avances en la investigacin, hacen que el campo de las memorias est evolucionando constantemente, consiguindose componentes con mayores capacidades de almacenamiento, velocidades de acceso mayores y costes ms reducidos. Al mismo tiempo se trabaja sobre otros tipos de memorias intentando mejorar determinadas caractersticas. Podemos mencionar: Las memorias EAROM, que almacenan la informacin de forma permanente, pero pueden ser ledas y escritas electrnicamente (aunque los tiempos de escritura son muy superiores a los de lectura). Las memorias de burbujas que se caracterizan por poseer una densidad elevadsima de almacenamiento aunque son lentas y caras. Las memorias PLA o de matriz lgica programable. Se emplean para decodificar o codificar seales lgicas.

_______________________________________ 28 ___________________________________________

EPROM 27256
D7 D6 D5 D4 D3 D2 D1 D0

____________________ Curso 8085A ____________________________________________________________

2.4 DISEO DEL SISTEMA BSICO.

Apoyndonos ahora en todo lo visto hasta el momento, podemos realizar nuestro diseo de sistema, para llevar a cabo operaciones bsicas con el microprocesador 8085. Esta tarjeta que estar constituida esencialmente por los componentes mencionados con anterioridad, responde al esquema de la FIG.24A. En ella podemos ver cmo la conexin de la memoria EPROM se realiza del mismo modo que se ha indicado en el apartado anterior (ver FIG.23D). El banco de memorias RAM estar constituido en este caso por tres unidades 6116, con idntico modo de conexin en todas sus lneas a excepcin de las lneas de seleccin de chip, que en este caso sern las CS0, CS1, y CS2 procedentes del decodificador 74LS138. En lo que se refiere a la conexin del 8212, vemos que nada vara respecto a lo expuesto en la FIG.21C, nicamente mencionar la colocacin de una resistencia de 4K7 a +5V en la seal ALE al objeto de reafirmar los niveles de tensin en esta salida del microprocesador. Este mismo sistema se emplea en la parte alta del bus de direcciones en el que se sita un bloque de 8 resistencias de 10k cada una conectadas a +5V. El decodificador de direcciones 74LS138, sigue el mismo esquema de conexin que el mostrado en la FIG.22B. Ahora adems 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 respectivamente se emplean para direccionar las tres pastillas de memorias RAM que hemos colocado en el sistema. Puede verse con claridad cmo el microprocesador se sirve de un cristal de cuarzo de 4 MHz y un condensador de 18 pF, que colocados entre las patillas 1 y 2 generan la oscilacin que produce la frecuencia de reloj a la que funcionar el sistema. Es decir, se genera la frecuencia de trabajo. Destacamos adems el circuito situado en la seal de entrada RESET IN del microprocesador (patilla 36) formado por una resistencia de 1K en paralelo con un diodo y un condensador electroltico de 1 uF. Este circuito es el que asegura un arranque correcto del sistema en el momento de conexin a red inicindose el contador de programa en la direccin 0000H, despus de que la patilla 36 haya alcanzado el nivel lgico 1 (ALTO). Este circuito produce un retardo en el arranque que viene dado aproximadamente por la constante de tiempo RC. En la parte izquierda de la FIG.24A puede verse que las seales INTR, TRAP, RST 7.5, RST 6.5, RST 5.5 y HOLD son conectadas directamente a masa para conseguir un correcto funcionamiento del sistema mientras no vayamos a emplearlas. Estas conexiones deben realizarse individualmente para cada seal y mediante puentes fcilmente eliminables de modo que si en un momento dado, para una determinada aplicacin deseamos emplear alguna de ellas, podamos hacerlo sin ms que eliminar el puente a masa correspondiente y tratando dicha entrada del modo adecuado.

_______________________________________ 29 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

CON4 +5V A15 A14 A13 A12 A11 A10 A9 A8 MASA A15 A14 A13 A12 A11 A10 A9 A8 +5V A15 A14 A13 A12 6 3 2 1

100nF 16

+5V

1 4 MHZ

18pF

CON3

IO/M S1 S0 INTA SID SOD HLDA INTR

34 33 29 11 5 4 38 10 6 7 8 9 39 37 3

28 27 26 25 24 23 22 21 40

4 5 8

15 14 13 12 11 10 9 7

8x10K

74LS138

CS0 CS1 CS2

8x4K7

CS3 CS4 CS5 CS6 CS7 CON3

CON3

100nF 4K7 STB 11 24 13 14 DI7 22 21 A7 DI6 20 19 A6 DI5 18 17 A5 DI4 DI3 DI2 DI1 DI0 16 15 9 10 7 8 5 6 3 4 12 2 1

+5V 28 1 RD 20 D7 19 D6 18 D5 D4 D3 D2 D1 D0 17 16 15 13 12 11

100nF

30 ALE 19 AD7 18 AD6 17 AD5 16 15 14 13 12 AD4 AD3 AD2 AD1 AD0

27 26 2 23 21 24 25

A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 A15 CON1

TRAP RST 7.5 RST 6.5 RST 5.5 HOLD CLK OUT RESET OUT ALE

27256

A4 A3 A2 A1 A0

3 4 5 6 7 8 9 10 22

RD 32 WR 31 READY 35

36

RESET IN 1K +5V 1uF 16V DS4148

20 +5V 4K7

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

8085

8212

14 BUS DE DATOS

D7 D6 D5 D4 D3 D2 D1 D0
CON2

D7 D6 D5 D4 D3 D2 D1 D0

17 16 15 14 13 11 10 9

19 22 23 1 2 3 4 5 7 8 24

A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

D7 D6 D5 D4 D3 D2 D1 D0

17 16 15 14 13 11 10 9

19 22 23 1 2 3 4 5 7 8 24

A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

D7 D6 D5 D4 D3 D2 D1 D0

17 16 15 14 13 11 10 9

19 22 23 1 2 3 4 5 6 7 8 24

A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

6116-3

6116-2

WR 21 RD 20 CS 18 12

WR 21 RD 20 CS 18 12

WR 21 RD 20 CS 18 12

CS2

CS1

100nF

+5V

100nF

+5V BUS DE DIRECCIONES

CS0

6116-1

100nF

+5V

FIG. 24A

_______________________________________ 30 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Adems deben colocarse distribuidos sobre la tarjeta condensadores de desacoplo. Lo ms usual es situar uno por cada circuito integrado y debern ir soldados mediante conexiones cortas y a ser posible directamente sobre las patillas de alimentacin de los circuitos integrados. Este es un medio eficaz y sencillo para impedir la creacin de seales parsitas de alta frecuencia que son derivadas a masa a travs del condensador. Normalmente estos condensadores son de 100 nF. Puede apreciarse tambin cmo la tarjeta dispone, para su conexin a otros circuitos, de cuatro conectores: CON1: Constituido por 16 lneas en las cuales podemos encontrar el bus de direcciones completo (A0, A1, A2, ..., A15). CON2: Constituido por 8 lneas en las que podemos encontrar el bus de datos completo (D0, D1, ..., D7). CON3: Constituido por un total de 24 lneas entre las que encontramos el bus de control, el bloque completo de seales de interrupcin (que podremos utilizar desde el exterior eliminando previamente los puentes a masa) y las seales de seleccin de chip que se toman del decodificador 74LS138. CON4: Constituido por nueve lneas divididas en dos grupos que sirven para suministrar la alimentacin a la tarjeta (+5V y MASA).

Realizadas todas estas consideraciones, no queda ms 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 apoyndonos en los valores que adquieren las entradas A0, A1, A2 y E3 del decodificador, se tendr la siguiente distribucin de direcciones: EPROM 27256 RAM 6116-1 RAM 6116-2 RAM 6116-3 Desde 0000H hasta 7FFFH Desde 8000H hasta 87FFH Desde 9000H hasta 97FFH Desde A000h hasta A7FFH

Al mismo tiempo, los terminales del decodificador 74LS138 que quedan libres para aadir nuevos elementos al sistema, respondern a las siguientes direcciones: CS3 CS4 CS5 CS6 CS7 B000H C000H D000H E000H F000H

_______________________________________ 31 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

2.5 EJERCICIOS.

1.

Explicar el proceso mediante el cual, el 8212 separa la parte baja del bus de direcciones, del bus de datos. Estudiar cmo podra realizarse este proceso mediante el circuito integrado 74LS373 buscando la informacin tcnica oportuna. Estudiar la posible conexin al sistema, de una memoria RAM de doble capacidad que la 6116. Realizar un esquema de conexin e indicar el mapa de memoria. Estudiar la conexin 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 esttica con una RAM dinmica. Funcionamiento de las memorias EPROM. Buscar, entre la literatura tcnica disponible, la configuracin y disposicin de terminales, del mayor nmero posible de memorias RAM y EPROM, indicando la capacidad de cada una de ellas y sus caractersticas de funcionamiento. Explicar la funcin del circuito RC, situado segn se muestra en la FIG.24A, en la patilla 36 del microprocesador 8085. Analizar el sistema diseado en la FIG.24A, especificando la distribucin de direcciones de acceso a cada elemento y las direcciones disponibles para ampliaciones.

2.

3.

4. 5. 6.

7.

8.

_______________________________________ 32 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

LA FUENTE DE ALIMENTACIN

_______________________________________ 33 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

3. LA FUENTE DE ALIMENTACIN.
Para construir un sistema basado en microprocesador, la fuente de alimentacin constituye un pilar bsico en el que debemos apoyarnos para obtener un funcionamiento correcto y estable. Existen en el mercado multitud de diseos de fuentes, cada una de ellas con unas caractersticas determinadas y unas propiedades muy concretas que las hacen ms aptas para unas aplicaciones que para otras. No es nuestro inters profundizar ahora en el estudio de una fuente compleja, sino que nos limitaremos a 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 tensin nica de +5V por lo que en principio sera suficiente con un diseo que nos proporcionara dicha tensin acompaada de un suministro de corriente adecuado. Sin embargo, en previsin de posibles ampliaciones y ante la posibilidad de necesitar otras tensiones estandarizadas, dotaremos a nuestra fuente con las tensiones de +12V y 12V, que tambin suelen ser empleadas frecuentemente.

3.1 EL FILTRO DE ENTRADA.


La entrada de la fuente de alimentacin, es decir, su conexin a red (220 V c.a.), ser efectuada imprescindiblemente mediante un cable de conexin con tres terminales (dos terminales activos y un terminal de toma de tierra). La tensin de red as tomada ser llevada a un doble interruptor que abra las dos lneas activas con suficiente poder de corte. Entre la toma de tensin de red y el interruptor se situar un fusible de 2A, (la potencia consumida por nuestro sistema ser baja) que servir como proteccin general. A continuacin se colocar un filtro de entrada de red que servir para proteger al equipo que vayamos a alimentar de los posibles parsitos de red, pues supondr una barrera para determinadas interferencias de red que pueden resultar muy nocivas para un correcto funcionamiento de los sistemas con microprocesador. Se aadir adems una VDR para eliminar o suavizar picos en la conexin a red del sistema. La tensin as obtenida se acopla al primario de un transformador que suministre la potencia necesaria para nuestro sistema. Normalmente en el primario del transformador se dispone de un conmutador que proporciona la posibilidad de conectar la tensin de entrada a varios puntos del primario de modo que pueda ser conectada a tensiones de 240 V, 220 V, 210 V y 125 V de c.a.

RED (220V)

2A

I1
L Cx Cy Cy L

240 220 210 125


VDR

9 0 14 0 14

L = 08 Mh Cx = 0015 uF Cy = 2200 pF

FIG.31A

_______________________________________ 34 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Todo lo mencionado puede verse en la FIG.31A, en la que se muestra la constitucin 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 obtendrn 9 V de c.a. y el segundo ser un devanado simtrico que suministrar 14 V c.a. en cada parte del mismo.

3.2 LOS RECTIFICADORES.


La rectificacin de una seal alterna consiste bsicamente en la conversin de la misma en una seal 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 basndose en diodos (uniones PN) semiconductores. Los rectificadores ms sencillos construidos con diodos son: 1. Rectificador de media onda: Constituido por un solo diodo, rectifica una sola semionda de la tensin alterna de entrada. Por tanto la corriente que circula por la carga, ser una onda pulsante constituida por medio ciclo de la seal de entrada. Tiene un rendimiento muy bajo, prximo al 40% y su uso est muy limitado. 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 seal del secundario, obteniendo as, en la salida, una tensin pulsante unidireccional de doble frecuencia que la seal de entrada. Tiene un rendimiento prximo al 80% y se obtiene un menor factor de rizado (r=048). Presenta el inconveniente de necesitar un transformador con toma intermedia en el secundario. Adems en este circuito los diodos deben soportar una tensin inversa mxima doble de la mxima tensin del secundario del transformador.

2.

T1 14 D1

RED (220)

14

D2

FIG.32A

3.

Rectificador en puente: Est constituido por cuatro diodos montados en el secundario del transformador segn se muestra en la FIG.32B. Se consiguen rectificar las dos semiondas de la seal de alterna y en cada instante tendremos trabajando dos diodos en serie. La tensin mxima inversa que deben soportar los diodos ser igual a la mxima tensin de la seal del secundario. Ahora no necesitamos emplear un transformador con toma intermedia. Este rectificador es el que emplearemos en el diseo de nuestra fuente y su smbolo 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.

_______________________________________ 35 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

T1 D1
RED (220)

PR1 D2 R

D4

D3

FIG.32B

FIG.32C

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 cada de tensin interna prxima a los 2 V y adems debern soportar la potencia disipada en su interior. Tendrn 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 duracin (puede alcanzar hasta los 10 A). Los diodos debern soportar las tensiones inversas a que sern sometidos cuando estn en estado de bloqueo o polarizacin inversa. Adems es posible que debido a interferencias exteriores se presenten picos de tensin 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 daar los diodos de forma inmediata e irrecuperable. Adems 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 daarse, 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.

3.3 LOS FILTROS DE CONTINUA.


La seal pulsante procedente del rectificador no es an apropiada para llegar a obtener una determinada tensin fija. Se precisa para ello, conseguir una tensin con un factor de rizado mucho ms bajo. Es decir, tenemos que alisar la seal de tensin. Esto se logra empleando los filtros elctricos constituidos a partir de elementos predominantemente reactivos (bobinas y condensadores). Los filtros ms empleados son: Filtro por condensador: Consiste en colocar un condensador electroltico a la salida del rectificador, del modo mostrado en la FIG.33A. El condensador almacena energa mientras los diodos permanecen en estado de conduccin y posteriormente la cede a la carga en los momentos de bloqueo en el puente rectificador. Este filtro proporciona una tensin elevada a la salida (prxima a la de pico en la seal rectificada) y una componente de alterna baja, es decir, un bajo factor de rizado que en este caso responde a una ecuacin de la forma r=091/(wCR)

_______________________________________ 36 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

siendo: R, la resistencia de carga. w, la pulsacin de la seal de entrada. C, la capacidad del condensador.

PR1

FIG.33A

Vemos por tanto, que r es inversamente proporcional a la capacidad del condensador, por lo que para obtener un r pequeo, 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 armnicos de la seal rectificada. Por el contrario, el condensador acta ante los armnicos que llegan a l como un camino de baja impedancia derivndolos 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 seal con menor rizado.

PR1

L R C

FIG.33B

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=012/(w2LC)

_______________________________________ 37 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Adems, para que tengamos circulacin 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, segn se muestra en la FIG.33C. Proporciona mayor nivel de tensin continua en la carga. El factor de rizado mejora, obtenindose en este caso: r = 0107/(w2C1C2LR)

PR1

L R C1 C2

FIG.33C

Vistos de modo casi esquemtico los tipos de filtros que podemos emplear en la construccin de la fuente, no nos queda ms que elegir aquel que realmente nos interese. Para ello debemos tener presente adems la tensin de funcionamiento a que se vern sometidos los condensadores de modo que su tensin nominal sea superior a la de funcionamiento. Los condensadores electrolticos disponibles comercialmente tienen elevadas tolerancias respecto a sus caractersticas nominales, llegando a variaciones hasta del 40%.

3.4 EL REGULADOR DE TENSIN.


El regulador de tensin tiene como misin fundamental transformar una tensin de c.c. aplicada a la entrada, en una tensin de c.c. a la salida que est estabilizada a un valor determinado, que se mantendr aunque la entrada experimente variaciones de tensin o existan variaciones en el consumo de la carga. Bsicamente un regulador est compuesto por una serie de bloques con funciones distintas cuyo objetivo final es la obtencin de la tensin estabilizada. Estos bloques son: Un elemento de referencia que proporciona una tensin estable que el regulador debe seguir. Un elemento convertidor de nivel de tensin que analiza la tensin disponible en la salida del regulador. Un comparador que, como su nombre indica, tiene como funcin establecer una comparacin entre el nivel de la tensin de salida y el nivel de la tensin de referencia, proporcionando una salida que nos indique tal circunstancia. El controlador, que en funcin de la seal proporcionada por el comparador, regula la transformacin del nivel de tensin de entrada, para obtener el nivel de tensin de salida deseado.

En la actualidad existe una gran variedad de reguladores integrados que incorporan estos bloques antes mencionados en su interior, siendo accesibles al usuario tres terminales (Entrada, Salida y Comn). La estructura interna de estos componentes es bastante compleja pero facilita mucho su empleo en aplicaciones que requieren tensiones estabilizadas, fijas y normalizadas como +5V, +12V y 12V. _______________________________________ 38 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Todos los reguladores integrados incorporan circuitos de proteccin contra sobrecargas, cortocircuitos y elevaciones excesivas de la temperatura durante su funcionamiento que puedan hacer superar su lmite trmico.

3.5 FUENTE DE ALIMENTACIN DEFINITIVA.


Para llevar a la prctica la construccin 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 tensin estabilizada de +5V para alimentar a todos los componentes de las tarjetas, para los cuales consideraremos suficiente un consumo nominal de 3A. Adems dejaremos accesible una tensin de +12V continua no necesariamente estabilizada (si filtrada) para alimentar lmparas, etc. dispondremos tambin de dos tensiones de +12V y 12V regulados y estabilizados para futuras aplicaciones. Atendiendo a todas estas caractersticas realizaremos el diseo mostrado en la FIG.35A.

PR1 FAGOR 25A 9 C1

D1 1N4148 L LM323 C2 10000 uF 25V C3 4300 uF 25V D2 1N4148 R1 330 DL1 4A

+12V

+5V

220

0 PR2 14

20000 uF 25V

1A C4 10000 uF 25V C8 2000 uF 25V C5 2000 uF 25V 7812 C6 1000 uF 25V C9 1000uF 25V 7912 D4
4148

+12V

D3 4148

0 0

R2 1K DL2 R3 1K DL3 1A

14

C7 10000 uF 25V

-12V

FIG.35A

Teniendo en cuenta estas consideraciones, elegiremos como regulador de +5V un LM323 que suministra hasta 3A, con una impedancia de salida prxima a 001 ohmios, precisando una tensin de entrada no inferior a 75V y con una capacidad de disipacin de potencia de 30W. Se dispondr en la salida de la fuente de varias lneas de conexin, tanto en masa como a +5V y los cables de conexin sern de seccin elevada y lo ms cortos posibles, con la intencin de producir la mnima cada de tensin. Los reguladores de +12V y 12V, sern elementos como el 7812 y el 7912 respectivamente, que proporcionan corrientes de salida de 1A y disponen internamente de sistemas de proteccin contra

_______________________________________ 39 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

cortocircuitos. Puesto que estas tensiones en principio no sern empleadas ms que en aplicaciones muy concretas y la intensidad que pueden suministrar es baja, no ser necesario emplear varias salidas, como en la alimentacin de +5V, y los cables de conexin no es preciso que sean de seccin elevada. Debemos adems 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 transmitirn al medio ambiente gran parte del calor que tendran que soportar los reguladores y puentes. El sistema de evacuacin del calor puede completarse con la incorporacin a la fuente de un ventilador que provoque una circulacin forzada de aire.

_______________________________________ 40 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

EL SOFTWARE: LAS INSTRUCCIONES.

_______________________________________ 41 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

4. EL SOFTWARE: LAS INSTRUCCIONES.

Los sistemas construidos sobre la base de los microprocesadores, requieren para su puesta en marcha, el desarrollo del software, es decir, el desarrollo de programas que una vez construidos, son almacenados en las memorias permanentes (PROM, EPROM,...) del sistema, donde son buscados por el microprocesador para desarrollar todas las funciones y tareas deseadas. Un programa esta constituido por un conjunto ordenado de instrucciones, que constituyen el cuerpo principal del programa y uno o ms bloques de datos iniciales necesarios para una correcta ejecucin. El proceso bsico de ejecucin de un programa requiere por parte del microprocesador, la repeticin de los siguientes pasos: Leer de la memoria una instruccin del programa. Interpretar la instruccin leda. Ejecutar dicha instruccin.

Debemos considerar adems que los microprocesadores trabajan solamente con lenguaje de bajo nivel, es decir, trabajan con lenguaje mquina. Cada microprocesador o familia de microprocesadores, posee su propio lenguaje mquina que determina las capacidades propias de cada familia. Las instrucciones mquina son almacenadas en la memoria en forma de bytes, es decir, en forma de unos y ceros empleando por tanto el sistema binario de numeracin. Sin embargo este sistema es muy complejo para trabajar directamente con l, por lo que se emplean otros sistemas como el hexadecimal, BCD, etc. para la representacin de datos. Para construir los programas, normalmente se emplean lenguajes de alto nivel, y luego se transforman los programas as escritos a lenguaje mquina asequible para el microprocesador. No obstante en nuestro caso emplearemos un lenguaje de bajo nivel (ensamblador) que trabaja con abreviaturas alfabticas denominadas mnemnicos que constituyen las operaciones e instrucciones que ejecutar el microprocesador. Durante el desarrollo de este tema veremos las principales bases numricas de representacin, as como los diferentes tipos de instrucciones, modos de direccionamiento y se realizar un estudio de todo el repertorio de instrucciones propio del microprocesador 8085. Es conveniente leer todas y cada una de las instrucciones para ir familiarizndose con ellas y entender su modo de funcionamiento. Todo lo tratado aqu, son aspectos bsicos de la programacin que nos permitirn crear programas ejecutables en el sistema electrnico presentado en este libro.

4.1 BASES NUMRICAS DE REPRESENTACIN.

Ya se ha comentado que es el lenguaje mquina el nico que el microprocesador es capaz de tratar, es decir, solamente trabaja con unos y ceros. Este lenguaje resulta inapropiado para las personas, por lo que se desarrollan otros sistemas de representacin ms sencillos o ms cmodos de manejar. En primer lugar debemos fijarnos en que el microprocesador trabaja con bloques de informacin normalizados. Podemos destacar en este terreno: El bit: Como unidad de informacin ms 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 tamao de informacin que el microprocesador puede manejar en paralelo. En funcin de la potencialidad del microprocesador tendremos palabras de 8 bits, 16 bits, 32 bits, etc.

_______________________________________ 42 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Establecido ya el tipo de informacin con el que se va a trabajar, pasamos ahora a ver las bases numricas o de representacin que emplearemos durante la programacin. Las ms 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. Lgicamente este sistema de representacin numrico dispone de diez dgitos (0, 1, 2, 3, 4, 5, 6, 7, 8 y 9). Sistema binario: Solo emplea dos unidades bsicas de representacin (0 y 1). Para encontrar la expresin decimal de cualquier nmero binario, se procede de forma similar al sistema decimal, pero empleando el 2 como base del sistema. Por ejemplo el nmero 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 nmero decimal a binario, puede emplearse un mtodo muy sencillo que consiste en dividir sucesivamente dicho nmero por la base binaria 2. El nmero binario se construye tomando el ltimo cociente y poniendo a continuacin 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 nmeros decimales del 0 al 9. Por tanto para transformar un nmero decimal, no tendremos ms 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 ms que aadir a cada dgito el valor 3, es decir sumar 0011(2. Sistema hexadecimal: Es uno de los ms empleados en programacin. Sus diez primeros dgitos se corresponden con los del sistema decimal y los seis restantes son las seis primeras letras maysculas 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 nmero binario a hexadecimal, agruparemos sus dgitos o bits de cuatro en cuatro y transformaremos cada uno de ellos de forma individual, obteniendo as la representacin en hexadecimal. Por ejemplo: 0011 1010 1111 0110 (2 = 3AF6(16 = 3AF6H Sistema de representacin ASCII: Se trata de un sistema de representacin de datos empleado para facilitar intercambios de informacin. Es uno de los sistemas ms empleados en la actualidad (junto al sistema EBCDIC) . La codificacin se lleva a cabo empleando una palabra de 8 bits, es decir, un octeto para cada carcter de informacin. Para encontrar el valor de un carcter numrico de una representacin ASCII, es suficiente con restar el valor 48 y al contrario para encontrar la representacin ASCII de un dgito decimal habr que sumar 48 (48 = 0011 0000(2 = 30H).

4.2 LOS TIPOS DE INSTRUCCIONES.


Despus de haber tratado de forma superficial los sistemas de representacin, vamos a ver los distintos tipos de instrucciones que utiliza un microprocesador.. Bsicamente puede decirse que el bloque de instrucciones debe ser completo y eficaz de modo que podamos realizar todos los clculos necesarios de la forma ms rpida y precisa posible. Una de las principales caractersticas 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:

_______________________________________ 43 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

1.

Aritmticas: Son las instrucciones que realizan operaciones de tipo aritmtico como sumas, restas, incrementos, decrementos, etc. Todas las operaciones de este tipo afectan al registro de estado, es decir a los flags. Movimiento de datos: Este tipo de instrucciones de movimiento o transferencia de datos, permiten realizar una copia del contenido de un registro o direccin de memoria (origen), en otro registro o direccin de memoria (destino), sin alterar el contenido del origen. Instrucciones lgicas: Realizan operaciones lgicas entre los operandos. Afectan a los flags segn sea el caso y las operaciones se realizan bit a bit entre los datos. Instrucciones de comparacin: Son operaciones de restar o operaciones XOR entre dos operandos. Afectan a los flags pero no se almacena el resultado. Instrucciones de salto: Son instrucciones de modificacin de secuencia que alteran la ejecucin normal del programa, cargando el contador de programa con la nueva direccin en la que deseamos contine ejecutndose el programa. Los saltos o bifurcaciones pueden ser: Condicionales: Cuando son controlados por el estado de un indicador o flag, y basndose en dicho estado se decide si se salta o no. Incondicionales: Cuando modifican el contador de programa sin condicin previa.

2.

3.

4.

5.

Dentro de cada uno de estos tipos, podemos encontrar adems 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 perifricos que permiten la comunicacin del microprocesador con el exterior. Instrucciones de control: Sirven para actuar internamente sobre el microprocesador, provocando detenciones en la ejecucin del programa, etc. Instrucciones de bit: Trabajan o tratan bits independientes. Instrucciones de desplazamiento: Desplazan o rotan hacia la izquierda o hacia la derecha los bits de un registro (Acumulador).

7.

8. 9.

4.3 LOS MODOS DE DIRECCIONAMIENTO.


Los modos de direccionamiento son aquellos procedimientos empleados por el microprocesador para poder acceder a determinados operandos, instrucciones, posiciones de memoria, registros de entrada/salida, etc. Por tanto el objeto del direccionamiento es un valor o dato que se encuentra en un lugar de la memoria, en algn registro o en la propia instruccin. Los diferentes modos de direccionamiento que pueda emplear un microprocesador le proporcionan un determinado nivel de potencialidad, permitindole manejar datos y realizar operaciones con mayor facilidad. En general podemos diferenciar los siguientes tipos o modos de direccionamiento: 1. Direccionamiento inmediato: En este caso el objeto (un operando) se encuentra incluido en la instruccin, es decir, a continuacin del cdigo de la instruccin se aade el operando propiamente dicho. Las instrucciones que emplean este direccionamiento pueden ser de dos o tres bytes y son instrucciones de ejecucin rpida y sencilla. Direccionamiento implcito: Las instrucciones que emplean este modo de direccionamiento tienen un solo byte y es la propia instruccin la que indica qu registro o direccin de memoria se va a utilizar en la operacin.

2.

_______________________________________ 44 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

3.

Direccionamiento absoluto: En este caso las instrucciones incluyen la direccin 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 instruccin apunta a un registro que contiene la informacin deseada (direccionamiento tambin llamado de registro). La instruccin contiene la direccin completa en la que se encuentra el dato, empleando para ello tres bytes. Cuando la instruccin se refiere solo a una parte de la memoria (pgina). En este caso el byte ms alto lo suministra el contador de programa y el byte ms bajo se expresa a continuacin del cdigo de instruccin, por tanto solo se emplean dos bytes (Este direccionamiento tambin se llama de pgina base).

b.

c.

4.

Direccionamiento directo relativo: La instruccin en este caso contiene un valor determinado al que podemos llamar V. La direccin total se calcula sumando a V el valor que est almacenado en un registro al que haga referencia la instruccin. El valor de V puede ser tanto positivo como negativo. Direccionamiento indirecto: La instruccin contiene una direccin a la que llamaremos D1. El contenido de D1 no es el objeto directo de nuestra instruccin, sino que contiene otra direccin que llamaremos D2. Esta nueva direccin D2 es la que contiene el dato que s es objeto de la instruccin.

5.

Expresados ya los modos de direccionamiento con carcter 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 instruccin contiene la direccin exacta y completa donde se encuentra el dato. Por ejemplo: LHLD A716H

Direccionamiento por Registro. La instruccin lleva el registro en el que est el dato que va a ser tratado. Por ejemplo: MOV MOV A,B B,C

Direccionamiento por Registro Indirecto. En la instruccin se especifica un registro cuyo contenido apunta a una direccin de memoria en la que se encuentra el dato. Por ejemplo: MOV A,M

M es una referencia simblica a una direccin de memoria apuntada o sealada por el par de registros HL. Direccionamiento Inmediato. La instruccin contiene el dato con el que se desea operar, pudiendo ser el dato de uno o dos bytes. LXI H,A0B7H ADI 3AH

_______________________________________ 45 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

4.4 CONJUNTO DE INSTRUCCIONES DEL 8085A.

Aunque el conjunto de instrucciones puede encontrarse en cualquier libro que trate este tema especficamente, en este apartado se muestra un "diccionario" de las mismas. La descripcin se relaciona alfabticamente para una localizacin ms inmediata y todas estn descritas de forma detallada. La unidad bsica de tiempo es el "estado", que es un ciclo de reloj (clock). Un "ciclo de mquina" consta de 3 a 6 estados. Las operaciones ms sencillas requieren slo un ciclo de mquina. El "ciclo de instruccin" es el tiempo requerido para ejecutar una instruccin completa y puede constar de 1 a 5 ciclos de mquina. Las instrucciones constan bsicamente de una "fase de bsqueda" y una "fase de ejecucin". En este caso se omiten los grficos de ejecucin de los estados, dado que la velocidad de las operaciones bsicas del procesador dependen de la frecuencia del clock usado en el sistema. Un estado puede oscilar entre los 320 ns y los 2 ns. Sabiendo la duracin de un estado, en un determinado sistema se puede determinar el tiempo de ejecucin de una instruccin cualquiera multiplicando el tiempo de cada estado por el nmero de ellos que contiene cada instruccin. En cada una de las instrucciones que se muestran a continuacin se especificar: El formato de la instruccin. El cdigo objeto de la misma. El nmero de bytes que emplea. Los ciclos necesarios para su ejecucin. Los flags afectados al ejecutarse dicha instruccin. El modo de direccionamiento empleado en la misma.

INSTRUCCIO CODIGO OBJ BYT. CIC FLAGS AFECTADOS DIRECCIONAMIENTO ACI DATA CE YY 2 7 Z,S,P,CY,AC Inmediato Suma el contenido del byte especificado (DATA) en la instruccin, al contenido del acumulador, aadiendo adems el bit del acarreo. El resultado se almacena en el acumulador (perdindose as el anterior contenido del Acumulador). El dato (DATA) debe estar especificado en forma de nmero, en ASCII constante, como etiqueta de un valor previamente definido o una expresin. El dato no debe exceder de un byte.

INSTRUCCIO CODIGOOBJ BYT. CIC FLAGS AFECTADOS ADC reg 1000 1XXX 1 4 Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

Suma el contenido de un registro (reg) con el contenido del acumulador y el bit de acarreo. El resultado queda en el acumulador. El operando (reg) debe especificar uno de los registros del A al E, el H o el L.

_______________________________________ 46 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO ADC M

CODIGO OBJ 8E

BYT. 1

CICL 7

FLAGS AFECTAD Z,S,P,CY,AC

DIRECCIONAMIENTO Registro ndice

Esta instruccin 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 simblica de los registros H y L).

INSTRUCCIO ADD reg

CODIGO OBJ 1000 0XXX

BYT. 1

CICL 4

FLAGS AFECTAD Z,S,P,CY,AC

DIRECCIONAMIENTO 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 operacin).

INSTRUCCIO ADD M

CODIGO OBJ 86

BYT. 1

CICL 7

FLAGS AFECTAD Z,S,P,CY,AC

DIRECCIONAMIENTO Regis indirect

Suma el contenido de la posicin 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 operacin).

INSTRUCCIO ADI DATA

CODIGO OBJ C6 YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Inmediato

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

INSTRUCCIO ANA reg

CODIGO OBJ 1010 0XXX

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

El operando (reg) debe especificar uno de los registros del A al E, el H o el L. Esta instruccin realiza una operacin lgica 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 operacin Y produce un 1 solo cuando los dos bits implicados en la operacin son 1).

INSTRUCCIO ANA M

CODIGO OBJ A6

BYT. 1

CICL 7

FLAGS AFECTADO DIRECCIONAMIENTO Z,S,P,CY,AC Registr indirec

Se realiza un producto lgico (operacin Y) entre el contenido de la posicin 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.

_______________________________________ 47 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO ANI DATA

CODIGO OBJ E6 YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Inmediato

Realiza una operacin Y lgica entre el dato (DATA) especificado en la instruccin 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 nmero, un ASCII constante, la etiqueta de algn valor previamente definido o una expresin.

INSTRUCCIO CODIGO OBJ CALL LABEL CD PPQQ

BYT. 3

CICL 18

FLAGS AFECTADO

DIRECCIONAMIENTO Inmed/Reg Indir

CALL guarda el contenido del contador de programa (la direccin de la prxima instruccin secuencial) dentro del stack y a continuacin salta a la direccin especificada por LABEL. Cada instruccin CALL o alguna de sus variantes implica una instruccin RET (retorno), de lo contrario el programa podra "perderse" con consecuencias impredecibles. La direccin debe ser especificada como un nmero, una etiqueta, o una expresin. La etiqueta es lo ms normal (El assembler invierte los bytes alto y bajo de direccin durante el proceso de ensamblado). Las instrucciones CALL se emplean para llamadas a subrutinas y debemos tener presente que siempre emplean el stack.

INSTRUCCIO CC LABEL

CODIGO OBJ DC PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO 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 continuacin salta a la direccin especificada por LABEL. Si el flag esta a 0, la ejecucin del programa contina con la prxima instruccin de su secuencia normal. Aunque el uso de una etiqueta es lo ms normal, la direccin puede ser especificada tambin como un nmero o una expresin.

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 direccin especificada por LABEL. Si el flag es 0 la ejecucin del programa contina con su secuencia normal. El uso de la etiqueta es lo ms corriente, pero la direccin puede especificarse tambin por un nmero o una expresin.

INSTRUCCIO CMA

CODIGO OBJ 2F

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

La instruccin CMA complementa en contenido del acumulador. No acta ningn flag de condicin. Esta instruccin no emplea operandos. Para realizar el complemento a dos, se suma 1 al contenido del acumulador despus de haber ejecutado la instruccin CMA.

_______________________________________ 48 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO CMC

CODIGO OBJ 3F

BYT. 1

CICL 4

FLAGS AFECTADO CY

DIRECCIONAMIENTO

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 varan.

INSTRUCCIO CMP reg

CODIGO OBJ 1011 1XXX

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

El operando (reg) debe nombrar uno de los registros del A al E, el H o el L. La instruccin 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 estn 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 CMP M

CODIGO OBJ BE

BYT. 1

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

La instruccin compara el contenido de la posicin de memoria direccionada por los registros H y L con el contenido del acumulador. M es una referencia simblica al par de registros HL. La actuacin de los flags es igual a la producida en el caso anterior.

INSTRUCCIO CNC LABEL

CODIGO OBJ D4 PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO 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 continuacin salta a la direccin especificada por la instruccin en LABEL. Si el flag est a 1, el programa contina con su secuencia normal. Aunque el uso de una etiqueta es lo ms comn, la direccin puede tambin estar indicada por un nmero o por una expresin.

INSTRUCCIO CNZ LABEL

CODIGO OBJ C4 PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO 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 direccin especificada por LABEL. Si el flag est a 1 el programa contina su desarrollo normal.

_______________________________________ 49 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO CP LABEL

CODIGO OBJ F4 PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO Inmed/Reg Indir

CP chequea el valor del flag de signo. Si est a 0 (indicando que el contenido del acumulador es positivo), CP enva el contenido del contador de programa al stack y salta a la direccin especificada por LABEL. Si el flag tiene un 1, contina el programa normalmente con la instruccin siguiente.

INSTRUCCIO CPE LABEL

CODIGO OBJ EC PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO Inmedi/Reg Indi

Existe paridad en un byte si el nmero de unos que tiene es par. El flag de paridad se pone a 1 para indicar esta condicin. CPE chequea el valor del flag de paridad. Si tiene un 1, CPE enva el contenido del contador de programa al stack y salta a la direccin especificada por la instruccin en LABEL. Si el flag tiene un cero, el programa contina normalmente.

INSTRUCCIO CPI DATA

CODIGO OBJ FE YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO 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 CPO LABEL

CODIGO OBJ E4 PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO 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 direccin especificada en LABEL. Si el flag est a 1 el programa contina su desarrollo normal.

INSTRUCCIO CZ LABEL

CODIGO OBJ CC PPQQ

BYT. 3

CICL 9/18

FLAGS AFECTADO

DIRECCIONAMIENTO 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 direccin especificada en LABEL. Si el flag est a 0 (indicando que el contenido del acumulador es distinto de cero) el programa contina su desarrollo normal.

_______________________________________ 50 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO DAA

CODIGO OBJ 27

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

La instruccin DAA ajusta el valor de los ocho bits del acumulador para formar dos grupos de cuatro bits binarios codificados en decimal. Esta instruccin no tiene operandos. DAA se emplea cuando deseamos trabajar con nmeros decimales. Es la nica instruccin cuya funcin requiere el uso del flag de acarreo auxiliar. En operaciones aritmticas multi-byte, la instruccin DAA es codificada inmediatamente despus de la instruccin aritmtica, 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 ms 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 ms significativos del acumulador.

INSTRUCCIO DAD RP

CODIGO OBJ 00XX 1001

BYT. 1

CICL 10

FLAGS AFECTADO CY

DIRECCIONAMIENTO 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. Tngase 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 adems no afecta a ningn otro flag.

INSTRUCCIO DCR reg

CODIGO OBJ 00XX X101

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,AC

DIRECCIONAMIENTO Registro

El operando (reg) debe especificar uno de los registros del A al E, el H o el L. La instruccin resta 1 del contenido del registro especificado. Afecta a todos los flags excepto al de acarreo. (Puede usarse dentro de rutinas aritmticas multi-byte para decrementar contadores caractersticos y propsitos similares).

INSTRUCCIO DCR M

CODIGO OBJ 35

BYT. 1

CICL 10

FLAGS AFECTADO Z,S,P,AC

DIRECCIONAMIENTO Registro Indire

Esta instruccin resta 1 del contenido de la posicin de memoria direccionada por el par de registros HL.

INSTRUCCIO DCX RP

CODIGO OBJ 00XX 1011

BYT. 1

CICL 6

FLAGS AFECTADO

DIRECCIONAMIENTO Registro

DCX resta 1 al contenido del par de registro especificado (RP). Dado que DCX no usa ningn 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).

_______________________________________ 51 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO DI

CODIGO OBJ F3

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

Despus de la ejecucin de una instruccin DI, el sistema de "interrupciones" esta sin posibilidad de ponerse en marcha. En aplicaciones que empleen las interrupciones, la instruccin 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 instruccin DI el principio del cdigo de secuencia. La interrupcin TRAP del 8085 no puede ser puesta fuera de servicio. Esta interrupcin especial esta prevista para serios problemas que pueden presentarse independientemente del flag de interrupcin (fallo de alimentacin, etc.).

INSTRUCCIO EI

CODIGO OBJ FB

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

La instruccin EI pone en servicio el sistema de interrupciones a partir de la siguiente instruccin secuencial del programa. Se puede desconectar el sistema de interrupciones poniendo una instruccin DI al principio de una secuencia, puesto que no se puede predecir la llegada de una interrupcin. Al final de la secuencia se incluye la instruccin EI que vuelve a habilitar el sistema de interrupciones. (RESET tambin pone fuera de servicio el sistema de interrupciones adems de poner el contador de programa a cero).

INSTRUCCIO HLT

CODIGO OBJ 76

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

La instruccin HLT detiene el procesador. El contador de programa contiene la direccin de la prxima instruccin 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 interrupcin. Por tanto debemos asegurarnos que las interrupciones estn en disposicin de ser activadas antes de ejecutar la instruccin 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 travs de la interrupcin 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 propsito bsico de la instruccin HLT es permitir una pausa al procesador mientras espera por la interrupcin de un perifrico.

INSTRUCCIO IN PORT

CODIGO OBJ DB YY

BYT. 2

CICL 10

FLAGS AFECTADO

DIRECCIONAMIENTO Directo

La instruccin 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 nmero o una expresin que produzca un valor comprendido entre 00H y FFH.

_______________________________________ 52 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO INR reg

CODIGO OBJ 00XX X100

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,AC

DIRECCIONAMIENTO Registro

El operando (reg) debe especificar uno de los registros del A al E, el H o el L. La instruccin suma 1 al contenido del registro especificado.

INSTRUCCIO INR M

CODIGO OBJ 34

BYT. 1

CICL 10

FLAGS AFECTADO Z,S,P,AC

DIRECCIONAMIENTO Registro Indire

La instruccin suma 1 al contenido de la direccin de memoria sealada por el par de registros HL. M es una referencia simblica a los registros H y L.

INSTRUCCIO INX RP

CODIGO OBJ 00XX 0011

BYT. 1

CICL 6

FLAGS AFECTADO

DIRECCIONAMIENTO Registro

La instruccin INX suma 1 al par de registros especificado. No afecta a ningn flag. Puede usarse para incrementar los pares de registros BC, DE, HL y SP. (Cuidado al incrementar SP).

INSTRUCCIO JC LABEL

CODIGO OBJ DA PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JC LABEL comprueba el valor del flag de acarreo. Si es un 1 la ejecucin del programa contina en la direccin especificada por LABEL. Si es un 0 el programa contina su ejecucin normal de forma secuencial.

INSTRUCCIO JM LABEL

CODIGO OBJ FA PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JM LABEL comprueba el estado del flag de signo. Si el contenido del acumulador es negativo (flag de signo = 1) la ejecucin del programa contina en la direccin especificada por LABEL. Si el contenido del acumulador es positivo (flag de signo = 0) contina la ejecucin de la secuencia normal.

INSTRUCCIO JMP LABEL

CODIGO OBJ C3 PPQQ

BYT. 3

CICL 10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JMP LABEL altera la ejecucin del programa cargando el valor especificado por LABEL en el contador de programa.

_______________________________________ 53 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO JNC LABEL

CODIGO OBJ D2 PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JNC LABEL comprueba el estado del flag acarreo. Si esta a 0 el programa cambia a la direccin especificada por LABEL. Si esta a 1 la ejecucin del programa contina normalmente.

INSTRUCCIO JNZ LABEL

CODIGO OBJ C2 PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JNZ LABEL comprueba el valor del flag de cero. Si el contenido del acumulador no es cero (Flag de cero = 0) el programa contina en la direccin especificada por LABEL. Si el contenido del acumulador es cero (Flag de cero = 1) el programa contina su ciclo normal.

INSTRUCCIO JP LABEL

CODIGO OBJ F2 PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JP LABEL comprueba el estado de flag del signo. Si el contenido del acumulador es positivo (flag de signo = 0) la ejecucin del programa contina con la direccin especificada por LABEL. Si el contenido del acumulador es negativo (flag de signo = 1) contina el programa con su ejecucin normal.

INSTRUCCIO JPE LABEL

CODIGO OBJ EA PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La paridad existe si el byte que esta en el acumulador tiene un nmero par de bits. El flag de paridad se pone a 1 para indicar esta condicin. La instruccin JPE LABEL comprueba la situacin del flag de paridad. Si esta a 1, la ejecucin del programa contina en la direccin especificada por LABEL. Si esta a 0, contina con la siguiente instruccin de forma secuencial. Las instrucciones JPE y JPO son especialmente usadas para comprobar la paridad de los datos de entrada. (Sin embargo con la instruccin IN los flags no actan. Esto puede evitarse sumando 00H al acumulador para activarlos).

INSTRUCCIO JPO LABEL

CODIGO OBJ E2 PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JPO LABEL comprueba el estado del flag de paridad. Si esta a 0, el programa contina en la direccin marcada por LABEL. Si est a 1 contina con la secuencia normal.

_______________________________________ 54 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO JZ LABEL

CODIGO OBJ CA PPQQ

BYT. 3

CICL 7/10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmediato

La instruccin JZ LABEL comprueba el flag de cero. Si est a 1 el programa contina en la direccin expresada por LABEL. Si est a 0 contina con la ejecucin secuencial normal.

INSTRUCCIO LDA ADDR

CODIGO OBJ 3A PPQQ

BYT. 3

CICL 13

FLAGS AFECTADO

DIRECCIONAMIENTO Directo

LDA ADDR carga el acumulador con el contenido de la memoria direccionada por ADDR. La direccin puede ser puesta como un nmero, una etiqueta previamente definida o una expresin.

INSTRUCCIO LDAX RP

CODIGO OBJ 000X 1010

BYT. 1

CICL 7

FLAGS AFECTADO

DIRECCIONAMIENTO Registro indire

LDAX RP carga el acumulador con una copia del byte almacenado en la localizacin 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 LHLD ADDR

CODIGO OBJ 2A PPQQ

BYT. 3

CICL 16

FLAGS AFECTADO

DIRECCIONAMIENTO Directo

LHLD ADDR carga el registro L con una copia del byte almacenado en la posicin de memoria especificada por ADDR. Despus carga el registro H con una copia del byte almacenado en la posicin siguiente de memoria especificada por ADDR. La instruccin 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 instruccin 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 instruccin inmediata que acepta un valor de 16 bits. El resto trabajan con datos de 8 bits.

INSTRUCCIO MOV reg,reg

CODIGO OBJ 01dddsss

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO 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.

_______________________________________ 55 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO MOV M,reg

CODIGO OBJ 0111 0sss

BYT. 1

CICL 7

FLAGS AFECTADO

DIRECCIONAMIENTO Registro Indire

Copia el contenido del registro especificado en la posicin 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 MOV reg,M

CODIGO OBJ 01dd d110

BYT. 1

CICL 7

FLAGS AFECTADO

DIRECCIONAMIENTO Reggist.Indirec

Copia el contenido de la posicin de memoria direccionada por los registros H y L en el registro especificado. El primer operando debe especificar el registro deseado como destino.

INSTRUCCIO MVI reg,DAT

CODIGO OBJ BYT. 00ddd110 YY 2

CICL 7

FLAGS AFECTADO

DIRECCIONAMIENTO 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 MVI M,DATA 36 YY

BYT. 2

CICL 10

FLAGS AFECTADO

DIRECCIONAMIENTO Inmedi/Reg Indi

Esta instruccin carga el dato especificado por DATA en la posicin de memoria direccionada por el par HL.

INSTRUCCIO NOP

CODIGO OBJ 00

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

NOP no realiza ninguna operacin y no afecta a ninguno de los flags de condicin. Se emplea normalmente para completar ciclos de lazo.

INSTRUCCIO ORA reg

CODIGO OBJ 1011 0XXX

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

El operando debe especificar uno de los registros del A al E, el H o el L. Esta instruccin realiza una operacin lgica "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.

_______________________________________ 56 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO ORA M

CODIGO OBJ B6

BYT. 1

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Reg Indirecto

Realiza una operacin "O" entre el contenido de la direccin 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 ORI DATA

CODIGO OBJ F6 YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Inmediato

ORI desarrolla una operacin lgica "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 OUT PORT

CODIGO OBJ D3 YY

BYT. 2

CICL 10

FLAGS AFECTADO

DIRECCIONAMIENTO 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 nmero de puertos oscila de 0 a 255 y es duplicado en el bus de direcciones. Es la lgica externa la encargada de seleccionar el puerto y aceptar el dato de salida. El operando (PORT) debe especificar el nmero del puerto de salida seleccionado.

INSTRUCCIO PCHL

CODIGO OBJ E9

BYT. 1

CICL 6

FLAGS AFECTADO

DIRECCIONAMIENTO Registro

PCHL carga el contenido de los registros H y L en el contador de programa. Como el procesador busca la siguiente instruccin en la siguiente direccin del contador de programa, PCHL tiene el efecto de una instruccin de salto. El contenido de H va a los 8 bits ms altos de contador de programa y el contenido de L va a los 8 bits ms bajos.

INSTRUCCIO POP RP

CODIGO OBJ 11XX 0001

BYT. 1

CICL 10

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

POP RP copia el contenido de la posicin de memoria direccionada por el stack pointer en el registro de bajo orden del par de registros especificados. A continuacin se incrementa el stack pointer en 1 y copia el contenido de la direccin resultante en el registro de ms 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 localizacin de memoria especificada por el stack pointer para restablecer los flags de condiciones.

_______________________________________ 57 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO PUSH RP

CODIGO OBJ 11XX 0101

BYT. CICL 1 12

FLAGS AFECTADO

DIRECCIONAMIENTO 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 direccin resultante. A continuacin se resta otra vez 1 al stack pointer y se copia el registro de bajo orden en la direccin resultante. Los registros permanecen invariables.

INSTRUCCIO RAL

CODIGO OBJ 17

BYT. 1

CICL 4

FLAGS AFECTADO CY

DIRECCIONAMIENTO

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 RAR

CODIGO OBJ 1F

BYT. 1

CICL 4

FLAGS AFECTADO CY

DIRECCIONAMIENTO

RAR rota el contenido del acumulador y del flag de acarreo 1 bit de posicin a la derecha. El flag de acarreo que es tratado como si fuera parte del acumulador se transfiere al bit de ms alto orden del acumulador. El bit de menor peso del acumulador se carga en el flag de acarreo. No existen operandos en la instruccin RAR.

INSTRUCCIO RC D8

CODIGO OBJ 1 6/12

BYT. CICL FLAGS AFECTADO Reg. Indirecto

DIRECCIONAMIENTO

La instruccin RC comprueba el estado del flag de acarreo. Si tiene un 1 (indicando que hay acarreo) la instruccin saca dos bytes del stack y los mete en el contador de programa. El programa contina en la nueva direccin suministrada. Si el flag es 0, el programa contina en la siguiente instruccin de la secuencia normal.

INSTRUCCIO RET

CODIGO OBJ C9

BYT. 1

CICL 10

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

La instruccin RET echa fuera dos bytes de datos del stack y los mete en el registro contador de programa. El programa contina entonces en la nueva direccin. Normalmente RET se emplea conjuntamente con CALL.

_______________________________________ 58 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO RIM

CODIGO OBJ 20

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

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 = Interrupcin 7.5 pendiente si esta a 1 I6.5 = Interrupcin 6.5 pendiente si esta a 1 I5.5 = Interrupcin 5.5 pendiente si esta a 1 IE = Las interrupciones son autorizadas si es 1 M7.5 = La interrupcin 7.5 est prohibida si est a 1 M6.5 = La interrupcin 6.5 est prohibida si est a 1 M5.5 = La interrupcin 5.5 est prohibida si est a 1

INSTRUCCIO RLC

CODIGO OBJ 07

BYT. 1

CICL 4

FLAGS AFECTADO CY

DIRECCIONAMIENTO

RLC rota un bit hacia la izquierda todo el contenido del acumulador, transfiriendo el bit de ms alto orden al flag de acarreo y al mismo tiempo a la posicin de menor orden del acumulador.

INSTRUCCIO RM F8

CODIGO OBJ 1 6/12

BYT. CICL FLAGS AFECTADO Reg. Indirecto

DIRECCIONAMIENTO

La instruccin RM comprueba el flag de signo. Si tiene un 1, indicando dato negativo en el acumulador, la instruccin echa dos bytes fuera del stack y los mete en el contador de programa. Si el flag tiene 0, contina el programa normal con la siguiente instruccin.

INSTRUCCIO RNC

CODIGO OBJ D0

BYT. 1

CICL 6/12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

La instruccin RNC comprueba el flag de acarreo. Si est a 0 indicando que no hay acarreo, la instruccin echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag est a 1 contina el ciclo normal.

INSTRUCCIO RNZ

CODIGO OBJ C0

BYT. 1

CICL 6/12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

La instruccin RNZ comprueba el flag cero. Si est a 0, indicando que el contenido del acumulador no es cero, la instruccin echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag est a 1, contina el ciclo normal.

_______________________________________ 59 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO RP

CODIGO OBJ F0

BYT. 1

CICL 6/12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

La instruccin RP comprueba el flag signo. Si est a 0, indicando que el contenido del acumulador es positivo, la instruccin echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag est a 1 contina el ciclo normal.

INSTRUCCIO RPE

CODIGO OBJ E8

BYT. 1

CICL 6/12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

La instruccin RPE comprueba el flag de paridad. Si est a 1, indicando que existe paridad, la instruccin echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag est a 0 contina el ciclo normal. (Existe paridad si el byte que est en el acumulador tiene un nmero par de bits, colocndose el flag de paridad a 1 en este caso).

INSTRUCCIO RPO

CODIGO OBJ E0

BYT. 1

CICL 6/12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

La instruccin RPO comprueba el flag de paridad. Si est a 0, indicando que no hay paridad, la instruccin echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag est a 1, contina el ciclo normal.

INSTRUCCIO RRC

CODIGO OBJ 0F

BYT. 1

CICL 4

FLAGS AFECTADO CY

DIRECCIONAMIENTO

RRC rota el contenido del acumulador un bit a la derecha, transfiriendo el bit de ms bajo orden a la posicin de ms alto orden del acumulador, adems pone el flag de acarreo igual al bit de menor orden del acumulador.

INSTRUCCIO RST N

CODIGO OBJ 11XX X111

BYT. 1

CICL 12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

Es una instruccin CALL para usar con interrupciones. RST carga el contenido del contador de programa en el stack, para proveerse de una direccin de retorno y salta a una de las "ocho" direcciones determinadas previamente. Un cdigo de tres bits incluido en el cdigo de operacin de la instruccin RST especifica la direccin de salto. Esta instruccin es empleada por los perifricos cuando intentan una interrupcin. La instruccin RST tiene el siguiente formato:

1 1 C C C 1 1 1
Luego segn la combinacin de 0 y 1 que demos a C C C obtendremos los distintos formatos y las distintas direcciones de las interrupciones, que sern:

_______________________________________ 60 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

FORMATO 1100 0111 1100 1111 1101 0111 1101 1111 1110 0111 1110 1111 1111 0111 1111 1111

RST C7 CF D7 DF E7 EF F7 FF

CONTADOR DE PROGRAMA 0000 0000 0000 0000 0000H 0000 0000 0000 1000 0008H 0000 0000 0001 0000 0010H 0000 0000 0001 1000 0018H 0000 0000 0010 0000 0020H 0000 0000 0010 1000 0028H 0000 0000 0011 0000 0030H 0000 0000 0011 1000 0038H

INSTRUCCIO RZ

CODIGO OBJ C8

BYT. 1

CICL 6/12

FLAGS AFECTADO

DIRECCIONAMIENTO Reg.Indirecto

La instruccin RZ comprueba el flag de cero. Si est a 1, indicando que el contenido del acumulador es cero, la instruccin echa fuera del stack dos bytes y los carga en el contador de programa. Si el flag est a 0, contina el ciclo normal.

INSTRUCCIO SBB reg

CODIGO OBJ 1001 1XXX

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO 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 SBB M

CODIGO OBJ 9E

BYT. 1

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Reg. Indirecto

Esta instruccin resta el flag de acarreo y el contenido de la posicin de memoria direccionada por los registros H y L, del contenido del acumulador y deja el resultado en el acumulador.

INSTRUCCIO SBI DATA

CODIGO OBJ DE YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Inmediato

SBI resta el contenido de DATA y el flag de acarreo, del contenido del acumulador, dejando el resultado en el acumulador.

INSTRUCCIO SHLD ADDR

CODIGO OBJ 22 PPQQ

BYT. 3

CICL 16

FLAGS AFECTADO

DIRECCIONAMIENTO Directo

SHLD almacena una copia del registro L en la posicin de memoria especificada por ADDR, a continuacin almacena una copia del registro H en la siguiente posicin de memoria (ADDR+1). SHLD es una instruccin proyectada para salvar el contenido del par HL.

_______________________________________ 61 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO SIM

CODIGO OBJ 30

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO

SIM es una instruccin de usos mltiples 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 instruccin 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 estn autorizados. M7.5 = Si es 1 la interrupcin 7.5 queda prohibida. M6.5 = Si es 1 la interrupcin 6.5 queda prohibida. M5.5 = Si es 1 la interrupcin 5.5 queda prohibida. Si el bit 3 se pone a 1, la funcin poner "mask" se pone enable (permitida). Los bits 0 al 2 ponen en servicio la correspondiente interrupcin RST colocando un 0 en la interrupcin que deseamos habilitar. Si colocamos un 1 en alguno de los bits 0 al 2, la interrupcin 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 instruccin DI anula la SIM). Si el bit 6 (SOE) se pone a 1 se habilita la funcin de salida serie. El bit 7 se sita en la salida SOD donde puede ser tratado por los aparatos perifricos. Si el bit 6 se pone a cero, el bit 7 no tendr efecto alguno, siendo ignorado.

INSTRUCCIO SPHL

CODIGO OBJ F9

BYT. 1

CICL 6

FLAGS AFECTADO

DIRECCIONAMIENTO

SPHL carga el contenido de los registros H y L en el stack.

INSTRUCCIO STA ADDR

CODIGO OBJ 32 PPQQ

BYT. 3

CICL 13

FLAGS AFECTADO

DIRECCIONAMIENTO Directo

STA ADDR almacena una copia del contenido actual del acumulador en la posicin de memoria especificada por ADDR.

INSTRUCCIO STAX RP

CODIGO OBJ 000X 0010

BYT. 1

CICL 7

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

STAX RP almacena una copia del contenido del acumulador en la posicin de memoria direccionada por el par de registros especificados por RP (Par BC o par DE).

_______________________________________ 62 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO STC

CODIGO OBJ 37

BYT. 1

CICL 4

FLAGS AFECTADO CY

DIRECCIONAMIENTO

STC pone el flag de acarreo a 1. No afecta a otro flag.

INSTRUCCIO SUB reg

CODIGO OBJ 001 0xxx

BYT. 1

CICL 4

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Registro

El operando debe especificar uno de los registros del A al E, el H o el L. La instruccin resta el contenido del registro especificado del contenido del acumulador, usando representacin de los datos en complemento a dos. El resultado es almacenado en el acumulador.

INSTRUCCIO SUB M

CODIGO OBJ 96

BYT. 1

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Reg. Indirecto

La instruccin resta el contenido de la posicin de memoria direccionada por los registros H y L del contenido del acumulador. El resultado es almacenado en el acumulador.

INSTRUCCIO SUI DATA

CODIGO OBJ D6 YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY.AC

DIRECCIONAMIENTO Inmediato

SUI DATA resta el contenido de DATA del contenido del acumulador y almacena el resultado en el acumulador. La instruccin SUI utiliza el flag de acarreo durante la sustraccin, pero acciona dicho flag para indicar la salida de la operacin.

INSTRUCCIO XCHG

CODIGO OBJ EB

BYT. 1

CICL 4

FLAGS AFECTADO

DIRECCIONAMIENTO Registro

XCHG cambia el contenido de los registros H y L con el contenido de los registros D y E.

INSTRUCCIO XRA reg

CODIGO OBJ 010 1XXX

BYT. 1

CICL 4

FLAGS AFECTADO DIRECCIONAMIENTO Z,S,P,CY,AC Registro

Esta instruccin 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).

_______________________________________ 63 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INSTRUCCIO XRA M

CODIGO OBJ AE

BYT. 1

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO Reg. Indirecto

Se realiza una O exclusiva entre el contenido de la posicin 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 instruccin XRA A pone a cero el acumulador).

INSTRUCCIO XRI DATA

CODIGO OBJ EE YY

BYT. 2

CICL 7

FLAGS AFECTADO Z,S,P,CY,AC

DIRECCIONAMIENTO 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 XTHL

CODIGO OBJ E3

BYT. 1

CICL 16

FLAGS AFECTADO

DIRECCIONAMIENTO Reg. Indirecto

XTHL cambia los dos bytes de la posicin ms 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 posicin de memoria especificada por el stack pointer y el registro H es intercambiado con el contenido del SP+1.

4.5 EMPLEO DE ALGUNAS INSTRUCCIONES.

En el desarrollo de este apartado veremos el uso o empleo de diferentes instrucciones del microprocesador 8085, intentando en su exposicin, realizar una divisin o clasificacin de las mismas segn se trate de instrucciones aritmticas, lgicas, de transferencia, de salto, etc. El echo de que se planteen determinadas soluciones para obtener un resultado deseado, no quiere decir que no existan otras posibles alternativas. 1. Aritmticas.

Para efectuar la suma entre el contenido del acumulador y el contenido de una direccin de memoria especificada por la expresin DIRE, podemos hacer

LXI H,DIRE ADD M

; HL = DIRE ; Acumulador = Acumulador + M

Donde M representa el contenido de la direccin de memoria apuntada por el par de registros HL. Si adems de sumar los contenidos de acumulador y direccin de memoria, deseamos tambin sumar el CARRY, podremos hacer

_______________________________________ 64 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 continuacin proceder a realizar el ajuste decimal tal como se muestra a continuacin ADD C DAA ; Acumulador = Acumulador + reg.C ; Efecta el ajuste decimal

Para sumar tambin el CARRY, adems de acumulador y registro C, tendremos que hacer ADC C DAA ; Acumulador = Acumulador + reg.C + CARRY ; Efecta el ajuste decimal

Cuando deseemos sumar dos nmeros 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 DAD B ; BC = NUME ; HL = HL + BC

Para poder sumar tambin el CARRY tendremos que realizar la siguiente modificacin LXI B,NUME JNC SUMA INX H DAD B

SUMA

Supongamos ahora que deseamos sumar dos nmeros de 16 bits, estando situado el primer nmero en las direcciones NUM1 y NUM1+1 (contiguas), y el segundo nmero en las direcciones NUM2 y NUM2+1 (contiguas). Para realizar esta operacin podemos proceder del modo siguiente LHLD NUM1 XCHG LHLD NUM2 DAD D ; HL = direccin del nmero 1 ; DE = HL ; HL = direccin del nmero 2 ; HL = HL + DE

Si necesitamos efectuar una operacin de resta, entre el contenido del acumulador y el contenido de una direccin de memoria representada por DIRE, podemos emplear las instrucciones LXI H,DIRE SUB M En caso de querer hacer una operacin de resta entre el contenido del acumulador y el contenido de un registro, por ejemplo el C, procederemos como sigue MOV B,A MVI A,100 SUB C ADD B DAA ; Guardar acumulador en el registro B ; Acumulador = 100 ;A=AC ;A=A+B ; Ajuste decimal

Para incrementar el contenido de una direccin de memoria, sealada por DIRE, en una unidad, podremos lograrlo con las instrucciones LXI H,DIRE INR M

_______________________________________ 65 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Por el contrario, para decrementar en una unidad el contenido de la mencionada direccin de memoria, haremos LXI H,DIRE DCR M Si necesitramos ahora decrementar en una unidad, un dato de 16 bits almacenado en posiciones de memoria consecutivas marcadas por DIRE y DIRE+1, tendramos que proceder del modo siguiente LHLD DIRE DCX H SHLD DIRE ; Cargar HL con el dato de 16 bits ; Decrementar el par HL ; 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 ms que repetir dos veces la operacin de suma anterior, es decir ADD A ADD A En caso de necesitar dividir por cuatro el contenido de una direccin 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 direccin de memoria (DIRE) se puede implementar la siguiente serie de instrucciones LXI H,DIRE MOV A,M XRA C Como sabemos, la funcin 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 INR A ; Complementa el acumulador ; 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

_______________________________________ 66 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

CMA MOV E,A INX D 2. Lgicas.

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 instruccin de operacin lgica AND con la mscara apropiada. En este caso podramos hacer MOV A,E ANI 11010111B MOV E,A ; Carga el registro E en el acumulador ; Operacin AND con el acumulador

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 operacin lgico 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 direccin 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 mscara de interrupciones con un DATO determinado para establecer cuales sern las interrupciones activadas y cuales no MVI A,DATO SIM Cuando necesitemos almacenar un DATO en la direccin de memoria sealada 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 STC ; Pone a cero el CARRY ; Pone a uno el CARRY

_______________________________________ 67 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

4.

Saltos.

Cuando deseemos cargar en el Contador de Programa una direccin determinada, con lo que pasaremos a ejecutar el programa en dicha direccin, podemos hacer LXI H,DIRE PCHL Para saltar a una direccin 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 direccin de memoria DIRE, cuando el dato contenido en el registro D sea igual al valor almacenado en la direccin 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 instruccin 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 accin sobre los registros del microprocesador ni efectuar ningn tipo de operacin, 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 mscara de interrupciones (la interrupcin TRAP no es

_______________________________________ 68 ___________________________________________

____________________ 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 interrupcin 7.5. Procederemos como sigue MVI A,00001100B SIM

4.6 EJERCICIOS.

1. 2.

Analizar los sistemas de representacin numrica decimal, binario, hexadecimal, BCD y ASCII. Dados los nmeros 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 operacin lgica Y. Enumerar las instrucciones del 8085 que realicen la operacin lgica O. Enumerar las instrucciones del 8085 que realicen saltos.

3. 4.

5.

6. 7. 8. 9.

10. Explicar las instrucciones IN y OUT de comunicacin con el exterior.

_______________________________________ 69 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

LA PROGRAMACIN.

_______________________________________ 70 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

5. LA PROGRAMACIN.

Despus de haber tratado y examinado el repertorio de instrucciones del microprocesador, vamos a introducir algunas cuestiones bsicas y primordiales sobre la metodologa de la programacin, que nos faciliten el desarrollo de programas aplicables a nuestro sistema fsico. Planteamos aqu la base de la programacin estructurada que nos ayudar a construir programas ms o menos complejos, que se apoyarn en unidades o bloques ms elementales para a partir de ellos obtener otros ms largos y complicados. Se obtendrn algoritmos que no dependern en absoluto de ningn lenguaje de programacin en concreto y que posteriormente sern convertidos al lenguaje deseado en cada caso (para nosotros el ensamblador). El proceso de programacin debe desarrollarse partiendo de unas ideas que deben ser perfectamente asimiladas, comprendidas y organizadas por la persona o personas que vayan a construir el programa en cuestin. Esto lleva implcita la disminucin de errores durante el proceso programador, por lo que se facilita enormemente la tarea. El objetivo final de la programacin ser, adems de conseguir programas que funcionen correctamente y sean eficientes, proporcionar sobre ellos toda la documentacin necesaria. Debe tenerse en cuenta que un programa indebidamente documentado sera muy difcil de modificar en un futuro, o al menos podra resultar tan costoso que nos hara renunciar a tal propsito.

5.1 EL ALGORITMO.
Puede decirse que un algoritmo no es ms que un mtodo que vamos a utilizar para resolver un problema o mejor an para resolver un tipo de problemas. Para afrontar la construccin de un programa determinado, resulta esencial conocer de un modo preciso el problema que se desea resolver y los datos iniciales de los que se dispone para, a travs del algoritmo, describir exactamente y con la mayor precisin posible, la secuencia de pasos a seguir hasta llegar a la solucin deseada. El algoritmo debe ser construido mediante la especificacin de un proceso que muestre de forma clara la relacin entre los estados iniciales y los estados o resultados finales. Los elementos que componen una especificacin son fundamentalmente: 1. 2. 3. 4. 5. El nombre del algoritmo que se desarrolla. La funcin o tarea que realiza lo ms clara posible. Las condiciones iniciales (precondiciones). Los estados finales una vez ejecutado el algoritmo (postcondiciones). La exposicin de las variables que intervienen.

Las especificaciones que se realicen deben ser claras y precisas de forma que no quede lugar a ambigedades y deben ser propuestas de la forma ms general posible. Puede suceder que en determinados algoritmos no sea necesario exponer de forma explcita todos los elementos de la especificacin. Los programas que trataremos, en general, se desarrollaran de forma lineal o secuencial, es decir, ejecutaremos las instrucciones en el orden programado, aunque dispondremos de los medios adecuados para romper esta secuencia y continuar la ejecucin en otro punto del programa que nos interese. Podremos _______________________________________ 71 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

tambin en circunstancias concretas, establecer determinados bloques o conjuntos de instrucciones que se repitan cclicamente un estipulado nmero de veces, incluso determinadas partes del programa podrn ejecutarse o no en funcin de que se cumplan ciertos condicionamientos. Cuando se pretende resolver un problema mediante la programacin, 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 solucin nica en el momento de construir un algoritmo. Fundamentalmente debemos conseguir que todos los algoritmos construidos renan las siguientes caractersticas: Que sean fcilmente comprensibles para quien pretenda leerlos. Deben obtener el resultado deseado de forma rpida. Deben ocupar el menor espacio posible. Es conveniente que el programa se encuentre subdividido en programas ms elementales, es decir, el programa debe ser modular. Adems debe ser razonablemente fcil de modificar. A esto ayuda la modularidad y la documentacin que acompae al programa (la informacin que suministra la documentacin es muy importante en los procesos de modificaciones).

Existen diversas formas de abordar la construccin de un algoritmo, desde la realizacin de tablas de decisin que nos sealan las distintas cuestiones planteadas y nos apuntan a las acciones a tomar, pasando por la realizacin de los diagramas de flujo que nos resuelven el problema grficamente, las especificaciones formales que pretenden introducir un lenguaje ms preciso y matemtico que anule en lo posible las indefiniciones y los errores, hasta la utilizacin conjunta del lenguaje comn y palabras clave, constituyendo lo que se llama el pseudocdigo. Debe entenderse que cada uno de estos mtodos de construccin de algoritmos tiene sus ventajas e inconvenientes. Por ejemplo, es claro que para resolver un problema pequeo, puede resultar muy sencillo e ilustrativo emplear el diagrama de flujo. Sin embargo, si el problema es mucho ms complejo, este mtodo podra resultar muy dificultoso, nos causara muchos problemas si tuviramos que realizar alguna modificacin e incluso podra llegar a no ser utilizable dependiendo del nivel de dificultad. En ocasiones puede ser interesante utilizar una mezcla de dos mtodos, siempre que nos facilite la tarea de programar. Nosotros emplearemos los diagramas de flujo siempre que sea posible y el pseudocdigo, todo ello con vistas al paso posterior, que ser la codificacin del algoritmo en lenguaje ensamblador.

5.2 LOS PSEUDOCDIGOS.


Como se ha mencionado anteriormente, al emplear el pseudocdigo para la construccin de un algoritmo, se utiliza una mezcla entre el lenguaje comn y determinadas instrucciones cruciales que veremos a continuacin. Hay que recordar que este procedimiento empleado en la creacin de los algoritmos no siempre puede seguir una estructura rgida, debiendo adaptarnos al problema concreto que estemos tratando. Al objeto de ir concretando algo ms 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 harn referencia a determinados registros o posiciones de memoria que contienen los datos precisos para ejecutar ese algoritmo.

_______________________________________ 72 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Las condiciones finales (postcondiciones) harn referencia al modo de obtencin del resultado de la ejecucin, dnde queda almacenado un dato o resultado, como se ejecuta una accin, registros modificados durante la ejecucin, direcciones de memoria alteradas, etc. Puede decirse, por tanto, que la estructura bsica de un algoritmo ser del tipo que a continuacin se

muestra: NOMBRE: FUNCION: PRECONDICIONES: POSTCONDICIONES: VARIABLES:

.............................................. .............................................. CUERPO DEL PROGRAMA .............................................. .............................................. FINAL

La instruccin ms elemental y bsica que se emplea en el diseo de algoritmos es la de asignacin, que consiste en dar un determinado valor a una variable. Esta operacin se realiza simblicamente 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 composicin secuencial de instrucciones, es decir, en la ejecucin 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 obtendrn unas postcondiciones concretas (Po1). Si ahora estas postcondiciones nos sirven como precondiciones (Po1=Pr2) para ejecutar a continuacin 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), producindose de esta manera la asociacin de instrucciones. Sin embargo este proceso de composicin secuencial no proporciona los medios adecuados o suficientes para desarrollar algoritmos que nos exijan un mnimo de complejidad. Disponemos entonces de una serie de acciones o mecanismos que nos permiten variar o modificar el desarrollo de una secuencia en funcin de alguna caracterstica determinada. Entre estas acciones destacan: Las decisiones: Constituyen una nueva estructura que nos permite ejecutar o no, una parte del programa, atendiendo a determinada condicin. Este tipo de estructura responde a la siguiente notacin:

SI condicin Instruccin 1 Instruccin 2 Instruccin 3 .................... Instruccin N FIN DE SI

_______________________________________ 73 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Al ejecutar el programa, cuando se llega a este punto condicional, nuestro microprocesador comprobar si se cumple la condicin. Si la respuesta es positiva se ejecutan las instrucciones pertenecientes al condicional SI (Instruccin 1, Instruccin 2, ..., Instruccin N) y a continuacin prosigue con el resto del programa que exista despus de FIN DE SI. En caso de que no se cumpla la condicin, no se ejecutarn las instrucciones del condicional SI y el microprocesador continuar la ejecucin del programa que sigue a FIN DE SI. (Debemos recordar ahora algunas de las instrucciones del 8085 y fijarnos que la comprobacin de la condicin por parte del microprocesador est basada en la inspeccin de los flags o sealizadores). En ocasiones se necesita no solo elegir si vamos a desarrollar un proceso o no, sino que deseamos realizar un proceso u otro segn una determinada condicin. Es decir, estamos ante estructuras que nos permiten elegir entre dos procesos distintos. Dichas acciones responden a la siguiente notacin: SI condicin Instruccin 1 Instruccin 2 .................... Instruccin N SI NO Instruccin N+1 Instruccin N+2 ...................... Instruccin 2N FIN DE SI Cuando se alcanza este condicional, el microprocesador comprueba la condicin y en caso de que se cumpla ejecuta Instruccin 1, Instruccin 2, ..., Instruccin N, y a continuacin pasan a ejecutarse las instrucciones del programa que van despus de FIN DE SI. En caso de que la condicin no se cumpla, se ejecutarn Instruccin N+1, Instruccin N+2, ..., Instruccin 2N, y a continuacin las instrucciones que van despus de FIN DE SI. Estas situaciones condicionales (tomas de decisin) pueden estar anidadas, es decir, entre las instrucciones que hay dentro de estos lazos, puede haber otras instrucciones de tomas de decisin, obteniendo estructuras cada vez ms complejas, pero que nos proporcionan mayor flexibilidad, del tipo: SI condicion1 Instruccin 1 Instruccin 2 SI condicin2 Instruccin a Instruccin b Instruccin c FIN DE SI SI NO Instruccin 3 Instruccin 4 FIN DE SI Los bucles: Tambin denominados ciclos, son estructuras que nos permiten la ejecucin de una serie de instrucciones un determinado nmero de veces que depende del estado o condicin inicial. Los bucles constituyen lo que llamaremos composiciones iterativas. Estn compuestos bsicamente por una condicin inicial y el cuerpo del bucle, respondiendo a la siguiente notacin: MIENTRAS condicin Instruccin 1 Instruccin 2 ..................... Instruccin N FIN DE MIENTRAS

_______________________________________ 74 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Cuando nos encontremos ante una estructura de este tipo, si se cumple la condicin inicial, se ejecutar el cuerpo del bucle (Instruccin 1, Instruccin 2, ..., Instruccin N) hasta que deje de cumplirse la condicin, momento en el que pasarn a ejecutarse las instrucciones que van despus de FIN DE MIENTRAS. Si la condicin inicial no se cumple no se entra en el ciclo y se contina despus de FIN DE MIENTRAS. Debe tenerse especial cuidado en que despus de un determinado nmero de iteraciones la condicin deje de cumplirse, de otro modo entraramos en un bucle sin fin. Las condiciones de los bucles, normalmente se establecen mediante contadores que son variables que contienen nmeros enteros y que, en el interior del cuerpo del bucle, son incrementadas o decrementadas de forma constante en cada iteracin que se realiza.

5.3 LAS ESTRUCTURAS DE DATOS.

Hasta el momento hemos visto algunos aspectos de las herramientas disponibles para desarrollar algoritmos. Sin embargo cuando se presenta la necesidad de manejar un elevado nmero de datos, es preciso agruparlos y organizarlos atendiendo a unas caractersticas concretas que sean comunes a todos ellos, constituyendo de este modo las estructuras de datos. La estructura ms sencilla y con la que trabajaremos nosotros es el array unidimensional, constituido por un conjunto de datos de idnticas propiedades, colocados por un orden dentro de un conjunto. El lugar que ocupan dentro de ese conjunto o array es sealado o marcado por la variable ndice que puede tomar valores enteros de tal forma que apunte desde el primer dato al ltimo del array. Por tanto un array (tambin llamado lista) estar representado por un nombre y un ndice que apunta a todos los elementos del array. Un elemento ser sealado por el nombre del array seguido del lugar que ocupa, es decir, del ndice. Por ejemplo VALOR(3) se refiere al elemento 3 del array que lleva el nombre de VALOR. Para recorrer un array debemos conocer con anterioridad el nmero total de elementos que lo componen y emplear un ciclo de repeticin que responda a la estructura siguiente: REPETIR DESDE I=1 HASTA N Instruccin 1 Instruccin 2 ..................... Instruccin x FIN DE REPETIR DESDE Adems del array unidimensional, podemos hacer referencia tambin al array bidimensional, que esta compuesto por un conjunto de datos homogneos sealados por dos ndices. Podremos asimilar los elementos de un array bidimensional a los elementos de una tabla que disponga de varias filas y varias columnas, es decir, el nmero de elementos ser (filas x columnas). Por tanto para referirse a un elemento situado en la fila f y en la columna c, emplearemos la expresin NOMBRE(f,c).

_______________________________________ 75 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

5.4 LOS DIAGRAMAS DE FLUJO.

Emplear para la construccin de algoritmos, los diagramas de flujo, puede resultar muy ilustrativo, incluso podra decirse que hasta conveniente. Sin embargo hay que tener en cuenta que para determinadas cuestiones o bien cuando intentamos abordar la construccin de algoritmos complejos, el mtodo de los diagramas de flujo pueden incluso resultar comprometedores en el sentido de llevarnos a ms confusin y aadir cierta rigidez en los diseos. 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 pseudocdigo, el diagrama de flujo correspondiente, de forma que pueda verse el efecto ilustrativo de los mismos. Los diagramas de flujo estarn constituidos por una serie de smbolos, en los que se indicar la funcin que desempean. Estos smbolos que estn representados en la FIG.54A en su mayora, 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.

S1

S2

S3

S4

S5

S6

S7

S8

S9

S10

S11

S12

S13

S14

S15

FIG.54A

A continuacin se indica el significado de cada uno de los smbolos representados en la mencionada figura: S1 S2 S3 S4 S5 Representa un proceso a ejecutar. Almacenamiento de datos interno. Es un conector empleado para cambiar de pgina. Proceso alternativo. Indicador de comienzo o fin.

_______________________________________ 76 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

S6 Datos almacenados. S7 Toma de decisin. S8 Entrada de datos manual. S9 Producir un retraso. S10 Datos. S11 Operacin realizada manualmente. S12 Operacin lgica Y. S13 Acceso a un proceso ya definido. S14 Conector de diagrama de flujo. S15 Operacin lgica O.

5.5 EJEMPLOS DE ALGORITMOS.

Ahora desarrollaremos algunos algoritmos sencillos, que nos permitirn llevar a la prctica las normas hasta ahora apuntadas. Estos algoritmos desarrollados a travs de pseudocdigo sern complementados con sus correspondientes diagramas de flujo. Debemos decir que stos no son imprescindibles en la confeccin de programas. Ejemplo 1.- Leer un nmero de una direccin determinada y si es mayor que 12 cargarlo en un registro. En primer lugar debemos analizar el problema detenidamente hasta entenderlo de forma correcta y poder as realizar las especificaciones y acotaciones que consideremos oportunas. Se hace referencia a una direccin de memoria, por tanto se trata de un byte que contiene el Dato buscado. Se supone que buscamos un nmero positivo (no dicen nada en contra). Y adems aadimos que la direccin de memoria en la que se encuentra el Dato, la tenemos en el registro par HL. Adems, podemos intuir que se trata de una toma de decisin sencilla ya que establece una accin a ejecutar si se cumple una condicin determinada y en caso contrario 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 = Direccin 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 continuacin se muestra en la FIG.55A el diagrama de flujo correspondiente, en el que podemos ver paso a paso la ejecucin del pseudocdigo. Para el seguimiento de dicho diagrama de flujo no se requiere ninguna indicacin especial.

_______________________________________ 77 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INICIO

Leer Dato memoria (HL)

No Dato>12 Si B=Dato

FIN

FIG.55A

Ejemplo 2.- Leer un nmero de una direccin 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 anlisis de principio similar al anterior, estableciendo consideraciones similares resultando en este caso el siguiente pseudocdigo: NOMBRE: MENOR12 FUNCION: Leer dato memoria y almacenarlo en B (>12) o en C PRECONDICIONES: HL = Direccin 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 continuacin se muestra el diagrama de flujo correspondiente a este pseudocdigo, FIG.55B, donde se puede comprobar el desarrollo del programa.

_______________________________________ 78 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INICIO

Leer Dato memoria (HL)

No Dato>12 Si B=Dato C=Dato

FIN

FIG.55B

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 conversin de cdigo sin imponernos ningn tipo de restriccin ni condicionamiento adicional. Como sabemos, los dgitos decimales son 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9 siendo su representacin en binario realizada con 4 bits. Como en cada byte disponemos de 8 bits, suponemos que el byte decimal contiene dos dgitos decimales, el primero en los cuatro bits menos significativos y el segundo en los cuatro bits ms significativos. Por consiguiente, tendremos que separar el byte en dos partes para tratarlas independientemente y construir las equivalencias a cdigo 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 direccin de memoria determinada, a la que apunta el valor asignado a DIREDAT. Adems, almacenaremos el resultado tambin en memoria a partir de la direccin sealada por DIRERES. Si observamos los cdigos binarios de los dgitos decimales y sus equivalentes ASCII (ver la tabla de equivalencias que a continuacin se presenta), notaremos que nicamente se diferencian en los cuatro bits ms significativos. DIGITO 0 1 2 3 4 5 6 7 8 9 BINARIO 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 ASCII 0011 0000 0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 0011 0110 0011 0111 0011 1000 0011 1001

_______________________________________ 79 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

No tendremos ms 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 cdigo 0011, para que automticamente se obtenga el equivalente ASCII buscado. Basndose en estas consideraciones previas obtendremos el pseudocdigo siguiente: NOMBRE: ASCII1 FUNCION: Convertir byte decimal a ASCII PRECONDICIONES: DIREDAT = Direccin Dato DIRERES = Direccin 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 ms significativos de Dato Agregar 0011 a la parte alta del Dato Guardar Dato en memoria apuntada por DIRERES+1 Fin del Programa

INICIO

A continuacin 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 operacin. (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)

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

_______________________________________ 80 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Ejemplo 4.- Convertir un byte hexadecimal a ASCII. En este ejercicio se nos plantea un simple proceso de conversin a cdigo ASCII, de un valor escrito en un byte segn el cdigo hexadecimal. Puesto que las representaciones en hexadecimal se realizan con los smbolos 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 estn contenidos dos dgitos hexadecimales. Ser por tanto, preciso separar el byte del Dato en dos partes (parte ms significativa y parte menos significativa) y buscar la representacin ASCII de cada una de ellas. Supondremos adems que el byte que contiene el dato pertenece a una direccin de memoria apuntada por DIREDAT. Y la solucin pedida, es decir, los dos caracteres ASCII pedidos, sern almacenados en la memoria en las direcciones sealadas por DIRERES y DIRERES+1. Por tratarse de valores hexadecimales, para efectuar la conversin a ASCII, tendremos que aadir 0011 0000B si se trata de un valor menor que 10, o bien aadir 0011 0111B si se trata de un valor mayor o igual que 10. Teniendo en cuenta todas estas consideraciones, podemos obtener el siguiente pseudocdigo, que nos llevar a obtener el resultado pedido. NOMBRE: ASCII2 FUNCION: Convertir byte hexadecimal a ASCII PRECONDICIONES: DIREDAT = Direccin Dato DIRERES = Direccin 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 ms 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 continuacin se muestra el diagrama de flujo correspondiente al pseudocdigo propuesto (FIG.55D). En l, destacan las llamadas a la subrutina ASCII, que se realizan en dos ocasiones.

_______________________________________ 81 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INICIO

Leer Dato Memoria (HL)

ASCII INICIO

Dato=XXXX 0000

Dato=0000 XXXX

Si Dato<10

No

Guardar Dato en DIRERES

Dato=Dato+30H

Leer Dato Memoria (HL)

Dato=Dato+37H

Dato=0000 YYYY

Ir a ASCII

Volver

Guardar Dato en DIRERES+1

FIN FIG.55D

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 lmites de la zona a tratar, nosotros supondremos que el principio de la misma viene sealado por PRIRAM. Del mismo modo, supondremos que el nmero 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 nmero de veces y mediante el cual realicemos las operaciones de almacenaje adecuadas. Para ello, tendremos que emplear un contador que nos seale el final del bucle y nos permita abandonar o finalizar el programa. Teniendo en cuenta todo lo anterior se desarrolla el siguiente pseudocdigo: 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 direccin de RAM Decrementar Contador FIN DE MIENTRAS Fin de Programa

_______________________________________ 82 ___________________________________________

SALT1

Ir a ASCII

____________________ Curso 8085A ____________________________________________________________

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

INICIO

Tomar Dato a almacenar

Contador = NUMDAT

Apuntar a direccin de RAM (PRIRAM)

Contador > 0 Si

No

FIN Almacenar Dato

Incrementar direccin de RAM

Contador = Contador - 1

FIG.55E

Ejemplo 6.- Realizar una suma decimal de varios dgitos. Con este ejercicio se llevar a cabo la suma de dos nmeros decimales de varias cifras. Puesto que no nos dicen nada en el enunciado, supondremos que se trata de nmeros de ocho cifras. Los nmeros a sumar (los sumandos) se encuentran almacenados en la memoria RAM expresados segn 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 nmero se necesitarn cuatro bytes por nmero. La direccin donde se encuentra almacenado el primer byte del primer sumando, vendr dada por SUM1 y el resto en direcciones consecutivas. La direccin del primer byte del segundo sumando, estar dada por SUM2 y el resto en direcciones consecutivas. El resultado de la operacin 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 nmero. Para realizar este proceso, es preciso iniciar un Contador que nos permita establecer el final del bucle. El pseudocdigo propuesto es el siguiente:

NOMBRE: SUMA FUNCION: Suma dos nmeros decimales de 8 cifras cada uno PRECONDICIONES: Primer sumando en SUM1 Segundo sumando en SUM2 POSTCONDICIONES: El resultado se almacena en lugar de SUM1

_______________________________________ 83 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 pseudocdigo y en l puede apreciarse el desarrollo o flujo de las rdenes a ejecutar por la computadora o sistema.

INICIO

Apuntar a SUM1 Apuntar a SUM2 Contador = 4

Contador > 0 Si

No

FIN Sumar SUM1+SUM2

Ajuste decimal

Almacenar resultado en SUM1

Apuntar a SUM1+1 Apuntar a SUM2+1

Contador = Contador - 1

FIG.55F

_______________________________________ 84 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Ejemplo 7.- Desarrollar una temporizacin. En este caso nos piden desarrollar una subrutina o un programa de temporizacin. No se nos indica cunto tiempo se debe permanecer en este estado, por lo que ser una caracterstica que impondremos nosotros. Tampoco se dice nada acerca de qu debe hacer el microprocesador durante ese tiempo. El programa bsicamente consistir en desarrollar un bucle o ciclo que se repita durante un tiempo, o un determinado nmero 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 seale el final del bucle y por tanto el final del tiempo de espera. Segn las condiciones expresadas, tendremos el siguiente pseudocdigo: 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

No Contador > 0 Si FIN No hacer nada

Contador = Contador - 1

FIG.55G

_______________________________________ 85 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Ejemplo 8.- Mover un bloque de memoria RAM. En este ejercicio se llevar a cabo la traslacin 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 perdern. Debemos tener en cuenta que existe la posibilidad de que las zonas ORIGEN y DESTINO se encuentren superpuestas. Esto plantear un problema aadido que debe ser resuelto, de lo contrario, podran perderse determinados datos de la zona ORIGEN. Para ello tendremos que conocer de forma precisa el nmero de elementos de la zona ORIGEN que deseamos mover. A este nmero le llamaremos NUM. Con estos tres valores, ORIGEN, DESTINO y NUM, podremos saber si existe superposicin o no. Para ello calcularemos la diferencia entre DESTINO y ORIGEN, para despus 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 superposicin se cambiarn 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 adems 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 ningn dato. El pseudocdigo 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 superposicin 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

_______________________________________ 86 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

A continuacin se muestra el diagrama de flujo correspondiente FIG.55H

INICIO

Apuntar a ORIGEN Apuntar a DESTINO

Contador = NUM

Contador = 0 No

Si

Si ORIGEN=DESTINO No Diferencia entre DESTINO y ORIGEN Comparar Diferencia con NUM

Si

Superposicin

No

ORIGEN=ORIGEN+NUM DESTINO=DESTINO+NUM Contador > 0 Si Contador>0 Si ORIGEN=ORIGEN-1 DESTINO=RESTINO-1 ORIGEN=ORIGEN+1 DESTINO=DESTINO+1 No No

Leer Dato de ORIGEN Almacenar Dato en DESTINO

Leer Dato de ORIGEN Almacenar Dato en DESTINO

Contador=Contador-1

Contador=Contador-1

FIN

FIG.55H

_______________________________________ 87 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

5.5 EJERCICIOS.

1. 2. 3. 4. 5. 6. 7. 8. 9.

Definir el algoritmo. Elementos que lo componen. Caractersticas de los algoritmos. Cules pueden ser las principales caractersticas de un buen algoritmo?. Definir las distintas acciones del pseudocdigo. Los diagramas de flujo. Dibuja los smbolos que recuerdes indicando su significado. Qu son las precondiciones y las postcondiciones?. Expresar la estructura bsica 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 ledo quede almacenado en una direccin de memoria, en el caso de que sea menor que 12.

10. Disear un algoritmo que almacene los nmeros consecutivos del 0 al 9 a partir de la direccin 8000H hacia arriba. 11. Disear un algoritmo que sume dos nmeros almacenados en dos direcciones de memoria determinadas y guarde el resultado en otra direccin de la RAM. 12. Disear los diagramas de flujo correspondientes a los dos ejercicios anteriores.

_______________________________________ 88 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

DESARROLLOS DE PROGRAMAS BASICOS.

_______________________________________ 89 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

6. DESARROLLO DE PROGRAMAS BSICOS.

Por todo lo expuesto hasta el momento, sabemos que para poder llevar a cabo el desarrollo de programas de aplicacin, es decir, programas que cargados en la memoria del sistema realicen una tarea especfica y particular, ser preciso planificar dicho desarrollo de forma estructurada, empleando el mximo de recursos disponibles a nuestro alcance, como diagramas de flujo, etc. Adems debemos emplear para ello determinados programas llamados de desarrollo que sirven para construir los programas de aplicacin, corregirlos y ejecutarlos. Nosotros emplearemos para confeccionar nuestros programas el ensamblador. Debemos tener en cuenta adems, como punto muy importante y que nunca debemos olvidar, que los programas de aplicacin que construyamos, deben ir acompaados siempre de la mxima documentacin posible, este es un punto de considerable importancia. Adems sabemos que en las aplicaciones de sistemas basados en microprocesadores, la integracin entre software y hardware debe ser total, por lo que para poder realizar nuestros programas, debemos conocer lo ms 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 diseado en temas anteriores, aunque ser muy sencillo realizar las modificaciones que fueran necesarias para trasladarlo a otro sistema basado en el mismo microprocesador.

6.1 EL LENGUAJE ENSAMBLADOR.

Como ya se ha mencionado en varias ocasiones, resulta muy problemtico tener que desarrollar programas directamente en hexadecimal e incluso en binario dado que el cdigo mquina es muy propicio para cometer errores y dificulta el desarrollo de programas. Por esto, surgen los programas ensambladores, que nos proporcionan un nivel superior de programacin. Son programas simblicos que emplean cdigo mnemotcnico para referirse a las instrucciones y permiten la utilizacin de nombres simblicos para sealar direcciones de memoria, constantes, etc. Una vez construido el programa el ensamblador lo convertir en cdigo mquina (binario) ejecutable por el microprocesador. Adems el ensamblador, permite la divisin de un programa en mdulos, que nos facilitarn considerablemente la creacin de programas cada vez ms complejos. Tambin ser posible la deteccin de errores en la sintaxis del programa, aunque no se detectan errores lgicos. El programa que se escribe en ensamblador recibe el nombre de programa fuente y su escritura se realiza mediante un editor de textos. Los programas ensambladores suelen disponer de su propio editor, de no ser as, podremos emplear el editor del sistema operativo MS-DOS. Todos los programas fuente deben llevar la extensin ASM. Cuando el ensamblador traduce los mnemnicos del programa fuente a valores binarios (cdigo mquina), se obtiene el programa objeto que podr ser ejecutado por el microprocesador una vez almacenado en la memoria del sistema. Todos los programas objeto deben llevar la extensin OBJ.

_______________________________________ 90 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Tambin debemos indicar que se pueden desarrollar varios ficheros constituidos por diferentes mdulos de programas objetos que posteriormente sern unidos entre s para formar el programa completo. Esta funcin de unin de mdulos la realizan el programa enlazador o linker, que es otra utilidad del ensamblador. El proceso fundamental de la programacin, requiere llevar a cabo una serie de pasos organizados, que nos hagan llegar a una solucin correcta del problema planteado. Estos pasos o fases, pueden resumirse en: Definicin, estudio y comprensin 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 funcin 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 definicin del problema. Documentar de forma adecuada cada trabajo realizado. Este paso es muy importante, debe tenerse en cuenta que cuanta ms informacin sea aportada junto al programa ms fcil resultar en el transcurso del tiempo poder realizar alguna modificacin o reforma si fuera preciso.

6.2 LAS INSTRUCCIONES EJECUTABLES EN ENSAMBLADOR.

Evidentemente son aquellas que ejecuta el microprocesador, pero expresadas segn su representacin simblica. Como sabemos cada ensamblador posee unas caractersticas 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 ejecucin las extensiones de los siguientes ficheros: ASM OBJ LST OBJ TSK HEX Entrada del ensamblador (programa fuente). Salida del ensamblador (programa objeto). Fichero que contiene el listado. Fichero de entrada del enlazador. Salida del Link1. Salida del Link2.

El ensamblador posee adems 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.

_______________________________________ 91 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Para llamar al ensamblador, se crear un programa fuente (con extensin ASM) compuesto por una serie de lneas, cada una de las cuales contendr una sola sentencia. Cada lnea estar compuesta de los siguientes campos: 1. Campo de etiqueta.- Es nicamente de carcter 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 nmero de caracteres, aunque solo sern tenidos en cuenta los 8 primeros. Deben situarse al principio de la lnea en la columna 1 y su nombre debe comenzar por una letra aunque tambin puede llevar nmeros. 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. Campo de cdigo.- A continuacin de la etiqueta, se sita el cdigo de la instruccin, en este caso el mnemnico de la instruccin que se desea ejecutar. Este campo es de uso obligatorio, siempre debe haber un mnemnico en l. Campo de operandos.- Aparece a continuacin del campo de cdigo y su sintxis varia segn la instruccin que se emplee. Puede llevar uno o ms operandos y en este caso irn separados por una coma (,). Se sita en primer lugar el operando destino y el operando origen en segundo lugar. Tambin pueden ser expresados mediante nombres simblicos, nombres de registros, valores numricos, expresiones aritmticas, etc. Los operadores disponibles en el ensamblador para expresar operaciones son entre otros: + * / ** .NOT. .MOD. .SHR. .SHL. .AND. .OR. .XOR. .EQ. .GT. .LT. 4. Suma Resta Multiplicacin Divisin Potenciacin Complementacin Desplazamiento a la derecha Desplazamiento a la izquierda Operacin lgica AND Operacin lgica OR Operacin exclusiva OR Igual Mayor que Menor que

2.

3.

Campo de comentario.- Se sita despus del campo de operandos. No es obligatoria su utilizacin, es decir, podemos dejarlo en blanco. Su funcin es exclusivamente informativa. Debe comenzar con el smbolo punto y coma (;) seguido del comentario que se desee. Los comentarios no formarn parte del cdigo objeto que proporcionar el ensamblador, sin embargo pueden ser muy tiles cuando intentemos modificar un programa que ya ha sido escrito hace algn 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).

Adems de las lneas de instrucciones ejecutables, en ensamblador son muy empleadas las lneas completas para comentarios, que comienzan necesariamente por el smbolo punto y coma (;) y normalmente son situadas al principio del programa o al principio de cada mdulo o subrutina. Nosotros emplearemos estas lneas para documentar nuestras subrutinas y programas, incluyendo en ellas el nombre, funcin, precondiciones, etc. El final del programa debe estar marcado siempre mediante la instruccin especial del lenguaje ensamblador (pseudoinstruccin o tambin llamada directiva de ensamblador) END. Por todo esto, nuestros programas en ensamblador estarn constituidos en principio bajo la siguiente estructura:

_______________________________________ 92 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

; NOMBRE: ; FUNCION: ; PRECONDICIONES: ; POSTCONDICIONES: ETIQUETA INSTRUCCIN OPERANDOS Instruccin 1 Instruccin 2 Instruccin 3 ..................... ..................... ..................... END COMENTARIOS

6.3 LAS DIRECTIVAS EN ENSAMBLADOR.


Adems de las instrucciones bsicas, propias de cada microprocesador (en este caso el 8085) que son transformadas por el ensamblador en lenguaje mquina, hay otro tipo de instrucciones, disponibles en el lenguaje ensamblador y denominadas directivas de ensamblador o tambin pseudoinstrucciones, que sirven para facilitar las tareas de programacin, pero que no son tenidas en cuenta por el ensamblador para la obtencin del cdigo mquina. Por tanto las directivas no formaran parte del cdigo objeto. Puede decirse que su misin principal es indicar al programa ensamblador cmo deseamos que lleve a cabo las tareas de traduccin del programa fuente para obtener el programa objeto. Entre las directivas ms importantes pueden destacarse: ORG X1 Nos marca la posicin inicial de memoria (mediante X1) a partir de la cual deseamos cargar las instrucciones y los datos que podamos establecer a continuacin. Esta directiva consta de dos partes perfectamente diferenciadas, el cdigo mnemotcnico (ORG) y un valor numrico (X1) normalmente en hexadecimal o una expresin que representa la direccin de comienzo. Si no empleamos esta directiva, el ensamblador situar el programa a partir de la direccin 0000H, que es la direccin establecida por defecto. END Marca el final del programa fuente. Debe colocarse siempre al final del programa y puede incluir un valor que seale al inicio de ejecucin del programa. El empleo de esta directiva es obligatorio. Nombre EQU X2 Esta pseudoinstruccin sirve para establecer la igualdad entre un Nombre y un valor numrico (X2). Es una directiva de asignacin que nos dar la posibilidad de poder emplear dicho Nombre en cualquier punto del programa donde deba ser utilizado. Estos nombres son llamados constantes de ensamblado y nos proporcionan la posibilidad de cambiar el valor de dicha constante en una nica posicin del programa (en su lugar de definicin) sin necesidad de tener que recorrer todo el programa cambiando dicho valor en todos los puntos donde se utilice.

_______________________________________ 93 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 segn 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 adems 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 ocasin se emplea para reservar espacio en memoria para palabras de dos bytes (16 bits). Por tanto los datos que se colocan despus de una directiva DW sern palabras de dos bytes (por ejemplo 1234H) separados por comas. Se almacena en primer lugar el byte menos significativo de la palabra y a continuacin el byte ms 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 smbolo (:). Nombre DS X8 La directiva DS reserva en memoria el nmero de bytes especificados en la expresin X8. Los bytes reservados en la memoria del sistema contendrn a partir de ese momento el valor 00H. Nombre BLKW X9 Reserva el nmero de palabras especificadas por la expresin X9. Las palabras reservadas se cargan con el dato 00H (son puestas a cero) y la etiqueta Nombre es opcional. Adems 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 bsicamente del programa ensamblador empleado. El ensamblador nos ofrece como ayuda adicional la posibilidad de corregir una serie de errores de tipo sintctico, cometidos al crear el programa fuente (.ASM). Aunque estas ayudas o indicaciones de errores dependen del programa ensamblador empleado, podemos sealar aqu algunas comunes a la gran mayora de ellos: Illegal Register Pair: Nos indica el empleo incorrecto o ilegal de un par de registros para una instruccin determinada. Por ejemplo, la instruccin "ADD B,H" nos dara este error, ya que la forma correcta sera "ADD reg" que realiza la operacin de suma entre el acumulador y el registro especificado (reg) guardando el resultado en el acumulador.

_______________________________________ 94 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Multiply Defined Symbol: Nos indica que hemos escrito un smbolo (una etiqueta) en ms de una ocasin con el mismo nombre. Illegal Mnemonic: Este mensaje de error se presenta cuando empleamos una instruccin (mnemnico) que no existe para el microprocesador, ni esta definido previamente en una macro. Hex # And Symbol Are Identical: Se produce cuando empleamos una etiqueta idntica a un nmero expresado en hexadecimal. Por ejemplo ABCH: NOP LXI H,ABCH Undefined Symbol: Surge cuando en una instruccin 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 carcter ASCII y se ha cometido un error de puntuacin. Por ejemplo MVI A,"T. Attemped Division By Zero: Nos seala que ha encontrado una divisin en la que el divisor es cero y por tanto es una operacin ilegal. Missing End Statement: Seala que el ensamblador no encuentra la directiva END que indica el final del programa.

6.4 LAS SUBRUTINAS.


Como sabemos, el lenguaje ensamblador ofrece adems, la posibilidad de crear partes del programa independientes, denominadas subrutinas, que podrn ser llamadas posteriormente desde cualquier parte del programa principal e incluso desde otra subrutina, mediante la instruccin CALL. De esta forma el programa completo estar constituido esencialmente por una serie de pequeos programas llamados subrutinas, que pueden ser llamadas en repetidas ocasiones, evitndonos por tanto, escribir cdigo repetido. Como se ha mencionado anteriormente, las subrutinas son pequeos programas y como tal debemos aportar a cada una de ellas la documentacin o informacin suficiente para que puedan ser tratadas independientemente, e incluso puedan ser empleadas en programas distintos. Por esto, las subrutinas llevarn el encabezamiento propio de un programa y requerirn el estudio detallado de todas las condiciones en que pueden ser ejecutadas, es decir, la estructura inicial de toda subrutina ser: ;NOMBRE: ;FUNCION: ;PRECONDICIONES: ;POSTCONDICIONES: A continuacin comenzar el cuerpo de la subrutina propiamente dicho, que llevar al principio una etiqueta con el nombre de la subrutina, es decir, el parmetro que deberemos especificar en la instruccin de llamada a subrutina CALL. Normalmente el nombre asignado a las subrutinas es suficientemente significativo como para darnos una idea o sugerir la funcin que desarrollarn las mismas. A continuacin de la etiqueta se sitan las instrucciones que componen la subrutina y finalmente es imprescindible concluir la subrutina con una instruccin RET que devuelve el control del programa a la posicin desde donde se efectu la llamada CALL a subrutina. Debemos recordar que adems de la llamada CALL a subrutinas, disponemos tambin de otro tipo de llamadas a subrutinas con condiciones como CC LABEL, CNC LABEL, CZ LABEL, etc. (que podemos recordar revisando el tema 4) que efectuarn la llamada a la subrutina cuyo nombre venga especificado en LABEL si se cumple la condicin que lleva implcita la instruccin que en cada caso se emplee. Tambin disponemos de varias instrucciones para salir de una subrutina, adems de la instruccin RET. Estas instrucciones (que pueden analizarse en el tema 4) son entre otras RM, RNC, RNZ, RP, etc. y

_______________________________________ 95 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

provocan el retorno de la subrutina si se cumple la condicin que lleva implcita la instruccin empleada en cada caso concreto. En definitiva, una subrutina tendr para nosotros la siguiente estructura: ;NOMBRE: ;FUNCION: ;PRECONDICIONES: ;POSTCONDICIONES: NOMBRE: Instruccin 1 Instruccin 2 Instruccin 3 .................... Instruccin N RET Las subrutinas deben ser vistas desde el programa principal como un bloque o una caja a la que se accede proporcionndole unos datos de entrada que llamaremos parmetros de entrada y despus de ser ejecutada nos proporciona uno o ms 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 utilizacin de los registros del microprocesador libres para su uso en ese momento. Se almacenarn en ellos los datos que precise la subrutina para desarrollar su funcin y una vez ejecutada la subrutina, nos devolver los resultados en los registros precisos. Este mtodo est limitado por el bajo nmero de registros de que disponemos en el microprocesador 8085. Adems 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 parmetros que necesite la subrutina para desarrollar su funcin. A continuacin se llama a la subrutina, la cual busca en la RAM los parmetros introducidos para trabajar con ellos. Es importante tener en cuenta el orden en que se situaron dichos parmetros 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.

_______________________________________ 96 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

6.5 EJEMPLOS DE SUBRUTINAS.


En este apartado se tratarn de desarrollar de la forma ms precisa y clara, una serie de subrutinas que podrn ser utilizadas posteriormente en otros programas ms amplios, sin ms que tener en cuenta las precondiciones y las postcondiciones de las mismas. Con nimo de agilizar la construccin de varios ejemplos, nos limitaremos a adaptar los programas desarrollados con pseudocdigo en el tema anterior, para lo cual deberemos convertirlos a lenguaje ensamblador y ajustarlos a las necesidades y capacidades de nuestro sistema bsico. Como veremos, cuando se realiza un programa fuente en ensamblador, es necesario colocarle la extensin ASM al nombre que deseemos asignarle y una vez que llamemos al ensamblador nos generar un fichero con extensin OBJ que representa el cdigo objeto correspondiente. Adems tambin se genera un fichero con extensin LST que representa el listado del programa. Este ltimo, es el que se presentar aqu. En l podrn apreciarse con claridad los cuatro campos (etiqueta, cdigo, operandos y comentarios) que se han mencionado con anterioridad, pero adems se nos muestra una primera columna en la que nos indican el nmero de lnea de cdigo en que nos encontramos, seguida de la columna de direcciones y a continuacin los valores hexadecimales generados durante el ensamblado, correspondientes a las instrucciones. Tambin podremos observar que todas las subrutinas aqu presentadas, se sitan a partir de la direccin 0000H. Esto se ha hecho por comodidad, pero en realidad pueden situarse en cualquier otra posicin de memoria que nos interese. Para entender de una forma ms clara y precisa el desarrollo y construccin de las subrutinas, es importante compararlas con los desarrollos de pseudocdigo realizados en el tema anterior.

Ejemplo 1.- Se desarrollar la subrutina correspondiente al ejemplo 1 del tema anterior y que denominaremos tambin MAYOR12. Se inicia la subrutina guardando en la pila el contenido de los registros sealados por PSW, por lo que debemos tener la precaucin de recuperar dichos datos antes de salir de ella mediante el empleo de la instruccin RET. La ltima instruccin END sirve para indicar al ensamblador que se ha llegado al final del programa, pero no forma parte de la subrutina.
2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : MAYOR12.ASM MAYOR12.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

;-----------------------------------------;NOMBRE : MAYOR12 ;FUNCION : Si Dato>12 va a B ;PRECONDICION : HL = Direccin del Dato ;POSTCONDICION : Resultado en B si Dato>12 ;-----------------------------------------0000 0000 0001 0002 0004 0007 000A 000B 000C 000D MAYOR12: F5 7E FE 0C CA 0B 00 DA 0B 00 46 F1 C9 PUSH PSW MOV A,M CPI 12 JZ FIN JC FIN MOV B,M POP PSW RET END

FIN

_______________________________________ 97 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

*********** FIN

S Y M B O L I C 000B MAYOR12

R E F E R E N C E 0000 17

T A B L E

*************

LINES ASSEMBLED :

ASSEMBLY ERRORS :

Es preciso darse cuenta que, segn las precondiciones planteadas, para acceder a esta subrutina, habr que cargar en el par de registros HL la direccin del Dato que deseamos tratar. Adems, al obtener el resultado de la subrutina en el registro B, debemos tener presente que la informacin que temporalmente pudiramos tener depositada en el mismo podra perderse si no tenemos la precaucin de ponerla a salvo antes de acceder a la subrutina. En la lnea 10, se carga en el acumulador el contenido de la direccin de memoria (M) apuntada por el par HL. A continuacin (lnea 11) se establece una comparacin con el valor 12 (fijarse cmo el ensamblador transforma 12 a su equivalente hexadecimal 0C). En la lnea 12 se efecta un salto a FIN (lnea 15) si se cumple que el Dato del acumulador es igual a 12. En caso contrario ejecutara la lnea 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 condicin anterior es claro que el Dato es mayor que 12 por lo que se pasa a ejecutar la lnea 14, en la que se pasa el valor del Dato almacenado en la memoria al registro B. En la lnea 16, se produce el retorno de la subrutina al programa principal, desde el que se ha efectuado la llamada. Las lneas 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 tenan en el momento de efectuar la llamada. Debemos tener en cuenta, que por cada instruccin PUSH insertada, debemos colocar una instruccin POP correspondiente al mismo registro necesariamente.

Suponiendo que la direccin del Dato fuera 8100H, para llamar a la subrutina MAYOR12 desde el programa principal, tendramos que proceder del modo siguiente: LXI H,8100H CALL MAYOR12 Observando el listado del programa ensamblado, vemos cmo 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: OUTPUT FILENAME: MENOR12.ASM MENOR12.OBJ

1 2 3 4 5 6

;-----------------------------------------;NOMBRE : MENOR12 ;FUNCION : Si Dato>12 va a B si no va a C ;PRECONDICION : HL=Direccin Dato, B=0, C=0 ;POSTCONDICION : Resultado en B o en C ;------------------------------------------

_______________________________________ 98 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

7 8 9 10 11 12 13 14 15 16 17 18 19

0000 0000 0001 0002 0004 0007 000A 000B 000C 000D 000E 0011

MENOR12: F5 7E FE CA DA 46 F1 C9 4E C3 PUSH PSW MOV A,M CPI 12 JZ SALT1 JC SALT1 MOV B,M POP PSW RET MOV C,M JMP FIN END

0C 0D 00 0D 00 FIN SALT1 0B 00

************* FIN

S Y M B O L I C MENOR12 19

R E F E R E N C E 0000 SALT1

T A B L E ************* 000D

000B

LINES ASSEMBLED :

ASSEMBLY ERRORS :

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 segn sea el valor del Dato contenido en la direccin marcada por el par HL. Para acceder a esta subrutina, suponiendo que tenemos el Dato situado en la direccin 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 lneas, los comentarios que nos documentan la subrutina: Nombre, Funcin, etc. Las primeras lneas (9,10 y 11) son similares al ejemplo anterior. En las lneas 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 (lnea 17), donde se almacena el dato en el registro C, para luego (lnea 18) saltar a la etiqueta FIN. Si no se cumplen ninguna de las condiciones anteriores, entonces ser lgicamente Dato>12, por lo que las instrucciones JC y JZ no sern tenidas en cuenta, pasando a ejecutarse la lnea 14, en la que se almacena el Dato en el registro B. A continuacin se ejecutan secuencialmente las lneas 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 : OUTPUT FILENAME : ASCII1.ASM ASCII1.OBJ

1 2 3 4 5 6

;-----------------------------------------;NOMBRE: ASCII1 ;FUNCION: Convertir byte decimal a ASCII ;PRECONDICION: DIREDAT y DIRERES en HL y DE ;POSTCONDICION: Result DIRERES y DIRERES+1 ;------------------------------------------

_______________________________________ 99 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

0000 0000 0001 0002 0004 0005 0006 0007 0008 000A 000B 000C 000D 000F 0011 0012 0013 0014 0014

ASCII1: F5 7E E6 0F 0F 0F 0F C6 12 13 7E E6 C6 12 F1 C9 PUSH PSW MOV A,M ANI F0H RRC RRC RRC RRC ADI 30H STAX D INX D MOV A,M ANI 0FH ADI 30H STAX D POP PSW RET END

F0

30

0F 30

*************

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 :

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

LXI D,DIRERES LXI H,DIREDAT CALL ASCII1 Aqu se ha empleado la pseudoinstruccin EQU, para ilustrar su funcionamiento, aunque podramos efectuar la llamada de modo similar a lo hecho en ejercicios anteriores. Como siempre, en las primeras lneas, incluimos la documentacin de la subrutina a modo de comentarios. En la lnea 10 cargamos en el acumulador, el Dato de memoria (M) direccionado por el par de registros HL. En la lnea 11 se efecta una operacin 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 ms significativos. A continuacin (lneas 12, 13, 14 y 15) se efectan 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 lnea 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 continuacin (lnea 17) almacenamos en la posicin de memoria especificada por el par de registros DE. En la lnea 18 se incrementa el par DE para apuntar a la siguiente direccin de memoria, donde almacenaremos el equivalente ASCII de los cuatro bits de menor peso del Dato.

_______________________________________ 100 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

A continuacin volvemos a cargar el Dato original en el acumulador, para luego realizar una operacin 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 lnea 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 continuacin (lnea 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 : OUTPUT FILENAME : ASCII2.ASM ASCII2.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

;-----------------------------------------;NOMBRE : ASCII2 ;FUNCION : Pasa byte hexadecimal a ASCII ;PRECONDICION: DIREDAT y DIRERES en HL y DE ;POSTCONDICION : Result DIRERES y DIRERES+1 ;-----------------------------------------0000 0000 0001 0002 0004 0005 0006 0007 0008 000B 000C 000D 000E 0010 0013 0014 0015 ASCII2: F5 7E E6 0F 0F 0F 0F CD 12 13 7E E6 CD 12 F1 C9 PUSH PSW MOV A,M ANI F0H RRC RRC RRC RRC CALL ASCII STAX D INX D MOV A,M ANI 0FH CALL ASCII STAX D POP PSW RET ;-----------------------------------------;NOMBRE : ASCII ;FUNCION : Calcula el equivalente ASCII ;PRECONDICION : Dato en acumulador ;POSTCONDICION : Resultado en acumulador ;-----------------------------------------0016 0016 0017 0018 001A 001D 0020 0021 0023 0024 0025 0026 0028 002B ASCII: C5 47 FE CA D2 78 C6 C1 C9 78 C6 C3 PUSH B MOV B,A CPI 10 JZ SALT1 JNC SALT1 MOV A,B ADI 30H POP B RET MOV A,B ADI 37H JMP FIN END

F0

16 00

0F 16 00

0A 25 00 25 00 30 FIN SALT1 37 23 00

_______________________________________ 101 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

************* ASCII

S Y M B O L I C ASCII2

R E F E R E N C E 0000 FIN

T A B L E 0024

************ 0027

0016

SALT1

LINES ASSEMBLED :

47

ASSEMBLY ERRORS :

La subrutina que ahora se analiza, es similar a la anterior, pero sta realiza la transformacin a valores ASCII de un byte hexadecimal almacenado en una direccin de memoria (DIREDAT). El resultado ser cargado tambin en memoria (DIRERES). Los valores de las direcciones sern pasados a la subrutina, a travs de los pares de registros HL y DE del modo siguiente: DIREDAT DIRERES EQU EQU 8100H 8500H

LXI D,DIRERES LXI H,DIREDAT CALL ASCII2 Tambin podemos apreciar cmo en esta subrutina se hacen dos llamadas a otra subrutina (ASCII) que proporciona el valor ASCII. La primera vez que se efecta 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 lneas 10 a 15, donde se eliminan los cuatro bits menos significativos del Dato, se producen cuatro rotaciones para preparar el dato y a continuacin (lnea 16) se llama a una subrutina denominada ASCII, que nos calcula el valor equivalente en ASCII de la parte del Dato tratada. En la lnea 17, se almacena el resultado en la memoria direccionada por el par DE, y posteriormente se incrementa dicho par, para apuntar a la siguiente direccin de memoria. En las lneas 18 y 19, se realiza un proceso similar con la parte BAJA del Dato, para luego llamar a la subrutina ASCII de clculo. En la lnea 22, se almacena el resultado en memoria para a continuacin dar por finalizada la subrutina y salir de ella mediante la instruccin RET. Vemos adems, que dentro de esta subrutina, existe otra subrutina (denominada ASCII) que efecta el clculo del valor equivalente en ASCII. Para ello, debe recibir el dato que se desea tratar en el acumulador y una vez realizado el clculo, proporciona el resultado en el mismo acumulador. En esta subrutina, se comprueba en primer lugar, si el dato es menor que 10 (lnea 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.

_______________________________________ 102 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 : OUTPUT FILENAME : LLENARAM.ASM LLENARAM.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

;-----------------------------------------;NOMBRE : LLENARAM ;FUNCION : Llena zona RAM con un Dato ;PRECONDICION : DATO=C,PRIRAM=HL y NUMDAT=B ;POSTCONDICION : Zona RAM con mismo Dato ;-----------------------------------------0000 0000 0001 0002 0003 0004 0007 0008 0009 S Y M B O L I C SALT1 LLENARAM: PUSH PSW SALT1 MOV M,C INX H DCR B JNZ SALT1 POP PSW RET END R E F E R E N C E 0001 T A B L E ************

F5 71 23 05 C2 01 00 F1 C9

************* LLENARAM

0000

LINES ASSEMBLED :

17

ASSEMBLY ERRORS :

La llamada a esta subrutina, se realiza como siempre, mediante una instruccin CALL. Previamente deben haberse cargado los registros HL, B, y C con los datos correspondientes, segn se pide en las precondiciones. Por tanto procederemos del modo siguiente: PRIRAM NUMDAT DATO EQU EQU EQU 8200H 60H 3AH

LXI H,PRIRAM MVI B,NUMDAT MVI C,DATO CALL LLENARAM

Podemos ver cmo en la lnea 10, se almacena en memoria RAM (direccionada por el par de registros HL) el valor que hay en el registro C (C = Dato). A continuacin se apunta a la siguiente direccin de memoria, incrementando el par HL. En la lnea 12, se decrementa el contador B (B = Nmero de datos). En la lnea 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 lneas 14 y 15 secuencialmente, finalizndose la subrutina.

_______________________________________ 103 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 : OUTPUT FILENAME : SUMA.ASM SUMA.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

20 80 30 80 0000 0000 0001 0002 0003 0004 0007 000A 000B 000D 000E 000F 0010 0011 0012 0013 0014 0017 0018 0019 001A 001B 001C

;-----------------------------------------;NOMBRE : SUMA ;FUNCION : Suma dos nm decimales 8 cifras ;PRECONDICION : SUM1 Y SUM2 conocidos ;POSTCONDICION : Resultado en SUM1 ;-----------------------------------------SUM1 EQU 8020H SUM2 EQU 8030H SUMA:

F5 E5 C5 D5 21 11 A7 06 1A 8E 27 77 23 13 05 C2 D1 C1 E1 F1 C9

20 80 30 80 04 SALT1

0D 00

PUSH PSW PUSH H PUSH B PUSH D LXI H,SUM1 LXI D,SUM2 ANA A MVI B,04 LDAX D ADC M DAA MOV M,A INX H INX D DCR B JNZ SALT1 POP D POP B POP H POP PSW RET 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 :

Como vemos, esta subrutina suma dos nmeros 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 sern 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 nmeros a sumar en RAM y luego efectuar la llamada del modo siguiente:

_______________________________________ 104 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

CALL SUMA Cuando el resultado de las subrutinas, no es almacenado en ningn registro, puede emplearse el procedimiento mostrado aqu, para proteger los datos de los registros. Vemos cmo en las lneas 11, 12, 13 y 14, se guardan sus contenidos en la pila y en las lneas 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 algn registro, podemos eliminar sus instrucciones correspondientes). Notar tambin que en la lnea 17, se ejecuta la instruccin ANA A, con el nico objeto de poner el flag CARRY a cero. En la lnea 18 se inicia un contador en el registro B, que nos permitir realizar un determinado nmero de veces el lazo del bucle marcado por SALT1. En las lneas 19 y 20, podemos ver como se realiza la suma entre los bytes sealados por los pares DE y HL. Posteriormente, en la lnea 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 : OUTPUT FILENAME : TEMPORIZ.ASM TEMPORIZ.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

;-----------------------------------------;NOMBRE : TEMPORIZ ;FUNCION : Realiza un tiempo de espera ;PRECONDICION : Contador=CONTA ;POSTCONDICION : Ninguna ;-----------------------------------------0000 0000 0001 0002 0003 0004 0005 0006 0007 000A 000B 000C S Y M B O L I C TEMPORIZ TEMPORIZ: PUSH PSW SALT1 DCX D MOV A,D ORA E NOP NOP NOP JNZ SALT1 POP PSW RET END R E F E R E N C E 0000 T A B L E ************

F5 1B 7A B3 00 00 00 C2 01 00 F1 C9

************* SALT1

0001

LINES ASSEMBLED :

20

ASSEMBLY ERRORS :

Para acceder a esta subrutina, tendremos que proporcionar a travs del par DE, el valor del contador, que determina el nmero de veces que se realizar el bucle iniciado con SALT1. Por tanto, podremos llamar a esta subrutina del modo siguiente:

_______________________________________ 105 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

CONTA EQU

7000H LXI D,CONTA CAL TEMPORIZ

Puede verse que dentro del bucle hay tres lneas en las que aparece la instruccin NOP. Con ella el microprocesador no ejecuta ninguna operacin. 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 fcilmente sin mas que calcular el nmero total de ciclos que emplean las instrucciones del bucle y multiplicarlos por el nmero de veces que se realiza el bucle y posteriormente aadir el nmero 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 : OUTPUT FILENAME : MOVERDAT.ASM MOVERDAT.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

;-------------------------------;NOMBRE : MOVERDATOS ;FUNCION : Mueve Datos en RAM ;PRECONDICION:ORIGEN,DESTINO,NUM ;POSTCONDICION : Datos en DESTINO ;-------------------------------00 84 00 88 3C 00 0000 0000 0001 0002 0003 0004 0007 000A 000C 000D 000F 0012 0013 0014 0017 0018 0019 001C 001D 001E 001F 0020 0021 0022 0024 0027 ORIGEN EQU DESTINO EQU NUM EQU 8400H 8800H 60

F5 E5 D5 C5 21 11 06 78 FE C2 7D BB C2 7C BA CA 7B 95 6F 7A 9C 67 FE C2 7D

00 84 00 88 3C 00 53 00

1C 00

53 00

00 48 00

MOVERDATOS: PUSH PSW PUSH H PUSH D PUSH B LXI H,ORIGEN LXI D,DESTINO MVI B,NUM MOV A,B CPI 00H JNZ FIN MOV A,L CMP E JNZ CONTI MOV A,H CMP D JZ FIN CONTI MOV A,E SUB L MOV L,A MOV A,D SBB H MOV H,A CPI 00H JNZ NOSOLAP MOV A,L

_______________________________________ 106 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 ******** CONTI NOSOLAP SALT2

0028 0029 002C 002F 0030 0031 0032 0033 0035 0036 0037 0038 0039 003A 003C 003D 003E 003F 0040 0041 0042 0045 0048 004B 004C 004D 004E 004F 0050 0053 0054 0055 0056 0057 0058

90 D2 21 7D 80 6F 7C CE 67 7B 80 5F 7A CE 57 2B 1B 7E 12 05 C2 C3 21 7E 12 23 13 05 C2 C1 D1 E1 F1 C9

48 00 00 84

00

00

3D 00 53 00 00 84

4B 00

SUB B JNC NOSOLAP SISOLAP LXI H,ORIGEN MOV A,L ADD B MOV L,A MOV A,H ACI 00H MOV H,A MOV A,E ADD B MOV E,A MOV A,D ACI 00H MOV D,A SALT1 DCX H DCX D MOV A,M STAX D DCR B JNZ SALT1 JMP FIN NOSOLAP LXI H,ORIGEN SALT2 MOV A,M STAX D INX H INX D DCR B JNZ SALT2 FIN POP B POP D POP H POP PSW RET END R E F E R E N C E = 8800 = 003C 002C FIN ORIGEN T A B L E 0053 = 8400 ********* MOVERDATOS SALT1 0000 003D

S Y M B O L I C 001C 0048 004B DESTINO NUM SISOLAP

LINES ASSEMBLED :

73

ASSEMBLY ERRORS :

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 DESTINO NUM EQU EQU EQU 8400H 8800H 60

LXI H,ORIGEN LXI D,DESTINO MVI B,NUM CALL MOVERDAT Para seguir el desarrollo de la subrutina, es conveniente analizar el pseudocdigo presentado en el tema anterior. Podemos ver como en las lneas 17, 18 y 19 se toman los datos iniciales con los que la subrutina debe ponerse en marcha.

_______________________________________ 107 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Entre las lneas 20 a 28 se establecen las comparaciones y decisiones de saltos pertinentes segn proceda finalizar la subrutina o continuar con el proceso. En las lneas siguientes podemos apreciar los dos bucles a ejecutar segn se produzca solapamiento o no del bloque de memoria.

6.6 ERRORES CORRIENTES PROGRAMANDO EN ENSAMBLADOR.

Queremos en este apartado enumerar algunos de los errores que corrientemente se cometen, cuando se desarrollan programas en ensamblador. Pueden establecerse, adems, determinadas categoras de errores y estudiar los errores tpicos dentro de cada una de ellas. Nosotros nos limitaremos a enumerar los ms elementales y que con ms frecuencia se presentan. Sabemos que los ensambladores son programas preparados para reconocer algn tipo de error como: Cdigos de operacin indefinidos, etiquetas indefinidas, etiquetas o nombres definidos en ms de un lugar, caracteres ilegales, operandos ilegales, formatos ilegales, etc. Estos errores son comunes y fciles de corregir al ser detectados por el ensamblador que nos proporcionar como salida determinados mensajes de error que nos orientarn sobre el error cometido. Sin embargo el problema se complica cuando un error confunde al ensamblador dando como salida unos mensajes de error equivocados, o bien, ni tan siquiera emite mensajes de error. Podemos destacar una serie de errores que se cometen al tratar con elementos de entrada/salida o perifricos 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 informacin, slo cuando una lnea de estado as lo indica. Recordar que para trabajar con elementos perifricos, es preciso en primer lugar programarlos. De no ser as podramos encontrarnos con un intercambio de informacin no autorizado. Olvidarnos que algunos componentes trabajan con lgica negativa. Confundir los registros que representan los puertos con los registros de programacin o control de los componentes perifricos.

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. Tambin 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 continuacin el byte ms significativo.

_______________________________________ 108 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 atencin 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 acta en las operaciones aritmticas cuando se produce un desbordamiento y es aconsejable tener precaucin en su uso. Despus de una operacin de comparacin (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 comn 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. Tambin podemos cometer errores cuando se intenta salir de un bucle apoyndonos en instrucciones de salto con condicin, cuando dicha condicin 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 actan 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. Adems cuando nos referimos al contenido de una direccin de memoria apuntada por el par HL, debemos emplear la referencia simblica M. Un error tpico 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, tambin interpreta decimal por defecto), Q como octal y caracteres entre comillas como representaciones ASCII. La letra que identifica el formato debe colocarse despus del valor en cuestin. 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 ejecucin de iteraciones, realizando un recorrido de ms o de menos. Hay que considerar que un proceso iterativo realizado a partir de un nmero Base, tal que sea Base+N el nmero de repeticiones, contiene N+1 recorridos y no N recorridos. Otros errores corrientes pueden ser: a. b. c. Olvidarse de la estructura LIFO de la pila del sistema. Marcar incorrectamente los arrays o bloques de datos (principio y fin). No tener en cuenta de forma apropiada las precondiciones y las postcondiciones de las subrutinas. Realizar una organizacin incorrecta del programa, con repeticin de rutinas de inicializacin, daando la eficiencia del mismo. Salir de una subrutina sin haber alcanzado el resultado deseado. Llevar a cabo un tratamiento incorrecto de las interrupciones, no habilitndolas adecuadamente mediante la instruccin EI, no guardando los registros necesarios en la pila cuando se accede a la subrutina de tratamiento de la interrupcin, no deshabilitndolas en transferencias multi-byte o durante la ejecucin de secuencias de instrucciones que no deben ser interrumpidas, etc.

d.

e. f.

_______________________________________ 109 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

6.7 EJERCICIOS.

1. 2. 3. 4. 5. 6.

El lenguaje ensamblador. Caractersticas. 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 lnea del programa fuente. Qu son las directivas de ensamblador?. Explicar cmo 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. Refirindonos a la subrutina ASCII1.ASM, si en el byte sealado por DIREDAT, tenemos el valor 67 qu valores nos mostrarn 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 direccin 810FH hasta la direccin 813FH.

7. 8.

9.

_______________________________________ 110 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

TRANSFERENCIA DE DATOS AL EXTERIOR (I).

_______________________________________ 111 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

7. TRANSFERENCIA DE DATOS AL EXTERIOR.

Adems de la circuitera estudiada hasta el momento, est claro que nuestro sistema quedara incompleto si no dispusiramos de los componentes adecuados que nos permitieran comunicarnos con el exterior de la CPU. A lo largo de este tema y del tema siguiente mostraremos el empleo de dos componentes bsicos para realizar este tipo de operaciones. La transmisin de datos en paralelo y la transmisin de datos en serie son los dos sistemas bsicos de transferencia de datos de que disponemos. La primera consiste adquirir (leer) o suministrar (escribir) grupos de informacin formados por palabras normalmente de 8 bits. Cada vez que se lee o escribe un dato se reciben o envan 8 bits simultneamente. La segunda forma de transmisin consiste en realizar el intercambio de informacin de modo que cada grupo de 8 bits se transmita por una nica lnea unos a continuacin de otros. Para realizar este proceso necesitaremos adems efectuar una sincronizacin entre el emisor y el receptor utilizando lneas de control. La casa INTEL ha diseado una serie de dispositivos perifricos especializados en realizar este tipo de operaciones, para ser acoplados directamente al bus del microprocesador 8085. Cada uno de ellos posee unas caractersticas determinadas y especiales que los diferencian entre s y los hacen ms o menos aptos para aplicaciones concretas. En este tema realizaremos un estudio bsico sobre el PPI 8255, diseado para trabajar directamente con 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 bloques de la FIG.7A , en el que podemos observar como la fuente de alimentacin suministra las tensiones precisas para todos los elementos del sistema.

FUENTE DE ALIMENTACION

SISTEMA BASICO DEL 8085

C1

PPI 8255

C2

C3 FIG.7A

El perifrico programable PPI 8255 ser gobernado por nuestro sistema bsico (fundamentado en el 8085) mediante un conjunto de lneas bidireccionales y las cargas finales sern controladas mediante los puertos de entrada/salida del PPI 8255. En los puntos que siguen se realizar:

_______________________________________ 112 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Una descripcin fsica detallada de todas las patillas o pines del PPI 8255. Una descripcin de su funcionamiento interno, indicando tambin los modos de programacin. La interconexin fsica del PPI8255 a nuestro sistema bsico. Un conjunto de ejercicios prcticos que nos permitirn programar este perifrico y comprobar su funcionamiento, empleando los tres puertos de entrada/salida.

7.1 DESCRIPCIN FSICA DEL PPI 8255.

El componente 8255A de INTEL es un Perifrico Programable de Interface (PPI) diseado para aplicaciones de carcter general como elemento de Entrada/Salida, que puede trabajar con los microprocesadores Intel y ms especficamente con el microprocesador 8085. Este elemento se presenta en un encapsulado de 40 patillas, como puede apreciarse en la FIG.71A, aunque tambin hay otras disposiciones que nos muestran una distribucin de patillas distinta, siendo la funcin de cada uno de ellas evidentemente la misma. Como podemos ver, emplea una tensin de alimentacin nica de +5V (filtrada y estabilizada). Las seales de sus entradas y salidas son totalmente compatibles con niveles de tensin TTL. Dispone de un total de 24 terminales (patillas) de entrada/salida que pueden programarse en dos grupos de 12 terminales cada uno y segn tres modos diferentes de operacin (modo 0, modo 1 y modo 2). En el modo 0 permite desarrollar simples operaciones de transferencia de datos con el exterior, es decir, operaciones de entrada/salida en bloques de 8 bits, pudiendo programar los 24 terminales como tres puertos independientes de E/S. En el modo 1 se proporcionan los medios para transferir datos de entrada/salida desde o hacia un puerto dado en combinacin con determinadas palabras de control y dilogo. En el modo 2 permite la comunicacin con algn perifrico mediante la constitucin de un bus bidireccional y determinadas seales de control.

La funcin de cada una de las patillas o terminales es la siguiente: Patillas PA0 a PA7: Terminales correspondientes a 8 lneas de entrada/salida del puerto A. Constituyen un byte de datos (octeto) de entrada/salida, siendo PA0 el bit de ms bajo orden y PA7 el bit de ms alto

_______________________________________ 113 ___________________________________________

PA3 PA2 PA1 PA0 RD CS GND A1 A0 PC7 PC6 PC5 PC4 PC0 PC1 PC2 PC3 PB0 PB1 PB2

3 4 5 6 7 8 9 10 11 12 13 14

FIG. 71A

15 16 17 18 19 20

1 2

38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

40 39

PA4 PA5 PA6 PA7 WR RESET D0 D1 D2 D3 D4 D5 D6 D7 Vcc PB7 PB6 PB5 PB4 PB3

PPI 8255

____________________ Curso 8085A ____________________________________________________________

orden. Patillas PB0 a PB7: Terminales correspondientes a 8 lneas de entrada/salida del puerto B. Constituyen un byte de datos (octeto) de entrada/salida, siendo PB0 el bit de ms bajo orden y PB7 el bit de ms alto orden. Patillas PC0 a PC7: Terminales correspondientes a 8 lneas de entrada/salida del puerto C. Constituyen un byte de datos (octeto) de entrada/salida, siendo PC0 el bit de ms bajo orden y PC7 el bit de ms alto orden. Patilla GND: Corresponde al terminal de masa o punto de referencia de alimentacin. Patilla Vcc: Corresponde al terminal de alimentacin de +5V filtrados y estabilizados. En esta patilla es conveniente situar un condensador de 100 nF para eliminar posibles seales parsitas o interferencias. Patillas D0 a D7: Son las ocho lneas correspondientes al bus de datos bidireccional del 8255, es decir un conjunto de lneas por las que circula informacin en ambas direcciones, desde el microprocesador hacia el 8255 y desde ste hacia el microprocesador. Patilla RD: Terminal correspondiente a la seal de lectura. Es activa con un nivel lgico BAJO. Es decir, cuando deseemos efectuar una operacin de lectura, tendremos que colocar un 0 lgico en esta lnea, para luego cargar informacin del 8255 en el acumulador del microprocesador. Patilla WR: Terminal correspondiente a la seal de escritura. Es activa con un nivel lgico 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 ms que colocar un 0 lgico 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 informacin de forma correcta hacia o desde el puerto deseado. Patilla RESET: Es el terminal de inicializacin o puesta a cero del 8255. Tiene un nivel activo ALTO. Patilla CS: Es el terminal de seleccin chip o seleccin de componente. Tiene un nivel activo BAJO.

7.2 DESCRIPCIN FUNCIONAL DEL PPI 8255.

Este perifrico programable de interface (PPI), no precisa de ninguna lgica externa para ser acoplado a otros componentes o estructuras perifricas. 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 travs de este buffer por la ejecucin de instrucciones de la CPU, es decir, del microprocesador 8085. Las palabras de Control y la informacin de estado tambin son transmitidas a travs del buffer del bus de datos.

Grupo Lectura/Escritura y Control Lgico. La funcin bsica 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 seales de este grupo son:

_______________________________________ 114 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

+5V MASA GRUPO CONTROL A BUFFER BUS DE DATOS GRUPO PUERTA A (8) E/S PA0 PA7

BUS DE DATOS

BUS DATOS INTERNO

GRUPO PUERTA C (4)

E/S PC4 PC7

WR A1 A0 RESET RD CONTROL LOGICO LECTURA ESCRITURA GRUPO PUERTA C (4) E/S PC0 PC3

GRUPO CONTROL B

GRUPO PUERTA B (8)

E/S PB0 PB7

CS

FIG. 72A

CS: Seleccin del microcircuito. Permite (con un 0 lgico) o inhibe (con un 1 lgico) la comunicacin entre el 8255A y el microprocesador 8085. RD: Lectura. Cuando se sita un 0 lgico en este terminal, permitimos al microprocesador 8085, leer algn dato del 8255A, es decir, cargamos en el acumulador del 8085, algn dato del 8255A. WR: Escritura. Al colocar un 0 lgico en este terminal, permitimos al microprocesador 8085, escribir algn dato o palabra de control, en el 8255A. RESET: Puesta a cero. Colocando un 1 lgico (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 0 0 1 0 0 1 1 X 1 X 0 1 0 0 1 0 1 X 1 X 0 0 0 1 1 1 1 X 0 1 1 1 1 0 0 0 0 X 1 1 0 0 0 0 0 0 0 1 0 0

OPERACIN QUE REALIZA Lee puerto A y carga en el bus de datos Lee puerto B y carga en el bus de datos Lee puerto C y carga en el bus de datos Escribe bus datos en la puerta A Escribe bus datos en la puerta B Escribe bus datos en la puerta C Escribe bus datos en palabra de control Bus de datos tri-estado Condicin ilegal Bus de datos tri-estado

A0 y A1: Selecciona los registros de comunicacin de que dispone el 8255A. Estas seales de entrada, en unin con las seales RD y WR, seleccionan uno de los tres puertos disponibles en el 8255A o el registro de la palabra de control (tambin llamado registro de estado). Normalmente se conectan a A0

_______________________________________ 115 ___________________________________________

____________________ 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 bsicas que realiza este componente segn sea el estado de las seales de control. Como podemos apreciar, las operaciones de lectura se realizan todas con la misma combinacin para las seales RD, WR y CS, siendo la combinacin presente en las seales A0 y A1, la que selecciona el puerto a ser leido, es decir, la procedencia de la informacin. Algo similar sucede en las operaciones de escritura, en las que se mantiene la misma combinacin para las seales RD, WR y CS siendo A0 y A1 las que sealan el destino de la informacin procedente del acumulador del microprocesador 8085. Finalmente se presentan tres estados en los que o bien se produce una condicin 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 comunicacin 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 caractersticas mediante el software adecuado. El puerto A dispone de un buffer de 8 bits para salida de datos y de una bscula de 8 bits para la entrada. El puerto B es similar al anterior en todas sus caractersticas. El puerto C tambin posee un buffer de salida de datos y una bscula de entrada, aunque en este caso dicho puerto puede dividirse en dos partes de 4 bits segn el modo de trabajo o control, conteniendo cada una de ellas una bscula de 4 bits y puede utilizarse para las salidas de las seales de control y entrada de las seales de estado en combinacin con los puertos A y B.

Cuando en la entrada Reset se coloca un 1 lgico todos los puertos del 8255A se colocan en modo entrada. Durante la ejecucin de cualquier programa, podemos modificar el modo de trabajo mediante una simple instruccin 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 segn se requiera por las definiciones de los puertos A y B. Todos los registros de salida incluidos los flip-flops de estado sern 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 instruccin OUTput. Esta caracterstica reduce el software requerido en aplicaciones de control. Cuando el 8255A se programa en modo 1 o en modo 2, las seales de control pueden ser empleadas como entradas de interrupcin a la CPU. Las seales de interrupcin 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 funcin set/reset de la puerta C.

7.3 MODOS DE FUNCIONAMIENTO.

Como se ha visto hasta el momento, podemos llevar a cabo una programacin del 8255A, mediante el software adecuado, segn tres modos distintos de trabajo que nos proporcionarn gran potencialidad a este PPI. Estos modos de trabajo son: a.- Modo 0: Este modo de funcionamiento proporciona un mtodo de entrada/salida bsico por cada uno de los tres puertos. Los datos son simplemente escritos en cada puerto, es decir, sacamos los datos procedentes del microprocesador, por el puerto que deseemos; o bien pueden ser ledos, es decir, llevamos hacia el acumulador del microprocesador, el dato presente en un determinado puerto.

_______________________________________ 116 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

CONFIGURACIONES POSIBLES EN MODO 0 D7 D6 D5 D4 D3 D2 D1 D0 PORT A PORT C(ALTA) PORT B PORT C(BAJA) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 salida salida salida salida salida entrada salida entrada salida entrada salida entrada entrada entrada entrada entrada salida salida salida salida entrada salida entrada salida entrada salida entrada salida entrada entrada entrada entrada salida salida entrada entrada salida salida salida salida entrada entrada entrada entrada salida entrada salida entrada salida entrada salida entrada salida salida entrada entrada salida salida entrada entrada salida salida entrada entrada

Las principales caractersticas de este modo son: 1. 2. 3. 4. 5. Se pueden configurar dos puertos de 8 bits y dos de 4 bits. Cualquier puerto puede ser entrada o salida. Las salidas contienen bsculas. Las entradas son directas, no contienen bsculas. Existen 16 posibles configuraciones de entrada/salida que se muestran en la tabla adjunta.

b.- Modo 1: Esta configuracin funcional nos permite realizar transferencias entrada/salida hacia o desde determinado puerto en unin a las palabras de control y dilogo. Los puertos A y B utilizan las lneas del puerto C para generar o aceptar las seales de dilogo. 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. 2. 3. 4. Existir dos "grupos" de trabajo.(Grupo A y grupo B). Cada grupo posee 8 bits de datos y un puerto adicional de 4 bits de control de datos. Los puertos de 8 bits (A y B) pueden ser ambos de entrada o salida mediante bsculas en los dos casos. El puerto de 4 bits se emplea para control y estado de los puertos de 8 bits.

c.- Modo 2: Esta configuracin funcional provee de un medio de comunicacin con componentes o estructuras perifricas en un bus simple de 8 bits para transmitir y recibir datos (bus bidireccional). Tambin contiene la generacin de interrupciones y funciones de actuacin/inhibicin. Las caractersticas fundamentales de este modo de funcionamiento son: 1. 2. 3. Solo se emplea el grupo A. El puerto A es el bus bidireccional de 8 bits y el puerto C emplea 5 bits de control. Las entradas y salidas emplean bsculas.

_______________________________________ 117 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

7.4 INTERCONEXIN DEL PPI 8255 CON EL P 8085A.

Como sabemos, el PPI 8255 es un componente diseado especficamente para trabajar con microprocesadores INTEL. En este caso, para incorporarlo a la tarjeta de nuestro sistema, tendremos que realizar las siguientes operaciones: Conectar el 8255 a la misma tensin (+5V) que el microprocesador 8085 (evidentemente, el terminal de masa tambin debe ser el mismo). En el terminal de Vcc es conveniente situar un condensador de 100 nF, al objeto de eliminar posibles parsitos o interferencias. Los terminales o patillas correspondientes a las seales RD y WR sern conectadas directamente a las seales de idntica denominacin del microprocesador 8085. Estas seales estn disponibles en el conector CON3 correspondiente a la FIG.24A (ver tema 2). Las seales correspondientes al bus de datos del 8255 (D0, D1, D2, D3, D4, D5, D6, D7) sern conectadas directamente al bus de datos/direcciones del 8085 de denominacin equivalente. Estas seales estn 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 aade un condensador a masa de 10 nF. La seal de RESET OUT se encuentra en el conector CON3 de la FIG.24A (tema 2). Las dos lneas de control A0 y A1 del 8255, pueden ser conectadas a cualquier par de lneas del bus de direcciones del microprocesador 8085. Sin embargo, lo ms normal, es que A0 y A1 sean conectadas a las lneas de misma denominacin del bus de direcciones del 8085. Nosotros as lo haremos y podemos encontrarlas en el conector CON1 de la FIG.24A (tema 2). La seal de seleccin de chip CS, debe ser conectada a una de las salidas disponibles en el decodificador de direcciones (74LS138). Nosotros realizaremos la conexin a la salida CS3 que nos proporciona dicho componente y a cuya lnea tendremos acceso en el conector CON3 de la FIG.24A (tema 2). El resto de las patillas de 8255 constituyen las 24 lneas disponibles para comunicacin con el exterior, es decir, forman las lneas 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 seleccin de chip a la salida CS3 del decodificador, situamos este componente en la direccin B000H, y puesto que se han conectado A0 y A1 directamente a las direcciones A0 y A1 respectivamente del microprocesador, tendremos como direcciones de acceso definitivas para este componente:

DIRECCION B000H B001H B002H B003H

ELEMENTO SELECCIONADO Puerto A Puerto B Puerto C Registro C/E

_______________________________________ 118 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

+5V C17 100K

26

13 12 11 10

PC4 PC5 PC6 PC7

40 39 38 37

PA4 PA5 PA6 PA7

RESET OUT

RESET 10nF

35 18 19 20 21 22 23 24 25 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

A0 A1 WR RD CS3

A0 A1 WR RD CS

FIG.74A

7.5 APLICACIONES PRCTICAS CON EL 8255.

En este apartado estudiaremos algunas aplicaciones sencillas que nos permitan entender el funcionamiento bsico del PPI 8255 y su modo de programacin. Para ello se desarrollarn unos ejercicios muy elementales que sern el inicio o punto de partida para ms adelante realizar tareas ms complejas.

EJERCICIO 1. Se pretende desarrollar un programa que aplicado a nuestro sistema y apoyndose en el PPI 8255, realice 20 intermitencias con 8 lmparas de 12V (corriente continua). Para llevar a cabo esta tarea debemos darnos cuenta que, siendo el PPI 8255 nuestro medio de comunicacin con el exterior, no es posible manejar las mencionadas lmparas de forma directa, sino que _______________________________________ 119 ___________________________________________

PUERTO B

PUERTO A

D0 D1 D2 D3 D4 D5 D6 D7

D0 D1 D2 D3 D4 D5 D6 D7

34 33 32 31 30 29 28 27

CI12 8255

4 3 2 1

PA0 PA1 PA2 PA3

PUERTO C

14 15 16 17

PC0 PC1 PC2 PC3

____________________ Curso 8085A ____________________________________________________________

necesitamos el apoyo de algn elemento auxiliar que nos permita adaptar la tensin de trabajo del 8255 (+5V) con la tensin de trabajo de las lmparas (+12V). Para realizar esta misin emplearemos un circuito integrado denominado ULN 2803. En la FIG.75A podemos ver su distribucin de patillas y adems 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 estn compuestos por conjuntos de transistores con montaje darlington y salida en colector abierto. Pueden soportar tensiones de hasta +50V.

E0 E1 E2 E3 E4 E5 E6 E7 GND

1 2 3 4 5 6 7 8 9

18 17 16 15 14 13 12 11 10

S0 S1 S2 S3 S4 S5 S6 S7 COMUN+

FIG.75A

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 tensin comn de las lmparas (+12V). (Notar que en este caso estamos tratando una carga resistiva). Apoyndonos ahora en este nuevo componente realizaremos la conexin mostrada en la FIG.75B, en la que podemos apreciar la conexin de las lmparas 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, sern 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 lgico por el terminal PA4 del 8255, dicha seal es inyectada a la entrada E4 del ULN 2803 y en su salida S4, tendremos un 0 lgico, por lo que circular corriente por la lmpara conectada en dicha salida, es decir se iluminar la lmpara L4.

_______________________________________ 120 ___________________________________________

ULN 2803

____________________ Curso 8085A ____________________________________________________________

+12V

COMUN+ PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 E0 E1 E2


ULN 2803

S0 S1 S2 S3 S4 S5 S6 S7 GND

L0 L1 L2 L3 L4 L5 L6 L7

E3 E4 E5 E6 E7

FIG.75B

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 generacin del siguiente pseudocdigo, 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 lmparas 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 ms detalle distintos pasos de este pseudocdigo. 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 tambin 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 accin realizar intermitencia que bsicamente consistir en encender y apagar las lmparas, permaneciendo en cada estado un tiempo determinado.

Teniendo en cuenta estas consideraciones, realizamos un refinado del pseudocdigo, obteniendo: NOMBRE: INTERMI FUNCION: Intermitencia de 8 lmparas 20 veces. PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna.

_______________________________________ 121 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Prohibir interrupciones Puntero de pila Programar PPI 8255 B=20 MIENTRAS B>0 Encender lmparas Temporizar Apagar lmparas Temporizar B=B-1 FIN DE MIENTRAS Fin del programa

Con este pseudocdigo podramos pasar a construir el programa definitivo en ensamblador, sin embargo vamos a incluir aqu, para ms detalle, el diagrama de flujo de la FIG.75C que representa grficamente este proceso.

Inicio

Prohibir Interrupciones Puntero de Pila Programar PPI 8255

B=20

No B>0 Si Encender lmparas Fin del programa

Temporizar

Apagar lmparas

Temporizar

B=B-1

FIG.75C

A continuacin se presenta el listado del programa ensamblado. En l podemos apreciar fundamentalmente los siguientes pasos:

_______________________________________ 122 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : INTERMI.ASM INTERMI.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

;-----------------------------------------;NOMBRE : INTERMI ;FUNCION : Intermitencia de lamparas ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;-----------------------------------------;-----------------------------------------;PARAMETROS PARA EL 8255 ;-----------------------------------------PA82 EQU B000H ;Puerto A del 8255 PB82 EQU B001H ;Puerto B del 8255 PC82 EQU B002H ;Puerto C del 8255 REES82 EQU B003H ;Reg. Est. del 8255 ;-----------------------------------------;-----------------------------------------;PARAMETROS PUNTERO DE PILA ;-----------------------------------------PPILA EQU 87FFH ;Puntero de pila ;-----------------------------------------INTERMI: DI LXI H,PPILA SPHL MVI A,8AH STA REES82 MVI B,20 SAL1 MOV A,B ANA A JZ FIN MVI A,FFH STA PA82 CALL TEMPO MVI A,00H STA PA82 CALL TEMPO DCR B JMP SAL1 ;-----------------------------------------;NOMBRE: TEMPO ;FUNCION: Proporciona un tiempo de espera ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Modifica registros D y E ;-----------------------------------------TEMPO: PUSH PSW LXI D,07FFH TE1 DCX D MOV A,D ORA E NOP NOP NOP JNZ TE1 POP PSW RET FIN HLT END

00 01 02 03

B0 B0 B0 B0

FF 87 0000 0000 0001 0004 0005 0007 000A 000C 000D 000E 0011 0013 0016 0019 001B 001E 0021 0022

F3 21 F9 3E 32 06 78 A7 CA 3E 32 CD 3E 32 CD 05 C3

FF 87 8A 03 B0 14

34 FF 00 25 00 00 25

00 B0 00 B0 00

0C 00

0025 0025 0026 0029 002A 002B 002C 002D 002E 002F 0032 0033 0034 0035

F5 11 FF 07 1B 7A B3 00 00 00 C2 29 00 F1 C9 76

_______________________________________ 123 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

*********** FIN PC82 TE1

S Y M B O L I C INTERMI PPILA TEMPO

R E F E R E N C E 0000 = 87FF 0025 60 PA82 REES82

T A B L E = B000 = B003

*********** = B001 000C

0034 = B002 0029

PB82 SAL1

LINES ASSEMBLED :

ASSEMBLY ERRORS :

En primer lugar definimos (desde la lnea 8 hasta la 21) una serie de parmetros para referirnos al 8255 y a la pila, de modo que resulte ms sencillo su empleo en un momento determinado. Por ejemplo, si necesitamos sacar un dato por el puerto A del 8255, tendramos que hacer referencia a la direccin B000H, sin embargo de este modo no tendremos ms que hacer referencia a PA82. Este mtodo simplifica mucho la tarea de programar a medida que va creciendo el programa en nmero de lneas y empleamos ms componentes en nuestro sistema. Si seguimos las instrucciones del pseudocdigo (o el diagrama de flujo) vemos que las lneas de cdigo 23 hasta 27, corresponden al proceso de iniciacin del sistema. (Prohibir interrupciones,...). En la lnea 28 se inicia la variable B segn el valor que se le da al registro B. En las lneas 29, 30 y 31 se plantea la ruptura de secuencia segn se cumpla B>0. En las dos instrucciones siguientes (32 y 33) se encienden las 8 lmparas y hacemos que permanezcan en este estado durante un tiempo marcado por la subrutina de temporizacin (TEMPO). En las lneas 35 y 36 apagamos las lmparas que permanecern as durante el mismo intervalo de tiempo que estuvieron encendidas. En la lnea 38 se decrementa el contador o variable B, para a continuacin volver a realizar el proceso nuevamente, mientras se cumpla que B>0. La subrutina de temporizacin (TEMPO) es la que nos permite realizar los tiempos de espera, durante los que las lmparas permanecern 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 lmparas sea ms rpida (con un valor menor) o sea mas lenta (con un valor mayor). (Debe quedar claro que, aunque aqu no se hace mencin alguna acerca de la construccin de la subrutina de temporizacin, sta ha sido tomada de la subrutina TEMPORIZ desarrollada en el ejemplo 7 del tema anterior). En la lnea de cdigo 26 (MVI A,8AH) se proporciona el dato (8AH) para programar el 8255 mediante la instruccin 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 programacin en modo 0 presentada en el apartado 7.3 de este tema. Podramos haber elegido cualquier otra combinacin que nos proporcionara el puerto A como salida ya que sta es la nica condicin necesaria para este ejercicio al quedar los otros puertos sin uso.

EJERCICIO 2

Desarrollar un programa que nos permita controlar 24 lmparas 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 lmparas estn 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 realizacin de la tarea encomendada.

_______________________________________ 124 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

En primer lugar realizaremos un anlisis 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 lneas de los tres puertos (PA, PB y PC) del 8255. Segn esta conexin fsica, cuando deseemos encender la lmpara L12 tendremos que sacar un 1 lgico por la lnea 5 del puerto B, es decir por PB4. Si deseamos encender la lmpara L23, debemos sacar un 1 lgico por PC7. Procediendo de modo similar podremos encender todas y cada una de las 24 lmparas que deseamos controlar. Establecida ya la configuracin fsica de los elementos a controlar no queda ms que desarrollar un programa que lleve a cabo el encendido secuencial de las 24 lmparas. Por encendido secuencial entendemos que, partiendo de una situacin inicial en que todas las lmparas se encuentren apagadas, se iran encendiendo una a una (comenzando por L0 por ejemplo) hasta que en la posicin final se encuentren todas encendidas. La velocidad a la que iran iluminndose las lmparas, la impondremos nosotros (no nos dicen nada al respecto) mediante el empleo de una subrutina de temporizacin. 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 iteracin se ilumine una nueva lmpara, hasta completar las 24 en total. Cada bucle se emplear para controlar un puerto concreto y se sacarn los datos en primer lugar por el puerto A, a continuacin por el puerto B y finalmente por el puerto C. Adems necesitaremos emplear una variable contador que nos posibilite realizar el nmero de iteraciones deseadas en cada bucle. Usaremos la variable B a la que asignaremos el valor 8 al comenzar cada bucle. Tambin debemos tener en cuenta que en cada iteracin que se realice el dato que tenemos que sacar vara, por lo que se debe realizar una preparacin del dato antes de enviarlo al puerto correspondiente.

En base a estas ideas previas desarrollamos el siguiente pseudocdigo: NOMBRE: SECUEN FUNCION: Encendido secuencial de 24 lmparas 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

_______________________________________ 125 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Temporizar B=B-1 FIN DE MIENTRAS Fin del Programa

COMUN+ PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 E0 E1 E2 E3 E4 E5 E6 E7 S0 S1 S2 S3 S4 S5 S6 S7 L0 L1 L2 L3 L4 L5 L6 L7

GND

ULN 2803

+12V COMUN+ PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 E0 E1 E2 E3 E4 E5 E6 E7 S0 S1 S2 S3 S4 S5 S6 S7 L8 L9 L10 L11 L12 L13 L14 L15

GND

COMUN+ PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 E0 E1 E2 E3 E4 E5 E6 E7 S0 S1 S2 S3 S4 S5 S6 S7 L16 L17 L18 L19 L20 L21 L22 L23

GND

FIG.75D

Podemos ahora pasar a realizar un nuevo paso de refinamiento en el desarrollo del programa analizando detenidamente los distintos procesos planteados, mostrando con ms detalle cada uno de ellos de modo que llegue un momento que podamos convertirlo a mnemnicos de ensamblador. De este modo el programa puede ser el siguiente: NOMBRE: SECUEN

_______________________________________ 126 ___________________________________________

ULN 2803

ULN 2803

____________________ Curso 8085A ____________________________________________________________

FUNCION: Encendido secuencial de 24 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones Punterizar la pila Programar el PPI 8255 Apagar todas las lmparas 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 continuacin, en la FIG.75E, se muestra el diagrama de flujo en el que tambin nos podemos apoyar para entender el funcionamiento del programa. Como podemos ver tanto en esta figura como en el pseudocdigo, tenemos tres bucles muy similares, solo se diferencian en las instrucciones que permiten sacar el Dato al exterior, por tanto sera posible e interesante realizar una subrutina comn que sustituyera a los tres bucles.

_______________________________________ 127 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INICIO

Prohibir interrupciones Punterizar la pila Programar el PPI 8255

Apagar todas las lmparas

Temporizar

C=00H B=8 SALT3 No

B>0 Si Carry=1 Rotar A a izquierdas Sacar dato al puerto A

SALT1 C=00H B=8 SALT4 No

B>0 Temporizar Si Carry=1 Rotar A a izquierdas Sacar dato al puerto B

SALT2 C=00H B=8 SALT5 No

B=B-1

B>0 Temporizar Si Carry=1 Rotar A a izquierdas Sacar dato al puerto C

FIN

B=B-1

Temporizar

B=B-1

FIG.75E

_______________________________________ 128 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 : OUTPUT FILENAME : SECUEN.ASM SECUEN.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

;-----------------------------------------;NOMBRE : SECUEN ;FUNCION : Encendido secuencal 24 lmparas ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;-----------------------------------------;-----------------------------------------;PARAMETROS PARA EL 8255 ;-----------------------------------------PA82 EQU B000H ;Puerto A del 8255 PB82 EQU B001H ;Puerto B del 8255 PC82 EQU B002H ;Puerto C del 8255 REES82 EQU B003H ;Reg. Est. del 8255 ;-----------------------------------------;-----------------------------------------;PARAMETROS PUNTERO DE PILA ;-----------------------------------------PPILA EQU 87FFH ;Puntero de pila ;-----------------------------------------SECUEN: DI LXI H,PPILA SPHL MVI A,80H STA REES82 MVI A,00H STA PA82 STA PB82 STA PC82 CALL TEMPO MVI C,00H MVI B,8 SALT3 MOV A,B ANA A JZ SALT1 STC MOV A,C RAL MOV C,A STA PA82 CALL TEMPO DCR B JMP SALT3 SALT1 MVI C,00H MVI B,8 SALT4 MOV A,B ANA A JZ SALT2 STC MOV A,C RAL MOV C,A STA PB82 CALL TEMPO

00 01 02 03

B0 B0 B0 B0

FF 87 0000 0000 0001 0004 0005 0007 000A 000C 000F 0012 0015 0018 001A 001C 001D 001E 0021 0022 0023 0024 0025 0028 002B 002C 002F 0031 0033 0034 0035 0038 0039 003A 003B 003C 003F

F3 21 F9 3E 32 3E 32 32 32 CD 0E 06 78 A7 CA 37 79 17 4F 32 CD 05 C3 0E 06 78 A7 CA 37 79 17 4F 32 CD

FF 87 80 03 00 00 01 02 5E 00 08

B0 B0 B0 B0 00

2F 00

00 B0 5E 00 1C 00 00 08

46 00

01 B0 5E 00

_______________________________________ 129 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

0042 0043 0046 0048 004A 004B 004C 004F 0050 0051 0052 0053 0056 0059 005A 005D

05 C3 0E 06 78 A7 CA 37 79 17 4F 32 CD 05 C3 76

33 00 00 08

SALT2 SALT5

5D 00

02 B0 5E 00 4A 00 FIN

DCR B JMP SALT4 MVI C,00H MVI B,8 MOV A,B ANA A JZ FIN STC MOV A,C RAL MOV C,A STA PC82 CALL TEMPO DCR B JMP SALT5 HLT

005E 005E 005F 0062 0063 0064 0065 0066 0067 0068 006B 006C 006D

F5 11 FF 07 1B 7A B3 00 00 00 C2 62 00 F1 C9

;-----------------------------------------;NOMBRE: TEMPO ;FUNCION: Proporciona un tiempo de espera ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------TEMPO: PUSH PSW LXI D,07FFH TE1 DCX D MOV A,D ORA E NOP NOP NOP JNZ TE1 POP PSW RET END

**********

S Y M B O L I C

R E F E R E N C E

T A B L E

***************

FIN PPILA SALT3 TE1

005D = 87FF 001C 0062

PA82 REES82 SALT4 TEMPO

= B000 = B003 0033 005E

PB82 SALT1 SALT5

= B001 002F 004A

PC82 SALT2 SECUEN

= B002 0046 0000

LINES ASSEMBLED :

93

ASSEMBLY ERRORS :

Como podemos apreciar, en las primeras lneas (en este caso de la lnea 1 a la lnea 6) se presentan el nombre, funcin, precondiciones y postcondiciones del programa o subrutina, en forma de comentarios. Recordemos que los comentarios comienzan con el signo ; y adems no forman parte del programa objeto. En las lneas 11 a 14 se establecen los parmetros 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 lnea 20, definimos la direccin del puntero de pila. El programa comienza en la lnea 23 y desde sta hasta la lnea 27 se realiza el proceso de inicializacin 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 lnea 28 a la 31, se realiza el apagado de todas las lmparas a controlar y en la lnea 32 se realiza una llamada a la subrutina de temporizacin. En las lneas 33 y 34 se establecen los valores iniciales de los Datos (C=00H) y del contador (B=8). Podemos ver cmo en las lneas 35, 36 y 37 se lleva a cabo una toma de decisin.

_______________________________________ 130 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

En las lneas 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 lnea 43 se realiza una llamada a la subrutina de temporizacin. En las lneas 44 y 45, se establece de nuevo el lazo, en caso de que el contador (B) no sea cero. El resto de las lneas no se comentan, pues se trata de tres lazos similares. Notar que entre las lneas 74 y 91, se encuentra la subrutina de temporizacin. 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 lnea 82.

EJERCICIO 3 Desarrollar el software y hardware necesarios para, a travs del 8255, poder controlar 8 lmparas (L0, L1, ..., L7) y 8 pulsadores (P0, P1, ..., P7) de manera que mientras permanezca accionado un pulsador cualquiera, se ilumine su lmpara correspondiente. Es decir, si se acciona P3 se iluminar L3, si se accionan P3 y P5 se iluminarn L3 y L5, etc. En primer lugar tendremos que disear el hardware necesario para desarrollar esta actividad. Emplearemos para activar las lmparas, el conocido ULN 2803, que ser manejado por el puerto A del 8255. Para la deteccin 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 seal proporcionada ser un 1 lgico y cuando el pulsador es accionado, tendremos un 0 lgico. Los pulsadores sern controlados por el puerto B del 8255.
COMUN+ PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 E0 E1 E2 E3 E4 E5 E6 E7 GND S0 S1 S2 S3 S4 S5 S6 S7 L0 L1 L2 L3 L4 L5 L6 L7 +12V

ULN 2803

RED +5V 10K

100nF

47

PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

RED RED RED RED RED RED RED RED

P0 P1 P2 P3 P4 P5 P6 P7

FIG.75F

_______________________________________ 131 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Como vemos en la FIG.75F los bloques marcados como RED son todos idnticos entre s e iguales a la red mostrada en la misma figura. Resuelta ya la disposicin fsica 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 pseudocdigo necesario puede ser el siguiente:

NOMBRE: PULSAR FUNCION: Control de 8 pulsadores y 8 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Iniciar el sistema Leer Dato de contactos Tratar el Dato ledo Sacar Dato a lmparas Volver a Leer Dato de contactos Final del programa Debemos proceder a un refinado del pseudocdigo de forma que aclaremos del mejor modo y de manera ms precisa todos los conceptos expresados. Mostrando en ms detalle los distintos puntos tendremos: NOMBRE: PULSAR FUNCION: Control de 8 pulsadores y 8 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones Punterizar la pila Programar el PPI 8255 Apagar las lmparas 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 explcito, pero an queda por aclarar qu significa exactamente Tratar el dato ledo. Dado que debemos hacer corresponder cada pulsador con su lmpara 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 lmpara correspondiente y adems la conexin fsica se realiza de modo que la seal de cada pulsador (P0, P1, ..., P7) corresponde directamente con las lneas PB0, PB1, ..., PB7 del puerto B del 8255 y las lmparas corresponden exactamente igual con las lneas PA0, PA1, ..., PA7 del puerto A del 8255, no tendremos que realizar ningn tratamiento especial. Solo deberemos considerar el hecho de que cuando se detecte un pulsador accionado, en la correspondiente lnea de entrada habr un 0 lgico y para encender la lmpara correspondiente hay que sacar un 1 lgico. Lo contrario sucede con los pulsadores que quedan sin activar. Por tanto el Dato ledo 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 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones

_______________________________________ 132 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Punterizar la pila Programar el PPI 8255 Apagar las lmparas 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 penltima lnea, establecemos la accin Volver a Leer Dato de PB82, esto provoca que el programa se est ejecutando permanentemente, en una accin sin fin. Por tanto este programa continuar ejecutndose hasta que la alimentacin sea interrumpida. A continuacin, en la FIG.75G se muestra el diagrama de flujo del mismo.

INICIO

Prohibir interrupciones Punterizar la pila Programar el PPI 8255

Apagar las lmparas

Leer Dato de PB

Dato=Dato complementado

Sacar Dato por PA

FIG.75G

Para finalizar, no nos queda ms que traducir el programa propuesto en pseudocdigo, al lenguaje ensamblador, obteniendo as el programa definitivo que se muestra a continuacin.
2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : PULSAR.ASM PULSAR.OBJ

1 2 3 4 5 6 7

;-----------------------------------------;NOMBRE : PULSAR ;FUNCION : Control 8 pulsad y 8 lmparas ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;------------------------------------------

_______________________________________ 133 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

00 01 02 03

B0 B0 B0 B0

;-----------------------------------------;PARAMETROS PARA EL 8255 ;-----------------------------------------PA82 EQU B000H ;Puerto A del 8255 PB82 EQU B001H ;Puerto B del 8255 PC82 EQU B002H ;Puerto C del 8255 REES82 EQU B003H ;Reg. Estado 8255 ;-----------------------------------------;-----------------------------------------;PARAMETROS PUNTERO DE PILA ;-----------------------------------------PPILA EQU 87FFH ;Puntero pila RAM ;-----------------------------------------PULSAR: DI LXI H,87FFH SPHL MVI A,82H STA REES82 MVI A,00H STA PA82 LEER LDA PB82 CMA STA PA82 JMP LEER END

FF 87 0000 0000 0001 0004 0005 0007 000A 000C 000F 0012 0013 0016 0019 0019

F3 21 F9 3E 32 3E 32 3A 2F 32 C3

FF 87 82 03 B0 00 00 B0 01 B0 00 B0 0F 00

***********

S Y M B O L I C

R E F E R E N C E

T A B L E

*************

LEER PPILA

000F = 87FF

PA82 PULSAR

= B000 0000

PB82 REES82

= B001 = B003

PC82

= B002

LINES ASSEMBLED :

35

ASSEMBLY ERRORS :

Como podemos apreciar, las primeras lneas se emplean para documentar el programa y establecer los parmetros de programacin y acceso a diversos componentes, en este caso el PPI 8255 y la pila (memoria RAM). Las primeras lneas de programa, son de inicializacin y apagado de lmparas (lneas 23 a 29). En la lnea 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 lnea 31, se encarga de complementar el dato del acumulador. La lnea 32 saca al exterior, a travs del puerto A, el dato que hay en el acumulador. La lnea 33 provoca un salto incondicional a la lnea 30 (LEER) para volver a leer el puerto A y continuar el ciclo de forma indefinida.

EJERCICIO 4 Efectuar un control de 64 lmparas de modo que se iluminen una a una de forma consecutiva. En primer lugar tendremos que realizar un diseo del hardware que nos permita controlar de forma apropiada las 64 unidades de lmparas. Dado que no nos imponen ningn tipo de restriccin y claramente podemos observar la insuficiencia de lneas de control en los tres puertos del 8255, podramos pensar en aadir a nuestro sistema los PPI 8255 necesarios para cubrir la demanda. Sin embargo rechazaremos esta idea inicial, para trabajar sobre la construccin de una matriz de lmparas 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 encontrara situada un lmpara, por lo que controlaramos en total las 64 lmparas exigidas.

_______________________________________ 134 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

PUERTO A

FIG.75H

Para entrar a tratar la construccin propia de la matriz, fijmonos en primer lugar en una matriz de 2x2 al objeto de comprender su funcionamiento con mayor facilidad. Una matriz de este tamao responde a la FIG.75I. En ella puede apreciarse como para iluminar una lmpara, 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 diseo actual, adems de iluminarse la lmpara en cuestin, tambin circulara corriente por las lmparas L21, L22 y L12, que quedaran conectadas en paralelo segn se muestra en la FIG.75J iluminndose las mismas de forma ms tenue, pues estaran trabajando a 4V la unidad.

PUERTO B

+12V L21 L22 F2 C1

L21

L22 L11 L12 F1 L12

L11

C1

C2

F1

+12V FIG.75J

FIG.75I

_______________________________________ 135 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Por tanto este diseo de matriz no es suficiente para llevar a cabo la tarea pedida. Solucionamos este problema, colocando en serie con cada lmpara, un diodo 1N4001, que obligue a circular la corriente en un nico sentido a travs de las lmparas, e impidiendo su paso en sentido contrario. Atendiendo a esta ltima consideracin, tendremos una matriz de 8x8 segn se muestra en la FIG.75K, en la que podemos apreciar con claridad la disposicin de los diodos.

L70 D70 L60 D60 L50 D50 L40 D40 L30 D30 L20 D20 L10 D10 L00 D00

L71 D71 L61 D61 L51 D51 L41 D41 L31 D31 L21 D21 L11 D11 L01 D01

L72 D72 L62 D62 L52 D52 L42 D42 L32 D32 L22 D22 L12 D12 L02 D02

L73 D73 L63 D63 L53 D53 L43 D43 L33 D33 L23 D23 L13 D13 L03 D03

L74 D74 L64 D64 L54 D54 L44 D44 L34 D34 L24 D24 L14 D14 L04 D04

L75 D75 L65 D65 L55 D55 L45 D45 L35 D35 L25 D25 L15 D15 L05 D05

L76 D76 L66 D66 L56 D56 L46 D46 L36 D36 L26 D26 L16 D16 L06 D06

L77 D77 L67 D67 L57 D57 L47 D47 L37 D37 L27 D27 L17 D17 L07 D07

FIG.75K

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 lneas de la matriz con las salidas de dicho integrado, sino que necesitamos del concurso de algn elemento de potencia que realice esta funcin. En este caso disearemos la etapa final a base de transistores, ocho para las filas y ocho para las columnas. De esta manera, cuando deseemos iluminar una lmpara cualquiera, no tendremos ms 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.

_______________________________________ 136 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

PB0
R9

PB1
R10

PB2
R11 R12

PB3

PB4
R13

PB5
R14

PB6
R15

PB7
R16 T16

T10

T11

T12

T13

T14

T15

T9

+12V L70 D70 L60 D60 L50 D50 L40 D40 L30 D30 L20 D20 L10 D10 L00 D00 L01 D01 L11 D11 L02 D02 L21 D21 L12 D12 L03 D03 L31 D31 L22 D22 L13 D13 L04 D04 L41 D41 L32 D32 L23 D23 L14 D14 L05 D05 L51 D51 L42 D42 L33 D33 L24 D24 L15 D15 L06 D06 L61 D61 L52 D52 L43 D43 L34 D34 L25 D25 L16 D16 L07 D07 L71 D71 L62 D62 L53 D53 L44 D44 L35 D35 L26 D26 L17 D17 L72 D72 L63 D63 L54 D54 L45 D45 L36 D36 L27 D27 L73 D73 L64 D64 L55 D55 L46 D46 L37 D37 L74 D74 L65 D65 L56 D56 L47 D47 L75 D75 L66 D66 L57 D57 L76 D76 L67 D67 L77 D77 T8 R8 PA7 T7 R7 PA6 T6 R6 PA5 T5 R5 PA4 T4 R4 PA3 T3 R3 PA2 T2 R2 PA1 T1 R1 PA0

FIG.75L

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 prximas 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 saturacin, tendremos que suministrar un nivel de tensin 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 caractersticas 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 lmpara L34, hay que sacar un 1 lgico por PA3 y un 0 lgico por PB4. Construido ya el hardware, pasaremos inmediatamente a desarrollar el software que realice el control de las lmparas segn los requerimientos pedidos. Puesto que nos piden el encendido consecutivo de todas las lmparas, 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 continuacin se proceder igual con la columna 1 y as sucesivamente hasta completas la columna 7 con la ltima lmpara L77. El primer pseudocdigo con el que podemos iniciar este programa, puede ser el siguiente:

_______________________________________ 137 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

NOMBRE: MATRIZ FUNCION: Encendido secuencial de 64 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Iniciar el sistema Preparar Datos iniciales Contador =0 MIENTRAS Contador<64 Activar lmpara Temporizar Preparar Datos Contador=Contador+1 FIN DE MIENTRAS Fin del programa Procediendo ahora a un estudio ms detallado del pseudocdigo 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 electrnico en disposicin 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 ejecucin. 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 lmpara. Estos datos pueden almacenarse en los registros D y E. Adems necesitamos un Contador para saber cuando se ha finalizado el proceso, es decir, cuando se ha iluminado la ltima lmpara (L77). Vamos a asignar esta misin al registro C. El proceso Activar lmpara, 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 lmpara iluminada. Finalmente tendremos que desarrollar los pasos necesarios de preparacin de los Datos para activar la lmpara siguiente y repetir este proceso hasta completarlo con el encendido de la lmpara L77. Teniendo en cuenta todo esto obtendremos: NOMBRE: MATRIZ FUNCION: Encendido secuencial de 64 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones Punterizar la pila Programar el PPI 8255 Apagar las lmparas 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

_______________________________________ 138 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Nos detendremos un poco en analizar el proceso Preparar Datos que deberemos enunciar de forma ms 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 lmpara L00. A continuacin pretendemos encender la lmpara 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 posicin a la izquierda de forma que el bit de mayor peso pasa a ocupar la posicin del bit de menor peso. Continuaremos con este proceso hasta completar las ocho lmparas correspondientes a la columna 0. Los datos a sacar se muestran a continuacin: 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 rotacin nos introducira otra vez el dato 0000 0001 en el registro D, que sera el dato necesario para encender una lmpara de la fila 0 (es lo que deseamos ahora) por lo que el proceso sera 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 rotacin a la izquierda del contenido del registro E. Para detectar el momento en que debemos efectuar la rotacin de E podemos utilizar el flag CARRY al efectuar la ltima rotacin de D entrar un 1 en dicho flag y al detectar esta condicin es cuando puede efectuarse una rotacin de E. Los datos necesarios para controlar las lmparas de la columna 1 se muestran a continuacin: Registro D 0000 0001 0000 0010 0000 0100 0000 1000 0001 0000 0010 0000 0100 0000 1000 0000 Registro E 1111 1101 1111 1101 1111 1101 1111 1101 1111 1101 1111 1101 1111 1101 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 rotacin al registro E, hasta que la variable Contador (registro C) nos marque el final del proceso. Desarrollando ahora el paso Preparar Datos tendremos como pseudocdigo: NOMBRE: MATRIZ FUNCION: Encendido secuencial de 64 lmparas PRECONDICIONES: Ninguna. POSTCONDICIONES: Ninguna. Prohibir interrupciones Punterizar la pila Programar el PPI 8255 Apagar las lmparas D=01H E=FEH C=0 MIENTRAS C<64 Sacar D al puerto A Sacar E al puerto B Temporizar Poner CARRY=0

_______________________________________ 139 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 continuacin se muestra el diagrama de flujo del pseudocdigo (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 lmparas

D=01H E=FEH C=0 SALT2 No

C<64 Si

Sacar D al puerto A Sacar E al puerto B Temporizar

FIN

CARRY=0 Rotar D a izqda. con CARRY

CARRY=1 Si Rotar E a izqda.

No

SALT1 C=C+1

FIG.75M

_______________________________________ 140 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Para finalizar este ejercicio, tendremos que determinar el programa en lenguaje ensamblador, partiendo o teniendo como base el pseudocdigo escrito con anterioridad, obteniendo as el programa fuente definitivo, cuyo listado se muestra a continuacin una vez ensamblado.

2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : MATRIZ.ASM MATRIZ.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

;-----------------------------------------;NOMBRE : MATRIZ ;FUNCION : Encendido secuencial 64 lamparas ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;-----------------------------------------;-----------------------------------------;PARAMETROS PARA EL 8255 ;-----------------------------------------PA82 EQU B000H ;Puerto A del 8255 PB82 EQU B001H ;Puerto B del 8255 PC82 EQU B002H ;Puerto C del 8255 REES82 EQU B003H ;Reg Estado 8255 ;-----------------------------------------;-----------------------------------------;PARAMETROS PUNTERO DE PILA ;-----------------------------------------PPILA EQU 87FFH ;Puntero pila RAM ;-----------------------------------------MATRIZ: F3 21 F9 3E 32 3E 32 16 1E 0E 79 FE CA 7A 32 7B 32 CD A7 7A 07 57 D2 7B 07 5F 0C C3 76 FF 87 80 03 B0 00 00 B0 01 FE 00 SALT2 40 34 00 00 B0 01 B0 35 00 DI LXI H,PPILA SPHL MVI A,80H STA REES82 MVI A,00H STA PA82 MVI D,01H MVI E,FEH MVI C,00H MOV A,C CPI 64 JZ FIN MOV A,D STA PA82 MOV A,E STA PB82 CALL TEMPO ANA A MOV A,D RLC MOV D,A JNC SALT1 MOV A,E RLC MOV E,A INR C JMP SALT2 HLT

00 01 02 03

B0 B0 B0 B0

FF 87

0000 0000 0001 0004 0005 0007 000A 000C 000F 0011 0013 0015 0016 0018 001B 001C 001F 0020 0023 0026 0027 0028 0029 002A 002D 002E 002F 0030 0031 0034

30 00

SALT1 15 00 FIN

_______________________________________ 141 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

0035 0035 0036 0037 003A 003B 003C 003D 003E 003F 0040 0043 0044 0045 0046

F5 D5 11 FF 07 1B 7A B3 00 00 00 C2 3A 00 D1 F1 C9

;-----------------------------------------;NOMBRE: TEMPO ;FUNCION: Proporciona un tiempo de espera ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------TEMPO: PUSH PSW PUSH D LXI D,07FFH TE1 DCX D MOV A,D ORA E NOP NOP NOP JNZ TE1 POP D POP PSW RET END

************

S Y M B O L I C

R E F E R E N C E

T A B L E

************

FIN PC82 SALT2

0034 = B002 0015

MATRIZ PPILA TE1

0000 = 87FF 003A

PA82 REES82 TEMPO

= B000 = B003 0035

PB82 SALT1

= B001 0030

LINES ASSEMBLED :

75

ASSEMBLY ERRORS :

Las primeras lneas no se comentarn, pues como en programas anteriores, constituyen la documentacin del programa, el establecimiento de parmetros y la inicializacin del sistema. En las lneas 29 y 30, se realiza el bloqueo y apagado de todas las lmparas. Las lneas 31, 32 y 33, establecen los Datos iniciales y contadores. Las lneas 34, 35 y 36, realizan la primer toma de decisin (C<64) y en caso de alcanzar la condicin final, se salta al final del programa. En las lneas 37 y 38, sacamos el dato (D) al puerto A (filas). En las lneas 39 y 40, sacamos el dato (E) al puerto B (columnas). En la lnea 41 se realiza una llamada a la subrutina de temporizacin. La lnea 42 pone el CARRY a nivel BAJO, y las lneas 43 y 44 rotan el dato (D) a la izquierda y se guarda el resultado con la instruccin de la lnea 45. En la lnea 46, si no se llega a la ltima posicin de la columna, saltamos a incrementar el contador, lnea 50. Si se ha llegado a la ltima posicin, se pasa a ejecutar las lneas 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 (lnea 50). En la lnea 51, se produce un salto incondicional a la lnea 34 para reiniciar el proceso. Desde las lneas 54 a 73, se establece la subrutina de temporizacin, similar a las anteriores.

_______________________________________ 142 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

7.6 EJERCICIOS.

1. 2. 3. 4. 5.

En qu consiste la transferencia de datos al exterior? Indicar el nivel lgico que hace activas las siguientes seales del PPI 8255 : A0, RD, CS, RESET. Describir los modos de funcionamiento del PPI 8255. Cual es la misin del grupo funcional Lectura/escritura y Control lgico. Encontrar los cdigos correspondientes a los siguientes modos de programacin 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 conexin fsica del 8255, al bus del microprocesador 8085, empleando para la seleccin del mismo, la salida CS6 del sistema bsico 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 efecte una llamada). En el programa MATRIZ.ASM, realizar los siguientes cambios: Conseguir que el encendido secuencial se realice de forma mas rpida. Realizar el encendido secuencial completando en primer lugar la fila 0, a continuacin la fila 1, fila 2, ..., fila 7.

6.

7.

8.

9.

_______________________________________ 143 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

TRANSFERENCIA DE DATOS AL EXTERIOR (II).

_______________________________________ 144 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

8. TRANSFERENCIA DE DATOS AL EXTERIOR.

Ya hemos hablado en el tema anterior sobre la necesidad de disponer en nuestro sistema de un medio de comunicacin con el exterior, es decir disponer en nuestra tarjeta de un componente que nos permita intercambiar informacin. Se ha visto tambin cmo se realizan distintas operaciones de entrada/salida con un componente especializado en dichas funciones. En este tema se tratar sobre otro de los componentes de la casa INTEL, especficamente diseados para este tipo de comunicaciones y que es de funcionamiento bastante similar al tratado en el tema anterior, aunque con sus caractersticas propias. Se trata en este caso del PPI 8155, un dispositivo diseado para trabajar con microprocesadores INTEL, que dispone de tres puertos de comunicaciones entrada/salida y una memoria RAM interna. Todos los puntos que trataremos a continuacin tendrn como referencia el diagrama de bloques representado en la FIG.8A. Como podemos apreciar la fuente de alimentacin genera todas las tensiones necesarias para alimentar tanto al sistema bsico como al PPI 8155 que pretendemos acoplar y a los distintos elementos que constituirn los elementos a gobernar. El PPI 8155 ser controlado directamente por nuestro sistema bsico, mediante un conjunto de lneas bidireccionales y las cargas sern manejadas por los puertos de entrada/salida del perifrico programable.

FUENTE DE ALIMENTACION

SISTEMA BASICO DEL 8085

C1

PPI 8155

C2

C3 FIG.8A

En los puntos que siguen, se realizar: Una descripcin fsica de dicho componente, mediante la cual se dar a conocer la misin de todos sus terminales. Un estudio sobre su constitucin interna, especificando los bloques en los que se divide y la funcin de cada uno de ellos. La descripcin del mtodo de programacin y sus modos de trabajo. Un anlisis sobre la forma de conectarlo al microprocesador 8085A. Un conjunto de ejemplos prcticos de aplicacin que nos permitirn iniciarnos en la programacin del 8155 y el manejo tanto de sus puertos de entrada/salida como de sus 256 octetos de memoria RAM interna.

_______________________________________ 145 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

8.1 DESCRIPCIN FSICA DEL PPI 8155.


El 8155 es un perifrico programable de interface de la familia INTEL diseado para acoplarse directamente al bus de datos del microprocesador 8085. Se presenta en un encapsulado (dual in line) de 40 patillas, y emplea una alimentacin nica de +5V filtrados y estabilizados. Las caractersticas elctricas bsicas pueden encontrarse en la bibliografa proporcionada por el fabricante, as como los diagramas de tiempos de ciclos de lectura y escritura. Debemos destacar adems, que existe otro componente de entrada/salida denominado 8156, cuya constitucin es prcticamente similar a la del 8155. La nica diferencia funcional entre ambos componentes, consiste en la activacin de la seal de seleccin de chip. Mientras en el 8155 se activa con nivel lgico BAJO, en el 8156 se activa con nivel lgico ALTO. Por consiguiente, todo lo que se expone seguidamente, es vlido para ambos componentes.
PC3 PC4 TIMER IN RESET PC5 TIMER OUT IO/M CS RD WR ALE AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 GND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 Vcc PC2 PC1 PC0 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0

8155

FIG.81A

Disponen de 22 terminales para comunicacin de entrada/salida, 8 lneas que constituyen el bus de datos/direcciones, una lnea de entrada de reloj y una lnea de salida de un temporizador programable, as como diversas lneas para las necesarias seales de control de los dispositivos. En la FIG.81A puede verse su configuracin fsica, y a continuacin se proporciona una descripcin detallada de la misin de cada una de las patillas. Patillas PA0 a PA7. Terminales correspondientes a 8 lneas de entrada/salida del puerto A. Constituyen un byte de datos (octeto) de entrada/salida, siendo PA0 el bit de ms bajo orden y PA7 el bit de ms alto orden. Patillas PB0 a PB7. Terminales correspondientes a 8 lneas de entrada/salida del puerto B. Constituyen un byte de datos (octeto) de entrada/salida, siendo PB0 el bit de ms bajo orden y PB7 el bit de ms alto orden. Patillas PC0 a PC5. Terminales correspondientes a 6 lneas de entrada/salida del puerto C. Constituyen un byte de datos de entrada/salida, siendo PC0 el bit de ms bajo orden y PC5 el bit

_______________________________________ 146 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

de ms 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 travs del puerto C, saldrn los 6 bits de menor peso, perdindose los bits de orden 6 y 7 del acumulador. Un proceso similar ocurre cuando se realice una operacin de lectura a travs de este puerto. Patilla Vcc. Terminal de alimentacin (+5V). Debe ser una tensin perfectamente filtrada y estabilizada. Es conveniente colocar entre este terminal y masa un condensador de desacoplo. Patilla GND. Potencial de referencia o masa de alimentacin. 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 seal de control que nos permite diferenciar entre un acceso a un puerto de entrada/salida (con 1) o a una direccin de memoria RAM (con 0). Patilla CS. Es una entrada de control que permite la seleccin de chip. Es activa con nivel lgico BAJO para el 8155. (Es activa con nivel lgico ALTO para el 8156). Patilla RD. Es una seal de control del 8155 (8156) que ser conectada directamente a la seal RD del microprocesador 8085A. Es activa a nivel lgico BAJO y en ese momento produce la lectura de un puerto o de una direccin de memoria RAM del 8155. Cuando efectuemos una operacin de lectura sobre el 8155, estaremos transfiriendo al acumulador del microprocesador, el contenido del Registro de Estado o la informacin presente en alguno de los puertos de entrada/salida o algn dato de la memoria RAM del 8155 Patilla WR. Es una seal de control del 8155 (8156) que ser conectada directamente a la seal WR del microprocesador 8085A. Es activa a nivel lgico BAJO y en ese momento produce la escritura en un puerto o en una direccin de memoria RAM del 8155. Cuando efectuemos una operacin de escritura sobre el 8155, estaremos transfiriendo informacin 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 seal ALE del microprocesador 8085A. Mediante un impulso en esta patilla, el 8155 diferencia o discrimina la direccin del dato, ya que ambos llegan por el mismo bus (el mismo conjunto de lneas). En otras palabras separa direcciones de datos. Patillas AD0 a AD7. Conjunto de 8 lneas que forman el bus multiplexado de datos y direcciones. A travs de este bus pasamos los datos entre el microprocesador y el PPI 8155. El flujo de informacin es en ambos sentidos.

8.2 DESCRIPCIN FUNCIONAL DEL PPI 8155.


La constitucin interna del 8155 puede dividirse en una serie de bloques que nos permitan una ms fcil asimilacin de los conceptos bsicos que nos posibiliten comprender su funcionamiento de una forma rpida. Esta serie de bloques funcionales, que pueden apreciarse en la FIG.82A, son bsicamente: 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 segn procedimiento de intercambio. (Ms adelante veremos su modo de programacin). Un bloque de memoria RAM organizada en 256 palabras de 8 bits (octetos) que ser seleccionada cuando IO/M=0 y CS=0.

_______________________________________ 147 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Una unidad de contador o timer integrado de 14 bits programable segn 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 programacin adecuada por software.

PUERTA A RESET IO/M CS AD0-AD7 CONTROL DE MANDO Y ESTADO

PA0 PA7

PUERTA B DATOS DIRECCIONES RAM PUERTA C

PB0 PB7

REGISTRO DIRECCIONES ALE

PC0 PC5

RD WR TIMER IN CONTADOR TEMPORIZADOR PROGRAMABLE TIMER OUT

FIG.82A

La utilizacin de las puertas se hace directamente a partir del microprocesador, utilizando la instruccin OUT addr, o la instruccin STA addr o cualquier otra de almacenamiento, siempre que "addr" seleccione el registro del puerto adecuado. Para efectuar la seleccin 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 CXXXX 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 sern extrados 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 sern 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 programacin 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 quedarn programados de una forma u otra. Para introducir una determinada combinacin en este registro debemos direccionarlo, siendo su cdigo de acceso: Registro Estado XXXX X000 Por tanto, antes de empezar a trabajar con l, debemos indicarle el modo de trabajo que vamos a

_______________________________________ 148 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

emplear. El formato de instruccin de dicho registro es:

TM2

TM1

IEB

IEA

PC2

PC1

PB

PA

A continuacin se describe la funcin 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 resumirn en la tabla siguiente: PC2 0 0 1 1 PC1 0 1 0 1 MODO DE PUERTA C MOD1 MOD3 MOD4 MOD2

La funcin 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 PC0 PC1 PC2 PC3 PC4 PC5 MOD1 entrada entrada entrada entrada entrada entrada MOD2 salida salida salida salida salida salida MOD3 A INTR A BF A STB salida salida salida MOD4 A INTR A BF A STB B INTR B BF B STB

siendo: INTR : Bit de mando cuya funcin es de requerimiento de interrupcin. Nivel BAJO si est como entrada y nivel ALTO si est como salida. BF : Bit de mando cuya funcin 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 funcin es de entrada de control tanto en modo entrada como en modo salida.

Bit 4 (IEA): Si tenemos IEA=0 estamos ante una interrupcin no autorizada para el puerto A. Si tenemos IEA=1, estamos ante una interrupcin autorizada para el puerto A. Bit 5 (IEB): Si tenemos IEB=0, estamos ante una interrupcin no autorizada para el puerto B. Si tenemos IEB=1, estamos ante una interrupcin autorizada para el puerto B. Bits 6 y 7 (TM1 y TM2): Estos dos bits permiten la programacin de un contador interno de 14 bits del 8155 (TIMER). Este contador posee cuatro modos o posibilidades de programacin. Si colocamos el valor 00 el contador no efecta ninguna operacin. 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 Timer High XXXX X100 XXXX X101

_______________________________________ 149 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Su modo de operacin puede ser programado en cualquier momento que se desee. Como base de tiempos puede emplearse cualquier seal de nivel TTL conectndola 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) segn los bits TM1 y TM2 durante su programacin de acuerdo a la siguiente tabla:

TM2 0 0 1 1

TM1 0 1 0 1

MODO DEL CONTADOR No afecta al contador o timer Alto a la cuenta del timer Para la cuenta despus de TC Inicia la operacin timer

Una vez programado C/E, el modo de operacin 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 ms alto orden (M2 y M1) se utilizan para definir el modo definitivo de operacin segn la tabla siguiente:

M2 0 0 1 1

M1 0 1 0 1

OPERACION ALTO al inicio y BAJO en la 2 mitad de la cuenta Onda cuadrada. Periodo = Duracin de la cuenta. Pulso simple de TC Pulso simple de TC con autorrecarga.

El microcircuito 8155, para comunicarse con el exterior precisa tambin conocer el estado del registro C/E, para lo cual deber procederse a la lectura del mismo. Los 8 bits ledos son de hecho diferentes de los 8 bits definidos precedentemente, siendo por tanto C/E un registro doble. El formato de instruccin 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 interrupcin del timer. Con un nivel ALTO bloquea el contador y despus de ledo el registro resetea o inicia una nueva cuenta. Bit5 (INTE B): Determina si el puerto B tiene una interrupcin autorizada. Est autorizada con un nivel lgico 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 ledo, 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 interrupcin del puerto B. Est activo con nivel lgico 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.

_______________________________________ 150 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Adems 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 ms condicin que la de seleccionar correctamente el dispositivo mediante su pin de seleccin CS y tener adecuadamente conectada la seal IO/M a la correspondiente del microprocesador. El acceso se conseguir con una instruccin como STA, para escribir un dato por ejemplo.

8.3 INTERCONEXION DEL 8155 CON EL P 8085A.


Es claro, por todo lo estudiado hasta el momento, que el PPI 8155 es un perifrico programable cuya estructura permite su utilizacin directa con el microprocesador 8085. El 8155 dispone de ciertas caractersticas que hacen posible su conexin al microprocesador de dos formas claramente diferenciadas que veremos a continuacin: POSIBILIDAD 1 Dada la estructura del 8155, no tendremos ms 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 alimentacin (Vcc) a la masa y alimentacin del microprocesador (+5V). Es conveniente colocar un condensador a masa de 100 nF en el terminal de alimentacin. Conectar las seales 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 (seleccin 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 seal de control IO/M de idntica denominacin del microprocesador. Finalmente dispondremos de 22 lneas para comunicarse con el exterior que forman los tres puertos de entrada/salida del 8155 y de una lnea 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 conexin. No nos queda ahora ms 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 seleccin 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 combinacin es obligatoria. Por tener conectada la seal 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 automticamente coloca

_______________________________________ 151 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

un 1 lgico en la seal IO/M) el operando PORT representa el puerto seleccionado. Tendremos por tanto que situar en los bits de direccin ms bajos (A0, A1 y A2) los cdigos correspondientes a los puertos A, B, C y el cdigo correspondiente del registro de estado, segn 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 instruccin OUT B1H, sacaramos hacia el exterior el contenido del acumulador, y en el bus de direcciones tendramos el valor B1B1H. De modo similar con la instruccin IN B3H, cargaramos un dato del exterior en el acumulador y tendramos en el bus de direcciones el valor B3B3H.
+5V

100 nF 40 20

PUERTO C

PC0 PC1 PC2 PC3 PC4 PC5 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 ALE WR RD

37 38 39 1 2 5 12 13 14 15 16 17 18 19 11 10 9 7 8 3

21 22 23 24 27 25 26 28 29 30

PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

PUERTO A

BUS 8085

D0 D1 D2 D3 D4 D5 D6 D7 ALE

8155

31 32 33 34 35 36

PUERTO B

WR RD IO/M IO/M CS CS4 CLK TIMER IN OUT

6 4

TIMER OUT RESET 15pF

RESET OUT

FIG.83A

Por tanto en nuestro caso, para acceder a los puertos y registro de estado del 8155 tendramos que colocar como valor de PORT: Puerto A Puerto B Puerto C Timer Low Timer High Registro de estado PORT = C1H PORT = C2H PORT = C3H PORT = C4H PORT = C5H 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, segn sea el caso, seguidas de la direccin de memoria a la que deseemos acceder, que en el caso que estamos tratando, sern los 256 octetos comprendidos entre las direcciones siguientes: RAM 8155 POSIBILIDAD 2. La segunda posibilidad de conectar este integrado, es en todo similar a la anterior, la nica diferencia radica en que la seal IO/M del 8155 no se conecta a la equivalente IO/M del microprocesador, sino que se controla mediante una lnea del bus de direcciones. Nosotros elegiremos C000H hasta C0FFH

_______________________________________ 152 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

este mtodo y conectaremos a dicha seal la lnea de direcciones A10 (podramos 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 utilizarn instrucciones como STA o bien LDA seguidas de la direccin 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. Adems hay que colocar en la parte baja (A0, A1, A2) el cdigo correspondiente al elemento que deseemos utilizar. Y finalmente, tendremos que colocar la lnea de direcciones A10 a nivel lgico 1 para acceder a los puertos y registro de estado y a nivel lgico 0 para tener acceso a las posiciones de memoria RAM interna. Por tanto las direcciones a considerar en nuestro caso sern: Puerto A Puerto B Puerto C Timer Low Timer High Registro de estado C/E RAM 8155 C401H C402H C403H C404H C405H C400H C000H hasta C0FFH

En la FIG.83B puede verse la representacin esquemtica de esta conexin, que ser la que finalmente utilizaremos en nuestro sistema.
+5V 100 nF 40 20

PUERTO C

PC0 PC1 PC2 PC3 PC4 PC5 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 ALE WR RD

37 38 39 1 2 5 12 13 14 15 16 17 18 19 11 10 9 7 8 3

21 22 23 24 27 25 26 28 29 30

PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PUERTO B PUERTO A

D0 D1 D2 BUS D3 8085 D4 D5 D6 D7 ALE WR RD A10

8155

31 32 33 34 35 36

IO/M CS CS4 CLK TIMER IN OUT

6 4

TIMER OUT RESET 15pF

RESET OUT

FIG.83B

_______________________________________ 153 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

8.4 EJEMPLOS DE E/S CON EL PPI 8155.

A continuacin se desarrollaran una serie de ejemplos prcticos que nos permitan tener una idea clara de la forma de operar del PPI 8155. Como veremos se tratar de comenzar con las operaciones ms simples para, poco a poco, aumentar su nivel de complejidad. EJEMPLO 1. Realizar el control de 8 lmparas de 100 w, conectadas a tensin alterna de 220 V. Con este ejercicio se pretende desarrollar un control (sin especificar el proceso de encendido y apagado) sobre 8 elementos de carga (lmparas) que manejaremos mediante el puerto A (tambin lo podramos hacer con el puerto B). Como es lgico, debemos pensar en realizar el diseo del equipo necesario para controlar las lmparas a 220 V de c.a. Es decir, hay que disponer del hardware adecuado de potencia, que nos posibilite manejar las cargas finales. Una vez lo tengamos dispuesto, lo conectaremos al 8155 y se proceder a desarrollar el programa de control. En primer lugar, como elemento final de control en potencia, se emplear el triac TXAL228, que manejar directamente el encendido y apagado de las lmparas. Este triac, que se presenta en encapsulado TO 220 AB plstico, soporta una tensin entre nodos de 400 V y un pico de corriente mxima de 90 A durante 20 ms como mximo. La corriente mxima a la que debe ser sometido el terminal de puerta est alrededor de los 50 mA y la temperatura que aguanta la juntura estar prxima a los 100 C Al tratarse de una carga resistiva y de relativamente baja potencia, no necesitaremos circuitos de control y proteccin aadidos. Por supuesto, el triac ir montado sobre un disipador de calor que le permita refrigerar su estado trmico interno. El terminal de control del triac ser gobernado mediante un acoplador ptico denominado MOC3041, que se presenta en un encapsulado dual in line con 6 terminales de conexin o patillas. Su distribucin y esquema equivalente podemos verlo en la FIG.84A. Como podemos apreciar las patillas 3 y 5 son inactivas, ya que no tienen conexin y por tanto carecen de funcin alguna. Los terminales 1 y 2 son el nodo y ctodo del foto-diodo emisor interno, mientras que los terminales 6 y 4, son los terminales accesibles del receptor, en este caso constituido por un triac fotosensible. Cuando se hace pasar una corriente por el emisor, ste emite una seal que incide sobre el receptor, haciendo que pase al estado de conduccin. Si el emisor est en reposo, el receptor se comporta como un circuito abierto. La misin fundamental del optoacoplador es separar la tensin alterna de 220 V que se emplea para las lmparas, de la tensin de alimentacin de las tarjetas que constituyen el equipo. Adems reducen al mnimo las interferencias por ruidos elctricos que se puedan producir en los procesos de conmutacin de los triacs.

1 K1 A1 SC C2 SC C1

MOC3041

FIG.84A

_______________________________________ 154 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 sita una red RC cuya misin 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, sern mnimas, debido a que la carga es fundamentalmente resistiva. En esta figura podemos adems observar cmo estn perfectamente separadas las partes de alta tensin de las de baja tensin. El terminal de control ser llevado directamente a una lnea de salida del puerto A del 8155. Cuando en esta lnea de control se presente un uno lgico o nivel ALTO, se establecer una circulacin de corriente a travs del diodo fotoemisor , que provocar la excitacin del receptor (triac fotosensible) que se har conductor permitiendo el paso de la corriente y provocando con ello la excitacin del triac de potencia, que a su vez, permitir el paso de corriente, haciendo que se encienda la lmpara que lleve conectada como carga. (Debemos recordar que el triac se desactiva automticamente 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 seal de control activada durante el tiempo que consideremos oportuno).

R2 56 +5V MOC3041

LAMPARA 220V

TXAL228

R4 100 C1 01uF 250V

R1 220

R3 1K2

CONTROL ULN2803

FIG.84B

Finalmente, si deseamos controlar ocho unidades u ocho lmparas, deberemos contar con ocho bloques como el anterior, obteniendo de este modo el esquema definitivo de la FIG.84C. En ella puede verse cmo todas las lneas de control son gobernadas por las lneas del puerto A del 8155, de tal forma que la lnea PA0 controla la lmpara L0, PA1 controla L1, PA2 controla L2, etc. Por tanto, segn este esquema final, si deseamos encender una lmpara cualquiera, por ejemplo L3, tendremos que sacar por la lnea PA3 del 8155 un uno lgico, es decir, un nivel ALTO. Si deseamos tener iluminadas las lmparas L1, L3 y L5, tendremos que sacar los correspondientes unos lgicos por las lneas PA1, PA3 y PA5 (por el resto de las lneas del puerto A sacaremos niveles BAJOS). Finalmente, insistir en la necesidad de dotar a los triacs de refrigeradores que permitan evacuar de la forma ms apropiada y rpida las prdidas de potencia producidas por calor durante su funcionamiento. Dichos refrigeradores sern construidos de aluminio, material de muy baja resistencia trmica. El contacto entre el disipador y el propio triac debe ser lo ms perfecto posible, por lo que, para mejorarlo, puede emplearse una pasta de unin especialmente fabricada para este propsito. Al trabajar directamente con la alimentacin de red, es muy importante fijarse en que no queden cables descubiertos de modo que puedan producirse contactos no deseados. Las partes metlicas de los chasis deben conectarse slidamente 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 daos irreparables en los circuitos de nuestro sistema de control.

_______________________________________ 155 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

2 56 MOC3041 +5V TXAL228 1K2 1 01uF

100

BLOQUE A ULN2803 220 2 A 2 A 2 A 2 A 2 A 2 A 2 A 220 1 2 A L0 220V

PA0

1 E0

S0 18

PA1

2 E1

S1 17

220

L1

220V

PA2

3 E2

S2 16

220

L2

220V

PA3

4 E3

S3 15

220

L3

220V

PA4

5 E4

S4 14

220

L4

220V

PA5

6 E5

S5 13

220

L5

220V

PA6

7 E6

S6 12

220

L6

220V

PA7

8 E7 9

S7 11 10 +5V

L7

220V

FIG.84C

Finalizado el proceso de diseo del hardware de control, pasamos a realizar el diseo del software que nos permitir, mediante nuestro sistema basado en el microprocesador 8085 y apoyndonos en el PPI 8155, manejar el encendido y apagado de las ocho lmparas.

_______________________________________ 156 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

En el enunciado no se nos indica el proceso o secuencia de control de las lmparas, por tanto podr ser aquella que nosotros deseemos. Iniciaremos el diseo del programa de control, con el siguiente pseudocdigo:

NOMBRE: LAMPARA FUNCION: Controla 8 lmparas PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Iniciar el sistema Apagar lmparas B=10 MIENTRAS B>0 Activar solo lmparas pares Temporizar Activar solo lmparas impares Temporizar B=B-1 FIN DE MIENTRAS B=20 MIENTRAS B>0 Apagar todas las lmparas Temporizar Activar todas las lmparas 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 bsicamente en la realizacin de tres procesos claramente diferenciados o separados en tres bucles. El primero consiste en realizar un encendido y apagado alternativo de las lmparas, de forma que en un instante dado estn encendidas L0, L2, L4 y L6, mientras el resto permanecen apagadas. Un tiempo ms tarde (tiempo determinado por una subrutina de temporizacin) estarn encendidas L1, L3, L5 y L7, permaneciendo apagadas el resto durante el mismo intervalo de tiempo. Este proceso se repetir un nmero 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 lmparas de forma simultnea. Proceso que ser realizado un nmero de veces determinado por el nuevo valor dado al contador B (en este caso B=20). El tiempo que las lmparas deben permanecer encendidas y apagadas, viene marcado por la subrutina de temporizacin. Finalmente, el tercer bucle, pretende realizar el encendido secuencial de las ocho lmparas, es decir, partiendo del estado inicial en que todas las lmparas estn apagadas, se iluminar en primer lugar L0, a continuacin se iluminarn L0 y L1, luego L0, L1 y L2, y as sucesivamente hasta tener encendidas todas las lmparas. El ritmo de encendido vendr marcado por la subrutina de temporizacin. Este proceso se repetir el nmero de veces que nos marque el valor asignado al contador B (en este caso B=8).

Se proceder ahora a expresar con ms detalle todos los pasos mostrados en el pseudocdigo anterior mediante un refinado del mismo.

_______________________________________ 157 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

NOMBRE: LAMPARA FUNCION: Controla 8 lmparas PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Prohibir Interrupciones Punterizar la Pila Programar PPI 8155 Apagar lmparas 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 nmero 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 continuacin, en la FIG.84D, se muestra el diagrama de flujo correspondiente a este pseudocdigo.

_______________________________________ 158 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

INICIO Prohibir interrupciones Punterizar la pila Programar el PPI 8155

Apagar lmparas

B=10 SALT1 NO SALT2 B=20 SALT3 Temporizar B>0 SI PA=00H Temporizar Temporizar B=B-1 PA=FFH B>0 SI Dato=0 C=8 SALT6 B=B-1 C>0 SI NO SALT5 NO NO SALT4 B=8

B>0 SI PA=55H

PA=AAH

FIN

Temporizar

CARRY=1 Rotar Dato izquierda PA=Dato

Temporizar

SALT7 B=B-1

C=C-1

FIG.84D

_______________________________________ 159 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

A continuacin pasamos a desarrollar el paso a ensamblador del pseudocdigo preparado, obteniendo el programa definitivo de control.

2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : LAMPARA.ASM LAMPARA.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

01 02 03 00

C4 C4 C4 C4

FF 87 0000 0000 0001 0004 0005 0007 000A 000C 000F 0011 0012 0013 0016 0018 001B 001E 0020 0023 0026 0027 002A 002C 002D 002E 0031 0033 0036 0039 003B

F3 21 F9 3E 32 3E 32 06 78 A7 CA 3E 32 CD 3E 32 CD 05 C3 06 78 A7 CA 3E 32 CD 3E 32

FF 87 0F 00 C4 00 01 C4 0A

2A 55 01 68 AA 01 68

00 C4 00 C4 00

11 00 14

45 00 01 68 FF 01

00 C4 00 C4

;-------------------------------;NOMBRE : LAMPARA ;FUNCION : Control de 8 lmparas ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;-------------------------------;-------------------------------;PARAMETROS PARA EL 8155 ;-------------------------------PA81 EQU C401H PB81 EQU C402H PC81 EQU C403H REES81 EQU C400H ;-------------------------------;-------------------------------;PARAMETROS PUNTERO DE PILA ;-------------------------------PPILA EQU 87FFH ;-------------------------------LAMPARA: DI LXI H,PPILA SPHL MVI A,0FH STA REES81 MVI A,00H STA PA81 BUC1 MVI B,10 SALT1 MOV A,B ANA A JZ BUC2 MVI A,55H STA PA81 CALL TEMPO MVI A,AAH STA PA81 CALL TEMPO DCR B JMP SALT1 BUC2 MVI B,20 SALT2 MOV A,B ANA A JZ BUC3 MVI A,00H STA PA81 CALL TEMPO MVI A,FFH STA PA81

_______________________________________ 160 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

003E 0041 0042 0045 0047 0048 0049 004C 004E 0050 0051 0052 0055 0056 0057 0058 005B 005E 005F 0060 0063 0064 0067

CD 05 C3 06 78 A7 CA 0E 16 79 A7 CA 37 7A 17 32 CD 57 0D C3 05 C3 76

68 00 2C 00 08

BUC3 SALT3

67 00 08 00 SALT5 63 00

01 C4 68 00

50 00 SALT4 47 00 FIN

CALL TEMPO DCR B JMP SALT2 MVI B,8 MOV A,B ANA A JZ FIN MVI C,8 MVI D,00H MOV A,C ANA A JZ SALT4 STC MOV A,D RAL STA PA81 CALL TEMPO MOV D,A DCR C JMP SALT5 DCR B JMP SALT3 HLT

0068 0068 0069 006A 006B 006E 006F 0070 0071 0072 0073 0076 0077 0078 0079

F5 D5 C5 11 FF 0F 1B 7A B3 00 00 C2 6E 00 C1 D1 F1 C9

;-------------------------------;NOMBRE: TEMPO ;FUNCION: Temporizacin ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-------------------------------TEMPO: PUSH PSW PUSH D PUSH B LXI D,0FFFH TE1 DCX D MOV A,D ORA E NOP NOP JNZ TE1 POP B POP D POP PSW RET

007A

END

******* BUC1 BUC2 BUC3 FIN LAMPARA PA81 PB81 PC81 PPILA

C R O S S 000F 002A 0045 0067 0000 C401 C402 C403 87FF : : : : : : : : :

R E F E R E N C E

T A B L E

*********

31 43 55 27 33 36 45 48 64

= = = =

22

_______________________________________ 161 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

REES81 SALT1 SALT2 SALT3 SALT4 SALT5 TE1 TEMPO

= C400 0011 002C 0047 0063 0050 006E 0068

: : : : : : : :

25 39 51 70 60 68 89 34

37

46

49

65

LINES ASSEMBLED :

96

ASSEMBLY ERRORS :

En el desarrollo de este programa podemos apreciar en las primeras lneas la definicin del proceso (NOMBRE, FUNCION, ...) son lneas de comentarios que no intervienen para nada en el programa. En las lneas 10, 11, 12 y 13 se definen los parmetros de acceso al perifrico programable PPI 8155 y en la lnea 18 se define el puntero de la pila (memoria RAM donde se almacenaran datos temporalmente). El programa comenzar efectivamente en la lnea 21, donde se inicializa el sistema. En la lnea 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 lnea 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 lneas 29, 30 y 31 cuando se analiza la condicin del bucle y en caso de que el flag consultado este accionado saltaremos a ejecutar el bucle siguiente (BUC2) en la direccin 002AH. Se procede de modo idntico en los otros dos bucles. La subrutina TEMPO (que nos proporciona una temporizacin o tiempo de espera) no precisa ningn dato de entrada y vemos que una vez ejecutada no modifica ningn registro ni direccin de memoria (de lo contrario vendra especificado en las PRECONDICIONES y en las POSTCONDICIONES). Se limita a ejecutar un bucle un determinado nmero 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 diseo de software y hardware necesarios para controlar 8 lmparas de 12 V y 8 sensores de efecto Hall, de modo que mientras permanezca activado un sensor cualquiera, se ilumine su lmpara 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 magnticos de efecto Hall. En primer lugar hablaremos de forma sucinta sobre este tipo de sensores para tener una pequea 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 elctrico E a un material semiconductor y al mismo tiempo hacemos incidir sobre l de forma perpendicular un campo electromagntico, actuar sobre las cargas en movimiento una fuerza F que las desplaza en el interior del semiconductor producindose una concentracin de portadores que nos generar un nuevo campo elctrico transversal Ez. Este campo elctrico alcanza un valor tal que compensa la fuerza F. La intensidad del campo elctrico transversal da lugar a una tensin llamada tensin 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

_______________________________________ 162 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

corriente es creado por pocos electrones muy rpidos. Por tanto podemos decir que el efecto de un campo electromagntico (producido por ejemplo por un imn) sobre una corriente elctrica da lugar a una tensin. Estamos por tanto en presencia de un pequeo generador.

semiconductor

Campo magntico B

Vhall

Corriente excitacin

Los generadores hall, pueden construirse de dos modos diferentes, teniendo en cuenta adems que, segn la aplicacin prevista, las placas semiconductoras tendrn 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 colocndola despus sobre una placa portadora mediante una resina epoxi de 1 micra. Depositando la placa semiconductora sobre la placa portadora mediante un procedimiento de evaporacin metlica.

2.

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 magntico necesario para generar una tensin proporcional est limitado a un intervalo determinado y aunque se sobrepase dicho intervalo el semiconductor no resulta daado, mientras que la corriente de excitacin ser aquella que no sobrepase la mxima temperatura admisible para el semiconductor (unos 110C). En las hojas de datos de los fabricantes se indica la tensin de hall en vaco como aquella que se genera cuando el semiconductor esta descargado, para una corriente nominal de excitacin y un campo magntico de excitacin 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 imn producen una tensin 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 pseudocdigo proponiendo el siguiente proceso: NOMBRE: Hall FUNCION: Detectar sensores hall PRECONDICION: Ninguna POSTCONDICION: Ninguna

_______________________________________ 163 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Iniciar sistema Leer sensores Preparar dato de lmparas Sacar dato de lmparas 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.

+12V 21 22 23 24 25 26 27 28 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 E0 E1 E2 E3 E4 E5 E6 E7 +5V 29 30 32 33 34 35 36 37 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 UGN 3140 UGN 3140 UGN 3140 UGN 3140 UGN 3140 UGN 3140 UGN 3140 UGN 3140 1 2 3 4 5 6 7 8 18 S0 17 S1 16 S2 15 S3 14 S4 13 S5 12 S6 11 S7 L0 L1 L2 L3 L4 L5 L6 L7

8155

FIG.84F

_______________________________________ 164 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 lmparas Leer Dato de PB81 Tratar el Dato ledo Sacar Dato al PA81 Volver a Leer Dato de PB81 (paso 5) Final del programa Finalmente el programa resultante en pseudocdigo, 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 lmparas 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 : OUTPUT FILENAME : HALL.ASM HALL.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

;-----------------------------------------;NOMBRE : HALL ;FUNCION : Detectar sensores Hall ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;-----------------------------------------;-----------------------------------------;PARAMETROS PARA EL 8155 ;-----------------------------------------PA81 EQU C401H ;Puerto A del 8155 PB81 EQU C402H ;Puerto B del 8155 PC81 EQU C403H ;Puerto C del 8155 REES81 EQU C400H ;Reg. Estado 8155 ;------------------------------------------

00 01 02 03

B0 B0 B0 B0

_______________________________________ 165 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

FF 87 0000 0000 0001 0004 0005 0007 000A 000C 000F 0012 0013 0016 0019 0019

F3 21 F9 3E 32 3E 32 3A 00 32 C3

FF 87 82 03 B0 00 00 B0 01 B0 00 B0 0F 00

;-----------------------------------------;PARAMETROS PUNTERO DE PILA ;-----------------------------------------PPILA EQU 87FFH ;Puntero pila RAM ;-----------------------------------------HALL: DI LXI H,PPILA SPHL MVI A,0DH STA REES81 MVI A,00H STA PA81 LEER LDA PB81 NOP STA PA81 JMP LEER END

***********

S Y M B O L I C

R E F E R E N C E

T A B L E

*************

LEER PPILA

000F = 87FF

PA81 HALL

= C401 0000

PB81 REES81

= C402 = C400

PC81

= C403

LINES ASSEMBLED :

35

ASSEMBLY ERRORS :

Como podemos apreciar, en este caso no se ha utilizado la pila para guardar ningn dato, aunque se ha punterizado. Tambin podamos haber empleado la RAM del 8155 y punterizar la pila a la direccin C0FFH.

EJEMPLO 3 Realizar el control de un grupo de cuatro displays de siete segmentos, de modo que se representen en ellos los nmeros del 0000 al 9999. Se trata en este caso de desarrollar un trabajo de diseo del hardware de control de los cuatro elementos pedidos y posteriormente, despus de conectarlo a nuestro sistema a travs del 8155, realizar el software que lleve a cabo el control pedido. En primer lugar realizaremos una breve descripcin de los elementos o componentes que vamos a utilizar para construir la tarjeta de aplicacin mostrada en la FIG.84G. Los elementos finales a controlar, es decir, los displays de siete segmentos sern los modelos LTS7751R. Se trata de unos sencillos indicadores luminosos construidos a base de diodos luminiscentes de color rojo que nos servirn para visualizar un valor en el sistema decimal. Estn formados por siete segmentos individuales (SA, SB, SC, SD, SE, SF, SG) con los que se pueden construir todos los dgitos del 0 al 9. Como elemento bsico, transformador de cdigo binario al cdigo 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 lneas A, B, C y D que aceptan cdigo BCD que es decodificado y tratado para excitar convenientemente con sus salidas un display de siete segmentos.

_______________________________________ 166 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Situaremos en serie con cada salida una resistencia de 470 ohmios para limitar la corriente que circula por los leds de los displays.

ANODO 3 14 SA SB SC SD SE SF SG DP DIG4 1 13 10 8 5 2 11 6

ANODO 3 14 SA SB SC SD SE SF SG DP DIG3 1 13 10 8 5 2 11 6

ANODO 3 14 SA SB SC SD SE SF SG DP DIG 1 13 10 8 5 2 11 6

ANODO 3 14 SA SB SC SD SE SF 1 13 10 8 5 2

DP 6 DIG1 +5V

+5V SA SB SC SD SE SF SG 470R SERIE 74LS47 FIG.84G 13 12 11 10 9 15 14 7 1 2 6 3 5 4 A B C D LT RBI BI PA0 PA1 PA2 PA3 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 IN1 IN2 IN3 IN4 IN5 IN6 IN7 IN8 1 2 3 4 5 6 7 8

+5V

18 17 16 15 14 13 12 11

DIG1 DIG2 DIG3 DIG4

UDN 2580 A

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 seleccin para indicar a cual de los cuatro displays se dirige la informacin en cada instante. Con este objetivo intercalamos el UDN2580A que dispone de ocho lneas 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 informacin hacia los displays ser el siguiente: Se saca a travs 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 lgico la lnea del display que ocupa el lugar de las unidades (DIG1). Se mantiene esta situacin unos instantes y a continuacin retiramos la seleccin del dgito de unidades, colocamos en el puerto A la informacin para el dgito de las decenas y seleccionamos dicho dgito a travs del puerto B mediante un 0 lgico (DIG2). Se procede as con los cuatro dgitos a controlar. Teniendo en cuenta estas consideraciones, pasaremos a esbozar el pseudocdigo que nos llevar a la confeccin del programa de control de los cuatro dgitos.

NOMBRE: Dgitos FUNCION: Control 7 segmentos PRECONDICION: Ninguna POSTCONDICION: Ninguna Iniciar sistema Apagar displays

_______________________________________ 167 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Iniciar la cuenta Fin de programa Como vemos, se precisa un mayor refinamiento en todas las operaciones de modo que quede ms 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 tpicas 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 dgito en el que aparecer escrito el dato). Apagar displays no es ms que un paso que nos asegura que al conectar el sistema a la tensin y producirse el arranque, los displays permanecern apagados. Para ello no tendremos ms que asegurar que a travs del PB queden los cuatro dgitos bloqueados (sin tensin positiva en el nodo). Iniciar la cuenta es esencialmente empezar a contar desde 0000 hasta 9999 y sacar todos los nmeros en los displays. Este es sin duda el paso ms complejo de los tres iniciales planteados y habr que dividirlo en operaciones ms sencillas para llegar a una mejor comprensin. Tendremos que "iniciar los datos" en algn lugar de la RAM con el valor 0000 (para despus 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 dgitos 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 nmero as mostrado debe permanecer unos segundos en pantalla por lo que hay que prever una temporizacin. Considerando los pasos de este refinamiento tendremos: NOMBRE: Dgitos 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 quedarn 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 dgitos y necesitamos cuatro bits por cada dgito en representacin binaria, necesitaremos 2 bytes para manejar la informacin 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 precondicin, que los datos se encuentren previamente almacenados en la RAM, y tratados de forma adecuada para su representacin correcta en los displays de siete segmentos. Este proceso es totalmente independiente por lo que ser construido segn una subrutina que podemos esbozar del modo siguiente: NOMBRE: SACADATO FUNCION: Saca datos a displays

_______________________________________ 168 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

PRECONDICION: Datos en RAM POSTCONDICION: Ninguna Iniciar contador temporizacin CONT MIENTRAS CONT>0 Apuntar a DATOS Leer informacin (dos dgitos) Separar VALOR dgito 1 Enviar VALOR a PA Seleccionar DIG1 con PB Separar VALOR dgito 2 Enviar VALOR a PA Seleccionar DIG2 con PB Apuntar a DATOS+1 Leer informacin (dos dgitos) Separar VALOR dgito 3 Enviar VALOR a PA Seleccionar DIG3 con PB Separar VALOR dgito 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 informacin 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 estn apagados. El proceso es tan rpido que el ojo humano no lo percibe as, siendo la sensacin de que estn todos activos al mismo tiempo. La temporizacin 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. Adems 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 pseudocdigo, que nos permitir afrontar el paso definitivo al programa en ensamblador: NOMBRE: Dgitos 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

_______________________________________ 169 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 temporizacin CONT MIENTRAS CONT>0 Apuntar a DATOS Leer informacin (dos dgitos) Separar VALOR dgito 1 Enviar VALOR a PA Seleccionar DIG1 con PB Separar VALOR dgito 2 Enviar VALOR a PA Seleccionar DIG2 con PB Apuntar a DATOS+1 Leer informacin (dos dgitos) Separar VALOR dgito 3 Enviar VALOR a PA Seleccionar DIG3 con PB Separar VALOR dgito 4 Enviar VALOR a PA Seleccionar DIG4 con PB CONT = CONT - 1 FIN de MIENTRAS Fin de subrutina Con toda esta informacin procederemos a la concrecin de nuestro programa de control, empleando lenguaje ensamblador, del modo siguiente:

2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : DIGITOS7.ASM DIGITOS7.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14

;-------------------------------;NOMBRE : DIGITOS ;FUNCION : Control 7 segmentos ;PRECONDICION : Ninguna ;POSTCONDICION : Ninguna ;-------------------------------;-------------------------------;PARAMETROS PARA EL 8155 ;-------------------------------PA81 EQU C401H PB81 EQU C402H PC81 EQU C403H REES81 EQU C400H

01 02 03 00

C4 C4 C4 C4

_______________________________________ 170 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

;-------------------------------;-------------------------------;PARAMETROS PUNTERO DE PILA ;-------------------------------PPILA EQU 87FFH ;-------------------------------;-------------------------------;PARAMETROS DATOS RAM 8155 ;-------------------------------DATOS EQU C010H ;-------------------------------DIGITOS: F3 21 F9 3E 32 3E 32 21 36 23 36 CD A7 21 3E 8E 27 77 23 3E 8E 27 77 C3 FF 87 0F 00 C4 FF 02 C4 10 C0 00 00 2C 00 10 C0 01 DI LXI H,PPILA SPHL MVI A,0FH STA REES81 MVI A,FFH STA PB81 LXI H,DATOS MVI M,00H INX H MVI M,00H CALL SACADATO ANA A LXI H,DATOS MVI A,01H ADC M DAA MOV M,A INX H MVI A,00H ADC M DAA MOV M,A JMP S1

FF 87

10 C0

0000 0000 0001 0004 0005 0007 000A 000C 000F 0012 0014 0015 0017 001A 001B 001E 0020 0021 0022 0023 0024 0026 0027 0028 0029

S1

00

17 00

;-------------------------------;NOMBRE: SACADATO ;FUNCION: Sacar datos a display ;PRECONDICION: Datos RAM (DATOS) ;POSTCONDICION: Ninguna ;-------------------------------002C 002C 002D 002E 002F 0030 0033 0035 0037 003A 003B 003E 003F 0042 SACADATO: PUSH PSW PUSH H PUSH D PUSH B LXI D,1FFFH S2 MVI B,FEH MVI C,02H LXI H,DATOS S3 MOV A,M STA PA81 MOV A,B STA PB81 NOP

F5 E5 D5 C5 11 06 0E 21 7E 32 78 32 00

FF 1F FE 02 10 C0 01 C4 02 C4

_______________________________________ 171 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

0043 0044 0045 0047 004A 004B 004C 004D 004E 004F 0052 0053 0054 0055 0058 0059 005A 005B 005D 0060 0061 0062 0063 0064 0065 0068 0069 006A 006B 006E 006F 0070 0071 0072 0073

00 00 3E 32 7E 0F 0F 0F 0F 32 78 07 47 32 00 00 00 3E 32 23 78 07 47 0D C2 1B 7A B3 C2 C1 D1 E1 F1 C9

FF 02 C4

01 C4

02 C4

FF 02 C4

3A 00

33 00

NOP NOP MVI STA MOV RRC RRC RRC RRC STA MOV RLC MOV STA NOP NOP NOP MVI STA INX MOV RLC MOV DCR JNZ DCX MOV ORA JNZ POP POP POP POP RET END

A,FFH PB81 A,M

PA81 A,B B,A PB81

A,FFH PB81 H A,B B,A C S3 D A,D E S2 B D H PSW

******** DATOS DIGITOS PA81 PB81 PC81 PPILA REES81 S1 S2 S3 SACADATO

C R O S S = C010 0000 = C401 = C402 = C403 = 87FF = C400 0017 0033 003A 002C : : : : : : : : : : :

R E F E R E N C E 37 72 36 31 34 53 104 100 41 43 85 74 70

T A B L E

********

79

89

94

LINES ASSEMBLED :

111

ASSEMBLY ERRORS :

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.

_______________________________________ 172 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

8.6 EJERCICIOS.

1. 2. 3.

Desarrollar una breve descripcin funcional del PPI 8155. Definir los modos de programacin del PPI 8155. Explicar el modo de conexin del PPI 8155 al bus del 8085, empleando la seal IO/M del microprocesador. En el programa desarrollado en el ejemplo 1, denominado LAMPARAS, qu cambios habra que realizar para: a) Emplear como pila la RAM del 8155. b) Controlar las lmparas con el puerto B. c) Aumentar el tiempo de la temporizacin. En el ejemplo 3 cmo aumentaramos el tiempo de permanencia en pantalla de las cifras a representar?

4.

5.

_______________________________________ 173 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

PRCTICA DE CONTROL CON MICROPROCESADOR (I).

_______________________________________ 174 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

9. EJERCICIOS DE CONTROL CON MICROPROCESADOR (I).

Es fundamental, cuando se est estudiando un microprocesador, en este caso el 8085A, desarrollar algn ejercicio prctico que nos permita fijar conceptos y aclarar dudas, de forma tal que, los conceptos adquiridos vayan siendo cada vez ms consistentes. Con este propsito se desarrolla este tema, en el que llevaremos a cabo un control de giro y posicionamiento de varios motores paso a paso, al tiempo que presentaremos en una pequea pantalla LCD, el proceso de control seguido. Por tanto en los puntos que vienen a continuacin se presentar: Un diagrama de bloques general en el que podremos apreciar con claridad todo el sistema que deseamos controlar y su interconexin con las tarjetas de control. Los motores paso a paso, tanto en lo que respecta a su constitucin interna y funcionamiento, como en lo referente a los mtodos de control. Se realizar un estudio de las pantallas LCD y su mtodo de programacin. Se presentarn los diferentes esquemas de las tarjetas de control necesarias. Se mostrar de forma detallada la interconexin de los diferentes elementos con los Perifricos 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 INTRODUCCIN.
En primer lugar, necesitamos tener una idea clara del trabajo o proyecto que deseamos abordar. Para ello nos apoyaremos en el estudio del diagrama de bloques a continuacin mostrado en la FIG.91A que representa el sistema global que utilizaremos en este trabajo. Podemos observar en primer lugar que los elementos de potencia que deseamos controlar son tres motores paso a paso (M1, M2 y M3) cuyas caractersticas y constitucin estudiaremos posteriormente. Estos elementos van controlados por las correspondientes etapas drivers de potencia (DM1, DM2 y DM3) cuyo diseo llevaremos acabo, siendo su misin bsica suministrar la corriente y tensin necesarias para adaptar las seales de control procedentes de los perifricos programables de interface, en este caso un 8255. Adems se dispondr tambin de una pantalla LCD, en la que podremos ir introduciendo los datos que consideremos oportunos para seguir el desarrollo del programa de forma grfica. Las caractersticas y modo de programacin de la pantalla se vern ms adelante, as como el equipo de adaptacin necesario, es decir, la driver de control (DLCD). Las seales de control y comunicacin procedern de otro perifrico programable de interface, en esta caso el 8155. Conectados a este ltimo PPI 8155, dispondremos 8 pulsadores de control con los podremos efectuar los procedimientos de prueba que deseemos.

_______________________________________ 175 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Ambos perifricos (8255 y 8155) irn conectados del modo ya comentado en temas anteriores a nuestra tarjeta principal, basada en el microprocesador 8085 y cuya distribucin de componentes de memoria ya conocemos. Todos los elementos sealados estn convenientemente alimentados mediante una fuente que suministre tensiones de +5V y +12V perfectamente filtradas y estabilizadas. En la construccin del cableado se tendr especial cuidado en separar las masas de alimentacin de la parte lgica, de las masas de alimentacin de los motores, al objeto de evitar posibles interferencias de picos de corriente generados en las bobinas de los motores.

FUENTE DE ALIMENTACION MASA MASA POTENCIA

+5V

+12V

CPU

8255

8155

DM1

DM2

DM3

DLCD PULSADORES

M1

M2

M3 FIG.91A

LCD

9.2 EL MOTOR PASO A PASO.

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 formarn los polos norte-sur de forma que se cree un campo magntico giratorio. Una mvil, llamada rotor construida mediante un imn permanente, con el mismo nmero de pares de polos, que el contenido en una seccin 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 _______________________________________ 176 ___________________________________________

2.

____________________ Curso 8085A ____________________________________________________________

excitacin de modo que el campo magntico formado efecte un movimiento giratorio, la respuesta del rotor ser seguir el movimiento de dicho campo, producindose de este modo el giro del motor. Puede decirse por tanto que un motor paso a paso es un elemento que transforma impulsos elctricos en movimientos de giro controlados, ya que podremos hacer girar al motor en el sentido que deseemos y el nmero de vueltas y grados que necesitemos. Segn la construccin 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 grfica. A igual nmero de espiras, el unipolar, deber tener menor seccin en el hilo de las bobinas, aumentando por tanto su resistencia y disminuyendo su par a bajas velocidades.

C D

E F

RCS TCU FIG.92A

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 imn permanente (rotor) altamente coercitivo de 24 polos, y se apoya sobre cojinetes de bronce endurecido que no necesitan mantenimiento. Al nmero de grados que gira el rotor, cuando se efecta un cambio de polaridad en las bobinas del estator, se le denomina ngulo de paso y puede ser muy variado en funcin de la aplicacin y por tanto de la construccin del mismo. Adems, existe la posibilidad (con el control electrnico apropiado) de conseguir una rotacin de medio paso. En los motores que tratamos a continuacin el paso completo es de 75 (medio paso 375) y el nmero de pasos por vuelta completa es de 48. En cada paso puede producirse un error cifrado de 05 en adelanto o en retraso, sin embargo, este error no es acumulativo, quedando anulado en el transcurso de los 360 grados elctricos. Deberemos considerar que cuando se efecte medio giro, el motor desarrollar un par menor y ejecutar el giro con menor precisin. 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 magntico creado por el estator muy elevada, no siendo el rotor capaz de alcanzar esa velocidad, provocando una prdida de sincronizacin y quedando frenado en estado de vibracin. Para nuestro tipo de motores, la mxima 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 tambin dos modos de excitacin de sus devanados: Devanado bipolar. Tenemos dos bobinas de arrollamiento nico y su excitacin, es decir, el orden en que se les aplica la tensin, 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 ms que seguir la secuencia inversa, es decir, 4, 3, 2, 1.

_______________________________________ 177 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

BIPOLAR CD EF 1 + OFF + OFF OFF

UNIPOLAR R 1 1 0 0 1 S 0 0 1 1 0 T 1 0 0 1 1 U 0 1 1 0 0

2 OFF 3 -

4 OFF 5 +

TABLA SECUENCIAL

Devanado bipolar. Tenemos dos bobinas con doble arrollamiento y la excitacin precisa en las bobinas se representa tambin en la misma tabla. Los valores 1 y 0 representan niveles lgicos. Con la secuencia 1, 2, 3, 4 se realiza un giro a la derecha y para cambiar el sentido de giro se efecta la secuencia contraria.

9.3 CONTROL DE MOTORES PASO A PASO.

El manejo operativo de un motor paso a paso, puede llevarse a cabo de dos modos bsicos, bien mediante un control por tensin constante o bien mediante un control por corriente constante. Vamos a mostrar el control por tensin constante de un motor bipolar, mediante un circuito integrado diseado especficamente para esta labor. Se trata del SAA 1042 (fabricado por Motorola) cuya distribucin de patillas se muestra en la FIG.93A.

1 2 3
SAA 1042

16 15 14

6 7 8

11 10 9

Fig.93A

_______________________________________ 178 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Seguidamente describiremos la funcin de cada una de ellas: Patilla 1: Salida de control de una bobina del motor en unin 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 unin con la patilla 1. Patilla 6: Terminal con dos funciones bsicas. A travs de una resistencia adapta la corriente del motor y con un pulso a travs de la resistencia se efecta un set de las salidas de control. Si no se utiliza la funcin set, debe colocarse a masa a travs de la resistencia. Patilla 7: Entrada de reloj, activa en el flanco positivo del pulso. Por cada pulso que llegue, el motor gira 75 (o bien 375 segn este conectado el terminal 8). Patilla 8: (Full/Half step) Determina el ngulo de rotacin del motor por cada pulso que llegue de reloj. En estado bajo, el motor gira un paso completo (75). 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: Alimentacin de la parte lgica del SAA 1042. Puede variar de los +5V hasta los +20V. Puede ser la misma tensin que la alimentacin del motor (patilla 15) o bien puede alimentarse a +5V para ser acoplado a seales de nivel TTL. Patilla 14: Salida de control de una bobina del motor en unin con la patilla 16. Patilla 15: Tensin a la que vamos a alimentar al motor. Patilla 16: Salida de control de una bobina del motor en unin 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 lgico 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 parsitos. Sus entradas son compatibles con familias lgicas como MOS, DTL y TTL. Como puede observarse en la FIG.93A, posee dos aletas refrigeradoras, que posibilitan mayor disipacin de calor interno. No obstante es conveniente aadir un pequeo refrigerador que aumente la capacidad de disipacin total. En la FIG.93B puede verse la conexin de las bobinas del motor al SAA 1042. Si conectamos una seal pulsante de reloj en la entrada de Clock, haremos girar el motor en el sentido que deseemos, segn conectemos la entrada CW/CCW a +5V o a masa; por cada pulso recibido el motor girar 75 375 segn sea el estado de la entrada F/H.
3V3 2 56K +5V 10 8 OSCIL +5V 7 11 SAA 1042 6 15 50 16 14 3 1 9 FIG.93B 4W 4W 50 C D F E +12V

Como hemos visto hasta ahora, es el circuito integrado especfico, el que en funcin de unos pulsos y seales de entrada, genera las seales o pulsos de control para las bobinas del motor. Sin embargo, esto tambin

_______________________________________ 179 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

puede realizarse, mediante algn elemento de potencia final (transistor,...) controlado de forma apropiada mediante algn perifrico con el que podamos generar la secuencia precisa de las seales de control. Para realizar esta tarea, elegimos el PPI 8155, a travs del cual generaremos las seales de control que llevamos a los elementos de potencia que gobernarn las bobinas del motor. Como elemento de potencia elegimos el ya conocido ULN 2803, quedando la conexin definitiva como se muestra en la FIG.93C.
+12V D1 1 18 D2 2 17

ULN 2803

D3 16 D4

15

FIG.93C

Como puede apreciarse, estamos controlando un motor unipolar, al que segn la tabla de secuencia de seales ya conocida, tendremos que inyectar las seales 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.

R S T U 1 2 3 4 5

FIG.93D

Las cuatro lneas de entrada al ULN 2803, sern las seales 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 irn controlados por los puertos del PPI 8155. Por otro lado, para girar los motores a la posicin correcta, necesitamos partir de una posicin 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 seal que nos indica que estamos en la posicin inicial o de origen. El esquema correspondiente a este circuito de deteccin 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 saturacin al fototransistor, apareciendo un 0 lgico en su colector. Esta seal se lleva a una entrada del ULN 2803 que en su _______________________________________ 180 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

salida presentar un 1 lgico indicndonos 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 lgico en su colector y por tanto en la entrada del ULN 2803, que nos proporcionar un 0 lgico en su salida indicndonos que en ese instante hemos alcanzado la posicin inicial. Lgicamente necesitaremos un circuito similar para cada motor.
+5V R2 3K3 H22A1 5 14 SALIDA R3 10K

ULN 2803 R1 100

FIG.93E

9.4 LA PANTALLA LCD.

Otro de los puntos importantes en el desarrollo de este trabajo es la colocacin de una pantalla o marcador donde se refleje de forma grfica los estados o las secuencias del control de los motores, de este modo podremos comprobar si los diferentes posicionamientos alcanzados por los motores corresponden con lo realmente deseado y diseado en los algoritmos del programa. Dentro de las amplias posibilidades que existen en el mercado de pantallas para marcadores, se considerar en este caso una pantalla LCD de BATRON (BT 12009) compuesta por una lnea de 20 dgitos. Aunque si se deseara otra pantalla no tendramos ms que sustituir el hardware de control de la misma y modificar oportunamente el software. Esta pantalla o mdulo BT 12009 posee bsicamente las siguientes caractersticas segn el fabricante: Una lnea de 20 caracteres. Un carcter 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 fcil conexin al bus de cualquier microprocesador, en este caso al 8085A. A continuacin se presenta el patillaje de este mdulo: Patilla 1: Terminal de masa (GND). Patilla 2: Terminal de alimentacin a una tensin de +5V. Patilla 3: No conectado.

_______________________________________ 181 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Patilla 4: Terminal de seleccin (RS) de registros internos del mdulo LCD. Patilla 5: Terminal de lectura y escritura (R/W) del mdulo LCD. Patilla 6: Terminal de seleccin o habilitacin del mdulo (E). Patilla 7: Lnea del bus de datos (DB0). Patilla 8: Lnea del bus de datos (DB1). Patilla 9: Lnea del bus de datos (DB2). Patilla 10: Lnea del bus de datos (DB3). Patilla 11: Lnea del bus de datos (DB4). Patilla 12: Lnea del bus de datos (DB5). Patilla 13: Lnea del bus de datos (DB6). Patilla 14: Lnea del bus de datos (DB7).

Todas las funciones que se pueden programar en este mdulo LCD, se controlan mediante las seales E, RS y R/W escribiendo o leyendo los datos oportunos. Los niveles lgicos activos de todas las seales de control corresponden con el nivel ALTO (1 lgico). En la siguiente tabla se muestran las operaciones que se realizan segn las combinaciones de las mismas:

E 1 1 1 1

RS 0 0 1 1

R/W 0 1 0 1

OPERACION Escribir una instruccin en el IR Leer el IR (AC y el flag Busy) Escribir en DR (Para DD RAM o CG RAM) Leer el DR (De DD RAM o CG RAM)

La seal E es de habilitacin del mdulo y es activa con nivel lgico ALTO. La seal RS sirve para seleccionar los registros internos IR (RS=0) y DR (RS=1). La seal R/W se emplea para leer (R/W=1) o para escribir (R/W=0) un dato en el registro deseado.

PANTALLA LCD
14

FIG.94A

El mdulo, representado en el FIG.94A, posee adems un registro denominado AC que apunta a la direccin donde sern ledos 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 automticamente de acuerdo a cmo se programe el "modo entrada". En la FIG.94B, podemos apreciar la forma de conectar la pantalla LCD a nuestra CUP a travs del PPI 8155. Las lneas PC0, PC1 y PC2 se utilizan para controlar la pantalla LCD, mientras que las lneas de datos de sta son accedidas conectando PC0, PC1, ..., PC7 a DB0, DB1, ..., DB7, respectivamente. En todas y cada una de las lneas mencionadas debe conectarse una resistencia de 1K a +5V.

_______________________________________ 182 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

+5V PC2 PC1 PC0 3X1K 8X1K PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 +5V FIG.94B DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 14 LCD 13 BT 12009 12 11 10 9 1 8 7 E R/W RS 2 +5V

GND

9.5 PROGRAMACIN DE LA PANTALLA LCD.

Las funciones que pueden programarse en la pantalla LCD segn se desee leer o escribir determinados datos son: Clear Display: Borra todo el display, sita el cursor en su posicin 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 posicin inicial (direccin 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 aparecern en la pantalla. Esto se consigue escribiendo en IR la palabra que deseemos segn se seala a continuacin: 0000 01 I/D S. I/D = 0 Decremento automtico del AC al escribir I/D = 1 Incremento automtico del AC al escribir S = 0 El display no se desplaza al escribir un nuevo carcter S = 1 El display si se desplaza al escribir un nuevo carcter Control del display: Enciende o apaga el display completo, enciende o apaga el cursor y hace que el cursor parpadee o no, en funcin del cdigo introducido segn se indica a continuacin: 0000 1DCB

_______________________________________ 183 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

B=0 B=1 C=0 C=1 D=0 D=1

No hay parpadeo en el cursor rectangular Si hay parpadeo en el cursor rectangular El cursor no se visualiza El cursor si se visualiza El display se apaga El display se enciende

Desplazamiento de cursor o display: Mueve el cursor y desplaza el display sin cambiar el contenido de la DD RAM segn el cdigo siguiente: 0 0 0 1 S/C R/L X X S/C = 0 S/C = 1 R/L = 0 R/L = 1 El deslizamiento se produce sobre el cursor El deslizamiento se produce sobre todo el display A izquierdas A derechas

Set: Permite conectar el mdulo LCD a travs de las 8 lneas del bus de datos o bien con 4 lneas solamente para ahorrar lneas de conexin caso de emplear una puerta de un PPI. Permite emplear una o dos lneas (en este caso una) y el nmero de puntos por carcter (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 lnea N = 1 Se trabaja con dos lneas F = 0 Se obtendrn 5x7 puntos F = 1 Se obtendrn 5x10 puntos

Colocar direccin CG RAM: El registro AC queda cargado con la direccin de la CG RAM 0 1 CG5 CG4 CG3 CG2 CG1 CG0

CG5...CG0 = direccin de CG RAM (64 direcciones) Colocar direccin de DD RAM: El registro AC queda cargado con la direccin de la DD RAM. 1 DD6 DD5 DD4 DD3 DD2 DD1 DD0 DD6...DD0 = direccin de DD RAM (128 direcciones) Leer Busy y AC: El dato recibido indica el contenido de AC es decir, la direccin de CG RAM o de DD RAM segn la que se haya seleccionado previamente. El bit nmero 7 representa el flag Busy que nos indica si el mdulo 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

_______________________________________ 184 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

9.6 SISTEMA DE PULSADORES.

A efectos de poder controlar el desarrollo de la prctica, se colocarn 8 pulsadores en el puerto B del PPI 8155 (de forma similar a como se hizo en el ejercicio 3 del tema 7). A cada pulsador se le atribuir una funcin determinada mediante el software que se disear y que nos permitir ejecutar la prctica en el momento que nos interese. Los pulsadores sern conectados segn se muestra en la FIG.96A. En cada lnea de pulsador nos encontramos una red R-C para eliminar los picos que se producen durante los contactos mecnicos de los pulsadores.

RED

+5V

10K 47

100nF

PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

P0 RED P1 RED P2 RED P3 RED P4 RED P5 RED P6 RED P7 RED

PPI 8155

FIG.96A

El valor de estos componentes debe calcularse en funcin de las necesidades de la aplicacin, teniendo en cuenta que cuanto mayor sea la constante de tiempo RC, ms lenta ser la respuesta del pulsador, pero a la vez, ms segura ser en cuanto a eliminacin de rebotes. Tambin podramos actuar contra los rebotes en los pulsadores, diseando una subrutina apropiada al caso. En condiciones de reposo, ningn pulsador accionado, los condensadores estarn cargados a travs de las resistencias a un nivel de tensin de +5V, por lo que tendremos un nivel lgico 1 en las entradas del PPI 8155. Cuando accionamos uno de los pulsadores, el condensador correspondiente se descarga a masa a travs de la resistencia de 47 ohmios, por lo que aparecer un nivel lgico 0 en la entrada del PPI 8155 al que se lleva esta seal. Al soltar el pulsador el condensador comenzar a cargarse hasta alcanzar un nivel lgico 1. Las operaciones de carga y descarga se realizan segn una funcin exponencial.

_______________________________________ 185 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

9.7 CONFIGURACIN FINAL DEL HARDWARE.

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 ms sencillo de ver.
8155 21 PA0 22 PA1 23 PA2 24 PA3 E0 E1 E2 E3

+5V Vcc 40 100 uF GND 20

D1 ULN2803 1 18 S0 2 3 4 17 S1 16 S2 15 S3

M1 D2 D3 D4

D0 D1 D2 D3 D4 D5 D6 D7

AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

12 13 14 15 16 17 18 19

25 PA4 26 PA5 27 PA6 28 PA7

E0 E1 E2 E3

D5 ULN2803 1 18 S0 2 3 4 17 S1 16 S2 15 S3

M2 D6 D7 D8

29 PB0 30 PB1 31 PB2 32 PB3

E0 E1 E2 E3

D9 ULN2803 1 18 S0 D10 D11 D12 2 3 4 17 S1 16 S2 15 S3

M3

+12V ALE ALE 11 10 9 7 8 3 4 37 PC0 ULN2803 S0 E0 +5V DM1 H22A1

WR WR RD RD A10 IO/M CS4 CS CLK OUT TIMER IN RESET RESET OUT 100 uF

38 PC1

S1

E1

DM2 H22A1

R9

39 PC2

S2

E2

DM3 H22A1

R8

R7

FIG.97A

_______________________________________ 186 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Vcc 26 GND 7 4 3 2 1 40 39 38 37 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 8x1K 14 PC0 15 PC1 16 PC2 3x1K RS 4 R/W 6 E 5 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 14 13 12 11 10 9 8 7 2

+5V

A0 A1 WR RD CS3 RESET OUT 100 nF

A0 A1

9 8

LCD

WR 36 RD 5 CS 6 RESET 35

+5V 8255

D0 D1 D2 D3 D4 D5 D6 D7

D0 D1 D2 D3 D4 D5 D6 D7

34 33 32 31 30 29 28 27

18 PB0 19 PB1 20 PB2 21 PB3 22 PB4 23 PB5 24 PB6 25 PB7

RED RED RED RED RED RED RED RED

P0 P1 P2 P3 P4 P5 P6 P7 +5V 10K 47 10 nF RED

FIG.97B

Al estudiar los esquemas vemos que los tres motores y los detectores de posicin 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 proteccin (uno por cada bobina). El motor M1 es controlado con las lneas PA0, ..., PA3 del puerto A, el motor M2 mediante las lneas PA4, ..., PA7 del puerto A y el motor M3 con las lneas PB0, ..., PB3 del puerto B. Como el ULN2803 est constituido por puertas inversoras, cuando en un devanado determinado deseemos colocar un 0 lgico, tendremos que sacar un 1 lgico por la lnea correspondiente del 8155. Los detectores de posicin (fotodetectores) se conectan al puerto C a travs de otro ULN2803, en cuyas entradas y salidas situaremos resistencias de polarizacin. _______________________________________ 187 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

El bus de datos del 8155 se conecta directamente al bus de datos del microprocesador de nuestra tarjeta principal y las distintas seales de control, del modo indicado en la FIG.97A. Este PPI se selecciona con la seal CS4 y el control de acceso a memoria o a entrada/salida se realiza mediante la lnea de direcciones A10 del microprocesador. El PPI 8255 se conecta de modo similar a los buses del microprocesador 8085, realizando la seleccin de este dispositivo mediante la seal CS3. La pantalla LCD se controla mediante el puerto A y los tres bits menos significativos del puerto C con los que se realizarn las funciones de control necesarios para gobernar el sistema LCD. Es importante situar en todas las lneas de acceso a la pantalla programable, resistencias de polarizacin, como se ha realizado a travs de los arrays. Mediante el puerto B controlamos las seales de entrada del sistema de pulsadores. Segn las conexiones realizadas, tendremos las siguientes direcciones de acceso a los dispositivos de control: PPI 8155 Registro de estado Puerto A Puerto B Puerto C RAM 8155 PPI 8255 Registro de estado Puerto A Puerto B Puerto C

C400H C401H C402H C403H C000H - C0FFH

B003H B000H B001H B002H

Estas direcciones se han obtenido por un procedimiento idntico 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.

9.8 SOFTWARE DE CONTROL.

Como es lgico, realizado ya el diseo del hardware, iniciaremos el proceso de desarrollo del software de control necesario para manejar de la forma que nosotros deseemos, todos los dispositivos de carga, que en este caso son, como sabemos, los tres motores, la pantalla LCD y los siete pulsadores. En principio y como primera aproximacin a lo que ser nuestro programa, puede establecer el siguiente pseudocdigo: NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

_______________________________________ 188 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Iniciar el sistema Iniciar pantalla LCD Colocar motores en posicin inicial MIENTRAS pulsador no sea accionado Explorar pulsadores FIN de MIENTRAS Ejecutar funcin pulsadores Volver a "Explorar pulsadores" Final del programa Seguidamente se procede a realizar un paso ms de refinamiento que nos determine de forma algo ms precisa cada uno de los pasos antes mencionados, para finalmente llegar a desarrollar el proceso deseado. El proceso "Iniciar sistema" consistir bsicamente 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. Segn 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 informacin con la pantalla LCD, habr que programar el puerto A como entrada para en determinadas ocasiones leer la informacin que dicho perifrico nos enve. "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 permitirn seguir el proceso y evolucin del programa desarrollado en cada instante. El proceso de inicializacin del LCD consistir esencialmente en programarlo como una lnea de dgitos formado cada uno por 5x7 puntos, prever que la informacin 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 posicin inicial" ser un proceso por el cual se pongan los tres motores paso a paso en movimiento, hasta alcanzar la posicin inicial de giro, momento en el que se pararn. La posicin inicial de giro ser la sealada por los fotodetectores de posicin que como sabemos estn conectados a las lneas PC0, PC1 y PC2 del PPI 8155. La posicin en la que el aspa, que va unido solidariamente al eje del motor, intercepta el haz del fotodetector, la consideramos como origen o posicin de giro de 0. Lgicamente, si a partir de ese instante deseamos que un motor avance 30, no tendremos ms 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 estn conectados los pulsadores, si la palabra de 8 bits leda es FFH entenderemos que no hay ningn pulsador accionado, mientras que si algn bit de dicha palabra es 0 lgico, el pulsador correspondiente estar accionado teniendo entonces que proceder a realizar la funcin correspondiente a dicho pulsador. "Ejecutar funcin pulsadores" es el proceso inmediato a ejecutar una vez ha sido detectado un pulsador y consistir bsicamente 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 exploracin de los pulsadores. Las funciones asignadas a cada pulsador pueden ser las que nosotros deseemos, en este caso iremos asignndolas en pasos de refinamiento posteriores a medida que vayamos avanzando en la definicin de nuestro programa. Tras este pequeo anlisis obtendremos el siguiente pseudocdigo: 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

_______________________________________ 189 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 funcin pulsador accionado Volver a "Iniciar pulsadores" Final del programa Pasaremos ahora a analizar ms detenidamente y con mayor profundidad cada uno de los procesos que an 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 informacin necesaria en cada momento. Bsicamente el proceso a seguir consistir en "escribir datos" en sus registros y "leer informacin" almacenada en los mismos. Por tanto se disearan las subrutinas necesarias para llevar a cabo estas operaciones. Basndonos 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 alfanumricos. La denominaremos CADENA. 5. Proceso de inicializacin del LCD hacindolo 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 bsicamente 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 lgico, tendremos dispuesta la pantalla para recibir datos. Mientras el bit 7 del IR permanezca en estado lgico 1, el bucle se contina 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 condicin indispensable disponer en el Acumulador del dato a cargar, antes de acceder a esta subrutina. Cuando

_______________________________________ 190 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

finalice su trabajo no habr efectuado ninguna modificacin 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: Direccin comienzo cadena en HL. Final de cadena marcado por el carcter "." 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 direccin de memoria en la que se encuentra el comienzo de la cadena a transmitir. El final de la cadena ser detectado al encontrar el carcter "." momento en el que se dar por finalizada la escritura en el LCD.

El proceso de Iniciar el LCD puede plantearse tambin coo subrutina, aunque nosotros lo desarrollaremos como una continuacin del programa en sus comienzos. Este proceso ser del modo siguiente: Colocar control de 8 bits Temporizar ms de 4,1 segundos Colocar control de 8 bits Temporizar ms 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 caractersticas. Adems vemos que necesitamos incorporar subrutinas de temporizacin. Nosotros disearemos una nica

_______________________________________ 191 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

temporizacin que, en funcin de los datos que le aportemos, nos ejecute la temporizacin deseada. Denominaremos esta subrutina TEMPOR y puede ser la siguiente: NOMBRE: TEMPOR FUNCION: Proporciona un tiempo de espera PRECONDICIONES: Valor temporizacin 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 posicin de inicio que nosotros consideraremos como de giro de 0. (Posicin marcada por el aspa). Tendremos por tanto que disear una subrutina que, en funcin de unos datos de entrada (que nos indiquen la posicin en que deben parar los motores) hagan girar dichos elementos hasta la posicin especificada. Denominaremos a esta subrutina GIRAR y puede ser del modo siguiente: NOMBRE: GIRAR FUNCION: Gira motores hasta posicin adecuada PRECONDICIONES: Valor posicin 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 posicin de M1 MIENTRAS posicin M1>0 Sacar datos giro a motores M1, M2 y M3 Decrementar posicin 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 posicin de M2 MIENTRAS posicin M2>0 Sacar datos giro a motores M2 y M3 Decrementar posicin 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 posicin de M3 MIENTRAS posicin M3>0 Sacar datos giro a motores M3 Decrementar posicin M3 FIN de MIENTRAS FIN de subrutina

_______________________________________ 192 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Vemos que el proceso de posicionamiento de los tres motores consiste en hacerlos girar al mismo tiempo hasta encontrar la posicin deseada del motor M1, a continuacin encontrar la posicin deseada para M2 y finalmente, encontrar la posicin del motor M3. El proceso "leer aspas" consistir en efectuar una lectura de las seales presentes en los fotodetectores DM1, DM2 y DM3 que estn conectados al puerto C del PPI 8155 a travs 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 girarn hasta situarse los tres a 30 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P0 - 30 - 30 - 30". Pulsador P1. Los motores girarn hasta situarse los tres a 60 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P1 - 60 - 60 - 60". Pulsador P2. Los motores girarn hasta situarse los tres a 90 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P2 - 90 - 90 - 90". Pulsador P3. Los motores girarn hasta situarse los tres a 120 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P3 - 120 - 120 - 120". Pulsador P4. Los motores girarn hasta situarse M1 a 30, M2 a 60 y M3 a 90 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P4 - 30 - 60 - 90". Pulsador P5. Los motores girarn hasta situarse M1 a 90, M2 a 30 y M3 a 120 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P5 - 90 - 30 - 120". Pulsador P6. Los motores girarn hasta situarse M1 a 180, M2 a 0 y M3 a 90 de su posicin de arranque. En la pantalla LCD aparecer la expresin "PULSADOR P6 - 180 - 0 - 90". Pulsador P7. Los motores girarn hasta situarse los tres a 0 de su posicin de arranque, es decir, se colocaran en la posicin inicial. En la pantalla LCD aparecer la expresin "PULSADOR P7 - POSICION INICIAL". Se reunir ahora todas las subrutinas expuestas hasta el momento para tener una idea ms 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 ms de 4,1 segundos Colocar control de 8 bits Temporizar ms 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 funcin pulsador accionado Volver a "Iniciar pulsadores" Final del programa

_______________________________________ 193 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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: Direccin comienzo cadena en HL. Final de cadena marcado por el carcter "." 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 temporizacin en DE POSTCONDICIONES: Modifica DE Iniciar DE MIENTRAS DE>0

_______________________________________ 194 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Esperar Decrementar contador (DE) FIN de MIENTRAS Final de subrutina

NOMBRE: GIRAR FUNCION: Gira motores hasta posicin adecuada PRECONDICIONES: Valor posicin 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 posicin de M1 MIENTRAS posicin M1>0 Sacar datos giro a motores M1, M2 y M3 Decrementar posicin 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 posicin de M2 MIENTRAS posicin M2>0 Sacar datos giro a motores M2 y M3 Decrementar posicin 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 posicin de M3 MIENTRAS posicin M3>0 Sacar datos giro a motores M3 Decrementar posicin M3 FIN de MIENTRAS FIN de subrutina

Con todos estos datos podemos pasar a desarrollar el programa ensamblador equivalente a nuestro pseudocdigo. El lector puede desarrollar an ms los diferentes procesos sealados en el pseudocdigo si necesita tener determinadas cuestiones ms claras.

2500 A.D. 8085 CROSS ASSEMBLER VERSION 3.41a -------------------------------------------------INPUT FILENAME : OUTPUT FILENAME : MOTORES.ASM MOTORES.OBJ

_______________________________________ 195 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

1 2 3 4 5 6 7 8 ;PARAMETROS PPI 8155 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 01 02 03 00 FF C4 C4 C4 C4 C0

;-----------------------------------------;NOMBRE : MOTORES ;FUNCION : CONTROL MOTORES PAP Y LCD ;PRECONDICION : NINGUNA ;POSTCONDICION : NINGUNA ;-----------------------------------------;------------------------------------------9 ;-----------------------------------------PA81 EQU C401H PB81 EQU C402H PC81 EQU C403H REES81 EQU C400H PPILA EQU C0FFH ;-----------------------------------------;-----------------------------------------;PARAMETROS PPI 8255 ;-----------------------------------------PA82 EQU B000H PB82 EQU B001H PC82 EQU B002H REES82 EQU B003H ;-----------------------------------------;-----------------------------------------;PARAMETROS GRADOS GIRO MOTORES ;-----------------------------------------GIRM1 EQU 8200H GIRM2 EQU 8201H GIRM3 EQU 8203H ;-----------------------------------------MOTORES: F3 21 F9 3E 32 3E 32 3E CD 11 CD 3E CD 11 CD 3E CD CD 3E CD 3E CD 11 CD 3E 21 77 23 77 23 77 FF C0 03 00 82 03 30 44 FF 38 30 44 FF 38 30 44 86 06 44 0E 44 FF 38 00 00 DI LXI H,PPILA SPHL MVI A,03H STA REES81 MVI A,82H STA REES82 MVI A,30H CALL ESCIR LXI D,2FFFH CALL TEMPOR MVI A,30H CALL ESCIR LXI D,0FFFH CALL TEMPOR MVI A,30H CALL ESCIR CALL LIBRE MVI A,06H CALL ESCIR MVI A,0EH CALL ESCIR LXI D,0FFFH CALL TEMPOR MVI A,00H LXI H,GIRM1 MOV M,A INX H MOV M,A INX H MOV M,A

00 01 02 03

B0 B0 B0 B0

00 82 01 82 03 82

0000 0000 0001 0004 0005 0007 000A 000C 000F 0011 0014 0017 001A 001C 001F 0022 0025 0027 002A 002D 002F 0032 0034 0037 003A 003D 003F 0042 0043 0044 0045 0046

C4 B0 01 2F 01 01 0F 01 01 01 01 01 0F 01 82

_______________________________________ 196 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134

0047 004A 004D 0050 0052 0055 0056 0058 005B 005C 005E 0061 0063 0066 0068 006B 006D 0070 0072 0075 0077 007A 007C 007F 0082 0084 0087 0088 0089 008A 008B 008C 008F 0092 0095 0098 009A 009D 009E 009F 00A0 00A1 00A2 00A5 00A8 00AB 00AE 00B0 00B3 00B4 00B5 00B6 00B7 00B8 00BB 00BE 00C1 00C4 00C6 00C9 00CA 00CB 00CC 00CD 00CE 00D1 00D4 00D7

CD 21 CD 3E 3A 47 FE CA 78 FE CA FE CA FE CA FE CA FE CA FE CA FE CA C3 3E 21 77 23 77 23 77 CD 21 CD C3 3E 21 77 23 77 23 77 CD 21 CD C3 3E 21 77 23 77 23 77 CD 21 CD C3 3E 21 77 23 77 23 77 CD 21 CD C3

C5 90 A9 FF 01

01 02 01 B0 SALT1 SALT2

FF 52 00 FE 82 FD 98 FB AE F7 C4 EF DA DF F1 BF 08 1F 11 00

00 00 00 00 00 00 01 01 PULSAD0 82

C5 A5 A9 35 22 00

01 02 01 01 PULSAD1 82

C5 BA A9 35 33 00

01 02 01 01 PULSAD2 82

C5 CF A9 35 44 00

01 02 01 01 PULSAD3 82

C5 E4 A9 35

01 02 01 01

CALL MOTOR LXI H,CADE1 CALL CADENA MVI A,FFH LDA PB82 MOV B,A CPI FFH JZ SALT2 MOV A,B CPI FEH JZ PULSAD0 CPI FDH JZ PULSAD1 CPI FBH JZ PULSAD2 CPI F7H JZ PULSAD3 CPI EFH JZ PULSAD4 CPI DFH JZ PULSAD5 CPI BFH JZ PULSAD6 JMP PULSAD7 MVI A,17 LXI H,GIRM1 MOV M,A INX H MOV M,A INX H MOV M,A CALL MOTOR LXI H,CADE2 CALL CADENA JMP FIN MVI A,34 LXI H,GIRM1 MOV M,A INX H MOV M,A INX H MOV M,A CALL MOTOR LXI H,CADE3 CALL CADENA JMP FIN MVI A,51 LXI H,GIRM1 MOV M,A INX H MOV M,A INX H MOV M,A CALL MOTOR LXI H,CADE4 CALL CADENA JMP FIN MVI A,68 LXI H,GIRM1 MOV M,A INX H MOV M,A INX H MOV M,A CALL MOTOR LXI H,CADE5 CALL CADENA JMP FIN

_______________________________________ 197 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

00DA 00DD 00DF 00E0 00E2 00E3 00E5 00E8 00EB 00EE 00F1 00F4 00F6 00F7 00F9 00FA 00FC 00FF 0102 0105 0108 010B 010D 010E 0110 0111 0113 0116 0119 011C 011F 0122 0124 0125 0126 0127 0128 0129 012C 012F 0132 0135

21 36 23 36 23 36 CD 21 CD C3 21 36 23 36 23 36 CD 21 CD C3 21 36 23 36 23 36 CD 21 CD C3 21 3E 77 23 77 23 77 CD 21 CD C3 C3

00 82 11 22 33 C5 F9 A9 35 00 33 11 44 C5 0E A9 35 00 66 00 33 C5 23 A9 35 00 00

01 02 01 01 82

01 03 01 01 82

01 03 01 01 82

C5 38 A9 35 50

01 03 01 01 00

PULSAD4 LXI H,GIRM1 MVI M,17 INX H MVI M,34 INX H MVI M,51 CALL MOTOR LXI H,CADE6 CALL CADENA JMP FIN PULSAD5 LXI H,GIRM1 MVI M,51 INX H MVI M,17 INX H MVI M,68 CALL MOTOR LXI H,CADE7 CALL CADENA JMP FIN PULSAD6 LXI H,GIRM1 MVI M,102 INX H MVI M,00 INX H MVI M,51 CALL MOTOR LXI H,CADE8 CALL CADENA JMP FIN PULSAD7 LXI H,GIRM1 MVI A,00 MOV M,A INX H MOV M,A INX H MOV M,A CALL MOTOR LXI H,CADE9 CALL CADENA JMP FIN FIN JMP SALT1 ;-----------------------------------------;NOMBRE: TEMPOR ;FUNCION: Tiempo de espera ;PRECONDICIONES: Valor en el par DE ;POSTCONDICIONES: Modifica DE ;-----------------------------------------TEMPOR: PUSH PSW TE1 DCX D MOV A,D ORA E NOP NOP NOP JNZ TE1 POP PSW RET ;-----------------------------------------;NOMBRE: ESCIR ;FUNCION: Escribe en el IR ;PRECONDICIONES: Dato en Acc ;POSTCONDICIONES: Ninguna ;-----------------------------------------ESCIR:

0138 0138 0139 013A 013B 013C 013D 013E 013F 0142 0143

F5 1B 7A B3 00 00 00 C2 39 01 F1 C9

0144

_______________________________________ 198 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270

0144 0145 0146 0147 014A 014C 014F 0150 0153 0155 0158 015A 015D 015F 0162 0163 0164

F5 C5 47 CD 3E 32 78 32 3E 32 3E 32 3E 32 C1 F1 C9

86 01 82 03 B0 00 00 02 04 02 00 02 B0 B0 B0 B0

PUSH PSW PUSH B MOV B,A CALL LIBRE MVI A,82H STA REES82 MOV A,B STA PA82 MVI A,00H STA PC82 MVI A,04H STA PC82 MVI A,00H STA PC82 POP B POP PSW RET ;-----------------------------------------;NOMBRE: ESCDR ;FUNCION: Escribe dato en el DR ;PRECONDICIONES: Dato en Acc ;POSTCONDICIONES: Ninguna ;-----------------------------------------ESCDR: PUSH PSW PUSH B MOV B,A CALL LIBRE MVI A,82H STA REES82 MOV A,B STA PA82 MVI A,01H STA PC82 MVI A,05H STA PC82 MVI A,01H STA PC82 POP B POP PSW RET ;-----------------------------------------;NOMBRE: LIBRE ;FUNCION: Mira si LCD puede recibir datos ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------LIBRE: PUSH B PUSH PSW MVI A,92H STA REES82 MVI A,02H STA PC82 LIB1 MVI A,06H STA PC82 NOP LDA PA82 MOV B,A MVI A,02H STA PC82 MOV A,B RLC JC LIB1 POP PSW POP B

0165 0165 0166 0167 0168 016B 016D 0170 0171 0174 0176 0179 017B 017E 0180 0183 0184 0185

F5 C5 47 CD 3E 32 78 32 3E 32 3E 32 3E 32 C1 F1 C9

86 01 82 03 B0 00 01 02 05 02 01 02 B0 B0 B0 B0

0186 0186 0187 0188 018A 018D 018F 0192 0194 0197 0198 019B 019C 019E 01A1 01A2 01A3 01A6 01A7

C5 F5 3E 32 3E 32 3E 32 00 3A 47 3E 32 78 07 DA F1 C1

92 03 B0 02 02 B0 06 02 B0 00 B0 02 02 B0

92 01

_______________________________________ 199 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338

01A8

C9

RET ;-----------------------------------------;NOMBRE: CADENA ;FUNCION: Escribe cadena caracteres ;PRECONDICIONES: Comienzo cadena en HL. ;Final de cadena marcado por "." ;POSTCONDICIONES: Ninguna ;-----------------------------------------CADENA: PUSH PSW PUSH H MVI A,80H CALL ESCIR CAD1 MVI A,0EH CALL ESCIR MOV A,M CPI '.' JZ FINCAD CALL ESCDR INX H JMP CAD1 FINCAD POP H POP PSW RET ;-----------------------------------------;NOMBRE: MOTOR ;FUNCION: Gira motores a posicion ;PRECONDICIONES: Datos en GIRM1, 2, y 3 ;POSTCONDICIONES: Ninguna ;-----------------------------------------MOTOR: PUSH D PUSH B PUSH H PUSH PSW LXI H,TGIRO MOT1 LDA PC81 MOV B,A RRC CC SDAT3 MOV A,B RRC JC MOT1 MOT2 XCHG LXI H,GIRM1 MOV C,M MOT3 MOV A,C CPI 00H JZ MOT4 XCHG CALL SDAT3 DCR C JMP MOT3 MOT4 LDA PC81 MOV B,A RRC RRC CC SDAT2 MOV A,B RRC RRC JC MOT4 MOT5 XCHG LXI H,GIRM2 MOV C,M MOT6 MOV A,C

01A9 01A9 01AA 01AB 01AD 01B0 01B2 01B5 01B6 01B8 01BB 01BE 01BF 01C2 01C3 01C4

F5 E5 3E CD 3E CD 7E FE CA CD 23 C3 E1 F1 C9

80 44 01 0E 44 01 2E C2 01 65 01 B0 01

01C5 01C5 01C6 01C7 01C8 01C9 01CC 01CF 01D0 01D1 01D4 01D5 01D6 01D9 01DA 01DD 01DE 01DF 01E1 01E4 01E5 01E8 01E9 01EC 01EF 01F0 01F1 01F2 01F5 01F6 01F7 01F8 01FB 01FC 01FF 0200

D5 C5 E5 F5 21 3A 47 0F DC 78 0F DA EB 21 4E 79 FE CA EB CD 0D C3 3A 47 0F 0F DC 78 0F 0F DA EB 21 4E 79

8B 02 03 C4

3F 02

CC 01 00 82

00 EC 01 3F 02 DE 01 03 C4

51 02

EC 01 01 82

_______________________________________ 200 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406

0201 0203 0206 0207 020A 020B 020E 0211 0212 0213 0214 0215 0218 0219 021A 021B 021C 021F 0220 0223 0224 0225 0227 022A 022B 022E 022F 0232 0234 0237 023A 023B 023C 023D 023E 023F 0240 0242 0245 0246 0249 024C 024F 0250 0251 0252 0254 0257 0258 025B 025D 0260 0263 0264 0265 0266 0268 026B 026C 026F 0271 0274 0277 0278 0279 027C 027D 027E

FE CA EB CD 0D C3 3A 47 0F 0F 0F DC 78 0F 0F 0F DA EB 21 4E 79 FE CA EB CD 0D C3 3E 32 32 F1 E1 C1 D1 C9 7E FE CC 7E 32 32 CD 23 C9 7E FE CC 7E 32 E6 32 CD 23 C9 7E FE CC 7E 32 E6 32 CD 23 C9 21 C9 F5 D5

00 0E 02 51 02 00 02 03 C4

MOT7

65 02

0E 02 MOT8 00 82 MOT9 00 32 02 65 02 24 02 00 01 C4 02 C4

MOT10

SDAT3 00 79 02 02 C4 01 C4 7D 02

SDAT2 00 79 02 02 C4 F0 01 C4 7D 02

SDAT1 00 79 02 02 C4 00 01 C4 7D 02

8B 02

APDAT TEMP1

CPI 00H JZ MOT7 XCHG CALL SDAT2 DCR C JMP MOT6 LDA PC81 MOV B,A RRC RRC RRC CC SDAT1 MOV A,B RRC RRC RRC JC MOT7 XCHG LXI H,GIRM1 MOV C,M MOV A,C CPI 00H JZ MOT10 XCHG CALL SDAT1 DCR C JMP MOT9 MVI A,00H STA PA81 STA PB81 POP PSW POP H POP B POP D RET MOV A,M CPI 00H CZ APDAT MOV A,M STA PB81 STA PA81 CALL TEMP1 INX H RET MOV A,M CPI 00H CZ APDAT MOV A,M STA PB81 ANI F0H STA PA81 CALL TEMP1 INX H RET MOV A,M CPI 00H CZ APDAT MOV A,M STA PB81 ANI 00H STA PA81 CALL TEMP1 INX H RET LXI H,TGIRO RET PUSH PSW PUSH D

_______________________________________ 201 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

027F 0282 0283 0284 0285 0288 0289 028A 028B 028C 028D 028E 028F

11 50 01 1B 7A B3 C2 82 02 D1 F1 C9 99 55 66 AA 00

TEM1

TGIRO

LXI D,0150H DCX D MOV A,D ORA E JNZ TEM1 POP D POP PSW RET DB 99H DB 55H DB 66H DB AAH DB 00H

425

426

427

428

429

430

431

432

0290 0294 0298 029C 02A0 02A4 02A5 02A9 02AD 02B1 02B5 02B9 02BA 02BE 02C2 02C6 02CA 02CE 02CF 02D3 02D7 02DB 02DF 02E3 02E4 02E8 02EC 02F0 02F4 02F8 02F9 02FD 0301 0305 0309 030D 030E 0312 0316 031A 031E 0322 0323 0327 032B 032F 0333 0337 0338 033C 0340

20 20 4E 4F 20 2E 50 41 20 33 30 2E 50 41 20 36 30 2E 50 41 20 39 30 2E 50 41 20 2D 2D 2E 50 41 20 33 30 2E 50 41 50 30 2D 2E 50 41 20 31 30 2E 50 41 20

20 20 49 20 20 55 44 50 30 2D 55 44 50 30 2D 55 44 50 30 2D 55 20 31 31 31 55 44 50 30 2D 55 44 35 2D 31 55 44 50 38 2D

20 20 43 20 20 4C 4F 30 2D 33 4C 4F 31 2D 36 4C 4F 32 2D 39 4C 50 32 32 32 4C 4F 34 2D 39 4C 4F 20 33 32 4C 4F 36 30 39

20 49 49 20 20 53 52 20 33 30 53 52 20 36 30 53 52 20 39 30 53 33 30 30 30 53 52 20 36 30 53 20 39 30 30 53 52 20 2D 30

;----------------------------------------;DEFINICION CADENAS CARCTERES ;----------------------------------------CADE1 DB ' INICIO .'

CADE2

DB

'PULSADOR P0 30-30-30.'

CADE3

DB

'PULSADOR P1 60-60-60.'

CADE4

DB

'PULSADOR P2 90-90-90.'

CADE5

DB

'PULSA P3 120-120-120.'

CADE6

DB

'PULSADOR P4 30-60-90.'

CADE7

DB

'PULSADO P5 90-30-120.'

CADE8

DB

'PULSADOR P6 180-0-90.'

55 4C 53 44 4F 52 50 37 20

CADE9

DB

'PULSADOR P7

INICIAL.'

_______________________________________ 202 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

0344 0348 034C 433 434 435 436

20 49 4E 49 43 49 41 4C 2E

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 CADE3 CADE7 ESCDR GIRM1 LIBRE MOT3 MOT7 MOTORES PB82 PULSAD0 PULSAD4 REES81 SDAT1 TEM1

0279 02BA 030E 0165 = 8200 0186 01DE 020E 0000 = B001 0082 00DA = C400 0265 0282

CAD1 CADE4 CADE8 ESCIR GIRM2 MOT1 MOT4 MOT8 PA81 PC81 PULSAD1 PULSAD5 REES82 SDAT2 TEMP1

= =

01B0 02CF 0323 0144 8201 01CC 01EC 021F C401 C403 0098 00F1 B003 0251 027D

CADE1 CADE5 CADE9 FIN GIRM3 MOT10 MOT5 MOT9 PA82 PC82 PULSAD2 PULSAD6 SALT1 SDAT3 TEMPOR

0290 02E4 0338 0135 = 8203 0232 01FB 0224 = B000 = B002 00AE 0108 0050 023F 0138

CADE2 CADE6 CADENA FINCAD LIB1 MOT2 MOT6 MOTOR PB81 PPILA PULSAD3 PULSAD7 SALT2 TE1 TGIRO

02A5 02F9 01A9 01C2 0192 01D9 0200 01C5 = C402 = C0FF 00C4 011F 0052 0139 028B

LINES ASSEMBLED :

436

ASSEMBLY ERRORS :

_______________________________________ 203 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

9.9 EJERCICIOS.

1.

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 ms baja y el giro sea levgiro. 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 N5".

2.

3.

4.

5.

_______________________________________ 204 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

10

PRCTICA DE CONTROL CON MICROPROCESADOR (II).

_______________________________________ 205 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

10. PRCTICAS DE CONTROL CON MICROPROCESADOR (II).

En este tema se desarrollarn el hardware y el software necesarios par llevar a cabo el control de 480 lmparas, por lo que tendremos que disear un equipo con al menos 480 salidas disponibles. Adems se establecern diversas secuencias de encendido que sern manejadas mediante el accionamiento de varios pulsadores dispuestos al efecto. En la FIG.10A puede verse el diagrama de bloques del total del sistema que pretendemos poner en funcionamiento.

FUENTE DE ALIMENTACION

SISTEMA BASICO DEL 8085 PPI 8255

DRIVERS DE CARGAS

480 CARGAS PULSADORES

FIG.10A

Como vemos, la fuente de alimentacin debe proporcionar todas las tensiones necesarias para el correcto funcionamiento de los dispositivos empleados. Nuestro sistema bsico, basado en el microprocesador 8085, ser el encargado de llevar el control deseado del proceso y para ello, emplear el perifrico programable PPI 8255, para transmitir los datos hacia las drivers de lmparas, que son los elementos finales de control de potencia. Para recibir las seales procedentes de los ocho pulsadores que emplearemos para ejecutar las diferentes secuencias de encendido y apagado, se usar un puerto de dicho perifrico. En los puntos o apartados que vienen a continuacin 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 lmparas. Se analizar la interconexin al sistema bsico del microprocesador. Se desarrollar el software de control que nos permitir utilizar el sistema para gobernar las lmparas deseadas.

_______________________________________ 206 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

10.1 INTRODUCCIN.

Necesitamos en primer lugar conocer de forma clara y precisa lo que deseamos hacer, cmo lo vamos a realizar y los medios de los que disponemos para llevarlo a cabo. Como sabemos, en este caso, deseamos controlar 480 lmparas (por tanto necesitamos disponer de 480 salidas) para realizar diversas secuencias de encendido y apagado, en funcin 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 algn pulsador accionado. Para preparar el control de las 480 salidas, necesitaramos 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 nmero excesivo de componentes perifricos para ser manejados por nuestro sistema bsico. Basndose en esto, pensaremos en construir una tarjeta driver que nos permita transmitir la informacin en serie desde unas unidades a otras, para despus sacar esa informacin 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.

SALIDAS (480)

BUS DATOS 8255 BUS CONTROL

PO1

PO2

PO3

PO60

BS1

BS2

BS3

BS60

PULSADORES FIG.101A

Como vemos, los datos proporcionados por el PPI 8255 son introducidos en el primer bloque de transmisin de datos en serie BS1, de ste pasan al segundo bloque BS2, de ste al tercero BS3 y as sucesivamente hasta el bloque de transmisin en serie nmero 60. Cada uno de estos bloques va conectado a un bloque de potencia que nos proporcionan 8 lneas de salida cada uno, consiguiendo as 480 lneas de control para las salidas. Como es lgico, todos estos componentes son alimentados por una fuente de tensin de +5V, salvo las lmparas a controlar que se alimentarn directamente de la tensin de red 220V de c.a. El perifrico programable PPI 8255 ira conectado a nuestro sistema bsico a travs del bus de datos y del bus de control como en ocasiones anteriores.

_______________________________________ 207 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

10.2 DRIVER DE TRANSMISIN DE DATOS EN SERIE.

Como podemos adivinar, la nueva tarjeta de transmisin de datos en serie, estar constituida por un nuevo elemento que deberemos introducir en nuestro sistema. Debemos elegir un componente que reciba y transmita 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 trata de un registro de desplazamiento de 8 bits que se presenta en un encapsulado dual in line de 20 patillas, segn se muestra en la FIG.102A.
74LS299 S0 Q1 Q2 G E C A A1 CLR GND 1 2 3 4 5 6 7 8 9 10 20 19 18 17 16 15 14 13 12 11 FIG.102A Vcc S1 SL H1 H F D B CLK SR

A continuacin se realiza una descripcin pormenorizada de cada una de sus terminales: Patilla 1. Efecta 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 tendramos seales en las salidas, aunque el registro seguira 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 seal 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 lgico ALTO permite el desplazamiento de datos. Cuando esta en estado BAJO se pone a cero el registro borrndose todos los datos contenidos en l. Patilla 10. Masa o comn de alimentacin. 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 posicin con cada flanco ascendente de la seal 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.

_______________________________________ 208 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Patilla 17. En esta patilla aparece la misma seal 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. Tensin de alimentacin de +5V.

En nuestro caso, realizaremos un desplazamiento a la derecha en serie, con salida en paralelo, controlada mediante la seal correspondiente. Segn este planteamiento, obtendremos el esquema de la FIG.102B. En la que podemos apreciar como el Dato a transferir se inyecta por la lnea SR (para desplazamiento hacia la derecha). La velocidad de transmisin depender de la frecuencia de la seal de Reloj, situada en la entrada CLK.

A1 SR CLK Q1 CLR

A B C D E F G H

74LS299

H1

Q2 S1 SL GND FIG.102B

S0

Vcc +5V

Cuando deseemos sacar hacia el exterior, los Datos que ya tenemos en el interior del registro, tendremos que suministrar un pulso (transicin de ALTO a BAJO o bien flanco descendente) para activar las salidas, se realiza esta accin en la lnea Q1. Si deseamos borrar el contenido de todos los registros, se inyecta un pulso a nivel BAJO en la lnea de borrado CLR. Como nosotros necesitamos conectar en serie varios circuitos integrados 74LS299, aprovechamos el terminal H1, en el que est presente la misma seal que en la salida H, para conectarlo a la entrada de datos del siguiente registro de desplazamiento. Adems sabemos que las seales de reloj, activacin de salidas y borrado (CLK, Q1 y CLR) tendrn que ser inyectadas en todos los 74LS299 que utilicemos. Esto quiere decir que tendremos que prever en esas lneas, el suministro de corriente preciso para poder atender toda la demanda en cada lnea. Para ello instalaremos en las lneas de control los respectivos buffers o amplificadores de corriente. Emplearemos para este propsito el circuito integrado de fabricacin CMOS, 4009, compuesto por seis puertas inversoras/buffers. En la FIG.102C puede apreciarse su distribucin 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.

Vcc S1 E1 S2 E2 S3 E3 GND

1 2 3 4 4009 5 6 7 8

16 15 14 13 12 11 10 9

Vdd S6 E6 S5 E5 S4 E4

FIG.102C

_______________________________________ 209 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Adems 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 fcilmente conectables a las salidas de los 74LS299. Teniendo en cuenta todo lo anterior, podemos afrontar el diseo de la tarjeta driver para controlar un elevado nmero de cargas, obteniendo el esquema de la FIG.102D. En ella podemos apreciar fundamentalmente que la entrada de datos se realiza a travs de la entrada SR del primer 74LS299, desplazndose dicha seal a travs de este integrado al ritmo impuesto por la seal de reloj. De la salida H1 del primer elemento, se lleva la seal 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 sern los elementos encargados de excitar el sistema de potencia para las cargas individuales. Las seales de reloj (CLK), de activacin 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. Tambin podemos darnos cuenta de que sern necesarias 10 tarjetas idnticas 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 lneas 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 nmero de componentes empleados en la construccin de estas 10 tarjetas drivers, tendremos que disponer una pequea fuente de alimentacin en cada tarjeta, constituida por un regulador 7805 y dos condensadores electrolticos conectados como filtros en la entrada y salida de dicho regulador (No ha sido representada en el esquema). La entrada de alimentacin a cada una de las tarjetas ser tomada de la alimentacin general una vez rectificada y filtrada.

SALIDAS HACIA LAS CIRCUITOS DE POTENCIA DE LAS CARGAS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 41 42 43 44 45 46 47 48

18 17 16 15 14 13 12 11 ULN 2803 1 2 3 4 5 6 7 8

18 17 16 15 14 13 12 11 ULN 2803 1 2 3 4 5 6 7 8

18 17 16 15 14 13 12 11 ULN 2803 1 2 3 4 5 6 7 8

7 13 6 14 5 15 4 16 11 17 74LS299 9 2 12

7 13 6 14 5 15 4 16 11 17 74LS299 9 2 12

7 13 6 14 5 15 4 16 11 17 74LS299 9 2 12 SALIDA DATOS

ENT. DATOS ENTRADAS CONTROL BORRADO ACTIVAR SALIDAS RELOJ FIG.102D

SALIDAS CONTROL BORRADO

RELOJ

Como es lgico, todos los registros de desplazamiento 74LS299 y las puertas inversoras llevarn conectado lo ms cerca posible de sus terminales de alimentacin un condensador de 100 nF que sirva como camino de desacoplo a masa de seales parsitas.

_______________________________________ 210 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

10.3 ACOPLAMIENTO DE VARIAS DRIVERS EN SERIE.


Como hemos visto anteriormente, la tarjeta driver que se ha diseado, esta compuesta por seis etapas desplazadoras (74LS299) que nos proporcionan 48 salidas de control, por tanto necesitaremos conectar entre s 10 etapas idnticas para obtener un total de 480 salidas controladas. La conexin de las tarjetas es sumamente sencilla, no tenemos ms que conectar las lneas de control de salida de la primera tarjeta a las lneas de control de entrada de la segunda tarjeta de igual denominacin. Las de la segunda con las de la tercera y as sucesivamente hasta tener conectadas las diez tarjetas. En la FIG.103A podemos apreciar esta interconexin.

48 SALIDAS

48 SALIDAS

48 SALIDAS

DATO RELOJ BORRADO ACTIVAR SALIDAS ETAPA 1

DATO RELOJ BORRADO ACTIVAR SALIDAS ETAPA 2

DATO RELOJ BORRADO ACTIVAR SALIDAS ETAPA 10

FIG.103A

10.4 INTERCONEXIN CON EL SISTEMA BSICO.

Para proceder a conectar nuestro sistema de tarjetas driver con el sistema microprocesador emplearemos como elemento de comunicacin el ya conocido PPI 8255. Como sabemos, necesitamos un puerto completo para detectar las seales procedentes de los pulsadores de funciones. Dispondremos a tal efecto el puerto B del PPI 8255 cuyas 8 lneas irn conectadas cada una de ellas a una red RC que nos servir para eliminar gran parte de los rebotes producidos en los contactos de cada pulsador. Este puerto B debe ser programado como entrada y siempre que en una lnea determinada encontremos un nivel lgico 0, estaremos en presencia de un pulsador accionado (el correspondiente a dicha lnea). Mientras no se accione ningn pulsador solo encontraremos seales lgicas de nivel 1. Adems necesitamos cuatro lneas a travs de las cuales enviemos los datos a sacar hacia las cargas finales y las seales de control que nos permitan efectuar dicho envo en las condiciones apropiadas. Hasta el momento hemos denominado estas lneas como DATOS, RELOJ, BORRADO y ACTIVAR SALIDAS. Se implementarn estas seales en el puerto A del PPI 8255, concretamente en las lneas PA0, PA1, PA2 y PA3. Dado que las lneas de control tienen que ser conectadas a las diez tarjetas drivers diseadas, se sitan en dichas salidas unos buffers inversores CMOS 4009 que nos proporcionen la ganancia de corriente suficiente para manejar todos los componentes de dichas tarjetas.

_______________________________________ 211 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Todo lo dicho puede apreciarse en la FIG.104A.

8255
P0 1 P1 P2 P3 P4 P5 P6 P7 RED RED RED RED RED RED RED RED PB0 2 PB1 PB2 PB3 PB4 PB5 PB6 PB7 19 20 4 21 22 23 24 25 1 PA3 2 PA2 3 PA1 PA0 18 2

+5V

10K 1 47 100 nF RED

DATO

RELOJ

BORRAR

ACTIVAR SALIDAS

FIG.104A

Finalmente decir que siendo las cargas a controlar lmparas de 100 w, 220 V de c.a., necesitaremos emplear para su control, los dispositivos semiconductores apropiados para esa exigencia de potencia y tensin y adems poder realizar una separacin efectiva entre los niveles de tensin de +5V en la circuitera lgica y los 220 V en la parte de potencia en c.a. Para este propsito empleamos el circuito mostrado en la FIG.104B y que ya ha sido descrito en el tema 8 de forma exhaustiva.

R2 56 +5V MOC3041

LAMPARA 220V

TXAL228

R4 100 C1 01uF 250V

R1 220

R3 1K2

CONTROL

FIG.104B

_______________________________________ 212 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Sealar adems que al tratarse de 480 lmparas de 100 W, estaremos realizando un control global de potencia prximo a 50 KW, por lo que es preciso equipar al conjunto con los sistemas de proteccin elctrica adecuados, siendo conveniente preparar diez lneas de alimentacin independientes en alterna (una por cada driver de control) con sus correspondientes protecciones trmicas. Es fundamental tambin establecer una toma de tierra efectiva que nos proteja de posibles contactos indirectos que pudieran producir prdidas irreparables. Los cables tanto de alimentacin como de proteccin a tierra sern de de las secciones adecuadas a las potencias transmitidas al objeto de evitar calentamientos en los conductores y elevadas cadas de tensin.

10.5 SOFTWARE DE CONTROL.

Definido el hardware completo del sistema procederemos a disear el software de control de nos permitir realizar el encendido de las 480 lmparas de carga. Para ello tendremos en primer lugar, que llevar a cabo un estudio detallado sobre cul ser el proceso de transmisin de informacin a travs de las tarjetas drivers y la forma de sacar dicha informacin hacia las cargas finales y en funcin de este estudio desarrollar el programa oportuno. Como sabemos, nuestro sistema de hardware est compuesto por varias tarjetas drivers que nos permitirn controlar las cargas externas a travs de los circuitos de potencia. Adems dispondremos de ocho pulsadores, cada uno de los cuales tendr asignada una funcin especfica que nos indicar el modo de tratamiento de las cargas. Con estas ideas bsicas podremos establecer el siguiente pseudocdigo inicial: NOMBRE: Lmparas FUNCION: Iluminacin PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Iniciar el sistema MIENTRAS pulsador no sea accionado Explorar pulsadores FIN DE MIENTRAS Identificar pulsador accionado Ejecutar funcin 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 condiciones y parmetros iniciales que necesitemos para arrancar el sistema. Entendemos como tales, la programacin adecuada del PPI 8255, el establecimiento del puntero de pila, un tratamiento adecuado de las interrupciones, y adems estableceremos en este caso un rea de RAM en el que almacenaremos los datos que se han de sacar hacia el exterior para controlar las cargas, es decir estableceremos una tabla de datos en RAM. Puesto que se trata de controlar 480 elementos y nuestro bus de datos trabaja con palabras de 8 bits, necesitaremos 60 posiciones de RAM (60 bytes) para almacenar dicha informacin, se establecer por tanto un puntero hacia esa tabla de datos en RAM. Tambin tendremos en cuenta que al arrancar nuestro sistema, si no efectuamos el control preciso, podra iniciarse arrancando un nmero indeterminado y aleatorio de cargas, por lo que es necesario un procedimiento que asegure la inactividad de todas las cargas en el arranque. En funcin de estas ideas globales podemos generar un pseudocdigo ms refinado para el proceso iniciar sistema que puede 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

_______________________________________ 213 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

El proceso "Explorar pulsadores" es muy sencillo y consiste nicamente en leer a travs del puerto B del PPI 8255 el estado lgico de los ocho pulsadores conectados. Si la palabra obtenida es 00H, ningn 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 informacin obtenida del puerto B, debe quedar disponible en algn registro del microprocesador, para ser posteriormente convenientemente interpretada y ejecutada la funcin o funciones oportunas. Tendramos el pseudocdigo siguiente: NOMBRE: Explorar FUNCION: Explorar pulsadores PRECONDICIONES: Ninguna POSTCONDICIONES: Informacin 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 exploracin. Sus funciones bsicas consisten en identificar el pulsador accionado y ordenar ejecutar el proceso correspondiente a dicho pulsador. Para ello no tendremos ms que ir explorando uno a uno los bits de la informacin contenida en el acumulador (Acc). El pseudocdigo referido a este proceso podra 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 lgico 1, automticamente obligamos al programa a ejecutar la funcin 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. Funcin pulsador 0: Al detectar accionado el pulsador P0, el sistema llevar a cabo un encendido y apagado de todas las lmparas 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

_______________________________________ 214 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

Tomar dato=00H Almacenar dato en tabla RAM Sacar al exterior datos de tabla RAM Temporizar Decrementar contador1 FIN de MIENTRAS Fin de Funcin

Funcin pulsador 1: Tras accionar P1 se iluminarn las lmparas impares permaneciendo apagadas las pares y al cabo de unos instantes se iluminarn 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 Funcin

Funcin pulsador 2: La orden a transmitir mediante P2 consistir en iluminar 4 lmparas mientras permanecen apagadas las 4 siguientes y continuar de este modo hasta las 480. Unos instantes ms tarde se apagarn 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 Funcin Funcin pulsador 3: Esta funcin consistir en iluminar 6 lmparas consecutivas mientras aparecen apagadas las 2 lmparas siguientes, procediendo de este modo hasta el total de lmparas. A continuacin se alterna el encendido y apagado de las mismas.

_______________________________________ 215 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 Funcin Funcin pulsador 4: Este pulsador iluminar las lmparas 60, 61, 62 y 63. El resto permanecern 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 Funcin

Funcin pulsador 5: Con este pulsador se iluminarn las lmparas 1, 240 y 480. El resto de lmparas permanecern 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 Funcin

Funcin pulsador 6: Al accionar este pulsador se encendern de modo alternado las lmparas de dos en dos, es decir, dos iluminadas, dos apagadas. NOMBRE: Pulsador6

_______________________________________ 216 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 Funcin

Funcin pulsador 7: Al accionar este ltimo pulsador apagaremos todas las lmparas. 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 Funcin 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, dejndolos dispuestos para ser finalmente extrados. 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 travs 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

_______________________________________ 217 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 temporizacin no es ms que una parte del programa que proporciona un determinado tiempo de espera. Para desarrollar esta tarea se acudir a la subrutina de temporizacin empleada en temas anteriores, por lo que no entraremos en ms detalles sobre la misma.

Con todo lo estudiado hasta ahora podemos confeccionar el programa en su forma de pseudocdigos, de modo que tengamos todo el conjunto un poco ms agrupado, quedando del modo siguiente: NOMBRE: Lmparas FUNCION: Iluminacin 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"

_______________________________________ 218 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 Funcin 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 Funcin 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 Funcin NOMBRE: Pulsador3 FUNCION: on 6 - off 2 PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna Iniciar contador1=10 MIENTRAS contador1>0

_______________________________________ 219 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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 Funcin 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 Funcin 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 Funcin 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 Funcin 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 Funcin NOMBRE: Almacenar FUNCION: Prepara datos en RAM PRECONDICIONES: Recibe dato a almacenar en Acc POSTCONDICIONES: Ninguna

_______________________________________ 220 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

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: Informacin 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

_______________________________________ 221 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

En funcin de todos los datos expuestos iniciamos el paso de nuestro programa en pseudocdigos 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 : OUTPUT FILENAME : LAMPARA7.ASM LAMPARA7.OBJ

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

;-----------------------------------------;NOMBRE: LAMPARA7 ;FUNCION: Iluminacion ;PRECONDICIONES: Ninguna ;POSTCONDICIONES : Ninguna ;-----------------------------------------;-----------------------------------------;PARAMETROS PARA EL PPI 8255 ;-----------------------------------------PA82 EQU B000H ;Puerto A del 8255 PB82 EQU B001H ;Puerto B del 8255 PC82 EQU B002H ;Puerto C del 8255 REES82 EQU B003H ;Reg Estado 8255 ;-----------------------------------------;-----------------------------------------;PARAMETROS PUNTERO DE PILA ;-----------------------------------------PPILA EQU 87FFH ;Puntero pila RAM ;-----------------------------------------;-----------------------------------------;PATAMETROS PUNTERO DE TABLA DATOS RAM ;-----------------------------------------PTABLA EQU 8000H ;Puntero Tabla dat ;-----------------------------------------LAMPARA7: DI LXI H,PPILA SPHL MVI A,82H STA REES82 MVI A,00H CALL ALMACEN CALL SACAR SALT1 CALL EXPLORAR MOV B,A ANI 01H CPI 01H JZ PULSADOR0 MOV A,B ANI 02H CPI 02H JZ PULSADOR1 MOV A,B ANI 04H CPI 04H JZ PULSADOR2 MOV A,B ANI 08H CPI 08H

00 01 02 03

B0 B0 B0 B0

FF 87

00 80

0000 0000 0001 0004 0005 0007 000A 000C 000F 0012 0015 0016 0018 001A 001D 001E 0020 0022 0025 0026 0028 002A 002D 002E 0030

F3 21 F9 3E 32 3E CD CD CD 47 E6 FE CA 78 E6 FE CA 78 E6 FE CA 78 E6 FE

FF 87 82 03 00 20 34 6F

B0 01 01 01

01 01 53 00 02 02 72 00 04 04 91 00 08 08

_______________________________________ 222 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

0032 0035 0036 0038 003A 003D 003E 0040 0042 0045 0046 0048 004A 004D 0050

CA 78 E6 FE CA 78 E6 FE CA 78 E6 FE CA C3 C3

B0 00 10 10 CF 00 20 20 DF 00 40 40 F9 00 04 01 12 00

FIN

JZ PULSADOR3 MOV A,B ANI 10H CPI 10H JZ PULSADOR4 MOV A,B ANI 20H CPI 20H JZ PULSADOR5 MOV A,B ANI 40H CPI 40H JZ PULSADOR6 JMP PULSADOR7 JMP SALT1

0053 0053 0055 0057 005A 005D 0060 0062 0065 0068 006B 006C 006F

0E 3E CD CD CD 3E CD CD CD 0D C2 C3

0A FF 20 34 0F 00 20 34 0F

01 01 01 01 01 01

55 00 50 00

;-----------------------------------------;NOMBRE: PULSADOR0 ;FUNCION: Todo-nada ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR0: MVI C,10 SALT2 MVI A,FFH CALL ALMACEN CALL SACAR CALL TEMPOR MVI A,00H CALL ALMACEN CALL SACAR CALL TEMPOR DCR C JNZ SALT2 JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR1 ;FUNCION: Par-impar ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR1: MVI C,10 SALT3 MVI A,AAH CALL ALMACEN CALL SACAR CALL TEMPOR MVI A,55H CALL ALMACEN CALL SACAR CALL TEMPOR DCR C JNZ SALT3 JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR2 ;FUNCION: ON4-OFF4 ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR2: MVI C,10 SALT4 MVI A,0FH CALL ALMACEN CALL SACAR CALL TEMPOR

0072 0072 0074 0076 0079 007C 007F 0081 0084 0087 008A 008B 008E

0E 3E CD CD CD 3E CD CD CD 0D C2 C3

0A AA 20 34 0F 55 20 34 0F

01 01 01 01 01 01

74 00 50 00

0091 0091 0093 0095 0098 009B

0E 3E CD CD CD

0A 0F 20 01 34 01 0F 01

_______________________________________ 223 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

009E 00A0 00A3 00A6 00A9 00AA 00AD

3E CD CD CD 0D C2 C3

F0 20 01 34 01 0F 01 93 00 50 00

MVI A,F0H CALL ALMACEN CALL SACAR CALL TEMPOR DCR C JNZ SALT4 JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR3 ;FUNCION: ON6-OFF2 ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR3: MVI C,10 SALT5 MVI A,FCH CALL ALMACEN CALL SACAR CALL TEMPOR MVI A,03H CALL ALMACEN CALL SACAR CALL TEMPOR DCR C JNZ SALT5 JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR4 ;FUNCION: En ON 60, 61, 62 y 63 ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR4: MVI A,00H CALL ALMACEN LXI H,PTABLA + 7 MVI M,78H CALL SACAR JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR5 ;FUNCION: En ON 1, 240 y 480 ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR5: MVI A,00H CALL ALMACEN LXI H,PTABLA MVI M,01H LXI H,PTABLA + 29 MVI M,80H LXI H,PTABLA + 59 MVI M,80H CALL SACAR JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR6 ;FUNCION: ON2-OFF2 ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR6: MVI A,CCH

00B0 00B0 00B2 00B4 00B7 00BA 00BD 00BF 00C2 00C5 00C8 00C9 00CC

0E 3E CD CD CD 3E CD CD CD 0D C2 C3

0A FC 20 34 0F 03 20 34 0F

01 01 01 01 01 01

B2 00 50 00

00CF 00CF 00D1 00D4 00D7 00D9 00DC

3E CD 21 36 CD C3

00 20 00 78 34 50

01 80 01 00

00DF 00DF 00E1 00E4 00E7 00E9 00EC 00EE 00F1 00F3 00F6

3E CD 21 36 21 36 21 36 CD C3

00 20 00 01 00 80 00 80 34 50

01 80 80 80 01 00

00F9 00F9

3E CC

_______________________________________ 224 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257

00FB 00FE 0101

CD 20 01 CD 34 01 C3 50 00

CALL ALMACEN CALL SACAR JMP FIN ;-----------------------------------------;NOMBRE: PULSADOR7 ;FUNCION: Todas apagadas ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------PULSADOR7: MVI A,00H CALL ALMACEN CALL SACAR JMP FIN ;-----------------------------------------;NOMBRE: TEMPOR ;FUNCION: Temporizacin ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Ninguna ;-----------------------------------------TEMPOR: PUSH PSW PUSH D LXI D,17FFH TE1 DCX D MOV A,D ORA E NOP NOP NOP JNZ TE1 POP D POP PSW RET ;-----------------------------------------;NOMBRE: ALMACEN ;FUNCION: Almacena datos en RAM ;PRECONDICIONES: Recibe dato en Acumulador ;POSTCONDICIONES: Ninguna ;-----------------------------------------ALMACEN: PUSH PSW PUSH B PUSH H MVI C,60 LXI H,PTABLA SALT6 CALL ALMACEN INX H DCR C JNZ SALT6 POP H POP B POP PSW RET SACAR: PUSH H PUSH B PUSH D PUSH PSW LXI H,PTABLA MVI C,60 SALT7 MOV A,M MVI B,8 SALT8 MOV D,A ANI 01H

0104 0104 0106 0109 010C

3E CD CD C3

00 20 01 34 01 50 00

010F 010F 0110 0111 0114 0115 0116 0117 0118 0119 011A 011D 011E 011F

F5 D5 11 FF 17 1B 7A B3 00 00 00 C2 14 01 D1 F1 C9

0120 0120 0121 0122 0123 0125 0128 012B 012C 012D 0130 0131 0132 0133 0134 0134 0135 0136 0137 0138 013B 013D 013E 0140 0141

F5 C5 E5 0E 21 CD 23 0D C2 E1 C1 F1 C9 E5 C5 D5 F5 21 0E 7E 06 57 E6

3C 00 80 20 01

28 01

00 80 3C 08 01

_______________________________________ 225 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298

0143 0146 0148 014B 014D 0150 0151 0152 0153 0156 0157 0158 015B 015D 0160 0162 0165 0167 016A 016B 016C 016D 016E

32 F6 32 E6 32 7A 1F 05 C2 23 0D C2 3E 32 F6 32 E6 32 F1 D1 C1 E1 C9

00 B0 02 00 B0 01 00 B0

40 01

3D 00 00 08 00 00 00

01 B0 B0 B0

STA ORI STA ANI STA MOV RAR DCR JNZ INX DCR JNZ MVI STA ORI STA ANI STA POP POP POP POP RET

PA82 02H PA82 01 PA82 A,D B SALT8 H C SALT7 A,00H PA82 08H PA82 00H PA82 PSW D B H

016F 016F 0171 0174 0175 0177 017A

3E 3A 2F E6 CA C9

00 01 B0 FF 71 01

;-----------------------------------------;NOMBRE: EXPLORAR ;FUNCION: Explorar pulsadores ;PRECONDICIONES: Ninguna ;POSTCONDICIONES: Dato en Acumulador ;-----------------------------------------EXPLORAR: MVI A,00H SALT9 LDA PB82 CMA ANI FFH JZ SALT9 RET

017B

END

************ ALMACEN 139 143 EXPLORAR FIN 204 LAMPARA7 PA82 = PB82 = PC82 = PPILA = PTABLA = PULSADOR0 PULSADOR1 PULSADOR2 PULSADOR3 PULSADOR4 PULSADOR5 PULSADOR6 PULSADOR7 REES82 = SACAR 140 144

C R O S S 0120 : 158 016F 0050 : : 36 172 239 38 88

R E F E R E N C E 79 190 83 202 99

T A B L E 103

************ 119 123

108

128

148

162

180

192

0000 : B000 : B001 : B002 : 87FF : 8000 : 0053 : 0072 : 0091 : 00B0 : 00CF : 00DF : 00F9 : 0104 : B003 : 0134 : 161

258 291 31 159 42 46 50 54 58 62 66 67 34 37 179

260

262

271

273

275

173

175

177

238

252

80 191

84 203

100

104

120

124

_______________________________________ 226 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

SALT1 SALT2 SALT3 SALT4 SALT5 SALT6 SALT7 SALT8 SALT9 TE1 TEMPOR 145

0012 0055 0074 0093 00B2 0128 013D 0140 0171 0114 010F

: : : : : : : : : : :

68 87 107 127 147 242 269 266 294 222 81

85

101

105

121

125

141

LINES ASSEMBLED :

298

ASSEMBLY ERRORS :

_______________________________________ 227 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

10.6 EJERCICIOS.

1. 2. 3.

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 funcin del pulsador 6 para que se produzca un proceso de intermitencia en las lmparas. Desarrolla otro procedimiento diferente para el pulsador 7 de modo que se realice la misma funcin. Modificar el programa en todo lo que resulte necesario para producir un encendido secuencial de todas las lmparas una a una, cuando accionemos el pulsador 3.

4. 5.

_______________________________________ 228 ___________________________________________

____________________ Curso 8085A ____________________________________________________________

_______________________________________ 229 ___________________________________________

S-ar putea să vă placă și