microprocesador 8085 (9) intel

37
Control con microprocesador (I) Control con microprocesador (I) Control con microprocesador (I) Control con microprocesador (I) Introducción Introducción Introducción Introducción El motor paso a paso El motor paso a paso El motor paso a paso El motor paso a paso Control de motores paso a paso Control de motores paso a paso Control de motores paso a paso Control de motores paso a paso La pantalla LCD La pantalla LCD La pantalla LCD La pantalla LCD Programación de la pantalla LCD Programación de la pantalla LCD Programación de la pantalla LCD Programación de la pantalla LCD Sistema de pulsadores Sistema de pulsadores Sistema de pulsadores Sistema de pulsadores Configuración final del Hardware Configuración final del Hardware Configuración final del Hardware Configuración final del Hardware Software de control Software de control Software de control Software de control Ejercicios Ejercicios Ejercicios Ejercicios

Upload: celestino-benitez

Post on 25-Mar-2016

261 views

Category:

Documents


11 download

DESCRIPTION

Diseño de hardware y software de control para motores paso a paso, pantallas LCD y un conjunto de pulsadores o teclado.

TRANSCRIPT

Control con microprocesador (I)Control con microprocesador (I)Control con microprocesador (I)Control con microprocesador (I) IntroducciónIntroducciónIntroducciónIntroducción El motor paso a pasoEl motor paso a pasoEl motor paso a pasoEl motor paso a paso Control de motores paso a pasoControl de motores paso a pasoControl de motores paso a pasoControl de motores paso a paso La pantalla LCDLa pantalla LCDLa pantalla LCDLa pantalla LCD Programación de la pantalla LCDProgramación de la pantalla LCDProgramación de la pantalla LCDProgramación de la pantalla LCD Sistema de pulsadoresSistema de pulsadoresSistema de pulsadoresSistema de pulsadores Configuración final del HardwareConfiguración final del HardwareConfiguración final del HardwareConfiguración final del Hardware Software de controlSoftware de controlSoftware de controlSoftware de control EjerciciosEjerciciosEjerciciosEjercicios

microprocesadores microprocesador electronica instrucciones set direcciones datos bus 8085 intel foto macro olympus zuiko potencia direccionamiento decodificador salto bucle logicas aritmeticas condicionales programa ensamblador

http://micros.myblog.es/ http://issuu.com/microprocesadores/ © 2010 Celestino Benítez Vázquez Todos los contenidos e imágenes publicados en la revista “microprocesadores” tienen los derechos reservados quedando prohibida la reproducción total o parcial de esta publicación sin el consentimiento expreso de su autor.

9. CONTROL CON MICROPROCESADOR (I).

Es fundamental, cuando se está estudiando un microprocesador, en este caso el 8085A, desarrollar algún ejercicio práctico que nos permita fijar conceptos y aclarar dudas, de forma tal que, los conceptos adquiridos vayan siendo cada vez más consistentes. Con este propósito se desarrolla este tema, en el que llevaremos a cabo un control de giro y posicionamiento de varios motores paso a paso, al tiempo que presentaremos en una pequeña pantalla LCD, el proceso de control seguido. Por tanto en los puntos que vienen a continuación se presentará: • Un diagrama de bloques general en el que podremos apreciar con claridad todo el sistema que

deseamos controlar y su interconexión con las tarjetas de control. • Los motores paso a paso, tanto en lo que respecta a su constitución interna y funcionamiento, como

en lo referente a los métodos de control. • Se realizará un estudio de las pantallas LCD y su método de programación. • Se presentarán los diferentes esquemas de las tarjetas de control necesarias. • Se mostrará de forma detallada la interconexión de los diferentes elementos con los Periféricos

Programables empleados. • Se mostrará el desarrollo del programa de forma detallada, en todas las fases que se consideran

necesarias, hasta completar el programa en lenguaje ensamblador.

9.1 INTRODUCCIÓN.

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 continuación 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 características y constitución estudiaremos posteriormente. Estos elementos van controlados por las correspondientes etapas drivers de potencia (DM1, DM2 y DM3) cuyo diseño llevaremos acabo, siendo su misión básica suministrar la corriente y tensión necesarias para adaptar las señales de control procedentes de los periféricos programables de interface, en este caso un 8255.

Además se dispondrá también de una pantalla LCD, en la que podremos ir introduciendo los datos

que consideremos oportunos para seguir el desarrollo del programa de forma gráfica. Las características y modo de programación de la pantalla se verán más adelante, así como el equipo de adaptación necesario, es decir, la driver de control (DLCD). Las señales de control y comunicación procederán de otro periférico 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. Ambos periféricos (8255 y 8155) irán conectados del modo ya comentado en temas anteriores a

nuestra tarjeta principal, basada en el microprocesador 8085 y cuya distribución de componentes de memoria ya conocemos.

Todos los elementos señalados están convenientemente alimentados mediante una fuente que

suministre tensiones de +5V y +12V perfectamente filtradas y estabilizadas. En la construcción del cableado se tendrá especial cuidado en separar las masas de alimentación de la parte lógica, de las masas

de alimentación de los motores, al objeto de evitar posibles interferencias de picos de corriente generados en las bobinas de los motores.

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 formarán los polos norte-sur de forma que se cree un campo magnético giratorio.

2. Una móvil, llamada “rotor” construida mediante un imán permanente, con el mismo número de pares

de polos, que el contenido en una sección de la bobina del estator; este conjunto va montado sobre un eje soportado por dos cojinetes que le permiten girar libremente.

Si por el medio que sea, conseguimos excitar el estator creando los polos N-S, y hacemos variar

dicha excitación de modo que el campo magnético formado efectúe un movimiento giratorio, la respuesta del rotor será seguir el movimiento de dicho campo, produciéndose de este modo el giro del motor.

Puede decirse por tanto que un motor paso a paso es un elemento que transforma impulsos

eléctricos en movimientos de giro controlados, ya que podremos hacer girar al motor en el sentido que deseemos y el número de vueltas y grados que necesitemos.

Según la construcción de las bobinas del estator, podemos diferenciar entre motores “bipolares”

y motores “unipolares”. Los primeros tienen las bobinas con un arrollamiento único, mientras que los segundos tienen las bobinas compuestas por dos arrollamientos cada una. En la FIG.92A podemos ver esta diferencia de forma gráfica. A igual número de espiras, el unipolar, deberá tener menor sección en el hilo de las bobinas, aumentando por tanto su resistencia y disminuyendo su par a bajas velocidades.

FUENTE DE ALIMENTACION

+5V +12V MASA MASA

POTENCIA

CPU 8255 8155

DM1 DM2 DM3

M1 M2 M3

DLCD

LCD

PULSADORES

FIG.91A

Un caso muy corriente es el motor con estator de 48 polos, en el que cada mitad contiene una

bobina toroidal de un arrollamiento para el funcionamiento bipolar y dos arrollamientos para el funcionamiento bipolar. Normalmente el eje del motor esta templado, rectificado y pulido. Sobre él se encuentra un imán permanente (rotor) altamente coercitivo de 24 polos, y se apoya sobre cojinetes de bronce endurecido que no necesitan mantenimiento.

FIG.92A

C D E F R C S T C U

Al número de grados que gira el rotor, cuando se efectúa un cambio de polaridad en las bobinas del estator, se le denomina “ángulo de paso” y puede ser muy variado en función de la aplicación y por tanto de la construcción del mismo. Además, existe la posibilidad (con el control electrónico apropiado) de conseguir una rotación de medio paso. En los motores que tratamos a continuación el paso completo es de 7’5º (medio paso 3’75º) y el número de pasos por vuelta completa es de 48. En cada paso puede producirse un error cifrado de 0’5º en adelanto o en retraso, sin embargo, este error no es acumulativo, quedando anulado en el transcurso de los 360 grados eléctricos. Deberemos considerar que cuando se efectúe medio giro, el motor desarrollará un par menor y ejecutará el giro con menor precisión. Los motores son fabricados para trabajar en un rango de frecuencias determinado por el fabricante y rebasado dicho rango, estaremos provocando una velocidad de giro del campo magnético creado por el estator muy elevada, no siendo el rotor capaz de alcanzar esa velocidad, provocando una pérdida de sincronización y quedando frenado en estado de vibración. Para nuestro tipo de motores, la máxima frecuencia admisible está alrededor de los 625 Hz.

Puesto que estamos hablando de dos tipos de motores paso a paso, el bipolar y el unipolar, tendremos también dos modos de excitación de sus devanados:

• Devanado bipolar. Tenemos dos bobinas de arrollamiento único y su excitación, es decir, el orden en

que se les aplica la tensión, hace circular una determinada intensidad en un sentido u otro, creando así los polos Norte-Sur y produciendo el giro del motor. La secuencia se expresa en la tabla siguiente. Si seguimos el orden 1, 2, 3, 4, estaremos efectuando un giro hacia la derecha. Para invertir el giro no tendremos más que seguir la secuencia inversa, es decir, 4, 3, 2, 1.

• Devanado bipolar. Tenemos dos bobinas con doble arrollamiento y la excitación precisa en las

bobinas se representa también en la misma tabla. Los valores 1 y 0 representan niveles lógicos. Con la secuencia 1, 2, 3, 4 se realiza un giro a la derecha y para cambiar el sentido de giro se efectúa la secuencia contraria.

1

CD EF R S T U

BIPOLAR UNIPOLAR

+ OFF 1 0 1 0

OFF + 1 0 0 1

- OFF 0 1 0 1

OFF - 0 1 1 0

+ OFF 1 0 1 0

TABLA SECUENCIAL

2

4

3

5

9.3 CONTROL DE MOTORES PASO A PASO.

El manejo operativo de un motor paso a paso, puede llevarse a cabo de dos modos básicos, bien mediante un control por tensión constante o bien mediante un control por corriente constante.

Vamos a mostrar el control por tensión constante de un motor bipolar, mediante un circuito

integrado diseñado específicamente para esta labor. Se trata del SAA 1042 (fabricado por Motorola) cuya distribución de patillas se muestra en la FIG.93A.

Fig.93A Seguidamente describiremos la función de cada una de ellas:

• Patilla 1: Salida de control de una bobina del motor en unión con la patilla 3. • Patilla 2: Sirve para proteger las salidas 1, 3, 14, y 16, amortiguando los transitorios que introducen

las bobinas del motor en los cambios de nivel de los pulsos de control. Es necesario conectar un diodo zener entre la patilla 2 y la 15 (zener de 3V3).

• Patilla 3: Salida de control de una bobina del motor en unión con la patilla 1. • Patilla 6: Terminal con dos funciones básicas. A través de una resistencia adapta la corriente del

motor y con un pulso a través de la resistencia se efectúa un set de las salidas de control. Si no se utiliza la función set, debe colocarse a masa a través de la resistencia.

• Patilla 7: Entrada de reloj, activa en el flanco positivo del pulso. Por cada pulso que llegue, el motor gira 7’5º (o bien 3’75º según este conectado el terminal 8).

• Patilla 8: (Full/Half step) Determina el ángulo de rotación del motor por cada pulso que llegue de reloj. En estado bajo, el motor gira un paso completo (7’5º).

• Patilla 9: Masa. • Patilla 10: (CW/CCW) Determina el sentido de giro. Cuando esta a nivel bajo, gira en sentido de las

agujas del reloj. Cuando esta a nivel alto, el giro es contrario al de las agujas del reloj. • Patilla 11: Alimentación de la parte lógica del SAA 1042. Puede variar de los +5V hasta los +20V.

Puede ser la misma tensión que la alimentación del motor (patilla 15) o bien puede alimentarse a +5V para ser acoplado a señales de nivel TTL.

• Patilla 14: Salida de control de una bobina del motor en unión con la patilla 16. • Patilla 15: Tensión a la que vamos a alimentar al motor. • Patilla 16: Salida de control de una bobina del motor en unión con la patilla 14.

Este componente contiene internamente tres bloques bien diferenciados, el primero compuesto a su vez por tres etapas de control (Clock, CW/CCW y Full/Half step), el segundo es el bloque lógico y el tercero la etapa de potencia compuesta por dos drivers (uno por bobina del motor).

El integrado SAA 1042 puede controlar motores con tensiones desde 6V hasta 12V y el SAA 1042A controla motores de 24V. Soportan una corriente de salida de 600 mA y poseen internamente diodos supresores de parásitos. Sus entradas son compatibles con familias lógicas como MOS, DTL y TTL.

Como puede observarse en la FIG.93A, posee dos aletas refrigeradoras, que posibilitan mayor disipación de calor interno. No obstante es conveniente añadir un pequeño refrigerador que aumente la

1 2 3 6 7 8

16 15 14 11 10 9

SAA 1042

capacidad de disipación total.

En la FIG.93B puede verse la conexión de las bobinas del motor al SAA 1042. Si conectamos una señal pulsante de reloj en la entrada de Clock, haremos girar el motor en el sentido que deseemos, según conectemos la entrada CW/CCW a +5V o a masa; por cada pulso recibido el motor girará 7’5º ó 3’75º según sea el estado de la entrada F/H. Como hemos visto hasta ahora, es el circuito integrado específico, el que en función de unos pulsos y señales de entrada, genera las señales o pulsos de control para las bobinas del motor. Sin embargo, esto también puede realizarse, mediante algún elemento de potencia final (transistor,...) controlado de forma apropiada mediante algún periférico con el que podamos generar la secuencia precisa de las señales de control. Para realizar esta tarea, elegimos el PPI 8155, a través del cual generaremos las señales de control que llevamos a los elementos de potencia que gobernarán las bobinas del motor. Como elemento de potencia elegimos el ya conocido ULN 2803, quedando la conexión definitiva como se muestra en la FIG.93C. Como puede apreciarse, estamos controlando un motor unipolar, al que según la tabla de secuencia de señales ya conocida, tendremos que inyectar las señales mostradas en la FIG.93D. En cada una de las salidas del ULN 2803 y en paralelo con cada una de las bobinas del motor, se colocan los diodos D1, D2, D3 y D4, para disminuir la influencia de los picos de corriente que se generan en las bobinas del motor en los cambios de polaridad.

+12V 3V3

OSCIL

+5V

56K 6

10

8

7

11 +5V 9

1

3

14

16

2 15

50

4W

50

4W

C

D

F

E

SAA 1042

FIG.93B

1 18

2 17

3 16

4 15

ULN 2803

D1

D2

D3

D4

+12V

FIG.93C

Las cuatro líneas de entrada al ULN 2803, serán las señales procedentes del PPI 8155. Este esquema de control tendremos que repetirlo para cada motor que vayamos a manejar. Como tenemos previsto mover tres motores necesitaremos un total de tres esquemas similares y todos ellos irán controlados por los puertos del PPI 8155. Por otro lado, para girar los motores a la posición correcta, necesitamos partir de una posición inicial u origen. Esto se consigue colocando solidariamente al eje del motor un "aspa" que en cada giro intercepte el haz de un fotodetector, generando de este modo una señal que nos indica que estamos en la posición inicial o de origen. El esquema correspondiente a este circuito de detección se muestra en la FIG.93E, en la que podemos ver como en condiciones normales, el diodo emisor estará emitiendo un haz que pone en saturación al fototransistor, apareciendo un 0 lógico en su colector. Esta señal se lleva a una entrada del ULN 2803 que en su salida presentará un 1 lógico indicándonos que el haz no está interrumpido. Cuando el aspa solidario al eje del motor se interpone entre el diodo emisor y el fototransistor, se interrumpe el haz por lo que el fototransistor pasa al corte apareciendo un 1 lógico en su colector y por tanto en la entrada del ULN 2803, que nos proporcionará un 0 lógico en su salida indicándonos que en ese instante hemos alcanzado la posición inicial. Lógicamente necesitaremos un circuito similar para cada motor.

1 2 3 4 5

FIG.93D

R

S

T

U

FIG.93E

R1 100

H22A1

R2 3K3

R3 10K

ULN 2803

5 14

+5V

SALIDA

9.4 LA PANTALLA LCD.

Otro de los puntos importantes en el desarrollo de este trabajo es la colocación de una pantalla o marcador donde se refleje de forma gráfica 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 diseñado 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 línea de 20 dígitos. Aunque si se deseara otra pantalla no tendríamos más que sustituir el hardware de control de la misma y modificar oportunamente el software.

Esta pantalla o módulo BT 12009 posee básicamente las siguientes características según el

fabricante:

• Una línea de 20 caracteres. • Un carácter se compone de 5x7 puntos. • Una CG ROM (generador de caracteres ROM) con 192 caracteres predefinidos. • Una CG RAM que permite definir ocho caracteres por el usuario. • Una RAM que almacena hasta 80 bytes. • Un registro de instrucciones IR. • Un registro de datos DR.

Esta pantalla proporcionada por BATRON, es de fácil conexión al bus de cualquier

microprocesador, en este caso al 8085A. A continuación se presenta el patillaje de este módulo:

• Patilla 1: Terminal de masa (GND). • Patilla 2: Terminal de alimentación a una tensión de +5V. • Patilla 3: No conectado. • Patilla 4: Terminal de selección (RS) de registros internos del módulo LCD. • Patilla 5: Terminal de lectura y escritura (R/W) del módulo LCD. • Patilla 6: Terminal de selección o habilitación del módulo (E). • Patilla 7: Línea del bus de datos (DB0). • Patilla 8: Línea del bus de datos (DB1). • Patilla 9: Línea del bus de datos (DB2). • Patilla 10: Línea del bus de datos (DB3). • Patilla 11: Línea del bus de datos (DB4). • Patilla 12: Línea del bus de datos (DB5). • Patilla 13: Línea del bus de datos (DB6). • Patilla 14: Línea del bus de datos (DB7).

Todas las funciones que se pueden programar en este módulo LCD, se controlan mediante las

señales E, RS y R/W escribiendo o leyendo los datos oportunos. Los niveles lógicos activos de todas las señales de control corresponden con el nivel ALTO (1 lógico).

En la siguiente tabla se muestran las operaciones que se realizan según las combinaciones de las

mismas:

E RS R/W OPERACION 1 0 0 Escribir una instrucción en el IR 1 0 1 Leer el IR (AC y el flag Busy) 1 1 0 Escribir en DR (Para DD RAM o CG RAM) 1 1 1 Leer el DR (De DD RAM o CG RAM)

La señal E es de habilitación del módulo y es activa con nivel lógico ALTO. La señal RS sirve para seleccionar los registros internos IR (RS=0) y DR (RS=1). La señal R/W se emplea para leer (R/W=1) o para escribir (R/W=0) un dato en el registro deseado.

El módulo, representado en el FIG.94A, posee además un registro denominado AC que apunta a

la dirección donde serán leídos o escritos los datos sobre la DD RAM (RAM de datos del display) y la CG RAM (generador de caracteres RAM definibles por el usuario). El AC se incrementa o decrementa automáticamente de acuerdo a cómo se programe el "modo entrada".

1

14

PANTALLA LCD

FIG.94A

En la FIG.94B, podemos apreciar la forma de conectar la pantalla LCD a nuestra CUP a través del PPI 8155. Las líneas PC0, PC1 y PC2 se utilizan para controlar la pantalla LCD, mientras que las líneas de datos de ésta son accedidas conectando PC0, PC1, ..., PC7 a DB0, DB1, ..., DB7, respectivamente. En todas y cada una de las líneas mencionadas debe conectarse una resistencia de 1K a +5V.

9.5 PROGRAMACIÓN DE LA PANTALLA LCD.

Las funciones que pueden programarse en la pantalla LCD según se desee leer o escribir

determinados datos son:

• Clear Display: Borra todo el display, sitúa el cursor en su posición inicial y pone el "modo entrada" en incrementar. Para conseguir esto, debe escribirse en IR la palabra 0000 0001.

• Volver al inicio: Coloca el cursor en la posición inicial (dirección 0). El contenido de la DD RAM no

se modifica. Tendremos que escribir 0000 001X.

• Modo entrada: Se establecen las condiciones en que los datos aparecerán en la pantalla. Esto se consigue escribiendo en IR la palabra que deseemos según se señala a continuación:

0000 01 I/D S. I/D = 0 Decremento automático del AC al escribir I/D = 1 Incremento automático del AC al escribir S = 0 El display no se desplaza al escribir un nuevo carácter S = 1 El display si se desplaza al escribir un nuevo carácter

• Control del display: Enciende o apaga el display completo, enciende o apaga el cursor y hace que el cursor parpadee o no, en función del código introducido según se indica a continuación:

0 0 0 0 1 D C B

3X1K

8X1K

PC2 E

PC1 R/W

PC0 RS

+5V

+5V

PA0 DB0 14

PA1 DB1 13

PA2 DB2 12

PA3 DB3 11

PA4 DB4 10

PA5 DB5 9

PA6 DB6 8

PA7 DB7 7

2 +5V

1 GND

LCD BT 12009

FIG.94B

B = 0 No hay parpadeo en el cursor rectangular B = 1 Si hay parpadeo en el cursor rectangular C = 0 El cursor no se visualiza C = 1 El cursor si se visualiza D = 0 El display se apaga D = 1 El display se enciende

• Desplazamiento de cursor o display: Mueve el cursor y desplaza el display sin cambiar el contenido de la DD RAM según el código siguiente:

0 0 0 1 S/C R/L X X S/C = 0 El deslizamiento se produce sobre el cursor S/C = 1 El deslizamiento se produce sobre todo el display R/L = 0 A izquierdas R/L = 1 A derechas

• Set: Permite conectar el módulo LCD a través de las 8 líneas del bus de datos o bien con 4 líneas solamente para ahorrar líneas de conexión caso de emplear una puerta de un PPI. Permite emplear una o dos líneas (en este caso una) y el número de puntos por carácter (en este caso 5x7).

0 0 1 DL N F X X DL = 0 Control con 4 bits DL = 1 Control con 8 bits N = 0 Se trabaja con una línea N = 1 Se trabaja con dos líneas F = 0 Se obtendrán 5x7 puntos F = 1 Se obtendrán 5x10 puntos

• Colocar dirección CG RAM: El registro AC queda cargado con la dirección de la CG RAM 0 1 CG5 CG4 CG3 CG2 CG1 CG0 CG5...CG0 = dirección de CG RAM (64 direcciones)

• Colocar dirección de DD RAM: El registro AC queda cargado con la dirección de la DD RAM. 1 DD6 DD5 DD4 DD3 DD2 DD1 DD0 DD6...DD0 = dirección de DD RAM (128 direcciones)

• Leer Busy y AC: El dato recibido indica el contenido de AC es decir, la dirección de CG RAM o de DD RAM según la que se haya seleccionado previamente. El bit número 7 representa el flag Busy que nos indica si el módulo esta ocupado (1) o si está libre para recibir nuevos datos (0).

BF AC6 AC5 AC4 AC3 AC2 AC1 AC0

• Escribir en CG RAM o en DD RAM: Se pueden escribir en CG RAM o en DD RAM los datos que se desee

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

• Lectura de CG RAM o de DD RAM: Se pueden leer los datos existentes en CG RAM y en DD RAM.

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

9.6 SISTEMA DE PULSADORES.

A efectos de poder controlar el desarrollo de la práctica, se colocarán 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 función determinada mediante el software que se diseñará y que nos permitirá ejecutar la práctica en el momento que nos interese. Los pulsadores serán conectados según se muestra en la FIG.96A. En cada línea de pulsador nos encontramos una red R-C para eliminar los picos que se producen durante los contactos mecánicos de los pulsadores.

El valor de estos componentes debe calcularse en función de las necesidades de la aplicación, teniendo en cuenta que cuanto mayor sea la constante de tiempo RC, más lenta será la respuesta del pulsador, pero a la vez, más segura será en cuanto a eliminación de rebotes. También podríamos actuar contra los rebotes en los pulsadores, diseñando una subrutina apropiada al caso. En condiciones de reposo, ningún pulsador accionado, los condensadores estarán cargados a través de las resistencias a un nivel de tensión de +5V, por lo que tendremos un nivel lógico 1 en las entradas del PPI 8155. Cuando accionamos uno de los pulsadores, el condensador correspondiente se descarga a masa a través de la resistencia de 47 ohmios, por lo que aparecerá un nivel lógico 0 en la entrada del PPI 8155 al que se lleva esta señal. Al soltar el pulsador el condensador comenzará a cargarse hasta alcanzar un nivel lógico 1. Las operaciones de carga y descarga se realizan según una función exponencial.

+5V 10K

47 100nF

RED

RED

P0 PB0

RED

P1 PB1

RED

P2 PB2

RED

P3 PB3

RED

P4 PB4

RED

P5 PB5

RED

P6 PB6

RED

P7 PB7

PPI 8155

FIG.96A

9.7 CONFIGURACIÓN 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 más sencillo de ver.

ULN2803

E0 1 18 S0

E1 2 17 S1

E2 3 16 S2

E3 4 15 S3

M1 D1

D2 D3 D4

ULN2803

E0 1 18 S0

E1 2 17 S1

E2 3 16 S2

E3 4 15 S3

M2 D5

D6 D7 D8

ULN2803

E0 1 18 S0

E1 2 17 S1

E2 3 16 S2

E3 4 15 S3

M3 D9

D10 D11 D12

+12V

21 PA0

22 PA1

23 PA2

24 PA3

25 PA4

26 PA5

27 PA6

28 PA7

29 PB0

30 PB1

31 PB2

32 PB3

D0 AD0 12

D1 AD1 13

D2 AD2 14

D3 AD3 15

D4 AD4 16

D5 AD5 17

D6 AD6 18

D7 AD7 19

8155 +5V

100 uF

Vcc 40

GND 20

ALE ALE 11

WR WR 10

RD RD 9

A10 IO/M 7

CS4 CS 8

CLK OUT TIMER IN 3

RESET RESET 4

OUT

100 uF

H22A1

DM1

R9 H22A1

DM2

R8 H22A1

DM3

R7

ULN2803

+5V

37 PC0 S0 E0

38 PC1 S1 E1

39 PC2 S2 E2

FIG.97A

Al estudiar los esquemas vemos que los tres motores y los detectores de posición de inicio son controlados por el PPI 8155, mientras que la pantalla LCD y los pulsadores de entrada se controlan mediante el 8255. Los devanados de los motores se gobiernan directamente por un ULN 2803 y en paralelo con aquellos se colocan diodos de protección (uno por cada bobina). El motor M1 es controlado con las líneas PA0, ..., PA3 del puerto A, el motor M2 mediante las líneas PA4, ..., PA7 del puerto A y el motor M3 con las líneas PB0, ..., PB3 del puerto B. Como el ULN2803 está constituido por puertas inversoras, cuando en un devanado determinado deseemos colocar un 0 lógico, tendremos que sacar un 1 lógico por la línea correspondiente del 8155. Los detectores de posición (fotodetectores) se conectan al puerto C a través de otro ULN2803, en cuyas entradas y salidas situaremos resistencias de polarización. El bus de datos del 8155 se conecta directamente al bus de datos del microprocesador de nuestra tarjeta principal y las distintas señales de control, del modo indicado en la FIG.97A. Este PPI se selecciona con la señal CS4 y el control de acceso a memoria o a entrada/salida se realiza mediante la línea de direcciones A10 del microprocesador.

LCD

8x1K

3x1K

8255

4 PA0 DB0 14

3 PA1 DB1 13

2 PA2 DB2 12

1 PA3 DB3 11

40 PA4 DB4 10

39 PA5 DB5 9

38 PA6 DB6 8

37 PA7 DB7 7

14 PC0 RS 4

15 PC1 R/W 6

16 PC2 E 5

+5V

+5V

2

1

26

7 GND

Vcc

FIG.97B

25 PB7 P7 RED

24 PB6 P6 RED

23 PB5 P5 RED

22 PB4 P4 RED

21 PB3 P3 RED

20 PB2 P2 RED

19 PB1 P1 RED

18 PB0 P0 RED

+5V 10K

47

10 nF

RED

A0 A0 9

A1 A1 8

WR WR 36

RD RD 5

CS3 CS 6

RESET RESET 35

OUT

100 nF

D0 D0 34

D1 D1 33

D2 D2 32

D3 D3 31

D4 D4 30

D5 D5 29

D6 D6 28

D7 D7 27

El PPI 8255 se conecta de modo similar a los buses del microprocesador 8085, realizando la selección de este dispositivo mediante la señal CS3. La pantalla LCD se controla mediante el puerto A y los tres bits menos significativos del puerto C con los que se realizarán las funciones de control necesarios para gobernar el sistema LCD. Es importante situar en todas las líneas de acceso a la pantalla programable, resistencias de polarización, como se ha realizado a través de los arrays.

Mediante el puerto B controlamos las señales de entrada del sistema de pulsadores. Según las conexiones realizadas, tendremos las siguientes direcciones de acceso a los

dispositivos de control: PPI 8155 Registro de estado C400H Puerto A C401H Puerto B C402H Puerto C C403H RAM 8155 C000H - C0FFH PPI 8255 Registro de estado B003H Puerto A B000H Puerto B B001H Puerto C B002H Estas direcciones se han obtenido por un procedimiento idéntico al realizado en los temas

anteriores, y puesto que se ha tenido cuidado en realizar las mismas conexiones, evidentemente, se obtienen las mismas direcciones que en aquellos casos.

9.8 SOFTWARE DE CONTROL.

Como es lógico, realizado ya el diseño 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 aproximación a lo que será nuestro programa, puede establecer el

siguiente pseudocódigo:

NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Iniciar el sistema Iniciar pantalla LCD Colocar motores en posición inicial MIENTRAS pulsador no sea accionado

Explorar pulsadores FIN de MIENTRAS

Ejecutar función pulsadores Volver a "Explorar pulsadores" Final del programa

Seguidamente se procede a realizar un paso más de refinamiento que nos determine de forma algo más precisa cada uno de los pasos antes mencionados, para finalmente llegar a desarrollar el proceso deseado. El proceso "Iniciar sistema" consistirá básicamente en desarrollar los pasos imprescindibles para que nuestro sistema entre en funcionamiento de una forma correcta y quede dispuesto para el trabajo. Los pasos a seguir son los habituales hasta el momento como, prohibir interrupciones, punterizar la pila y programar los PPI 8155 y PPI 8255. Según el hardware estudiado, los puertos A y B del 8155 deben trabajar como salidas mientras que el puerto C será programado como entrada. Emplearemos la RAM del 8155 como pila de nuestro sistema. En cuanto al PPI 8255 se programará el puerto B como entrada, y los puertos C y A como salidas, aunque deberemos tener en cuenta que en procedimiento de intercambio de información con la pantalla LCD, habrá que programar el puerto A como entrada para en determinadas ocasiones leer la información que dicho periférico nos envíe. "Iniciar la pantalla LCD" será un proceso que nos permite iniciar el control de la pantalla LCD en la que representaremos los caracteres ASCII deseados en cada momento y que nos permitirán seguir el proceso y evolución del programa desarrollado en cada instante. El proceso de inicialización del LCD consistirá esencialmente en programarlo como una línea de dígitos formado cada uno por 5x7 puntos, prever que la información no se desplace en la pantalla ni de izquierda a derecha ni de derecha a izquierda, que el cursor no parpadee, sea visible y el display se encienda. "Colocar motores en posición inicial" será un proceso por el cual se pongan los tres motores paso a paso en movimiento, hasta alcanzar la posición inicial de giro, momento en el que se pararán. La posición inicial de giro será la señalada por los fotodetectores de posición que como sabemos están conectados a las líneas PC0, PC1 y PC2 del PPI 8155. La posición en la que el aspa, que va unido solidariamente al eje del motor, intercepta el haz del fotodetector, la consideramos como origen o posición de giro de 0º. Lógicamente, si a partir de ese instante deseamos que un motor avance 30º, no tendremos más que proporcionar los pulsos adecuados a sus bobinas, teniendo en cuenta que en cada paso el motor avanza 7,5º.

El proceso "Explorar pulsadores" consistirá en leer el contenido del puerto B del PPI 8255, al que están conectados los pulsadores, si la palabra de 8 bits leída es FFH entenderemos que no hay ningún pulsador accionado, mientras que si algún bit de dicha palabra es 0 lógico, el pulsador correspondiente estará accionado teniendo entonces que proceder a realizar la función correspondiente a dicho pulsador. "Ejecutar función pulsadores" es el proceso a ejecutar una vez ha sido detectado un pulsador y consistirá básicamente en llevar a cabo el control que se desee de los motores y de la pantalla LCD. Una vez finalizado dicho control se pasará a una nueva exploración de los pulsadores. Las funciones asignadas a cada pulsador pueden ser las que nosotros deseemos, en este caso iremos asignándolas en pasos de refinamiento posteriores a medida que vayamos avanzando en la definición del programa. Tras este pequeño análisis obtendremos el siguiente pseudocódigo:

NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Prohibir interrupciones Punterizar la pila Programar el PPI 8155 Programar el PPI 8255 Programar pantalla LCD Colocar motores en origen (0º) Sacar a pantalla la palabra "INICIO" Iniciar pulsadores MIENTRAS pulsador no sea accionado

Leer pulsadores FIN de MIENTRAS

Ejecutar función pulsador accionado Volver a "Iniciar pulsadores" Final del programa

