Forum: PC-Programmierung LPT1 in Byte-Modus setzten


von Steffen Meier (Gast)


Lesenswert?

Hi.
Ich muss für ein weiteres Programm mein LPT1-Port in den Byte-Modus
setzten, damit ich Daten einlesen und wegschicken kann.

In meinem Bios kann ich den Byte-Modus nicht direkt einstellen, sondern
lediglich ECP.

Ich hab jetzt folgendes versucht:

1.)Von windowsXP ab in die DosBOX
2.)debug <-
3.)(Datenleitungen als Ausgang)
   -o 378,0F //Datenleitungen mit Wert laden
   -o 37F,32 //Datenleitungen als Eingang setzen
   -i 378    //Auslesen der Datenleitungen
 F0     //Wert wurde also nicht übernommen

von Maik G. (speedi)


Lesenswert?

Hi Steffen,

habe jetzt das Änliche Problem mit der I²C Schnittstelle unter Xp.

Wenn ich was neues Habe melde ich mich wieder

MFG
Maik Geßner

von TravelRec. (Gast)


Lesenswert?

Wenn Du die Datenleitungen auf Eingabe schaltest, liest Du die
physikalischen Pegel an den Leitungen. Wenn keine 1-Pegel anliegen (von
außen!) kannst Du auch nur 0 lesen. Oder habe ich da ´was übersehen? Ein
Bekannter hat mir (Nichtprogrammierer) ein Windows-Programm geschrieben,
das genau so funktioniert. Unter DOS und Pascal (selbst probiert)
funktionierte es auch. Es gibt allerdings auch ECP-Schnittstellen, die
sich nicht davon überzeugen lassen, voll bidirektional zu arbeiten
(manche Laptops z.B.). Lege doch mal über einen Schutzwiderstand von
1kOhm 5V an einen der Datenpins und gucke, was ´reinkommt.

von Steffen Meier (Gast)


Lesenswert?

Also die Sache mit dem Widerstand hab ich schon probiert.
-So ein Programm das mir da was anzeigen sollte, hab ich auch.  Nachdem
das aber schon nicht geklappt hat, dachte ich mir ich probier mal das
ganze ohne Programm um die Fehlerwahrscheinlichkeit zu minimieren.

Naja, und dann bin ich bei den 3 Befehlen gelandet die ich oben
geschrieben habe. (-noch kleiner geht´s wohl nicht :))


Ps.: Schönes Wochenende


MFG Steffen

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein Grund, warum das ganze nicht funktioniert, dürfte darin zu finden
sein, daß DOS-Programme unter Windows NT (ja, XP ist auch NT) keine
direkten Hardwarezugriffe durchführen können.
Diese werden teilweise von virtualisierter Hardware abgefangen, so
verhält es sich bei den seriellen Schnittstellen und dem Parallelport,
und teilweise "verpuffen" sie völlig wirkungslos.

Das lässt sich mit Tricks umgehen, mit einem Treiber namens giveio.sys
kann die NT-eigene Hardwarezugriffsüberwachung deaktiviert werden, so
daß auch DOS-Programme direkte Hardwarezugriffe durchführen können.
Das sollte man aber nur mit Hardware machen, die keine Interrupts
auslöst, da die nicht von DOS-Programmen ausgewertet werden können und
zu "interessanten" Reaktionen des Betriebssystemes führen dürften.

von TravelRec. (Gast)


Lesenswert?

Ja, das stimmt natürlich, ich vergaß das zu erwähnen, daß im Hintergrund
ein virtueller Porttreiber läuft (zlportio.sys) der die Zugriffe unter
2000 und XP ermöglicht. Im eigenliche Programm steht aber nicht viel
anderes als im oben genannten Code.

von Steffen Meier (Gast)


Lesenswert?

Wie läuft das mit dem Treiber (giveio.sys) genau ab?

Wie kann ich die wenn ich sie auf der Paltte habe "laden", und wie
lange ist die dann aktiv? So lange ich die Dos-Box offen habe?

Fragen über Fragen, bin aber halt noch blutiger Anfänger. "noch"

MFG

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der Treiber muss installiert sein, näheres dazu hier:
http://home.snafu.de/mgrafe/treiber.htm

