c++, LPT und anderes

Gast #1565045
Lesenswert?

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!
Gast #1565126
Lesenswert?

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.
Gast #1565332
Lesenswert?

>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")
Gast #1565431
Lesenswert?

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. :-)
Persönliche Seite #1565474
Lesenswert?

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
#1565553
Lesenswert?

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.
Gast #1565585
Lesenswert?

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???
#1565618
Lesenswert?

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.
#1565629
Lesenswert?

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.
Gast #1565631
Lesenswert?

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)
#1565677
Lesenswert?

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)
#1565705
Lesenswert?

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)
Gast #1566096
Lesenswert?

>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!?!!
Gast #1566385
Lesenswert?

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...
Gast #1568803
Lesenswert?

>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).
#1569163
Lesenswert?

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.
Gast #1569380
Lesenswert?

>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
#1569415
Lesenswert?

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.
Gast #1569595
Lesenswert?

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.
#1569602
Lesenswert?

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 :-)
Gast #1569881
Lesenswert?

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
Gast #1571175
Lesenswert?

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.
Persönliche Seite #1571195
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren