Unidad N 5N Control de Transferencia

Unidad N°5 Control de Transferencia 5.1.- Introducción Las dos unidades anteriores se han dedicado a las instrucciones de transferencia de datos y de

0 downloads 141 Views 700KB Size

Recommend Stories


Control Presupuestario y Análisis de Desviaciones. Unidad N. 5.2
Control Presupuestario y Análisis de Desviaciones Unidad N. 5.2 Presupuestos  Presupuesto Estático: se basa en el nivel de producción planificado

Unidad didáctica: "Control y Robótica"
Control y Robótica Autor: Antonio Bueno Unidad didáctica: "Control y Robótica" CURSO 3º ESO Autor: Antonio Bueno Unidad didáctica: "Control y Robó

Story Transcript

Unidad N°5 Control de Transferencia 5.1.- Introducción Las dos unidades anteriores se han dedicado a las instrucciones de transferencia de datos y de manejo de grupos de datos. La flexibilidad y versatilidad del concepto del programa almacenado, concepto básico de los procesadores, procede sin embargo principalmente de la aptitud de controlar la transferencia, o salto (ramificación), a una instrucción que no está en el orden secuencial. Esto se logra con instrucciones procedentes del grupo de control de transferencia. Todas estas instrucciones actúan sobre el contador de programa; como se demostrará, es posible ejecutar un bloque de instrucciones muchas veces, con dicho número de veces determinado o por medio de los datos del programa o algún flags.

1

5.2.- Instrucciones de Salto Una instrucción salto es usada para romper la ejecución secuencial normal de un programa y ramificarlo hacia una parte diferente del mismo. Esto se realiza cargando la dirección de la próxima instrucción en le registro del Contador de Programa, forzando así el procesador a coger el contenido de la nueva dirección para que sea la próxima instrucción. Por ejemplo: JMP 20B3 la cual en el código de máquina del 8085 se asemeja a la representación que se da en la figura.

2

La ejecución de esta instrucción provoca un salto incondicional a la celda de la memoria 20B3 para la próxima instrucción. Así, si esta instrucción estaba almacenada en la memoria comenzando en la dirección 2000, por ejemplo, después de la ejecución del contador de programa, en vez de contener la dirección 2003 (la de arranque de la instrucción secuencial inmediata siguiente), contendría la 20B3. Cuando se escribe un programa en lenguaje simbólico ensamblador no se conoce a menudo la dirección absoluta del destino de la instrucción hasta que el programa ha sido completamente desarrollado. Es por esta razón por la que la designación de la etiqueta se realiza por medio de una instrucción en lenguaje ensamblador. Se emplea un “label”, designación, rótulo, etiqueta, para indicar la dirección del destino de un instrucción salto y éste se traduce únicamente en su forma hexadecimal durante el proceso de traducción. Por ello, la instrucción anterior tomaría la forma: JMP LAB1 donde LAB1 es una etiqueta asociada con la instrucción almacenada en la celda de la memoria 20B3. Esto se detalla en la siguiente figura: 3

5.2.1.- Salto condicional La instrucción anterior es conocida como un salto incondicional, puesto que cuando se la desarrolla, se producirá siempre una bifurcación a la dirección contenida en la instrucción. La flexibilidad real de las instrucciones salto, sin embargo, se deriva de las instrucciones de bifurcación condicional, puesto que estas solamente se ramifican, saltan, a la próxima instrucción si se cumple una condición determinada, de otra manera, se ejecuta la próxima instrucción secuencial. 4

Las condiciones que se pueden especificar quedan determinadas por el estado de los distintos indicadores del registro de señalización del procesador. Las que se pueden especificar para el Intel 8085, por ejemplo, se muestran en la siguiente figura:

Una instrucción de bifurcación condicional típica es: JNZ LAB1 que se lee como: salte a LAB1 si el indicador de cero no está activado; y haría que la instrucción próxima se ejecutase a partir de la dirección asociada con el “label” LAB1, solamente si la señalización cero en el registro de señalización del procesador no fuese “set”, puesta, (Z=0), de otra manera se ejecutara la próxima instrucción secuencial. 5

