AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

16-Bit Folge über LPT ausgeben

Ein Thema von BoondockDuckling · begonnen am 14. Jan 2008 · letzter Beitrag vom 16. Jan 2008
 
Benutzerbild von BoondockDuckling
BoondockDuckling

Registriert seit: 30. Apr 2005
13 Beiträge
 
#1

16-Bit Folge über LPT ausgeben

  Alt 14. Jan 2008, 13:28
morgen

ich bin irgendwie zu doof eine 16-Bit folge über 3 Pins des LPTs an einen Schieberegister zu übergeben.

Seltsamerweise bin ich nur zu doof das in eine Prozeudur zu packen denn durch "manuellelles schalten" der LPT-Pins bekomme ich es hin.

Folgendes: Der MAX7221 wird wie ein Schieberegister angesteuert. Er besitzt einen Data, einen Load und einen Clock Eingang.
Um die internen Register zu beschreiben wird eine 16-Bit-Folge geschrieben. Dazu setzt man Load auf low und übergibt zu jeweiligen zustände (logische 0 und 1) an Data und schreibt diese per Clock in den Register. Z.b. um eine 1 zu übergeben wird Data und Clock gleichzeitig High gesetzt, um eine 0 zu schreiben wird nur Clock auf high gesetzt. Nach ende der 16 Bit wird Load wieder high gesetzt.

Bei mir ist
LPT-Pin1: Clock
LPT-Pin2: Load
LPT-Pin3: Data

nachtrag: p.s. pin1 ist datenpin0(wert 1), pin2 datenpin1(wert 2) und pin3 datenpin2(wert 4)

Ich habe mir drei Checkboxen erstellt mit denen ich die Pins1-3 beliebig in allen Kombinationen schalten kann. Das funktioniert auch, so kann ich die 16 Bit manuell in den Schieberegister schreiben.
Ich bin schlichtweg zu doof das in eine Prozedur zu packen die das automatisch macht.

Beispielsweise soll folgende Bitfolge übergeben werden: 0000 1010 0000 0000

Manuell sieht das so aus:
Code:
Pin2 auf Low
-> Pin1 auf High -> Pin1 auf Low       //1 (log. 0)
-> Pin1 auf High -> Pin1 auf Low       //2 (log. 0)
-> Pin1 auf High -> Pin1 auf Low       //3 (log. 0)
-> Pin1 auf High -> Pin1 auf Low       //4 (log. 0)

-> Pin1+Pin3 auf High -> Pin1+3 auf Low //5 (log. 1)
-> Pin1 auf High -> Pin1 auf Low       //6 (log. 0)
-> Pin1+Pin3 auf High -> Pin1+3 auf Low //7 (log. 1)
-> Pin1 auf High -> Pin1 auf Low       //8 (log. 0)

-> Pin1 auf High -> Pin1 auf Low       //9 (log. 0)
-> Pin1 auf High -> Pin1 auf Low       //10(log. 0)
-> Pin1 auf High -> Pin1 auf Low       //11(log. 0)
-> Pin1 auf High -> Pin1 auf Low       //12(log. 0)

-> Pin1 auf High -> Pin1 auf Low       //13(log. 0)
-> Pin1 auf High -> Pin1 auf Low       //14(log. 0)
-> Pin1 auf High -> Pin1 auf Low       //15(log. 0)
-> Pin1 auf High -> Pin1 auf Low       //16(log. 0)

-> Pin2 auf High


Da dachte ich mir: Kein problem, schreibe ich das einfach mal eins zu eins in eine Prozedur:
(Die port-kontrolle funlktionier über "io.dll" -> google!! Die Prozedur delay ist eine, wie zu erwarten, delay-Prozedur. Die tut jetzt zwar nichts zur sache, habe sie unten aber mal mit eingefügt.)

Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var d:integer;
begin
 d:=100; //millisekunden
 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 //
 PortOut($378,0); delay(d);
 PortOut($378,5); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,5); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 //
 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 //
 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 PortOut($378,0); delay(d);
 PortOut($378,1); delay(d);

 //
 PortOut($378,0); delay(d);
 PortOut($378,2); delay(d);

end;
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
Tick: DWord;
Event: THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
  Tick := GetTickCount + DWord(Milliseconds);
  while (Milliseconds > 0) and
   (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      if Application.Terminated then Exit;
      Milliseconds := Tick - GetTickcount;
    end;
finally
  CloseHandle(Event);
end;
end;



Leute, schlagt mich. Was zur ...... mache ich denn falsch??? Das ist doch nicht das erste mal dass ich einen Schieberegister beschreibe...
Signatur:
Dies ist ein Text, der an jeden Beitrag von Dir angehängt werden kann.
Es besteht ein Limit von 255 Buchstaben bzw. 4 Zeilen.
  Mit Zitat antworten Zitat
 


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 21:49 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