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;
}