Está en la página 1de 13

Login | RSS de entradas | RSS de comentarios | Suscripcin por correo

OBSOLETOS
640 KB de memoria deberan ser suficientes para cualquiera

Inicio Prensa Qu es Obsoletos Presupuesto Manifiesto

Sobre entrada de datos y circuitos elctricos (Puerto paralelo II)


8 de septiembre de 2009 por cogollo

Hace unos meses ya hablamos de la salida de datos a travs del puerto paralelo, pero dej para ms tarde hablar de la entrada. Bien, supongo que ya es lo bastante tarde. Para que quede claro, veremos qu hay que hacer para poder leer datos digitales a travs del puerto paralelo del PC, mediante un programa en C y en un entorno Linux (aunque los circuitos que usaremos son validos para cualquier entorno). Recapitulemos: el conector del puerto paralelo tiene 25 pines, que se corresponden con tres lineas de datos diferentes (Data, Control y Status) segn este esquema:

Valor de los pines del puerto. Extraido de CodeProject Adems tenemos que Data es de entrada/salida, Control es slo de salida y Status slo de entrada. Y que en un determinado pin 0V representan un 0 lgico y 5V un 1 lgico, salvo en los pines que estn invertidos (Y este puede ser un buen momento para repasar el primer artculo). Vimos tambin que para sacar un byte a travs de un puerto hay que usar la funcin:
outb(Byte,Puerto);

donde Byte es el byte de datos que queremos mostrar y Puerto es el numero del puerto que queremos usar y que en la mayora de los casos es 0378 para el puerto de datos, 0379 para el puerto de status y 0380 para el puerto de control.

Pues bien, para la entrada de datos tenemos una funcin similar:


inb(Puerto);

que devuelve un byte de datos leidos a traves de Puerto. Por ejemplo, para leer desde el puerto de status y guardarlo en la variable input pondramos:
short int input = inb(0x379);

Y eso es todo amigos, pero antes de ponernos con un programa de ejemplo deja que aclare una cosilla sobre circuitos elctricos. Breve anotacin sobre los circuitos elctricos En un circuito elctrico, un cable que no est conectado a nada no est a 0V. Vale, puede que para ti esto sea una perogrullada, pero si no estas familiarizado con la electricidad, lo ms inmediato es pensar que un cable que no esta conectado, por el que no pasa electricidad, no tiene un voltaje, o sea que est a 0V. Pero no es tan sencillo. Y por lo que he podido comprobar mucha gente tiene esa creencia, que por otra parte causa muchos problemas a la hora de intentar leer datos digitales. Te pondr un ejemplo: fjate en el esquema de aqu abajo a la izquierda. Uno podra pensar en usar un montaje como ste para detectar la pulsacin de un boton. Si Entrada es uno de los pines del puerto de estatus podemos usar inb(0379) para ver el estado de ese pin.

Cuando pulsamos en interruptor el circuito se cierra,el pin de entrada est a 5V y leemos un 1 en ese bit. Cuando se suelta el interruptor el circuito se abre de nuevo y el pin de entrada queda al aire, con lo que debe de estar a 0V y leemos un 0 en su bit, no? Pues ms bien no. En primer lugar desconocemos cmo es el circuito detrs de ese pin. Dentro de tu ordenador el mismo circuito que se encarga de la lectura del pin podra estar induciendo ah un cierto voltaje desconocido para nosotros. Podra ser 0, podra ser 5, podra ser cualquier valor entre 0 y 5. You never know.

Eso ya es bastante malo. Pero es que adems la configuracin del circuito podra hacer que ste actuase como un diminuto condensador y cualquier carga igualmente diminuta que quede atrapada en l producira tambin un voltaje desconocido para nosotros. Incluso puede darse el caso de que el cable que estemos usando para la entrada acte como una antena de radio y nuestra entrada se vea afectada por todo tipo de interferencias. Para que nos entendamos, y reformulando la primera sentencia para un caso ms concreto: Un pin de entrada que no est conectado a nada no est a 0V, tendr un voltaje arbitrario y desconocido para nosotros. Y cmo salimos de sta pues? No te dejes los pines al aire. Por ejemplo: En lugar del interruptor simple de antes podemos usar un selector como el del siguiente esquema:

En este caso, cuando el selector est arriba tenemos la entrada conectada a los 5V (1 lgico) y cuando est abajo la entrada pasa inmediatamente a estar a 0V (0 lgico). Aqu cada estado del selector est asociado inequvocamente a un valor del bit ledo. Puedes encontrar este tipo de selectores bajo los botones del ratn de tu ordenador. De los tres pines que tienen, el que se encuentra bajo el pulsador est normalmente conectado al del otro extremo y cuando se presiona el pulsador pasa a estar conectado al del centro.

