Portprogrammierung: Welche Sprache und wie ?
-
Hi Leute habe Anfang des Jahres
ein Praktikum bei einem riesen Konzern in der Mechatronik (Mechanik, Elektronik und Informatik) Abteilung und erachte es somit als sinnvoll mich auch mal mit Portprogrammierung zu beschäftigen.Die FRage ist nur:
Welche Sprache eignet sich dafür am besten bzw. ist der Portzugriff mit bestimmten Sprachen "einfacher" ... des Weiteren müsste ich wissen über welchen Port das am sinnvollsten ist.LPT oder Com ?
Was ich damit machen will ist z.B. einen kleinen Motor an zu schließen an
dem man am besten noch die Stromrichtung wechseln kann.Also irgendwelche Vorschläge ?
Habe irgendwo das Folgende aufgeschnappt ob es funktioniert bzw. wie habe ich keine Ahnung.
Bin für jede Hilfe Dankbar.
Mit freundlichen GrüßenM. Hecker
P.S. Hier der Code:
int _inp(unsigned portid);
unsigned _inpw(unsigned portid);
int _outp(unsigned portid, int value);
unsigned _outpw(unsigned portid,unsigned value);
-
Die Last eines Motors wird deine Schnittstelle bestimmt nicht aushalten. Du solltest eine Relaisplatine dazwischen schalten. Tust du es nicht wird Sie sehr schnell im A r s c h sein.
Nimm den parallelen Port, der ist am einfachsten zu verstehen und zu programmieren.Was du da unten geschrieben hast sind die C-Prototypen der Portkommandos.
int _inp(unsigned portid); // byte vom port portid holen
unsigned _inpw(unsigned portid); // word vom port portid holen
int _outp(unsigned portid, int value); // byte auf port portid schreiben
unsigned _outpw(unsigned portid,unsigned value); // word auf port portid schreibenDen Port den du benutzen musst siehst du beim Start deines Computers, oder du liest es aus dem Speicher:
int LPTAdresse(int num) { int temp; char far* mem = (char far*)((0x0408 + 2*(num-1))<<4); //hoffe das stimmt :confused: temp = mem[0]<<8 + mem[1]; return temp; }
Das char far Konstrukt bildet die absolute Adresse, kann jetzt aber nicht testen ob das funktioniert!
Die Segment/Offset-Adresse ist 0000:0408, wenn das da oben nicht funzt.
LPT(1) liefert die Portadresse von LPT1, LPT(2) von LPT2...Jetzt kannst du mit einem outp auf das Datenregister:
_outp(LPT(deineWahl),%xxxxxxxx); //Daten setzen
die einzelnen Datenleitungen auf Hi oder Low setzen!
Viel Glück!!
Und denk dran, keine Motoren anschliessen!!! :p
[ Dieser Beitrag wurde am 19.11.2002 um 10:11 Uhr von ºgrimmsenº
editiert. ]
-
Also,
habe heute mit nem Typen aus der Schule zusamm nen Schaltplan gemacht der so aussieht das ich den Motor einfach in einen autonomen Stromkreislauf setzte und da einfach ein Optokoppler (kein Plan ob man den so schreibt) rein kommt ...
also ein Schalter den ich vom PC aus lenken kann.Wie das allerdings mit dem Code funtzt habe ich noch net so ganz verstanden ... aber naja werde ich auch noch rallen ...
probiere das erstmal aus und falls es doch net klappt sag ich nochmal bescheid.
Bis denn und schon Mal danke
Michael
-
Hey,
habe das auch schon mal gemacht und ein Programm geschrieben, mit dem man zwei Rechner verbinden kann, sieht man auf meiner HP *werb* http://www.graphic-software.de, aber ich habe es aufgegeben, weil es unetr WinXP nicht mehr möglich ist, die Ports anzusprechen.Unter C++ geht es aber mit den Funktionen aber noch.
Das sind die Portadressen für COM -Ports.
#define COM1 1016
#define COM2 760
#define COM3 1000
#define COM4 744LPT oder Com ? Es ist egal, da man zu Fuß alle Leitungen ansprechen kann.
PS: Idee mit dem Motor bitte nicht machen, nur mit Relaiskarte, ansonsten ist die Schnittstelle sofort im Eimer !!!
-
was wollt ihr denn ständig mit direkt anschließen ?
das habe ich doch schon gesagt das ich das gar nicht will.
Der Motor ist wie gesagt in einem Seperaten Stromkreislauf.Was meinsten jetzt mit den Port adressen ?
Wo kommen die in den Code ?Also blicke da noch nicht durch ... am Besten wäre es wenn jemand irgendwo nen Tutorial zu dem Thema hätte.
Michael
-
Ein PC hat doch verschieden Ports, jeder Port enthält verschieden Leitungen.
Jede Leitung hat auch noch einen Wert, den sogenannten Offset.Also: Um jetzt mit _outp einen Wert zu setzen musst du outp(Portadresse+Offset von Leitung, Wert) im Programm schreiben.
Und der Wert setzt sich nochmal aus verschiedenen Dingen zusammen.
schau mal hier nach http://www.kbs-koeln.de/kaiserin-theophanu-schule/logo/parall1.htm
-
hier solltest du eigentlich fündig werden:
http://www.beyondlogic.org
-
Also,
meine Hardware ist jetzt auf dem Weg und nen Tutorial zu dem Thema schickt mir nen Bekannter auch heute zu.Das einzige bei dem er mir nicht helfen konnte ist,
dass die Port Adresse des LPT Port zwar meistens gleich ist es aber manchmal auch abweichungen gibt.
Meine Frage ist deshalb ob bzw. wie man die Adresse auslesen kann.Bis denn
M.Hecker
-
Original erstellt von Hecker.Michael:
**
Meine Frage ist deshalb ob bzw. wie man die Adresse auslesen kann.
**ja kann man definitiv!
einerseits mit Assembler direkt ausn BIOS (frag mal die Jungs im ASM-Forum wie genau das geht), oder per WinAPI (dazu verweise ich aufs WinAPI-Forum)...
aber ich denke es ist auch nicht so schlimm, wenn du fürn LPT defaultmäßig 0x378 nimmst und das ganze vom benutzer, wenns denn sein muss, im programm verändern lässt (und dann in ne ini-datei abspeichern, oder wie auch immer)
-
Du könntest es natürlich auch über normale WinAPI-Funktionen probieren, da ist die eigentliche Adresse dann egal, und außerdem läufts auch unter vernüftigen Windows Versionen (>NT4).
Hier ist mal ein Link in die FAQ:
[url] _inp und _outp (Parallelschnittstelle) [/url]HTH
-
WinAPI geht definitiv nicht, weil hier nur serielle daten geschickt werden, er will aber alle leitungen einzeln ansprechen, das problem hatte ich auch !
-
und haste auch ne Lösung dafür gefunden ?
-
Mein Proggi läuft unter DOS.
Unter XP geht dieser Zugriff sowieso nicht mehr, da braucht man device treiber, aber frage mich nicht wie man das macht.
-
Original erstellt von Snakey:
Unter XP geht dieser Zugriff sowieso nicht mehr, da braucht man device treiber, aber frage mich nicht wie man das macht.z.B. so wie es unter dem link steht den ich schon einige beiträge vorher gepostet hab???
-
Es gibt für XP auch den DriverLINX Port I/O Driver.
[url]http://www.driverlinx.com/DownLoad/DlPortIO.htm [/url]Der läuft auch unter XP
Gruss,
Sebastian
-
Also,
meine Probleme haben sich doch auch wieder umgelegt,
mal abgesehen davon das sich die Win XP frage für mich eh nicht stellt, weil ich das Prog auf meinem alten 166er (Win98se)schreibe.Will nämlich meinen guten Rechner nicht schrotten.
Also habe das Tutorial bislang doch noch nicht bekommen.
Habe mir aber zusammen gelesen, dass mein Projekt mit dem Befehloutp() laufen sollte ... nur leider soll das nach der Hilfe in Borland's Turbo Cpp der Befehl so aussehen:
outp(Portid,Wert)
das würde für den LPT bedeuten:
outp(0x378, 'c'); // C ist natürlich nur ein Beispiel.
Die frage ist nur wie ich mit dem Behelf ne Spannung auf bestimmte Pins abgeben kann, weil man so ja keinen bestimmten Pin angesprochen hätte.
MFG
M.Hecker
-
Wie du an die Adresse deines Ports kommst hab ich schon geschrieben!!
Wie du Spannungen auf die Pins legst hast du wohl noch nicht ganz verstanden.
Mit deinem C hast du schon Spannungen auf die Pins gelegt:
ASCII Code von C:67 in binärer Schreibweise: 64+2+1 : 00100011.
Folglich hast du an Pin 1,2 und 6 ein High! Oder Low,denn ich weiss jetzt nicht ganz genau ob die auch mit postitiver Logik arbeiten. Musst einfach mal ausmessen.[ Dieser Beitrag wurde am 22.11.2002 um 15:01 Uhr von ºgrimmsenº
editiert. ]
-
tut mir leid aber ich habs einfach noch gar nicht gerallt.
Kann mir vielleicht mal einer nen kleines Codebeispiel geben bei dem nach ein ander ne Spannung auf Pin 1,2 und 3 z.B. gegeben wird ?also in ner ASCII Tabelle steht für C als dezimalzahl 67, das habe ich mal nachfolzogen.
Das Problem ist nur das ich nicht extra den Buchstaben C ausgeben will sondern einfach nur ne Spannung an einen bestimmten Pin anlegen will, weil mein Projekt ja genau etwas steuern soll und nicht einen Wert einem z.B. Drucker übermitteln soll.Also kann mir nochmal jemand sagen wie das geht ?
vor allem, was soll das mit high und low ? kann man dabei die höhe der Soannung variieren oder steht low für keine Spannung und high für eine Spannung ?Stehe im Moment echt auf dem Schlauch.
Hätte einer von euch nen Tutorial zu dem Thema wäre mir sehr geholfen, weil ich dann nicht immer bei jedem scheiss nachfragen müsste.
MFG
MichaelP.S.: Laut Win2k Taschenrechner ist C bzw. die dezimalzahl 67 aber 1000011 im
Binärcode ... bin absolut verwirrt.[ Dieser Beitrag wurde am 22.11.2002 um 17:08 Uhr von Hecker.Michael editiert. ]
-
Pin 1 : 00000001
Pin 2 : 00000010
Pin 3 : 00000100
usw.
Du muss nur das jeweilige Bit setzen (du hast 8 Pins und 8 Bits).Wenn du Pin 1 setzen willst outp(Adr, 1), Pin 8 outp(adr,128), Pin1 und Pin8 outp(Adr, 129);
-
ja okay das habe ich jetzt verstanden.
Aber wie bist du bei Pin 8 auf 128 gekommen ich hätte gedacht, dass es so aussieht.
Pin 1: 00000001
Pin 2: 00000010
Pin 3: 00000100
bis hier hattest du es ja auch schon angegeben
Pin 3: 00001000
Pin 4: 00010000.
.
.Pin 8: 10000000
aber warum hast du bei Pin 8:
outp(0x378,128) ???Habe bei der Adresse jetzt mal die defaultmäige eingetragen
(macht man das überhaupt so oder muss die auch wieder anders geschrieben werden ?).
-
binär (10000000) -> dezimal (128)