Te mando estos programitas que me sirvieron para hacer unas pruebas con
el puerto paralelo (los hice hace bastante) y funcionaron bien, leen y
escriben en el puerto. Ojo, tienen que ejecutarse como root por lo tanto
no son muy seguros (además no presté mucha atención al tema de seguridad
ya que eran solo una prueba).
Miralos y buscate la info que hay en la inet que es mucha
Eduardo Daniel Ibarra wrote:
----------------------------------
AYUDA con la función inb()
para leer 5 Volts en algún pin del
conector de Puerto Paralelo.
-----------------------------------
Hola:
Necesito ayuda urgente sobre cómo
leer señales de 5 Volts en el Puerto Paralelo.
(Entrada de ficha DB-25, de 25 pines)
Estuve mirando man-páginas y bajando varios
documentos de la red, pero no hay caso,
¡¡¡ no puedo registrar voltaje
en los pines del Pto. Paralelo. Ahhhh!!!
¿¿¿ Qué es lo que estoy haciendo mal ???
Tengo Linux Debian Potato (Kernel 2.2.17).
El puerto SÍ responde, ya que cuando
al Bus de Datos (a sus pines) le envío
una señal, obtengo los 5 Volts en cualquiera
de sus pines de datos (desde el 2 hasta el 9).
Espero alguien me ayude, dado mi estado
catatónico actual. Desde ya, muchas gracias...
Eduardo.
-------------------------------------------
El programa en detalle es:
-----------------------------------------------
#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>
#define BASE (0x378)
#define ESTADO BASE+1
#define CONTROL BASE+2
void main ()
{
int Dato;
// Solicitamos permiso para habilitar el puerto (apertura):
if (ioperm (BASE, 3 , 1) != 0) {
printf ("\n ERROR");
exit (1);}
// Poner a Masa Pines:
outb (0x0B, BASE+1); //(BASE+1) es la direccion del Bus de CONTROL.
// Lectura de datos por Puerto Paralelo:
for (int i=0; i<60; i++)
{
//Dato = Leer_Datos_PP ();
//Dato = inb (BASE);
//Dato = ((inb(ESTADO)^0x80) >> 3);
// Lectura del PIN 10 (bit [6] del registro de Estado):
// Pongo un voltaje de 5 Volts en pin 10:
Dato = inb(ESTADO) & 0x40;
printf ("\n Dato = %d = %c = %h.", Dato, Dato, Dato);
sleep (1); // Esperar 1 segundo.
}
// Solicitamos permiso para deshabilitar el puerto (cierre):
if (ioperm (BASE, 3 , 0) != 0) printf ("\n ERROR");
}
------------------------------------------------
--
Héctor Andrés Rompato Carricart <[EMAIL PROTECTED]>
Coordinador técnico
COVIARES S.A. -- Autopista La Plata - Buenos Aires
Gerencia de equipos y sistemas
Av. España y Autopista, Quilmes (1878)
Buenos Aires, Argentina
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#define LP0 0x3BC
#define LP1 0x378
int buscar_puerto(void);
void escribir_dato(int dato, int puerto);
int leer_dato(int puerto);
int buscar_puerto(void)
{
int puerto, i;
if(ioperm(LP0, 3, 1) == -1)
{
perror("ioperm");
exit(1);
}
outb(0xaa, LP0);
i = inb(LP0);
if(i != 0xaa)
{
ioperm(LP0, 3, 0);
if(ioperm(LP1, 3, 1) == -1)
{
perror("ioperm");
exit(1);
}
outb(0xaa, LP1);
i = inb(LP1);
if(i != 0xaa)
{
ioperm(LP1, 3, 0);
printf("No se encuentran puertos paralelos .....");
exit(1);
}
puerto = LP1;
}
else
puerto = LP0;
return puerto;
}
void escribir_dato(int dato, int puerto)
{
outb(0xFF, dato);
outb(0x0A, dato + 2);
outb(0x0E, dato + 2);
}
int leer_dato(int puerto)
{
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#include <math.h>
#define LP0 0x3BC
#define LP1 0x378
int main(void)
{
int i, salida;
int data, estado, control;
system("clear");
if(ioperm(LP0, 3, 1) == -1)
{
perror("ioperm");
exit(1);
}
outb(0xaa, LP0);
sleep(1);
i = inb(LP0);
if(i != 0xaa)
{
ioperm(LP0, 3, 0);
if(ioperm(LP1, 3, 1) == -1)
{
perror("ioperm");
exit(1);
}
outb(0xaa, LP1);
sleep(1);
i = inb(LP1);
if(i != 0xaa)
{
ioperm(LP1, 3, 0);
printf("No se encuentran puertos paralelos .....");
exit(1);
}
data = LP1;
estado = LP1 + 1;
control = LP1 + 2;
}
else
{
data = LP0;
estado = LP0 + 1;
control = LP0 + 2;
}
printf("\nReseteando el puerto %0X ...", data);
outb(0xFF, data);
outb(0x0A, control);
outb(0x0E, control);
sleep(1);
printf("\nEncendiendo LED's ...");
salida = 0xFF;
for(i = 0; i <= 7; i++)
{
salida = salida ^ (int)pow(2,i);
outb(salida, data);
outb(0x0A, control);
outb(0x0E, control);
printf("\nLED %d", salida);
sleep(1);
}
for(i = 7; i >=0; i--)
{
salida = salida | (int)pow(2,i);
outb(salida, data);
outb(0x0A, control);
outb(0x0E, control);
printf("\nLED %d", salida);
sleep(1);
}
ioperm(data, 3, 0);
printf("Presione ENTER para salir del programa");
getchar();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#include <math.h>
#define LP0 0x3BC
#define LP1 0x378
int main(void)
{
int i;
int data, estado, control;
system("clear");
if(ioperm(LP0, 3, 1) == -1)
{
perror("ioperm");
exit(1);
}
outb(0xaa, LP0);
sleep(1);
i = inb(LP0);
if(i != 0xaa)
{
ioperm(LP0, 3, 0);
if(ioperm(LP1, 3, 1) == -1)
{
perror("ioperm");
exit(1);
}
outb(0xaa, LP1);
sleep(1);
i = inb(LP1);
if(i != 0xaa)
{
ioperm(LP1, 3, 0);
printf("No se encuentran puertos paralelos .....");
exit(1);
}
data = LP1;
estado = LP1 + 1;
control = LP1 + 2;
}
else
{
data = LP0;
estado = LP0 + 1;
control = LP0 + 2;
}
while(1)
{
outb(0x2D, control);
outb(0x25, control);
printf("\n\nValor en el puerto %0X: %0X", data, inb(data));
system("clear");
}
outb(0x0D, control);
ioperm(data, 3, 0);
printf("Presione ENTER para salir del programa");
getchar();
return 0;
}