5.3.- Diagramas de Flujo Antes de que se escriba cualquier programa que presuponga ramificación, es necesario planificar la secuencia lógica de los sucesos que han de ser realizados para lograr el objetivo deseado. Se puede usar un cierto número de técnicas, pero la mas útil para los programas ensamblador es la construcción de un diagrama de flujo. Ese es, sencillamente, un diagrama que indica la secuencia y las acciones necesarias en un programa y en los puntos del mismo donde la ramificación sea necesaria. Los símbolos usados en un diagrama de flujo se ilustran mejor por medio de algunos ejemplos. A continuación se presentan dos ejemplos 1.- Suma de los números del 1 al 10. 2.- Calculo del tiempo de retardo.

6

1.- Ejemplo de Programa Diagrama de Flujo Considere un programa sencillo para sumar o totalizar los diez primeros números 1 al 10. Un diagrama de flujo para este programa se muestra a continuación.

Admitamos que el registro C contiene el número que debe ser añadido al total acumulado y B el registro que contiene el total acumulado citado. 7

Las instrucciones dadas en lenguaje ensamblador para el programa de la figura que se detalla a continuación han siso desarrolladas usando el diagrama de flujo anterior. Las instrucciones CPI (comparar inmediato) y JNZ (salte si cero) se usan para determinar cuando la cuenta ha alcanzado 1110. Esta combinación se emplea frecuentemente para proporcionar una transferencia condicional del control.

8

Otra manera de ver si este diagrama de flujo funciona es efectuar una tabla en excel y ver sus valores. La suma de los valores del 1 al 10 da como resultado 5510 = 3716 Reg. A 0 2 3 4 5 6 7 8 9 10

Reg. B Reg. C MOV A,B 0 1 0 1 2 1 3 3 3 6 4 6 10 5 10 15 6 15 21 7 21 28 8 28 36 9 36 45 10 45

ADD C 1 3 6 10 15 21 28 36 45 55

MOV B,A 1 3 6 10 15 21 28 36 45 55

Reg. B 1 3 6 10 15 21 28 36 45 55

INC C 2 3 4 5 6 7 8 9 10 11

Reg. C MOV A,C Reg. A CPI 0B 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11

donde tenemos que: MOV A, B = Mover el contenido del Reg. B al Reg. A. ADD C = Sumar al Reg. A el Reg. C. MOV B, A = Mover el contenido del Reg. A al Reg. B. INR C = Incrementar en 1 el Reg. C. MOV A, C = Mover el contenido del Reg. C al Reg. A. CPI 0B = Comparar el Reg. C con 0B16 o 1110, si llego se termina.

9

2.- Una exigencia común cuando un microprocesador se une a otro equipo consiste en calcular un tiempo de retardo en el programa. Un controlador con microprocesador de las luces de tráfico de una carretera, por ejemplo, necesitaría calcular el tiempo de retardo para realizar adecuadamente la secuencia de los cambios de luz. Puesto que cada instrucción de máquina necesita una cantidad de tiempo especificada para ser ejecutada (típicamente unos pocos microsegundos) , es posible calcular el tiempo de retardo ejecutando un grupo de instrucciones un número preestablecido de veces. El tiempo de retardo obtenido es entonces proporcional al número de veces que se ejecute este grupo de instrucciones, o lazo. Admitamos que el retardo que se desea determinar y por lo tanto el lazo del contador quedará almacenado en el registro C. Un diagrama de flujo para este programa se da a continuación. Este diagrama se puede ahora traducir al lenguaje ensamblador. El tiempo de retardo básico queda determinado por medio de seis instrucciones de no-operación (NOP). Estas instrucciones no afectan a ninguno de los registros o memoria del procesador y el retardo se puede extender, aumentar, fácilmente mediante una sustitución por un cierto 10

número de instrucciones diferentes. Tenga en cuenta que las instrucciones “compare” y “salto condicional” son usadas de nuevo para determinar el control de transferencia.

11

