parallelport ansteuern lp0 = 0x3bc

BillaBong

Erfahrenes Mitglied
Hi,

ich werde bald bedeppert %-), ich versuch jetzt schon seit geraumer zeit ein einfaches spannungssignal an pin 2 des Parallelport kabels zu bekommen. Dürfte auch eigentlich auch kein Problem sein so wie ich das verstanden habe es funtzt aber nicht. Vieleicht kann mir hier jemand helfen.

Betriebssystem : Ubuntu 8.04
Programmiersprache : C
Ziel : Eine Spannung von pin 2 zu pin 18 des Parallelportkabels

Als erstes habe ich mich vergewissert ob unter /dev/ ein lpt port vorhanden ist und siehe da lp0 ist da. so dann habe ich mir durch einige Foreneinträge und google folgenden c++ code zusammen gebastelt.

PHP:
#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>

int main()
{
      ioperm(0x3bc,1,1);
      outb(0x01,0x3bc);
      return 0;

}

so nix wildes wie man sieht :-D. Kompilieren tu ich das ganze mit gcc ala "gcc -o test test.c. soweit auch noch kein fehler jedoch kommt beim ausführen mit ./test die fehlermeldung "segmentation fault". So jetzt dachte ich mir das der fehler an dem 0X3bc liegt wo ich mir auch nicht so ganz sicherbin das das die richtige adresse ist für lp0 da ich in einem beitrag gelesen hatte das das auch manchmal 0x378 sein kann. Das habe ich auch schon ohne erfolg getestet. Hat vieleicht noch jemand eine idee wie ich meine Spannung an pin 2 zu 18 bekomme :-) Danke schon mal im vorraus
 
Hallo,

mach mal ein:

C:
#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>

int main()
{
      if (ioperm(0x3bc,1,1) == -1)
        perror("Error in ioperm()");
      else
        outb(0x01,0x3bc);
      return 0;

}

um zumindest eine brauchbare Fehlermeldung zu bekommen falls ioperm schief gehen sollte.

Ansonsten, die Adresse deines parallelen Portes solltest du über
Code:
cat /proc/ioports

herausfinden können.

Gruß,
RedWing
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa man du bist mein held echt. ES GEHT du glaubst garnicht wieviele nächte ich schon mit dem misst hier verbracht habe. Danke Danke Danke. eine frage hätte ich noch wie kann ich das ansteuern wieder abschalten denn jetzt ist auf dem angesteuerten pin immer spannung und für was sind die zwei parameter hinter der portadresse bei ioperm.
 
Hallo,

ich nehme mal an sobald du den Ausgang wieder auf 0 setzt, ist die Spannung weg. Hab damit auch noch keine Erfahrungen gemacht aber du könntest es ja mal ausprobieren.

BillaBong hat gesagt.:
für was sind die zwei parameter hinter der portadresse bei ioperm.

siehe
Code:
man 2 ioperm

Mich würde noch interessieren an was es jetzt genau lag?

Gruß,
RedWing
 
also es geht definitiv nur wenn die

PHP:
/// Punkt 1
if(ioperm(0x378,1,1) == -1){
/// Punkt 2
       perror("Error in ioperm()"); // hier wenn das net drin ist geht es nicht
 
}else ....

if anweisung dabei ist. meine adresse war 0x378 wie ich es als erstes vermutet hatte aber ohne Punkt 1 und 2 geht nix. Kannst du mir das erklären ?
 
Kann ich irgendwie schwer glauben, diese Zeile betrifft normalerweise nur die Fehlerausgabe im Falle eines Fehlers... Du bist sicher das es nicht an der falschen Adresse lag?

Gruß,
RedWing
 
200 % ich habe jetzt alle möglichkeiten getestet es geht nur mit der anweisung. Ich versteh das selbst nicht. selbst wenn ich die if anweisung rundherum baue und nur die fehlermeldung weglasse geht es schon nicht
 
Leider kann ich es hier nirgends ausprobieren da mein Rechner zu neu für einen parallelen Port ist :) Aber kannst du mal den vollen Code posten der funktioniert und der der nicht funktioniert?

Gruß,
RedWing
 
Jo ich habe Gott sei dank noch so ein altes notebook darumstehen mit LPT *GG*

Dieser code geht :
PHP:
#include <stdio.h>                             
#include <sys/io.h>                               
#include <unistd.h>  
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;

int main()
{	
	
			if(ioperm(0x378,1,1) == -1){
				perror("Error in ioperm()");
			}else{
			outb(0x01,0x378);
			}

		return 0;		

}


Halt stop.... hummm
PHP:
#include <stdio.h>                             
#include <sys/io.h>                               
#include <unistd.h>  
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;

int main()
{	
	
			ioperm(0x378,1,1);
				//perror("Error in ioperm()");
			//}else{
			outb(0x01,0x378);
			//}

		return 0;		

}

sorry ich hatte wohl doch irgendwo ein fehler gemacht denn jetzt geht das hier auch .... hatte mich auch schon ziemlich gewundert. Aber ich hatte gestern genau den gleichen code benutzt und es hatte nicht geklappt. Oh man *GG* ich glaube es ist einfach schon wieder viel zu spät für mich. RedWing ich sag mal danke du hast mich in meinem Projekt um einiges weiter gebracht wenn mir auch im mom nicht ganz klar ist wo mein fehler lag. Ich geh der sache morgen weiter auf den grund auf jedenfall geht es so wie oben beschrieben. Wenn noch was anfallen sollte melde ich mich nochmal. Wenn ich mit meinem Projekt fertig bin schreib ich auch warscheinlich mal ein tutorial .

Viele DAnk und ne Gute nach
 
Ok, sowas kann passieren vor allen zu so später Stunde :) Vergiss nicht das Thema als erledigt zu markieren wenn dir geholfen ist ;)

Gruß,
RedWing
 
Zurück