paradox1035 Posted March 24, 2014 Report Share Posted March 24, 2014 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 More sharing options...
HappyHippyHippo Posted March 24, 2014 Report Share Posted March 24, 2014 onde estás a pedir permissões para a porta pportin ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
paradox1035 Posted March 24, 2014 Author Report Share Posted March 24, 2014 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 More sharing options...
HappyHippyHippo Posted March 24, 2014 Report Share Posted March 24, 2014 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 Portugol Plus Link to comment Share on other sites More sharing options...
paradox1035 Posted March 24, 2014 Author Report Share Posted March 24, 2014 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 More sharing options...
HappyHippyHippo Posted March 24, 2014 Report Share Posted March 24, 2014 mas n consigo perceber qual dos pins/bits esta a ser lido , não sei é facil de perceber a minha duvida ... os 7 da porta de dados: http://www.tldp.org/HOWTO/IO-Port-Programming-6.html 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
paradox1035 Posted March 25, 2014 Author Report Share Posted March 25, 2014 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now