Schieberegister 74HC595

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.

Schieberegister 74HC595 als DIP-Baustein
Abb.: Schieberegister 74HC595 als DIP-Baustein

Spezifikationen

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

Anschlüsse des 74HC595

Anschlüsse des 74HC595
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

Funktionsweise des 74HC595

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 Ausgangssituation: Das Schieberegister ist zurückgesetzt bzw. leer. An den Pins DS, SHCP und STCP liegt LOW an.
Schritt #1 Es liegt nun am Pin-Eingang DS ein HIGH-Signal an. Am Register selbst ändert sich noch nichts.
Schritt #2 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")
Schritt #3 DS und SHCP werden wieder auf LOW gesetzt und der Registerinhalt bleibt darüber hinaus gespeichert.
Schritt #4 Es liegt nun am Pin-Eingang DS ein HIGH-Signal an. Am Register selbst ändert sich noch nichts.
Schritt #5 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.
Schritt #6 DS und SHCP werden wieder auf LOW gesetzt und der Registerinhalt bleibt darüber hinaus gespeichert.
Schritt #7 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.
Schritt #8 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.

Ex.1: Schieberegister mit 8 LEDs

Dieser erste Versuch soll einen vordefinierten Zustand im Schieberegister durch 8 LEDs anzeigen.

Verwendete Bauteile

Aufbau

Schaltplan
Aufbau der Schaltung
Abb.: Aufbau der Schaltung
Resultat mit dem Aufbau am Breadboard
Abb.: Resultat mit dem Aufbau am Breadboard

Sketch

#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 ()
{
}

Ex.2: Binärzähler

Hier werden nacheinander alle 256 Bit-Positionen des Schieberegisters durchgespielt und mit 8 LEDs angezeigt.
Der Aufbau der Schaltung entspricht der mit "Ex.1"

Video: Live-Demonstration des Binärzählers

Sketch

#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 ++;
}

Ex.3: 7-Segment-LED-Anzeige

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.

Bitpositionen auf der 7-Segment-Anzeige
Abb.: Bitpositionen auf der 7-Segment-Anzeige

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!

Aufbau der Schaltung
Abb.: Aufbau der Schaltung
Resultat mit dem Aufbau am Breadboard
Abb.: Resultat mit dem Aufbau am Breadboard

Sketch

#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