manejo de puertos

26
51 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á intro- ducida hoy en día, en su versión personal en multitud de hogares, y el hombre medio va conociendo en cre- ciente proporción, además de su existencia, su modo de uso y buena parte de sus posibilidades. Pero de- jando de lado esta verdadera revolución social, exis- ten otros conceptos procedentes del desarrollo tecno- lógico que han superado las barreras impuestas por las industrias y centros de investigación, incorporán- dose en cierta medida al lenguaje coloquial. Es llama- tivo como entre éstas, se destaca el concepto de ro- bot. 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 seme- janza a los seres vivientes, sino de la necesidad. Fue la escasez la que dio origen a la agricultura, el pas- toreo, la caza, la pesca, etc. Luego, la necesidad pro- vocó la primera revolución industrial con el descubri- miento de la máquina de vapor de Watt y, actualmen- te, 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 insu- ficiente la automatización industrial rígida, dominan- te 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 com- putadora empleando ejemplos prácticos que podrá utilizar para diferentes aplicaciones.

Upload: eduardo-alejandro-aguilar

Post on 30-Jun-2015

1.601 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Manejo de Puertos

51

El ciudadano industrializado, “muy cambiante eneste último tiempo”, se ha visto en la necesidadde asumir, en escasos 30 años, el significado de

un buen número de nuevos conceptos marcados porsu alto contenido tecnológico. De ellos, sin duda, elmás relevante ha sido la computadora. Ésta está intro-ducida hoy en día, en su versión personal en multitudde hogares, y el hombre medio va conociendo en cre-ciente proporción, además de su existencia, su modode uso y buena parte de sus posibilidades. Pero de-jando de lado esta verdadera revolución social, exis-ten otros conceptos procedentes del desarrollo tecno-lógico que han superado las barreras impuestas porlas industrias y centros de investigación, incorporán-dose en cierta medida al lenguaje coloquial. Es llama-tivo como entre éstas, se destaca el concepto de ro-bot. Pero el robot industrial, que se conoce y emplea

en nuestros días, no surge como consecuencia de latendencia o afición de reproducir a imagen y seme-janza a los seres vivientes, sino de la necesidad. Fuela escasez la que dio origen a la agricultura, el pas-toreo, la caza, la pesca, etc. Luego, la necesidad pro-vocó la primera revolución industrial con el descubri-miento de la máquina de vapor de Watt y, actualmen-te, la necesidad ha cubierto de computadoras la fazde la Tierra. Inmersos en la era de la informatización,la imperiosa necesidad de aumentar la productividady mejorar la calidad de los productos, ha hecho insu-ficiente la automatización industrial rígida, dominan-te en las primeras décadas del siglo XX. En este capí-tulo veremos algunos conceptos de control y cómorealizarlos mediante el uso de los puertos de una com-putadora empleando ejemplos prácticos que podráutilizar para diferentes aplicaciones.

Page 2: Manejo de Puertos

52

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 lastareas agrícolas se han incorporado máquinas por to-dos conocidas como el tractor, el arado o la cosecha-dora. También se habla del mecanizado de piezas enun taller, cuando para su fabricación se utilizan máqui-nas como tornos o fresadoras, es decir, cuando seabandona la fabricación manual y se sustituye por pro-cesos mecanizados que permiten mejores acabados ymayor rapidez en la confección de elementos.

Un paso más allá es la automatización, considera-da como la supresión parcial o total de la intervenciónde las personas en la realización de tareas productivas,como las tareas agrícolas, industriales o administrati-vas. Los autómatas son un caso muy conocido de con-trol, ya tradicional, que se ha venido aplicando a aque-lla clase de máquinas en las que una fuente de energíaacciona un mecanismo, que permite imitar los movi-mientos de los seres animados. Se conocen autómatasque fueron construidos por los griegos en el templo deDédalo; sin embargo, uno de los casos más difundidoses el del Pato de Vaucanson (Grenoble 1709-París1782) construido en 1738, que era un pato artificialcapaz de batir las alas, zambullirse, nadar, tragar gra-no e incluso expeler una sustancia parecida al excre-mento. Otro caso de autómatas célebres aunque máspróximo a nuestro tiempo es el del jugador de ajedrezde Torres Quevedo, construido en 1912, capaz de ju-gar finales de partida (rey contra rey y torre). Pero de-be ponerse de manifiesto que los autómatas siempre re-piten el mismo modelo de actuación, no son reprogra-mables y tampoco son capaces de variar sus accionesen función del entorno o la situación.

El control numérico es la supervisión y regulaciónde determinadas tareas mecánicas de precisión, reali-zadas por una máquina herramienta. El control de es-tas tareas se realiza de forma automática para evitar,de este modo, que el control se lleve a cabo por un ope-rario que, en ocasiones, podría verse sometido a cier-tos riesgos en un proceso donde es imposible erradicarlos errores humanos. De esta forma, se ajusta al máxi-mo la precisión en la confección de piezas estandariza-das y se libera al operario de su control, mejorando lacalidad y la cantidad del trabajo realizado. Un ejem-plo de control automático es el control de la velocidadde giro de un taladro o la velocidad y control de avan-ce de un torno o fresadora. Otro sistema de control au-

tomático es el servocontrol. Consiste en controlar, deforma automática, las acciones de una máquina en fun-ción de unos parámetros definidos y sus variaciones.Por ejemplo, el servocontrol se puede utilizar para con-trolar la velocidad de giro de un torno, de forma quese mantenga fija dentro de unos límites. Otro ejemplode servocontrol podría ser el del freno de algunos vehí-culos en los que la fuerza transmitida a las ruedas esproporcional a la fuerza aplicada por el conductor so-bre el pedal del freno; de esta función se encarga unmecanismo servocontrolado que se llama servofreno.

La robotización es también una automatización deprocesos sin la intervención humana, pero en este casose da un paso más; hay desplazamiento de cargas, ma-nipulación de objetos y un fuerte componente de reali-mentación. Es decir, este tipo de automatización permi-te la manipulación automática y programable de accio-nes y objetos. La realimentación es un proceso impres-cindible en la robotización, ya que dota a un procesode capacidad para captar información que, una vezprocesada por la máquina, permite modificar su com-portamiento (sus acciones). Una máquina que posea lacapacidad de realimentación, es capaz de modificarsus respuestas en función de las variaciones de su en-torno. Centrando el análisis en las diferencias que exis-ten entre automatización y robotización, puede decirseque una máquina automatizada (autómata) respondesiempre de igual manera ante sucesos de idéntica natu-raleza. Mientras que por el contrario un robot, es decir,una máquina robotizada, se caracteriza porque puedemanejar objetos y, lo más interesante, es un dispositivomultifuncional y reprogramable. Una máquina robotiza-da es capaz de hacer trabajos totalmente diferentes yadaptarse al medio, ya que puede tomar decisiones enfunción de las condiciones exteriores.

La totalidad de los procesos de mejora y control dela producción pueden sintetizarse en tres fundamenta-les: Procesos de mecanización, procesos de automati-zación y procesos de robotización. Las principales ca-racterísticas de cada uno de estos tres grupos se expo-nen en el cuadro de la figura 1.