5.4.- Subrutinas Es frecuente que en un programa se necesite desarrollar muchas veces una tarea secundaria. Es muy conveniente no tener que repetir la sección del código de máquina cada vez que se requiera usar los resultados de esta tarea secundaria. Es necesario, según esto, ser capaz de transferir el control de un programa a una sección de código usada a menudo o subrutina diseñada para desarrollar la tarea secundaria y después devolver el control a la secuencia principal de instrucciones. Las subrutinas no ahorran solamente memoria de programa por no ser necesario repetir una sección del programa cada vez que se necesita una sub-tarea, tarea secundaria, sino, que además proporcionan la oportunidad de estructurar un programa en secciones adecuadas para que puedan ser escritas y comprobadas independientemente y después, colectivamente, desarrollar la tarea completa.

12

Las dos instrucciones básicas previstas para “llamar”, call, a una surutina y regresar desde ella, son: CALL

nnnnnn

y RET

en donde nnnn es la representación convencional de los dos bytes en cuatro caracteres hex de los que parten las direcciones que hay en la subrutina. La instrucción de retorno o regreso, RETurn, es la última instrucción que ha de ser desarrollada en la subrutina y ésta devuelve el control al programa principal en la instrucción siguiente a la CALL. Esto se ilustra en el diagrama del programa de la memoria de la figura.

13

En lenguaje ensamblador es usual el indicar la dirección de comienzo de una subrutina por medio de una etiqueta (nombre simbólico) y ésta se traduce en el correspondiente valor absoluto de dirección en cuatro dígitos hex durante el proceso ensamblador. Cuando el microprocesador desarrolla una instrucción, CALL, a la subrutina, además de transferir control a la dirección de partida de la subrutina, debe “recordar” también la dirección ordinaria que tiene en el programa principal lo que permite que el control pueda volver desde el punto en que se encuentra cuando se ejecute la instrucción RET. Esto se realiza salvaguardando el contenido actual del registro del contador del programa (PC) en una pila, “stack”. Una pila es sencillamente una cola del tipo “última entrada, primera salida”, que se realiza como si fuese un grupo de celdillas sucesivas en el propio procesador o, más frecuentemente, en el sistema de la memoria. El puntero de pila es un registro, “stack pointer”, designado abreviadamente por (SP), que en el procesador siempre indica, puntualiza, la dirección de la localización, celda, etc, la cual se guarda ordinariamente en la entrada, en la parte superior de la pila y en consecuencia que cambia su contenido a cada llamada y retorno de subrutina. 14

Si la pila esta realizada en la memoria del sistema como en el caso del Intel 8085, el contenido inicial del puntero de pila es arbitrario y se suele inicializar para que apunte a un lugar no usado en el área de la memoria. La secuencia de las operaciones y los contenidos adecuados del puntero de pila y del contador del programa durante una llamada a una subrutina se ilustran a continuación. Se asume que el puntero de pila (SP), contiene actualmente 20C2 y como ya se ha demostrado su contenido se disminuye en dos cuando el contenido del contador del programa (PC), dos bytes, se guarda una vez que se ejecute la llamada de subrutina.

15

Cuando se ha ejecutado una instrucción RET, retorno, el proceso que se ha ilustrado es invertido. El contador de programa queda cargado (por el menos significativo de los bytes, el primero) con el contenido de la parte superior de la pila, el puntero de pila es incrementado dos veces y el control vuelve a la instrucción que seguía a llamada de la subrutina en el programa principal. También se dispone de instrucciones de llamada y retorno de las subrutinas condicionales, exactamente en la misma forma y con el mismo rango de condiciones que las instrucciones de salto condicional.

16

Ejemplo de programa con Subrutina El ejemplo Nº2 de diagrama de flujo fué un programa corto para calcular un retardo de tiempo. Esto se puede hacer adecuadamente en una subrutina situando una instrucción RET con el label o etiqueta TIME, tiempo, al final del programa. Con el objeto de hacer que sea útil esta instrucción en otras partes del programa en una aplicación imaginaria, es deseable situar el tiempo de retardo en el programa principal y no en la misma subrutina. De esta manera, la misma subrutina puede realizar una cierta variedad de tiempos de retardo. Para realizar esto se usa el registro C para pasar el parámetro necesario de tiempo de retardo a la subrutina (TIMDLY), “time delay”. Esto se representa en la siguiente figura. 17

