Programación de placas de control

Anuncio
Programación de placas de control
1
ROBÓTICA
PROGRAMACIÓN DE PLACAS DE CONTROL
Por
ALBERTO MADINAVEITIA MARTÍN
Programación de placas de control
2
•
INTRODUCCIÓN
•
CARACTERÍSTICAS TÉCNICAS DEL INTERFACE 8x8x8.
•
LOS PUERTOS
•
EL CONECTOR DSUB-25 Y EL CONECTOR CENTRONICS.
•
LOS REGISTROS DE DATOS, ESTADO Y CONTROL
•
EL LENGUAJE DE PROGRAMACIÓN
•
¿CÓMO BUSCAR LAS DIRECCIONES DE LOS REGISTROS?
•
PRACTICA 1. MEDIDA DE TENSIONES EN EL PUERTO DE DATOS
•
EL CIRCUITO ELECTRÓNICO DE LAS SALIDAS.
•
PRACTICA 2. ENVÍO Y VISUALIZACIÓN DE SEÑALES AL PUERTO DE DATOS.
•
PROGRAMACIÓN PARA ENVIAR CUALQUIER COMBINACIÓN DE BITS AL PUERTO
DE DATOS.
•
PRACTICA 3. ENVÍO Y VISUALIZACIÓN DE SEÑALES EN EL PUERTO DE CONTROL.
•
AMPLIACIÓN DE LAS SALIDAS EN EL PUERTO DE DATOS.
•
EL CIRCUITO ELECTRÓNICO DE LAS ENTRADAS.
•
PRACTICA 4. CAPTACIÓN DE SEÑALES DE ENTRADA EN EL PUERTO DE ESTADO.
•
SEÑALES ELÉCTRICAS DE ENTRADA EN EL PUERTO DE ESTADO.
•
LECTURA DE SEÑALES DE ENTRADA EN EL PUERTO DE ESTADO.
•
ENTRADAS DIGITALES.
•
AMPLIACIÓN DE ENTRADAS DIGITALES.
•
LECTURA DE ENTRADAS DIGITALES COMO LÍNEAS INDEPENDIENTES.
•
ENTRADAS ANALÓGICAS.
•
AMPLIACIÓN DE CANALES.
•
INTERFACE 8 x 8 x 8.
ANEXOS
•
PROCEDIMIENTOS DE CONTROL DEL INTERFACE 8 X 8 X 8
•
ESTRUCTURA DEL PUERTO PARALELO.
•
PUERTAS ÓPTICAS.
•
CONTROL DE MOTORES DE CC.
•
ACONDICIONAMIENTO DE SEÑAL. DISEÑO DE UN TERMÓMETRO DIGITAL.
MONITORIZACIÓN DE LA TEMPERATURA.
Programación de placas de control
•
3
INTRODUCCIÓN
El rápido desarrollo tecnológico que experimenta nuestra sociedad no debe pasar
inadvertido a la escuela y por ello es lógico que el curriculo de Tecnología se reconfigure
introduciendo contenidos tales como robótica, control por ordenador, adquisición de datos,
informática, programación, etc... a los que el profesorado, generalmente profano en estas
materias, deberá ahora enfrentarse.
El presente trabajo pretende introducir al profesorado que imparte el área de
tecnología, y en general a todos los profesores del ámbito científico-tecnológico, al mundo del
control y la programación mediante la construcción de distintos interfaces a través de los
cuales puedan desarrollarse proyectos escolares de control por ordenador. Generalmente la
información que puede encontrarse sobre este tipo de aplicaciones es, por ser altamente
específica, escasa, compleja y a menudo sesgada, factores que confluyen en proyectos de
construcción inviables, cuando menos tediosos, para gente no especializada. Por otro lado, los
productos comerciales de este tipo pensados para aplicaciones didácticas son todavía caros, si
tenemos en cuenta los limitados presupuestos con que cuentan los Departamentos didácticos,
crean dependencia de la marca suministradora y establecen un marco de posibilidades que
puede no adaptarse a nuestras necesidades, con lo cual corren el peligro de convertirse en
auténticos artículos de lujo. Sin embargo, lo peor de todo es que no sabemos como funcionan,
perdiendo en gran medida su sentido didáctico.
Por todo ello, el objetivo fundamental que persigue el presente trabajo es conseguir que
con tan solo un poco de esfuerzo el profesorado interesado en este apasionante mundo pueda,
construir, programar y comprender el funcionamiento básico del intérprete que comunica al PC
con el mundo exterior y que de esta forma sea capaz de buscar las aplicaciones y mejoras del
proyecto que mejor se adapten a su programación, aprovechando el material de que se
dispone en los Departamentos y los escasos recursos económicos de que generalmente se
dispone.
El presente trabajo se estructura en apartados teóricos en los que se describen con
detalle aspectos técnicos y de programación entre los cuales se intercalan experiencias
prácticas que están diseñadas para reforzar los conocimientos adquiridos.
La forma de
estudiar este documento dependerá de la formación que tenga el lector, de hecho pueden
obviarse todas las prácticas intermedias e ir directamente al montaje que interese en cada
momento. Es recomendable sin embargo para obtener un mayor conocimiento del
funcionamiento interno y programación seguir secuencialmente todos los apartados teóricos y
prácticos.
Programación de placas de control
•
4
UNA PROPUESTA DE PROYECTO. EL INTERFACE 8 x 8 x 8.
El dispositivo de control que proponemos al final de este documento proporciona 8
salidas digitales, 8 entradas digitales y 8 entradas analógicas, siendo por lo tanto capaz de
adquirir datos analógicos procedentes de sensores. Las 8 señales de salida, gobiernan otros
tantos relés a través de optoacopladores que proporcionan una protección segura al puerto.
Tanto las salidas como las entradas cuentan con diodos led que visualizan las señales
eléctricas correspondientes. El interface necesita para sus circuitos de relés y aquellos
asociados con el manejo del conversor analógico-digital una fuente externa de tensión
estabilizada de + 5 V. Para tal fin puede utilizarse la fuente de alimentación variable de que
disponen todos los talleres de tecnología ajustando la tensión de salida a + 5V. Otra posibilidad
es hacer una exclusiva para el interface. Este se conecta directamente al puerto paralelo
retirando previamente la impresora y utilizando el mismo cable de la impresora para su
conexión. Esto último presenta una ventaja respecto a otro tipo de interfaces que se insertan en
las ranuras de expansión ISA ubicadas en la placa madre para lo cual es necesario abrir el
ordenador y realizar la conexión, operación esta para muchos incómoda y potencialmente
peligrosa.
El procedimiento que se seguirá para la puesta en funcionamiento del interface será:
1º.- Previa desconexión de la impresora, conectar el interface al puerto paralelo mediante el
cable correspondiente arriba citado. 2º .- Arrancar el ordenador. 3º.- Conectar la fuente de
alimentación del interface. Acabada la sesión de trabajo se seguirán los pasos en orden
inverso.
Por último, el dispositivo que aquí se describe es compatible con cualquier ordenador
IBM estandar, es decir no hace falta un PC de última generación. De hecho todas las prácticas
que aquí se presentan han sido realizadas con un equipo provisto de microprocesador 80286.
•
LOS PUERTOS.
Los puertos son las conexiones físicas de que dispone el ordenador para comunicarse
con dispositivos periféricos. Por estos canales el ordenador puede tanto enviar como recibir
señales eléctricas, en forma de datos (por ejemplo a una impresora), en forma de señales de
control (que encauzan el flujo de estos datos) o de señales de estado (que informan al
ordenador del estado en el cual se encuentran sus periféricos).
Los datos están constituidos por bits (la unidad más pequeña de información digital),
que no son más que un conjunto de ceros y unos lógicos que se manifiestan en forma señales
eléctricas todo o nada (ausencia de voltaje ó presencia de voltaje). Cada carácter de
información está formado por un byte, es decir por una palabra de 8 bits. Así como los datos
Programación de placas de control
5
que van a ser trasmitidos generalmente se agrupan en bytes, las señales de control o de
estado no necesitan de este formato particular y pueden estar constituidas por un solo bit.
En un ordenador, entre otros, se distinguen dos tipos de puertos, el puerto paralelo y el
puerto serie o serial, que se caracterizan por la forma en la cual se transmiten datos. En una
transferencia a través de un puerto serie se envían los 8 bits que constituyen un byte de
información uno detrás de otro por un solo cable, mientras que en la transferencia en paralelo
los 8 bits se envían simultáneamente por 8 líneas independientes. Según esto, la velocidad de
transferencia de datos por el puerto paralelo es aproximadamente 8 veces mayor que por el
puerto serie pero con el inconveniente de que se necesitan 8 líneas independientes. Por ello,
cuando se requiere una transferencia de datos a gran distancia es preferible la transmisión
serie la cual puede llevarse a cabo por una simple línea telefónica.
Originariamente, el puerto paralelo se utilizó fundamentalmente para la transmisión de
datos a una impresora, así estaba preparado más para la transferencia que para la recepción
de datos, es decir era unidireccional. De este modo, el ordenador podía enviar directamente un
byte de salida por el puerto, pero la configuración de éste no le permitía al ordenador recibir de
forma directa un byte, sin embargo, mediante un circuito externo y una programación
adecuada, veremos como puede conseguirse que el puerto paralelo sea capaz tanto de enviar
como de recibir bytes de información. Sin embargo, desde la introducción del PC al mercado, el
puerto paralelo ha sufrido varias modificaciones para hacerlo más veloz. Ya que el puerto
original era unidireccional, se creó el puerto bidireccional. Este permite una comunicación de 8
bits en ambas direcciones en el puerto de datos. Finalmente se han creado el Enhanced
Parallel Port (EPP) y el Extended Capability Port (ECP). Estos dos últimos son al puerto
estándar como el Pentium al 286, además de ser bidireccionales. Actualmente, además de
para el manejo de la impresora, el puerto paralelo se utiliza también para manejar otros
periféricos como CD ROM, cintas de copia de respaldo, discos duros, tarjetas de red,
protectores de copia, scanners, etc.
En la actualidad se conocen cuatro tipos de puerto
paralelo:
-
Puerto paralelo estándar (Standart Parallel Port SPP) .
-
Puerto Paralelo PS/2 (bidireccional) .
-
Enhanced Parallel Port (EPP). Puerto paralelo ampliado.
-
Extended Capability Port (ECP). Puerto paralelo de capacidad extendida.
•
EL CONECTOR DSUB-25 Y EL CONECTOR CENTRONICS.
Físicamente podemos distinguir los puertos paralelo y serie por el tipo de conector
externo que poseen. El puerto serie o serial tiene un conector macho de 9 (conexión del ratón
Programación de placas de control
6
serial) o de 25 pines, mientras que el puerto paralelo tiene un conector hembra de 25 pines
denominado técnicamente DSUB-25.
La impresora y otros periféricos se enlazan con el ordenador mediante un cable
especial que posee en un extremo un conector DSUB-25 macho y en el otro un conector
macho diferente de 36 pines, denominado CENTRONICS. Es evidente que al pasar de 25 a 36
polos habrá pines en éste último que no tengan correspondencia con el primero y por tanto no
sirven para nada. Además, en general, los pines unidos por el cable en ambos conectores no
poseen la misma numeración. Cada uno de los polos del conector DSUB-25 tiene un nombre y
cumple una misión específica relacionada con el gobierno de la impresora que se indican en el
siguiente cuadro.
PIN
DENOMINACIÓN
FUNCIÓN
1
DATA STORBE (DSTB)
Permite el paso de datos a la
impresora o periférico
2-9
DATOS
Son los 8 bits de datos que el
ordenador envía la periférico
10
ACKNOWLEGE (ACK)
Indica fin de operación
11
BUSY
Indica impresora ocupada
12
PAPER END
Indica falta papel
13
SELECT
Indica impresora seleccionada
14
AUTOFEED
Envía un retorno de carro a la
impresora
15
ERROR
Error de transmisión
16
INIT PRINTER
Inicializa la impresora
17
SELECT IN
Pone la impresora en línea
18-25
MASA
Líneas de masa
En la Figura 1 se indican las numeraciones y los nombres de cada uno de los polos en
el conector DSUB-25 y CENTRONICS.
•
LOS REGISTROS DE DATOS, ESTADO Y CONTROL.
El puerto paralelo consta de tres registros denominados registro de datos, registro de
control y registro de estado. Los registros son celdas de memoria constituidas por 8 biestables
o flips-flops (unidades básicas de memoria) en la que puede almacenarse un byte
registros
de
datos,
control
y
estado
a
partir
de
ahora
los
(los
denominaremos
D7D6D5D4D3D2D1D0, C7C6C5C4C3C2C1C0 y E7E6E5E4E3E2E1E0). Estos registros se
localizan mediante una dirección física dentro de la memoria del ordenador. El proceso de
entrada/salida de señales eléctricas es muy sencillo, simplemente se escriben o se leen los
Programación de placas de control
7
datos que se van a enviar o recibir respectivamente en el registro que corresponda. Por último
debemos tener en cuenta un último detalle, ciertas señales están invertidas en los registros de
control y de estado. Esto quiere decir que si recibimos un uno lógico por el puerto, el ordenador
lo interpreta como un cero lógico, mientras que si el ordenador envía un uno lógico al puerto
este se manifiesta allí como un cero lógico. Veamos con detalle cada uno de estos registros.
En el puerto paralelo estandar, el registro de datos solo puede utilizarse como salida
del ordenador al periférico (unidireccional). Las 8 señales o bits se transmiten en paralelo por 8
líneas que corresponden a los pines 2-9 del conector del puerto paralelo (DSUB-25),
manifestándose como tensiones eléctricas de + 5 V cuando se transmite un 1 y de + 0 V
cuando se transmite un 0. El valor de salida del registro de datos puede ir por tanto desde 0
hasta 255 (en código binario de 00000000 a 11111111). Por ejemplo si el ordenador envía al
puerto de datos el valor 8 (00001000) mediríamos un voltaje de +5 V en el pin 5 (ver Figura 1)
respecto a la línea de masa y un voltaje de + 0 V en los pines restantes. Las señales del
registro de datos no están invertidas.
El registro de estado solo puede utilizarse para leer señales de entrada del periférico al
ordenador. Por ejemplo, el estado de la impresora se lee a través de 5 líneas de estado,
denominadas -BUSY, ACK, PAPER END, SELECT, y ERROR que se corresponden con los
pines 11,10, 12, 13 y 15 del conector DSUB-25. En este caso de los 8 bits posibles del registro
de datos solo se utilizan 5, (E7, E6, E5, E4, E3) los tres primeros (E2, E1 y E0) no se utilizan y
Programación de placas de control
8
por tanto pueden leerse solo 32 de los 255 valores posibles. Además como se ha indicado, la
señal BUSY (E7) se lee invertida, esto es, si tiene un valor de +5V se lee como 0 V.
El registro de control es bidireccional, es decir puede configurarse tanto para la lectura
como para la salida de datos. El registro utiliza 4 líneas para realizar el control del
periférico denominadas, - DTSB, -AUTOFEED, INIT PRINTER, y -SELECT IN que se
corresponden con los pines 1, 14, 16 y 17 del conector del puerto paralelo. De los 8 bits del
registro sólo se usan 4 (el C3, C2, C1 y C0 mientras el C7, C6, C5 y C4 no se consideran) y
por tanto proporcionan 16 valores de entrada ó salida de los 255 posibles. Además las señales
DTSB, AUTOFEED y SELECT IN (C3, C2 y C0) están invertidas.
En resumen, de las 24 (8 x 3) señales posibles existentes en los 3 registros solo se
utilizan 17; 8 de ellas para señales de datos, 5 para señales de estado y 4 para señales de
control y por ello de los 25 polos del conector DSUB-25 solo 17 corresponden a líneas en uso,
el resto son líneas de masa. En la Figura 2 se representa la correspondencia entre los bits de
los registros con los pines de los conectores DSUB-25 y CENTRONICS.
•
EL LENGUAJE DE PROGRAMACIÓN.
Para empezar a dar ordenes al PC de salida/entrada de señales eléctricas a través del
puerto de la impresora es necesario un lenguaje de programación. Cualquier circuito
electrónico conectado al ordenador es totalmente inútil sin unas instrucciones que lo gobiernen,
de este modo hardware y software deben estar perfectamente compenetrados para que pueda
obtenerse el máximo rendimiento del periférico. Estas instrucciones incluyen la emisión de
señales de reloj que actúan sobre circuitos integrados como puertas lógicas, latches,
convesores A/D, D/A, multiplexores, etc....ordenes de lectura de señales, salida de datos,
configuración del puerto, rutinas de almacenaje y lectura de datos en archivos y en definitiva
de programas que hagan que el interface realice la función que nosotros queramos que haga
en cada momento.
El lenguaje de programación usado en este trabajo es el BASIC, concretamente los
programas que a continuación se muestran han sido elaborados con la versión TURBO-BASIC
1.0, pero pueden usarse otros como el GWBASIC o el QBASIC. Estos dos últimos programas
puede encontrarse entre los archivos de las diferentes versiones del sistema operativo MSDOS
de antiguos ordenadores que trabajan bajo este entorno. Por otro lado algunas versiones de
BASIC pueden bajarse de INTERNET. De estos tres programas el GWBASIC es el menos
potente y el menos recomendable. Obviamente, pueden usarse otros lenguajes como LOGO,
PASCAL, C, etc.... e incluso programas que funcionan bajo el entorno WINDOWS, como
VISUAL BASIC, etc..., la única condición es que dispongan de funciones para el manejo de los
puertos.
Programación de placas de control
9
El BASIC utiliza respectivamente los comandos OUT para enviar señales al puerto de
datos o de control e INP para leer las señales presentes en el puerto de estado o de control (a
pesar de que el VISUAL BASIC no dispone de estos comandos para el manejo de puertos,
pueden implementarse a partir de librerías externas) .
Programación de placas de control
10
La siguiente instrucción envía un dato al puerto:
OUT &HXXX, n
Donde &HXXX es la dirección escrita en código hexadecimal del registro de datos (o de
control) y n es el byte que será enviado al puerto, siendo éste un número decimal comprendido
entre 0 y 255.
NOTA: La dirección de los registros pueden escribirse también en código decimal
obviando el prefijo hexadecimal &H, sin embargo en este trabajo se seguirá el criterio
de escribir todas las direcciones de los registros en código hexadecimal
La siguiente instrucción lee el puerto de estado (o de control si se configura como
entrada):
A = INP (&HXXX)
Donde &HXXX es la dirección hexadecimal del registro de estado (o de control) y A es
el valor almacenado en esta dirección de memoria.
Si no se dispone de momento de alguno de estos programas puede usarse el programa
Debug del DOS como se indica a continuación para enviar o leer señales de los puertos:
Ve al promt del DOS y teclea:
>debug
-o 378 FF
(este comando envía un dato al puerto; 378 es la dirección hexadecimal
del registro de datos y FF el valor en hexadecimal que será enviado
al puerto).
-o 37a 4
(este comando envía un dato al puerto; 37a es la dirección hexadecimal
del registro de control y 4 el valor en hexadecimal que será enviado al
puerto).
-i 379
(este comando lee el byte de estado cuya dirección hexadecimal es 379).
C7
(el programa devuelve el valor en hexadecimal del byte de estado).
-i 37a
(este comando lee el byte de control cuya dirección hexadecimal es 37a).
F6
(el programa devuelve el valor en hexadecimal del byte de control).
-q
(comando de salida del programa debug).
Programación de placas de control
•
11
¿CÓMO BUSCAR LAS DIRECCIONES DE LOS REGISTROS?
La dirección de cada uno de estos registros puede variar dependiendo de cada
ordenador, pero afortunadamente al arrancar éste son cargadas por la BIOS en la dirección
hexadecimal &H408 para el puerto lpt1, en la &H40A para el puerto lpt2 y en la &H40C para el
puerto lpt3 (dado que pueden configurarse varios puertos paralelos en un mismo ordenador).
De esta manera se consigue estandarizar el funcionamiento de cualquier máquina aunque
procedan de diferentes fabricantes. El siguiente programa acude a estas direcciones y extrae
de ellas la información buscada. Además, una vez conocida la dirección del registro de datos
(dirección base), la obtención de las otras dos es inmediata dado que son consecutivas,
correspondiendo la dirección base + 1 al registro de estado y la dirección base + 2 al registro
de control. En general, la inmensa mayoría de los ordenadores poseen las siguientes
direcciones para los puertos lpt1 y lpt2.
Puerto
Dirección del registro de
Dirección del registro de
Dirección del registro de
datos
estado
control
Hexadecimal/ Decimal
Hexadecimal/ Decimal
Hexadecimal/ Decimal
LPT1
&H378/888
&H379/889
&H37a/890
LPT2
&H278/632
&H279/633
&H27a/634
Ejecuta el siguiente programa y compara los valores obtenidos con los de la tabla, en
cualquier caso los valores obtenidos por el programa son los correctos.
REM ****** EL SIGUIENTE PROGRAMA BUSCA LAS DIRECCIONES EN
REM***********CÓDIGO DECIMAL DE LOS REGISTROS DE DATOS
REM*******ESTADO Y CONTROL DE LOS PUERTOS LPT1, LPT2 Y LPT3
CLS
DEF SEG = 0
LPT1 = PEEK(&H408) + 256 * PEEK(&H409)
LPT2 = PEEK(&H40a) + 256 * PEEK(&H40b)
LPT3 = PEEK(&H40c) + 256 * PEEK(&H40d)
PRINT "DIRECCIÓN DEL REGISTRO DE DATOS DE LPT1 ="; LPT1
PRINT "DIRECCIÓN DEL REGISTRO DE ESTADO DE LPT1 ="; LPT1 + 1
PRINT "DIRECCIÓN DEL REGISTRO DE CONTROL DE LPT1 ="; LPT1 + 2
PRINT "
oOo "
PRINT "DIRECCIÓN DEL REGISTRO DE DATOS DE LPT2 ="; LPT2
PRINT "DIRECCIÓN DEL REGISTRO DE ESTADO DE LPT2 ="; LPT2 + 1
PRINT "DIRECCIÓN DEL REGISTRO DE CONTROL DE LPT2 ="; LPT2 + 2
PRINT "
oOo "
PRINT "DIRECCIÓN DEL REGISTRO DE DATOS DE LPT3 ="; LPT3
Programación de placas de control
12
PRINT "DIRECCIÓN DEL REGISTRO DE ESTADO DE LPT3 ="; LPT3 + 1
PRINT "DIRECCIÓN DEL REGISTRO DE CONTROL DE LPT3 ="; LPT3 + 2
Podemos considerar a la memoria del ordenador como un edificio de viviendas de 256 plantas de altura y
que en cada planta hay 256 viviendas independientes, por tanto hay 65536 viviendas. Cada vivienda tiene asignada
una dirección de acuerdo con el piso en el que se encuentra y su posición dentro de dicha planta. Si numeramos
secuencialmente cada una de las plantas desde 0 a 255 y cada uno de las viviendas de cada piso de 0 a 255 es
posible localizar cualquier dirección mediante la siguiente fórmula, entendiendo por dirección una expresión numérica
dentro del intervalo de 0 a 65535:
(número de piso x 256) + número de la puerta
Por ejemplo, el piso 10 puerta 54 tiene la dirección (10 x 256) + 54 = 2614. Esta es la forma en la que el
ordenador establece el direccionamiento de las 65536 direcciones de memoria. El ordenador utiliza dos bytes (8 bits)
de memoria (2 registros) para manejar una dirección. El primero almacena la parte menos significativa de la dirección
(en este caso el número 54) y en la siguiente consecutiva la parte más significativa, es decir lo hace al revés.
número de la puerta + (número de piso x 256)
Con la instrucción PEEK del BASIC podemos ver el contenido de cualquier registro de memoria. Ahora bien
como sabemos que el ordenador almacena las direcciones base (registro de datos), de cada uno de los puertos a
partir de la dirección &H408, consecutivamente, sabemos que la dirección del registro de datos de LPT1 estará en las
direcciones &H408 y &H409, las de LPT2 en &H40A y &H40B y las de LPT3 en &H40C y &H40D. Ahora solo queda
leer los registros correspondientes a estas direcciones y obtener la dirección buscada de la siguiente forma:
LPT1 = PEEK(&H408) + 256* PEEK(&H409)
LPT2 = PEEK(&H40A) + 256* PEEK(&H40B)
LPT3 = PEEK(&H40C) + 256* PEEK(&H40D)
es decir, en el primer caso el número de la puerta estará almacenado en el registro de memoria de dirección &H408 y
el número de piso en &H409.
Programación de placas de control
13
De igual modo estas direcciones puede obtenerse mediante el programa debug del
DOS. Vete al prompt del DOS y Teclea:
>debug
-d 0040:0008 L6
(este comando muestra el contenido en código hexadecimal de los 6
registros a continuación del &H408 inclusive, es decir, de los registros
&H408 &H409, &H40a, &H40b, &H40c &H40d).
(El ordenador devuelve el siguiente mensaje)
0040:0008
78 03 78 02 00 00
La combinación de los dos primeros registros indican la dirección base de lpt1 &H378
La combinación de los dos segundos registros indican la dirección base de lpt2 &H278
La combinación de los dos terceros registros indican la dirección base de lpt3 &H0000
Esto indica que en la máquina están instalados solo los puertos lpt1 y lpt2.
Una última forma de obtener información acerca de estas direcciones y también la más
sencilla es acudir a la BIOS del equipo a la que se accede generalmente pulsando la tecla
“Supr” durante la secuencia de arranque. En la sección de CHIPSET FEATURES SETUP,
puede encontrarse la dirección base del puerto paralelo instalado en la placa madre. Si hay un
segundo puerto instalado, caso de instalar una tarjeta controladora de puerto paralelo, no
aparecerá información en la BIOS dado que el hardware no pertenece la placa madre, sin
embargo, si el sistema operativo instalado en el equipo es Windows, en la ventana de
Propiedades del sistema, a la que se accede desde el icono de MiPC → Propiedades →
Administrador de dispositivos → Puertos COM y LPT, puede verse si hay un segundo puerto
paralelo instalado que aparecerá bajo el nombre de “Puerto de impresora LPT2”. Haciendo clic
en el botón derecho en la ventana de Recursos aparecerá dicha dirección.
Programación de placas de control
•
14
PRACTICA 1. MEDIDA DE TENSIONES EN EL PUERTO DE DATOS.
Llegado este punto estamos ya en disposición de empezar a realizar montajes
electrónicos preliminares. Para ello utilizaremos una placa entrenadora para circuitos y cables
de hilo rígido para realizar las conexiones. Necesitaremos también cable de cinta plano de 36
conductores, un conector CENTRONICS hembra y 18 conectores de insertar a la placa
entrenadora por la base y por un lateral el cable conductor o en su defecto una regleta con 18
conectores. Posteriormente cuando hayamos realizado y comprobado los distintos circuitos
podremos realizar versiones permanentes en circuito impreso.
De momento nos centraremos con realizar el montaje de la Figura 4, cuya finalidad es
(Estado 6) Acknowledge
Ground
Ground
Data 7
(Estado 7) Busy
Ground
Ground
Data 6
(Estado 5) Paper out
Ground
(Estado 4) Select out
Data 5
(Control 2) Print reset
Ground
(Control 1) Autofeed
Data 4
Ground
(Estado 3) Error
Data 3
Ground
Ground
Data 2
Ground
Ground
Data 1
Ground
Data 0
(Control 3) Select in
35
36
31
33
30
32
34
29
27
28
25
24
26
19
21
23
22
20
17
18
15
13
14
16
9
11
8
10
12
5
7
6
Ground
3
4
Strobe (Control 0)
2
1
Numeración de
cables
Numeración de
pines
18
36
35
17
15
16
34
33
13
14
32
31
12
30
29
11
10
28
9
27
26
6
7
8
25
24
4
5
23
22
3
21
2
20
1
19
FIGURA 3
agrupar y ordenar las conexiones eléctricas del conector DSUB-25 del puerto paralelo,
obteniendo por separado las conexiones que proceden del registro de datos, de estado, de
control y las líneas de masa.
Programación de placas de control
15
El primer paso será insertar el cable de cinta plano en el conector CENTRONICS. La
conexión se realiza a presión. Se introduce el cable de cinta en el interior de la ranura del
conector de forma que sobresalga unos centímetros y se presiona fuertemente hasta que las
clavijas se inserten en los conductores. Posteriormente se corta rente la parte del cable de
cinta que sobresale mientras que en el otro extremo del cable se separan individualmente los
cables hasta una longitud de unos 10 cm con unas tijeras. Ahora se empezará a contar los
conductores desde el lado del cable que esté más cercano al pin 1 del conector centronics
hembra (la numeración está indicada en el propio conector) olvidándonos de la numeración de
los pines del conector centronics (ya que son diferentes tal y como se indica en la Figura 3).
Los cables que corresponden al byte de datos son el 3, 5, 7, 9, 11, 13, 15, 17; los cables
correspondientes al byte de control son el 1, 27, 26 y 36; los correspondientes al byte de
estado son el 28, 25, 23, 19, y 21 y los correspondientes a masa el 2, 4, 6, 8, 10, 12, 14, 16, 18,
20, 22, 30, y 33. Los conductores 24, 29, 31, 32 34 y 35 no se consideran. Se procederá a
pelar cada uno de los cables señalados y a conectarlos en riguroso orden a los conectores
agrupados como se indica en la Figura 4. Es muy importante que esta operación, aunque
tediosa, se realice con sumo cuidado pues si se provoca algún corto pueden producirse daños
en el ordenador, por ello una vez realizadas las conexiones es aconsejable proceder a verificar
Programación de placas de control
16
la continuidad de cada uno de los pines del conector con cada uno de los conectores de la
placa.
Una vez realizado el montaje ve al editor de BASIC y escribe el siguiente comando
variando los valores de “n” entre 0 y 255. Ejecuta cada una de las instrucciones y mide con un
polímetro la tensión existente entre cada uno de los bits del byte de datos y masa completando
la siguiente tabla:
OUT &H378, n
Valor de
Tensión
Tensión
Tensión
Tensión
Tensión
Tensión
Tensión
Tensión
n
en
en
en
en
en
en
en
en
D7
D6
D5
D4
D3
D2
D1
D0
0
1
2
4
8
16
32
64
128
Asignado a las tensiones de +5V un uno y a las tensiones de 0V un cero, observarás
como se genera en los pines de salida el byte enviado al puerto.
•
EL CIRCUITO ELECTRÓNICO DE LAS SALIDAS.
Las señales eléctricas de +5V presentes en los pines correspondientes del registro de
datos no pueden usarse directamente para gobernar circuitos externos dado que los circuitos
integrados TTL que las generan sólo pueden proporcionar sin deteriorarse una corriente
máxima de unos de 5 mA (esta corriente depende del CI), mientras que receptores como
motores, lámparas etc... absorben corrientes muy superiores (ver Anexo I). Por otro lado,
cuando se trata de gobernar relés, dado que se trata de cargas inductivas, al ser conectadas o
desconectadas generan picos de tensión, que pueden deteriorar el ordenador. El agravio
puede ser mayor si el puerto paralelo esta integrado en la placa madre dado que ésta puede
sufrir daños acarreando costes de reparación elevados. Es recomendable para experimentar
adquirir tarjetas controladoras de entrada/salida mucho más baratas que se conectan a la placa
madre quedando ésta última intacta en caso de accidente.
Programación de placas de control
17
En la Figura 5 se muestran dos circuitos que proporcionan una protección segura al
puerto. Constan básicamente de un optoacoplador, un relé y/o transistores. El optoacoplador
es un componente que integra un diodo emisor y un fototransistor en un mismo encapsulado.
La señal procedente del puerto excita el diodo del optoacoplador, emitiendo éste un haz de luz
que incide sobre el fototransistor del circuito de salida haciendo que entre en conducción. Dado
que la conexión entre ambos circuitos es mediante un haz de luz, se obtiene un perfecto
aislamiento eléctrico entre ambos circuitos. La resistencia de 1KΩ en serie con el
optoacoplador impide que se supere la corriente máxima permitida. Por otro lado el diodo en
paralelo con la bobina del relé deriva las corrientes inducidas al producirse la conmutación de
éste protegiendo así al transistor. El circuito de salida del optoacoplador debe alimentarse por
una fuente externa que puede estar comprendida entre 5 y 24 V. En cualquier caso,
independientemente de que la carga sea un relé u otro receptor, el optoacoplador sólo puede
gobernar a su salida una corriente máxima de 100mA, lo cual se deberá tener en cuenta a la
hora de elegir la carga que deberá ser conectada. El relé puede eliminarse del circuito
Programación de placas de control
18
adosando una etapa de salida con un transistor de potencia, en este caso un transistor PNP
para evitar la inversión del voltaje a la salida.
Otra posibilidad es el uso de relés de estado sólido tales como triacs para gobernar las
tensiones alternas presentes en la vivienda. En este caso es necesario el uso de optotriacs
para ofrecer una protección segura al puerto. El circuito de la Figura 6 gobierna una lámpara de
220 V u otro receptor de similar consumo de potencia. Este circuito tiene la ventaja de que no
es necesaria una fuente de alimentación en el circuito de salida del optotriac ya que es la
tensión alterna de la red la que alimenta el circuito. Por otro lado la vida útil del triac puede ser
muy superior a la del relé, ya que los contactos de éste último, al ser de tipo mecánico, están
sujetos a un mayor desgaste debido la formación de pequeños arcos eléctricos en las
maniobras de apertura y cierre.
•
PRACTICA 2. ENVÍO Y VISUALIZACIÓN DE SEÑALES AL PUERTO DE DE DATOS.
En esta práctica vamos a visualizar mediante diodos led las señales eléctricas
asociadas con la transmisión de datos de salida por el puerto paralelo y comprobaremos la
rapidez de dicha transmisión. En la placa obtenida anteriormente (Figura 4), conecta los diodos
led en serie con resistencias de 1KΩ y estas a su vez a masa, según en esquema de la Figura
7. Ten en cuenta que el electrodo de menor longitud en el diodo led es cátodo (polo negativo).
Verifica la continuidad con el polímetro. Una vez realizadas las comprobaciones conecta el
interface al cable de la impresora y arranca el ordenador. Ve al editor de BASIC, carga el
siguiente programa y ejecútalo.
REM **************PRUEBA DEL REGISTRO DE DATOS***********
T1 = 10000
T2 = 10000
FOR X = 0 TO 7
OUT &H378, 2^X
CALL PAUSA (T1)
Programación de placas de control
19
NEXT X
FOR X = 7 TO 0 STEP -1
OUT &H378, 2^X
CALL PAUSA (T2)
NEXT X
REM **************SUBRUTINA DE TEMPORIZACIÓN*********
SUB PAUSA (A)
FOR X = 0 TO A
NEXT X
END SUB
Observarás como los diodos led se encienden consecutivamente en un sentido y en el
otro. Cambiando los valores de T1 y T2 es posible modificar la rapidez de desplazamiento de
los diodos luminosos en ambos sentidos respectivamente (estos valores son relativos
dependiendo de la rapidez del microprocesador). El programa simplemente lo que hace es
enviar los valores decimales, 1, 2, 4, 8, 16, 32, 64 y 128 al puerto de forma consecutiva, que en
código binario se corresponden con los valores; 00000001, 00000010, 00000100, 00001000,
00010000, 00100000, 01000000, 10000000. Así, de los 8 bits solo el que está a valor alto
excita el diodo led.
NOTA: Si la dirección del registro de datos no es &H378, hay que sustituirla por la
obtenida del programa de búsqueda de los registros.
Programación de placas de control
•
20
PROGRAMACIÓN PARA ENVIAR CUALQUIER COMBINACIÓN DE BITS AL PUERTO
DE DATOS.
A lo largo del desarrollo de un proyecto puede ser necesario enviar distintas
combinaciones de bits (o bytes) a la salida para realizar el control de los relés, enviar distintas
señales de control a otros integrados, etc.... Hasta ahora esto lo hemos hecho mentalmente
asociando esa combinación de bits al número decimal correspondiente e incluyendo este
número como parámetro en la instrucción OUT. Sin embargo esto puede llegar a ser tedioso.
Es más intuitivo enviar al puerto en vez del número decimal, el número binario que representa
dado que un “1” indica la presencia de señal eléctrica y un “0” la ausencia. Por ejemplo, si
enviamos el byte 10000001 se activarán los relés correspondientes al bit D0 y al bit D7,
información que no es directamente intuida si enviamos el número decimal correspondiente,
“129 “.El siguiente procedimiento realiza la conversión.
REM*******PROCEDIMIENTO DE ENVÍO DE UN BYTE AL PUERTO DE DATOS******
SUB SALIDA (M8, M7, M6, M5, M4, M3, M2, M1)
SALIDA% = M1*1 OR M2*2 OR M3*4 OR M4*8 OR M5*16 OR M6*32 OR M7*64 OR M8*128
OUT &H378, SALIDA%
END SUB
La variable SALIDA% no es mas que el polinomio de conversión de números binarioa a
decimales en donde los coeficientes estan dados por las variables M1, M2, M3, ..etc.. Para
llamar al procedimiento se usa la instrucción CALL, por ejemplo la sentencia CALL SALIDA
(1,1,1,1,1,1,1,1) envía el byte 11111111 al puerto.
El proceso de llamada puede refinarse aún más haciendo que el ordenador nos
pregunte qué byte deseamos sea enviado al puerto. El siguiente programa realiza esta tarea.
INPUT “INTRODUCE EL BYTE QUE DESEAS ENVIAR AL PUERTO M8M7M6M5M4M3M2M1” ; BYTE$
DIM M$(8)
FOR X = 1 TO 8
M$(9-X) = MID$(BYTE$, X, 1)
M(9-X) = VAL(M$(9-X))
NEXT X
CALL SALIDA (M(8), M(7), M(6), M(5), M(4), M(3), M(2), M(1))
Otro procedimiento que puede ser interesante es el de enviar un bit a la salida del
puerto de datos dejando sin alterar el resto. Supongamos que se desea modificar solo el bit D0
del puerto de datos. Para ello el programa lee el puerto y realiza la multiplicación lógica del byte
resultante de la lectura por los bytes 00000010, 00000100, 00001000, 00010000, 00100000,
01000000 y 10000000, obteniéndose las variables, S2, S3, S4, S5, S6 y S7 dejando de este
modo los bits, D1, D2, D3, D4, D5, D6 y D7 intactos. El resultado obtenido en la variable
Programación de placas de control
21
SALIDA% se calcula del mismo modo que en el procedimiento anterior pero en este caso el
valor de S0 se calcula multiplicando el valor deseado a la salida por 1. Por ejemplo, La
sentencia CALL D0(1) envía un 1 solo al pin correspondiente al bit D0 del registro de datos
mientras que la sentencia CALL D0(0) envía un 0.
REM*****PROCEDIMIENTO DE ENVÍO DE UN BIT AL PUERTO DE DATOS DEJANDO INTACTO EL RESTO ******
SUB D0(BIT)
BYTES = INP(888)
S2 = (BYTES AND 2) / 2
S3 = (BYTES AND 4) / 4
S4 = (BYTES AND 8) / 8
S5 = (BYTES AND 16) / 16
S6 = (BYTES AND 32) / 32
S7 = (BYTES AND 64) / 64
S8 = (BYTES AND 128) / 128
SALIDA% = BIT * 1 OR 2 * S2 OR 4 * S3 OR 8 * S4 OR 16 * S5 OR 32 * S6 OR 64 * S7 OR 128 * S8
OUT &H378, SALIDA
END SUB
•
PRACTICA 3. ENVÍO Y VISUALIZACIÓN DE SEÑALES AL PUERTO DE CONTROL.
En esta práctica vamos a usar el registro de control como salida de señales eléctricas.
Del mismo modo que en la práctica anterior, conecta ahora a los conectores correspondientes
del byte de control los diodos led en serie con resistencias de 1KΩ y estas a su vez a masa tal
y como se indica en la Figura 8. Verifica las conexiones con el polímetro.
Programación de placas de control
22
En este caso al tener el citado registro sólo 4 bits utilizables, el máximo número de
combinaciones binarias de señales que podrán enviarse será de 24 = 16. (del 0000 al 1111).
Además, dado que el registro de control presenta tres de sus señales invertidas (que se
corresponden con los bits C0, C1 y C3), al enviar por ejemplo el valor decimal 4 a la salida (en
código binario 0100) observarás como los diodos que se encienden no se corresponden con el
número binario enviado al puerto. En este ejemplo el número binario reflejado en los leds será
el 1111 y se encenderán todos los diodos.
Para comprobarlo escribe el siguiente comando y ejecútalo.
OUT &H37a, 4
Donde &H37a, es la dirección del registro de control.
Puesto que con las inversiones es incómodo hacer el cálculo mental del número
decimal que nos permita obtener en la salida la combinación deseada de señales eléctricas
utilizaremos el operador booleano XOR (puerta O-exclusiva) para revertir la inversión que
realiza el puerto en el registro de control. Este procedimiento se denomina enmascaramiento.
A7
A6
A5
A4
A3
A2
A1
A0
1
0
1
1
A3
A2
A1
A0
XOR
0
0
0
0
||
A7
A6
A5
A4
CONTROL% = A XOR 11
OUT &H37a, CONTROL%
Escribe el siguiente programa.
REM ********ESTE PROGRAMA DESHACE LAS INVERSIONES DEL
REM ********REGISTRO DE CONTROL
PRINT “INTRODUCE EL VALOR DE SALIDA POR EL REGISTRO DE CONTROL”
INPUT A
Programación de placas de control
23
CONTROL% = A XOR 11
OUT &H37a, CONTROL%
END
Observarás ahora como el valor de la variable A se manifiesta fielmente en la salida.
Para conseguir que todos los diodos se enciendan el valor de A deberá ser ahora 15. La
tercera sentencia opera bit a bit el valor binario de A con el valor binario correspondiente del
número decimal 11 (en código binario 1011). Si te fijas este número tiene un uno justo en los
bits que están invertidos.
Es muy útil crear un procedimiento que al ser invocado desde cualquier parte de un
programa envíe el byte deseado al puerto de control. A continuación se muestra uno:
REM******PROCEDIMIENTO DE ENVÍO DE UN BYTE AL PUERTO DE CONTROL***********
SUB CONTROL (DATO)
CONTROL% = DATO XOR 11
OUT &H37a, CONTROL%
END SUB
Donde DATO representa el byte que será enviado al puerto de control. Por ejemplo la
instrucción CALL CONTROL (2) envía el byte 00000010 al puerto de control.
•
AMPLIACIÓN DE LAS SALIDAS EN EL PUERTO DE DATOS.
El número de salidas en el puerto de datos puede incrementarse en múltiplos de 8
utilizando básculas latch octales tales como la 74347. La señal de reloj que poseen estos
integrados tiene la misión de bloquear o permitir la entrada de datos en el CI, quedado en este
último caso los datos congelados y disponibles en las salidas. Cuando se emite un pulso de
subida sobre la señal de reloj CLK, la báscula deja pasar los datos presentes en las entradas.
De este modo el byte almacenado puede utilizarse como una nueva salida. Por ejemplo si
conectamos dos de estos integrados en paralelo con las salidas del puerto de datos según el
esquema de la Figura 9 podemos enviar dos bytes diferentes a cada uno de los 74347
actuando de forma alternativa sobre las señales de reloj. Las señales de gobierno proceden de
los bit C0 y C1 del puerto de control.
El programa de control es el siguiente.
REM ***************ESTE PROGRAMA ENVÍA 2 BYTES **************
REM*******************DESDE EL PUERTO DE DATOS****************
T = 10
REM**********SALIDA DEL PRIMER DATO*************
OUT &H378, 255
REM***********PULSO DE SUBIDA AL PRIMER LATCH 74347********
CALL CONTROL (0)
Programación de placas de control
24
CALL PAUSA (T)
CALL CONTROL (1)
REM**********SALIDA DEL SEGUNDO DATO*****************************
OUT &H378, 0
REM**********PULSO DE SUBIDA AL SEGUNDO LATCH 74347********
CALL CONTROL (0)
CALL PAUSA (T)
CALL CONTROL (2)
END
Primeramente se da la orden de salida del primer dato con la sentencia OUT &H378,
255. Este dato no pasará al latch hasta que se emita sobre la señal de reloj un pulso de subida,
lo cuál se hace con las instrucciones CALL CONTROL(0) y CALL CONTROL(1) . Del mismo
modo se hace con el siguiente dato y el segundo latch.
Programación de placas de control
•
25
EL CIRCUITO ELECTRÓNICO DE LAS ENTRADAS.
Sabemos ya como enviar datos de salida por el puerto paralelo usando tanto el registro
de datos como el registro de control. Con estas señales podemos por ejemplo controlar relés
que gobiernen motores, lamparas u otros receptores pero sin embargo no sirven para que el
ordenador responda a estímulos externos. Las señales de entrada proporcionan al sistema de
control una realimentación que condiciona las salidas haciendo que sea capaz de
autoregularse, de este modo el ordenador actúa como un autómata programable. Como ya
comentamos en apartados anteriores el puerto usa el puerto de estado para captar las señales
de entrada. El registro de control al ser bidireccional también puede usarse para este fin.
Recordemos que en el byte de estado solo pueden usarse 5 de los 8 bits (en concreto los bits
E7, E6, E5, E4 y E3). Mediante la siguiente experiencia vamos a establecer la forma en la que
el ordenador responde a un estímulo externo.
•
PRACTICA 4. CAPTACIÓN DE SEÑALES DE ENTRADA EN EL PUERTO DE ESTADO.
Conecta el montaje de la Figura 4 con el cable de la impresora al puerto paralelo del
ordenador, enciéndelo y mide con un polímetro la tensión existente entre cada uno de los pines
de estado y tierra. Encontrarás que cada uno de ellos se encuentra a +5V. Veamos que valor
lee el ordenador para esta combinación de tensiones eléctricas en el registro de estado. Entra
en el BASIC y teclea el siguiente comando;
A = INP (&H379)
(donde &H379 es la dirección hexadecimal de registro de
estado)
PRINT A.
Observarás como el valor que devuelve el programa es 127.
NOTA: Te preguntarás de donde sale este valor. Teniendo en cuenta que el Bit E7 del
registro de datos se lee invertido y que los bits no utilizables E0, E1 y E2 están a uno,
el valor del registro de estado será de 11111111 (que se corresponde con el número
decimal 255) sin embargo el ordenador lee el número 01111111, es decir el número
decimal 127. En ciertos equipos los bits E0, E1 y E2 están a cero y el valor leído es
120.
Programación de placas de control
26
Ahora conecta cada uno de los pines de salida del registro de estado a masa a través
de resistencias de 150 Ω tal como se indica en el esquema de la Figura 10. Mide de nuevo las
tensiones entre estos y masa. Observarás como ahora las tensiones son de 0 V. Veamos
ahora que valor lee ahora el ordenador para el registro de estado. Teclea de nuevo:
A = INP (&H379)
PRINT A
El valor devuelto ahora es de 135.
Ahora el registro de estado tiene el valor 00000111 (que se corresponde con el valor
decimal 7), sin embargo el ordenador lee el valor 10000111, correspondiente al valor
decimal 135.
Si repetimos la misma operación conectando o desconectando de masa cada una de
las cinco resistencias (esto puede hacerse más cómodamente intercalando interruptores)
obtendremos para cada combinación un valor diferente que puede ser leído por el ordenador.
Esta es sin más la forma que tiene el ordenador de captar estímulos externos. Así, los
interruptores pueden sustituirse por pulsadores normalmente abiertos o cerrados que a modo
de finales de carrera pueden ser activados por algún dispositivo mecánico.
El que el puerto de estado tenga por defecto todos sus pines a +5V (valor 127 en el
registro de estado) supone una ventaja dado que es suficiente con poner a masa el pin
correspondiente para enviar un dato al ordenador evitándose así fuentes de alimentación
externas. Sin embargo, podemos encontrarnos con ordenadores (generalmente modelos
Programación de placas de control
27
antiguos) que no proporcionan por defecto estas tensiones. Esto significa que alguno de sus
pines se encuentran a + 0V, siendo necesaria la operación inversa para que ocurra la captación
del estímulo, esto es, ponerlos a + 5V. Esto puede realizarse también utilizando pulsadores
mediante el circuito indicado en la Figura 11. El inconveniente es que en este caso es
necesaria una fuente de alimentación externa. El circuito de la Figura 10 incorpora el regulador
CI 7805 que proporciona una tensión estabilizada de + 5 V a la salida de la fuente.
Programación de placas de control
•
28
SEÑALES ELÉCTRICAS DE ENTRADA EN EL PUERTO DE ESTADO.
El procedimiento anterior, que utiliza finales de carrera o pulsadores, es fácil de construir, sin
embargo, la forma más versátil de comunicar estímulos externos al ordenador es haciendo uso
de señales eléctricas que pueden proceder en general de circuitos integrados, de sensores u
otros circuitos. Una forma de hacer esto es utilizando un transistor trabajando en conmutación
tal y como se muestra en los circuitos A y B de la Figura 12. Es evidente que en el segundo
caso será necesaria una fuente de tensión regulada de + 5
V. El circuito C ofrece la posibilidad de convertirse tanto en el A como en el B con tan solo abrir
o cerrar el interruptor. Los circuitos integrados TTL tienen en sus salidas una estructura
denominada “totem pole” que actúan de la misma manera que estos circuitos de conmutación
con transistores, es decir, son capaces de poner a masa o a la tensión de la fuente los pines
del puerto de estado por tanto es recomendable usar uno de estos integrados. En general es
común el uso de CI buffer como por ejemplo el CI 74245. El circuito buffer actúa como
separador protegiendo al puerto de sobreintensidades ya que se comporta como si fuera un
fusible eléctrico. El CI necesita una alimentación regulada de + 5 V y además las señales de
entrada al CI también deben proceder de una fuente de tensión regulada de + 5V. En la Figura
13 se indica el circuito correspondiente. Las salidas en totem pole del buffer se encargan de
poner a masa o a + 5 V los pines del registro de estado reproduciendo fielmente las señales
eléctricas en sus entradas.
Programación de placas de control
•
29
LECTURA DE SEÑALES DE ENTRADA EN EL PUERTO DE ESTADO.
Para leer los datos de entrada por el puerto de estado utilizaremos la instrucción INP
(&H379) del BASIC, donde &H379 es la dirección de registro de estado. En general será
necesario en muchos proyectos que el ordenador esté continuamente leyendo el puerto
(sondeo o polling) para tomar en un momento dado la decisión oportuna. Para ello utilizamos
un bucle, es decir una secuencia indefinida y repetitiva de instrucciones. Esto puede hacerse
con las instrucciones DO y LOOP. Sin embargo, debemos también prever la salida del bucle
para tener siempre el programa bajo nuestro control. Así, activamos la tecla F1 con la
instrucción KEY(1) ON de modo que al pulsarla deriva el programa hacia la subrutina FIN.
REM*******LECTURA DEL PUERTO DE ESTADO*********
KEY(1) ON
ON KEY(1) GOSUB FIN
T = 5000
GOSUB BUCLE
BUCLE:
DO
CALL PAUSA (T)
A = INP (&H379)
LOCATE 10, 10: PRINT A
LOOP
END
SUB PAUSA(T)
Programación de placas de control
30
FOR X = 0 TO T
NEXT X
END SUB
FIN:
CLS
END
El valor de T fija el tiempo de captura de datos. Este tiempo depende también de la
velocidad del microprocesador. El programa visualiza el valor del registro de estado (variable A)
en pantalla, sin embargo frecuentemente es útil intercalar dentro del bucle una sentencia
condicional del tipo SI “A” TOMA UN DETERMINADO VALOR ENTONCES IR A LA
SUBRUTINA X.
IF A = 135 THEN GOSUB SALIDA
SALIDA:
OUT &H378, 1
END
En este caso, si A toma el valor 135 envía el byte (00000001) al del puerto de datos.
•
ENTRADAS DIGITALES.
Sabemos ya como detectar estímulos externos. Para ello simplemente leemos el
registro de estado usando un bucle. Sin embargo, en general es conveniente tratar a cada una
de las entradas digitales como si fueran canales independientes. Dado que el registro de
estado posee el bit E7 invertido y además los bits E2, E1 y E0 no responden a ningún estímulo,
ya que no pueden utilizarse, los valores leídos no guardan a priori una relación lógica con las
señales presentes en las entradas. Para racionalizar los valores leídos debemos conseguir
primeramente que el ordenador lea el número decimal que se corresponde con las entradas
activas. Para ello debemos alterar mediante programación la estructura del byte de estado.
Esto se denomina “enmascaramiento”. Supongamos que queremos diseñar un interface con 4
entradas digitales y que vamos a utilizar para este fin los bits E4, E5, E6 y E7 del registro de
estado. El procedimiento a seguir es el siguiente:
Programación de placas de control
31
Primeramente deshacemos la inversión del bit E7 del registro de estado haciendo uso del
operador booleano XOR.
E7
E6
E5
E4
E3
E2
E1
E0
0
0
0
0
E3
E2
E1
E0
XOR
1
0
0
0
||
E7
E6
E5
E4
A = INP (&H379)
A% = A XOR 128
Seguidamente seleccionamos los 4 últimos bits del registro. Para ello usaremos el
operador booleano AND:
E7
E6
E5
E4
E3
E2
E1
E0
0
0
0
0
0
0
0
0
AND
1
1
1
1
||
E7
E6
E5
E4
AA% = A% AND 240
La lectura del byte virtual AA% devuelve el valor 16 cuando la entrada E4 esta a uno,
32 cuando la entrada E5 esta a uno, 64 cuando la entrada E6 esta a uno ó 128 cuando la
entrada E7 esta a uno. Del mismo modo si las entradas E5 y E4 están a uno, el ordenador
leerá el valor decimal correspondiente 32 + 16 = 48. Ahora el valor leído si puede racionalizarse
de modo que es posible saber qué entradas está activas y cuales no.
Programación de placas de control
•
32
AMPLIACIÓN DE ENTRADAS DIGITALES.
El número de entradas digitales puede ampliarse a un valor mayor que los 5 bits disponibles en
el registro de estado mediante un multiplexor. Consideremos el caso de un interface con 8
entradas digitales (ver Figura 14).
El CI 74157 es un multiplexor de 8 entradas a 4 salidas de dos canales que multiplexa
las 8 señales de 4 en 4 haciendo uso del pin de selección A/B. Cuando A/B = 0 deja paso a los
4 primeros datos (A-1, A-2, A-3, A-4) mientras que cuando A/B = 1, a los 4 restantes (B-1, B-2,
B-3, B-4). Por tanto solo serán necesarios 4 de los 5 bits del puerto de estado. En este caso
seleccionaremos los bits E7 E6 E5 y E4. Debemos crear ahora un byte virtual con los 8 datos
de entrada. El proceso de enmascaramiento se muestra a continuación.
Primeramente deshacemos la inversión del bit E7 del registro de estado.
E7
E6
E5
E4
E3
E2
E1
E0
0
0
0
0
E3
E2
E1
E0
XOR
1
0
0
0
||
E7
E6
E5
E4
Programación de placas de control
33
A = INP (&H379)
A% = A XOR 128
Seleccionamos los 4 últimos bits del registro. Para ello usaremos el operador booleano
AND:
E7
E6
E5
E4
E3
E2
E1
E0
0
0
0
0
0
0
0
0
AND
1
1
1
1
||
E7
E6
E5
E4
AA% = A% AND 240
Multiplexaremos primero los bits impares y seleccionamos cada uno de ellos mediante
multiplicación lógica del nibble superior (4 bits superiores) del registro de estado con los bytes
16, 32, 64 y 128.
E7
E6
E5
E4
0
0
0
0
1
0
0
0
0
E4
0
0
0
0
AND
0
0
0
||
0
0
0
A1 = (AA% AND 16)/16
Y así sucesivamente con los bits siguientes.
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
Programación de placas de control
34
Seguidamente se da la orden de lectura del segundo cuarteto correspondiente a los
bits pares, A/B = 1, para lo cuál se usa el bit de control C1 mediante la instrucción CALL
CONTROL (2) y se realiza el mismo proceso de enmascaramiento descrito.
BB% = B% AND 240
BB% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
Seguidamente se convierte a decimal el byte total mediante la fórmula de conversión
correspondiente:
A7
B6
A5
B4
A3
B2
A1
B0
SUMA% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
A continuación se muestra el procedimiento completo.
REM****PROGRAMA DE LECTURA DE 8 ENTRADAS DIGITALES****
SUB LEEDIGITAL (T)
SHARED DIGITAL%
REM*********PUESTA A CERO DEL MULTIPLEXOR************
CALL CONTROL (0)
REM **************LECTURA DE BITS IMPARES**************
A = INP (&H379)
A% = A XOR 128
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (2)
REM **************LECTURA DE BITS PARES******************
B = INP (&H379)
B% = B XOR 128
AA% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
Programación de placas de control
35
REM *****************RESULTADO DE LA CONVERSION*********
DIGITAL% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
END SUB
El siguiente programa monitoriza en tiempo real los datos procedentes de las 8
entradas digitales (variable DIGITAL%). Para ello el programa lee continuamente el puerto de
estado con el procedimiento creado SUB LEEDIGITAL mediante un bucle. Para no perder el
control del programa se activa la tecla F1 mediante el comando KEY(1) ON de modo que
cuando sea pulsada deriva el programa hacia la subrutina FIN.
REM*****PROGRAMA DE LECTURA DE 8 ENTRADAS DIGITALES***********
CLS
KEY(1) ON
ON KEY(1) GOSUB FIN
T = 10000
REM********************BUCLE DE LECTURA*******************
DO
CALL LEEDIGITAL (T)
LOCATE 10, 10
PRINT DIGITAL%
LOOP
REM***********SUBRUTINA DE FINALIZACIÓN DE PROGRAMA********
FIN:
CLS
END
•
LECTURA DE ENTRADAS DIGITALES COMO LÍNEAS INDEPENDIENTES.
En el apartado anterior hemos desarrollado un procedimiento de lectura que visualiza el
número decimal que corresponde en cada momento al valor que toma el byte virtual
DIGITAL%, el cual depende del estado de cada una de las 8 las entradas. Sin embargo, si lo
que pretendemos es usar las entradas como líneas independientes debemos completar el
procedimiento con las siguientes sentencias:
E0% = DIGITAL% AND 1
E1% = (DIGITAL% AND 2)/2
E2% = (DIGITAL% AND 4)/4
E3% = (DIGITAL% AND 8)/8
E4% = (DIGITAL% AND 16)/16
E5% = (DIGITAL% AND 32)/32
E6% = (DIGITAL% AND 64)/64
E7% = (DIGITAL% AND 128)/128
Programación de placas de control
36
Las nuevas variables denominadas E0%, E1%, E2%, E3%, E4%, E5%, E6% y E7%
resultan de la multiplicación lógica del byte virtual denominado DIGITAL% con los
correspondientes números binarios 00000001, 00000010, 00000100, 00001000, 00010000,
00100000, 0100000, 1000000. Veamos ahora la forma de usar esto en la práctica.
Supongamos por ejemplo que queremos que el ordenador responda emitiendo en la salida el
dato 255 sólo si las entradas 1, 3 y 8 están activadas simultáneamente. En tal caso
escribiremos la siguiente sentencia:
IF E1% = 1 AND E3% = 1 AND E8% = 1 THEN OUT &H378, 255
Por el contrario, si queremos que se realice lo mismo pero solo si alguna de las
entradas 1, 3 o 8 están activadas entonces la sentencia correcta será:
IF E1% = 1 OR E3% = 1 OR E8% = 1 THEN OUT &H378, 255
En donde hemos cambiado el operador booleano AND por OR.
El procedimiento SUB LEEDIGITAL queda ahora modificado de la siguiente forma:
REM****PROGRAMA DE LECTURA DE 8 ENTRADAS DIGITALES****
REM****************COMO LÍNEAS INDEPENDIENTES******************
SUB CLEEDIGITAL (T)
SHARED DIGITAL%, E0%, E1%, E2%, E3%, E4%, E5%, E6%, E7%
REM*********PUESTA A CERO DEL MULTIPLEXOR************
CALL CONTROL (0)
REM **************LECTURA DE BITS IMPARES**************
A = INP (&H379)
A% = A XOR 128
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (2)
REM **************LECTURA DE BITS PARES******************
B = INP (&H379)
B% = B XOR 128
AA% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
Programación de placas de control
37
REM *****************RESULTADO DE LA CONVERSION*********
DIGITAL% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
E0% = DIGITAL% AND 1
E1% = (DIGITAL% AND 2)/2
E2% = (DIGITAL% AND 4)/4
E3% = (DIGITAL% AND 8)/8
E4% = (DIGITAL% AND 16)/16
E5% = (DIGITAL% AND 32)/32
E6% = (DIGITAL% AND 64)/64
E7% = (DIGITAL% AND 128)/128
END SUB
En la sentencia SHARED deben introducirse las nuevas variables E0%, E1%, E2%,
E3%, E4%, E5%, E6% y E7% para poder ser leídas fuera del procedimiento SUB
CLEEDIGITAL.
El siguiente programa lee las entradas digitales y toma una decisión en función de las
líneas activas.
REM*********PROGRAMA DE LECTURA CONDICIONADA*******
REM****************DE 8 ENTRADAS DIGITALES******************
CLS
KEY(1) ON
ON KEY(1) GOSUB FIN
T = 10000
REM********************BUCLE DE LECTURA*******************
DO
CALL CLEEDIGITAL (T)
IF E0% = 1 AND E1% = 1 THEN OUT &H378, 255
IF E2% = 1 OR E3% = 1 THEN OUT &H378, 0
LOOP
REM***********SUBRUTINA DE FINALIZACIÓN DE PROGRAMA********
FIN:
CLS
END
El programa lee continuamente las 8 líneas de entrada digitales mediante el bucle
DO/LOOP y el procedimiento SUB CLEEDIGITAL. Si las entradas E0% y E1% están activas
simultáneamente el programa activa las 8 líneas de salida, mientras que si alguna de las
entradas E2% o E3% están activas las pone a nivel bajo.
Programación de placas de control
•
38
ENTRADAS ANALÓGICAS.
El puerto de estado solo es capaz de reconoce señales digitales, es decir, solo
diferencia entre dos estados, alto y bajo. Sin embargo, en muchas ocasiones será necesaria la
lectura de señales analógicas, como por ejemplo la tensión entre los terminales de un
potenciómetro o de un sensor. En este caso es necesario realizar un procedimiento previo de
conversión de la señal analógica (voltaje procedente del potenciómetro o sensor) en una señal
digital apta para ser leída en el puerto. Este paso previo lo realiza un CI denominado conversor
analógico digital (A/D). Aquí se utilizará el CI ADC0804. Un convertidor analógico digital como
el ADC0804 (el más barato de la familia del 0801, el 0802 y el 0803) codifica en 8 bits (salida
en paralelo a través del bus D0-D7) con precisión de un bit, la señal diferencial presente entre
sus terminales de entrada IN(+) e IN(-), donde IN(-) es una tensión fija que corresponde al valor
más pequeño del rango de voltaje de entrada, generalmente cero y IN(+) es la señal analógica
de entrada a convertir, que puede variar entre distintos márgenes siendo lo normal que oscile
entre 0 V y la tensión de alimentación del integrado.
Si la señal de entrada en IN(+) oscila entre 0 V y la tensión de alimentación Vcc (que puede variar entre
+4.5V y 6.3V, siendo +5V el valor nominal), los pines ANLG GND, IN(-) se conectan a masa y el pin REF/2 se deja en
circuito abierto. Sin embargo, en el caso más general el rango de voltajes de entrada puede no ser igual a Vcc y
además puede que el menor valor de voltaje de entada no sea cero. En este caso, en IN(-) se aplica una tensión igual
al valor más pequeño del rango de voltaje de entrada, en IN(+) se aplica la señal analógica a convertir y en REF/2, se
aplica una tensión igual a la mitad del rango máximo de voltaje de entrada. Por ejemplo, si las tensiones de entrada
varían entre 0.5 V y 3.5 V, se aplica una tensión de 0.5 V en IN(-), en IN(+) se aplica la señal analógica de entrada y
en REF/2 se aplica una tensión de (3.5 – 0.5)/2 = 1.5.
Este tipo de conversores de bajo coste basan su medición en aproximaciones
sucesivas al valor digital a partir del valor analógico; su medición, por lo tanto, no es
instantánea y requieren que se les proporcione una señal de reloj para su funcionamiento (para
el proceso de aproximaciones sucesivas al valor digital).
Para generar la señal de reloj se usa una red RC que conectada a los terminales CLK
OUT y CLK IN provocan que en CLK OUT tengamos una señal cuadrada entre 640 KHz y 1
MHz (cuanto mayor sea la frecuencia, siempre que esté por debajo del máximo soportado,
menor será el tiempo de conversión). La fórmula del cálculo de la frecuencia es f = 1/(R·C·k)
donde “k” es un factor dependiente del fabricante del integrado (el valor típico es de k = 1,3). En
cada uno de los pasos o comparaciones del proceso de aproximación, el integrado calcula un
nuevo bit del resultado digital, necesitando 8 pasos para alcanzar la conversión completa.
Programación de placas de control
39
El esquema fundamental de un conversor analógico digital de aproximaciones sucesivas se muestra en la
siguiente figura:
Básicamente consta de un circuito de captura y mantenimiento (S & H) que retiene la señal de entrada Vi, el
tiempo suficiente para ser procesada, un comparador, un circuito de aproximaciones sucesivas, un conversor
Digital/Analógico y buffers de salida. El registro de aproximaciones sucesivas comienza poniendo a 1 el bit de más
peso (MSB), quedando el resto a cero, o sea, forma el valor 1000…0, que corresponde a la mitad de la máxima
excursión de la tensión de entrada. Este valor es transformado a señal analógica, Vc, por el conversor D/A, que a su
vez se introduce en el comparador.
Si la señal Vc es mayor que la señal de entrada Vi, esta será inferior a Vfondo/2 y el comparador bascula dando
lugar a una señal que hace que el registro varíe su contenido, sustituyendo el 1 del bit de más peso por un 0 y
colocando en el bit de peso inmediatamente inferior un 1, quedando inalterado el resto de los bits (0100…0).
Si la señal Vc fuese menor que Vi, esta será mayor que Vfondo/2 y el registro no modifica el bit de más peso,
pero coloca el bit de peso inmediatamente inferior a 1, dejando a 0 el resto de los bits (1100…0). Tanto en un caso
como en otro, se efectúa una nueva conversión D/A y luego se modifica el registro con el mismo criterio. El proceso se
repite n veces, siendo n el número de bits del registro de aproximaciones sucesivas, hasta alcanzar el bit de menos
peso (LSB).
En la figura se representan los valores que adoptarían los distintos bits del registro de aproximaciones
sucesivas (de 5 bits), para una cierta tensión de entrada Vi, así como la tensión de salida del conversor D/A. También
sobre dicha figura se indica el momento tSALIDA, para el cual el circuito de control dar vía libre a los buffers para entregar
a la salida la señal digitalizada.
Programación de placas de control
40
Las señales de ADC se gestionan de la siguiente manera. Si mantenemos en integrado
siempre seleccionado (Chip Select, CS = 0) debemos inicialmente ordenarle que comience la
conversión (provocando un flanco de subida en WR). Cuando termine el proceso de
aproximaciones sucesivas (esto ocurre en menos de 100 microsegundos después del flanco de
subida de WR), el ADC nos avisa poniendo
su terminal de salida INTR a cero. En este
momento ya podemos ordenarle leer RD = 0, y en el bus de salida D0-D7 tendremos el valor
digital medido (el cuál desaparecerá poco después de revocar la orden de lectura poniendo RD
a 1), ver diagrama de tiempo en la Figura 15.
La señal RD sirve para controlar el
funcionamiento del latch interno que el convertidor tiene en el bus de salida, si está a cero
tendremos permanentemente a la salida el valor digital fruto de la conversión. Por otro lado, si
las lecturas van a ser muy lentas comparadas con los 100 microsegundos, no necesitaremos
leer INTR para saber si ya se produjo la conversión. Cuando mantenemos CS y RD a nivel alto
simultáneamente el bus de salida permanece en estado de alta impedancia (triestado) lo cuál
es equivalente a un desconexión eléctrica del bus. El conversor puede trabajar en modo libre
(free-running mode) es decir sin señales externas que lo gobiernen, conectando INTR a la
entrada WR manteniendo CS = 0.
Programación de placas de control
41
La operación de lectura se realiza enviando un pulso de subida a la patilla de inicio de
conversión WR del convertidor mediante el bit C0 del puerto de control (ver diagrama de
tiempos Figura 15).
CALL CONTROL (0)
CALL PAUSA (T)
Programación de placas de control
42
CALL CONTROL (1)
CALL PAUSA (T)
Una vez que sabemos como leer los datos de salida del conversor se nos presenta el
problema de como introducir las 8 señales del bus de salida D0-D7 en el puerto de estado para
ser leídas, teniendo en cuenta que éste solo tiene 5 bits de entrada efectivos. Este problema lo
hemos resuelto ya en el apartado anterior mediante un multiplexor de 8 entradas a 4 salidas de
dos canales tal como el CI 74157. Este integrado multiplexa las 8 señales de 4 en 4 haciendo
uso de la pata de selección A/B. Cuando A/B = 0 deja paso a los 4 primeros datos mientras
que cuando A/B = 1, a los 4 restantes. Por tanto solo serán necesarios 4 de los 5 bits del
puerto de estado. En este caso seleccionaremos los bits E7 E6 E5 y E4. El bit restante E3
puede usarse cuando sea necesario para leer la señal INTR de fin de conversión. Dada la
inversión del bit E7 del registro de estado y el hecho de que no se utiliza todo el byte, se
deberá proceder a enmascarar los correspondientes bits según se indica.
Primeramente deshacemos la inversión del bit E7 del registro de estado.
E7
E6
E5
E4
E3
E2
E1
E0
0
0
0
0
E3
E2
E1
E0
XOR
1
0
0
0
||
E7
E6
E5
E4
A = INP (&H379)
A% = A XOR 128
Seleccionamos los 4 últimos bits del registro. Para ello usaremos el operador booleano
AND:
E7
E6
E5
E4
E3
E2
E1
E0
0
0
0
0
AND
1
1
1
1
||
Programación de placas de control
E7
E6
E5
43
E4
0
0
0
0
AA% = A% AND 240
Multiplexaremos primero los bits impares seleccionando cada uno de ellos mediante
multiplicación lógica del nibble superior del registro de estado con los bytes 16, 32, 64 y 128.
E7
E6
E5
E4
0
0
0
0
1
0
0
0
0
E4
0
0
0
0
AND
0
0
0
||
0
0
0
A1 = (AA% AND 16)/16
Y así sucesivamente con los bits siguientes.
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
Seguidamente se da la orden de lectura del segundo cuarteto correspondiente a los
bits pares, A/B = 1, para lo cuál se usa el bit de control C1 mediante la instrucción CALL
CONTROL (2) y se realiza el mismo proceso de enmascaramiento descrito.
BB% = B% AND 240
BB% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
Seguidamente se convierte a decimal el byte total mediante la fórmula de conversión
correspondiente:
Programación de placas de control
A7
B6
A5
44
B4
A3
B2
A1
B0
ANALOGICO% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
El procedimiento completo es el siguiente:
REM****PROGRAMA DE LECTURAS ANALOGICAS DEL CONVERSOR ADC0804****
SUB LEEANALOG (T)
SHARED ANALOGICO%
REM*********PULSO DE CONTROL // WR (C0) //INICIO DE CONVERSIÓN************************
REM*********************Y PUESTA A CERO DEL MULTIPLEXOR************
CALL CONTROL (0)
CALL PAUSA (T)
CALL CONTROL (1)
CALL PAUSA (T)
REM **************LECTURA DE BITS IMPARES**************
A = INP (&H379)
A% = A XOR 128
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (2)
CALL PAUSA(T)
REM **************LECTURA DE BITS PARES******************
B = INP (&H379)
B% = B XOR 128
BB% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
REM *****************RESULTADO DE LA CONVERSION*********
ANALOGICO% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
END SUB
T representa la temporización entre pulsos. La sentencia SHARED ANALOGICO%
permite leer el valor de la variable ANALOGICO% fuera del procedimiento.
El circuito correspondiente se muestra en la Figura 15. El condensador en la entrada
analógica INT(+) (pin 6) filtra la señal de entrada consiguendo lecturas mas estables.
Programación de placas de control
45
El siguiente programa monitoriza en tiempo real los datos procedentes de un
potenciómetro. Para ello el programa lee continuamente el puerto de estado con el
procedimiento creado SUB LEEANALOG mediante un bucle. Al igual que en casos anteriores
se sale del bucle pulsando la tecla F1.
REM*****PROGRAMA DE LECTURA DE DATOS ANALÓGICOS***********
CLS
KEY(1) ON
ON KEY(1) GOSUB FIN
T = 10000
REM********************BUCLE DE LECTURA*******************
DO
CALL LEEANALOG (T)
LOCATE 10, 10
PRINT ANALOGICO%
LOOP
REM***********SUBRUTINA DE FINALIZACIÓN DE PROGRAMA********
FIN:
CLS
END
•
AMPLIACIÓN DE CANALES.
El conversor ADC0804 posee un solo canal por el cuál recibe la tensión que va a ser
convertida en una señal digital. Esto es un inconveniente cuando lo que se desea es
monitorizar datos procedentes de diferentes sensores. Existen convertidores analógico digitales
tal como el ADC0808 que incorporan entre sus circuitos un multiplexor que amplía
(generalmente a 8) el número de canales. Mediante tres entradas de selección puede elegirse
el canal de entrada que se desee. Cuando el conversor no dispone de esta opción se puede
hacer uso de un multiplexor analógico conectado externamente al conversor. Debe quedar
claro que el multiplexor debe ser analógico y no digital ya que debe respetar en todo momento
la forma de la señal de entrada. El multiplexor analógico 74VHC4051 posee 8 canales con tres
entradas de selección que provee de 8 entradas analógicas al conversor ADC0804 según el
circuito que se muestra en la Figura 16. La selección del canal de entrada se realiza mediante
los tres primeros bits del puerto de datos D0, D1 y D2.
El siguiente programa lee consecutivamente los datos analógicos procedentes de 5
sensores conectados al multiplexor. Previamente debemos modificar ligeramente el
procedimiento SUB LEEANALOG para incluir la orden de selección de canal de lectura. Como
las entradas de selección están conectadas a los bits D0, D1 y D2 de puerto de datos debemos
Programación de placas de control
46
añadir la sentencia OUT &H378, CANAL, donde CANAL representa un número comprendido
entre 0 y 7.
REM*****PROCEDIMIENTO DE SELECCIÓN DE CANAL Y LECTURA*******
SUB LEEANALOG (CANAL, T)
SHARED ANALOGICO%
REM********SELECCIÓN DE CANAL ANALÓGICO********
OUT &H378, CANAL
.
.
.
.
.
el resto es igual
END SUB
REM********ESTE PROGRAMA MONITORIZA DATOS DE 5 CANALES*******
CLS
KEY(1) ON
ON KEY(1) GOSUB FIN
T = 50000
REM********BUCLE DE LECTURA****************************
DO
REM********BUCLE DE SELECCIÓN DE CANAL**********
FOR X = 0 TO 4
CALL LEEANALOG (X, T)
PRINT ANALOGICO%,
NEXT X
LOOP
REM*************SUBRUTINA DE FINALIZACIÓN************
FIN:
CLS
END
Programación de placas de control
47
Hay que decir que el mal ajuste del valor de temporización T, puede dar lugar a
lecturas erróneas.
•
INTERFACE 8 x 8 x 8. 8 ENTRADAS DIGITALES 8 ENTRADAS ANALÓGICAS Y 8
SALIDAS DIGITALES.
Hasta ahora hemos estudiado de forma individual los circuitos correspondientes y los
programas de control para obtener 8 salidas digitales, 8 entradas digitales y 8 entradas
analógicas. En general será interesante diseñar un interface que incluya las tres opciones.
Pensemos por ejemplo en el control de una grúa. El eje de un potenciómetro solidario con el
eje de giro de la grúa nos da la posición del brazo (variable analógica), mientras que un final de
carrera nos informa de que la carga ha llegado al final del recorrido (variable digital). Es
necesario por tanto que el ordenador esté continuamente leyendo una entrada analógica y una
digital. Además, en función de esta lectura el ordenador puede activar o desactivar los motores
de giro de la grúa y de subida y bajada de la carga haciendo uso de las salidas. En definitiva
son necesarias las tres opciones para realizar el control. Esto se puede conseguir coordinando
los tres circuitos separados mediante las 4 líneas de control C0, C1, C2 y C3 y haciendo uso
del triestado de los integrados involucrados. La función de las líneas de control se describe a
continuación.
Línea C0: emite el pulso de subida de inicio de conversión WR al conversor analógico
digital ADC0804, por lo tanto sólo está activa cuando el ordenador está leyendo entradas
analógicas.
Linea C1: emite la señal de selección de canal del multiplexor 74157 (pin A/B).
Programación de placas de control
48
Línea C2: selecciona la lectura digital o analógica haciendo uso del triestado de los CI
74245 y ADC0804. Cuando el pin OE (output enable) del buffer 74245 está a uno se activa el
triestado actuando como si estuviera desconectado del circuito, mientras que cuando está a
cero realiza su función normal (estados alto ó bajo). Del mismo modo cuando las dos entradas
del conversor ADC0804, CS y RD están a uno activan el triestado (ver diagrama de tiempos),
mientras que cuando están a cero introducen al conversor dentro del circuito. Dado que las 8
líneas de salida del buffer 74245 y convertidor ADC0804 se unen para posteriormente atacar el
multiplexor 74157 ambos componentes no puede estar simultáneamente activados, por ello la
activación de uno supone la desactivación del otro. Esto se consigue mediante puertas
inversoras las cuales se implementan con puertas NAND 7400 según se indica en el esquema
de la Figura 17. Cuando la línea C2 esta a cero esta activado el triestado del buffer 74245 y
conectado el ADC0804. Cuando la línea C2 esta a uno ocurre lo contrario.
Línea C3: emite el pulso de subida a la señal de reloj CLK del latch octal 74374 que
permite el acceso de datos desde el puerto de datos. Hay que asegurar el bloqueo del latch
cuando se usan las líneas D0, D1 y D2 para seleccionar el canal analógico del multiplexor.
Los procedimientos vistos anteriormente deberán ser ligeramente modificados para
tener en cuenta esta selección particular de las líneas de control.
Programación de placas de control
49
Programación de placas de control
50
ANEXOS
Programación de placas de control
PROCEDIMIENTOS DE CONTROL DEL INTERFACE 8 SALIDAS X 8 ENTRADAS
DIGITALES X 8 ENTRADAS ANALÓGICAS
51
Programación de placas de control
•
PROCEDIMIENTOS DE CONTROL DEL INTERFACE 8 SALIDAS X 8 ENTRADAS
DIGITALES X 8 ENTRADAS ANALÓGICAS.
-
PROCEDIMIENTO DE SALIDA DE DATOS.
52
REM**************PROCEDIMIENTO DE SALIDA DE DATOS*********************
SUB SALIDA(M7, M6, M5, M4, M3, M2, M1, M0)
SALIDA% = M0*1 OR M1*2 OR M2*4 OR M3*8 OR M4*16 OR M5*32 OR M6*64 OR M7*128
OUT &H378, SALIDA%
REM**********PULSO DE SUBIDA// CLK// AL LATCH 74374**************************
CALL CONTROL (0)
CALL PAUSA (T)
CALL CONTROL (8)
END SUB
Las sentencias CALL CONTROL (0) y CALL CONTROL (8) emiten el pulso de subida
que controla el acceso del dato SALIDA% al CI 74374.
-
PROCEDIMIENTO DE LECTURA DE ENTRADAS DIGITALES.
REM****PROGRAMA DE LECTURA DE 8 ENTRADAS DIGITALES****
REM****************COMO LÍNEAS INDEPENDIENTES******************
SUB CLEEDIGITAL (T)
SHARED DIGITAL%, E0%, E1%, E2%, E3%, E4%, E5%, E6%, E7%
REM**************SELECCIÓN DE LECTURA DIGITAL// C2//************
REM*****Y PUESTA A CERO DEL MULTIPLEXOR 74157 //A/B//************
CALL CONTROL (4)
CALL PAUSA (T)
REM **************LECTURA DE BITS IMPARES**************
A = INP (&H379)
A% = A XOR 127
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (6)
CALL PAUSA (T)
REM **************LECTURA DE BITS PARES******************
B = INP (&H379)
B% = B XOR 127
AA% = B% AND 240
Programación de placas de control
53
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
REM *****************RESULTADO DE LA CONVERSION*********
SUMA% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
DIGITAL% = SUMA% XOR 255
E0% = DIGITAL% AND 1
E1% = (DIGITAL% AND 2)/2
E2% = (DIGITAL% AND 4)/4
E3% = (DIGITAL% AND 8)/8
E4% = (DIGITAL% AND 16)/16
E5% = (DIGITAL% AND 32)/32
E6% = (DIGITAL% AND 64)/64
E7% = (DIGITAL% AND 128)/128
END SUB
Dado que la selección de lectura Digital/Analógica se realiza con el bit C2 (nivel alto) y
la señal de selección de canal A/B del multiplexor 74157 con el bit C1, las correspondientes
señales de control del puerto de datos serán 0100 y 0110 que se corresponden con los valores
decimales 4 y 6.
-
PROCEDIMIENTO DE LECTURAS ANALÓGICAS.
REM****PROGRAMA DE LECTURAS ANALOGICAS DEL CONVERSOR ADC0804****
SUB LEEANALOG (CANAL, T)
SHARED ANALOGICO%
REM***SELECCIÓN DE CANAL ANALÓGICO Y DE LECTURA ANALÓGICA //C2//*****
CALL CONTROL (0)
OUT &H378, CANAL
CALL CONTROL (0)
REM*********PULSO DE CONTROL // WR (C0) //INICIO DE CONVERSIÓN************
CALL CONTROL (0)
CALL PAUSA (T)
CALL CONTROL (1)
CALL PAUSA (T)
REM **************LECTURA DE BITS IMPARES**************
A = INP (&H379)
A% = A XOR 127
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
Programación de placas de control
54
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (2)
CALL PAUSA(T)
REM **************LECTURA DE BITS PARES******************
B = INP (&H379)
B% = B XOR 127
AA% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
REM *****************RESULTADO DE LA CONVERSION*********
SUMA% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
ANALOGICO% = SUMA% XOR 255
END SUB
La sentencia CALL CONTROL(0) después de la instrucción de selección de canal OUT
&H378, CANAL, asegura que el dato representado por la variable CANAL no acceda al latch
74374 lo cuál falsería las salidas del interface. Las señales de control involucradas en este
procedimiento son C0 (WR), C1 (A/B) y C2 (nivel bajo) para la selección de lectura analógica.
Las señales emitidas por el puerto de control son 0000, 0001, 0010 que se corresponden con
los valores decimales, 0, 1 y 2.
-
PROGRAMA DE CHEQUEO DEL INTERFACE 8 x 8 x 8. “INTERFA.BAS”
A continuación se muestra el código fuente de un programa que chequea el
funcionamiento del interface descrito.
REM *********PROGRAMA DE VERIFICACIÓN DEL INTERFACE 8X8X8**************
REM*****************************PROGRAMA PRINCIPAL*********************************
REM ************************VALOR DE TEMPORIZACIÓN “T” ****************************
T = 10
REM****BUSQUEDA DE LAS DIRECCIONES DE LOS REGISTROS******
DEF SEG = 0
LPT1 = PEEK(&H408) + 256*PEEK(&H409)
GOSUB MENU
MENU:
CLS
KEY(1) OFF
LOCATE 4, 10: PRINT” *************CHEQUEO DEL INTERFACE********
LOCATE 6, 15: PRINT ”Temporización.................................................1”
Programación de placas de control
LOCATE 8, 15: PRINT ”Manual.............................................................2”
LOCATE 10, 15: PRINT ”Entradas digitales............................................3”
LOCATE 12, 15: PRINT ”Entradas analógicas........................................4”
LOCATE 14, 15: PRINT ”Salidas.............................................................5”
LOCATE 16, 15: PRINT ”Salir..................................................................6”
LOCATE 18, 15: INPUT “Selecciona una opción”; OPCION
IF OPCION = 1 THEN GOSUB TEMP
IF OPCION = 2 THEN GOSUB MANUAL
IF OPCION = 3 THEN GOSUB DIGITAL
IF OPCION = 4 THEN GOSUB ANALOGICO
IF OPCION = 5 THEN GOSUB SALIDAS
IF OPCION = 6 THEN GOSUB FIN
END
REM***********************SUBRUTINAS Y PROCEDIMIENTOS******************************
REM***************SUBRUTINA DE CAMBIO DE VALOR DE TEMPORIZACIÓN**********
TEMP:
CLS
PRINT” EL VALOR ACTUAL DE TEMPORIZACIÓN ES T = 10
INPUT”¿DESEA CAMBIAR ESTE VALOR POR DEFECTO (SI/NO)”; OPCION$
IF OPCION$ = “NO” THEN GOSUB MENU
CLS
INPUT”INTRODUCE EL NUEVO VALOR DE TEMPORIZACIÓN (0-10000)”; T
GOSUB MENU
END
REM*********************SUBRUTINA DEL MANUAL DE PROGRAMA***********************
SUB MANUAL:
PRINT “CONECTAR EL INTERFACE AL PUERTO PARALELO, ARRANCAR EL
PRINT “ORDENADOR Y CONECTAR LA FUENTE DE ALIMENTACIÓN.”
PRINT” PARA CHEQUEAR LAS ENTRADAS DIGITALES/ PULSAR LA TECLA 2. EL”
PRINT” ORDENADOR VISUALIZA EL VALOR LEIDO QUE DEBE SER CERO.”
PRINT” INTRODUCIR UNA SEÑAL DE + 5V EN CADA UNA DE LAS ENTRADAS.”
PRINT” LOS VALORES LEIDOS PARA CADA UNA DE LAS ENTRADAS DEBEN SER,”
PRINT” 1, 2, 4, 8, 16, 32, 64 Y 128. EL VALOR VISUALIZADO NO DEBE SER AFECTADO
PRINT” POR LA ENTRADA DE UNA SEÑAL ANALÓGICA PROCEDENTE POR EJEMPLO
PRINT” DE UN POTENCIÓMETRO ”
PRINT” PARA VERIFICAR LAS ENTRADAS ANALÓGICAS/ PULSAR LA TECLA 3.”
PRINT” SELECCIONAR EL CANAL Y CONECTAR ALLÍ UN POTENCIÓMETRO”
PRINT” UN TERMINAL A LA TENSIÓN DE +5V, OTRO A MASA Y EL TERMINAL”
PRINT” CENTRAL A LA ENTRADA DEL CONVERSOR.”
PRINT” EL ORDENADOR DEBERÁ VISUALIZAR UN VALOR ENTRE 0-255 AL GIRAR
PRINT” EL EJE DEL POTENCIÓMETRO SIN QUE SE ENCIENDAN LOS LEDS DE”
PRINT “SALIDA. SI SE INTRODUCE UNA SEÑAL EN ALGUNA DE LAS ENTRADAS
PRINT “DIGITALES, ESTA NO DEBE AFECTAR EL VALOR VISUALIZADO.
55
Programación de placas de control
56
PRINT”
PRINT” PARA CHEQUEAR LAS SALIDAS/PULSAR LA TECLA 4. INTRODUCIR UN”
PRINT” VALOR DE SALIDA ENTRE 0-255. EL VALOR ELEGIDO DEBE”
PRINT “ MANIFESTARSE EN LOS LEDS DE SALIDA”
PRINT”CAMBIAR
EL
VALOR
DE
TEMPORIZACIÓN
SOLO
SI
LA
LECTURA
PRINT”ENTRADAS ES DEMASIADO RÁPIDA O LENTA.
PRINT””
PRINT” PULSA UNA TECLA PARA SALIR”
WHILE NOT INSTAT
WEND
GOTO MENU
END
REM*********************SUBRUTINA DE ENTRADAS DIGITALES**************************
DIGITAL:
CLS
LOCATE 23, 20:PRINT “PULSA F1 PARA SALIR
DO
KEY(1) ON
ON KEY(1) ON GOSUB MENU
CALL LEEDIGITAL(T)
LOCATE 10, 10: PRINT DIGITAL%
LOOP
END
REM***********************PROCEDIMIENTO DE LECTURA DIGITAL *********************
SUB LEEDIGITAL (T)
SHARED LPT1, DIGITAL%
REM**************SELECCIÓN DE LECTURA DIGITAL// C2//************
REM*****Y PUESTA A CERO DEL MULTIPLEXOR 74157 //A/B//************
CALL CONTROL (4)
CALL PAUSA (T)
REM **************LECTURA DE BITS IMPARES**************
A = INP (LPT1+1)
A% = A XOR 127
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (6)
CALL PAUSA (T)
REM **************LECTURA DE BITS PARES******************
B = INP (LPT1 + 1)
B% = B XOR 127
DE
LAS
Programación de placas de control
AA% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
REM *****************RESULTADO DE LA CONVERSION*********
SUMA% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
DIGITAL% = SUMA% XOR 255
END SUB
REM*********************SUBRUTINA DE ENTRADAS ANALÓGICAS**************************
ANALOGICO:
CLS
INPUT “INTRODUCE CANAL(1-8)?”; CANAL
CLS
LOCATE 23, 20:PRINT “PULSA F1 PARA SALIR
DO
KEY(1) ON
ON KEY(1) ON GOSUB MENU
CALL LEEANALOG (CANAL, T)
LOCATE 10, 10: PRINT ANALOGICO%
LOOP
END
REM**********PROCEDIMIENTO DE LECTURAS ANALOGICAS// ADC0804 //**************
SUB LEEANALOG (CANAL, T)
SHARED LPT1, ANALOGICO%
REM***SELECCIÓN DE CANAL ANALÓGICO Y DE LECTURA ANALÓGICA //C2//*****
CALL CONTROL (0)
OUT LPT1, CANAL
CALL CONTROL (0)
REM*********PULSO DE CONTROL // WR (C0) //INICIO DE CONVERSIÓN************
CALL CONTROL (0)
CALL PAUSA (T)
CALL CONTROL (1)
CALL PAUSA (T)
REM **************LECTURA DE BITS IMPARES**************
A = INP (LPT1 + 1)
A% = A XOR 127
AA% = A% AND 240
A1 = (AA% AND 16)/16
A3 = (AA% AND 32)/32
A5 = (AA% AND 64)/64
A7 = (AA% AND 128)/128
REM *********PUESTA A UNO DEL MULTIPLEXOR**********
CALL CONTROL (2)
57
Programación de placas de control
CALL PAUSA(T)
REM **************LECTURA DE BITS PARES******************
B = INP (&H379)
B% = B XOR 127
BB% = B% AND 240
B0 = (BB% AND 16)/16
B2 = (BB% AND 32)/32
B4 = (BB% AND 64)/64
B6 = (BB% AND 128)/128
REM *****************RESULTADO DE LA CONVERSION*********
SUMA% = B0 ·1 + A1 ·2 + B2·4 + A3·8 + B4·16 + A5·32 + B6·64 + A7·128
ANALOGICO% = SUMA% XOR 255
END SUB
REM****************************SUBRUTINA DE SALIDAS************************************
SALIDAS:
CLS
INPUT “INTRODUCE EL BYTE DE SALIDA (0-255)?”; BYTE%
OUT LPT1, BYTE%
REM **********************PULSO DE SUBIDA AL LATCH 74374*****************************
CALL CONTROL(0)
CALL PAUSA(T)
CALL CONTROL(8)
GOSUB MENU
END
REM********PROCEDIMIENTO DE ENVÍO DE DATOS AL PUERTO DE CONTROL*********
SUB CONTROL (DATO)
SHARED LPT1
CONTROL% = DATO XOR 11
OUT LPT1 + 2, CONTROL%
END SUB
REM**********************PROCEDIMIENTO DE TEMPORIZACIÓN****************************
SUB PAUSA (T)
FOR X= 0 TO T
NEXT X
END SUB
REM********************SUBRUTINA DE FINALIZACIÓN DE PROGRAMA*********************
FIN:
CLS
OUT LPT1, 0
CALL CONTROL(0)
CALL PAUSA(T)
CALL CONTROL(8)
END
58
Programación de placas de control
59
Programación de placas de control
ESTRUCTURA DEL PUERTO PARALELO
60
Programación de placas de control
•
61
ESTRUCTURA DEL PUERTO PARALELO.
El puerto paralelo consta en realidad de cinco puertos, dos de salida y tres de entrada.
El puerto de datos consta de un puerto de salida y otro de entrada (en el puerto IBM estandar
la entrada esta desactivada), al igual que el puerto de control mientras que el puerto de estado
posee un solo puerto de entrada (ver Figura 1). Los puertos de datos y de control tienen
asociados dos registros con la misma dirección de memoria, uno de escritura para la salida de
datos y otro de lectura denominado de realimentación. Al registro de escritura se accede con la
instrucción OUT de BASIC y al de realimentación con la instrucción INP.
El puerto paralelo consta de los siguientes componentes (ver Figura 2):
1- Latch octal triestado 74LS374 de escritura para manejar la salida del registro de datos.
2- Un buffer octal triestado 74LS244 de lectura para controlar la retoalimentación (entrada) del
registro de datos.
3- Un buffer de lectura para manejar la entrada del registro de estado.
4- Un hex-latch 74LS174 de escritura para manejar la salida del registro de control.
5- Un buffer de lectura para controlar la retroalimentación (entrada) del registro de control.
6- Un Multiplexor 74LS155 para direccionar los puertos del bus ISA.
7- 1 driver direccional 74LS245 para conectar con el bus ISA.
El chip TTL de escritura del registro de datos 74LS374 tiene sus pines de salida en
“totem pole” consistentes en dos transistores conectados emisor con colector entre +5V y masa
(ver Figura 3). La señal de salida se toma del punto de conexión entre ellos. Cuando uno de los
dos transistores conduce (saturación) en otro esta en corte. Cuando el transistor H esta en
saturación el circuito es capaz de proporcionar (source) un máximo de corriente de 2.6 mA a
cualquier carga conectada entre la salida y masa. Por el contrario, cuando el transistor L
conduce, el chip es capaz de drenar (sink) un máximo de 24 mA corriente de la carga
conectada entre +5V y la salida. Como vemos la capacidad de drenar corriente es mayor que la
de emanar. Es importante no superar estos límites cuando se conecta una carga en los pines
de salida para no dañar el chip, por ello se recomienda no intentar cortocircuitar estas líneas a
masa. Cuando se desea mejorar la capacidad de manejo de corriente del puerto de salida de
datos para gobernar un determinado dispositivo, se utiliza un circuito buffer. Las puertas buffer
no realizan ninguna función lógica, es decir el nivel lógico que introducimos por la entrada lo
obtenemos a la salida. Su única función consiste en suministrar más corriente y así poder por
ejemplo atacar a un mayor número de puertas lógicas. A parte de los estado alto y bajo que
proporciona la salida del 74LS374, se distingue un tercer estado (denominado tri-estado) en el
cual ninguno de los transistores conduce. Este es un estado alta impedancia que puede
equiparase a desconectar eléctricamente los pines de salida del circuito y es de utilidad cuando
varios circuitos comparten el mismo bus. El registro de realimentación de datos 74LS244 tenía
originalmente (configuración IBM estandar) solo fines diagnósticos, esto es, solo podía leer la
Programación de placas de control
62
salida, si en algún momento los valores de los registros de salida y realimentación eran no
coincidentes se producía un error. Por ello originalmente el registro de datos solo podía
funcionar como salida y no como entrada (Figura 1).
Por otro lado los pines de salida del chip TTL del registro de control 74LS174 tienen
una estructura en “colector abierto” (open collector). Es decir las salidas están configuradas con
un solo transistor de salida con el emisor conectado a masa y el colector flotante, es decir que
entre el colector y +5V puede conectarse la resistencia de carga que se desee. En este caso
las resistencias por defecto son de 4.7 K. Cuando el transistor conduce, la salida esta en
estado bajo, derivando la corriente a masa, mientras que cuando esta en corte la salida está
en estado alto (Figura 3). En esta última situación si la salida se cortocircuita a masa la salida
se pone a nivel bajo pudiendo ser leída por el registro de realimentación (Figura 1). Esto hace
que puedan ser leídas señales externas y por tanto funcionar como entrada. Por ello, para usar
el puerto de control como entrada se programa previamente colocando en el registro de
escritura el dato correspondiente que ponga las salidas a nivel alto.
•
PUERTOS BIDIRECCIONALES.
Desde la introducción del PC al mercado, el puerto paralelo ha sufrido varias
modificaciones para hacerlo más veloz. Ya que el puerto original era unidireccional, se creó el
puerto bidireccional. El puerto bidireccional fue introducido con el PS/2 compatible. Este
permite una comunicación de 8 bits en ambas direcciones en el puerto de datos. Algo
interesante de notar es que el puerto original tenía la posibilidad de ser bidireccional realizando
una conexión entre dos pines de un componente electrónico que venía incluido en éste. (Dicho
de otro modo, el puerto original es bidireccional en diseño básico, pero no en el diseño
operacional). Finalmente se han creado el Enhanced Parallel Port (EPP) y el Extended
Capability Port (ECP). Estos dos últimos son al puerto estándar como el Pentium al 286,
además de ser bidireccionales. Inicialmente el puerto paralelo se utilizó para la comunicación
con impresoras. Actualmente se utiliza también para manejar otros periféricos como CD ROM,
cintas de copia de respaldo, discos duros, tarjetas de red, protectores de copia, scanners, etc.
En la actualidad se conocen cuatro tipos de puerto paralelo:
-
Puerto paralelo estándar (Standart Parallel Port SPP) .
-
Puerto Paralelo PS/2 (bidireccional) .
-
Enhanced Parallel Port (EPP). Puerto paralelo ampliado.
-
Extended Capability Port (ECP). Puerto paralelo de capacidad extendida.
Programación de placas de control
63
En la siguiente tabla se muestra información acerca de cada uno de esto puertos.
SPP
PS/2
EPP
ECP
Fecha de introducción
1981
1987
1994
1994
Fabricante
IBM
IBM
Intel, Xircom y
Hewlet Packard
Zenith Data
y Microsoft.
Systems
Bidireccional
Velocidad
No
Si
Si
Si
150 Kbyte/seg.
150 Kbyte/seg.
2 Mbytes/seg
2 Mbytes/seg
El puerto bidireccional es posible usando un bit mas en el registro de control, el C5,
para controlar el triestado del chip (latch octal 74LS374) de escritura que maneja la salida de
datos (Figura 2). Cuando C5 es puesto a “0” el puerto se comporta como un puerto estandar
(triestado inhabilitado), sin embargo cuando es puesto a “1” el chip de salida de datos esta en
estado triestado. Se denomina triestado a la posibilidad de ciertos integrados de tener, a parte
de los estados normales alto y bajo, un tercer estado en su salida. Este es un estado de alta
impedancia, que básicamente actúa desconectando eléctricamente el chip del circuito. Esto
permite al registro de realimentación leer correctamente las señales externas aplicadas al
74LS244, comportándose como un puerto de entrada. Hay que decir que el puerto IBM original
tenía todo lo necesario para ser bidireccional es decir poseía además del 74LS374 para la
salida de datos un chip buffer 74LS244 para la entrada de señales. Sin embargo la señal
enable que habilitaba el triestado del 74LS374 estaba puesta a cero. En un puerto estandar el
registro de control es gestionado por un hex-lach 74LS174 de los cuales solo utiliza 4 bits, el
C0, C1, C2 y C3. El C4 se usa para activar la interrupción del puerto y el C5 (pin 15) esta
desconectado. Para convertir un puerto estandar en bidireccional solo tenemos que
desconectar de masa el pin 1 del 74LS374 (enable) y conectarla al pin 15 del 74LS244 (Figura
2). Una vez hecho esto para usar el puerto como bidireccional debemos asegurarnos que el
triestado esta activado poniendo el bit C5 a 1.
•
BUSQUEDA DE LAS DIRECCIONES DE LOS REGISTROS.
Podemos considerar a la memoria del ordenador como un edificio de viviendas de 256
plantas de altura y que en cada planta hay 256 viviendas independientes, por tanto hay 65536
viviendas. Cada vivienda tiene asignada una dirección de acuerdo con el piso en el que se
encuentra y su posición dentro de dicha planta. Numerando cada una de las plantas de 0 a 255
y cada uno de las viviendas de cada piso de 0 a 255 es posible localizar cualquier dirección
mediante la siguiente fórmula, entendiendo por dirección una expresión numérica dentro del
intervalo de 0 a 65535:
(Número de piso x 256) + número de la puerta
Programación de placas de control
64
Por ejemplo, el piso 10 puerta 54 tiene la dirección (10 x 256) + 54 = 2614. Esta es la
forma en la que el ordenador establece el direccionamiento de las 65536 direcciones de
memoria. El ordenador utiliza dos bytes (8 bits) de memoria (2 registros) para manejar una
dirección. El primero almacena la parte menos significativa de la dirección (en este caso el
número 54) y en la siguiente consecutiva la parte más significativa, es decir lo hace al revés.
número de la puerta + (Número de piso x 256)
Con la instrucción PEEK del BASIC podemos ver el contenido de cualquier registro de
memoria. Ahora bien como sabemos que el ordenador almacena las direcciones base
(registro de datos), de cada uno de los puertos a partir de la dirección &H408,
consecutivamente, sabemos que la dirección del registro de datos de LPT1 estará en las
direcciones &H408 y &H409, las de LPT2 en &H40A y &H40B y las de LPT3 en &H40C y
&H40D. Ahora solo queda leer los registros correspondientes a estas direcciones y obtener la
dirección buscada de la siguiente forma:
LPT1 = PEEK(&H408) + 256* PEEK(&H409)
LPT2 = PEEK(&H40A) + 256* PEEK(&H40B)
LPT3 = PEEK(&H40C) + 256* PEEK(&H40D)
es decir, en el primer caso el número de la puerta estará almacenado en el registro de memoria
de dirección &H408 y el número de piso en &H409.
Programación de placas de control
65
Programación de placas de control
66
Programación de placas de control
67
Programación de placas de control
68
PUERTAS ÓPTICAS
Programación de placas de control
•
69
PUERTAS ÓPTICAS.
Cuando una señal eléctrica externa entra en el puerto de estado es capaz de alterar el
valor del registro correspondiente haciendo posible que el ordenador la detecte. Las puertas
ópticas como veremos a continuación generan una tensión de salida del tipo todo o nada que
puede hacerse llegar al puerto de estado. Estas son de gran versatilidad encontrando gran
aplicación como finales de carrera, contaje de eventos, encorders, estudio de movimientos
etc...
Los componentes fundamentales de una puerta óptica son un fototransistor y un diodo
emisor de radiación infrarroja. El fototransistor cuando está convenientemente polarizado
conduce corriente al captar la radiación infrarroja procedente del diodo, mientras que cuando
no percibe radiación (por ejemplo interponiendo un objeto opaco entre ambos componentes)
permanece en bloqueo. En la Figura se muestra el circuito correspondiente. La salida de la
báscula de Schimtt (pin 2) toma un nivel alto o bajo en función de si existe bloqueo o no de luz
entre el fototransistor y el diodo. La corriente que deja pasar el fototransistor se convierte en
tensión al circular por la resistencia R1. La tensión en R1 polariza la base del transistor Q1 y la
tensión de colector-emisor de Q1 polariza a su vez la base del transistor Q2 que regula el paso
de corriente a través de R3. Por último, la caída de tensión a través de R3 ataca la entrada del
CI 74LS14. El CI 7414 es una báscula de Schimtt que actúa como acondicionador de señal
regenerando niveles de señal poco diferenciados o degenerados. Es decir, a partir de un
determinado umbral asegura niveles de tensión alto y bajo nítidos.
Cuando no existe bloqueo Q1 entra en saturación y su tensión colector-emisor
disminuye tanto que no es capaz de polarizar la base de Q2. En estas condiciones Q2 no
conduce, la tensión en R3 (pin 1 de la báscula) es cero y por tanto su salida (pin 2 ) esta a nivel
alto ya que ésta actúa además como puerta inversora. Cuando existe bloqueo entre el
fototransistor y el diodo no hay paso de corriente a través de R1 y por tanto la tensión de base
de Q1 es cero entrando en corte. Esto propicia un aumento en la tensión colector-emisor de Q1
que satura Q2. El paso de corriente a través de R3 pone a nivel alto la entrada de la báscula y
por tanto un nivel bajo a la salida.
El diodo y el fototransistor suelen encapsularse en un pieza en forma de U en la que se
encuentran enfrentados (ver Figura). La profundidad y anchura de la ranura se adecuan a la
aplicación a la que se destine. Este tipo de puertas pueden adquirirse en el mercado a un
precio asequible. Si se desea puede fabricarse la puerta a partir del diodo y el fototransistor, en
este caso deberá tenerse encuentra la polaridad de los mismos que es opuesta tal y como se
indica en la figura.
Programación de placas de control
70
Programación de placas de control
CONTROL DE MOTORES DE CC
71
Programación de placas de control
•
72
CONTROL DE UN MOTOR DE CC MEDIANTE LAS SEÑALES DEL PUERTO DE DATOS.
El gobierno de un motor de cc puede realizarse de forma sencilla excitando
adecuadamente los relés del circuito de salida del interface. En la siguiente figura se indica el
circuito de gobierno de un motor de cc en la como se puede ver solo son necesarios dos relés,
uno de ellos bipolar (6 contactos) y otro simple (3 contactos). Para realizar el cambio del
sentido de giro siempre será necesario un relé bipolar o dos relés simples en su defecto. Sin
embargo, para que sea posible detener el motor cualquiera que sea el estado del relé bipolar,
será necesario colocar un relé adicional que corte la alimentación al motor. En la figura se
observan los posibles estados del motor para los diferentes estados de los dos relés.
Obsérvese que este tipo de control no contempla el gobierno de la velocidad, la cuál estará
dada por la relación de transmisión del sistema de engranajes de salida y el voltaje del motor.
El siguiente programa establece una secuencia de movimientos del motor que se repite
indefinidamente hasta que se pulsa la tecla F1. Para la salida de señales a los relés se utiliza el
procedimiento creado SUB SALIDAS (M7, M6, M5, M4 M3, M2 M1, M0), en donde las variables
MX señalan el estado alto o bajo de los 8 relés de salida. El procedimiento SUB ESPERA
(SEGUNDOS), detiene la ejecución del programa durante un tiempo en segundos igual al que
se indica en el argumento SEGUNDOS, siendo éste un valor entero. Este procedimiento utiliza
el reloj interno del ordenador el cuál es invocado mediante la sentencia TIMER. Al llamar al
procedimiento la variable “To” retiene la parte entera en segundos INT(TIMER) del valor del
tiempo actual inmediatamente después de la llamada. Seguidamente mediante un bucle
DO/LOOP el programa asigna continuamente a la variable “Tf” la parte entera en segundos del
valor del tiempo actual. Cuando la diferencia entre este valor y el de “To” es igual al valor dado
por el argumento SEGUNDOS se efectúa la salida del bucle mediante la sentencia EXIT LOOP
y terminando la subrutina.
Programación de placas de control
REM***************CONTROL DE UN MOTOR DE CC***********************
REM******************PROGRAMA PRINCIPAL*******************************
KEY(1) ON
DO
ON KEY(1) GOSUB FIN
CALL SALIDA (0,0,0,0,0,0,0,0,1)
CALL ESPERA(5)
CALL SALIDA (0,0,0,0,0,0,0,0,0)
CALL ESPERA(10)
CALL SALIDA (0,0,0,0,0,0,0,1,1)
CALL ESPERA(2)
LOOP
END
REM********************SUBRUTINAS Y PRODEDIMIENTOS*********************
73
Programación de placas de control
74
REM**************PROCEDIMIENTO DE SALIDA DE DATOS*********************
SUB SALIDA(M7, M6, M5, M4, M3, M2, M1, M0)
SALIDA% = M0*1 OR M1*2 OR M2*4 OR M3*8 OR M4*16 OR M5*32 OR M6*64 OR M7*128
OUT &H378, SALIDA%
END SUB
REM***********************PROCEDIMIENTO DE ESPERA********************************
SUB ESPERA(SEGUNDOS)
To = INT(TIMER)
DO
Tf =INT(TIMER)
IF Tf – To = SEGUNDOS THEN EXIT LOOP
LOOP
END SUB
REM ****************SUBRUTINA DE TÉRMINO DEL PROGRAMA************************
FIN:
OUT &H378, 0
END
El programa ordena al motor moverse en un sentido durante 5 segundos, lo detiene
durante 10 segundos y lo hace girar en sentido contrario durante 2 segundos para volver a
empezar la secuencia. Esto lo hace indefinidamente hasta que se pulsa la tecla F1 de salida
del bucle.
•
CONTROL CONDICIONADO.
El sistema anterior es un ejemplo de sistema en lazo abierto, es decir, el gobierno del
motor es independiente del estado del mismo. Un ejemplo de sistema en lazo abierto es una
lavadora, pues realiza una secuencia de operaciones que es independiente del estado final de
la ropa y solo depende del programa de lavado seleccionado. Una nevera por el contrario es un
sistema en lazo cerrado dado que un termostato gobierna la parada o marcha del motor.
Frecuentemente la parada, puesta en marcha o el cambio de sentido de un motor dependen
del estado de uno o de varios finales de carrera que actúan como nuevas señales de entrada,
estos sistemas se denominan sistemas de control en lazo cerrado. En este caso el programa
debe leer continuamente el estado de las entradas procedentes de los finales de carrera y
actuar en consecuencia. El siguiente programa controla el movimiento lineal de una pieza que
es arrastrada por un motor. Hay dos finales de carrera que condicionan el movimiento de la
Programación de placas de control
75
pieza. Inicialmente se da la orden al motor de girar en un sentido arrastrando la pieza y
liberando uno de los finales de carrera. Cuando la pieza toca el otro final de carrera (en este
caso para un valor del registro de estado 247) se da la orden de parar durante dos segundos
para posteriormente mover la pieza en sentido contrario. Cuando la pieza regresa a la posición
inicial acciona el primer final de carrera (en este caso para un valor del registro de estado 55)
que da la orden al motor de parar durante 10 segundos para posteriormente desplazar la pieza
en sentido contrario. La pieza está continuamente realizando esta secuencia hasta que se
pulsa la tecla F1 que hace regresar a la pieza a la posición de partida y detiene el motor.
REM***************CONTROL CONDICIONADO DE UN MOTOR DE CC***********************
REM**************************PROGRAMA PRINCIPAL********************************************
KEY(1) ON
CALL SALIDA (0,0,0,0,0,0,0,0,1)
DO
ON KEY(1) GOSUB FIN
CALL LEEPUERTO
LOCATE 10,10: PRINT ESTADO%
SELECT CASE ESTADO%
CASE = 127
CALL SALIDA (0,0,0,0,0,0,0,0,0)
CALL ESPERA(5)
CALL SALIDA (0,0,0,0,0,0,0,1,1)
CASE = 55
CALL SALIDA (0,0,0,0,0,0,0,0,0)
CALL ESPERA(10)
CALL SALIDA (0,0,0,0,0,0,0,0,1)
END SELECT
LOOP
END
REM********************SUBRUTINAS Y PRODEDIMIENTOS*********************
REM******PROCEDIMIENTO DE LECTURA DEL REGISTRO DE ESTADO****
SUB LEEPUERTO
SHARED ESTADO%
ESTADO% = INP(&H379)
END SUB
REM**************PROCEDIMIENTO DE SALIDA DE DATOS*********************
Programación de placas de control
76
SUB SALIDA(M7, M6, M5, M4, M3, M2, M1, M0)
SALIDA% = M0*1 OR M1*2 OR M2*4 OR M3*8 OR M4*16 OR M5*32 OR M6*64 OR M7*128
OUT &H378, SALIDA%
END SUB
REM***********************PROCEDIMIENTO DE ESPERA********************************
SUB ESPERA(SEGUNDOS)
To = INT(TIMER)
DO
Tf =INT(TIMER)
IF Tf – To = SEGUNDOS THEN EXIT LOOP
LOOP
END SUB
REM ****************SUBRUTINA DE TÉRMINO DEL PROGRAMA************************
FIN:
CALL SALIDA (0,0,0,0,0,0,0,1,1)
DO
CALL LEEPUERTO
LOCATE 10, 10: PRINT ESTADO%
IF ESTADO% = 55 THEN CALL SALIDA (0,0,0,0,0,0,0,0): END
LOOP
END
Este programa tiene de novedoso el control que se hace del flujo mediante la sentencia
SELECT CASE. La variable o expresión situada después de la sentencia SELECT CASE, en
este caso la variable ESTADO% (que representa el valor del registro de estado en ese
momento) se evalúa a iniciarse la ejecución de la sentencia. Según el valor de la variable
ESTADO% se ejecuta el bloque que se inicia con la palabra CASE.
•
CONTROL DE LA VELOCIDAD.
Sin duda la forma más precisa, aunque más compleja y también la que más recursos
consume (en el caso de la figura 4 señales para controlar la velocidad de un solo motor), es
mediante el uso de un conversor Digital/Analógico. En la siguiente figura se muestra el
esquema eléctrico de un conversor Digital/Analógico en donde usan 4 señales digitales para
regular el voltaje de salida aplicado al motor.
Programación de placas de control
77
El CI 4050 tiene 6 amplificadores buffer de no inversión (para una entrada a nivel alto
proporciona a la salida un nivel alto). Cada salida a nivel alto hace que circule una corriente, a
través de la resistencia correspondiente, a la base de Tr1. Las intensidades son inversamente
proporcionales a las resistencias. Con los valores indicados en la figura, la corriente total es
proporcional al número binario de 4 dígitos presente en la entrada. Dado que Tr1 esta
conectado como un seguidor de emisor, la tensión en R9 es proporcional a la corriente de base
total que circula por Tr1. Como la base de Tr2 está polarizada por la tensión presente en R9, el
voltaje aplicado al motor será también proporcional al número binario de entrada.
Adicionalmente, el potenciómetro VR1 puede regularse para que aun cuando todas las
entradas digitales estén a cero, proporcione la corriente de base a Tr2 necesaria para que el
motor funcione con la velocidad más pequeña requerida.
Otra forma más sencilla de conseguir distintas velocidades en un motor de corriente
continua es aplicar pulsos de frecuencia variable, consiguiendo así variar la tensión media
aplicada. En la siguiente figura se muestra el esquema de un circuito eléctrico en el que se
usan solo dos señales del puerto de datos, una gobierna la tensión aplicada y al motor y la otra
el sentido de giro. Cuando la señal D0 esta a nivel 1, el transistor NPN BC548 entra en
saturación y su tensión de colector disminuye lo suficiente para polarizar la base del transistor
PNP de potencia BD136 (8W nominal) haciendo que la corriente circule por el motor. La señal
D1 se emplea para cambiar el sentido de giro dado que controla el relé de 6 contactos. El relé,
como puede observarse en la figura, cambia la polaridad del motor respecto al colector del
transistor BD136 con el consiguiente cambio de giro.
Este circuito tiene la ventaja respecto al anterior de que solo necesita dos señales para
gobernar la marcha, paro y cambio de sentido del motor. El paso de corriente por BD136 y por
tanto la tensión en el motor seguirá las variaciones de D0, así, al disminuir la frecuencia del
Programación de placas de control
78
pulso disminuirá de forma proporcional la tensión media aplicada y la consiguientemente la
velocidad.
Otro aspecto que puede ser interesante es el frenado del motor. En muchas ocasiones
es necesario que el motor frene en seco. Esto puede conseguirse haciendo conmutar el relé
justo en el momento de enviar la señal de paro. Con esto se consigue invertir la polaridad en
los extremos del motor por efecto de la fuerza contraelectromotriz durante un instante muy
pequeño, pero suficiente para frenar el seco el motor si este dispone de una reductora de
velocidad. Este efecto de inversión de la polaridad puede observarse con un polímetro
conectado a extremos del diodo en paralelo con el motor.
Programación de placas de control
ACONDICIONAMIENTO DE SEÑAL
DISEÑO DE UN TERMÓMETRO DIGITAL
79
Programación de placas de control
•
80
ACONDICIONAMIENTO DE SEÑAL. DISEÑO DE UN TERMÓMETRO DIGITAL.
MONITORIZACIÓN DE LA TEMPERATURA.
Al monitorizar una señal analógica procedente de un sensor mediante un conversor
analógico digital nos encontraremos, en la mayoría de los casos, con que el rango de voltaje de
salida del sensor en las condiciones experimentales (es decir la diferencia entre el voltaje más
pequeño y el máximo que proporciona a su salida) no es igual al rango de voltaje de entrada
del conversor analógico-digital sobre el cual va a realizar la conversión. Esto causa pérdida de
datos del sensor y/o un desaprovechamiento del poder de conversión (pérdida de bits a la
salida) del conversor analógico digital. En la siguiente figura se muestran dos casos generales.
En el caso A) el rango de voltajes es igual pero desplazados (offset) mientras que en el
caso B) no existe offset pero el rango de voltajes es diferente. En general la mejor opción para
resolver estos inconvenientes es el uso de un Amplificador Operacional (AO) entre la salida del
sensor y la entrada de conversor. Los amplificadores operacionales son circuitos integrados tan
versátiles que permiten, no solo adaptar los rangos de voltaje mediante amplificación, sino
también corregir el offset de un sola vez. Esta operación se denomina acondicionamiento de
señal. Existen otras soluciones menos generales, así los conversores analógico digitales están
preparados para la conversión de voltajes diferenciales que permiten igualmente corregir el
offset y adaptar, mediante el uso de un voltaje de referencia, el voltaje de entrada a su máxima
capacidad de conversión. Sin ir más lejos, el conversor que usaremos aquí, el ADC804,
dispone de esta posibilidad. Sin embargo esto esclaviza el conversor dado que una vez
adaptado el rango de voltajes mediante la inyección del voltaje de referencia ya no puede ser
usado por otro sensor con un rango de voltaje de salida diferente. Pongámonos en el caso de
una estación meteorológica que necesita procesar las señales procedentes de un sensor de
temperatura, otro de humedad y otro de presión atmosférica haciendo uso de un multiplexor
analógico cuya salida alimente la entrada del ADC804. Lo lógico es acondicionar
independientemente las señales procedentes de cada sensor a un mismo rango común de
voltaje de entrada del conversor, que en el caso más general será de 0V – 5V.
Programación de placas de control
81
El amplificador operacional:
El AO utilizado será es el TLV2462, este es un amplificador operaciónal de
alimentación unipolar rail a rail de última generación en configuración de amplificador
diferencial. En la siguiente figura se muestra un amplificador operacional trabajando como
amplificador diferencial y la ecuación que da el voltaje de salida en función de las tensiones de
entrada y los valores de las resistencia externas Rf, Rg, R1 y R2 (1). Básicamente esta
configuración amplifica la diferencia entre las señales de entrada Vin2 – Vin1 por un factor igual
a Rf/Rg según indica la ecuación (2) siempre que se verifique que R1 = Rg y R2 = Rf. Si
utilizamos un voltaje de referencia constante Vin1 en la entrada inversora, el amplificador
responderá a la diferencia entre el voltaje de salida del sensor y el voltaje de referencia.
El conversor Analógico digital:
El conversor ADC804, que es un conversor de 8 bits y por tanto proporciona a su salida
un número digital que oscila entre 0 – 255. Para la mayoría de las aplicaciones será suficiente
una precisión de 0,5 ºC, con lo cuál el rango de temperaturas operativo será de 127,5 ºC
(255/2), de este modo a cada byte de salida del conversor le corresponderá una temperatura
que variará en 0,5ºC por bit. Ahora solo queda acondicionar este rango de temperaturas al uso
que se le va a dar al termómetro.
El sensor:
El sensor elegido es el LM335 que proporciona a su salida un voltaje de 10 mV por
cada ºK de temperatura y está calibrado nominamente para dar un voltaje de 2,982 V a una
temperatura de 25ºC (298 ºK), es decir, el voltaje de salida responde a siguiente ecuación:
Programación de placas de control
82
Vout = 0.01(V/ºK) T
Si utilizamos una referencia de tensión de 2,5 V (mínimo voltaje de salida del sensor
que puede ser medido por el amplificador diferencial) y sabemos que el rango de temperaturas
es de 127,5 ºC tenemos que la mínima temperatura que podrá ser medida será de 250ºK (23ºC) para un voltaje de salida de 2,50 V y una temperatura máxima de 377,5 ºK (104º C) para
un voltaje de salida de 3.77 V. Este rango de temperaturas es adecuado, entre otras posibles
aplicaciones,
para monitorizar la temperatura atmosférica. Dado que rango de voltaje de
entrada del conversor es de 0-5 V tenemos que la ganancia necesaria para adaptar la señal
será de G = (5 – 0)/(3.77 – 2.50) = 3.937
Cálculo de los resistores del amplificador diferencial:
Para conseguir esta ganancia y teniendo en cuenta que según la ecuación (2) esta es
igual a (Rf/Rg), si elegimos para Rf un valor de 100K el valor de Rg deberá ser igual a Rg =
100/3.937 = 25.4K. Este valor de resistencia no es nominal, aunque puede conseguirse un
valor aproximado conectando resistencias en serie.
Diseño operativo:
En la práctica para conseguir la referencia de tensión de 2.5 V se utilizará el circuito
integrado LM336 (2.5V). Una vez alimentado el circuito amplificador diferencial (con una
tensión estabilizada de
Vcc = 5V) que se muestra en la siguiente figura, se midió
experimentalmente un voltaje de 2.47 V a la salida del LM336, con lo cual se corrigieron los
valores obtenidos a los siguientes. Vsensor/min = 2.47 V, Tsensor/min = -26ºC; Vsensor/max =
3.74 V, Tsensor/max = 101.5 ºC. Esta pequeña variación no altera la ganancia del circuito pero
desplaza la escala termométrica tres grados hacia temperaturas negativas. Dado que los
resistores de precisión son difíciles de conseguir se usaron resistores de 5% de tolerancia.
Para evitar al máximo errores en la ganancia se usó el siguiente procedimiento. Se adquirieron
respectivamente 10 resistores de valores nominales de 100K, 22K y 3,3K. Se procedió a la
medición de sus resistencias ohmicas con un polímetro digital observándose la siguiente
dispersión:
Valor nominal 100K
Valor nominal 22K
Valor nominal 3.3K
99.3 K
22.0 K
3.19 K
97.0 K
21.8 K
3.19 K
97.9 K
21.9 K
3.20 K
99.6K
21.8 K
3.19 K
99.4K
21.9 K
3.19 K
99.1K
21.9 K
3.19 K
99.8K
21.8 K
3.20 K
Programación de placas de control
83
98.0K
21.9 K
3.20 K
99.4K
21.9 K
3.20 K
98.0K
21.8 K
3.20 K
Para que el amplificador diferencial responda a la ecuación (2) debe cumplirse que
R1 = Rg y R2 = Rf. (ver figura). Se eligieron los valores, 98.0K para Rf y la suma de 21.8K +
3.19K = 24.99 K para Rg, con el objeto de aproximar lo máximo posible la ganancia obtenida a
la de diseño. Así, la ganancia obtenida con estos valores es de Rf/Rg = 98/24.99 = 3.921.
Comprobación:
Una vez montado el circuito se midió con un polímetro el voltaje de salida de la
referencia de tensión LM336, el sensor de temperatura LM335 y el operacional TLV2462,
obteniéndose los valores de 2.47V, 2.94V y 1.84 V respectivamente. Usando la ecuación (2) y
sustituyendo valores se obtuvo a la salida del amplificador operacional un valor de Vout = (2.94
– 2.47)·3.921 = 1.842 V que se aproxima bastante al valor medido con lo cual puede
despreciarse la pequeña variación en la ganancia.
Calibración:
Se prevé un valor de salida del conversor de 102 para una temperatura de 25ºC. Así,
sabiendo que para -26ºC (247ºK) el valor de salida del conversor debe ser 0 y que por cada
incremento de 1 bit en la salida del conversor, la temperatura se incrementa en 0,5 V, tenemos
que a 25ºC (298ºK) la salida del conversor será de (298-247)/0,5 = 102. Para comprobarlo se
calibró el sensor de temperatura LM335 con un potenciómetro, según se indica en la siguiente
figura, hasta obtener un voltaje a la salida de 2.98 V. Mediante el programa de adquisición
ADC.EXE se monitorizó la salida del conversor obteniéndose a la salida un valor de 102
idéntico al previsto. Con los pares de valores (-26ºC, 0) y (25ºC, 102) se trazó la recta de
calibrado que responde a la siguiente ecuación:
T(ºC) = n·0,5 - 26
Donde “n” es el valor digital medido a la salida del conversor. Con esta ecuación se convierte
directamente a temperatura en ºC los valores de salida del conversor.
Por último se cotejaron para distintos valores (punto de congelación del agua y distintos
valores de temperatura ambiental) los valores obtenidos con el termómetro digital con los
obtenidos con un termómetro de mercurio de laboratorio siendo los valores coincidentes. Se
comprobó también la reproducibilidad del sensor intercambiándolo por otro, igual siendo los
valores de salida del conversor idénticos para una misma temperatura y para ambos sensores.
Por último se usó un cable apantallado de unos 4 metros de longitud para situar el sensor a la
Programación de placas de control
84
intemperie no observándose diferencias en los valores obtenidos para aquellos obtenidos con
el sensor pinchado directamente en la placa entrenadora.
Monitorización de la temperatura ambiental:
Se procedió mediante el siguiente circuito a monitorizar la temperatura ambiental
durante un periodo de 24 h con el programa de adquisición ADC_DATA.EXE.
Se tomaron medidas a intervalos regulares de 5 minutos y fueron guardadas en un
archivo de texto que posteriormente se procesó con EXCEL para representar gráficamente los
datos obtenidos frente al tiempo en horas. En la página siguiente se muestran los datos
obtenidos
Fuentes de error:
En la siguiente figura se muestra el modelo de Thevenin para el amplificador
operacional. Este consta de un puerto de entrada y otro de salida. El puerto de entrada juega
un papel pasivo y no produce voltaje por si mismo, su equivalente es la impedancia de entrada
Ri. El puerto de salida puede entenderse como una fuente de tensión de valor AVi (siendo A la
Programación de placas de control
85
ganancia del amplificador) con una impedancia de salida Ro. La salida del amplificador
alimenta una carga de impedancia RL, mientras que la fuente de señal se representa por una
fuente de tensión Vs con una impedancia de salida Rs. Como puede verse, en la entrada del
amplificador, la impedancia de la fuente de señal y la impedancia de entrada del amplificador
forman un divisor de tensión, de igual modo que a la salida, la impedancia de la carga y la
impedancia de salida del amplificador. Esto hace que la ganancia del amplificador deba
recalcularse en los casos en los que parte de las señales de entrada o de salida se pierdan en
los divisores de tensión.
A pesar de que los A.O. se caracterizan por su alta impedancia de entrada, las
resistencias externas alteran este valor. En concreto, el amplificador diferencial tiene una
impedancia de entrada relativamente baja lo cual hace que parte de la señal se pierda si la
fuente de señal tiene una impedancia de salida alta, tal y como ocurre en sensores del tipo de
puente de Wheastone. La impedancia en la entrada no inversora del amplificador diferencial es
Rg + Rf, mientras que la impedancia en la entrada inversora es de Rg. Las hojas de
características dan para el sensor LM335 una impedancia de salida inferior a 1Ω, que forma un
divisor de tensión con 123K, mientras que para el LM336 da un valor de 0,2Ω, que forma un
divisor con 25K. Como puede observarse, estas cargas no suponen pérdida de señal alguna a
la entrada del amplificador. La impedancia de salida del TLV2462 es de unos 29 Ω, lo cual
supone una carga despreciable para el conversor. Por otro lado, el amplificador TLV2462 es un
amplificador rail a rail, es decir es capaz de alcanzar a la salida voltajes muy próximos, aunque
no iguales, a los dos raíles de voltaje a los que está conectado, es decir, 0V y +5V. Las hojas
características del TLV2462 dan valores de 4.9 V máximo y 0.1 V mínimo. Esto supone voltajes
en el sensor de 3.72 V y de 2.49 V respectivamente, lo cual indica que el rango máximo fiable
de temperaturas a medir por el termómetro será entre -24ºC y 99ºC. Por otro lado cuando se
use un cable para la ubicación remota del sensor, éste deberá ser apantallado, conectando el
apantallamiento a masa, dado que este actúa como una antena que inyecta un ruido que es
amplificado junto con la señal causando un error. Otras posibles fuentes de error son la
estabilidad y filtrado de la fuente de tensión, la deriva de la tensión de referencia, etc...
Programación de placas de control
86
Monitorización de Temperaturas 27/02/06
35
Temperatura (ºC)
30
25
20
15
10
5
0
0
5
10
15
Tiempo (horas)
20
25
30
Programación de placas de control
87
Descargar