Ejemplo de conexin de un selector. En esta imagen y en las siguientes el cable azul est conectado a tierra (0V) y el naranja a 5V. Otra forma de mantener la entrada siempre a un voltaje conocido es usar una resistencia pull-up o pull-down. A continuacin tienes el esquema del montaje de una resistencia pull-down:

Se emplea una resistencia de valor intermedio. Lo ms habitual es que sea de 1 o 10 K. Cuando el interruptor est cerrado, la resistencia que ofrece la rama del circuito que va a los 5 V es mucho menor que la que va hasta los 0V as que el voltaje en el nodo donde confluyen las tres ramas del circuito es prcticamente 5V. Lo bueno es que aqu, cuando el interruptor se abre, el pin de entrada no queda aislado, sino que sigue conectado a tierra a travs de la resistencia. Cualquier carga que hubiera quedado

atrapada en el circuito se descarga rpidamente a travs de la resistencia y la entrada se pone a 0V. Una resistencia pull-up funciona igual, pero se conecta a los 5V como en este esquema:

En este caso con interruptor cerrado la rama de tierra tiene mucha menos resistencia que la de 5V y el voltaje en el nodo es de (prcticamente) 0V. Al abrirse el interruptor, la resistencia mantiene la entrada conectada a los 5V y el voltaje de entrada sube hasta ese valor. Aqu abajo puedes ver como sera la entrada con una resistencia pull-dow (izquierda) y otra pull-up (derecha).

De vuelta al software Bien, ahora que ya sabes como conectar tus sensores al puerto paralelo veamos un programita que lea el valor de esos sensores. Este ejemplo lee el valor de dos interruptores conectados a los pines 3 y 4 del puerto de estatus. Los interruptores usan resistencias pull-up por lo que la lectura de un 0 lgico en uno de esos pines representa una pulsacin en su interruptor asociado. Un mensaje en pantalla dice qu interruptor se est pulsando.
//Este programa monitoriza el valor estado de 2 pulsadores conectados //a las lineas de STATUS y muestra por pantalla si se ha pulsado alguno de ellos #include #include

//sys/io.h es donde estan definidas las funciones ioperm() y inb() #include // Esta es la direccion mas frecuente para el puerto paralelo #define DATAPORT 0x378 //Y esta es la direccion de las lineas de Status #define STATUSPORT DATAPORT+1 #define TIEMPOCONPULSACION 300000 #define TIEMPOSINPULSACION 10000 //Mascaras para los pines 3 y 4 del puerto de Status #define BOTON1 8 #define BOTON2 16 int main() { //Obtenemos permiso de acceso para la direccion de DATAPORT y //las 2 siguientes if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;} //Entramos en el bucle principal del programa while(1) { //input va a guardar el valor leido desde el puerto short int input=0; //pulsacion nos va a decir que boton se ha pulsado short int pulsacion = 0; //Leemos el byte de las lineas de Status y lo guardamos en input input=inb(STATUSPORT); //Si input tiene el bit BOTON1 a cero es que se ha pulsado el boton correspondiente if((input & BOTON1) ==0) //Ponemos pulsacion a 1 para indicarlo y sacamos un mensaje por pantalla pulsacion=1; //Si tiene a cero el bit BOTON2 es que se ha pulsado el otro boton else if((input & BOTON2) ==0) pulsacion=2; //Si pulsacion !=0 es que se ha pulsado algun boton. //Esperamos TIEMPOCONPULSACION microsegundos para no inundar la pantalla de texto if(pulsacion) { printf("Pulsando boton %d\n",pulsacion); fflush(stdout); usleep(TIEMPOCONPULSACION); } //En caso contrario solo esperamos TIEMPOSINPULSACION microsegundos else usleep(TIEMPOSINPULSACION); } //Antes de terminar el programa dejamos los permisos de acceso //a los puertos como estaban if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;}

//El programa termina sin errores return 0; }

Esto debera dejar ms o menos claro cmo leer datos en las lneas de estatus, pero qu pasa con las lneas de datos? No habamos quedado que son de entrada y salida? Bueno s, lo son. Al menos en cualquier ordenador razonablemente moderno, pero en sus primeras versiones el puerto de datos era slo de salida. Suponiendo que tu ordenador tenga menos de 15 aos puedes configurar las lneas de datos para entrada poniendo a 1 el bit 5 del puerto de control (este bit no se corresponde con ningn pin fsico de puerto de control, slo est ahi para seleccionar el modo del puerto de datos). Es decir:
outb(0x10,0x380);

