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
 
#9

Re: Parellelport-Tutorial

  Alt 19. Jun 2006, 19:12
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] = '1then
    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] = '1then
    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
  Mit Zitat antworten Zitat