Frage zu LTP - PASCAL

Gast #590358
Lesenswert?

HI,

ist die LPT ansteuerung in dem Source richtig?
     c:='1';                          {w}
     base := memw[$40:8];             {o}
     if ParamStr(2) = '2' then        {r}
     begin                            {k}
          base := memw[$40:10];       { }
          c:='2';                     {o}
     end;                             {u}
     if ParamStr(2) = '3' then        {t}
     begin                            { }
          base := memw[$40:12];       {p}
          c:='3';                     {o}
     end;                             {r}
     If base = 0 then                 {t}
     begin
          Writeln('Parallel port does not exist!');
          Halt(2);
     end;
die Timing funktionen nms(), startdel(), delay_mks() habe ich nicht 
verstanden. Kann das jemand verstehen?
Das Timing bei der Aufgabe ist besonders wichtig! Es muss auf mikrosec 
genau sein!

Das hier ist der Source von einer Programmersoftware, jedoch 
funktioniert das ganze nicht. Ich denke der Fehler liegt in dem Code.
Ich habe WinXP, wie der entwickler geschrieben hatte sollte es nicht 
funktionieren. Naja habs trotzdem ausprobiert und die Software lief 
fehlerfrei durch. Nur mein Drucktreiber spielte verrueckt.
Habe dann eine Startdiskette erstellt und es dann ausprobiert. Wieder 
lief die Software fehlerfrei durch. Aber das Ergebnis auf dem MC ist = 
0.

Cod Auszuege aus der Datei im Anhang

Wenn mir jemand das erklaeren oder weiterhelfen koennte, bin ich sehr 
dankbar!

Daniel
Angehängte Dateien:
Persönliche Seite #590427
Lesenswert?

Der von Dir angegebene Quelltextausschnitt steuert keinen Parallelport 
an, sondern er bestimmt die I/O-Adressen, in dem ein BIOS-Datenbereich 
ausgelesen wird.

Das Programm selbst wird - mal von Timingungenauigkeiten abgesehen - 
schon irgendwas richtiges tun, nur kann es das unter Windows XP nicht 
ohne Nachhilfe. Wie unter jeder Version von Windows NT dürfen Programme 
auch hier nicht einfach irgendwelche Hardware-I/O-Zugriffe durchführen.

Dafür bedarf es eines Devicetreibers.

Oder eines Tricks, nämlich der Abschaltung der I/O-Überwachung des 
Betriebssystems.

Mehr dazu hier:
http://www.beyondlogic.org/porttalk/porttalk.htm
Gast #590470
Lesenswert?

Hallo,
vielen Dank erstmal.

Und wenn ich es mit einer von XP erstellten MS-Dos Startdiskette 
ausfuehere, dann duerfte es doch keine Windowsueberwachung mehr geben, 
oder?

Diese I/O Adressen sind diese PC-spezifisch oder sind sie von PC zu PC 
unterschiedlich. Habe im Bios, glaube, 0x37F fuer meinen LPT 
eingestellt.
Funktioniert das dann?


daniel
Persönliche Seite #590512
Lesenswert?

Wenn Du Dein Programm unter DOS laufen lässt, sieht die Situation 
natürlich anders aus. Dann läuft es unter DOS und nicht unter Windows.

Die I/O-Adressen sind gewissermaßen genormt, es gibt drei 
unterschiedliche Basisadressen für LPT1, LPT2 und LPT3.

Der in Deinem Softwarefragment zitierte Code kann unter DOS die 
verwendeten Adressen bestimmen; das BIOS des Rechners trägt nämlich die 
verwendeten I/O-Adressen in den im Code ausgelesenen Datenbereich ein.
Gast #590577
Lesenswert?

Hi,
also es arbeitet ja auch fehlerfrei, sowohl unter DOS wie auch unter 
WinXP. Es kommt keine Fehlermeldung in WinXP das es keinen 
Schreibzugriff gibt.

Das Programm laeuft auch fehlerfrei durch.
Wie sind diese Adressen ?
$40:8 - LPT 1?
$40:10 - LTP 2?
$40:12 - LPT 3?

Kann man sich sicher sein, dass das Timing zumindest mit der Dos 
Startdiskette genau ist ?

Vielen Dank
Daniel
Persönliche Seite #590607
Lesenswert?

Das Nichtvorhandensein einer Fehlermeldung von XP bei versuchten 
Schreibzugriffen auf den Parallelport hat nichts zu besagen, die 
DOS-Emulationsumgebung fängt I/O-Zugriffe auf serielle und parallele 
Schnittstellen ab und versucht diese entsprechend umzusetzen, was bei 
simplem Drucken funktioniert, aber oft auch schief geht.

Fehlermeldungen gibt es erst, wenn auf andere Hardware zugegriffen 
werden soll als die von der virtuellen DOS-Maschine (NTVDM) emulierte.

Wirklich funktionierende Hardwarezugriffe auf die Parallelschnittstelle 
unter XP mit einem DOS-Programm sind aber nur mit solchen Hilfsmitteln 
wie Porttalk, giveio etc. möglich.

Von einer DOS-Diskette gestartet verhält sich ein DOS-Programm so, wie 
es sich unter DOS verhält, das hat also GARNICHTS mit dem Betrieb unter 
XP zu tun.