5.5.- Operaciones con la pila La pila puede ser utilizada como un deposito temporal para los contenidos de los registros del procesador: Ejemplo: PUSH PSW (Push processor status word) - Guardar en la pila la PSW Esta almacena los 16 bits combinados que contienen el registro A y el de señalización en la parte superior de la pila. Existe una instrucción similar para cada par de registros BC, DE y HL. Un par de registros puede ser cargado con los contenidos de la parte superior de la pila por medio de una instrucción POP: Ejemplo: POP saque BC transfiere el contenido de la dirección dada por SP al registro C y el contenido de la dirección dada por SP + 1 al registro B. Las instrucciones PUSH, meta o empuje, son muy útiles, especialmente cuando se escriben subrutinas, puesto que si una subrutina utiliza, por ejemplo, los registros A, B y C para realizar su subtarea particular, los contenidos de estos registros serán muy diferentes una vez que la subrutina se haya ejecutado. Por ello es usual, cuando se escribe una 18

subrutina, salvaguardar primero los contenidos actuales de aquellos registros de los procesadores que son usados por la subrutina en la pila y entonces restaurar los contenidos salvaguardados antes de que se dé la instrucción de retorno. El programador puede por ello continuar utilizando los contenidos de todos los registros del procesador después de que haya sido realizada una subrutina, puesto que sabe que los contenidos previos no han sido modificados.

5.6.- Paso de parámetros La cuenta del lazo que se utiliza en la subrutina de retardo en el programa de ejemplo con subrutina es conocido con el nombre de parámetro (o argumento) de la subrutina. En general, se puede necesitar los parámetros para pasar datos, tanto a la subrutina para su procesamiento como para hacerla retroceder desde la subrutina al programa, después del procesamiento. El mecanismo usado en el ejemplo lo fue por medio de uno de los registros del procesador (el registro C) pero una solución más flexible para pasar los parámetros hacia y desde una subrutina se realiza por medio de un puntero del comienzo de la dirección de la memoria en el sistema donde se encuentra almacenados los parámetros. Con el Intel 8085, esto se complementa usualmente utilizando el par de registros HL. 19

Ejemplo de Paso de Parámetros El ejemplo de programa con subrutina visto anteriormente ha sido reescrito en la siguiente figura para ilustrar el uso del par de registros HL para pasar el parámetro de retardo y el uso de la pila en la salvaguardia de los contenidos de aquellos registros del procesador que son usados por la subrutina durante su ejecución. La celda de la memoria usada para almacenar el parámetro de retardo es la 2080.

20

5.7.- Subrutinas anidadas Es completamente legal dentro de una subrutina el poder llamar a otra subrutina y también el que ésta pueda llamar a otra. El mecanismo de última entrada, primera, salida de la pila asegura siempre que la dirección del retorno se encuentre en la parte superior de la pila cuando las instrucciones de RET, retorno, sean ejecutadas. De esta manera las subrutinas pueden ser anidadas hasta una profundidad que está solamente determinada por la disponibilidad que se tenga de la memoria de lectura/escritura para la pila, lo que se ilustra en la siguiente figura. 21

Ejemplo de programa con Subrutinas Anidadas El tiempo máximo de retardo producido por la subrutina en el ejemplo previo puede quedar muy ampliado haciendo que la instrucción de retardo básico necesite más tiempo para su ejecución. Una manera adecuada para hacerlo es remplazar las instrucciones NOP con una llamada a otra rutina similar de retardo. Esto se ilustra en la siguiente figura.

22

5.8.- Ejercicios 1.- Determine el contenido final del Registro A después de que se haya realizado el siguiente programa en lenguaje ensamblador. LAB1:

MVI DCR JNZ HALT

A, FF A LAB1 ( valor = 0 ; termina )

El registro A se carga con FF y se decrementa su valor en uno (1) y luego se compara el valor del registro A con 0 y si no es igual sigue funcionando el programa hasta que el valor llegue a cero (0).

2.- Determine el número de instrucciones que se ha realizado por medio del siguiente programa en lenguaje ensamblador. LAB2:

MVI INR JNC HALT

A, 00 A LAB2 ( valor rebosa ; termina )

