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.
SN7400 und mal schaun, was da in den Datenblättern außer der Beschaltung noch so drinsteht....