AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Ansteuern des Parallelports
Tutorial durchsuchen
Ansicht
Themen-Optionen

Ansteuern des Parallelports

Ein Tutorial von flomei · begonnen am 25. Mai 2003 · letzter Beitrag vom 8. Okt 2006
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von flomei
flomei
Registriert seit: 17. Jan 2003
Hallo liebe DP-User!

Immer wieder wird gefragt, wie man den Parallelport ansteuern kann. Also dachte ich mir: Fängste mal an und schreibst ein Tutorial. Ich hoffe, dass wird mir gelingen.
Ich werd gleich erstmal mit nem bisschen Theorie anfangen. Zum Aufwärmen!

Also: Ab geht´s!


MfG Florian



P.S.: Ich werde gelegentlich aus einer meiner Technik-Arbeiten zitieren.

[EDIT] Ich übernehme keinerlei Garantie für die Richtigkeit der von mir gemachten Angaben. Große Teile des Codes stammen aus dem I-Net und aus diesem Forum. Ich danke allen, die durch ihre Beiträge geholfen haben dieses Tutorial zu vervollständigen! [/EDIT]
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
 
Stephan N.

 
Delphi 5 Standard
 
#11
  Alt 22. Okt 2003, 12:47
Hallo
ich habe mal den Quelltext etwas umgeschrieben aber jetzt bringt er nur noch fehlermeldungen

Delphi-Quellcode:
Function LesePort( Port : Word ) : Byte;

implementation
Const
  LPT_DataRegister = $378;
  LPT_StatusRegister = $379;
  LPT_KontrollRegister = $37A;

Var
  Value: Byte;
  Port: Word;

function LesePort( Port : Word ) : Byte;


Begin
  // Welches Register des Statusports willst du lesen?
 // Port := LPT_DataRegister

  // Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm //erklärt dem Compiler, dass Assembler Code anfängt
    mov dx, Port //Port = 378h = die Adresse von LPT 1
    in al, dx
    Mov Value, AL
  end;


  case Port of
    LPT_DataRegister : Begin
                             IF Value AND $01 = $01 then result:=1;
                             IF Value AND $02 = $02 then result:=2;
                             IF Value AND $04 = $04 then result:=3;
                             IF Value AND $08 = $08 then result:=4;
                             IF Value AND $16 = $16 then result:=5;
                             IF Value AND $32 = $32 then result:=6;
                             IF Value AND $64 = $64 then result:=7;
                             IF Value AND $128 = $128 then result:=8

  else result:= 0;

end;
end;
end;
end.
in der main unit um die funktion aufzurufen
a := LesePort(???) was mus ich für ? einsetzen???
  Mit Zitat antworten Zitat
UweG.

 
Delphi 2 Developer
 
#12
  Alt 22. Okt 2003, 13:16
Hallo Stephan,

solltest Du den Wert des Porteingangs so abfragen

Delphi-Quellcode:
case Port of
    LPT_DataRegister : Begin
                             IF Value AND $01 = $01 then result:=1;
                             IF Value AND $02 = $02 then result:=2;
                             IF Value AND $04 = $04 then result:=3;
                             IF Value AND $08 = $08 then result:=4;
                             IF Value AND $16 = $16 then result:=5;
                             IF Value AND $32 = $32 then result:=6;
                             IF Value AND $64 = $64 then result:=7;
                             IF Value AND $128 = $128 then result:=8

  else result:= 0;
bekommst Du als Resultat immer nur das höchstwertig gesetzte Bit zurückgegeben.

Beispiel

Value = 10010000b
Dann erfolgt bei Value AND $16 => result := 5
und bei Value AND $128 => result := 8

Die Information von Bit4 geht also verloren

Möchtest Du die Anzahl der gesetzten Bits wissen, solltest Du Result inkrementieren, ansonsten bleibt Dir nur die Übergabe des binären Wertes oder die Zuweisung an acht einzelnen Variabelen oder an ein Array oder eine Struktur.



MfG.
Uwe



