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