Damit der Treiber auch für die DOS-VDM aktiv wird, muss -aus DOS
heraus- ein Dateizugriff stattfinden;

  fopen("\\\\.\\giveio", "r");

sollte genügen.

von Rolf (Gast)


Lesenswert?

Der Parallelport hat als Modi SPP, ECP und EPP. Was davon soll der
Byte-Modus sein?
Aufgrund der linearen Addressierung macht man beim Parallelport häufig
nur 32-Bit-Zugriffe, mit denen man alle (3) Register des SPP (Standard
Parallel Port) liest/schreibt, da Port-Zugriffe langsam sind und das
Zerlegen/Zusammensetzen der Bitfelder von der CPU sehr schnell geht.

von TravelRec. (Gast)


Lesenswert?

Bytemodus ist erweiterter SPP, also PS2 - bidirektional.

von Rolf (Gast)


Lesenswert?

Modus? Das ist doch nur ein Bit (BIT5) im Konfigurations-Register. Das
nun Modus zu nennen ist übertrieben.
Und den SPP hat man auch dann noch, wenn man ECP oder EPP einstellt,
weil die Erweiterungen sind, die bei höheren I/O-Ports sind; man
braucht eigentlich nichts einzustellen, zumindest wenn man ohne
Interrupts auskommt.

von TravelRec. (Gast)


Lesenswert?

Ich hab´s nicht so genannt! In diversen Beschreibungen ist davon aber
immer mal wieder die Rede. Ansonsten hast Du natürlich Recht.

von Sven (Gast)


Lesenswert?

Byte Modus ist normalerweise SPP mit der Umschaltmöglichkeit der
Datenleitungen als Eingänge. Dabei werden nur die 3 Standardregister
zur Datensteuerung benutzt. Bei EPP und ECP kommen weitere Register
dazu. Wichtig ist im Bytemodus ein Bit im Control-Register zum
Umschalten der Ausgangsleitungen zu Eingangsleitungen umzusetzen.

Giveio.sys ist ideal zum totschlagen des Schutzes der IO-Ports unter
NT4 bis WinXP. Gezielter auf den LPT-Port kann man mit speziellen
Treibern wie unter www.lpt-driver.com zugreifen. Da kann man dann auch
den geregelten Zugriff auf den LPT-Port steuern. Falls gerade gedruckt
wird, bekommt man eine Information - falls man selbst gerade auf dem
LPT-Port ist, wartet der Drucker ...

Sven

von Martin (Gast)


Lesenswert?

Sven schrieb:
....
..
Wichtig ist im Bytemodus ein Bit im Control-Register zum
Umschalten der Ausgangsleitungen zu Eingangsleitungen umzusetzen.
...


Und welches Bit ist das nun genau, ich denke es ist das Fünfte, aber
das funktioniert bei mir irgendwie nich :(

von Rolf (Gast)


Lesenswert?

Es kann an der Bios-Einstellung liegen. Beim Standard-Parallel-Port ist
der Datenport nur Ausgang; bei den anderen Modi auch Eingang.

Hier eine Übersicht zum Parallelport:

http://www.linux-magazin.de/Artikel/ausgabe/1999/10/IO/parport_s.gif

von Christian Engelhardt (Gast)


Lesenswert?

Ich habe soweit eigentlich alles beachtet, aber bei mir will es einfach
nicht. Ich kann 0X378 auslesen und einmal beschreiben. Dieser Wert
bleibt dann da tapfer drin, bis zum bitteren Ende, egal was ich mach...
und an der Schnittstelle ändert sich kein Pegel.
Folgende Header hab ich drin:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <unistd.h>
#include <dir.h>

Fehlt da was?
ICh wäre für Tipps sehr dankbar, da ich schon ein paar TAge über dem
Problem sitze.

Mfg CE

von Rolf F. (Gast)


Lesenswert?

BIT5 vom Kontroll-Register gibt die Richtung vor; will man Schreiben
muss es auf 0 sein; will man Lesen muss es auf 1 sein und zwar vorher.
Das steht auch unter dem letzten Link.
Es gibt keine Hardware, die sowas automatisch macht.

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.