Jump to content

Função de Input pela porta Paralela LPT


paradox1035
 Share

Recommended Posts

Boas, tenho estado a fazer um mini programa ( linux ) com o objectivo de controlar as saidas e entradas via LPT1 com o OUTPUT tudo ok, consigo definir o bit que quero activar pelos pins 1 a 8 ja tendo inclusive controlado um motor de STEP, mas o problema é que n sei como ler os bits de entrada, não consigo entender como acede-los , os de saida é relativamente simples usei o seguinte:

#define pport 0x378

outb(0x1,pport);

e funcina ok, mas quando tento ler e está no (case 2 ) recebo o erro "segmentation fault " , sei que estou a fazer algo mal ate pq n consigo especificar o bit de entrada que quero analisar, sera possivel alguem me ajudar nesta questão ?

segue aqui o codigo do programa:

#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define pport 0x378
#define pportin 0x379
void delay(void)
{
int i;
for (i=0;i<=1000000;i++);
}
main(void)
{
int i;
int n=0;
int a=0;
int voltas;
int b , bl;
int kbhit ;
if(ioperm(pport, 1, 1))
fprintf(stderr,"connection error %x\n",pport), exit(1);
printf ("******** PROGRAMA BIT A BIT ******** \n");
printf (" 1 = Liga bit 1 \n");
printf (" 2 = INPUT \n");
printf (" 3 = Todos os Bits a ZERO \n");
printf (" 0 = SAIR \n");
printf (" Escolha a opcao : ") ;
scanf("%d", &bl);

 printf("\n A opcao escolhida foi %d !\n", bl );
switch (bl) {
case 0:
return 0;
break;
case 1:
printf(" BIT 1 LIGADO");
outb(0x1,pport);
break;

case 2: // INPUT
{ printf ("foi selecionado o CASE 2 \n supostamente o INPUT    \n");
 printf("status: %d\n", inb(pportin));
}
break;

case 3: // poe BITS todos a ZERO
{  outb(0x00,pport); }
break;

} // fim do case
main ()  ;
system ("beep -f 659 -l 460 -n -f 784 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 880 -l 230 -n -f 659 -l 230 -n -f 587 -l 230 -n -f 659 -l 460 -n -f 988 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 1047-l 230 -n -f 988 -l 230 -n  ");
outb(0x00,pport);
return 0;
}
Link to comment
Share on other sites

Pois sinceramente ... pensava que

if(ioperm(pport, 1, 1))

me dava permissões totais a porta ...

mas vou testar ...

... ja testei ... adicionei

if(ioperm(pportin, 1, 1))

mas ficou na mesma

elec cport # ./outin.exe

******** PROGRAMA BIT A BIT ********

1 = Liga bit 1

2 = INPUT

3 = Todos os Bits a ZERO

0 = SAIR

Escolha a opcao : 2

A opcao escolhida foi 2 !

foi selecionado o CASE 2

supostamente o INPUT

Segmentation fault

Link to comment
Share on other sites

Pois sinceramente ... pensava que

if(ioperm(pport, 1, 1))

me dava permissões totais a porta ...

dá, mas somente a 1 bit :

http://linux.die.net/man/2/ioperm

int ioperm(unsigned long from, unsigned long num, int turn_on);

ioperm() sets the port access permission bits for the calling thread for num bits starting from port address from.

estive a ver online e parece que a leitura tem de ser na mesma porta (pport)

olha para este exemplo : http://www.tldp.org/HOWTO/IO-Port-Programming-9.html

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

ok ... há aqui uma pequena evolução ...

já n tenho o erro de segmentation fault , alterei o seguinte

#define pportin 0x378 ( anteriormente a 0x379 )

case 2: // INPUT
{ printf ("foi selecionado o CASE 2 \n supostamente o INPUT    \n");
 printf("status: %d\n", inb(pportin));
}
break;

e o resultado é este :

elec cport # ./outin.exe

******** PROGRAMA BIT A BIT ********

1 = Liga bit 1

2 = INPUT

3 = Todos os Bits a ZERO

0 = SAIR

Escolha a opcao : 2

A opcao escolhida foi 2 !

foi selecionado o CASE 2

supostamente o INPUT

status: 0

mas n consigo perceber qual dos pins/bits esta a ser lido , não sei é facil de perceber a minha duvida ...
Link to comment
Share on other sites

Resolvido !!!

if (ioperm(pport, 2, 1)) {perror("ioperm"); exit(1);}

O erro estava no que está como numero 2 que anteriormente estava a 1 o que só permitia o acesso a 378 , assim colocando 2 permite o acesso a 378 e 379 ( 379 que equivale ao bits de entrada da LPT ) assim com a instrução printf("status: %d\n", inb(pport)); já é possível ver os bits que estão na entrada 379!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.