El registro A se carga con 00 y se incrementa su valor en uno (1) hasta que la valor llegue hasta FF y entonces rebose hacia 00. El programa ejecutará el lazo 256 veces.

23

3.- Diseñe un diagrama de flujo y escriba en lenguaje ensamblador para sumar los números impares del 1 al 20. B = 00 C = 01 ↓ B→A C=C+A ↓ A→B C→A ↓ A = A + 02 A→C ↓

No

Comparar con 2110

Si ↓ FIN

24

El programa en lenguaje ensamblador se detalla a continuación: 1) 2) 3) LAB1: 4) 5)

MVI MVI MOV ADD MOV

B, 00 C, 01 A, B C B, A

6) 7) 8) 9) 10)

MOV ADI MOV CPI JNZ

A, C 02 C, A 15 LAB1

Una forma de comprobar bien el programa es ejecutarlo y ver si el resultado final se ajusta a lo solicitado en el problema.

Reg. A 0 3 5 7 9 11 13 15 17 19

Reg. B Reg. C MOV A,B ADD C MOV B,A MOV A,C Reg. B 0 1 0 1 1 1 1 1 3 1 4 4 3 4 4 5 4 9 9 5 9 9 7 9 16 16 7 16 16 9 16 25 25 9 25 25 11 25 36 36 11 36 36 13 36 49 49 13 49 49 15 49 64 64 15 64 64 17 64 81 81 17 81 81 19 81 100 100 19 100

ADI 02 Reg. A MOV C,A Reg. A 3 3 3 3 5 5 5 5 7 7 7 7 9 9 9 9 11 11 11 11 13 13 13 13 15 15 15 15 17 17 17 17 19 19 19 19 21 21 21 21

CPI 22 3 5 7 9 11 13 15 17 19 21

25

4.- Modifique el programa N°1 para formar una subrutina. Transfiera la cuenta numérica a la subrutina como un parámetro. La cuenta numérica terminal para la subrutina es transferida al registro C y el total resultante al registro B. Los números son sumados en la subrutina siguiente de orden inverso.

26

5.- Diseñe un diagrama de flujo y escriba un programa en lenguaje ensamblador para calcular por medio de una subrutina un tiempo de retardo, incrementando los contenidos del registro A en una unidad hasta que se alcance un límite que es pasado hacia la subrutina como un parámetro. A contiene CUENTA B contiene LIMITE

27

Unidad N°6 Entrada y Salida Digital 6.1.- Introducción Un microcomputador es, básicamente, un componente digital que puede examinar las señales digitales de entrada y realizar funciones, como consecuencia de estas entradas con el fin de proporcionar señales digitales de salida. Puesto que los dispositivos externos de la periferia del microcomputador producen o aceptan señales que no son de naturaleza digital necesariamente, se requiere a menudo , la circuitería de interface, acoplamiento y adaptación, para transformar estas señales externas de forma que sean adecuadas para el microcomputador. Esta unidad está relacionada con los mecanismos básicos usados en un sistema microprocesador para leer entradas digitales y producir salidas digitales. Las dos unidades siguientes describen algunos tipos de la circuitería adicional y los mecanismos de control que se necesitan para interfasar el microcomputador a las señales específicas externas de entrada y salida. 28

6.2.- Entrada y Salidas Digitales Una entrada digital simple para un microprocesador puede ser producida por un conmutador monopolar. La figura que se detalla a continuación muestra cómo un 0 lógico o nivel del voltaje puede ser representado por un microcomputador, dependiendo de la posición del conmutador. Voltaje del nivel 1 lógico

Entrada Lógica

1 o 0 lógico al microcomputador Voltaje del nivel 0 lógico

De la misma forma puede representarse, una salida lógica simple desde un microcomputador usando un diodo emisor de luz (led) light emiting diode, como se ilustra en la siguiente figura. led On para 1 lógico 1 o 0 lógico desde el microcomputador led Off para 0 lógico 29