Pasaremos ahora a analizar más detenidamente y con mayor profundidad cada uno de los procesos que aún no aparecen suficientemente claros. El proceso que denominamos "Programar pantalla", como sabemos consiste en dejar programado el LCD para su funcionamiento. Para esto tendremos que cargar en sus registros internos los datos precisos que posteriormente nos permitan escribir y leer del LCD la información necesaria en cada momento. Básicamente el proceso a seguir consistirá en "escribir datos" en sus registros y "leer información" almacenada en los mismos. Por tanto se diseñaran las subrutinas necesarias para llevar a cabo estas operaciones. Basándonos en esto y conociendo los registros disponibles en el LCD se prepararan los siguientes procesos: 1. Subrutina para saber si el LCD esta disponible o libre para recibir un dato. La denominaremos

LIBRE. 2. Subrutina para escribir en el registro IR. La denominaremos ESCIR. 3. Subrutina para escribir en el registro DR. La denominaremos ESCDR. 4. Subrutina para escribir en el LCD una cadena de caracteres alfanuméricos. La denominaremos

CADENA. 5. Proceso de inicialización del LCD haciéndolo operativo.

Veremos ahora el desarrollo de cada una de estas subrutinas. NOMBRE: LIBRE FUNCION: Esperar hasta que LCD esté libre PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna. Se sale cuando LCD esté libre. Programar el 8255 para leer Preparar el control LCD (02H) MIENTRAS bit 7 del IR = 1 Leer el IR FIN de MIENTRAS Fin de subrutina

Como podemos apreciar esta subrutina consiste básicamente en un bucle durante el cual se lee el registro de instrucciones (IR) de la pantalla LCD. Cuando encontremos que el bit 7 de dicho registro tiene un 0 lógico, tendremos dispuesta la pantalla para recibir datos. Mientras el bit 7 del IR permanezca en estado lógico 1, el bucle se continúa ejecutando de forma indefinida, puesto que el LCD no está disponible.

NOMBRE: ESCIR FUNCION: Escribe dato en IR (Registro instrucciones) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el IR Final de subrutina

Esta subrutina nos permite escribir un dato en el registro de instrucciones (IR). Para ello, impone como condición indispensable disponer en el Acumulador del dato a cargar, antes de acceder a esta subrutina. Cuando finalice su trabajo no habrá efectuado ninguna modificación en los registros del microprocesador ni en la memoria del sistema.

NOMBRE: ESCDR FUNCION: Escribir datos en el DR (registro de datos) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el DR Final de subrutina

Permite escribir en el registro de datos (DR) de la pantalla LCD el dato que previamente a la llamada a esta subrutina tengamos almacenado en el Acumulador.

NOMBRE: CADENA FUNCION: Escribir una cadena de caracteres PRECONDICIONES: Dirección comienzo cadena en HL. Final de cadena marcado por el carácter "." POSTCONDICIONES: Cadena escrita en la DD RAM Apuntar a la DD RAM MIENTRAS no sea fin de cadena

Tomar dato de cadena Escribir dato en DD RAM Apuntar dato siguiente de cadena FIN de MIENTRAS Final de subrutina

Nos permite escribir o almacenar una cadena de caracteres en la memoria RAM de datos del display (DD RAM). Para acceder a esta subrutina tendremos que pasar en el par de registros HL la dirección de memoria en la que se encuentra el comienzo de la cadena a transmitir. El final de la cadena será detectado al encontrar el carácter "." momento en el que se dará por finalizada la escritura en el LCD. El proceso de Iniciar el LCD puede plantearse también coo subrutina, aunque nosotros lo desarrollaremos como una continuación del programa en sus comienzos. Este proceso será del modo siguiente:

Colocar control de 8 bits Temporizar más de 4,1 segundos Colocar control de 8 bits Temporizar más de 100 us Colocar control de 8 bits Esperar que LCD esté libre Poner modo entrada incrementar Display sin desplazamiento Poner display y cursor en ON Temporizar Final de subrutina

Podemos apreciar que se han desarrollado operaciones que se repiten. Esto es así porque es un dato proporcionado por el fabricante de la pantalla LCD que nos lo proporciona en sus hojas de características. Además vemos que necesitamos incorporar subrutinas de temporización. Nosotros diseñaremos una única temporización que, en función de los datos que le aportemos, nos ejecute la temporización deseada. Denominaremos esta subrutina TEMPOR y puede ser la siguiente:

NOMBRE: TEMPOR FUNCION: Proporciona un tiempo de espera PRECONDICIONES: Valor temporización en DE POSTCONDICIONES: Modifica DE Iniciar DE MIENTRAS DE>0

Esperar Decrementar contador (DE)

FIN de MIENTRAS Final de subrutina

El proceso "Colocar motores en origen (0º)", consiste como sabemos en arrancar los motores y hacer que se paren en la posición de inicio que nosotros consideraremos como de giro de 0º. (Posición marcada por el aspa). Tendremos por tanto que diseñar una subrutina que, en función de unos datos de entrada (que nos indiquen la posición en que deben parar los motores) hagan girar dichos elementos hasta la posición especificada. Denominaremos a esta subrutina GIRAR y puede ser del modo siguiente: NOMBRE: GIRAR FUNCION: Gira motores hasta posición adecuada PRECONDICIONES: Valor posición motores POSTCONDICIONES: Ninguna Preparar condiciones iniciales Leer aspas DM1, DM2 y DM3 MIENTRAS DM1=1 Sacar datos giro a motores M1, M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M1 MIENTRAS posición M1>0 Sacar datos giro a motores M1, M2 y M3 Decrementar posición M1 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM2=1 Sacar datos giro a motores M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M2

MIENTRAS posición M2>0 Sacar datos giro a motores M2 y M3 Decrementar posición M2 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM3=1 Sacar datos giro a motores M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M3 MIENTRAS posición M3>0 Sacar datos giro a motores M3 Decrementar posición M3 FIN de MIENTRAS FIN de subrutina

Vemos que el proceso de posicionamiento de los tres motores consiste en hacerlos girar al mismo tiempo hasta encontrar la posición deseada del motor M1, a continuación encontrar la posición deseada para M2 y finalmente, encontrar la posición del motor M3. El proceso "leer aspas" consistirá en efectuar una lectura de las señales presentes en los fotodetectores DM1, DM2 y DM3 que están conectados al puerto C del PPI 8155 a través de un ULN 2803.

Pasamos ahora a definir cada una de las ocho funciones que deseamos desarrollar con el accionamiento de los ocho pulsadores que tenemos conectados en el puerto B del PPI 8255.

Pulsador P0. Los motores girarán hasta situarse los tres a 30º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P0 - 30 - 30 - 30".

Pulsador P1. Los motores girarán hasta situarse los tres a 60º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P1 - 60 - 60 - 60".

Pulsador P2. Los motores girarán hasta situarse los tres a 90º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P2 - 90 - 90 - 90".

Pulsador P3. Los motores girarán hasta situarse los tres a 120 de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P3 - 120 - 120 - 120".

Pulsador P4. Los motores girarán hasta situarse M1 a 30º, M2 a 60º y M3 a 90º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P4 - 30 - 60 - 90".

Pulsador P5. Los motores girarán hasta situarse M1 a 90º, M2 a 30º y M3 a 120º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P5 - 90 - 30 - 120".

Pulsador P6. Los motores girarán hasta situarse M1 a 180º, M2 a 0º y M3 a 90º de su posición de arranque. En la pantalla LCD aparecerá la expresión "PULSADOR P6 - 180 - 0 - 90".

Pulsador P7. Los motores girarán hasta situarse los tres a 0º de su posición de arranque, es decir, se colocaran en la posición inicial. En la pantalla LCD aparecerá la expresión "PULSADOR P7 - POSICION INICIAL".

Se reunirá ahora todas las subrutinas expuestas hasta el momento para tener una idea más compacta de todas las tareas a desarrollar:

NOMBRE: MOTORES FUNCION: Control motores p.a p. PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna

Prohibir interrupciones Punterizar la pila Programar el PPI 8155 Programar el PPI 8255 Colocar control de 8 bits Temporizar más de 4,1 segundos Colocar control de 8 bits

Temporizar más de 100 us Colocar control de 8 bits Esperar que LCD esté libre Poner modo entrada incrementar Display sin desplazamiento Poner display y cursor en ON Temporizar Colocar motores en origen (0º) Sacar a pantalla la palabra "INICIO" Iniciar pulsadores MIENTRAS pulsador no sea accionado

Leer pulsadores FIN de MIENTRAS

Ejecutar función pulsador accionado Volver a "Iniciar pulsadores" Final del programa

NOMBRE: LIBRE FUNCION: Esperar hasta que LCD esté libre PRECONDICIONES: Ninguna POSTCONDICIONES: Ninguna. Se sale cuando LCD esté libre. Programar el 8255 para leer Preparar el control LCD (02H) MIENTRAS bit 7 del IR = 1

Leer el IR FIN de MIENTRAS Fin de subrutina

NOMBRE: ESCIR FUNCION: Escribe dato en IR (Registro instrucciones) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna

Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el IR Final de subrutina

NOMBRE: ESCDR FUNCION: Escribir datos en el DR (registro de datos) PRECONDICIONES: Dato en Acumulador POSTCONDICIONES: Ninguna

Esperar que LCD esté libre Programar 8255 para escribir Preparar control LCD Escribir dato en el DR Final de subrutina

NOMBRE: CADENA FUNCION: Escribir una cadena de caracteres PRECONDICIONES: Dirección comienzo cadena en HL.

Final de cadena marcado por el carácter "." POSTCONDICIONES: Cadena escrita en la DD RAM

Apuntar a la DD RAM MIENTRAS no sea fin de cadena

Tomar dato de cadena Escribir dato en DD RAM Apuntar dato siguiente de cadena

FIN de MIENTRAS Final de subrutina

NOMBRE: TEMPOR FUNCION: Proporciona un tiempo de espera PRECONDICIONES: Valor temporización en DE POSTCONDICIONES: Modifica DE Iniciar DE MIENTRAS DE>0

Esperar Decrementar contador (DE)

FIN de MIENTRAS Final de subrutina NOMBRE: GIRAR FUNCION: Gira motores hasta posición adecuada PRECONDICIONES: Valor posición motores POSTCONDICIONES: Ninguna Preparar condiciones iniciales Leer aspas DM1, DM2 y DM3 MIENTRAS DM1=1 Sacar datos giro a motores M1, M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M1 MIENTRAS posición M1>0 Sacar datos giro a motores M1, M2 y M3 Decrementar posición M1 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM2=1 Sacar datos giro a motores M2 y M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M2 MIENTRAS posición M2>0 Sacar datos giro a motores M2 y M3 Decrementar posición M2 FIN de MIENTRAS Leer aspas DM1, DM2 y DM3 MIENTRAS DM3=1 Sacar datos giro a motores M3 Leer aspas DM1, DM2, DM3 FIN de MIENTRAS Apuntar a posición de M3 MIENTRAS posición M3>0 Sacar datos giro a motores M3 Decrementar posición M3 FIN de MIENTRAS FIN de subrutina

Con todos estos datos podemos pasar a desarrollar el programa ensamblador equivalente a nuestro pseudocódigo. El lector puede desarrollar aún más los diferentes procesos señalados en el pseudocódigo si necesita tener determinadas cuestiones más claras. 2500 A.D. 8085 CROSS ASSEMBLER - VERSION 3.41a ------------------------------------- ------------- INPUT FILENAME : MOTORES.A SM OUTPUT FILENAME : MOTORES.O BJ 1 ;------------------- ----------------------- 2 ;NOMBRE : MOTORES 3 ;FUNCION : CONTROL M OTORES PAP Y LCD 4 ;PRECONDICION : NING UNA 5 ;POSTCONDICION : NIN GUNA 6 ;------------------- ----------------------- 7

8 ;---------------- -------------------------- 9 ;PARAMETROS PPI 8155

10 ;------------------- ----------------------- 11 01 C4 PA81 EQU C401 H 12 02 C4 PB81 EQU C402 H 13 03 C4 PC81 EQU C403 H 14 00 C4 REES81 EQU C400 H 15 FF C0 PPILA EQU C0FF H 16 ;------------------- ----------------------- 17 18 ;------------------- ----------------------- 19 ;PARAMETROS PPI 8255 20 ;------------------- ----------------------- 21 00 B0 PA82 EQU B000 H 22 01 B0 PB82 EQU B001 H 23 02 B0 PC82 EQU B002 H 24 03 B0 REES82 EQU B003 H 25 ;------------------- ----------------------- 26 27 ;------------------- ----------------------- 28 ;PARAMETROS GRADOS G IRO MOTORES 29 ;------------------- ----------------------- 30 00 82 GIRM1 EQU 8200 H 31 01 82 GIRM2 EQU 8201 H 32 03 82 GIRM3 EQU 8203 H

33 ;------------------- ----------------------- 34 35 0000 MOTORES: 36 0000 F3 DI 37 0001 21 FF C0 LXI H,PPILA 38 0004 F9 SPHL 39 0005 3E 03 MVI A,03H 40 0007 32 00 C4 STA REES81 41 000A 3E 82 MVI A,82H 42 000C 32 03 B0 STA REES82 43 000F 3E 30 MVI A,30H 44 0011 CD 44 01 CALL ESCIR 45 0014 11 FF 2F LXI D,2FFFH 46 0017 CD 38 01 CALL TEMPOR 47 001A 3E 30 MVI A,30H 48 001C CD 44 01 CALL ESCIR 49 001F 11 FF 0F LXI D,0FFFH 50 0022 CD 38 01 CALL TEMPOR 51 0025 3E 30 MVI A,30H 52 0027 CD 44 01 CALL ESCIR 53 002A CD 86 01 CALL LIBRE 54 002D 3E 06 MVI A,06H 55 002F CD 44 01 CALL ESCIR 56 0032 3E 0E MVI A,0EH 57 0034 CD 44 01 CALL ESCIR 58 0037 11 FF 0F LXI D,0FFFH 59 003A CD 38 01 CALL TEMPOR 60 003D 3E 00 MVI A,00H 61 003F 21 00 82 LXI H,GIRM1 62 0042 77 MOV M,A 63 0043 23 INX H 64 0044 77 MOV M,A 65 0045 23 INX H 66 0046 77 MOV M,A 67 0047 CD C5 01 CALL MOTOR 68 004A 21 90 02 LXI H,CADE1 69 004D CD A9 01 CALL CADENA 70 0050 3E FF SALT1 MVI A,FFH 71 0052 3A 01 B0 SALT2 LDA PB82 72 0055 47 MOV B,A 73 0056 FE FF CPI FFH 74 0058 CA 52 00 JZ SALT2 75 005B 78 MOV A,B 76 005C FE FE CPI FEH 77 005E CA 82 00 JZ PULSAD0 78 0061 FE FD CPI FDH 79 0063 CA 98 00 JZ PULSAD1 80 0066 FE FB CPI FBH 81 0068 CA AE 00 JZ PULSAD2 82 006B FE F7 CPI F7H 83 006D CA C4 00 JZ PULSAD3 84 0070 FE EF CPI EFH 85 0072 CA DA 00 JZ PULSAD4 86 0075 FE DF CPI DFH 87 0077 CA F1 00 JZ PULSAD5 88 007A FE BF CPI BFH 89 007C CA 08 01 JZ PULSAD6 90 007F C3 1F 01 JMP PULSAD7 91 0082 3E 11 PULSAD0 MVI A,17 92 0084 21 00 82 LXI H,GIRM1 93 0087 77 MOV M,A 94 0088 23 INX H 95 0089 77 MOV M,A 96 008A 23 INX H 97 008B 77 MOV M,A 98 008C CD C5 01 CALL MOTOR 99 008F 21 A5 02 LXI H,CADE2 100 0092 CD A9 01 CALL CADENA