La Computadora Como Sistema de Control

La aparición del computador en la década de los40, acelera vertiginosamente el desarrollo de autóma-tas y robots. La cuestión es: ¿podemos hacer servir lalPC como un autómata o un robot?. Para poder respon-

Page 3: Manejo de Puertos

53

der es preciso verificar si se cumplen las siguientescondiciones:

¿Podemos conectarle sensores? ¿Podemos conectarle actuadores? ¿Podemos programarlo (y reprogramarlo) para

que tome decisiones en función de los sensores y deinstrucciones previas para que los actuadores operenen consecuencia?

La respuesta a las tres cuestiones es afirmativa yaque:

“La PC cuenta para comunicarse con sus periféri-cos, incluso en su versión más básica, con diversos dis-positivos de entrada: puertos paralelo y serie, USB,joystick, micrófono... Ade-más, es posible agregarletarjetas especializadasque añaden otras muy di-versas clases de entradas”

También cuenta convarios dispositivos de sali-da: puertos paralelo y se-rie, USB, sonido, video...Asimismo, se pueden aña-dir tarjetas especializadasque expanden el número ytipo de entradas.

Por otras parte, sonmuchos los lenguajes deprogramación utilizablesen la PC que permiten leerlas entradas y modificarlas salidas: BASIC, LO-GO, Pascal, C, Ensambla-dor, etc. (figura 2).

El Puerto de la PC Introducción

Hace años, IBM diseñó el puerto paralelo paramanejar impresoras desde su gama de microcomputa-dores PC/XT/AT. Un conector estándar macho de 25pines aparecía en la parte trasera de la PC con el so-lo propósito de servir de interfaz con la impresora. Elsistema operativo DOS cargado en dichas PCs sopor-ta hasta tres puertos paralelos asignados a los identifi-cadores LPT1, LPT2 y LPT3, y cada puerto requiere tresdirecciones consecutivas del espacio de E/S (entrada-salida) del procesador para seleccionar todas sus po-sibilidades.

Desde el punto de vista del hardware, el puertoconsta de un conector hembra DB25 con doce salidas

Figura 1

Figura 2

Page 4: Manejo de Puertos

54

latch (poseen memoria-/buffer intermedio) ycinco entradas, conocho líneas de tierra.

Desde el punto devista del software, elpuerto paralelo constade tres registros (datos,estado y control) de 8bits cada uno, queocupan tres direccio-nes de E/S (I/O) con-secutivas de la arqui-tectura x86 (figura 3).La función normal delpuerto consiste entransferir datos a unaimpresora mediante 8líneas de salida de da-tos, usando las señalesrestantes como controlde flujo. Sin embargo,puede ser usado comoun puerto E/S de pro-pósito general porcualquier dispositivo oaplicación que se ajus-te a sus posibilidadesde entrada/salida.

Descripción del Conector Físico

La conexión delpuerto paralelo al mun-do exterior se realizamediante un conectorhembra DB25. Obser-vando el conector defrente y con la parteque tiene mayor núme-ro de pines hacia arri-ba (figura 4), se nume-ra de derecha a iz-quierda y de arriba aabajo, del 1 al 13(arriba) y del 14 al 25(abajo).

Figura 3

Figura 4

Page 5: Manejo de Puertos

55

En este conector tenemos:8 líneas (pines) son para salida de datos (bits de

DATOS). Sus valores son únicamente modificables através de software, y van del pin 2 (dato 0, D0) al pin9 (dato 7, D7).

5 líneas son de entrada de datos (bits de ESTA-DO), únicamente modificables a través del hardwareexterno. Estos pines son: 11, 10, 12, 13 y 15, del másal menos significativo.

4 líneas son de control (bits de CONTROL), nume-rados del más significativo al menos: 17, 16, 14 y 1.Habitualmente son salidas, aunque se pueden utilizartambién como entradas y, por tanto, se pueden modi-ficar 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 nomencla-

tura 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 ladodel PC. El nombre de cada señal corresponde a la mi-sión que cumple cada línea con relación a la impreso-ra, el periférico para el que fue diseñado el puerto pa-ralelo. Las señales activas a nivel bajo aparecen conla barra de negación (por ejemplo, Strobe). Cuandose indica alto o bajo se refiere a la tensión en el pindel conector. Alto equivale a ~5V en TTL y bajo a ~0Ven TTL..

Figura 5

Page 6: Manejo de Puertos

56

Acceso al puertoEl puerto paralelo se identifica por su dirección de

E/S (entrada/salida, I/O) base y se reconoce en siste-mas MS-DOS por el número LPT (lp en Unix/Linux).Cuando arranca la máquina, la BIOS (Basic Input Out-put System) chequea direcciones específicas de E/S enbusca de puertos paralelos y construye una tabla de lasdirecciones 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 elbyte alto. Cada palabra es la dirección de E/S basedel puerto paralelo (que denominaremos LPT_BASE enlo sucesivo). La primera corresponde a LPT1, la segun-da a LPT2 y la tercera a LPT3. Hay que agregar que,en MS-DOS tenemos el dispositivo PRN que es un aliasa uno de los dispositivos LPT (generalmente es LPT1, pe-ro se puede cambiar con la orden MODE).

Las direcciones base estándar para los puertos pa-ralelos 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 instaladosen las direcciones hexadecimales 378 y 278.

RegistrosEl puerto paralelo estándar (SPP) consta, como se

mencionó antes, de tres registros de 8 bits localizadosen direcciones adyacentes del espacio de E/S del PC(vea la tabla de la figura 7). Los registros se definen re-lativos 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 comouna 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 significati-vo). Por ejemplo, D0 es el bit 0 del reg. de datos, S7es 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 queutilizan lógica negativa.

En lógica positiva, un 1 lógico equivale a alto (~5VTTL) y un 0 lógico a bajo (~0V TTL). En lógica negativa1 equivale a bajo (~0V) y 0 equivale a alto (~5V). Loexpresado lo podemos observar en el diagrama delconector de la figura 8.

Es preciso no confundir la lógica que sigue el puer-to con la lógica que mantiene la impresora. Por ejem-plo, la impresora pone a alto Busy (pin 11) para indi-car que está ocupada. Pero en realidad, al leer el re-gistro de estado, Busy la interpretamos como 0 (puestoque el pin 11 se corresponde con S7). Es decir, es co-mo si fuera activa en bajo (Busy).

Registro de datos (D): El registro de estado se ha-

Figura 7

Figura 6

Page 7: Manejo de Puertos

57

lla en LPT_BASE. Sepuede leer y escribir.Escribir un dato en elregistro causa que di-cho dato aparezca enlos pines 2 a 9 del co-nector del puerto. Alleer el registro, se leeel último dato escrito(NO lee el estado delos pines; para ellohay que usar un puertobidireccional). En la fi-gura 9 se describe elnombre que toma ca-da bit de este registro.

El estándar es que las salidas sean LS TTL (lowschottky TTL), aunque las hay que son de tipo OC (co-lector abierto). La corriente que pueden entregar (mo-do source) es de 2,6mA máximo y pueden absorber(modo sink) un máximo de 24mA. En el puerto origi-nal de IBM hay condensadores de 2,2nF a masa. Lastensiones para el nivel bajo son entre 0 y 0,8V y el ni-vel alto entre 2,4V y 5V.