[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
Nimoee

 
Delphi 5 Professional
 
#13
  Alt 22. Okt 2003, 14:15
Hallo,

die ganze Vorgehensweise, die du hier beschreibst ist auch für Win9x und Me extrem unsauber.
Wir befinden uns im protected mode eines intel Prozessors.
Eigentlich sind diese direkten Hardwarezugriffe nicht zulässig.
Dass sie funktionieren ist eine andere Sache.
Aber bitte sowas nicht in ein Tutorial ( auch wenns weh tut ).

Nimoee
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

 
Delphi 6 Professional
 
#14
  Alt 22. Okt 2003, 15:26
olla an alle

@flomei: danke für das lob aber das wäre nicht nötig gewesen. ich meinte doch zu dir das das
testcode für mich war den ich ganz schnell schreiben musste um das auszuprobieren. aber ob
der code was für n tutorial taugt wage ich ein wenig zu bezweifeln. nicht böse nehmen.

@nimoee: wie würdest du es denn realisieren wenn du einzelne pins direkt setzen/lesen willst?
gibt es da noch andere funktionen für?


mfg, mika
  Mit Zitat antworten Zitat
Benutzerbild von thomasdrewermann
thomasdrewermann

 
Delphi 3 Professional
 
#15
  Alt 15. Nov 2003, 08:22
Hallo liebe DP-Nutzer,
falls ihr Fragen oder Anregungen zu dem Tutorial von flomei habt
postet hier. Dann können auch andere User die das selbe Problem/ die
selbe Frage haben direkt hier im Forum die Lösung finden.
Andernfalls würde flomei mit E-Mails überheuft, was in letzter
Zeit der Fall war. Genau aus diesem Grund beantwortet er
Anfragen dieser Art mittlerweile garnicht mehr. Das Níchtbeantworten
hat also nichts mir personlichen Hass oder ähnlichem zu tun.

MFG
Thomas
  Mit Zitat antworten Zitat
Stephan N.

 
Delphi 5 Standard
 
#16
  Alt 4. Feb 2004, 12:23
Kann ich von dem kontrollregister überhaupt einlesen
also bei mir funktioniert nur das einlesen des Statusregisters


mfg Stephan
  Mit Zitat antworten Zitat
hannesburgemeister
 
#17
  Alt 17. Mär 2004, 21:56
viiiiiiiiiilen dank für die kleine procedure portOut !!!!
ich suche sie schon seit wochen,
ich will ein interface ansteueren und konnte es nur in basic und turbopascal,
nun endlich auch in delphi;

ist doch ein viel schöneres arbeiten als mit basic...

meine schüler werden sich freuen

daaaanke
Hannes Burgemeister
Pauker an der
Martin-Buber-Oberschule.de
  Mit Zitat antworten Zitat
Muetze1
 
#18
  Alt 22. Jan 2005, 22:00
Moin!

Zitat von Capable:
1. Frage

Delphi-Quellcode:
procedure PortOut(x:byte);
begin
  asm //erklärt dem Compiler, dass Assembler Code anfängt
   mov [b]dx[/b],378h //378h ist die Adresse von LPT 1
   mov al,x //x müssen wir noch einen Wert zuweisen
   out [b]dx[/b],al
  end;
end;
wieso wird hier zwei mal dx verwendet?

hier hingegen nicht

Delphi-Quellcode:
// Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port // 1. Verwendung DX DX mit der Portadresse laden/füllen
    in al, dx // 2. Verwendung DX ein Byte von dem Port in DX auslesen und in AL schreiben
    Mov Value, AL // und AL in die Variable Value schreiben
  end;
Wieso? Wird es doch auch?

Zitat von Capable:
2. Frage

muss hier nicht hinter das port ein Out?
Ja, muss. Es wird anscheinend PortOut() angesprochen und ein Port() gibt es nicht.

Zitat von Capable:
3. Frage

... wird hier port nicht zwei mal deklariert, bzw. der integer zugeordnet? (delphi meint: redeclaration...)
Ja, die Deklaration von Value und Port macht an der Stelle überhaupt keinen Sinnn - entferne sie einfach beide.

Zitat von Capable:
4. Frage

bedeutet $378 das gleiche wie 378h ?
Ja, 378h bedeutet das gleiche wie $378. Wenn du in Delphi Zahlen ohne irgendwas angibst, so sind es dezimale Zahlen. Mit dem $ davor werden die Zahlen danach als hexadezimale Zahlen gewertet. Dies gilt für Delphi und Pascal - in C z.B. müsste man ein 0x vor der Zahl schreiben - aber da es so viele Sprachen gibt, gibt es auch eine allgemeine Schreibweise die einfach hinter der Zahl einen Buchstaben angibt um eine bestimmte Schreibweise zu kennzeichnen:

h = hexadezimal
d = dezimal
o = oktal
b = binär

Dies wird z.B. direkt so vom Turbo Assembler von Borland verwendet.

Zitat von Capable:
5. Frage

muss ich bei LPT2 einfach die drei jeweils durch die 2 austauschen? also,

378 --> 278
379 --> 279
37A --> 27A
Nein, das ist nicht gesagt. Die Reihenfolge der LPT Ports und deren Adressen hängt vor allem davon ab wie sie gefunden werden vom BIOS bzw. von Windows. Parallelports können auf den folgenden Adressen zu finden sein:

3BCh, 378h, 278h und PCI Portadressen (also Portadressen > 1000h)

Bei den meisten Rechnern wo ein 2. Parallelport mit einer ISA Karte nachgerüstet ist, da wird es 278h sein. Bei solchen wo eine MDA Karte mit drinne steckt, da wird es 3BCh sein.

Zitat von Capable:
6. Frage

wie kann ich den Wert der Variable Port aus word in einen string umwandeln und in einer showmessage darstellen?
In welcher Darstellungsform? Als Hexadezimalzahl oder als Dezimalzahl?

Delphi-Quellcode:
Begin
  ShowMessage('Portadresse: ' + IntToHex(Port, 3) + ' hexadezimal' + #13#10 +
              'Portadresse: ' + IntToStr(Port) + ' dezimal');
End;
Zitat von Capable:
7. Frage

Code:
 // Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port
 [b]in al, dx[/b]
    Mov Value, AL
  end;
wieso heißt es nicht in dx,al
Weil es so ist bei einem x86 kompatiblen Assembler und hier im Syntax von Borland. Hier ist es so festgelegt, das als erstes immer das Ziel einer Operation und danach die Quelle angegeben wird.

Code:
In Ziel, Quelle  einlesen, also ins Ziel schreiben und vom Port lesen
Out Ziel, Quelle  schreiben, also in den Port schreiben.
Genauso bei Move:

Code:
mov Ziel, Quelle
mov dx,  $378
Zitat von Capable:
8. Frage

wieso verwendet man eine funktion und keine prozedur?
Weil eine Funktion einen Rückgabewert hat im Gegensatz zu einer Procedure. Daher gibt das PortIn() auch was zurück (den eingelesenen Wert) und PortOut() besteht aus einer Procedure, weil es nichts zurück gibt.

Den anderen Teil der 8. Frage kann dir ein anderer erklären - war genug erstmal für mich.

@flomei:

Erklär mal bitte auch, das es eine Basisadresse gibt und dann die Register immer nur ein fester Offset von dieser Basisadresse ist.

MfG
Muetze1
  Mit Zitat antworten Zitat
Capable
 
#19
  Alt 22. Jan 2005, 22:07
nabend muetze,

ich danke dir vielmals für dein engagement. ich werd mich jetzt ma hinsetzen und versuchen das zu verarbeiten.

bei frage 6 war eine dezimalzahl gewünscht.

nochmals danke

gruß

capable
  Mit Zitat antworten Zitat
Capable
 
#20
  Alt 30. Jan 2005, 12:45
hallo leutz,

könnt ihr mir kurz verraten, wie ich einen string in byte wandeln kann.

hintergrund:

ich möchte die variable x aus einem editfeld im formular holen.

ich danke euch!

capable
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz