TPS steuert Schieberegister
von Martin Hülse
Ziel war es ein Schieberegister ("serial-in parallel out") durch die Tastenprogrammierbare
Steuerung (TPS) anzusteuern. Bei dem verwendeten Schieberegister handelt es
sich um den Typ SN74HC164N.
Zur Demonstration des Schieberegisters werden drei Signalquellen benötigt:
Erstens, ein konstantes High-Signal als
Eingang für das asynchrone "clear"-Signal (CLR) des
Schieberegisters.
Zweitens, ein
periodisches Signal. Dieses determiniert den Takt (CLK) der Signalverarbeitung
im Schieberegister.
Drittens, ein
Signal, welches als serielle Eingabe des Schieberegisters dient. Letztes, muss
also beliebig zwischen High und Low
wechseln können.
Die TPS stellt diese drei Signalkanäle zur Verfügung. Die beliebige Umschaltung
des dritten Signals von wird durch ein Tastendruck der TPS-Einheit
gesteuert.
Zum Aufbau der TPS-Einheit wurde das Conrad Lernpaket "Mikrocontroller -
verstehen und anwenden" verwendet. Der Aufbau erfolgt auf einem Steckboard
und kann somit leicht mit dem Schieberegister verschaltet werden. Die
Schieberegistereinheit mit LEDs wurde auf einem zweiten Steckboard verschaltet.
Folgende Bauelemente wurden für das Schieberegister verwendet:
- SN74HC164N
- 8 x LEDs
- 1 x 220 Ohm, Widerstand
- Klingeldraht
- Steckboard
Der Aufbau der TPS entspricht dem Standardaufbau mit Tastschaltern, ganz wie im
Lernpaket beschrieben (Abb. 1 und 2 im Handbuch des Lernpakets).
Schieberegister-Einheit
Im Schema oben ist zum einen das Schieberegister (SN74HC164N) mit den
entsprechenden Signaleingängen festgehalten. Zweitens ist die Verschaltung des
Schieberegisters mit übrigen Bauteilen (LEDs und Widerstand) aufgezeigt. Die
Ausgänge mit der Beschriftung A1, A2 und A4 verweisen direkt auf die Verschaltung
mit dem TPS. A1, A2 und A4 sind die entsprechende digitalen Ausgänge der TPS
und werden also direkt mit diesen Eingängen des Schieberegisters
verbunden.
Der TPS Ausgang A1 muss also das periodische Taktsignal liefern, der TPS
Ausgang A2 das konstante High-Signal. Während der TPS Ausgang A4 die seriellen
Dateneingangssignal des Schieberegisters bereitstellt.
Programmierung des TPS
Die Programmierung der TPS zur Erzeugung des konstanten und periodischen
Signals der Ausgänge A1 und A2 ist recht einfach. Die Herausforderung für mich
war jedoch Signal A4. Per Tastendruck muss dieses Signal negiert werden ohne
die Zustände der anderen Signal A1 und A3 zu verändern.
Beim TPS können die Werte der Signalausgänge A1 bis A4 nicht direkt abgefragt
werden. Der Zustand dieser Ausgangssignale muss also erstens, immer in einem
Register A gespeichert bleiben; und
zweitens, muss ein einzelnes Bit in diesem Register A negiert werden können. Eine
bit-weise Manipulation der Register ist mit dem Befehlssatz der TPS jedoch
nicht direkt möglich.
Die bit-weise Manipulation des Registerinhaltes A wurde per logischer
Verknüpfungen mit einer fixen Bit-Maske umgesetzt. Um dies zu demonstrieren,
soll zuerst das folgende TPS-Programm "Bit-weise per Tastendruck"
vorgestellt werden
Programm: Bit-weise Manipulation per Tastendruck
Das Verhalten dieses Programms lässt sich folgender Massen beschreiben: Linke
und rechte LED der TPS (Standardaufbau mit Tastschaltern) werden individuell
durch die Schalter S1 bzw. S2 an- und ausgeschaltet. Dabei bleibt der Zustand
der restlichen LEDs erhalten.
Das Programm ist durch eine Hauptprogramm inklusive zweier Sub-Routinen
umgesetzt.
Hauptprogramm mit Endlosschleife:
0x00: 40; A = 0000
0x01: 51; B = A
0x02: 52; C = A
0x03: 40; A = 0000
0x04: 51; B = A
0x05: 82; page = 2
0x06: D0; call (2)0 (Sub-Routine für Tastschalter S2)
0x07: 83; page = 3
0x08: D0; call (3)0
0x09: 62; A = C
0x0A: 77; A AND B -> A
0x0B: 7A; NOT A -> A
0x0C: 53; D = A
0x0D: 62; A = C
0x0E: 78; A OR B -> A
0x0F: 51; B = A
0x10: 63; A = D
0x11: 77; A AND B -> A
0x12: 54; Dout = A
0x13: 80; page = 0
0x14: 92; jump (0)2
Sub-Routine für Tastschalter S2:
0x20: CD; S2 = 0?
0x21: E0; return (zurück zum
Hauptprogramm)
0x22: 20; wait 1 msec
0x23: CF; S2 = 1?
0x24: 32; jump-2
0x25: 41; A = 0001 (Lade die S2 repräsentierende Bit-Maske, rechte LED)
0x26: 51; B = A (speichere Bit-Maske in Register B)
0x27: E0; return (zurueck zum
Hauptprogramm)
Sub-Routine für Tastschalter S1:
0x30: CC; S1 = 0?
0x31: E0; return (zurück zum
Hauptprogramm)
0x32: 20; wait 1 msec
0x33: CE; S1 = 1?
0x34: 32; jump-2
0x35: 48; A = 1000 (Lade die S1 repräsentierende Bit-Maske, linke LED)
0x36: 51; B = A (speichere Bit-Maske in Register B)
0x37: E0; return (zurück zum
Hauptprogramm)
Das Hauptprogramm läuft in einer Endlosschleife und ruft immer die Sub-Routine
für die Abfrage der Taster S1 (Adresse 0x08) und S2 (Adresse 0x06) auf. Falls
die Taste S1 bzw. S2 gedrückt und wieder losgelassen ist, wird die
entsprechende Bit-Maske in das Register B geladen. Bei Druck des Tasters S1
wird die Maske 1000 geladen (Adresse 0x35 und 0x36). Für Taster S2 ist es die
Maske 0001 (Adresse 0x25 und 0x26).
Ist kein Taster gedrückt, dann bleibt im Register B die Standardmaske 0000
gespeichert (siehe Adresse 0x03 und 0x04). Mit dieser Maske werden keine Bits
verändert.
Nach dem Aufruf der Sub-Routinen für die Tasterabfrage, wird der Inhalt des
Registers A mit dem Inhalt von Register B (aktuelle Bit-Maske) mittels
logischen Operationen verarbeitet (beginnend bei Adresse 0x0A). Nach dieser
Verarbeitung wird der neue Inhalt des Registers A auf die digitalen Ausgänge
geschrieben (Adresse 0x12) und wieder zurück auf Zeile 0x02 gesprungen.
In Zeile 0x00 wird das initiale Bit-Muster definiert, welches direkt nach dem
Start von der TPS angezeigt wird. Hier kann jedes beliebiges Muster eingetragen
werden.
Programm für die Schieberegisteransteuerung
Beim Programm zur Ansteuerung des Schieberegisters ist nun die Sub-Routine für
Taster S1 durch eine Routine ersetzt, welche immer die Bit-Maske 0100 in
Register B speichert (ab Adresse 0x30). Auf diese Weise wird das entsprechende
Bit im Register A bei jedem Schleifendurchlauf negiert. Dies erzeugt das
periodische Signal für die Taktsteuerung des Schieberegisters.
Bei jedem Durchlauf der Endlosschleife im Hauptprogramm wird die
Befehlsausführung für 200 Millisekunden gestoppt (Adresse 0x13). Dies ergibt
eine Taktrate (ca. 2,5 Hz) bei der sich die Wirkungsweise des Schieberegisters
gut demonstrieren lässt.
Das benötigte konstante High-Signal wird durch die Definition des initialen
Bit-Musters 1000 (Adresse 0x00) erzeugt. Damit ist der Linke Ausgang immer auf
Wert High gesetzt.
Die serielle Signal-Eingabe wird durch den Tastenschalter S2 definiert. Bei
entsprechenden Tastendruck wird die Bit-Maske 0001 in Register B gespeichert
(Adresse 0x25 und folgende).
Hauptprogramm mit Endlosschleife:
0x00: 48; A = 1000
0x01: 51; B = A
0x02: 52; C = A
0x03: 40; A = 0000
0x04: 51; B = A
0x05: 82; page = 2
0x06: D0; call (2)0
0x07: 83; page = 3
0x08: D0; call (3)0
0x09: 62; A = C
0x0A: 77; A AND B -> A
0x0B: 7A; NOT A -> A
0x0C: 53; D = A
0x0D: 62; A = C
0x0E: 78; A OR B -> A
0x0F: 51; B = A
0x10: 63; A = D
0x11: 77; A AND B -> A
0x12: 54; Dout A
0x13: 27; wait 200 msec
0x14: 80; page = 0
0x15: 92; jump (0)2
Sub-Routine für Tastschalter S2:
0x20: CD; S2 = 0?
0x21: E0; return
0x22: 20; wait 1msec
0x23: CF; S2 = 1?
0x24: 32; jump-2
0x25: 41; A = 0001
0x26: 51; B = A
0x27: E0; return
Sub-Routine für periodisches Signal:
0x30: 44; A = 0100
0x31: 78; A AND B -> B
0x32: 51; B = A
0x33: E0; return;
Demonstration
Ein im Internet veröffentlichtes Video (https://www.youtube.com/watch?v=abLRbk8eYoE)
demonstriert die Funktionsweise der finalen Schaltung. Die grünen LEDs zeigen
die Ausgabewerte Q_A bis Q_H (von rechts nach links) des Schieberegisters an;
die roten LEDs die Ausgänge A1 bis A4 (von links nach rechts).
Sobald die TPS angeschaltet ist, ist A1 konstant auf High während A2 periodisch
blinkt. Alle anderen Ausgänge sind Low. Durch Tastendruck kann nun der Wert von
A4 auf High gesetzt werden bzw. wieder zurück auf Low. Wie im Video zu sehen,
werden High- und Low-Signale taktweise
in das Schieberegister eingelesen und von diesen weitergeschoben. Bleibt A4 auf
High, werden permanent die Signale High ins Schieberegister gelesen, so dass
nach einigen Zyklen alle grünen LED leuchten (ab Sekunde 22 im Video). Wird
dann A4 auf Low gesetzt (Sekunde 29), dann werden entsprechend die Low-Signale
in das Schieberegister gelesen. Nach 8 Zyklen sind alle LEDs wieder dunkel.
Ein Reset der TPS (Sekunde 41) setzt auch alle Ausgänge des Schieberegisters
auf den Wert Low. Mit dem Rest wird Signal A1 und damit ebenfalls der
CLR-Eingang des Schieberegisters auf Low gesetzt. Dies hat den Reset des
Schieberegisters zur Folge.