Registro de estado (S): El registro de estado estáen LPT_BASE+1. Esde sólo lectura (lasescrituras serán igno-radas). La lectura dáel estado de los cin-co pines de entradaal momento de la lec-tura.

En la figura 10los nombres de lospines se dejaron eninglés porque es co-mo generalmente seidentifican. La líneaBusy tiene, general-mente, una resisten-cia de pull-up inter-na. El estándar esque sean entradas ti-po LS TTL.

Registro de con-trol (C): El registro

de control (figura 11) se encuentra en LPT_BASE+2. Esde lectura/escritura.

Los cuatro bits inferiores son salidas. La lectura de-vuelve lo último que se escribió a dichos bits. Son TTLa colector abierto con resistencias de pull-up de4.7kW, por lo que un dispositivo externo puede forzarel estado de los pines sin dañar el driver. Esto permiteutilizar estas cuatro líneas como entradas. Para ello, seponen en alto las cuatro salidas (escribiendo 0100b,es decir, 4h, en LPT_BASE+2) lo que hace que las sa-

Figura 8

Figura 9

Figura 10

Page 8: Manejo de Puertos

58

lidas “floten”. Ahora, un dispositivo externo puede for-zar a bajo alguna de las salidas con lo que, leyendo elpuerto, sabemos si esto sucedió o no.

Es posible realizar esta técnica en salidas totem-po-le (como D0-D7) pero no se recomienda su uso porquehabría que tener un conocimiento preciso de la corrien-te, ya que se puede sobrecargar los transistores de sa-lida y dañar el driver (especialmente en puertos integra-dos LSI).

Bit de puerto bidireccional (compatible PS/2): El bitC5, está disponible sólo si se trata de un puerto bidirec-cional; en los puertos comunes no se utiliza, al igualque los bits C6 y C7. Si C5=1, el buffer de los datosde salida se pone en alta impedancia, “desconectan-do” dicho buffer de los pines 2 a 9 del conector delpuerto (D0 a D7). Si se escribe al registro de datos, seescribe al buffer pero no a la salida. Esto permite queal leer el puerto, se lea el estado de las entradas y nolo que hay en buffer. Cuando C5=0 el puerto retorna almodo salida, su estado por defecto.

En las computadoras IBM PS/2, para habilitar elpuerto paralelo bidireccional, además de lo antes des-crito, se debe poner a 1 el bit 7 del registro del puerto102h (opciones de configuración).

En computadoras que no tengan puerto paralelo bi-direccional compatible PS/2, hay que modificar uno omás bits de algún puerto específico correspondiente alchipset de la placa. A veces se habilita por el Setup opor jumper en la placa del puerto.

Bit de interrupción: En trabajos normales de impre-sió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 InterruptController), lo hace muy útil para experimentación endata-loggers por ejemplo. El bit de interrupción está co-nectado al control de un buffer de tres estados. Cuan-

do C4=1, se activa elbuffer y su entrada,S6, se conecta a la lí-nea IRQ (en general esIRQ7 o IRQ5). La lectu-ra del bit, nos devuel-ve el estado del mismo(es decir si el buffer es-tá en alta impedanciao no).

Se producirá unainterrupción, cuando haya un flanco descendente en elpin correspondiente a S6. A continuación, se describenlos pasos para poder utilizar interrupciones. Finalmen-te, en la figura 12 se muestra una tabla que reúne lascaracterísticas hardware y software del puerto paralelo.

Protocolo del Puerto de Impresora

El handshaking (“apretón de manos” o protocolo) esun conjunto de reglas que ambos extremos de un sistemade comunicación tienen que seguir para que la comuni-cación sea correcta. El puerto paralelo, usado con unaimpresora, transmite datos y transmite/recibe las señalesde protocolo. Las principales son Strobe, Ack y Busy. Lasecuencia 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 (Stro-

be = bajo , C0 = 1, pulso >5us). En ese instante la impresora indica que está ocupa-

da recibiendo los datos (Busy = alto, S7 = 0). Finalmente, la impresora envía un pulso de acepta-

ción indicando que se recibieron los datos y que sepuede volver al paso 1 (Ack = bajo, S6 = 0, pulso deentre 5 ms y 15 ms según impresora).

Las otras señales sirven para verificar el estado dela impresora (Error, PaperEnd), para reiniciarla (Init) ypara configurarla (AutoFeed, Select).

En los nuevos puertos, estas señales adquieren otrafunción, a veces parecida y otras totalmente distintas.

Interrupciones con el Puerto Paralelo

En primer lugar, se debe habilitar el buffer que co-necta la línea ACK con la línea IRQ. Esto lo hacemosponiendo a 1 el bit 4 del registro de control (LPT_BA-

Figura 11

Page 9: Manejo de Puertos

59

Figura 12

Page 10: Manejo de Puertos

60

SE+2). Luego se debe preparar una ISR (Interrupt Servi-ce Routine) que atienda la interrupción recordando en-viar la señal EOI (20h) al registro de control del PIC(puerto 20h) al salir de la rutina. La interrupción softwa-re corresponde a la número 0Dh para IRQ5 y 0Fh pa-ra IRQ7. Finalmente se habilita con 0 la interrupciónIRQ5 (o IRQ7) escribiendo al bit 5 (o 7) del registro deinterrupciones del PIC (puerto 21h). Para desinstalar laISR, se deshabilita la IRQ5 (o IRQ7) escribiendo un 1al 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-ISApara leer o escribir. En un sistema cuya velocidad debus sea 1,3MHz, se puede decir que la lectura se pue-de hacer cada 1 ms (idealmente, ya que siempre exis-ten otras instrucciones software, etc; en la práctica pue-den ser desde 1.2 ms a 2 ms). Algunos puertos sopor-tan un modo “turbo” que elimina los 3 estados de espe-ra de la CPU, con lo que la velocidad de lectura/escri-tura del puerto se duplica (2,7MHz).

Acceso Básico al Puerto Paralelo

Programación básica de la E/S en Basic: Para rea-lizar el control de dispositivos mediante el puerto para-

lelo debemos hacer uso de las funciones de QBasic quepermiten acceder a los puertos hardware. Daremosunos ejemplos básicos de la programación de la E/Spor el puerto paralelo. Estos ejemplos se presentan conun grado de estructuración creciente en el estilo de pro-gramación. En el primer ejemplo se supone que la PCestá equipada con un puerto paralelo de tipo estándarlocalizado en la dirección 0x378, como suele ser habi-tual en Windows 98, de modo que el registro de datosse localiza en esa misma dirección y el de estado en0x378+1. En el ejemplo (al que llamamos CTRL.BAS)se envía un byte a las líneas de datos y se recibe un by-te de las líneas de estado con las funciones OUT e INPutilizando un estilo de programación muy básico, talcomo se sugiere en la tabla 1.