101 0095 C3 35 01 JMP FIN 102 0098 3E 22 PULSAD1 MVI A,34 103 009A 21 00 82 LXI H,GIRM1 104 009D 77 MOV M,A 105 009E 23 INX H 106 009F 77 MOV M,A 107 00A0 23 INX H 108 00A1 77 MOV M,A 109 00A2 CD C5 01 CALL MOTOR 110 00A5 21 BA 02 LXI H,CADE3 111 00A8 CD A9 01 CALL CADENA 112 00AB C3 35 01 JMP FIN 113 00AE 3E 33 PULSAD2 MVI A,51 114 00B0 21 00 82 LXI H,GIRM1 115 00B3 77 MOV M,A 116 00B4 23 INX H 117 00B5 77 MOV M,A 118 00B6 23 INX H 119 00B7 77 MOV M,A 120 00B8 CD C5 01 CALL MOTOR 121 00BB 21 CF 02 LXI H,CADE4 122 00BE CD A9 01 CALL CADENA 123 00C1 C3 35 01 JMP FIN 124 00C4 3E 44 PULSAD3 MVI A,68 125 00C6 21 00 82 LXI H,GIRM1 126 00C9 77 MOV M,A 127 00CA 23 INX H 128 00CB 77 MOV M,A 129 00CC 23 INX H 130 00CD 77 MOV M,A 131 00CE CD C5 01 CALL MOTOR 132 00D1 21 E4 02 LXI H,CADE5 133 00D4 CD A9 01 CALL CADENA 134 00D7 C3 35 01 JMP FIN 135 00DA 21 00 82 PULSAD4 LXI H,GIRM1 136 00DD 36 11 MVI M,17 137 00DF 23 INX H 138 00E0 36 22 MVI M,34 139 00E2 23 INX H 140 00E3 36 33 MVI M,51 141 00E5 CD C5 01 CALL MOTOR 142 00E8 21 F9 02 LXI H,CADE6 143 00EB CD A9 01 CALL CADENA 144 00EE C3 35 01 JMP FIN 145 00F1 21 00 82 PULSAD5 LXI H,GIRM1 146 00F4 36 33 MVI M,51 147 00F6 23 INX H 148 00F7 36 11 MVI M,17 149 00F9 23 INX H 150 00FA 36 44 MVI M,68 151 00FC CD C5 01 CALL MOTOR 152 00FF 21 0E 03 LXI H,CADE7 153 0102 CD A9 01 CALL CADENA 154 0105 C3 35 01 JMP FIN 155 0108 21 00 82 PULSAD6 LXI H,GIRM1 156 010B 36 66 MVI M,102 157 010D 23 INX H 158 010E 36 00 MVI M,00 159 0110 23 INX H 160 0111 36 33 MVI M,51 161 0113 CD C5 01 CALL MOTOR 162 0116 21 23 03 LXI H,CADE8 163 0119 CD A9 01 CALL CADENA 164 011C C3 35 01 JMP FIN 165 011F 21 00 82 PULSAD7 LXI H,GIRM1 166 0122 3E 00 MVI A,00 167 0124 77 MOV M,A 168 0125 23 INX H

169 0126 77 MOV M,A 170 0127 23 INX H 171 0128 77 MOV M,A 172 0129 CD C5 01 CALL MOTOR 173 012C 21 38 03 LXI H,CADE9 174 012F CD A9 01 CALL CADENA 175 0132 C3 35 01 JMP FIN 176 0135 C3 50 00 FIN JMP SALT1 177 178 ;------------------- ----------------------- 179 ;NOMBRE: TEMPOR 180 ;FUNCION: Tiempo de espera 181 ;PRECONDICIONES: Val or en el par DE 182 ;POSTCONDICIONES: Mo difica DE 183 ;------------------- ----------------------- 184 0138 TEMPOR: 185 0138 F5 PUSH PSW 186 0139 1B TE1 DCX D 187 013A 7A MOV A,D 188 013B B3 ORA E 189 013C 00 NOP 190 013D 00 NOP 191 013E 00 NOP 192 013F C2 39 01 JNZ TE1 193 0142 F1 POP PSW 194 0143 C9 RET 195 196 ;------------------- ----------------------- 197 ;NOMBRE: ESCIR 198 ;FUNCION: Escribe en el IR 199 ;PRECONDICIONES: Dat o en Acc 200 ;POSTCONDICIONES: Ni nguna 201 ;------------------- ----------------------- 202 0144 ESCIR: 203 0144 F5 PUSH PSW 204 0145 C5 PUSH B 205 0146 47 MOV B,A 206 0147 CD 86 01 CALL LIBRE 207 014A 3E 82 MVI A,82H 208 014C 32 03 B0 STA REES82 209 014F 78 MOV A,B 210 0150 32 00 B0 STA PA82 211 0153 3E 00 MVI A,00H 212 0155 32 02 B0 STA PC82 213 0158 3E 04 MVI A,04H 214 015A 32 02 B0 STA PC82 215 015D 3E 00 MVI A,00H 216 015F 32 02 B0 STA PC82 217 0162 C1 POP B 218 0163 F1 POP PSW 219 0164 C9 RET 220 221 ;------------------- ----------------------- 222 ;NOMBRE: ESCDR 223 ;FUNCION: Escribe da to en el DR 224 ;PRECONDICIONES: Dat o en Acc 225 ;POSTCONDICIONES: Ni nguna 226 ;------------------- ----------------------- 227 0165 ESCDR: 228 0165 F5 PUSH PSW 229 0166 C5 PUSH B 230 0167 47 MOV B,A 231 0168 CD 86 01 CALL LIBRE 232 016B 3E 82 MVI A,82H 233 016D 32 03 B0 STA REES82 234 0170 78 MOV A,B 235 0171 32 00 B0 STA PA82 236 0174 3E 01 MVI A,01H

237 0176 32 02 B0 STA PC82 238 0179 3E 05 MVI A,05H 239 017B 32 02 B0 STA PC82 240 017E 3E 01 MVI A,01H 241 0180 32 02 B0 STA PC82 242 0183 C1 POP B 243 0184 F1 POP PSW 244 0185 C9 RET 245 246 ;------------------- ----------------------- 247 ;NOMBRE: LIBRE 248 ;FUNCION: Mira si LC D puede recibir datos 249 ;PRECONDICIONES: Nin guna 250 ;POSTCONDICIONES: Ni nguna 251 ;------------------- ----------------------- 252 0186 LIBRE: 253 0186 C5 PUSH B 254 0187 F5 PUSH PSW 255 0188 3E 92 MVI A,92H 256 018A 32 03 B0 STA REES82 257 018D 3E 02 MVI A,02H 258 018F 32 02 B0 STA PC82 259 0192 3E 06 LIB1 MVI A,06H 260 0194 32 02 B0 STA PC82 261 0197 00 NOP 262 0198 3A 00 B0 LDA PA82 263 019B 47 MOV B,A 264 019C 3E 02 MVI A,02H 265 019E 32 02 B0 STA PC82 266 01A1 78 MOV A,B 267 01A2 07 RLC 268 01A3 DA 92 01 JC LIB1 269 01A6 F1 POP PSW 270 01A7 C1 POP B 271 01A8 C9 RET 272 273 ;------------------- ----------------------- 274 ;NOMBRE: CADENA 275 ;FUNCION: Escribe ca dena caracteres 276 ;PRECONDICIONES: Com ienzo cadena en HL. 277 ;Final de cadena mar cado por "." 278 ;POSTCONDICIONES: Ni nguna 279 ;------------------- ----------------------- 280 01A9 CADENA: 281 01A9 F5 PUSH PSW 282 01AA E5 PUSH H 283 01AB 3E 80 MVI A,80H 284 01AD CD 44 01 CALL ESCIR 285 01B0 3E 0E CAD1 MVI A,0EH 286 01B2 CD 44 01 CALL ESCIR 287 01B5 7E MOV A,M 288 01B6 FE 2E CPI '.' 289 01B8 CA C2 01 JZ FINCAD 290 01BB CD 65 01 CALL ESCDR 291 01BE 23 INX H 292 01BF C3 B0 01 JMP CAD1 293 01C2 E1 FINCAD POP H 294 01C3 F1 POP PSW 295 01C4 C9 RET 296 297 ;------------------- ----------------------- 298 ;NOMBRE: MOTOR 299 ;FUNCION: Gira motor es a posicion 300 ;PRECONDICIONES: Dat os en GIRM1, 2, y 3 301 ;POSTCONDICIONES: Ni nguna 302 ;------------------- ----------------------- 303 01C5 MOTOR: 304 01C5 D5 PUSH D