Un indicador LED o un conmutador no pueden ser conectados directamente al bus del microcomputador, puesto que el microcomputador usa el bus para comunicarse con todos los dispositivos del sistema. Por ello la información que hay en el bus está cambiando continuamente cuando las instrucciones son preparadas desde la memoria y ejecutadas a continuación. La información que se obtiene para un indicador de salida debe, de esta forma, ser bloqueada (latched) por medio de un circuito adecuado. El procesador puede enviar entonces datos hacia la salida del dispositivo, determinado por las señales de control del bus y proporciona entonces una salida continua hasta que reciba nuevos datos. Igualmente, una entrada desde un conmutador debe quedar aislada de los datos que proceden del bus hasta que el microprocesador esté dispuesto para poder leer sus valores lógicos. Se dispone de una flexibilidad considerable si un sistema incorpora un dispositivo programable de entrada/salida (PI/O) que proporcione los puertos y aislamientos necesarios. Estos dispositivos son organizados usualmente en puertas o grupos de entradas y salidas, a menudo de 8 bits. Normalmente cada puerta puede ser programada para ser una 30

puerta de entrada o salida y a veces, un tipo mixto de entradas y salidas. En la Figura que se muestra a continuación se representa un diagrama esquemático de un microcomputador básico que incorpora un PI/O.

6.3.- Entrada/Salida por zona de memoria Un sistema microcomputador típico puede contener un cierto número de dispositivos de entrada/salida conectados todos al mismo bus. Para ello, es necesario que el microprocesador seleccione cada dispositivo separadamente. Hay básicamente, dos aproximaciones para la organización del direccionamiento asociado con la transferencia de datos de entrada/salida entre el bus de un microprocesador y un dispositivo de 31

entrada/salida. Con la entrada/salida por zona de memoria el espacio disponible de direcciones en la memoria del microprocesador queda dividido en dos áreas. Un área es un rango de direcciones asociado con el sistema de memoria (ROM y RAM) y la otra queda reservada para los dispositivos de entrada/salida. En la figura se muestra una disposición típica que ilustra esta aproximación.

Entrada/salida por zona de memoria

Con éste método cada operación de entrada o salida es similar a la de un acceso normal a la memoria y permite que se usen las mismas instrucciones para ambas transferencias; la de datos y la de entrada/salida. La dirección adecuada sale por el bus de direcciones y es reconocida bien por un dispositivo de memoria (ROM y RAM) o por 32

un dispositivo de E/S (PI/O) y los datos adecuados son transferidos por el bus de datos. Este enfoque tiene por ello la ventaja de que puede tener todos los modos de direccionamiento utilizados para el acceso a la memoria, disponibles también para las transferencias de datos de entrada/salida. La mayor desventaja es que se reduce el rango disponible de las direcciones de la memoria.

6.4.- Entrada/Salida programada El enfoque alternativo es la entrada/salida programada. Con este método, las transferencias de datos de entrada/salida son ejecutadas por medio de unas instrucciones especiales desarrolladas por el procesador, IN, OUT, para el Intel 8085. El microprocesador genera una señal de entrada/salida para informar a los dispositivos de entrada/salida (y la memoria) que la dirección en el bus de direcciones está destinada a un dispositivo determinado de entrada/salida. Esta forma significa que no ha reservado ningún espacio para los dispositivos de entrada/salida en la memoria del sistema. 33

Se ilustra un esquema típico en la figura:

Tenga en cuenta que aunque el Intel 8085 tiene en común con la mayoría de los microprocesadores, instrucciones de entrada/salida programadas, es posible también diseñar una entrada/salida por zona de memoria, basándose en el bus del microprocesador.

6.5.- Dispositivos programables de entrada/salida La entrada y salida digital se controla en la mayoría de los microprocesadores por medio de dispositivos programables de entrada/salida y normalmente se usan entradas/salidas programadas. Un dispositivo PI/O puede controlar un cierto número de líneas individuales de entrada y salida. Estas son agrupadas generalmente en 34