En el siguiente ejemplo se supone que la PC estáequipada con un puerto paralelo de tipo bidireccionallocalizado en la dirección 0x378 de modo que el regis-tro de datos se localiza en esa misma dirección y el decontrol en 0x378+2. El bit C5 del registro de control seutiliza como conmutador del modo salida (escritura enlas líneas de datos) al modo entrada (lectura de las lí-neas de datos). En el ejemplo, mostrado en la tabla 2y al que llamamos CTRL_0.BAS, se envía y se recibe unbyte de las líneas de datos del puerto aprovechando sucapacidad bidireccional utilizando las funciones OUT eINP sin mayores complicaciones en la programación.

El siguiente ejemplo es funcionalmente idéntico alanterior, aunque se hace uso de las constantes de BA-SIC para dotar al programa de mayor elegancia y cla-

Tabla 1

Page 11: Manejo de Puertos

61

Tabla 2

Tabla 3

Page 12: Manejo de Puertos

62

ridad. También, facilita la reprogramación en caso deque, por ejemplo, el puerto no se halle en la direcciónsupuesta.

Obsérvese en la tabla 3 que la constante 0x378 só-lo aparece ahora una vez en el código fuente, frente alas cuatro veces que lo hacía en CTRL_0.BAS. Se hahecho uso asimismo de la notación hexadecimal paralos valores que activan y desactivan el bit C5 del regis-tro de control.

En el siguiente ejemplo, esta vez no es sólo maqui-llaje. Cuando en los casos anteriores hemos activado ydesactivado el bit C5, pudimos también modificar el es-tado del resto de los bits del registro de control. Nor-malmente, es de buen gusto respetar el estado originaldel puerto cuando uno finaliza la ejecución de su pro-grama.

Así pues, en el siguiente ejemplo se lee (tabla 4,CTRL_2.BAS) en primer lugar el estado del registro decontrol y se almacena en un byte (que llamamos ctrl%).Cuando utilizamos OUT, lo hacemos de modo que úni-

camente modificamos individualmente el bit deseado, yno todos. Finalmente escribimos el byte ctrl% al registrode control para recuperar el estado original. Obsérve-se que se usa el operador ~ para realizar el comple-mento a 1 de C5ON, de modo que nos ahorramos eldefinir otra constante simbólica para la condición de bitapagado.

Ahora un cambio significativo: vamos a determinar,y no a suponer, dónde se halla situado el puerto para-lelo (consúltese la sección correspondiente de El Puer-to Paralelo del PC para conocer los detalles acerca decómo determinar cuántos puertos se hallan instalados yqué direcciones de E/S ocupan).

Para ello accedemos a la zona de memoria dondese registran las direcciones de los puertos paralelos pre-sentes en el PC (en la zona de las variables de laBIOS), por mediación de la función PEEK. Una vez de-tectados los puertos presentes, nos quedamos con elprimero y programamos la entrada-salida exactamenteigual que en CTRL_2.BAS. Vea la programación de es-

Tabla 4

Page 13: Manejo de Puertos

63

te ejemplo (CTRL_3.BAS) en la tabla 5. Por último, in-tegraremos el código que localiza la dirección delpuerto en ua función que devuelve dicha dirección. Pa-ra ello definimos la función PuertoDir%, sin argumen-tos y de tipo entero.

Si dicha función no localiza ningún puerto devuel-ve un 0, lo que brinda al programa una posibilidad determinar la ejecución cuando en un PC no existe puer-to paralelo disponible (tabla 6).

Actividades

Es recomendable que ponga en práctica lo dicta-do hasta aquí y para ello le sugerimos realizar algu-nos ejemplos básicos.

Encendiendo un LEDRealícese el montaje elemental esquematizado en

la figura13. Puesto que se trata de un montaje inicial,

Tabla 5

Page 14: Manejo de Puertos

64

en el que se es posible “sacrificar” el orden respecto dela sencillez, se puede llevar a cabo uniendo directa-mente con regletas los componentes a los cables, e in-troduciendo éstos en las hembras del conector de la PC.Por supuesto, es preferible realizar montajes más esta-bles, 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 latierra del puerto. En este montaje se ha conectado unLED (salida digital) en el pin 2 del puerto (bit D0 delregistro de datos) y un interruptor (entrada digital) en elpin 15 (bit S3 del registro de estado).

A los fines prácticos, intente realizar un programaen QBasic para la iluminación del LED y para la detec-

Tabla 6

Figura 13

Page 15: Manejo de Puertos

65

ción del estado del interruptor (véase el pro-grama CTRL.BAS de la tabla 1 de la pághi-na 60).

Ahora haga un montaje como el de la fi-gura 14, donde se supone que el puerto pa-ralelo tiene capacidad bidireccional y se haconectado el interruptor (entrada digital) enel pin 3 del puerto (bit D1 del registro de da-tos). Haga un programa en QBasic para lailuminación del LED y para la detección delestado del interruptor (véase el programaCTRL_0.BAS).

Interfaces Básicos de E/S con el Puerto Paralelo

Circuito sin Alimentación ExternaSe trata de un circuito muy sencillo que usa un mí-

nimo de componentes y proporciona un test funcionalde 8 bits. Cada bit de la entrada puede ser individual-mente controlado y visualizado en los LED de salida.Los diodos LED que actúan de display se alimentan úni-camente con la corriente proporcionada por las pro-pias salidas del puerto. Sería preferible alimentar losLED y utilizar la corriente absorbida para iluminarlos,pero el conector noproporciona una se-ñal de alimentación(Vcc), de modo que senecesitaría una fuenteexterna. Eléctricamen-te, el puerto paraleloentrega señales TTL ycomo tal, teóricamen-te, se le puede conec-tar cualquier dispositi-vo que cumpla con losniveles de voltaje es-pecíficos de la lógicaTTL, sin embargo elhardware del puertoparalelo está muy limi-tado en cuanto a sucapacidad de manejode corriente, por éstarazón se debe sermuy cuidadoso con el

manejo de las señales del puerto: un cortocircuito pue-de dañar permanentemente la tarjeta madre del PC.Sin embargo, experimentalmente se comprueba queen la mayoría de los PC el puerto proporciona corrien-te suficiente para una clara indicación visual de losLED. El circuito se muestra en la figura 15.

Las líneas de datos (D0-D7, pines 2-9) se utilizancomo líneas de salida, e iluminan los LED cuando enellas se fija por software un 1 lógico (+5V). Cuando sefija un 0 lógico, los LED se apagan. Como entradas seutilizan, como nibble (semibyte) bajo, las cuatro líneas

Figura 14

Figura 15

Page 16: Manejo de Puertos

66

asociados al registro decontrol (C0,C1,C2 y C3,pines 1, 14, 16 y 17) y,como nibble alto, cuatrode las líneas asociadasal registro de estado(S4,S5,S6 y S7, pines13, 12, 10 y 11).

Obsérvese que las lí-neas de control se utili-zan normalmente comosalidas. Sin embargo,aquí deben ser configu-radas como entradas.Obsérvese, asimismo,que cuatro de las líneasde entrada se correspon-den con bits que utilizanlógica negativa (C0, C1,C3 y S7). Esto habrá detenerse en cuenta cuan-do se realice el progra-ma de control de esta in-terfaz.