305 01C6 C5 PUSH B 306 01C7 E5 PUSH H 307 01C8 F5 PUSH PSW 308 01C9 21 8B 02 LXI H,TGIRO 309 01CC 3A 03 C4 MOT1 LDA PC81 310 01CF 47 MOV B,A 311 01D0 0F RRC 312 01D1 DC 3F 02 CC SDAT3 313 01D4 78 MOV A,B 314 01D5 0F RRC 315 01D6 DA CC 01 JC MOT1 316 01D9 EB MOT2 XCHG 317 01DA 21 00 82 LXI H,GIRM1 318 01DD 4E MOV C,M 319 01DE 79 MOT3 MOV A,C 320 01DF FE 00 CPI 00H 321 01E1 CA EC 01 JZ MOT4 322 01E4 EB XCHG 323 01E5 CD 3F 02 CALL SDAT3 324 01E8 0D DCR C 325 01E9 C3 DE 01 JMP MOT3 326 01EC 3A 03 C4 MOT4 LDA PC81 327 01EF 47 MOV B,A 328 01F0 0F RRC 329 01F1 0F RRC 330 01F2 DC 51 02 CC SDAT2 331 01F5 78 MOV A,B 332 01F6 0F RRC 333 01F7 0F RRC 334 01F8 DA EC 01 JC MOT4 335 01FB EB MOT5 XCHG 336 01FC 21 01 82 LXI H,GIRM2 337 01FF 4E MOV C,M 338 0200 79 MOT6 MOV A,C 339 0201 FE 00 CPI 00H 340 0203 CA 0E 02 JZ MOT7 341 0206 EB XCHG 342 0207 CD 51 02 CALL SDAT2 343 020A 0D DCR C 344 020B C3 00 02 JMP MOT6 345 020E 3A 03 C4 MOT7 LDA PC81 346 0211 47 MOV B,A 347 0212 0F RRC 348 0213 0F RRC 349 0214 0F RRC 350 0215 DC 65 02 CC SDAT1 351 0218 78 MOV A,B 352 0219 0F RRC 353 021A 0F RRC 354 021B 0F RRC 355 021C DA 0E 02 JC MOT7 356 021F EB MOT8 XCHG 357 0220 21 00 82 LXI H,GIRM1 358 0223 4E MOV C,M 359 0224 79 MOT9 MOV A,C 360 0225 FE 00 CPI 00H 361 0227 CA 32 02 JZ MOT10 362 022A EB XCHG 363 022B CD 65 02 CALL SDAT1 364 022E 0D DCR C 365 022F C3 24 02 JMP MOT9 366 0232 3E 00 MOT10 MVI A,00H 367 0234 32 01 C4 STA PA81 368 0237 32 02 C4 STA PB81 369 023A F1 POP PSW 370 023B E1 POP H 371 023C C1 POP B 372 023D D1 POP D

373 023E C9 RET 374 023F 7E SDAT3 MOV A,M 375 0240 FE 00 CPI 00H 376 0242 CC 79 02 CZ APDAT 377 0245 7E MOV A,M 378 0246 32 02 C4 STA PB81 379 0249 32 01 C4 STA PA81 380 024C CD 7D 02 CALL TEMP1 381 024F 23 INX H 382 0250 C9 RET 383 0251 7E SDAT2 MOV A,M 384 0252 FE 00 CPI 00H 385 0254 CC 79 02 CZ APDAT 386 0257 7E MOV A,M 387 0258 32 02 C4 STA PB81 388 025B E6 F0 ANI F0H 389 025D 32 01 C4 STA PA81 390 0260 CD 7D 02 CALL TEMP1 391 0263 23 INX H 392 0264 C9 RET 393 0265 7E SDAT1 MOV A,M 394 0266 FE 00 CPI 00H 395 0268 CC 79 02 CZ APDAT 396 026B 7E MOV A,M 397 026C 32 02 C4 STA PB81 398 026F E6 00 ANI 00H 399 0271 32 01 C4 STA PA81 400 0274 CD 7D 02 CALL TEMP1 401 0277 23 INX H 402 0278 C9 RET 403 0279 21 8B 02 APDAT LXI H,TGIRO 404 027C C9 RET 405 027D F5 TEMP1 PUSH PSW 406 027E D5 PUSH D 407 027F 11 50 01 LXI D,0150H 408 0282 1B TEM1 DCX D 409 0283 7A MOV A,D 410 0284 B3 ORA E 411 0285 C2 82 02 JNZ TEM1 412 0288 D1 POP D 413 0289 F1 POP PSW 414 028A C9 RET 415 028B 99 TGIRO DB 99H 416 028C 55 DB 55H 417 028D 66 DB 66H 418 028E AA DB AAH 419 028F 00 DB 00H 420 421 ;------------------- ---------------------- 422 ;DEFINICION CADENAS CARCTERES 423 ;------------------- ---------------------- 424 0290 20 20 20 20 CADE1 DB ' INICIO .' 0294 20 20 20 49 0298 4E 49 43 49 029C 4F 20 20 20 02A0 20 20 20 20 02A4 2E 425 02A5 50 55 4C 53 CADE2 DB 'PUL SADOR P0 30-30-30.' 02A9 41 44 4F 52 02AD 20 50 30 20 02B1 33 30 2D 33 02B5 30 2D 33 30 02B9 2E 426 02BA 50 55 4C 53 CADE3 DB 'PUL SADOR P1 60-60-60.' 02BE 41 44 4F 52 02C2 20 50 31 20 02C6 36 30 2D 36 02CA 30 2D 36 30

02CE 2E 427 02CF 50 55 4C 53 CADE4 DB 'PUL SADOR P2 90-90-90.' 02D3 41 44 4F 52 02D7 20 50 32 20 02DB 39 30 2D 39 02DF 30 2D 39 30 02E3 2E 428 02E4 50 55 4C 53 CADE5 DB 'PUL SA P3 120-120-120.' 02E8 41 20 50 33 02EC 20 31 32 30 02F0 2D 31 32 30 02F4 2D 31 32 30 02F8 2E 429 02F9 50 55 4C 53 CADE6 DB 'PUL SADOR P4 30-60-90.' 02FD 41 44 4F 52 0301 20 50 34 20 0305 33 30 2D 36 0309 30 2D 39 30 030D 2E 430 030E 50 55 4C 53 CADE7 DB 'PUL SADO P5 90-30-120.' 0312 41 44 4F 20 0316 50 35 20 39 031A 30 2D 33 30 031E 2D 31 32 30 0322 2E 431 0323 50 55 4C 53 CADE8 DB 'PUL SADOR P6 180-0-90.' 0327 41 44 4F 52 032B 20 50 36 20 032F 31 38 30 2D 0333 30 2D 39 30 0337 2E 432 0338 50 55 4C 53 CADE9 DB 'PUL SADOR P7 INICIAL.' 033C 41 44 4F 52 0340 20 50 37 20 0344 20 49 4E 49 0348 43 49 41 4C 034C 2E 433 434 435 436 034D END ************ S Y M B O L I C R E F E R E N C E T A B L E ************* APDAT 0279 CAD1 01B0 CADE1 0290 CADE2 02A5 CADE3 02BA CADE4 02CF CADE5 02E4 CADE6 02F9 CADE7 030E CADE8 0323 CADE9 0338 CADENA 01A9 ESCDR 0165 ESCIR 0144 FIN 0135 FINCAD 01C2 GIRM1 = 8200 GIRM2 = 8201 GIRM3 = 8203 LIB1 0192 LIBRE 0186 MOT1 01CC MOT10 0232 MOT2 01D9 MOT3 01DE MOT4 01EC MOT5 01FB MOT6 0200 MOT7 020E MOT8 021F MOT9 0224 MOTOR 01C5 MOTORES 0000 PA81 = C401 PA82 = B000 PB81 = C402 PB82 = B001 PC81 = C403 PC82 = B002 PPILA = C0FF PULSAD0 0082 PULSAD1 0098 PULSAD2 00AE PULSAD3 00C4 PULSAD4 00DA PULSAD5 00F1 PULSAD6 0108 PULSAD7 011F REES81 = C400 REES82 = B003 SALT1 0050 SALT2 0052 SDAT1 0265 SDAT2 0251 SDAT3 023F TE1 0139 TEM1 0282 TEMP1 027D TEMPOR 0138 TGIRO 028B LINES ASSEMBLED : 436 ASSEMB LY ERRORS : 0

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º. 2. Especificar las modificaciones necesarias en el programa desarrollado en este tema para que los

motores giren a una velocidad más baja y el giro sea levógiro. 3. Qué cambios hay que realizar en nuestro programa para que en pantalla aparezca al inicio la frase:

"INICIO DE PROGRAMA". 4. Realizar los cambios precisos en hardware para controlar los motores, eliminando los ULN 2803, sin

que resulte imprescindible modificar el software. 5. Realizar los cambios de software necesarios para que al accionar P3 se ejecute el siguiente proceso:

a. Girar los tres motores hasta M1=90º, M2=60º, M3=30º b. En pantalla tiene que aparecer "EJERCICIO Nº5".