Hallo, bin c++-Einsteiger und habe jetzt ein bisschen mit Konsolenanwendungen in VisualC++ rumexperimentiert (iostream.h), d.h. Zeichen und Ergebnisse von Rechenoperationen auf dem Bildschirm ausgeben etc. Jetzt würde ich gerne mal was Steuerungstechnisches mit dem PC unternehmen. Zwei Fragen dazu: 1) wie kann man unter c++ den Parallelport (Datenbits, Ausgabe Bitmuster für z.B. Schrittmotorsteuerung, LEDs...) ansteuern? Geht das auch mit iostream??? 2) gibt es die Möglichkeit, ohne Schleifen o.ä. bestimmte Verzögerungszeiten unabhängig von der CPU-Geschwindigkeit zu nutzen (analog Bascom z.b. "waitms 5", damit 5ms verstreichen, bis der nächste Befehl ausgeführt wird)? Viele Grüße!
emil schrieb: > 1) wie kann man unter c++ den Parallelport (Datenbits, Ausgabe Bitmuster > für z.B. Schrittmotorsteuerung, LEDs...) ansteuern? Geht das auch mit > iostream??? iostream ist dazu prinzipbedingt ungeeignet, da es ggf. puffert. I.d.R. benutzt man das Parport-Kernelmodul, für einfache Sachen gehts auch mit ioperm() und inb/outb, direkt. Simpel, aber effektiv. > 2) gibt es die Möglichkeit, ohne Schleifen o.ä. bestimmte > Verzögerungszeiten unabhängig von der CPU-Geschwindigkeit zu nutzen > (analog Bascom z.b. "waitms 5", damit 5ms verstreichen, bis der nächste > Befehl ausgeführt wird)? sleep(), usleep(). Ist bei Mehrprozess-BS reine Spekulation.
emil schrieb: > 1) wie kann man unter c++ den Parallelport (Datenbits, Ausgabe Bitmuster > für z.B. Schrittmotorsteuerung, LEDs...) ansteuern? Geht das auch mit > iostream??? So: http://www.teuniz.net/RS-232/
ein schrieb: > emil schrieb: >> 1) wie kann man unter c++ den Parallelport (Datenbits, Ausgabe Bitmuster >> für z.B. Schrittmotorsteuerung, LEDs...) ansteuern? Geht das auch mit >> iostream??? > So: > http://www.teuniz.net/RS-232/ Seltsam, ich dachte immer, der Parallelport heißt so, weil da acht Datenbits PARALLEL kommen.
>http://www.teuniz.net/RS-232/ ok, dann weiß ich für später schon mal, wie ich com-me ;) >für einfache Sachen gehts auch mit ioperm() und inb/outb, direkt. Simpel, aber effektiv Sind ioperm() und inb/outb Dateien wie iostream.h oder Befehle? Wenn ersteres, sind sie in VisualC++ schon enthalten? (sorry, bin wirklich Einsteiger und "By-Doing-Learner")
Sven Hast du die Angabe des Compilers 'Visual C++' übersehen. Da ist nichts mit Linux :-) @emil Du kannst zb das hier http://www.driverlinx.com/DownLoad/DlPortIO.htm benutzen. Zumindest bei Win2K und WinXp gings noch. Bei Vista hab ich das noch nie probiert, könnte aber auch noch gehen.
Karl heinz Buchegger schrieb: > Sven > Hast du die Angabe des Compilers 'Visual C++' übersehen. > Da ist nichts mit Linux :-) Ups. Hast natürlich Recht, dann halt so Krücken wie PortIO etc. :-)
>http://www.driverlinx.com/DownLoad/DlPortIO.htm
ok, werds gleich runterladen.
habe das VisualC++ unter Win2000 installiert, könnte es da
zugriffsprobleme auf den parallelport geben (unter qbasic ist z.b. in
der richtung nichts zu machen)
Unter allen ernstgemeinten* Windows-Versionen ist ein direkter Hardware-I/O-Zugriff nur über einen Devicetreiber zugelassen. Es gibt einen Frickeltreiber (giveio), der diese I/O-Beschränkung aufhebt, der aber lässt sich nicht mit 64-Bit-Versionen verwenden. Mit diesem Frickeltreiber ist es auch mit QB prinzipiell möglich, auf die Druckerschnittstelle zuzugreifen. *) alles außer 95/98/Me und den uralten 16-Bit-Versionen
emil schrieb: >>http://www.driverlinx.com/DownLoad/DlPortIO.htm > ok, werds gleich runterladen. > > habe das VisualC++ unter Win2000 installiert, könnte es da > zugriffsprobleme auf den parallelport geben (unter qbasic ist z.b. in > der richtung nichts zu machen) Nein. Funktioniert tadellos. In der Lib sind, wenn ich mich recht erinnere, auch Beispiele drinnen, wie man sie mit VC++ benutzt.
>Nein. Funktioniert tadellos. >In der Lib sind, wenn ich mich recht erinnere, auch Beispiele drinnen, >wie man sie mit VC++ benutzt. gut zu hören! wie kann ich die lib eigentlich öffnen?
Ok, habe DLPortIO auf dem Rechner installiert. Habe die Datei DlPortio.h sowie den Ordnerinhalt von (bei mir) D:\Programme\DLPortIO\MSVC (also z.B. PortIO.h, PortIO.cpp, PortIO.mak, PortIODlg.cpp, PortIODlg.h) ins VisualC++-verzeichnis D:\Programme\Microsoft Visual Studio\VC98\Include kopiert. Danach habe ich auf VC++ folgendes Testprogramm versucht zu compilieren: #include <Dlportio.h> void main(void) { } Das führt zu sage und schreibe 69 Fehlermeldungen. Liegt es vielleicht daran, dass ich die o.g. Dateien falsch eingebunden habe (Dlportio.h wird auf jeden Fall vom Compiler gefunden)? Oder fehlen der Datei Dlportio.h zusätzliche Parameter im Programm, weshalb diese Minimalversion nicht funktioniert???
emil schrieb: > Ok, habe DLPortIO auf dem Rechner installiert. > > > Habe die Datei DlPortio.h sowie den Ordnerinhalt von (bei mir) > D:\Programme\DLPortIO\MSVC > (also z.B. PortIO.h, PortIO.cpp, PortIO.mak, PortIODlg.cpp, PortIODlg.h) > > ins VisualC++-verzeichnis > D:\Programme\Microsoft Visual Studio\VC98\Include > kopiert. Autsch. Genau da gehört das alles nicht hin.
emil schrieb: > Danach habe ich auf VC++ folgendes Testprogramm versucht zu compilieren: > > #include <Dlportio.h> > void main(void) > { > } > > Das führt zu sage und schreibe 69 Fehlermeldungen. Schau doch ganz einfach mal in PortIO.cpp bzw PortIODlg.cpp hinein. Das sind Source Code Files und die kann man mit dem Editor öffnen. Dir werden höchst wahrscheinlich ein paar Includes vor dem DlPortio.h abgehen.
Karl heinz Buchegger schrieb: > Autsch. > Genau da gehört das alles nicht hin. Kein Problem, kann ich wieder rückgängig machen. Was gehört denn wo hin, damit es funktioniert? (in der Readme stand jedenfalls nichts zum Thema)
Ich kann das EXE hier bei mir auf dem 64-Bit Vista nicht laufen lassen, daher weiß ich nicht mehr was da alles im Paket drinnen ist. Aber im Zweifelsfall kopierst du dir alles auf dein Projektverezeichnis. Höchstens eine DLL, die ins Windows Verzeichnis kopiert wird, damit sie Windows beim hochfahren deiner EXE auch immer findet (aber auch dann wird man die DLL lieber beim EXE lassen)
Rufus t. Firefly schrieb: > Unter allen ernstgemeinten* Windows-Versionen ist ein direkter > Hardware-I/O-Zugriff nur über einen Devicetreiber zugelassen. Es gibt > einen Frickeltreiber (giveio), der diese I/O-Beschränkung aufhebt, der > aber lässt sich nicht mit 64-Bit-Versionen verwenden. Es gibt auch modernere Treiber http://www.highrez.co.uk/Downloads/InpOut32/default.htm (signiert und x64) bzw. http://sourceforge.net/projects/winring0/ (ebenfalls signierte Treiber und x64, Port-, CPU-MSR- und PCI-Bus-Zugriff)
Hallo zusammen, bin auch nicht durch und durch über solche Treiber informiert, hab aber schon einiges mit diesem hier gemacht: http://www.geekhideout.com/iodll.shtml Ich weiß weder Vor- noch Nachteile, würde das aber gerne ändern ;)
Oh, daß es mittlerweile auch signierte x64-Treiber dafür gibt, war mir neu. Danke für die Information.
>Habe die Datei DlPortio.h sowie den Ordnerinhalt von (bei mir) >D:\Programme\DLPortIO\MSVC >(also z.B. PortIO.h, PortIO.cpp, PortIO.mak, PortIODlg.cpp, PortIODlg.h) > >ins VisualC++-verzeichnis >D:\Programme\Microsoft Visual Studio\VC98\Include >kopiert. Schätze mal, DlPortio.h in den Include-Ordner zu transferieren war ok, der Rest gehört zu einem Projektordner!?!!
Nein, in die zum Compiler gehörenden Verzeichnisse wird GARNICHTS hineinkopiert. Weder nach vc98\include noch sonstwohin.
ok, aber woher weiß der compiler dann, wo die datei DlPortio.h zu finden ist?
Indem Du es ihm mitteilst. Packe alles, was dazugehört, in ein eigenes Verzeichnis. Das musst Du dann dem Compiler als "additional include directory" angeben, oder in der Environmentvariable INCLUDE mit aufführen.
Rufus t. Firefly schrieb: > Das musst Du dann dem Compiler als "additional include > directory" angeben, ok, hab ich gemacht, auch mit dem lib.-usw.Dateien habe dann das beigelieferte test-cpp-programm von dlportIO geöffnet, beim compilieren kam eine fehlermeldung "nafxcwd.lib konnte nicht geöffnet werden". besagte nafxcwd.lib befindet sich auch gar nicht auf dem rechner. morgen mehr...
>habe dann das beigelieferte test-cpp-programm von dlportIO geöffnet, >beim compilieren kam eine fehlermeldung "nafxcwd.lib konnte nicht >geöffnet werden". besagte nafxcwd.lib befindet sich auch gar nicht auf >dem rechner. >morgen mehr... hab das problem zwischenzeitlich mal gegoogelt, haben wohl viele, die VC++ in der Autorenversion benutzen. Eine hilfreiche "Abhilfeanleitung" konnte ich allerdings noch nicht entdecken (hatte aber auch noch nicht die zeit zum ausführlichen googeln).
Dann nimm eine andere Lib, die dir direkten Port Zugriff gestattet. Gibt ja auch noch andere.
Karl heinz Buchegger schrieb: > Dann nimm eine andere Lib, die dir direkten Port Zugriff gestattet. Gibt > ja auch noch andere. was würdest du denn empfehlen?
Da ich mit keiner anderen Erfahrung habe, darfst du mich hier nicht nach einer Empfehlung fragen :-) Das Einzige was ich empfeheln würde ist: Eletrkisch extrem vorsichtig mit Hardware am LPT zu sein. Ich hab mir in einem (Gott sei Dank alten) Laptop schon einen LPT mit diesen Spielchen geschrottet.
>Das Einzige was ich empfeheln würde ist: Eletrkisch extrem vorsichtig >mit Hardware am LPT zu sein. Ich hab mir in einem (Gott sei Dank alten) >Laptop schon einen LPT mit diesen Spielchen geschrottet. mein tipp: einen sack 6V8 zenerdioden o. ä. besorgen und von jedem datenpin des ports eine zenerdiode in gegenflußrichtung gegen masse schalten. portpin O-------I-------O -> out (oder auch in) I -------, DDD DDDDD <- zenerdiode DDDDDDD I I Masse
Tölpel schrieb: >>Das Einzige was ich empfeheln würde ist: Eletrkisch extrem vorsichtig >>mit Hardware am LPT zu sein. Ich hab mir in einem (Gott sei Dank alten) >>Laptop schon einen LPT mit diesen Spielchen geschrottet. > > mein tipp: > einen sack 6V8 zenerdioden o. ä. besorgen und von jedem datenpin des > ports eine zenerdiode in gegenflußrichtung gegen masse schalten. > > > portpin O-------I-------O -> out (oder auch in) > I > -------, > DDD > DDDDD <- zenerdiode > DDDDDDD > I > I > Masse Hätte bei mir auch nicht geholfen. Ich hatte unabsichtlich mit Krokokabeln einen Kurzen zwischen 2 Datenpins gebaut. Und ping ... war einer der beiden LPT-Pins hinüber.
krokokabel am portstecker ist aber auch eine gewagte lötersatztechnik... aber dass ein kurzer zwischen zwei datenpins solche auswirkungen hat, kann ich mir gar nicht vorstellen... ansonsten kann man natürlich noch ein logikgatter hinter den port klemmen, dann geht im zweifelsfall das gatter statt dem port kaputt.
emil schrieb: > krokokabel am portstecker ist aber auch eine gewagte lötersatztechnik... LOL. Wie gesagt: Es war ein alter Laptop (von so um 1998). Von daher wars mir egal. Ich hatte da ein schönes Kabel drann auf eine Streifenrasterplatine mit ein paar LED. Und beim spielen mit den Signalen, die ich mir von den LED geholt hatte, ist es dann passiert :-)
> Und beim spielen mit den Signalen, die ich mir von den LED geholt hatte, > ist es dann passiert :-) Ja, das hypnotische Blinken von LEDs hat bei Elektronik-Bastlern schon immer zu Tod und Verderben geführt. ;-)
zweiter Versuch: Den Parallelport kann man in Windows nicht mehr direkt ansprechen. Deswegen braucht man irgendwelche Libs die das für einen erledigen. Ich kenne diese beiden: inpout32.dll http://logix4u.net/Legacy_Ports/Parallel_Port/Inpout32.dll_for_Windows_98/2000/NT/XP.html - leider relativ langsam, vor allem auf steinalten PCs - funktioniert bei mir perfekt io.dll - vermutlich schneller http://www.geekhideout.com/iodll.shtml
ein schrieb:
> - leider relativ langsam, vor allem auf steinalten PCs
was heißt das ungefähr? mein bastelrechner hat einen PIII 1GHz verbaut
Mit steinalt meine ich Wind98 und 100Mhz. Ich habe aber keinen direkten Vergleich mit eigener Software gemacht und auch nicht gemessen, das ist nur mein Gefühl. Diese Software von Pollin: http://www.pollin.de/shop/dt/Mjc5OTgxOTk-/Bausaetze/Diverse/Schrittmotorplatine_Bausatz.html verwendet die inpout32.dll. Diese Software läuft auf dem alten PC nicht schnell genug um den Schrittmotor schnell zu bewegen. Auf meinem normalen PC läuft die Software hingegen gut. Das Programm NC-FRS: http://nc-frs.holgerlauer.de/ verwendet hingegen die io.dll und schafft es damit auf dem alten PC einen Schrittmotor schnell genug anzusteuern. Vielleicht liegts auch an der Software um die dlls herum. Ich weiß es nicht sicher.
Der Geschwindigkeitsunterschied aber wird nicht an den unterschiedlichen verwendeten DLLs liegen, sondern höchstwahrscheinlich am unterschiedlich effizient geschriebenen Programm. Die höchste Geschwindigkeit übrigens ergibt sich bei Gebrauch des von mir bereits angesprochenen "Frickeltreibers" giveio.sys, der schaltet die I/O-Zugriffsüberwachung des Betriebssystems für einzelne Prozesse aus, so daß direkt mit den I/O-Befehlen inp/outp aus dem Usermodeprogramm heraus gearbeitet werden kann. Mit diesem Treiber lassen sich sogar manche alte DOS-Programme zum Leben erwecken, wie z.B. die Steuersoftware für das EPROM-Programmiergerät "EPROP" von taskit, das am Parallelport angeschlossen wird. Absolut tödlich ist es allerdings, über diesem Weg auf Hardware zuzugreifen, die Interrupts erzeugen kann, wie z.B. die seriellen Schnittstellen. Da ist der BSOD garantiert. Auch deswegen nenne ich das eine Frickelei, außerdem ist der Parallelport am aussterben, und das Zeitverhalten eines Usermodeprogrammes ist auch nicht das definierteste. Sauber ist es, die grundliegenden Ansteuerungsfunktionen für irgendwelche Hardware mit einem µC zu erledigen, und mit diesem über eine vom Betriebssystem unterstützte Schnittstelle wie RS232, USB oder Ethernet zu kommunzieren. So können zeitkritische Dinge vom µc erledigt werden, der das erheblich besser hinbekommt als ein PC, und so muss nicht eine uralte Schnittstellentechnik künstlich am Leben erhalten werden.
hab mir jetzt mal das buch "messen, steuern, regeln mit visual c++" von r. mende und s. götz besorgt. da steht auch einiges zum lpt-port drin. werde die tage mal genauer reinschauen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.