Ob das Timingverhalten auf Deinem Rechner korrekt ist, hängt in diesem 
Falle davon ab, auf welche Art und Weise das Timing realisiert wurde und 
wie alt das betreffende DOS-Programm ist. Einfache Verzögerungsschleifen 
werden kaum richtig funktionieren, da Dein XP-Rechner sicherlich mehrere 
Größenordnungen schneller ist als die DOS-Kiste, für die das 
ursprünglich mal programmiert wurde.

Aber das ist kein Problem - wenn Du Dir mal den Kommentar im von Dir 
selbst geposteten Quelltext angesehen hättest, wüsstest Du es schon 
selbst:

  (...) I've rewritten parts of it so that it should
  work ok on any computer BUT ONLY IN REAL DOS MODE.

  it will NOT work under  windows, use py2051 if you
  need that.

  It has been written so it should work
  on any speed pc, I've tried it on a PIII 850,
  and on a 16MHZ 286 and it worked on both.

Vielleicht liegt Dein Problem ja auch ganz woanders, nämlich in der von 
Dir am Parallelport angeschlossenen Hardware?
Gast #590628
Lesenswert?

Hi,
vielen Dank fuer die Antwort.

Habe mir das Quelltextprogramm angesehen. Und auch zu genuege. Ich frage 
halt nur weil ich nicht weiss ob meine Startdiskette ein REAL DOS MODE 
ist. Und weil im Quelltext steht, es SOLLTE eigentlich gehen.

Bei mir gehts eben nicht und deswegen wollte ich nachvollziehen was der 
da macht. Besonders das Timing und wie diese Timings erzeugt werden. 
Oder ob mein der LPT port vielleicht nicht richtig ist, wenn ich da eine 
1 ( fuer LPT 1) eingebe. Ob mein PC um die 700 MHz vielleicht da etwas 
falsch macht.
Naja werde weitersuchen. Auch an der Hardware.

Nochmals Danke fuer die Antworten
Daniel
Persönliche Seite #590652
Lesenswert?

> Ich frage halt nur weil ich nicht weiss ob meine Startdiskette
> ein REAL DOS MODE ist.

Ah, das erklärt das Verständnisproblem.

Ja, DOS, gestartet von einer Diskette, ist "REAL DOS MODE".

Sobald aber irgendwo Windows ins Spiel kommt, das DOS also aus Windows 
heraus aufgerufen wird, ist es kein "reines" DOS mehr. Bereits Windows 
3.1 verfügte über eine DOS-Virtualisierung.

Bevor Du Dir aber unnötige Probleme machst: Welchen µC möchtest Du 
eigentlich mit welcher Hardware programmieren? Vielleicht findet sich da 
ja auch eine andere Lösung...
Gast #590688
Lesenswert?

Hi,
naja die Loesung ist schon gebaut, das Problem zur Programmierung 
(Hardware/ Software ) laeuft im Forum schon in einem anderen Thread. Und 
zwar diesen:

Beitrag "Programmer Problem - BlowIt - AT89C2051"

Da steht auch alles ueber meine verwendeten Einstellungen und 
Begebenheiten zur Hardwaren und Software.

Aber in Kurzform, moechte mit dem Programmer BlowIt eine AT89C2051 
beschreiben. Bis jetzt schlugen aber alle Versuche fehl :( .

Diese Thread hier ist nur zur Programmierung, ob mir halt jemand die 
Ports aus dem Quelltext erklaeren koennte und wie das mit diesen 
Timingfunktionen programmiert ist. (Ist aber bereits schon erklaert von 
dir, Danke  :)  )

daniel
Gast #591236
Lesenswert?

Hallo,

nur zur Anmerkung auf einem alten Rechner unter Windows 95 laeuft die 
Software wunderbar. Vielleicht haben sich ja inzwischen die Bios 
Register geaendert fuer die Parallele Schnittstelle.

daniel
Gast #591402
Lesenswert?

>Vielleicht haben sich ja inzwischen die Bios
>Register geaendert fuer die Parallele Schnittstelle.

Ich habe auch den Verdacht, dass es am BIOS liegt.
Wenn (unter DOS) die Adressen der Ports vorhanden sind,
so hat sie üblicherweise das BIOS vorher dort abgelegt.

Aber heutzutage ist ja alles Plug & Pray. Daher auch nicht sicher, dass 
die Daten überhaupt gesetzt werden.
In den BIOS-Einstellung kann man überlicherweise angeben, dass ein 
Plug&Play-OS gestartet wird: Das kannst du ja mal abschalten.
Gast #591643
Lesenswert?

Hi

Die Portadressen der verfügbaren LPT-Ports lassen sich auch über den 
Gerätemanager feststellen. Üblicherweise ist LPT1 I/O 378H-37FH und
LPT2 278H-27FH. Übrigens macht obiger Programmabschnitt keine 
I/O-Zugriff sondern einen Speicherzugriff auf das 
BIOS-Variablen-Segment. Auf Adresse
0040:0008H steht die I/O-Adresse von LPT1 usw. Das stammt zwar noch aus 
DOS-Zeiten , aber wie ich MS kenne wird das noch in 100 Jahren so sein.

MfG Spess

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