Forum: PC-Programmierung Parallelport PC -> microcontroller


von RainerKa (Gast)


Lesenswert?

Hallo,

ich möchte einen Datentransfer zwischen einem PC (Windows XP) und einem 
Microcontroller über den Parallelport des PC durchführen, bidirektional 
8Bit.
Serielle Schnittstelle ist zu langsam.
Dachte mir das es mit der Windows API funktionieren könnte

Handle= CreateFile("LPT1", GENERIC_WRITE , 0, NULL, OPEN_EXISTING, 0, 
NULL);
WriteFile(Handle, Data, byteszuschreiben, &bytesgeschrieben, NULL);

oder mit ReadFile um Daten zu lesen.

Wenn nun WriteFile durchgeführt wird , bleibt der PC in der Funktion 
hängen und auf dem Parallelport tut sich überhaupt nichts, kein 
Datenstrobe oder Writesignal wird gesetzt.

Wenn ich das Gleiche mit einem Drucker versuche, funktioniert es.
Im Rechnersetup ist EPP Modus eingestellt. Für den EPP Modus werden auch 
nur, laut Beschreibungen, die Signale Datastrobe,  Write vom PC und Wait 
vom Microcontroller benötigt.

Ich mache also etwas falsch aber was???

Gruß Rainer

von Sebastian (Gast)


Lesenswert?

Quittiert der Mikro die empfangenen Bytes korrekt? Signalisiert er 
Bereitschaft? Sonst ist es klar, daß der PC stehenbleibt?

von RainerKa (Gast)


Lesenswert?

Bereitschaft heist doch, dass das Waitsignal vom Micro auf LOW ist, oder 
habe ich da was falsch verstanden, und wird auf High gesetzt, wenn das 
Byte übernommen wurde. Danach setzt  der PC Strobe und Writesignal 
wieder auf HI und der Micro Wait wieder auf LO.

Oder gibt es da noch ein anderes Signal, welches Bereitschaft 
signalisieren soll? In den Timings die ich gefunden habe, weist aber 
nichts daraufhin.
Es gibt allerdings noch drei bits: PE, Select und nError, die aber als 
"User defined" beschrieben sind, die werden aber in keinem EPP Protokoll 
benutzt. Sollte Windows die doch auswerten?

von SiO2 (Gast)


Lesenswert?

Denk dran, daß einige Signale invertiert sind. Wenn du das Handshake im 
Controller anpasst sollte es gehen. Wenn du delphi kannst, dann schau 
dir mal bei Pollin bei den LCD um, wo es welche für den parport gibt. 
dort sind beispiele mit dabei ;)

von RainerKa (Gast)


Lesenswert?

Danke, hilft mir aber nicht wirklich. Delphi ist mir noch sehr 
Schemenhaft in Erinnerung, C/Cpp ist meine Sprache. Kann zwar ein 
Beispiel compilieren und Daten senden, aber es findet kein Handshake 
statt, die Daten werden auch ohne das der uC angeschlossen ist, 
gesendet. Die Schnittstelle scheint nicht im EPP Modus zu arbeiten.

War kann ich noch versuchen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du könntest statt über die Funktionen CreateFile/WriteFile über die Low 
Level Port-Funktionen aus der inpout32.dll gehen.

http://www.codeproject.com/KB/cs/csppleds.aspx und andere s. Links dort.

von RainerKa (Gast)


Lesenswert?

Danke  ,
nun findet der Linker meines Borland Cpp Builders die Funktion, Out32, 
nicht

mit

__declspec( dllimport ) void Out32(int, unsigned char);

habe ich dem Compiler gesagt, das die in einer DLL steht, was habe ich 
noch vergessen? Die Dll steht im Debugverzeichnis, Sourceverzeichnis, 
Binverzeichnis des Compilers oder wo muss sie stehen, zum Linken.

Gruß Rainer

von Luther Blissett (Gast)


Lesenswert?

> Danke  , nun findet der Linker meines Borland Cpp Builders die Funktion, Out32, 
nicht
> __declspec( dllimport ) void Out32(int, unsigned char);
[...]
Um eine DLL unter C/C++ so zu benutzen muss noch mehr gemacht werden, 
d.h. aus der DLL muss eine Import Library generiert werden usw. usf. Es 
ist in deinem Fall einfacher die Funktion "von Hand" zu laden. Schau dir 
mal hier:

http://www.hytherion.com/beattidp/comput/pport.htm

"test2.c" an.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du musst schon noch die zur DLL gehörende Importlibrary (*.lib) zu 
Deinem Projekt linken. Woher sollte der Compiler wissen, in welcher 
DLL die von Dir gewünschten Funktionen zu finden sind?

