Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [c-lib] Parellelport-Tutorial

  Alt 15. Jun 2006, 18:10
Und los geht's:

Es macht Sinn, eine globale Variable für gelesene Bytewerte zu deklarieren

Work_ In: Byte; Jetzt aber.... hier der relevante Teil derTimerroutine......
......ein Beispiele einer solchen Ereignisbearbeitung

Delphi-Quellcode:
begin
  WriteLPTPort(37Ah, Str_to_Byte('00100xx1'));
  Work_In := ReadLPTPort(378h);   
  WriteLPTPort(378h, Str_to_Byte('00000xx0'));
  Event_Byte := Bit_Changed(Old_In_Val, Work_In);

  if Pos('1', Event_Byte) <> 0 then // ab hier weiß ich, aha, eine Änderung
  begin
    Event_Flag_Low := Bit_is_Changed(Old_In_Val, Event_Byte); // hier geht was aus
    Event_Flag_High := Bit_is_Changed(Work_in, Event_Byte); // und hier was an

    Work_Str_In := Byte_To_Str(Work_In);
    Edit1.Text := Work_Str_In; // Eingang zur Anzeige bringen
    Edit3.Text := ByteToStr(EventByte); // geänderte Bits anzeigen
    High_Flg_Str := ByteToStr(Event_Flag_High); // für Ereignisroutine High
    Low_Flg_Str := ByteToStr(Event_Flag_Low); // für Ereignisroutine Low
    Edit4.Text := High_Flg_Str; // zum Ansehen.....
    Edit5.Text := Low_Flg_Str; // zum Ansehen.....
    Old_In_Val := Work_In; // nicht vergessen, sonst funzt es nicht
  end;

  if Pos('1', High_Flg_Str) > 0 then
    Action_Is_High;
  if Pos('1',Low_Flg_Str) > 0 then
    Action_Is_Low;
end;
Mit WriteLPTPort(37Ah, Str_to_Byte('00100xx1')) wird der Port auf "lesen" geschaltet und die Harwarebausteine selektiert. xx steht hier für die Chip-Adresse (Chipselect). Anschließend wird
das Eingangsregister in die Work_In-Variable geschrieben und der Port wieder in den Ursprung zurückgesetzt.
Nun kann aus dem abgelegten alten Eingangsbyte und dem Neuen ein Ereignisbyte gebildet werden. Sind in diesem Ereignisbyte einzelne Bit auf '1' gesetzt, hat eine Änderung stattgefunden. Aus der Information altes Eingangsbyte, neues Eingangsbyte und Ereignisbyte werden die Ereignisflags Wechsel von '0' -> '1' und Wechsel von '1' -> '0' gesetzt und in eine String-Variable geschrieben.
Einerseits kann man leicht ein Bild der Ereignisse in einem TEdit-Objekt anzeigen lassen, andererseits
ist auch eine leichte Verarbeitung in den Prozeduren Action_Is_High und Action_Is_Low möglich. Zum Zeichen der erfolgten Verarbeitung werden die '1'-Zeichen aus dem Flag-String zu '0' gesetzt.

Und so sehen die entsprechenden Ereignisroutinen aus:

Delphi-Quellcode:
procedure Action_Is_High;
var
  xPos: Integer;
begin
  repeat
    XPos := Pos('1', High_Flg_Str);

    if xPos > 0 then
    begin
      Set_ActionBit(xPos); // diese Procedure müsst ihr aber mal selber schreiben !
      High_Flg_Str[xPos] := '0'; // Bit ist bearbeitet, also brauchen wir's nicht mehr
    end;
   until xpos = 0;
end;
Und hier die andere Reaktion...

Delphi-Quellcode:
procedure Action_Is_Low;
var
  xPos: Integer;
begin
  repeat
    XPos := Pos('1', Low_Flg_Str);

    if xPos > 0 then
    begin
      ReSet_ActionBit(xPos); // und die auch, da steht dann drin, was geschehen soll
      Low_Flg_Str[xPos] := '0'; // Bit ist bearbeitet, also brauchen wir auch nicht mehr
    end;
  until xpos = 0;
end;
das nehm ich euch noch ab, aber den Rest macht auch mal......

Delphi-Quellcode:
procedure Set_ActionBit(Bit_Number: Integer);
begin

end;

procedure ReSet_ActionBit(Bit_Number: Integer);
begin

end;
So, das war schon eine ganze Menge Software und auch ein wenig Einleitung in Hardware. Aber wer noch nicht damit gebastelt hat, der weiß nicht, wovon ich rede. Also, Bastelexperten, ihr könnt euch nun freien Lauf der Gedanken lassen und die Umsetzung in Programmierung vollziehen.
Jetzt gibt's wieder Bastelstunde....

Wir haben bei der Erklärung der "tristate"-Ausgänge aufgehört. Dem möchte ich noch eines hinzufügen: Leitungen, an welchen "tristate"-Ausgänge hängen, müssen mit einem Widerstand (100k) entweder an – oder + geschaltet werden. Ich nehm immer +, weil die meisten TTL-IC mehr Strom abgeben, wenn sie Low sind.
Die Erklärung spar ich mir jetzt mal, es ist einfach wichtig zu wissen, bei Low kann mehr Strom fließen. Das heißt unter anderem Leuchtdioden sind heller, wenn sie gemeinsam an Plus und vom IC den Minus bekommen.
Und damit sind wir mal bei etwas, was nicht zu vernachlässigen ist. Ein Standard-TTL IC Ausgang kann ca. 10 – 20 Eingänge beschalten. Werden mehr Eingänge mit einem Ausgang beschaltet, so ist es ratsam,
Bustreiber zu verwenden. Diese gibt es invertierend oder direkt. Und diese Aussage trifft speziell auf
den Parallelport zu. Die Schaltung funktioniert vielleicht 10..15 Minuten, dann setzt mal hier oder da
was aus und plötzlich ist's Essig mit dem tollen Experiment.
Also, kommt nicht auf die Idee, ein Relais direkt am Port zu schalten und Experimente mit LED, na ja, besser ist da schon, vorher zu puffern. Könnt euch ja mal ein Datenblatt eines Standard-TTL-ICs aus dem Netz laden z.B. Bei Google suchenSN7400 und mal schaun, was da in den Datenblättern außer der Beschaltung noch so drinsteht....
  Mit Zitat antworten Zitat