un número de puertas, comprendiendo cada una ocho líneas que pueden ser programadas para operar, bien sea como entradas o como salidas. Antes de que los datos puedan ser leídos desde o escritos hacia una puerta, es necesario primero programar el dispositivo en el tipo de configuración previsto en su aplicación. Esto se ejecuta escribiendo la adecuada información de mando en un(os) registro(s) especifico(s) direccionable(s) del dispositivo cuando el sistema está siendo inicializado. Después de recibir esta información, el dispositivo responderá de la manera especificada a más mandos, bien sea desde la circuitería externa o desde, el microprocesador. 6.5.1.- Control del apretón de manos (handshake) Para algunas aplicaciones es necesario sincronizar la transferencia de datos entre el PI/O y un dispositivo externo: en consecuencia, la mayoría de los PI/Os proporcionan líneas de control para esta función. La sincronización es usualmente efectuada por medio de un apretón de manos. En la Figura se ilustra una transferencia típica de secuencia. 35

Los datos son situados primero sobre las líneas de datos por el dispositivo de envío y la línea de “datos disponibles” (DAV), “data available”, se energiza. El dispositivo receptor detecta la energización de la línea DAV, acepta los datos y entonces responde con la energización de la línea de “datos aceptados” (DACC), “data accepted”. El dispositivo de envío interpreta la energización de la línea DACC como un reconocimiento de recepción de los datos por el receptor y por ello “repone” la línea DAV. Finalmente, el receptor detecta que la línea DAV ha sido borrada y a su vez energiza la línea DACC para permitir que se transmitan más datos. Este aspecto se muestra en el diagrama esquemático de un PI/O que se detalla a continuación. 36

En todos los dispositivos que están conectados al bus del microprocesador, RAMs, ROMs, PI/Os, hay una entrada energizadora de la entrada de la pastilla que es usada (en unión del plano de direcciones del sistema) para conseguir que solamente el dispositivo responda a cada transferencia de datos en el bus. Así, cuando está presente una dirección en el bus de direcciones del microprocesador, proporcionada por el PI/O, usualmente determinada por la presencia de un 1 lógico en una posición característica en los bits que forman la dirección, ésta es detectada y usada para gobernar la línea energizadora 37

de la entrada a la pastilla. Para seleccionar el registro adecuado en el mismo PI/O de puerta A o puerta B, se usan entonces dos bits adicionales a la dirección, usualmente el par menos significativo. La operación adecuada de entrada o salida es determinada por las líneas de lectura y escritura, respectivamente. 6.5.2.- Inicialización de puerta En algunos sistemas microprocesadores cada dispositivo programable de entrada/salida es un circuito integrado separado, pero en otros está incorporado en otro componente del sistema , procesador o memoria. En un sistema típico Intel 8085, por ejemplo, se incorporan tres puertas de entrada/salida en cada circuito RAM de memoria, en unión de un dispositivo de temporización (Intel 8155). Conceptualmente, sin embargo, las puertas de entrada/salida y el temporizador están completamente separados de la memoria RAM y se pueden por esto considerar independientes. La puerta adicional del Intel 8155 (puerta C) es de sólo 6 bits y puede ser usada bien como una tercera puerta de entrada/salida o para proporcionar señales de control para las puertas A y B, por ejemplo: 38

controles del apretón de manos o de interrupción. La información del comando necesaria para inicializar las puertas en el Intel 8155 es de un solo byte (8 bits) y en este byte cada bit tiene asignado algún significado especial como se representa en la siguiente figura. Este byte de comando indica que el temporizador y las puertas de entrada/salida han sido programadas conjuntamente. El byte de mando se transfiere al Intel 8155 usando un dirección específica y la instrucción de salida programada, OUT. Es decir, que la instrucción transfiere los contenidos del registro del procesador A, al dispositivo direccionado de entrada/salida. Por ejemplo, si después de decidir el mapa de direcciones PI/O ha de responder a direcciones 02(hex) en las ocho líneas menos significativas del bus de direcciones, la secuencia de instrucción: MVI A, 02 OUT 20 transfiere los datos de comando 02(hex) al registro de mando en el 8155 seleccionado, la significación de este comando se muestra en la figura que se detalla a continuación. 39

Esto configuraría que la puerta A fuese de 8 entradas, la puerta B de 8 salidas y la puerta C fuese una segunda puerta de entrada. El temporizador no quedaría afectado. Los datos son transferidos entre el procesador y estas puertas por medio del uso de una instrucción IN o OUT con su dirección especificada para cada puerta. Es decir, la instrucción: IN