Despus de eso ya puedes leer la entrada como hicimos antes, solo tienes que cambiar la direccin del puerto.
short int input = inb(0x378);

Otra vuelta de tuerca Para terminar te propongo un programta que usa tanto entrada como salida de datos por el puerto paralelo. Este programa detecta la pulsacin de dos botones como el ejemplo anterior, pero ya no dice por pantalla qu botn se ha pulsado. Ahora tenemos 8 LEDs conectados a las 8 lneas de datos y uno de ellos est encendido. Lo que hace el programa es cambiar el LED que se enciende una posicin a la derecha cuando se pulsa el botn derecho y una posicin a la izquierda cuando se pulsa el botn izquierdo. Aunque mejor mira el vdeo que tenemos a continuacin, que no deja lugar a dudas.

Bueno, pues el programa que hace eso en realidad es muy similar al primero. Aqu lo tienes:

//Este programa monitoriza el valor estado de 2 pulsadores conectados //a las lineas de STATUS y cambia la posicion del led que esta iluminado #include #include #include //Direccion del puerto paralelo #define DATAPORT 0x378 #define STATUSPORT DATAPORT+1 #define TIEMPOCONPULSACION 300000 #define TIEMPOSINPULSACION 10000 #define BOTON1 8 #define BOTON2 16 int main() { //Obtenemos permiso de acceso para DATAPORT if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;} //light va aguardar el estado de la salida del puerto. //Lo hacemos igual a 00000001 en binario unsigned short int light=1; //y lo sacamos por el puerto paralelo para que se encienda el primer led outb(light, DATAPORT); //Bucle principal while(1) { short int input=0; short int pulsacion = 0; input=inb(STATUSPORT); if((input & BOTON1) ==0) //Se ha pulsado el boton 1 pulsacion=1; else if((input & BOTON2) ==0) //Se ha pulsado el boton 2 pulsacion=2; if(pulsacion==1) { //Si light es (00000001)b lo convertimos en (10000000)b if(light==1) light=128; //Si no, desplazamos el 1 un lugar a la derecha else light>>=1; //Sacamos el nuevo valor por el puerto outb(light, DATAPORT); usleep(TIEMPOCONPULSACION); } else if(pulsacion==2) {

//Si light es (10000000)b lo convertimos en (00000001)b if(light==128) light=1; //Si no, desplazamos el 1 un lugar a la izquierda else light<<=1; //Sacamos el nuevo valor por el puerto outb(light, DATAPORT); usleep(TIEMPOCONPULSACION); } else usleep(TIEMPOSINPULSACION); } //Restauramos los permisos de acceso al puerto if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;} //El programa termina sin errores return 0; }

Ale, pues ya est, con esto terminamos la parte terica del puerto paralelo. En el futuro intentar hablar de cmo interactuar con cosas concretas (motores, pantallas LCD, disqueteras), pero sa es otra historia y debe ser contada en otro momento.

Publicado en Hackeos e ideas, Nuestros hacks, Open Source |

9 Comentarios

9 comentarios
1. pilotox Dice:
8 de septiembre de 2009 a las 18:15

Hola, justamente en unos das me iva a poner con esto, pero te agradezco que me hayas ahorrado ponerme a probar a ver cmo lo haca. Por cierto, ya que estamos con puerto paralelo te muestro el robot que he hecho con el puerto paralelo: http://www.youtube.com/watch?v=UBoGiuFIPLM No es gran cosa, pero es curioso. Tambin tengo algunos vdeos controlando servos y dems, si alguien le interesa le puedo ayudar.

2. cogollo Dice:
9 de septiembre de 2009 a las 20:06

Hombre, pues me alegro de que estas cosillas sean tiles despus de todo. Por cierto que veo por el vdeo que tu tambin eres de la hermandad de la cinta adhesiva

3. Electronico_Mx Dice:
7 de noviembre de 2009 a las 6:47

Hola, pilotox, me gustaria que me ayudaran con la lectura de datos del puerto paralelo, Solo se usar entorno Windows y tengo instalado el Borland. Me uno a la Hermandad xD .. desde Mexico. electronicaure@hotmail.com

4. german Dice:
17 de noviembre de 2009 a las 1:49

Hola que bien, en el colegio me dejaron este trabajo pero bajo el lenguaje visual basic, por favor me pueden colaborar, gracias

5. Macarro Dice:
3 de diciembre de 2009 a las 16:10

Buenas. y por ejemplo, una aplicacin real a da de hoy, construirte un interfaz para conectar controles de mquina recreativa al ordenador. Si no recuerdo mal, hasta 64 entradas por un par de euros: http://www.retrovicio.com/tutoriales/interfazpuerto-paralelo

