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
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
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
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.
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
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?
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
> 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...
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
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
Windows 95 ist nicht Windows NT, Windows XP aber ist Windows NT*.
Windows 95 und seine verschiedenen Aufgüsse (98/98se/Me) sehen keine
Hardwarevirtualisierung vor, daher verhalten sich DOS-Programme unter
ihnen anders als unter Windows NT.
*) und zwar Windows NT 5.1. Vista ist Windows NT 6.0
>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.
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