Natürlich haben sich die Experten der Halbleiterindustrie auch da etwas einfallen lassen.
Der ULN 2803 beherbergt 8 Schaltkreise, die mit TTL- Pegeln versorgt und im Ausgang Relais bis 30V schalten können. Freilaufdioden sind schon drin.
Damit nun die Ausgänge bei einer Selektierung eines anderen Kanales nicht ihren Wert verlieren, ist für Ausgänge ein 8-Daten-Latch geeignet. Man legt die Daten 8 Bit breit an und schickt einen Schreibimpuls über die Lesen/Schreiben Leitung. Fedisch.
Es ist für Experimente sowieso besser, man teilt die Hardware auf. Z.B. In eine Portkarte mit der Aufbereitung der Kanalselektion und einen Portpuffer, um den LPT vor unbeabsichtigter Zerstörung zu sichern.
Nun können simple Relaiskarten gebaut werden, die am Portpuffer hängen, eine Selektion erhalten und das Schreibsignal für die Data-Latches.
Die Ausgänge der Data-Latches können direkt auf den ULN und an diesen wiederum direkt die Relais.
Nun noch Klemmen für die Relaikontakte und ab geht er der Peter......
Eingangsmäßig ebenso. Hier verwenden wir keine Data-Latches sondern die Portpuffer. Jeder wird komplett als Eingang geschaltet, d.h. CS1 und CS2 kommen an die gleiche Kanal-Selektion.
Wichtig ist: Alle Eingänge sind mit 100k an + zu binden, da sonst unbeschaltete Eingänge kein eindeutiges Logiksignal liefert. Dies kann die gesamte Schaltung beeinflussen, ja sogar Bausteine zerstören.
Jeder Eingangskanal kann nun den Bedürfnissen angepasst werden. Z.B. ein Analog-Digitalwandler, eine Anpassung um einen Hell-Dunkel-Wechsel auf einem LDR(Lichtempfindlicher Widerstand) einzulesen oder ganz einfach eine Abfrage eines mechanischen Kontaktes.
Wichtig ist:
Der Signalpegel zur Schnittstelle ist TTL Norm (Low = 0 V, High = 5 V)
Es sei noch bemerkt, das ein Low-Pegel nicht ganz 0 V hat und ein High-Pegel auch nicht ganz 5 V, nur dass ihr euch beim Messen nicht wundert........
Sollte es euch nun gelungen sein, mit Hilfe meiner "flachmännischen" Beratung doch tatsächlich Werte aus- bzw. in den Computer zubekommen, und zwar über eine eigens dafür zurechtgestrickte Hardware, fernab von Tastatur und Monitor, ja dann werdet ihr auch Vertrauen haben in die weiteren Programmfragmente, welche ich euch noch vorstellen möchte.
Aber zuerst ein paar Gedanken dazu:
Was will ich mit den eingelesenen Informationen in Form von Bits und Bytes anfangen und was mit der Möglichkeit, doch das ein oder andere Relais zum anziehen zu bringen ?
Machen wir wieder ein paar kleine Steps und versuchen, visuelle Objekte zu indizieren. So z.B. eine TCheckbox einem Bit im String zuzuordnen. Z.B. Durch Anklicken erreichen, das ein Relais schaltet. Natürlich kann ich hergehen und im Code fest verankern
Tcheckbox.Name = 'CB_Bit_0';
Nehmen wir einen String mit Namen Work_Out, der in Formcreate mit '00000000' initialisiert ist.
Durch die Abfrage
Delphi-Quellcode:
if CB_Bit_0.Checked then
Work_Out[8 - 0] := '1'
else
Work_Out[8 - 0] := '0';
if CB_Bit_1.Checked then
Work_Out[8 - 1] := '1'
else
Work_Out[8 - 1] := '0';
// ...
Etc.
Sehr mühselig und steif. Auch eine Schleife bringt so nicht viel:
Delphi-Quellcode:
for i := 0 to Length(Work_Out) - 1 do
begin
if i = 0 then
if CB_Bit_0.Checked then
Work_Out[8 - i] := '1'
else
Work_Out[8 - i] := '0';
if i = 1 then
if CB_Bit_0.Checked then
Work_Out[8 - i] := '1'
else
Work_Out[8 - i] := '0';
// ...
end;
Viel eleganter ist doch dies....
Delphi-Quellcode:
for i := 0 to Length(Work_Out) - 1 do
begin
if TCheckbox(FindComponent(' CB_Bit_' + IntToStr(i))).Checked then
Work_Out[8 - i] := '1'
else
Work_Out[8 - i] := '0';
end;
Klar ist natürlich, das die Checkboxobjekte auch entsprechend angeordnet sind, damit auch Bit 0 zur Checkbox mit dem Namen 'CB_Bit_0' passt.
Geht natürlich auch umgekehrt, um die "gesetzten Bit" in einem String in Checkboxen zu übertragen:
Delphi-Quellcode:
for i := 0 to Length(Work_In) - 1 do
begin
if Work_In[8 - i] = '1' then
TCheckbox(FindComponent('CB_Bit_' + IntToStr(i))).Checked := true
else
TCheckbox(FindComponent('CB_Bit_' + IntToStr(i))).Checked := false;
end;
Ah ja, jetzt können wir auch direkt über einen Index auf ein visuelles Objekt zugreifen, bzw. dessen Eigenschaften ändern.Zum Beispiel die Farbe von TPanel ändern:
Delphi-Quellcode:
for i := 0 to Length(Work_In) - 1 do
begin
if Work_In[8 - i] = '1' then
TPanel(FindComponent('PN_Bit_' + IntToStr(i))).Color := clRed
else
TPanel(FindComponent('PN _Bit_' + IntToStr(i))).Color := clGreen;
end;
Manch einem erzähl ich hier nix neues, nun ja, für Fortgeschrittene sollte dieser kleine Kurs ja auch nicht sein, da brauch ich selber einen. Aber so ein paar Raffinessen und Zugriffsmethoden, nun, die möchte ich hier schon erklären, weil ich gleich so richtig ausholen werde.......
Also, wir haben eine Hardware gebastelt.
Wir haben ein Programmrumpf, um Informationen über den Parallelport zu lesen und zu schreiben. Wir können Relais schalten. Und nun......
Schreiben wir für jede Anwendung ein Programm in Delphi. Jedesmal, wenn ein Relais geschaltet werden soll, rufe ich ein Programm x, y oder z auf ?
Geht es nicht eleganter ?
Jo, es geht...... Vielleicht in einem späteren Beitrag