6. Josue Dice:
13 de febrero de 2011 a las 3:13

Primero muchas gracias por estos dos post acerca del puerto paralelo me han sido de gran ayuda. Por otra parte me podrias explicar la sentencia dentro del if ((input & BOTON1) ==0) que compara o que es lo que hace, amp es una variable o como?. De antemano muchas gracias.

7. cogollo Dice:
14 de febrero de 2011 a las 13:07

Me alegra que me hagas esa pregunta, Josue, porque en realidad ese amp; se debe a un error de codificacin de la pgina y no me haba dado cuenta hasta que lo has mencionado . En ese punto debera salir simplemente un &.

Creo que ya lo he arreglado, as que echale un nuevo vistazo al cdigo. Un saludo.

8. Diego Dice:
5 de julio de 2011 a las 2:06

las resistencias deberian ser desde 2,2K a 10K?? si le pones una menor seria demasiada intensidad teniendo en cuenta que la I de entrada max es de aprox 2,4mA??

9. Johana Dice:
14 de julio de 2011 a las 19:49

Hola!! Sabes que tengo una duda, estoy haciendo un proyecto con microcontrolador picaxe y necesito que medinante tres estados logicos de un selector 100,010,001 pueda leer un mensaje en pantalla por medio de puerto paralelo, queria saber si esto se puede lograr mediante java (NETBEANS

Deja un comentario
Nombre

Mail (no se publicar) Pgina web

Por favor: La moderacin de comentarios est activada y puede ser que los comentarios tarden un poco en aparecer. No es necesario volver a publicar el comentario una segunda vez.

Obsoletos es un proyecto de investigacin, creacin y difusin de sistemas creativos de transformacin de residuos tecnolgicos. Este blog es el espacio en el que el equipo de Obsoletos volcamos nuestras ideas, referencias y pensamientos en torno al mundo de la tecnologa y la reutilizacin.

Tambin queremos usar este espacio para dejar constancia de en qu nos gastamos la pasta, porque consideramos que el dinero pblico es algo muy importante y, la verdad, an no sabemos qu coo hicieron con ciento cuarenta mil eurazos los tipos de las Keli Finder.
Busca en o

Categoras

As va Obsoletos o Gastos o Sobre la web o Talleres Breves e-waste Especiales Formatos Hackeos e ideas o Low-fi y artesana o Nuestros hacks Hallazgos Iniciativas Links Obsolescencia Obsoletos de honor Open Source

Nos inspiran

Alma de herrero Ciencia Infinita Cientficos Aficionados Cuarto derecha Dorkbot Madrid Electrnica Pascual Evil Mad Scientist Hack N Mod Hacked Gadgets Hamlab Patio Maravillas Ikkaro Instructables Ison21 MAKE: Blog Mi Mecnica Popular Nitroglicerine Obsolete Technology Website Polticas de la chatarra / Scraping Politics Superexperimentos Superuse Tecnoloxia

TecOb Toys from Trash Vintage Computing and Gaming

Red Basurama

6000 km Basurama El blog de Basurama Obsoletos Spermla

Autores

Paaq Manu Cogollo Skotperez

Colaboradores

Alnank Juan Edu

Etiquetas
ucm entrevista procomn Theo Jansen standby laser electrnica electrnica analgica robot wii dvd libro cinta historia de la computacin arduino fotos vga Ciudad Real ipod ong consolas Obsoletos de honor cables consumo cd subvenciones porttiles obsolescencia planificada publicidad Patio Maravillas obra grfica pompero lector de cds Obsoletos de honor espacio pblico doorags intel polaroid automvil grficos bicicleta debian USB PodCamp reloj electrnica digital Puerto paralelo apple microcontroladores HamLab nokia reciclaje reutilizacin Basurama memoria porttil programacin ordenador soylent drum DIY hacking frica ordenadores reparar windows vinilo basura electrnica radio tocadiscos Semana Linuxera diseo floppy semana linuxera televisin bateras nintendo fsicas VHS disco duro hardware coche telfono basura Semana de la India obsolescencia e-waste cassette teclado robots videojuegos escultura videoconsolas Medialab msica fotografa Formatos talleres linux video mviles

Obsoletos es un proyecto llevado a cabo por basurama, skotperez y El Club del Ocio. El contenido de obsoletos.org est sujeto a las condiciones de una licencia Creative Commons (Reconocimiento-Compartir bajo la misma licencia 3.0). Diseo basado en el tema Blueblog de David Herreman.