| Projekte |
Wie bekomme ich jetzt mehr Motoren an den Computer dran? und natürlich braucht man auch noch mehr Eingänge! Im folgenden wird nun dargestellt, wie sich ohne viel Aufwand bis zu 8 Motoren (=16 Ausgänge) und 16 Eingänge an den Parallelport anschließen lassen.
Zum Vergrößern des Schaltplans drauf klicken.
Natürlich bin auch ich nicht vor dem Fehlerteufel sicher.... und es hat sich auch einer eingeschlichen. Damit das Interface funktioniert, muß die Masse (GND) des Druckerports (Pin 18-25) mit der Leitung GND der restlichen Schaltung verbunden werden.
Zusätzliche Erklärungen zum Schaltplan
In diesem Schaltplan haben wir nun einige neue ICs: Einmal den Typ 74HC374. Dieses IC besteht aus einem 8-Bit Speicher. Dies benötigen wir, weil wir nun den 8-Bit Ausgabe-Bus auch Multiplexen werden, d.h. die ICs des Typs74HC374 sind auf der einen Seite an den Drucker-Port angeschlossen, auf der anderen Seite werden die Leitungen für die Eingänge der Motor-Treiber (so kann man die Verstärker auch nennen) bereitgestellt. Jeder der 74HC374 hat eine "CLK" - Leitung, die einzeln angesprochen werden kann. Mit dieser Leitung wird festgelegt, welcher der Bausteine die Daten des Drucker-Ports übernehmen soll. Anschließend werden diese Daten intern gespeichert und an den Ausgängen ausgegeben. Nun haben wir zwei 74HC244 für die Eingänge und zwei 74HC374 für die Ausgänge. Um diese anzusteuern brauchen wir insgesamt 6 Leitungen - wir haben aber nur noch vier übrig. Die Lösung: Die "Adressierung" übernimmt ein 74HC138, dies ist ein 3-zu-8 Dekoder. Die folgende Tabelle erklärt die Funktion dieses ICs.
| Eingänge | Ausgänge | |||||||||
| A | B | C | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| L | L | L | L | H | H | H | H | H | H | H |
| H | L | L | H | L | H | H | H | H | H | H |
| L | H | L | H | H | L | H | H | H | H | H |
| H | H | L | H | H | H | L | H | H | H | H |
| L | L | H | H | H | H | H | L | H | H | H |
| H | L | H | H | H | H | H | H | L | H | H |
| L | H | H | H | H | H | H | H | H | L | H |
| H | H | H | H | H | H | H | H | H | H | L |
Man sieht: Es kann immer nur ein einziger Ausgang (0-7) L sein, alle anderen sind H. Dies kommt den "Low-aktiven" Eingängen der ICs entgegen: Ebenso wie der 74H244 wird auch der 74HC374 über entsprechende Eingänge aktiviert. Nur der Vollständigkeit halber sei erwähnt, daß die CLK-Eingänge der 74LS374 eigentlich nicht auf den L - Pegel reagieren, sondern auf den Übergang von L auf H (= Flankengetriggert = Flankengesteuert).
Nun wird es aber auch ein wenig komplizierter, dieses Interface mit Software anzusprechen. Genauso wie beim vorigen arbeiten wir hier mit Multiplexing, d.h. nicht nur die Eingänge sondern auch die Ausgänge werden mehrfach verwendet. Welcher Ausgang gerade benutzt wird, entscheidet die Adressierung.
In der Tabelle am Anfang dieses Projekts haben wir gesehen, daß einige von den Steuereingängen "invertiert" sind. Dies bedeutet, wenn ich eine "0" programmiere, wird eine "1" ausgegeben. Dies ist in unserem Fall die "Strobe" und die "Auto_LF" Leitung. Die "Reset"-Leitung ist nicht invertiert.
Was muß man nun tun, um beispielsweise den 74HC374 anzusteuern, der für Motor 5-8 zuständig ist ?
Anhand des Schaltplans sieht man, daß er an Ausgang "1" des 74HC138 angeschlossen ist. Um diesen Ausgang auf "L" zu setzen, müssen die Eingänge A,B und C die Kombination A=H, B=L und C=L haben. Also muß ich auf den Controlport den Wert %00000010 oder Dezimal 2 schreiben, denn Bit 0 und Bit 1 werden Invertiert, d.h. eigentlich wird auf dem Port eine %00000001 ausgegeben. Das hört sich jetzt alles komplizierter an, als es ist.
Anhand des folgenden Beispiels wird die Ansteuerung klarer. In diesem Programmsegment wird in der Variablen ausgabe(0) ein 8-Bit Wert für die Motoren 1-4 (oder Ausgänge 1-8) erwartet, in der Variablen ausgabe(1) für die Motoren 5-8 (Ausgänge 9-16). Am Programmbeginn sollte durch OUT port+2,1 der Control-Port initialisiert werden. Durch diesen Befehl wird der Ausgang "2" des 74HC138 auf Low gelegt, alle anderen Ausgänge sind High. Somit ist keiner der Bausteine selektiert.
OUT port+2 , 3 'Ausgang 1-8 selektieren (Motor 1-4)
OUT port , ausgabe(0) ' Das erste Datenbyte ausgeben
OUT port+2 , 2 'Ausgang 1-8 schreiben, Ausgang 9-16 selektieren (Motor 5-8)
OUT port , ausgabe(1) 'Das zweite Datenbyte ausgeben
OUT port+2 , 1 'Ausgang 9-16 schreiben, alles inaktiv schalten
Entsprechend sieht es aus bei den Eingängen: In eingabe(0) wird der Wert für die Eingänge 1-8, und in eingabe(1) der Wert für die Eingänge 9-16 zurückgegeben.
OUT port + 2, 7 'Das untere Nibble am 74HC244 (IC7, E1..E4) anwählen
e1 = INP(port + 1) AND 240 'Vom Port das obere Nibble lesen
e1 = e1 XOR 128 'Das Busy-Bit invertieren (Bit 7)
e1 = e1 / 16 'und 4x verschieben ins untere Nibble
OUT port + 2, 6 'Das obere Nibble am 74HC244 (IC7, E5..E8)anwählen
e2 = INP(port + 1) AND 240 'Vom Port das obere Nibble lesen
e2 = e2 XOR 128 'Das Busy-Bit invertieren (Bit 7)
eingang(0) = e1 + e2 'Das Gesamt-Ergebnis ( 1 Byte ) wird in Variable "eingang(0)" geschrieben
OUT port + 2, 5 'Das untere Nibble am 74HC244 (IC4, E9..E12) anwählen
e1 = INP(port + 1) AND 240 'Vom Port das obere Nibble lesen
e1 = e1 XOR 128 'Das Busy-Bit invertieren (Bit 7)
e1 = e1 / 16 'und 4x verschieben ins untere Nibble
OUT port + 2, 4 'Das obere Nibble am 74HC244 (IC4, E13..E16)anwählen
e2 = INP(port + 1) AND 240 'Vom Port das obere Nibble lesen
e2 = e2 XOR 128 'Das Busy-Bit invertieren (Bit 7)
eingang(1) = e1 + e2 'Das Gesamt-Ergebnis ( 1 Byte ) wird in Variable "eingang" geschrieben
OUT port + 2, 1 'alle Bausteine inaktiv schalten
Sicherlich könnte man die Abfrage der Eingänge etwas kompakter schreiben, ich habe es so ausführlich gemacht, um die genauen Vorgänge so deutlich wie möglich zu zeigen. Es sei jedem selbst überlassen, das Programm entsprechend zu optimieren.
| Projekte |