Los detalles sobre elmontaje de éste y losposteriores circuitos sepueden consultar en lapágina web: http://c-fievalladolid2.net-/tecno/cyr_01

Circuito con Alimentación ExternaFijémonos ahora so-

lamente en una de las lí-neas de entrada y enuna de las líneas de sali-da. Un circuito como elde la figura 16 utilizauna fuente externa de+5V para alimentar losdiodos LED y las señalesde entrada.

Un 1 lógico en D7(bit 7 del puerto de DA-TOS) produce que el LEDFigura 17

Figura 16

Page 17: Manejo de Puertos

67

se apague. Un 0 lógico produce la iluminación delLED. El interruptor normalmente abierto S produce queaparezca un 1 lógico (+5V) en la entrada Busy (regis-tro 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íneasde entrada y salida es un alternativa al propuesto enla sección anterior. Las aplicaciones y programasprácticos para este circuito no son objeto der estaobra, pero las puede bajar de: http://cfievallado-lid2.net/tecno/cyr_01

Circuito con Alimentación Externa y Etapa SeparadoraPara disminuir lo más posible el riesgo de daños

al puerto, se puede utilizar un circuito integrado74LS244 como etapa separadora en las líneas de sa-lida. Al mismo tiempo se mejora la capacidad de ma-nejo de corriente, de forma que se pueden conectarsin riesgo la serie de diodos LED que indican la activi-dad en las líneas de datos del puerto paralelo. El cir-cuito se detalla en la figura 17.

Por cada línea de entrada que tomamos directa-mente del puerto paralelo existe una etapa amplifica-dora-separadora dentro del circuito integrado74LS244 que nos permite trabajar con una tasa de en-trega de corriente suficiente para desplegar en los dio-dos emisores de luz la información escrita en las líneasde datos del puerto. Además es posible habilitar ó des-habilitar 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 CI74LS244 inhabilitamos el despliegue del nibble de or-den bajo y un nivel lógico alto en la patita 19 evita eldespliegue del nibble de orden alto. Por comodidad,se conectan las patitas 1 y 19 permanentemen-te a tierra de tal manera que sea posible visua-lizar la actividad en los diodos LED.

Este circuito, al igual que otros presentadosen este texto, necesita de alimentación externa.Se puede alimentar directamente mediante unafuente de +5V, o construir ésta usando una pilade 9V o un adaptador universal, y un reguladorde voltaje 7805.

El 7805 puede regular cualquier voltaje deentre 7 y 25V c.c. hasta los 5V que precisa elcircuito (vea el diagrama de conexión del regu-lador en la figura 18.

Circuito Bidireccional con Alimentación ExternaEl circuito de la figura 19 aprovecha la capacidad

bidireccional del puerto paralelo de la práctica totali-dad de los PCs actuales. Así, las 8 líneas de datos delpuerto (D0-D8) se pueden utilizar a modo de un bus dedatos que, en ocasiones contiene los valores que seránleídos por la computadora y, otras veces, transportalos datos que ésta envía a la salida digital. No es pre-ciso ahora utilizar las líneas de estado y de control delpuerto a modo de entradas, como se hacía en el cir-cuito sin alimentación externa (figura 15).

Este circuito utiliza los siguientes CI:

74LS573: un registro octal latch D transparenteusado como puerto de salida para iluminar los diodosLED, o cualquier dispositivo al que se le quieran enviarseñales digitales.

74LS245: un transceptor octal bidireccional queproporciona un puerto de entrada de 8 líneas; toma da-tos de entrada de 8 interruptores o de cualquier dispo-sitivo desde el cual se quiera leer información digital.

Ambos integrados se controlan mediante el bit C0del registro de control. Cuando el pin 1 se halla en al-to, los datos escritos por el puerto se transfieren a losLED mediante el 74573, mientras que el 74245 estáaislado del bus de datos. Cuando el pin 1 está bajan-do, los datos a su entrada se conservan en la salida.Cuando el pin 1 está bajo el 74245 se habilita y losdatos presentes en su entrada se transfieren a su sali-da y pueden ser leídos por el programa.

El bit C5 se utiliza como control de las operacio-nes de lectura/escritura del puerto bidireccional. Elprograma debe fijar tanto C0 como C5 a 0 para rea-lizar una escritura (es decir, debe escribir un valor de-

Figura 18

Page 18: Manejo de Puertos

68

cimal 0 el el registro de control). Para llevar a cabo unalectura ambos bits deben ser establecidos a 1 (es decir,debe escribir un valor hexadecimal 0x21, o decimal33, en el registro de control).

Display de 7 Segmentos

Una posibilidad es sustituir, en los montajes anterio-res, el sistema de visualización mediante 8 diodos LEDpor un display numérico de 7 segmentos (figura 20)más un punto decimal. El circuito resulta así más com-pacto.

Si se trata de un display de ánodo común hay quealimentar con Vcc= +5V las dos líneas señaladas comocomunes en la figura, y es preciso poner a tierra la lí-nea correspondiente al segmento que se quiere ilumi-nar. Si se trata de un display de cátodo común, hay quealimentar con +5V el segmento que se desea iluminar yponer a tierra las dos líneas comunes.

Así, en un display de cátodo común, las líneas 1-8se pueden conectar directamente a las líneas de datosdel puerto (pines 2-9 del conector DB25), y las dos lí-neas comunes se pueden conectar a cualquiera de laspatillas de tierra del conector, por ejemplo, la 25.

Reiteramos que si Ud. desea realizar los montajes

Figura 19

Page 19: Manejo de Puertos

69

de los circuitos propuestos, o si quiere analizar conmayor profundidad lo que aquí se expone, puede visi-tar la página de Internet:

http://cfievalladolid2.net/tecno/cyr_01.

Cabe aclarar que los circuitos se pueden montarsobre una placa tipo "protoboard" y utilizar cable rí-gido para realizar las conexiones necesarias entre loscomponentes.

Las entradas/salidas del circuito hacia el PC sepueden reunir en un conector DB25 macho unido a laplaca por líneas de cable rígido o de cable plano. Asu vez, el conector macho se puede unir directamenteal conector hembra de la PC mediante un cable de ex-tensión paralelo, lo que normalmente resulta más có-modo para acceder a la parte trasera de la PC dondese sitúa el conector hembra.

Para simplificar los circuitos que utilizan interrupto-res a modo de entradas digitales, éstos se pueden reu-nir en un único DIP switch de ocho posiciones.

Lógicamente, para cada circuito podemos realizardiferentes actividades, pero ese tema, desarrolladopor el autor en la web, será objeto de otras publica-ciones.

Distinguiendo los Sistemas Operativos

Sin hilar muy fino, podemos decir que un sistemaoperativo debe fijar reglas claras para todo fabrican-te de software que desee ejecutar programas en él, yaque al utilizar una PC, estamos abiertos a ejecutaraplicaciones de distintos orígenes. Por lo tanto, se de-be asegurar “derechos y obligaciones” para que losprogramas dentro de un sistema no se interfieran (yperjudiquen) entre ellos.

Como conclusión y grandes rasgos podremos de-cir que el Sistema Operativo sirve de intermediario en-tre los programas y el hardware. (Figura 21)

No hay dudas que en el mercado y en la comuni-dad de usuarios podemos hallar 3 Sistemas Operati-vos que se destacan, o al menos hemos oído hablar dela mayoría.

• Windows: sin dudas, es el sistema operativo me-jor afianzado en el mercado (más que por elección delos usuarios, por costumbre). Casi todo usuario que in-

gresa al mundo de las PCs, lo hace a través de Win-dows, lo asumimos casi de manera natural porque noimporta dónde vayamos, siempre hay una máquinacon Windows cerca.

• Linux: considerado como “el sistema de losnerds”, ha ido evolucionando hasta convertirse en unsistema operativo amigable que puede llegar a supe-rar en estabilidad a la plataforma Windows. Está dise-ñado y probado sobre la base de las contribucionesde miles de usuarios y programadores independientesen distintas partes del mundo que aportan su granitode arena para que el sistema crezca y progrese. Sinembargo, tiene en contra la “tendencia cultural” im-puesta por Windows que le impide difundirse amplia-mente.

Figura 20

Figura 21

Page 20: Manejo de Puertos

70

• DOS: si bien ese trata de un sistema operativo endesuso, podría considerarse como el más veloz y sen-cillo de los tres (incluso podría considerarse ideal paratareas dedicadas. Sus comandos todavía pueden utili-zarse cuando utilizamos el “símbolo de sistema” deWindows XP o la “terminal” de Linux. No existe una de-finición clara de driver para esta arquitectura, ya queteóricamente cualquier aplicación puede hacer E/S enforma directa.

Los Drivers, Comunicando Hard&Soft

Definiremos como drivers o controladores a las he-rramientas o rutinas necesarias para que el sistemaoperativo interactúe con el hardware. Tendremos dri-vers de sonido, puertos, unidades de disco, etc.

El driver por sí mismo no es un programa accesiblepor el usuario. Las aplicaciones interactúan indirecta-mente con el dispositivo a través de llamadas del siste-ma, las cuales luego se traducen por el SO en instruc-ciones de entrada salida.

Los sistemas operativos actuales no tienen por quésaber de fábrica, como funciona todo el hardware exis-tente en el mercado. Si esto fuera posible, acarrearíacantidades enormes y mayormente innecesarias de in-formación. Lo que suele hacerse es armar un paqueteque recopile versiones estables (libres de errores) de losdrivers de dispositivos comerciales de uso común.

Soporte de Programación

Refiriéndonos a los drivers o controladores, no exis-te un driver genérico multiuso que sirva para todos lostipos de sistemas operativos. Es más, generalmente seprograma un driver para varias versiones de un sistemadeterminado. Por lo tanto, si desarrollamos un proyec-to de hardware, deberemos considerar en qué sistemasy/o PCs lo vamos a conectar. Sobre los sistemas ante-riores podemos decir:

• Microsoft ofrece para sus sistemas Windows unset de librerías llamado DDK (Driver Development Kit).Consiste en numerosas ayudas, ejemplos y herramien-tas destinadas a programas de un nivel avanzado. Es-te paquete tiene un costo, y se entrega para la últimaversión de Windows disponible en el momento de sucompra.

• Respecto al soporte de drivers de Linux, con unpoco de paciencia podemos encontrar mucha informa-ción gratuita en Internet, con una muy buena documen-tación. Pero nuevamente se exige un alto conocimientode programación.

• Molestando un poco más con DOS, podemos de-cir que existe mucha bibliografía escrita, y aún puedeencontrarse información en la red sobre E/S con estesistema, sigue siendo la alternativa más simple.

Simple vs Complicado

DOS es más simple, ya que se trata de un sistemamonotarea (trabaja con una aplicación a la vez). Linuxy Windows son sistemas multitarea (más de una aplica-ción a la vez...) por lo que necesitan controlar estricta-mente que es lo que maneja cada aplicación para queen ningún momento se produzcan situaciones conflicti-vas (por ejemplo, dos aplicaciones queriendo imprimira la vez). Para lograr su cometido, los sistemas multita-reas han tenido que perfeccionar niveles y permisosque les permitan decidir en qué momento una aplica-ción accede a un dispositivo.

Niveles de Trabajo

Para explicar este concepto necesitaremos aclararla idea de proceso: un programa puede estar constitui-do por varios procesos simultáneos que realizan distin-tas tareas. Cada proceso tiene asignado para sí recur-sos determinados (direcciones E/S disponibles, servi-cios disponibles, cantidad de memoria asignada, prio-ridad frente a otros procesos)

Con la aparición de los procesadores 386, se em-pezó a hablar de niveles de privilegio o de ejecución,estos se clasificaban en:

• El nivel 0, nivel Kernel o Monitor: aquí un proce-so tiene acceso irrestricto al hardware tiene acceso alhardware. En este nivel se ejecuta el núcleo del sistemaoperativo. Evidentemente el fallo de un programa en ni-vel cero, tiene por consecuencia la caída inexorable dela máquina.

• Los niveles 1 y 2 estaban destinados a ejecutarlos drivers del sistema. En el caso de Microsoft, se op-tó por ejecutarlos a nivel Kernel (nivel 0), Linux siguióla misma tendencia.

Page 21: Manejo de Puertos

71

• El nivel 3 o nivel Usuario: Allí se ejecutan losprogramas de usuario, los cuales sólo pueden accederal hardware o a los recursos del sistema, a través delos niveles anteriores.

Un sistema operativo en si tiene numerosos proce-sos, que se ejecutan en diferentes niveles, según las ne-cesidades y operaciones a cumplir por cada uno. Po-dríamos hacer una analogía con una estructura de unaempresa, los gerentes (nivel 3) pueden decidir sobre eldestino de una planta de procesamiento, pero los ope-rarios (nivel 0) son los que trabajan directamente conlas máquinas y herramientas. Con esto podemos decirque una instrucción desde el nivel de usuario puededesencadenar varias operaciones a nivel de kernel so-bre el hardware.

A la vez, el nivel de usuario nos permite generali-zar ciertas operaciones. De esta manera, si un desa-rrollador de software deseara reproducir un sonido,no necesita aprender el funcionamiento interno de ca-da placa de sonido existente, sino entregarle al siste-ma operativo la orden de “reproducir” y éste, a travésde drivers provistos por el fabricante del hardware ins-talado, realizará la operación.

Las transiciones de nivel (desde que se pide unaacción, hasta que se ejecuta una operación E/S), sólopueden hacerse a través de puertas de tarea asigna-das por el núcleo (coordinadorsupremo) del sistema. Ningúnproceso tiene acceso directo alhardware con lo cual se evitancaídas del sistema por erroresde programación (al producir-se un error de programa en elnivel 3, el sistema operativo to-ma control, informa del error ylimpia totalmente la tarea yrestos de ella)

Un ejemplo: en la Figura22 podemos ver el recorridode acciones que se van suce-diendo cuando una aplicaciónrequiere acceder a un disposi-tivo de almacenamiento exter-no (por ejemplo, un disco rígi-do). El acceso directo al dispo-sitivo se produce solamentedesde los procesos dentro delnúcleo.

Adquisición de Datos Placa Interna

Cuando hablamos de adquisición de datos, nosreferimos a tomar un valor analógico o digital (prove-niente de sensores, interruptores, etc.), convertirlo adato manipulable por la PC y almacenarlo en una di-rección de memoria determinada. Si bien los sensoresson externos, el dispositivo adquisidor puede ser inter-no (en forma de placa de expansión con entradas ana-lógicas o digitales). Empezaremos mencionando losdistintos métodos de comunicación entre el elementoadquisidor interno y la PC:

• Por interrupciones: en este caso, un módulo odispositivo (ya sea un puerto externo o elemento inter-no) posee cierta inteligencia que le permite informar alsistema acerca de nuevos datos entrantes. El móduloen cuestión produce una señal, el sistema operativo“interrumpe” momentáneamente sus operaciones enrespuesta a esa señal ejecutando una rutina, que pue-de servir tanto para tomar datos de entrada como pa-ra producir una salida.

• A través de Encuesta: en este caso, el sistema“consulta” al dispositivo acerca del estado de los da-tos, o toma directamente una lectura sin ninguna veri-ficación. El dispositivo adquisidor adopta una actitudmás bien pasiva, no reacciona a menos que el sistema

Figura 22

Page 22: Manejo de Puertos

72

provoque una operación de entrada o salida. A su vez,los métodos de encuesta se pueden distribuir en dos cla-sificaciones fundamentales:

• Utilizando de DMA: en este caso, el sistema in-forma al dispositivo que se prepare a entregar o recibiruna cantidad determinada de datos con no más de 3instrucciones. A partir de ese momento, el dispositivomismo toma control del sistema, escribe o lee los datosdirectamente de la RAM sin intervención del micropro-cesador, y al terminar el volcado de memoria devuelveel control al sistema operativo.

• A través de operaciones directas de E/S: este esun método más lento. A diferencia del DMA, el micro-procesador tiene que realizar registro por registro lasoperaciones de E/S entre la memoria y el dispositivoadquisidor. Por ejemplo, supongamos que tenemos quevolcar en memoria 256kbytes alojados en los registrosde un dispositivo adquisidor: por cada byte transferido,el procesador primero tendría que leer cada dato delregistro del dispositivo adquisidor, procesarlo y luegoescribirlo en la memoria. Todo esto llevaría varias ins-trucciones de programa y de proceso, muchas más quecon DMA, pero nos permitiría ir evaluando dato pordato antes de escribirlo a memoria (con DMA primerovolcamos a memoria, luego trabajamos con los datostransferidos)

Instantáneamente surge una duda, ¿como hacemospara implementarlo?. Hemos visto lo simple que es pro-gramar microcontroladores (el assembler de PIC pintafeo de lejos, pero al aprenderlo nos damos cuenta quecon unas pocas líneas podemos armar una buena se-cuencia de automatismo).

En este caso, es un poco más complicado: cual-quier proyecto de E/S utilizando los sistemas operati-vos Linux o Windows no es tarea fácil... demanda co-nocimientos de programación que exceden el básico yrequiere conocimientos de drivers y programación.

Adquisidor Externo

Según la aplicación, los dispositivos adquisidorespueden considerarse como “cajas negras” externas, co-nectadas a los sensores e interruptores pon un lado, ya un puerto externo de la PC por el otro. Este tipo deelementos nos da gran portabilidad, ya que no necesi-tamos desarmar la PC para trasladar el elemento adqui-

sidor. Los sistemas operativos actuales ofrecen libreríaso al menos nos dan la posibilidad de trabajar con lospuertos a través de drivers provistos por el sistema. Unode los protocolos más definidos por la diversidad deaplicaciones es el RS-232 (o puerto serie), presente enmuchos PLCs y Dataloggers.

Como vimos, las Aplicaciones entran dentro delmodo Usuario y se comunican con el hardware a travésde drivers y llamadas al sistema, los cuales se regulanpor restricciones y prioridades. Cada uno de los siste-mas vistos tiene sus peculiaridades con respecto a laE/S directa.

• Si bien DOS es el único sistema de los menciona-dos que soporta E/S directa, se considera obsoleto porla comunidad informática en Gral.

• Windows en forma nativa no soporta E/S direc-ta desde una aplicación.

• Linux soporta E/S directa desde una aplicación,pero solamente si el que ejecuta esa aplicación tieneprivilegios de root (administrador de sistema).

También vimos que hay distintas maneras de comu-nicarse con una placa conectada a la PC usando Inte-rrupciones, DMA y E/S. Pero lo que no aclaramos fueque todos estos tipos de transferencia requieren en al-gún momento E/S directa, tanto para programar el con-trolador de DMA, como el de Interrupciones.

E/S en DOS

Las PCs recién adoptaron las características de se-guridad y enfoques de capa de usuario y de Kernel apartir de la década del 90, con el surgimiento de Linuxy las versiones de Windows NT (que requerían una ma-yor estabilidad que las versiones hogareñas de Win-dows). Por este motivo, cualquier lenguaje de progra-mación de alto nivel que corra en DOS soporta E/S di-recta.

La industria nos ha llevado a ir escalando los siste-mas operativos y entornos más amigables, más tareassimultáneas, desechando lo anterior. De todas mane-ras, este tipo de lenguajes y plataformas. puede serbastante útil para tareas didácticas, ya que con pocosconocimientos de programación y con computadoras

Page 23: Manejo de Puertos

73

de bajas prestaciones, se pueden realizar numerososproyectos que pueden llegar a ser vistosos, no tantopor los colores de ventanas vistas en pantalla, sino porlos elementos controlados. Esto puede posibilitar quemuchas escuelas con escasos recursos puedan aprove-char equipos antiguos para diseño de proyectos deE/S.

Si poseemos una versión de DOS viejita, podemosllegar a encontrar BASICA y GW-BASIC, variantes dellenguaje de programación BASIC. A partir de MS-DOS 5.0 y hasta Windows 95 inclusive se incluyó elQBASIC (basado en el QuickBasic 4.5, pero sin com-pilador). Tanto QBASIC como BASICA y GW-BASICson sólo intérpretes (son siempre necesarios para eje-cutar los programas). Microsoft dejó de proveer elQBASIC 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-ZCuenta=5000CLSPRINT “Secuencia de Luces”

PRINT “Pulse una tecla para terminar...”DO

FOR I = 0 TO 7Salida = 2 ^ IOUT &h378,SalidaRetrasa Cuenta

NEXT

FOR I = 6 TO 0 STEP -1Salida = 2 ^ IOUT &h378,SalidaRetrasa Cuenta

NEXTLOOP UNTIL INKEY$<>””

END

SUB Retraso (Ciclos%)FOR P% = 0 TO CiclosNEXT P%

END SUB

Figura 23

Page 24: Manejo de Puertos

74

Dentro del Recuadro 1 podemos ver un simpleejemplo donde a través de un programa en QBASICya través del puerto paralelo hacemos una secuenciade luces tipo “Auto Fantástico”.

En este ejemplo definimos una variable Cuenta, és-ta nos permite acomodar la velocidad en que se despla-zan los leds a través de la subrutina Retraso, cuya úni-ca función es hacer que el programa pierda tiempo dela misma manera que podríamos poner varias instruc-ciones NOP en un programa de un PIC.

Se incluyen dos bucles FOR que determinan el des-plazamiento del bit que enciende cada led desde unextremo hacia el otro y un bucle exterior que finalizacuando se presiona una tecla, terminando el programa.

Se debe aclarar que se ha tomadola dirección &H378 (correspondiente alLPT1). Según la configuración de su sis-tema, puede ser que el puerto paralelodonde se conectan los led responda ala citada dirección o que deba cam-biarse por &h278 o &h3BC (esta últimadirección era muy utilizada en las PCsque tenían placa de video con puertoparalelo incluido). En caso de no sabercuál es la dirección que corresponde anuestro puerto, no rompemos nada conintentar ver cuál de las tres funciona, yaque son direcciones destinadas especí-

ficamente a estos puertos. Escribir en ellas no provoca-rá ningún conflicto con ningún otro elemento de hard-ware conectado.

En la figura 23 vemos una de tantas implementacio-nes circuitales que puede utilizarse para demostrar es-te ejemplo, en este caso colocamos un buffer 74LS244para protección del puerto.

Los 5V que alimentan este circuito integrado pue-den obtenerse de la misma fuente de alimentación dela PC a través de cualquiera de los cables rojos que ali-mentan a los discos rígidos, disqueteras o lectoras deCD-ROM.

Algo muy importante: para evitar daños, no olvideverificar el circuito antes de conectarlo al puerto.

Tabla 1 - Instrucciones provistas por IO.DLL

Instrucción UsoPortOut Escribe un byte al puerto especificadoPortWordOut Escribe una palabra (de 16 bits) al puerto especificadoPortDWordOut Escribe una palabra doble (de 32 bits) al puerto especificadoPortIn Lee un byte del puerto especificado.PortWordIn Lee una palabra (16 bits) del puerto especificadoPortDWordIn Lee un palabra doble (32 bits) del puerto especificadoSetPortBit Setea en 1 el bit especificado del puerto indicadoClrPortBit Setea en 0 el bit especificado del puerto indicadoNotPortBit Invierte el estado del bit especificado del puerto indicadoGetPortBit Lee el estado del bit especificadoRightPortShift Provoca una rotación a la derecha del contenido del puerto haciendo que LSB pase a MSBLeftPortShift Provoca una rotación a la izquierda el contenido del puerto haciendo que MSB pase a LSBIsDriverInstalled 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)

Recuadro 2

Licencia y Código FuenteIO.DLL es completamente gratis! Sin embargo, usted no podrá: • Cobrar esta librería de ninguna manera. Por ejemplo, usted no puede

venderla como un producto individual.• Esconder la IO.DLL detrás de un control OCX (utilizado por los lengua-

jes de Microsoft) o control Delphi. Esto tambien se considera como “trabajoderivado” y también debe proveerse gratuitamente.

• Asumir la propiedad intelectual.El autor no se hace responsable de las consecuencias de usar IO.DLL.

No se ofrecen garantías.El código fuente está disponible por u$s1000 (sí, mil!) dólares. El autor

ofrece también la posibilidad de hacer una adaptación “a medida” en el casode que algún usuario la requiera (con su tarifa, claro).

Page 25: Manejo de Puertos

75

E/S directa con Windows

Windows 95/98 tiene una cierta permisividad so-bre las operaciones de E/S directas desde aplicacio-nes, aunque esto es aplicable sólo en algunas versio-nes de lenguajes de programación. (por ejemplo sepuede hacer un “artilugio” para tener E/S desde unaaplicación realizada en Delphi 1.0, pero no se puedecon la versión 2.0). Además, este tipo de operacionesE/S requiere un poco de conocimientos de assemblerde 80x86, complicando más la tarea de programa-ción. A partir de Windows NT y sus sucesores (2000y XP) el criterio de E/S es mucho más estricto, imple-mentaciones de E/S que funcionan en Windows95/98 probablemente no funcionen en Windows2000/XP, salvo que sean implementadas a través dedrivers (programables a través del Microsoft DDK, quejunta 2 características problemáticas: caro y difícil pa-ra el programador principiante)

IO.DLL: un recurso más que útil

Aplicaremos una librería externa(IO.DLL) diseñadapor Fred Bulback, un programador independiente, to-talmente ajeno a Microsoft (podemos ver su páginahttp://www.geekhideout.com). Esta librería permitedesarrollar aplicaciones que funcionen desde Win-dows 95 hasta Windows XP, pasando por todas lasversiones intermedias. Es muy versátil y provee variasfunciones que facilitan la tarea de Entrada-Salida, no

se necesitan conocimientos de assembler. Sólo se re-quieren conocimientos mínimos de algún lenguaje dealto nivel como Visual Basic, C, o Delphi. El autor es-pecifica claramente en su página cuales son los límitesde utilización, los conceptos básicos legales se pue-den observar en el Recuadro 2. En la tabla 1 vemoslas instrucciones provistas por IO.DLL

Un Ejemplo en Visual Basic

A modo de ejemplo, veremos cómo realizar E/S enVisual Basic a través de IO.DLL. Para poder utilizar estalibrería basta con copiar el archivo IO.DLL en la carpe-ta donde está el programa en desarrollo y agregar enun módulo BAS las siguientes declaraciones: vea el cua-dro 3. Si bien es un ejemplo que puede parecer bastan-te tonto, se quiere mostrar que con pocas líneas de pro-grama podemos lograr respuestas por parte del hardwa-re a través de eventos ocurridos en la PC. De la mismamanera, a través de las funciones de entrada PortIN yPortWordIN, podríamos guardar el contenido del puertoen una variable para su manipulación y posible emisiónde una nueva salida.

Con conocimientos mínimos de cualquier lenguajede programación podríamos adaptar el ejemplo enDOS para utilizarlo en Windows, ya que existe la ins-trucción OUT de Qbasic y el PortOut de IO.DLL son simi-lares, así como también hay similitud entre la funciónINP 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

Page 26: Manejo de Puertos

76

ría de Fred Bulback. Si hablamos del puerto paralelo, po-dremos encontrar mucha información en la web referidaal tema con proyectos relacionados al control desde PCde montajes electrónicos.

En el Recuadro 3 encontraremos varias direccionesútiles con implementaciones interesantes a través delpuerto paralelo en otros lenguajes de programación.Ojalá que este tema sea disparador de grandes ideas,

De esta manera damos por finalizada esta obra acla-rando que al momento de escribir erstas líneas estamospreparando otro tomo de la colección del C lub SaberElectrónica destinado a explicar diferentes sistemas deadquisición de datos y manejo de circuitos a través de losdiferentes puertos de la PC.

¡Hasta la próxima!

Asumiendo unos conocimientos mínimos de Visual Basic, agregamos un Evento que se ejecuta al momento de car-gar 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”,”A-ceptar” o “Cancelar”). Queremos colocar una salida determinada en el puerto paralelo después de hacer click en un bo-tón llamado “Setear” y otro llamado “Resetear”. Entonces, generamos dos botones de Comando (estamos suponiendoconocimientos 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