E
l ciudadano industrializado, “muy cambiante en este último tiempo”, se ha visto en la necesidad de asumir, en escasos 30 años, el significado de un buen número de nuevos conceptos marcados por su alto contenido tecnológico. De ellos, sin duda, el más relevante ha sido la computadora. Ésta está introducida hoy en día, en su versión personal en multitud de hogares, y el hombre medio va conociendo en creciente proporción, además de su existencia, su modo de uso y buena parte de sus posibilidades. Pero dejando de lado esta verdadera revolución social, existen otros conceptos procedentes del desarrollo tecnológico que han superado las barreras impuestas por las industrias y centros de investigación, incorporándose en cierta medida al lenguaje coloquial. Es llamativo como entre éstas, se destaca el concepto de robot. Pero el robot industrial, que se conoce y emplea
en nuestros días, no surge como consecuencia de la tendencia o afición de reproducir a imagen y semejanza a los seres vivientes, sino de la necesidad. Fue la escasez la que dio origen a la agricultura, el pastoreo, la caza, la pesca, etc. Luego, la necesidad provocó la primera revolución industrial con el descubrimiento de la máquina de vapor de Watt y, actualmente, la necesidad ha cubierto de computadoras la faz de la Tierra. Inmersos en la era de la informatización, la imperiosa necesidad de aumentar la productividad y mejorar la calidad de los productos, ha hecho insuficiente la automatización industrial rígida, dominante en las primeras décadas del siglo XX. En este capítulo veremos algunos conceptos de control y cómo realizarlos mediante el uso de los puertos de una computadora empleando ejemplos prácticos que podrá utilizar para diferentes aplicaciones.
51
Introducción Se llama mecanización a la incorporación de máquinas en la realización de determinadas tareas. Así, se habla de la mecanización del campo, cuando a las tareas agrícolas se han incorporado máquinas por todos conocidas como el tractor, el arado o la cosechadora. También se habla del mecanizado de piezas en un taller, cuando para su fabricación se utilizan máquinas como tornos o fresadoras, es decir, cuando se abandona la fabricación manual y se sustituye por procesos mecanizados que permiten mejores acabados y mayor rapidez en la confección de elementos. Un paso más allá es la automatización, considerada como la supresión parcial o total de la intervención de las personas en la realización de tareas productivas, como las tareas agrícolas, industriales o administrativas. Los autómatas son un caso muy conocido de control, ya tradicional, que se ha venido aplicando a aquella clase de máquinas en las que una fuente de energía acciona un mecanismo, que permite imitar los movimientos de los seres animados. Se conocen autómatas que fueron construidos por los griegos en el templo de Dédalo; sin embargo, uno de los casos más difundidos es el del Pato de Vaucanson (Grenoble 1709-París 1782) construido en 1738, que era un pato artificial capaz de batir las alas, zambullirse, nadar, tragar grano e incluso expeler una sustancia parecida al excremento. Otro caso de autómatas célebres aunque más próximo a nuestro tiempo es el del jugador de ajedrez de Torres Quevedo, construido en 1912, capaz de jugar finales de partida (rey contra rey y torre). Pero debe ponerse de manifiesto que los autómatas siempre repiten el mismo modelo de actuación, no son reprogramables y tampoco son capaces de variar sus acciones en función del entorno o la situación. El control numérico es la supervisión y regulación de determinadas tareas mecánicas de precisión, realizadas por una máquina herramienta. El control de estas tareas se realiza de forma automática para evitar, de este modo, que el control se lleve a cabo por un operario que, en ocasiones, podría verse sometido a ciertos riesgos en un proceso donde es imposible erradicar los errores humanos. De esta forma, se ajusta al máximo la precisión en la confección de piezas estandarizadas y se libera al operario de su control, mejorando la calidad y la cantidad del trabajo realizado. Un ejemplo de control automático es el control de la velocidad de giro de un taladro o la velocidad y control de avance de un torno o fresadora. Otro sistema de control au-
52
tomático es el servocontrol. Consiste en controlar, de forma automática, las acciones de una máquina en función de unos parámetros definidos y sus variaciones. Por ejemplo, el servocontrol se puede utilizar para controlar la velocidad de giro de un torno, de forma que se mantenga fija dentro de unos límites. Otro ejemplo de servocontrol podría ser el del freno de algunos vehículos en los que la fuerza transmitida a las ruedas es proporcional a la fuerza aplicada por el conductor sobre el pedal del freno; de esta función se encarga un mecanismo servocontrolado que se llama servofreno. La robotización es también una automatización de procesos sin la intervención humana, pero en este caso se da un paso más; hay desplazamiento de cargas, manipulación de objetos y un fuerte componente de realimentación. Es decir, este tipo de automatización permite la manipulación automática y programable de acciones y objetos. La realimentación es un proceso imprescindible en la robotización, ya que dota a un proceso de capacidad para captar información que, una vez procesada por la máquina, permite modificar su comportamiento (sus acciones). Una máquina que posea la capacidad de realimentación, es capaz de modificar sus respuestas en función de las variaciones de su entorno. Centrando el análisis en las diferencias que existen entre automatización y robotización, puede decirse que una máquina automatizada (autómata) responde siempre de igual manera ante sucesos de idéntica naturaleza. Mientras que por el contrario un robot, es decir, una máquina robotizada, se caracteriza porque puede manejar objetos y, lo más interesante, es un dispositivo multifuncional y reprogramable. Una máquina robotizada es capaz de hacer trabajos totalmente diferentes y adaptarse al medio, ya que puede tomar decisiones en función de las condiciones exteriores. La totalidad de los procesos de mejora y control de la producción pueden sintetizarse en tres fundamentales: Procesos de mecanización, procesos de automatización y procesos de robotización. Las principales características de cada uno de estos tres grupos se exponen en el cuadro de la figura 1.
La Computadora Como Sistema de Control La aparición del computador en la década de los 40, acelera vertiginosamente el desarrollo de autómatas y robots. La cuestión es: ¿podemos hacer servir lal PC como un autómata o un robot?. Para poder respon-
der es preciso verificar si se cumplen las siguientes condiciones: ¿Podemos conectarle sensores? ¿Podemos conectarle actuadores? ¿Podemos programarlo (y reprogramarlo) para que tome decisiones en función de los sensores y de instrucciones previas para que los actuadores operen en consecuencia? La respuesta a las tres cuestiones es afirmativa ya que: “La PC cuenta para comunicarse con sus periféricos, incluso en su versión más básica, con diversos dispositivos de entrada: puertos paralelo y serie, USB, joystick, micrófono... Además, es posible agregarle tarjetas especializadas que añaden otras muy diversas clases de entradas” También cuenta con varios dispositivos de salida: puertos paralelo y serie, USB, sonido, video... Asimismo, se pueden añadir tarjetas especializadas que expanden el número y tipo de entradas. Por otras parte, son muchos los lenguajes de programación utilizables en la PC que permiten leer las entradas y modificar las salidas: BASIC, LOGO, Pascal, C, EnsamblaFigura 1 dor, etc. (figura 2).
El Puerto de la PC Introducción Hace años, IBM diseñó el puerto paralelo para manejar impresoras desde su gama de microcomputadores PC/XT/AT. Un conector estándar macho de 25 pines aparecía en la parte trasera de la PC con el solo propósito de servir de interfaz con la impresora. El sistema operativo DOS cargado en dichas PCs soporta hasta tres puertos paralelos asignados a los identificadores LPT1, LPT2 y LPT3, y cada puerto requiere tres direcciones consecutivas del espacio de E/S (entradasalida) del procesador para seleccionar todas sus posibilidades. Desde el punto de vista del hardware, el puerto consta de un conector hembra DB25 con doce salidas
Figura 2
53
Figura 3
latch (poseen memoria/buffer intermedio) y cinco entradas, con ocho líneas de tierra. Desde el punto de vista del software, el puerto paralelo consta de tres registros (datos, estado y control) de 8 bits cada uno, que ocupan tres direcciones de E/S (I/O) consecutivas de la arquitectura x86 (figura 3). La función normal del puerto consiste en transferir datos a una impresora mediante 8 líneas de salida de datos, usando las señales restantes como control de flujo. Sin embargo, puede ser usado como un puerto E/S de propósito general por cualquier dispositivo o aplicación que se ajuste a sus posibilidades de entrada/salida.
Descripción del Conector Físico
Figura 4
54
La conexión del puerto paralelo al mundo exterior se realiza mediante un conector hembra DB25. Observando el conector de frente y con la parte que tiene mayor número de pines hacia arriba (figura 4), se numera de derecha a izquierda y de arriba a abajo, del 1 al 13 (arriba) y del 14 al 25 (abajo).
En este conector tenemos: 8 líneas (pines) son para salida de datos (bits de DATOS). Sus valores son únicamente modificables a través de software, y van del pin 2 (dato 0, D0) al pin 9 (dato 7, D7). 5 líneas son de entrada de datos (bits de ESTADO), únicamente modificables a través del hardware externo. Estos pines son: 11, 10, 12, 13 y 15, del más al menos significativo. 4 líneas son de control (bits de CONTROL), numerados del más significativo al menos: 17, 16, 14 y 1. Habitualmente son salidas, aunque se pueden utilizar también como entradas y, por tanto, se pueden modificar tanto por software como por hardware.
Las líneas de la 18 a la 25 son la tierra. En la tabla de la figura 5 se detallan la nomenclatura y descripción de cada línea. La columna “Centronics pin” se refiere a las líneas del conector tipo Centronics usado en las impresoras. La columna E/S se refiere al dato visto desde el lado del PC. El nombre de cada señal corresponde a la misión que cumple cada línea con relación a la impresora, el periférico para el que fue diseñado el puerto paralelo. Las señales activas a nivel bajo aparecen con la barra de negación (por ejemplo, Strobe). Cuando se indica alto o bajo se refiere a la tensión en el pin del conector. Alto equivale a ~5V en TTL y bajo a ~0V en TTL..
Figura 5
55
Figura 6
Acceso al puerto El puerto paralelo se identifica por su dirección de E/S (entrada/salida, I/O) base y se reconoce en sistemas MS-DOS por el número LPT (lp en Unix/Linux). Cuando arranca la máquina, la BIOS (Basic Input Output System) chequea direcciones específicas de E/S en busca de puertos paralelos y construye una tabla de las direcciones halladas en la posición de memoria 40h:8h (o 0h:0408h). Esta tabla contiene hasta tres palabras de 16 bits, cada palabra con el byte bajo primero seguido por el byte alto. Cada palabra es la dirección de E/S base del puerto paralelo (que denominaremos LPT_BASE en lo sucesivo). La primera corresponde a LPT1, la segunda a LPT2 y la tercera a LPT3. Hay que agregar que, en MS-DOS tenemos el dispositivo PRN que es un alias a uno de los dispositivos LPT (generalmente es LPT1, pero se puede cambiar con la orden MODE). Las direcciones base estándar para los puertos paralelos son: 03BCh 0378h 0278h Las direcciones son chequeadas en este orden. La tabla de la figura 6 muestra, como ejemplo, la memoria en un PC con dos puertos paralelo instalados en las direcciones hexadecimales 378 y 278. Registros El puerto paralelo estándar (SPP) consta, como se
Figura 7
56
mencionó antes, de tres registros de 8 bits localizados en direcciones adyacentes del espacio de E/S del PC (vea la tabla de la figura 7). Los registros se definen relativos a la dirección de E/S base (LPT_BASE) y son: LPT_BASE + 0: registro de DATOS LPT_BASE + 1: registro de ESTADO LPT_BASE + 2: registro de CONTROL Se hará referencia a cada bit de los registros como una inicial que identifica el registro seguido de un número que identifica el número de bit, siendo 0 el LSB (bit menos significativo) y 7 el MSB (bit más significativo). Por ejemplo, D0 es el bit 0 del reg. de datos, S7 es el bit 7 del reg. de estado y C2 es el bit 2 del reg. de control. Se indican con una barra de negación los bits que utilizan lógica negativa. En lógica positiva, un 1 lógico equivale a alto (~5V TTL) y un 0 lógico a bajo (~0V TTL). En lógica negativa 1 equivale a bajo (~0V) y 0 equivale a alto (~5V). Lo expresado lo podemos observar en el diagrama del conector de la figura 8. Es preciso no confundir la lógica que sigue el puerto con la lógica que mantiene la impresora. Por ejemplo, la impresora pone a alto Busy (pin 11) para indicar que está ocupada. Pero en realidad, al leer el registro de estado, Busy la interpretamos como 0 (puesto que el pin 11 se corresponde con S7). Es decir, es como si fuera activa en bajo (Busy). Registro de datos (D): El registro de estado se ha-
lla en LPT_BASE. Se Figura 8 puede leer y escribir. Escribir un dato en el registro causa que dicho dato aparezca en los pines 2 a 9 del conector del puerto. Al leer el registro, se lee el último dato escrito (NO lee el estado de los pines; para ello hay que usar un puerto bidireccional). En la figura 9 se describe el nombre que toma cada bit de este registro. El estándar es que las salidas sean LS TTL (low schottky TTL), aunque las hay que son de tipo OC (colector abierto). La corriente que pueden entregar (modo source) es de 2,6mA máximo y pueden absorber (modo sink) un máximo de 24mA. En el puerto original de IBM hay condensadores de 2,2nF a masa. Las tensiones para el nivel bajo son entre 0 y 0,8V y el nivel alto entre 2,4V y 5V. Registro de estado (S): El registro de estado está en LPT_BASE+1. Es de sólo lectura (las escrituras serán ignoradas). La lectura dá el estado de los cinco pines de entrada al momento de la lectura. En la figura 10 los nombres de los pines se dejaron en inglés porque es como generalmente se identifican. La línea Busy tiene, generalmente, una resistencia de pull-up interna. El estándar es que sean entradas tipo LS TTL.
de control (figura 11) se encuentra en LPT_BASE+2. Es de lectura/escritura. Los cuatro bits inferiores son salidas. La lectura devuelve lo último que se escribió a dichos bits. Son TTL a colector abierto con resistencias de pull-up de 4.7kW, por lo que un dispositivo externo puede forzar el estado de los pines sin dañar el driver. Esto permite utilizar estas cuatro líneas como entradas. Para ello, se ponen en alto las cuatro salidas (escribiendo 0100b, es decir, 4h, en LPT_BASE+2) lo que hace que las sa-
Figura 9
Figura 10
Registro de control (C): El registro
57
do C4=1, se activa el buffer y su entrada, S6, se conecta a la línea IRQ (en general es IRQ7 o IRQ5). La lectura del bit, nos devuelve el estado del mismo (es decir si el buffer está en alta impedancia o no). Se producirá una interrupción, cuando haya un flanco descendente en el pin correspondiente a S6. A continuación, se describen los pasos para poder utilizar interrupciones. Finalmente, en la figura 12 se muestra una tabla que reúne las características hardware y software del puerto paralelo.
Figura 11
lidas “floten”. Ahora, un dispositivo externo puede forzar a bajo alguna de las salidas con lo que, leyendo el puerto, sabemos si esto sucedió o no. Es posible realizar esta técnica en salidas totem-pole (como D0-D7) pero no se recomienda su uso porque habría que tener un conocimiento preciso de la corriente, ya que se puede sobrecargar los transistores de salida y dañar el driver (especialmente en puertos integrados LSI). Bit de puerto bidireccional (compatible PS/2): El bit C5, está disponible sólo si se trata de un puerto bidireccional; en los puertos comunes no se utiliza, al igual que los bits C6 y C7. Si C5=1, el buffer de los datos de salida se pone en alta impedancia, “desconectando” dicho buffer de los pines 2 a 9 del conector del puerto (D0 a D7). Si se escribe al registro de datos, se escribe al buffer pero no a la salida. Esto permite que al leer el puerto, se lea el estado de las entradas y no lo que hay en buffer. Cuando C5=0 el puerto retorna al modo salida, su estado por defecto. En las computadoras IBM PS/2, para habilitar el puerto paralelo bidireccional, además de lo antes descrito, se debe poner a 1 el bit 7 del registro del puerto 102h (opciones de configuración). En computadoras que no tengan puerto paralelo bidireccional compatible PS/2, hay que modificar uno o más bits de algún puerto específico correspondiente al chipset de la placa. A veces se habilita por el Setup o por jumper en la placa del puerto. Bit de interrupción: En trabajos normales de impresión, ni el BIOS ni el DOS hacen uso de la interrupción. El hecho de poseer una línea de interrupción que está conectada directamente al PIC (Programmable Interrupt Controller), lo hace muy útil para experimentación en data-loggers por ejemplo. El bit de interrupción está conectado al control de un buffer de tres estados. Cuan-
58
Protocolo del Puerto de Impresora El handshaking (“apretón de manos” o protocolo) es un conjunto de reglas que ambos extremos de un sistema de comunicación tienen que seguir para que la comunicación sea correcta. El puerto paralelo, usado con una impresora, transmite datos y transmite/recibe las señales de protocolo. Las principales son Strobe, Ack y Busy. La secuencia a seguir para enviar datos sería: Colocar el byte a enviar en el registro de datos. Verificar que la impresora no esté ocupada (Busy = bajo, S7 = 1). Indicarle a la impresora que acepte los datos (Strobe = bajo , C0 = 1, pulso >5us). En ese instante la impresora indica que está ocupada recibiendo los datos (Busy = alto, S7 = 0). Finalmente, la impresora envía un pulso de aceptación indicando que se recibieron los datos y que se puede volver al paso 1 (Ack = bajo, S6 = 0, pulso de entre 5 ms y 15 ms según impresora). Las otras señales sirven para verificar el estado de la impresora (Error, PaperEnd), para reiniciarla (Init) y para configurarla (AutoFeed, Select). En los nuevos puertos, estas señales adquieren otra función, a veces parecida y otras totalmente distintas. Interrupciones con el Puerto Paralelo En primer lugar, se debe habilitar el buffer que conecta la línea ACK con la línea IRQ. Esto lo hacemos poniendo a 1 el bit 4 del registro de control (LPT_BA-
Figura 12
59
SE+2). Luego se debe preparar una ISR (Interrupt Service Routine) que atienda la interrupción recordando enviar la señal EOI (20h) al registro de control del PIC (puerto 20h) al salir de la rutina. La interrupción software corresponde a la número 0Dh para IRQ5 y 0Fh para IRQ7. Finalmente se habilita con 0 la interrupción IRQ5 (o IRQ7) escribiendo al bit 5 (o 7) del registro de interrupciones del PIC (puerto 21h). Para desinstalar la ISR, se deshabilita la IRQ5 (o IRQ7) escribiendo un 1 al bit 5 (o 7) del registro de interrupciones del PIC (puerto 21h). Luego se hace que C4=0.
Velocidad Un puerto paralelo ISA normal toma un ciclo-ISA para leer o escribir. En un sistema cuya velocidad de bus sea 1,3MHz, se puede decir que la lectura se puede hacer cada 1 ms (idealmente, ya que siempre existen otras instrucciones software, etc; en la práctica pueden ser desde 1.2 ms a 2 ms). Algunos puertos soportan un modo “turbo” que elimina los 3 estados de espera de la CPU, con lo que la velocidad de lectura/escritura del puerto se duplica (2,7MHz).
Acceso Básico al Puerto Paralelo Programación básica de la E/S en Basic: Para realizar el control de dispositivos mediante el puerto para-
lelo debemos hacer uso de las funciones de QBasic que permiten acceder a los puertos hardware. Daremos unos ejemplos básicos de la programación de la E/S por el puerto paralelo. Estos ejemplos se presentan con un grado de estructuración creciente en el estilo de programación. En el primer ejemplo se supone que la PC está equipada con un puerto paralelo de tipo estándar localizado en la dirección 0x378, como suele ser habitual en Windows 98, de modo que el registro de datos se localiza en esa misma dirección y el de estado en 0x378+1. En el ejemplo (al que llamamos CTRL.BAS) se envía un byte a las líneas de datos y se recibe un byte de las líneas de estado con las funciones OUT e INP utilizando un estilo de programación muy básico, tal como se sugiere en la tabla 1. En el siguiente ejemplo se supone que la PC está equipada con un puerto paralelo de tipo bidireccional localizado en la dirección 0x378 de modo que el registro de datos se localiza en esa misma dirección y el de control en 0x378+2. El bit C5 del registro de control se utiliza como conmutador del modo salida (escritura en las líneas de datos) al modo entrada (lectura de las líneas de datos). En el ejemplo, mostrado en la tabla 2 y al que llamamos CTRL_0.BAS, se envía y se recibe un byte de las líneas de datos del puerto aprovechando su capacidad bidireccional utilizando las funciones OUT e INP sin mayores complicaciones en la programación. El siguiente ejemplo es funcionalmente idéntico al anterior, aunque se hace uso de las constantes de BASIC para dotar al programa de mayor elegancia y cla-
Tabla 1
60
Tabla 2
Tabla 3
61
ridad. También, facilita la reprogramación en caso de que, por ejemplo, el puerto no se halle en la dirección supuesta. Obsérvese en la tabla 3 que la constante 0x378 sólo aparece ahora una vez en el código fuente, frente a las cuatro veces que lo hacía en CTRL_0.BAS. Se ha hecho uso asimismo de la notación hexadecimal para los valores que activan y desactivan el bit C5 del registro de control. En el siguiente ejemplo, esta vez no es sólo maquillaje. Cuando en los casos anteriores hemos activado y desactivado el bit C5, pudimos también modificar el estado del resto de los bits del registro de control. Normalmente, es de buen gusto respetar el estado original del puerto cuando uno finaliza la ejecución de su programa. Así pues, en el siguiente ejemplo se lee (tabla 4, CTRL_2.BAS) en primer lugar el estado del registro de control y se almacena en un byte (que llamamos ctrl%). Cuando utilizamos OUT, lo hacemos de modo que úni-
camente modificamos individualmente el bit deseado, y no todos. Finalmente escribimos el byte ctrl% al registro de control para recuperar el estado original. Obsérvese que se usa el operador ~ para realizar el complemento a 1 de C5ON, de modo que nos ahorramos el definir otra constante simbólica para la condición de bit apagado. Ahora un cambio significativo: vamos a determinar, y no a suponer, dónde se halla situado el puerto paralelo (consúltese la sección correspondiente de El Puerto Paralelo del PC para conocer los detalles acerca de cómo determinar cuántos puertos se hallan instalados y qué direcciones de E/S ocupan). Para ello accedemos a la zona de memoria donde se registran las direcciones de los puertos paralelos presentes en el PC (en la zona de las variables de la BIOS), por mediación de la función PEEK. Una vez detectados los puertos presentes, nos quedamos con el primero y programamos la entrada-salida exactamente igual que en CTRL_2.BAS. Vea la programación de es-
Tabla 4
62
te ejemplo (CTRL_3.BAS) en la tabla 5. Por último, integraremos el código que localiza la dirección del puerto en ua función que devuelve dicha dirección. Para ello definimos la función PuertoDir%, sin argumentos y de tipo entero. Si dicha función no localiza ningún puerto devuelve un 0, lo que brinda al programa una posibilidad de terminar la ejecución cuando en un PC no existe puerto paralelo disponible (tabla 6).
Actividades Es recomendable que ponga en práctica lo dictado hasta aquí y para ello le sugerimos realizar algunos ejemplos básicos. Encendiendo un LED Realícese el montaje elemental esquematizado en la figura13. Puesto que se trata de un montaje inicial,
Tabla 5
63
Tabla 6
Figura 13
64
en el que se es posible “sacrificar” el orden respecto de la sencillez, se puede llevar a cabo uniendo directamente con regletas los componentes a los cables, e introduciendo éstos en las hembras del conector de la PC. Por supuesto, es preferible realizar montajes más estables, pero de ello nos ocuparemos más adelante. Nota: no es preciso puentear exteriormente entre sí las líneas 18-25 puesto que cada una de ellas es ya la tierra del puerto. En este montaje se ha conectado un LED (salida digital) en el pin 2 del puerto (bit D0 del registro de datos) y un interruptor (entrada digital) en el pin 15 (bit S3 del registro de estado). A los fines prácticos, intente realizar un programa en QBasic para la iluminación del LED y para la detec-
ción del estado del interruptor (véase el programa CTRL.BAS de la tabla 1 de la pághina 60). Ahora haga un montaje como el de la figura 14, donde se supone que el puerto paralelo tiene capacidad bidireccional y se ha conectado el interruptor (entrada digital) en el pin 3 del puerto (bit D1 del registro de datos). Haga un programa en QBasic para la iluminación del LED y para la detección del estado del interruptor (véase el programa CTRL_0.BAS).
Figura 14
Interfaces Básicos de E/S con el Puerto Paralelo
Circuito sin Alimentación Externa Se trata de un circuito muy sencillo que usa un mínimo de componentes y proporciona un test funcional de 8 bits. Cada bit de la entrada puede ser individualmente controlado y visualizado en los LED de salida. Los diodos LED que actúan de display se alimentan únicamente con la corriente proporcionada por las propias salidas del puerto. Sería preferible alimentar los LED y utilizar la corriente absorbida para iluminarlos, pero el conector no proporciona una señal de alimentación Figura 15 (Vcc), de modo que se necesitaría una fuente externa. Eléctricamente, el puerto paralelo entrega señales TTL y como tal, teóricamente, se le puede conectar cualquier dispositivo que cumpla con los niveles de voltaje específicos de la lógica TTL, sin embargo el hardware del puerto paralelo está muy limitado en cuanto a su capacidad de manejo de corriente, por ésta razón se debe ser muy cuidadoso con el
manejo de las señales del puerto: un cortocircuito puede dañar permanentemente la tarjeta madre del PC. Sin embargo, experimentalmente se comprueba que en la mayoría de los PC el puerto proporciona corriente suficiente para una clara indicación visual de los LED. El circuito se muestra en la figura 15. Las líneas de datos (D0-D7, pines 2-9) se utilizan como líneas de salida, e iluminan los LED cuando en ellas se fija por software un 1 lógico (+5V). Cuando se fija un 0 lógico, los LED se apagan. Como entradas se utilizan, como nibble (semibyte) bajo, las cuatro líneas
65
Figura 16
Figura 17
66
asociados al registro de control (C0,C1,C2 y C3, pines 1, 14, 16 y 17) y, como nibble alto, cuatro de las líneas asociadas al registro de estado (S4,S5,S6 y S7, pines 13, 12, 10 y 11). Obsérvese que las líneas de control se utilizan normalmente como salidas. Sin embargo, aquí deben ser configuradas como entradas. Obsérvese, asimismo, que cuatro de las líneas de entrada se corresponden con bits que utilizan lógica negativa (C0, C1, C3 y S7). Esto habrá de tenerse en cuenta cuando se realice el programa de control de esta interfaz. Los detalles sobre el montaje de éste y los posteriores circuitos se pueden consultar en la página web: http://cfievalladolid2.net/tecno/cyr_01
Circuito con Alimentación Externa Fijémonos ahora solamente en una de las líneas de entrada y en una de las líneas de salida. Un circuito como el de la figura 16 utiliza una fuente externa de +5V para alimentar los diodos LED y las señales de entrada. Un 1 lógico en D7 (bit 7 del puerto de DATOS) produce que el LED
se apague. Un 0 lógico produce la iluminación del LED. El interruptor normalmente abierto S produce que aparezca un 1 lógico (+5V) en la entrada Busy (registro de ESTADO, S7). Cuando se cierra S un 0 lógico (GND) se aplica a la entrada Busy. Un circuito como el precedente para las 8 líneas de entrada y salida es un alternativa al propuesto en la sección anterior. Las aplicaciones y programas prácticos para este circuito no son objeto der esta obra, pero las puede bajar de: http://cfievalladolid2.net/tecno/cyr_01
Circuito con Alimentación Externa y Etapa Separadora Para disminuir lo más posible el riesgo de daños al puerto, se puede utilizar un circuito integrado 74LS244 como etapa separadora en las líneas de salida. Al mismo tiempo se mejora la capacidad de manejo de corriente, de forma que se pueden conectar sin riesgo la serie de diodos LED que indican la actividad en las líneas de datos del puerto paralelo. El circuito se detalla en la figura 17. Por cada línea de entrada que tomamos directamente del puerto paralelo existe una etapa amplificadora-separadora dentro del circuito integrado 74LS244 que nos permite trabajar con una tasa de entrega de corriente suficiente para desplegar en los diodos emisores de luz la información escrita en las líneas de datos del puerto. Además es posible habilitar ó deshabilitar el despliegue del nibble de orden inferior ó superior del byte escrito en el puerto. Colocando en un nivel lógico alto el pin 1 del CI 74LS244 inhabilitamos el despliegue del nibble de orden bajo y un nivel lógico alto en la patita 19 evita el despliegue del nibble de orden alto. Por comodidad, se conectan las patitas 1 y 19 permanentemente a tierra de tal manera que sea posible visualizar la actividad en los diodos LED. Este circuito, al igual que otros presentados en este texto, necesita de alimentación externa. Se puede alimentar directamente mediante una fuente de +5V, o construir ésta usando una pila de 9V o un adaptador universal, y un regulador de voltaje 7805. El 7805 puede regular cualquier voltaje de entre 7 y 25V c.c. hasta los 5V que precisa el circuito (vea el diagrama de conexión del regulador en la figura 18.
Circuito Bidireccional con Alimentación Externa El circuito de la figura 19 aprovecha la capacidad bidireccional del puerto paralelo de la práctica totalidad de los PCs actuales. Así, las 8 líneas de datos del puerto (D0-D8) se pueden utilizar a modo de un bus de datos que, en ocasiones contiene los valores que serán leídos por la computadora y, otras veces, transporta los datos que ésta envía a la salida digital. No es preciso ahora utilizar las líneas de estado y de control del puerto a modo de entradas, como se hacía en el circuito sin alimentación externa (figura 15). Este circuito utiliza los siguientes CI: 74LS573: un registro octal latch D transparente usado como puerto de salida para iluminar los diodos LED, o cualquier dispositivo al que se le quieran enviar señales digitales. 74LS245: un transceptor octal bidireccional que proporciona un puerto de entrada de 8 líneas; toma datos de entrada de 8 interruptores o de cualquier dispositivo desde el cual se quiera leer información digital. Ambos integrados se controlan mediante el bit C0 del registro de control. Cuando el pin 1 se halla en alto, los datos escritos por el puerto se transfieren a los LED mediante el 74573, mientras que el 74245 está aislado del bus de datos. Cuando el pin 1 está bajando, los datos a su entrada se conservan en la salida. Cuando el pin 1 está bajo el 74245 se habilita y los datos presentes en su entrada se transfieren a su salida y pueden ser leídos por el programa. El bit C5 se utiliza como control de las operaciones de lectura/escritura del puerto bidireccional. El programa debe fijar tanto C0 como C5 a 0 para realizar una escritura (es decir, debe escribir un valor de-
Figura 18
67
cimal 0 el el registro de control). Para llevar a cabo una lectura ambos bits deben ser establecidos a 1 (es decir, debe escribir un valor hexadecimal 0x21, o decimal 33, en el registro de control).
Display de 7 Segmentos Una posibilidad es sustituir, en los montajes anteriores, el sistema de visualización mediante 8 diodos LED por un display numérico de 7 segmentos (figura 20) más un punto decimal. El circuito resulta así más compacto.
Si se trata de un display de ánodo común hay que alimentar con Vcc= +5V las dos líneas señaladas como comunes en la figura, y es preciso poner a tierra la línea correspondiente al segmento que se quiere iluminar. Si se trata de un display de cátodo común, hay que alimentar con +5V el segmento que se desea iluminar y poner a tierra las dos líneas comunes. Así, en un display de cátodo común, las líneas 1-8 se pueden conectar directamente a las líneas de datos del puerto (pines 2-9 del conector DB25), y las dos líneas comunes se pueden conectar a cualquiera de las patillas de tierra del conector, por ejemplo, la 25. Reiteramos que si Ud. desea realizar los montajes
Figura 19
68
de los circuitos propuestos, o si quiere analizar con mayor profundidad lo que aquí se expone, puede visitar la página de Internet:
Figura 20
http://cfievalladolid2.net/tecno/cyr_01. Cabe aclarar que los circuitos se pueden montar sobre una placa tipo "protoboard" y utilizar cable rígido para realizar las conexiones necesarias entre los componentes. Las entradas/salidas del circuito hacia el PC se pueden reunir en un conector DB25 macho unido a la placa por líneas de cable rígido o de cable plano. A su vez, el conector macho se puede unir directamente al conector hembra de la PC mediante un cable de extensión paralelo, lo que normalmente resulta más cómodo para acceder a la parte trasera de la PC donde se sitúa el conector hembra. Para simplificar los circuitos que utilizan interruptores a modo de entradas digitales, éstos se pueden reunir en un único DIP switch de ocho posiciones. Lógicamente, para cada circuito podemos realizar diferentes actividades, pero ese tema, desarrollado por el autor en la web, será objeto de otras publicaciones.
Distinguiendo los Sistemas Operativos Sin hilar muy fino, podemos decir que un sistema operativo debe fijar reglas claras para todo fabricante de software que desee ejecutar programas en él, ya que al utilizar una PC, estamos abiertos a ejecutar aplicaciones de distintos orígenes. Por lo tanto, se debe asegurar “derechos y obligaciones” para que los programas dentro de un sistema no se interfieran (y perjudiquen) entre ellos. Como conclusión y grandes rasgos podremos decir que el Sistema Operativo sirve de intermediario entre los programas y el hardware. (Figura 21)
gresa al mundo de las PCs, lo hace a través de Windows, lo asumimos casi de manera natural porque no importa dónde vayamos, siempre hay una máquina con Windows cerca. • Linux: considerado como “el sistema de los nerds”, ha ido evolucionando hasta convertirse en un sistema operativo amigable que puede llegar a superar en estabilidad a la plataforma Windows. Está diseñado y probado sobre la base de las contribuciones de miles de usuarios y programadores independientes en distintas partes del mundo que aportan su granito de arena para que el sistema crezca y progrese. Sin embargo, tiene en contra la “tendencia cultural” impuesta por Windows que le impide difundirse ampliamente.
No hay dudas que en el mercado y en la comunidad de usuarios podemos hallar 3 Sistemas Operativos que se destacan, o al menos hemos oído hablar de la mayoría. • Windows: sin dudas, es el sistema operativo mejor afianzado en el mercado (más que por elección de los usuarios, por costumbre). Casi todo usuario que in-
Figura 21
69
• DOS: si bien ese trata de un sistema operativo en desuso, podría considerarse como el más veloz y sencillo de los tres (incluso podría considerarse ideal para tareas dedicadas. Sus comandos todavía pueden utilizarse cuando utilizamos el “símbolo de sistema” de Windows XP o la “terminal” de Linux. No existe una definición clara de driver para esta arquitectura, ya que teóricamente cualquier aplicación puede hacer E/S en forma directa.
Los Drivers, Comunicando Hard&Soft Definiremos como drivers o controladores a las herramientas o rutinas necesarias para que el sistema operativo interactúe con el hardware. Tendremos drivers de sonido, puertos, unidades de disco, etc. El driver por sí mismo no es un programa accesible por el usuario. Las aplicaciones interactúan indirectamente con el dispositivo a través de llamadas del sistema, las cuales luego se traducen por el SO en instrucciones de entrada salida. Los sistemas operativos actuales no tienen por qué saber de fábrica, como funciona todo el hardware existente en el mercado. Si esto fuera posible, acarrearía cantidades enormes y mayormente innecesarias de información. Lo que suele hacerse es armar un paquete que recopile versiones estables (libres de errores) de los drivers de dispositivos comerciales de uso común.
Soporte de Programación Refiriéndonos a los drivers o controladores, no existe un driver genérico multiuso que sirva para todos los tipos de sistemas operativos. Es más, generalmente se programa un driver para varias versiones de un sistema determinado. Por lo tanto, si desarrollamos un proyecto de hardware, deberemos considerar en qué sistemas y/o PCs lo vamos a conectar. Sobre los sistemas anteriores podemos decir: • Microsoft ofrece para sus sistemas Windows un set de librerías llamado DDK (Driver Development Kit). Consiste en numerosas ayudas, ejemplos y herramientas destinadas a programas de un nivel avanzado. Este paquete tiene un costo, y se entrega para la última versión de Windows disponible en el momento de su compra.
70
• Respecto al soporte de drivers de Linux, con un poco de paciencia podemos encontrar mucha información gratuita en Internet, con una muy buena documentación. Pero nuevamente se exige un alto conocimiento de programación. • Molestando un poco más con DOS, podemos decir que existe mucha bibliografía escrita, y aún puede encontrarse información en la red sobre E/S con este sistema, sigue siendo la alternativa más simple.
Simple vs Complicado DOS es más simple, ya que se trata de un sistema monotarea (trabaja con una aplicación a la vez). Linux y Windows son sistemas multitarea (más de una aplicación a la vez...) por lo que necesitan controlar estrictamente que es lo que maneja cada aplicación para que en ningún momento se produzcan situaciones conflictivas (por ejemplo, dos aplicaciones queriendo imprimir a la vez). Para lograr su cometido, los sistemas multitareas han tenido que perfeccionar niveles y permisos que les permitan decidir en qué momento una aplicación accede a un dispositivo.
Niveles de Trabajo Para explicar este concepto necesitaremos aclarar la idea de proceso: un programa puede estar constituido por varios procesos simultáneos que realizan distintas tareas. Cada proceso tiene asignado para sí recursos determinados (direcciones E/S disponibles, servicios disponibles, cantidad de memoria asignada, prioridad frente a otros procesos) Con la aparición de los procesadores 386, se empezó a hablar de niveles de privilegio o de ejecución, estos se clasificaban en: • El nivel 0, nivel Kernel o Monitor: aquí un proceso tiene acceso irrestricto al hardware tiene acceso al hardware. En este nivel se ejecuta el núcleo del sistema operativo. Evidentemente el fallo de un programa en nivel cero, tiene por consecuencia la caída inexorable de la máquina. • Los niveles 1 y 2 estaban destinados a ejecutar los drivers del sistema. En el caso de Microsoft, se optó por ejecutarlos a nivel Kernel (nivel 0), Linux siguió la misma tendencia.
• El nivel 3 o nivel Usuario: Allí se ejecutan los programas de usuario, los cuales sólo pueden acceder al hardware o a los recursos del sistema, a través de los niveles anteriores. Un sistema operativo en si tiene numerosos procesos, que se ejecutan en diferentes niveles, según las necesidades y operaciones a cumplir por cada uno. Podríamos hacer una analogía con una estructura de una empresa, los gerentes (nivel 3) pueden decidir sobre el destino de una planta de procesamiento, pero los operarios (nivel 0) son los que trabajan directamente con las máquinas y herramientas. Con esto podemos decir que una instrucción desde el nivel de usuario puede desencadenar varias operaciones a nivel de kernel sobre el hardware. A la vez, el nivel de usuario nos permite generalizar ciertas operaciones. De esta manera, si un desarrollador de software deseara reproducir un sonido, no necesita aprender el funcionamiento interno de cada placa de sonido existente, sino entregarle al sistema operativo la orden de “reproducir” y éste, a través de drivers provistos por el fabricante del hardware instalado, realizará la operación. Las transiciones de nivel (desde que se pide una acción, hasta que se ejecuta una operación E/S), sólo pueden hacerse a través de puertas de tarea asignadas por el núcleo (coordinador supremo) del sistema. Ningún proceso tiene acceso directo al hardware con lo cual se evitan caídas del sistema por errores de programación (al producirse un error de programa en el nivel 3, el sistema operativo toma control, informa del error y limpia totalmente la tarea y restos de ella) Un ejemplo: en la Figura 22 podemos ver el recorrido de acciones que se van sucediendo cuando una aplicación requiere acceder a un dispositivo de almacenamiento externo (por ejemplo, un disco rígido). El acceso directo al dispositivo se produce solamente desde los procesos dentro del núcleo. Figura 22
Adquisición de Datos Placa Interna Cuando hablamos de adquisición de datos, nos referimos a tomar un valor analógico o digital (proveniente de sensores, interruptores, etc.), convertirlo a dato manipulable por la PC y almacenarlo en una dirección de memoria determinada. Si bien los sensores son externos, el dispositivo adquisidor puede ser interno (en forma de placa de expansión con entradas analógicas o digitales). Empezaremos mencionando los distintos métodos de comunicación entre el elemento adquisidor interno y la PC: • Por interrupciones: en este caso, un módulo o dispositivo (ya sea un puerto externo o elemento interno) posee cierta inteligencia que le permite informar al sistema acerca de nuevos datos entrantes. El módulo en cuestión produce una señal, el sistema operativo “interrumpe” momentáneamente sus operaciones en respuesta a esa señal ejecutando una rutina, que puede servir tanto para tomar datos de entrada como para producir una salida. • A través de Encuesta: en este caso, el sistema “consulta” al dispositivo acerca del estado de los datos, o toma directamente una lectura sin ninguna verificación. El dispositivo adquisidor adopta una actitud más bien pasiva, no reacciona a menos que el sistema
71
provoque una operación de entrada o salida. A su vez, los métodos de encuesta se pueden distribuir en dos clasificaciones fundamentales: • Utilizando de DMA: en este caso, el sistema informa al dispositivo que se prepare a entregar o recibir una cantidad determinada de datos con no más de 3 instrucciones. A partir de ese momento, el dispositivo mismo toma control del sistema, escribe o lee los datos directamente de la RAM sin intervención del microprocesador, y al terminar el volcado de memoria devuelve el control al sistema operativo. • A través de operaciones directas de E/S: este es un método más lento. A diferencia del DMA, el microprocesador tiene que realizar registro por registro las operaciones de E/S entre la memoria y el dispositivo adquisidor. Por ejemplo, supongamos que tenemos que volcar en memoria 256kbytes alojados en los registros de un dispositivo adquisidor: por cada byte transferido, el procesador primero tendría que leer cada dato del registro del dispositivo adquisidor, procesarlo y luego escribirlo en la memoria. Todo esto llevaría varias instrucciones de programa y de proceso, muchas más que con DMA, pero nos permitiría ir evaluando dato por dato antes de escribirlo a memoria (con DMA primero volcamos a memoria, luego trabajamos con los datos transferidos) Instantáneamente surge una duda, ¿como hacemos para implementarlo?. Hemos visto lo simple que es programar microcontroladores (el assembler de PIC pinta feo de lejos, pero al aprenderlo nos damos cuenta que con unas pocas líneas podemos armar una buena secuencia de automatismo). En este caso, es un poco más complicado: cualquier proyecto de E/S utilizando los sistemas operativos Linux o Windows no es tarea fácil... demanda conocimientos de programación que exceden el básico y requiere conocimientos de drivers y programación.
Adquisidor Externo Según la aplicación, los dispositivos adquisidores pueden considerarse como “cajas negras” externas, conectadas a los sensores e interruptores pon un lado, y a un puerto externo de la PC por el otro. Este tipo de elementos nos da gran portabilidad, ya que no necesitamos desarmar la PC para trasladar el elemento adqui-
72
sidor. Los sistemas operativos actuales ofrecen librerías o al menos nos dan la posibilidad de trabajar con los puertos a través de drivers provistos por el sistema. Uno de los protocolos más definidos por la diversidad de aplicaciones es el RS-232 (o puerto serie), presente en muchos PLCs y Dataloggers. Como vimos, las Aplicaciones entran dentro del modo Usuario y se comunican con el hardware a través de drivers y llamadas al sistema, los cuales se regulan por restricciones y prioridades. Cada uno de los sistemas vistos tiene sus peculiaridades con respecto a la E/S directa. • Si bien DOS es el único sistema de los mencionados que soporta E/S directa, se considera obsoleto por la comunidad informática en Gral. • Windows en forma nativa no soporta E/S directa desde una aplicación. • Linux soporta E/S directa desde una aplicación, pero solamente si el que ejecuta esa aplicación tiene privilegios de root (administrador de sistema). También vimos que hay distintas maneras de comunicarse con una placa conectada a la PC usando Interrupciones, DMA y E/S. Pero lo que no aclaramos fue que todos estos tipos de transferencia requieren en algún momento E/S directa, tanto para programar el controlador de DMA, como el de Interrupciones.
E/S en DOS Las PCs recién adoptaron las características de seguridad y enfoques de capa de usuario y de Kernel a partir de la década del 90, con el surgimiento de Linux y las versiones de Windows NT (que requerían una mayor estabilidad que las versiones hogareñas de Windows). Por este motivo, cualquier lenguaje de programación de alto nivel que corra en DOS soporta E/S directa. La industria nos ha llevado a ir escalando los sistemas operativos y entornos más amigables, más tareas simultáneas, desechando lo anterior. De todas maneras, este tipo de lenguajes y plataformas. puede ser bastante útil para tareas didácticas, ya que con pocos conocimientos de programación y con computadoras
de bajas prestaciones, se pueden realizar numerosos proyectos que pueden llegar a ser vistosos, no tanto por los colores de ventanas vistas en pantalla, sino por los elementos controlados. Esto puede posibilitar que muchas escuelas con escasos recursos puedan aprovechar equipos antiguos para diseño de proyectos de E/S. Si poseemos una versión de DOS viejita, podemos llegar a encontrar BASICA y GW-BASIC, variantes del lenguaje de programación BASIC. A partir de MSDOS 5.0 y hasta Windows 95 inclusive se incluyó el QBASIC (basado en el QuickBasic 4.5, pero sin compilador). Tanto QBASIC como BASICA y GW-BASIC son sólo intérpretes (son siempre necesarios para ejecutar los programas). Microsoft dejó de proveer el QBASIC en las versiones siguientes de Windows. QBASIC nos provee dos simples instrucciones: • INP(Puerto): devuelve un byte (8 bits) desde un puerto de E/S • OUT Puerto, dato:. envía un byte a un puerto de E/S.
Recuadro 1 DEFINT A-Z Cuenta=5000 CLS PRINT “Secuencia de Luces” PRINT “Pulse una tecla para terminar...” DO FOR I = 0 TO 7 Salida = 2 ^ I OUT &h378,Salida Retrasa Cuenta NEXT FOR I = 6 TO 0 STEP -1 Salida = 2 ^ I OUT &h378,Salida Retrasa Cuenta NEXT LOOP UNTIL INKEY$<>”” END SUB Retraso (Ciclos%) FOR P% = 0 TO Ciclos NEXT P% END SUB
Figura 23
73
Se debe aclarar que se ha tomado la dirección &H378 (correspondiente al Licencia y Código Fuente LPT1). Según la configuración de su sisIO.DLL es completamente gratis! Sin embargo, usted no podrá: tema, puede ser que el puerto paralelo • Cobrar esta librería de ninguna manera. Por ejemplo, usted no puede donde se conectan los led responda a venderla como un producto individual. • Esconder la IO.DLL detrás de un control OCX (utilizado por los lengua- la citada dirección o que deba camjes de Microsoft) o control Delphi. Esto tambien se considera como “trabajo biarse por &h278 o &h3BC (esta última derivado” y también debe proveerse gratuitamente. dirección era muy utilizada en las PCs • Asumir la propiedad intelectual. que tenían placa de video con puerto El autor no se hace responsable de las consecuencias de usar IO.DLL. paralelo incluido). En caso de no saber No se ofrecen garantías. El código fuente está disponible por u$s1000 (sí, mil!) dólares. El autor cuál es la dirección que corresponde a ofrece también la posibilidad de hacer una adaptación “a medida” en el caso nuestro puerto, no rompemos nada con de que algún usuario la requiera (con su tarifa, claro). intentar ver cuál de las tres funciona, ya que son direcciones destinadas especíDentro del Recuadro 1 podemos ver un simple ficamente a estos puertos. Escribir en ellas no provocaejemplo donde a través de un programa en QBASIC rá ningún conflicto con ningún otro elemento de hardya través del puerto paralelo hacemos una secuencia ware conectado. de luces tipo “Auto Fantástico”. En la figura 23 vemos una de tantas implementacioEn este ejemplo definimos una variable Cuenta, ésnes circuitales que puede utilizarse para demostrar esta nos permite acomodar la velocidad en que se desplate ejemplo, en este caso colocamos un buffer 74LS244 zan los leds a través de la subrutina Retraso, cuya únipara protección del puerto. ca función es hacer que el programa pierda tiempo de Los 5V que alimentan este circuito integrado puela misma manera que podríamos poner varias instrucden obtenerse de la misma fuente de alimentación de ciones NOP en un programa de un PIC. la PC a través de cualquiera de los cables rojos que aliSe incluyen dos bucles FOR que determinan el desmentan a los discos rígidos, disqueteras o lectoras de plazamiento del bit que enciende cada led desde un CD-ROM. extremo hacia el otro y un bucle exterior que finaliza Algo muy importante: para evitar daños, no olvide cuando se presiona una tecla, terminando el programa. verificar el circuito antes de conectarlo al puerto. Recuadro 2
Tabla 1 - Instrucciones provistas por IO.DLL Instrucción PortOut PortWordOut PortDWordOut PortIn PortWordIn PortDWordIn SetPortBit ClrPortBit NotPortBit GetPortBit RightPortShift LeftPortShift IsDriverInstalled
Uso Escribe un byte al puerto especificado Escribe una palabra (de 16 bits) al puerto especificado Escribe una palabra doble (de 32 bits) al puerto especificado Lee un byte del puerto especificado. Lee una palabra (16 bits) del puerto especificado Lee un palabra doble (32 bits) del puerto especificado Setea en 1 el bit especificado del puerto indicado Setea en 0 el bit especificado del puerto indicado Invierte el estado del bit especificado del puerto indicado Lee el estado del bit especificado Provoca una rotación a la derecha del contenido del puerto haciendo que LSB pase a MSB Provoca una rotación a la izquierda el contenido del puerto haciendo que MSB pase a LSB Devuelve un valor distinto de 0 si la DLL está cargada en memoria
NOTA: LSB=Least Significative Bit (Bit Menos Significativo) MSB=Most Significative Bit (Bit Más Significativo)
74
E/S directa con Windows Windows 95/98 tiene una cierta permisividad sobre las operaciones de E/S directas desde aplicaciones, aunque esto es aplicable sólo en algunas versiones de lenguajes de programación. (por ejemplo se puede hacer un “artilugio” para tener E/S desde una aplicación realizada en Delphi 1.0, pero no se puede con la versión 2.0). Además, este tipo de operaciones E/S requiere un poco de conocimientos de assembler de 80x86, complicando más la tarea de programación. A partir de Windows NT y sus sucesores (2000 y XP) el criterio de E/S es mucho más estricto, implementaciones de E/S que funcionan en Windows 95/98 probablemente no funcionen en Windows 2000/XP, salvo que sean implementadas a través de drivers (programables a través del Microsoft DDK, que junta 2 características problemáticas: caro y difícil para el programador principiante) IO.DLL: un recurso más que útil Aplicaremos una librería externa(IO.DLL) diseñada por Fred Bulback, un programador independiente, totalmente ajeno a Microsoft (podemos ver su página http://www.geekhideout.com). Esta librería permite desarrollar aplicaciones que funcionen desde Windows 95 hasta Windows XP, pasando por todas las versiones intermedias. Es muy versátil y provee varias funciones que facilitan la tarea de Entrada-Salida, no
se necesitan conocimientos de assembler. Sólo se requieren conocimientos mínimos de algún lenguaje de alto nivel como Visual Basic, C, o Delphi. El autor especifica claramente en su página cuales son los límites de utilización, los conceptos básicos legales se pueden observar en el Recuadro 2. En la tabla 1 vemos las instrucciones provistas por IO.DLL
Un Ejemplo en Visual Basic A modo de ejemplo, veremos cómo realizar E/S en Visual Basic a través de IO.DLL. Para poder utilizar esta librería basta con copiar el archivo IO.DLL en la carpeta donde está el programa en desarrollo y agregar en un módulo BAS las siguientes declaraciones: vea el cuadro 3. Si bien es un ejemplo que puede parecer bastante tonto, se quiere mostrar que con pocas líneas de programa podemos lograr respuestas por parte del hardware a través de eventos ocurridos en la PC. De la misma manera, a través de las funciones de entrada PortIN y PortWordIN, podríamos guardar el contenido del puerto en una variable para su manipulación y posible emisión de una nueva salida. Con conocimientos mínimos de cualquier lenguaje de programación podríamos adaptar el ejemplo en DOS para utilizarlo en Windows, ya que existe la instrucción OUT de Qbasic y el PortOut de IO.DLL son similares, así como también hay similitud entre la función INP de Qbasic y su correspondiente PortIN de la libre-
Recuadro 3 Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer) Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long) Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean Private Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Private Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Private Declare Function IsDriverInstalled Lib "IO.DLL" As Boolean
75
Asumiendo unos conocimientos mínimos de Visual Basic, agregamos un Evento que se ejecuta al momento de cargar el programa: Private Sub Form_Load() PortOut &H378,0'Pone todas las salidas en el puerto paralelo en 0 End Sub Ahora, supongamos que agregamos un botón de comando (similar a los botones de una ventana del tipo “OK”,”Aceptar” o “Cancelar”). Queremos colocar una salida determinada en el puerto paralelo después de hacer click en un botón llamado “Setear” y otro llamado “Resetear”. Entonces, generamos dos botones de Comando (estamos suponiendo conocimientos básicos de VisualBasic) y luego tipeamos: Private Sub Setear_Click()
'Relacionada al evento de hacer “click” sobre el botón Setear
PortOut &H378,255
'Coloca todos los bits de datos del puerto paralelo (D0-D7) en 1
End Sub Private Sub Resetear_Click()
´Relacionada al evento de hacer “click” sobre el Resetear
PortOut &H378,0
'Coloca todos los pines del puerto paralelo en 0 (leds apagados)
End Sub
ría de Fred Bulback. Si hablamos del puerto paralelo, podremos encontrar mucha información en la web referida al tema con proyectos relacionados al control desde PC de montajes electrónicos. En el Recuadro 3 encontraremos varias direcciones útiles con implementaciones interesantes a través del puerto paralelo en otros lenguajes de programación. Ojalá que este tema sea disparador de grandes ideas,
76
De esta manera damos por finalizada esta obra aclarando que al momento de escribir erstas líneas estamos preparando otro tomo de la colección del C lub Saber Electrónica destinado a explicar diferentes sistemas de adquisición de datos y manejo de circuitos a través de los diferentes puertos de la PC. ¡Hasta la próxima!