dirección

40

transfiere los datos desde la puerta direccionada al registro A. La puerta o registro especificada queda determinada por los 8 bits menos significativos del bus de direcciones. La figura que se detalla a continuación representa un rango campo de direcciones típico.

41

Ejemplo Nº1 de programa Entrada y Salida Digital En el ejemplo de la figura se han asumido las mismas direcciones que las anteriores. La puerta A ha sido configurada como una puerta de entrada y la B como una puerta de salida. Los datos entran desde la puerta A y los mismos datos san por la puerta B. Este proceso se repite continuamente. De aquí que sí, por ejemplo, se conectará a la puerta A un grupo de ocho conmutadores y un grupo de 8 LEDs a la puerta B, los LEDs representarían continuamente los estados de los correspondientes ocho conmutadores.

42

Ejercicio Nº2 de programa Salida Digital Como un ejemplo adicional el programa de la figura inicializa las puertas A, B y C como puertas de salida y sale el número 24937 en forma BCD. Las tres puertas son usadas como se indica a continuación:

43

Ejercicio Nº3 de programa Control del apretón de manos (Handshake) Este ejemplo de programa se describe para ilustrar cómo las salidas digitales (y las entradas) pueden ser controladas por medio de un apretón de manos (handshake). Esto es particularmente útil, por ejemplo, cuando el dispositivo receptor no puede aceptar datos a la misma velocidad que puede producirlos el microcomputador o inversamente, si un dispositivo produce nuevos datos a una velocidad inferior de la que puede absorberlos el microprocesador. El programa usa las líneas de control de la puerta C en el apretón de manos, para que salgan 16 valores de una tabla de memoria, arrancando en la dirección 2000(hex), hacia un dispositivo externo conectado con la puerta A. La figura es un diagrama esquemático de su disposición.

44

Admitiendo que la puerta C ha sido inicializada para operar en el modo 3 (modo handshake), después de que los datos hayan salido hacia la puerta A, el bit 1 de la puerta C se dirigirá automáticamente al 1 lógico, indicando al dispositivo externo que hay disponibles nuevos datos (DAV). El dispositivo responderá entonces por la puesta a punto del bit 2 de la puerta C en 0 lógico (DACC), indicando que han sido leídos los datos que salen ordinariamente por la puerta A. Tenga en cuenta que para el Intel 8155 esta señal DACC es activa en el nivel bajo (es decir, en 0 lógico indica dato aceptado). Puesto que hacia la puerta A no debe salir un nuevo valor del microprocesador hasta que los valores previos hayan sido leídos, el programa debe ejecutar un lazo de espera hasta que se reciba la señal DACC. El 8155, por ello, contiene un registro separado de “status” que incluye un cierto número de bits de “status” asociados con las transferencias de datos a las puertas A y B. Como ejemplo el bit 1 de este registro es energizado cuando salen datos hacia la puerta A “buffer” de salida lleno y éste es borrado únicamente cuando la señal del DACC hacia la entrada para la puerta A toma el nivel bajo. 45

Diagrama de flujo del control del handshake

46

Así, después de que haya salido un valor de datos del microprocesador hacia la puerta A, el programa debe hacer un lazo hasta que el bit 1 del registro “status” alcance de nuevo el valor 0 antes de que salga un nuevo valor. El “status” que se necesita para el PI/O (dirección 20(hex)), es

Debería destacarse que los contenidos del registro de “status” son examinados también usando la dirección 20(hex).

47

Programa de control del “handshake”

48

6.6.- Ejercicios 1.- Escriba un programa en lenguaje ensamblador para inicializar las puertas A, B y C como puertas de entrada y lea un byte de datos desde cada una de las puertas.

49

2.- Escriba un programa en lenguaje ensamblador para inicializar primero la puerta A como una puerta de entrada y la B como una de salida y después para introducir datos desde la puerta A, complemente los datos y hágalos salir (los resultados) por la puerta B.

50

3.- Escriba un programa en lenguaje ensamblador para inicializar las puertas A y C como entradas y a B como de salida. El programa introduciría los datos en las puertas A y C, se sumaría los valores y los haría salir por la B.

51

FIN

52

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.