Schieberegister

Früher oder später steht man bei der Entwicklung von Mikrocontroller-Schaltungen immer wieder vor dem Problem, dass man zu wenige I/O Pins hat. Abhilfe können dann zum Beispiel I2C Portexpander wie der PCF8574 oder sog. Schieberegister schaffen. Im Gegensatz zu den I2C Portexpandern sind letztere meist einfacher handzuhaben und zudem weniger störanfällig. Mit diesem Artikel möchten wir Ihnen zeigen, wie Sie solche Schieberegister einfach verwenden können.

Schieberegister haben gegenüber I2C Portexpandern leider auch einen Nachteil: man kann nicht einfach zwischen Eingangs- und Ausgangserweiterungen umschalten. Statt dessen gibt es, je nach gewünschtem Verwendungszweck unterschiedliche Typen. Sehr weit verbreitet sind zum Beispiel die Schieberegister Typen 74HC(T)595 (8fach Ausgang) und 74HC(T)594 (8fach Eingang).

Schieberegister

Im nebenstehenden Bild sehen Sie das Schaltbild einer Ausgangs-Erweiterung. Auf der linken Seite des Schaltbildes sehen Sie die verschiedenen Eingangs-Pins des Schieberegisters:

SER Seriel-IN
SRCLK Clock
SRCLR Reset
RCLK Latch
G  Output Enabled
QA-QH Ausgangs-Pins
QH
 Serial-OUT

Um nun die Ausgänge steuern zu können, muss zunächst der Latch Pin auf LOW gesetzt werden, um dem Schieberegister anzuzeigen, dass nun Daten folgen. Diese werden Bit für Bit an den Serial-IN Pin angelegt und mit einem LOW-HIGH Wechsel am Clock Pin in einen Zwischenspeicher übernommen. Dabei werden bei jedem Clock-Impuls die Werte um einen Ausgang weiter geschoben (daher der Name). Nehmen wir an, wir haben beim ersten Clock-Impuls HIGH an Serial-IN angelegt. Dann wird dieses in den Zwischenspeicher für Ausgang 1 abgelegt. Nun legen wir LOW an Serial-IN und erzeugen einen neuen Clock-Impuls. Dadurch wird der Zwischenspeicher für Ausgang 1 zunächst in den Zwischenspeicher für Ausgang 2 (dieser wird HIGH) geschoben und dann der neue Wert von Serial-In (LOW) in den Zwischenspeicher für Ausgang 1 abgelegt. So werden nach und nach alle 8 Bits in den Zwischenspeicher übernommen. Abschließend werden die Werte des Zwischenspeichers an die Ausgangs-Pins durch einen Wechsel des Latch-Pins nach HIGH übernommen.

Innerhalb der Arduino-Entwicklungsumgebung lässt sich dies alles, Dank der dort vorhandenen Funktion shiftOut(), mit wenigen Programmzeilen umsetzen:

  // Pins für Schieberegister definieren
  int latchPin = 90;  
  int resetPin = 91;  
  int clockPin = 92;  
  int dataPin = 93;   
 
void setup() {
  // Pins für Schieberegister konfigurieren
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(resetPin, OUTPUT);
  digitalWrite(resetPin, HIGH);
}

void loop() {
  // Schieberegister auf Schreiben vorbereiten
  digitalWrite(latchPin, LOW);

  // 8 Bit in Schieberegister schreiben  
  shiftOut(dataPin, clockPin, LSBFIRST, 0b00001111);
 
  // geschriebene Werte übernehmen
  digitalWrite(latchPin, HIGH);
 
  // eine Sekunde warten
  delay(1000);
 
  // anderes Bitmuster ausgeben
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, 0b10101010);
  digitalWrite(latchPin, HIGH);
 
   // erneut eine Sekunde warten
  delay(1000);
}

Das Beispiel wurde für einen DigiX geschrieben, bei dem das Schieberegister an den Pins 90 bis 93 angeschlossen wurde. Der Code schaltet die Ausgänge im Sekunden-Rythmus zwischen zwei verschiedenen Bit-Mustern um.

Der Zwischenspeicher kann durch den Reset-Pin komplett geleert werden. Dazu wird dieser auf LOW gelegt. Zusätzlich läßt sich das gesamte Schieberegister durch ein HIGH am Output-Enabled Pin deaktiviert werden. Die Ausgänge gehen dabei in einen hochohmigen Zustand.

verkettete SchieberegisterÜber den Serial-OUT Pin können mehrere Schieberegister hintereiannder geschalten werden. Serial-Out des ersten Schieberegisters wird dabei mit Serial-IN des zweiten verbunden usw.. Die restlichen Steuer-Pins (Clock, Latch, Reset) werden parallel an alle Bausteine angeschlossen.

Im nebenstehenden Bild sehen Sie 4 hintereinander geschaltete Schieberegister, die es ermöglichen, mit nur 4 Steuer-Pins insgesamt 32 Ausgänge zu schalten.

Platine

Wir haben auch diese Schaltung in einer nur 5 x 5 cm großen Platine umgesetzt. Den kompletten Bausatz finden Sie in unserem Online-Shop.