Alternativ kannst Du die DLL zur Laufzeit selber laden. Dazu werden die 
Win32-API-Funktionen LoadLibrary und GetProcAddress benötigt.

Näheres habe ich z.B. hier 
Beitrag "Re: Kann Dll nicht laden (MPUSBAPI.DLL)" beschrieben.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Deine Codezeile zeigt, dass du im Moment implizites Linken versuchst. 
Dazu bräuchtest du für den Linker eine IMPORT Library und eine EXPORTS 
Datei in der steht, welche Symbole in der DLL vorhanden sind. Ich weiss 
nicht, ob diese Dateien a/ bei der DLL dabei sind und b/ für die Bprland 
Toolchain taugen.

Ohne die IMPORT Library und die EXPORTS Datei könntest du mit 
explizitem Linken arbeiten. D.h. mit LoadLibrary und GetProcAddress

Mehr siehe:
http://msdn2.microsoft.com/en-us/library/9yd93633.aspx

von RainerKa (Gast)


Lesenswert?

Danke, jetzt funktioniert es :-)

Natürlich!, die lib dazulinken, lag der Fehler also zwischen den 
Kopfhörern.
Klappte aber nicht Falscher OMF Record, mache es jetzt mit 
LoadLibrary().

Gleich die nächste Frage, den Handshake für den EPP Mode macht der Port 
doch selbst, oder? Wenn ja, wo werden die Register des Portes 
beschrieben, denke auch das ich Input und Outputrichtung einstellen muß.

Gruß rainer

von RainerKa (Gast)


Lesenswert?

Moin,

OK, komme jetzt zwar an die Parallelschnittstelle des PC's ran, kann 
auch Daten hin und her senden, aber viel zu langsam. Da ich einen 
Handshake brauche, diesen über die out32 inp32 steuere, schaffe ich nur 
70KByte sek. Brauche aber min 200KByte am besten währe natürlich volle 
2MByte sek im EPP Mode. Wie bekomme ich das in den Griff. Etwas ist noch 
völlig falsch, da ich keine Daten mit CreateFile, WriteFile und ReadFile 
senden, empfangen kann, die dann hoffentlich im EPP Mode arbeiten.


Gruß Rainer

von RainerKa (Gast)


Lesenswert?

Hallo,

ihr seit mir Spezis, zumindest konntet ihr mir bei der DLL helfen, ist 
ja schon mal was, danke.

Wie komme ich nun an den Parallelport des PC ran, mit inpout32.dll und 
wie kann ich den EPP Mode nutzen.
Nach stundenlangem wühlen im Müll des Internetes, habe ich die Perle 
gefunden.

Der Port kann tatsächlich  den Handshake für den EPP Mode selber machen, 
man muß nur in die Basisadresse + 3 für die Adressübertragung und 
Basisadresse + 4 für Datenübertragung reinschreiben/auslesen, der Rest 
läuft dann von alleine. Nun komme ich auch um einiges über die 
angestrebte Geschwindigkeit.
Möglich ist, das da irgend wo noch ein Haken ist, das werde ich noch 
rausfinden.

Gruß Rainer.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich denke du bist da auf dem anderen (nicht falschen!) Dampfer.

inpout32.dll ist eine komplett andere Geschichte als CreateFile, 
WriteFile und ReadFile. Die haben beide nichts miteinander zu tun.

inpout32.dll gibt dir einen Zugriff auf Port-I/O. Leider nur 
Häppchenweise und damit mit viel Overhead und u.U langsam.

Ähnlich arbeiten auch Port-I/O Zugriffe unter giveio.sys, nur ist hier 
zusätzlich ein CreateFile nötig. http://www.ddj.com/architect/184409876

Beide Verfahren des Port-I/O sind ziemlich softwarelastig und es sind 
nur Transferraten zwischen 50 und 100 KB/s drin. So gesehen liegst du 
mit deinen 70 KB/s schon ziemlich gut.

Wenn du zu blockweisem Transfer (WriteFile und ReadFile) wechseln willst 
oder die speziellen EPP Möglichkeiten nutzen willst, kann ich dir nicht 
weiterhelfen.

Die Suche nach Softwaretools (Libraries, Driver), die IEEE 1284 EPP 
unterstützen, ist langwierig und bringt zunächst mal reichlich teure 
Toolkits aufs Parkett. Ob es da was erschwingliches bzw. Open Source 
gibt...

von criuix (Gast)


Lesenswert?

Hallo Leute,

Für die ganze Port Problematik hat Js. Payne ein erstklassiges Aktive X 
geschrieben. ( www.jspayne.com ) das sollte alle Probleme beseitigen. Am 
schönsten ist das es gleich mit allen Windows Versionen funktioniert.

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
Noch kein Account? Hier anmelden.