Mit dem Schieberegister lassen sich bis zu 8 Pins gleichzeitig ansteuern, wobei aber nur 3 Pins auf der Seite des Mikrocontrollers (z.B. Arduino) benötigt werden. Durch Verwendung von mehreren Schieberegistern können noch weitaus mehr Pins angesteuert werden.
Betriebsspannung: | 2V bis 6V (nominal: 5V) |
---|---|
Stromaufnahme | ICC = max. 80μA |
Max. Stromstärke | 20mA |
Ausgänge | 8 (parallel) |
Temperaturbereich: | -40°C bis +85°C |
Pin | Symbol | Beschreibung | Funktion |
---|---|---|---|
1 | Q1 | Parallel data output (bit-1) | Ausgangspin #1 |
2 | Q2 | Parallel data output (bit-2) | Ausgangspin #2 |
3 | Q3 | Parallel data output (bit-3) | Ausgangspin #3 |
4 | Q4 | Parallel data output (bit-4) | Ausgangspin #4 |
5 | Q5 | Parallel data output (bit-5) | Ausgangspin #5 |
6 | Q6 | Parallel data output (bit-6) | Ausgangspin #6 |
7 | Q7 | Parallel data output (bit-7) | Ausgangspin #7 |
8 | GND | Ground | |
9 | Q7S (auch QH´) | Serial out | Serieller Ausgang ("Überlaufbit") welcher an DS eines weiteren Schieberegisters angeschlossen werden kann. Hier landen die Signaldaten, falls mehr als 8 Signale in das Register hineingeschoben werden. |
10 | MR (auch: CLEAR oder SRCLR) | Master Reclear (active low) |
Zurücksetzen des gesamten Bausteins. "active low" bedeutet hier, dass der Baustein zurückgesetzt wird, solange GND (LOW) anliegt. Bei normaler Verwendung sollte hier also 5V (HIGH) anliegen. |
11 | SHCP (auch: SRCLK) | Shift Register Clock Pin | Beim Flankenwechsel von LOW zu HIGH schiebt das Register das an DS anliegende Bit um eine Stelle weiter |
12 | STCP (auch: RCLK) | Storage Register Clock Pin | Beim Flankenwechsel von LOW zu HIGH wird der Inhalt des Schieberegisters in das Speicherregister (Ausgangsregister) übertragen. An den Pins Q0-Q7 liegt dann das entsprechende Signal an. |
13 | OE | Output Enable (active low) |
An- bzw. Abschalten der Ausgänge 0-7; "active low" bedeutet hier, dass die Ausgänge nur aktiviert sind, wenn hier GND (LOW) anliegt |
14 | DS (auch: SER) | Serial data input | Serieller Eingang |
15 | Q0 | Parallel data output (bit-0) | Ausgangspin #0 |
16 | Vcc | Stromversorgung | Anschluss von 5V |
Ein Schieberegister besteht genau genommen aus zwei Registern: das Schieberegister, in welches der Zustand
der einzelnen Ausgangspins seriell, also Bit für Bit, geschoben wird. Und das Ausgangsregister, in das
der Zustand des Schieberegisters auf ein Signal vom Mikrocontroller hin kopiert wird. Erst dann wird der
Zustand der ins Schieberegister geschickten Daten an den Ausgangspins sichtbar.
Die folgende Bilderserie soll beispielhaft zeigen, wie das 74HC595 im Einzelnen funktioniert:
Ausgangssituation: Das Schieberegister ist zurückgesetzt bzw. leer. An den Pins DS, SHCP und STCP liegt LOW an. | |
Es liegt nun am Pin-Eingang DS ein HIGH-Signal an. Am Register selbst ändert sich noch nichts. | |
Durch ändern der Flanke von SHCP von LOW auf HIGH wird nun der Zustand von DS in das Register hineingeschoben und steht an erster Stelle. (hier: eine binäre "1") | |
DS und SHCP werden wieder auf LOW gesetzt und der Registerinhalt bleibt darüber hinaus gespeichert. | |
Es liegt nun am Pin-Eingang DS ein HIGH-Signal an. Am Register selbst ändert sich noch nichts. | |
Durch ändern der Flanke von SHCP von LOW auf HIGH wird nun der Zustand von DS in das Register hineingeschoben, wobei die vorher besetzte Stelle um eine Position im Register weitergereicht wird. | |
DS und SHCP werden wieder auf LOW gesetzt und der Registerinhalt bleibt darüber hinaus gespeichert. | |
An DS liegt ein LOW-Signal an und am SHCP wird die Flanke von LOW auf HIGH gesetzt. Das LOW in DS (interpretiert als eine "0") wird ebenfalls in das Register geschoben, wobei alle vorher besetzte Stellen um eine Position im Register weitergereicht werden. | |
Nun wird die Flanke von STCP von LOW auf HIGH geändert und der gesamte Registerinhalt wird in das
Ausgaberegister kopiert, wobei die entsprechenden Signale nun an den zugehörigen Ausgängen anliegen.
Der Vorgang kann nun erneut beginnen. Zu beachten ist, dass der Zustand des Ausgaberegisters solange erhalten bleibt, bis sich die Flanke von STCP erneut von LOW zu HIGH ändert und der Inhalt überschrieben wird. |
Dieser erste Versuch soll einen vordefinierten Zustand im Schieberegister durch 8 LEDs anzeigen.
#define PIN_SHIFT 8 // connected to SHCP
#define PIN_STORE 9 // connected to STCP
#define PIN_DATA 10 // connected to DS
int ledPattern[8] = {1, 0, 1, 0, 0, 1, 1, 1};
void setup()
{
pinMode(PIN_STORE, OUTPUT);
pinMode(PIN_SHIFT, OUTPUT);
pinMode(PIN_DATA, OUTPUT);
for (int i=0; i<8; i++) {
// set shift pin to "wait"
digitalWrite(PIN_SHIFT, LOW);
// writing to data pin
digitalWrite(PIN_DATA, ledPattern[i]);
// rising slope -> shifting data in the register
digitalWrite(PIN_SHIFT, HIGH);
}
// write whole register to output
digitalWrite(PIN_STORE, HIGH);
}
void loop ()
{
}
Hier werden nacheinander alle 256 Bit-Positionen des Schieberegisters durchgespielt und mit 8 LEDs angezeigt.
Der Aufbau der Schaltung entspricht der mit "Ex.1"
#define PIN_SHIFT 8 // connected to SHCP
#define PIN_STORE 9 // connected to STCP
#define PIN_DATA 10 // connected to DS
byte count = 0;
// Binary count from 0-255:
// 1 = 000000001
// 2 = 000000010
// 3 = 000000011
// 4 = 000000100
// 5 = 000000101
// etc.
void setup()
{
pinMode(PIN_STORE, OUTPUT);
pinMode(PIN_SHIFT, OUTPUT);
pinMode(PIN_DATA, OUTPUT);
digitalWrite(PIN_STORE, LOW);
shiftOut(PIN_DATA, PIN_SHIFT, LSBFIRST, count);
digitalWrite(PIN_STORE, HIGH);
delay(2000);
}
void loop ()
{
digitalWrite(PIN_STORE, LOW);
shiftOut(PIN_DATA, PIN_SHIFT, LSBFIRST, count);
digitalWrite(PIN_STORE, HIGH);
delay(100);
count ++;
}
Wie schon in diesem Experiment wird eine 7-Segment-Anzeige angesteuert,
jedoch werden die kombinierten Zustände (hier angezeigt als Ziffern) durch das Schieberegister erzeugt.
Da ja jede Einzel-LED der 7-Segment-Anzeige einen bestimmten aktivierten Bit-Zustand imt Register darstellt,
mussten für die Anzeige der Zahlen zunächst ermittelt werden, welches Bit im Register welche Einzel-LED
aufleuchten lässt. In der unten gezeigten Darstellung sind die einzelnen LEDs mit den entsprechenden
Bitpositionen (0, 1, 2, 4...) beschriftet.
Vorsicht: Es wurde hier zur Vereinfachung nur ein Vorwiderstand an der Kathode verwendet. Im Betrieb sollten für die Einzel-LEDs jeweils ein Vorwiderstand geschaltet werden!
#define PIN_SHIFT 8 // connected to SHCP
#define PIN_STORE 9 // connected to STCP
#define PIN_DATA 10 // connected to DS
const byte numbers[10] = {
0b10111110, // 0
0b00110000, // 1
0b10101101, // 2
0b10111001, // 3
0b00110011, // 4
0b10011011, // 5
0b10011111, // 6
0b10110000, // 7
0b10111111, // 8
0b10111011 // 9
};
void setup()
{
pinMode(PIN_STORE, OUTPUT);
pinMode(PIN_SHIFT, OUTPUT);
pinMode(PIN_DATA, OUTPUT);
}
void loop ()
{
for(byte i=0; i<sizeof(numbers); i++) {
digitalWrite(PIN_STORE, LOW);
shiftOut(PIN_DATA, PIN_SHIFT, LSBFIRST, numbers[i]);
digitalWrite(PIN_STORE, HIGH);
delay(1000);
}
}
zurück