Ein Schieberegister ist eine logische Schaltung, die mehrstellige binäre Signale taktgesteuert aufnehmen, speichern und wieder abgeben kann. Schieberegister ermöglichen die Transformation serieller Daten in parallele Daten und umgekehrt. Sie bestehen im Grunde aus hintereinander geschalteten D- oder JK-FlipFlops. Die Takteingänge aller Stufen werden zusammengeschaltet und über einen gemeinsamen Takt versorgt.
Da ein Flip-Flop nur ein Bit speichern kann, müssen je nach Anwendung mehrere Flip-Flops zu einem Schieberegister zusammengeschaltet werden. Bei dem weit verbreiteten IC vom Typ 74HC595 beispielsweise sind 8 FlipFlops integriert, so kann man mit lediglich 3 Arduino-Pins 8 Ausgangspins ansteuern.
Die Funktionsweise eines Schieberegisters kann man sich wie in obiger Abbildung vorstellen: Ein serieller Datenstrom wird über eine Datenleitung an den Daten-Pin DS des Bausteins übertragen. Solange das ShiftClock-Pin (SHCP) auf Low steht passiert gar nichts. Erst wenn ein Pegelwechsel von LOW nach HIGH am ShiftClock-Pin erfolgt, wird der Zustand der am DS-Pin anliegt in den Zwischenspeicher geschoben.
Dort verbleiben die seriell eingelesenen Daten solange, bis über ein weiteres Signal am sogenannten Storage Register Clock-Pin (SRCP) die Daten im Ausgangsregister Q0-Q7 ausgegeben werden.
Es handelt sich somit um zwei separierte Register deren Datenströme kontrolliert Über die Pegelwechsel von LOW nach HIGH an den beiden Steuer-Pins ShiftClock-Pin (SHCP) und Storage Register Clock-Pin (SRCP) zusammen gefügt werden können.
Das folgende Beispiel-Programm zeigt wie der Baustein vom prinzip her eingesetzt werden kann.
//------------------------------
// Schiebregister Test
//------------------------------
int shiftPin = 4; //SH_CP_PIN
int storePin = 2; //ST_CP_PIN
int dataPin = 7; //DS_PIN
// Dieses Muster soll ausgegeben werden
int muster[8] = {1,1,1,1,1,1,0,0};
void setup() {
pinMode(storePin, OUTPUT);
pinMode(shiftPin, OUTPUT);
pinMode(dataPin, OUTPUT);
digitalWrite(storePin, LOW); // storePin sicherheitshalber auf LOW
for (int i=0; i <= 8; i++) {
digitalWrite(shiftPin, LOW);
digitalWrite(dataPin, muster[i]);
digitalWrite(shiftPin, HIGH);
} // end for
// wenn alle Daten übertragen, auf Ausgabe schalten
digitalWrite(storePin, HIGH);
}
void loop () {
}
Es gibt die Möglichkeit mehrere Beisteine parallel zu betreiben und dadurch mehr als 8 Bit Ausgaben zu ermöglichen. Dazu gibt es einen speziellen "Überlauf-Pin Q7S". Über diesen Pin wird der serielle Datenstrom von Baustein zu Baustein weiter geleitet. Das Signal wird nach wie vor an den ersten Baustein angelegt... und dann über den Überlauf-Pin von Baustein zu Baustein kaskadiert. Die Signale für die Register-Steuerung müssen allerdings parallel an jeden Baustein geleget werden.
Als Beispiel für die Möglichkeiten mehr als 8 Ausgänge zu steuern, habe ich eine Schaltung mit 3 IC 74595 entwickelt. Aufgebaut als Experimentierplattform für den Arduino und entsprechenden Anschlussmöglichkeiten auf einer Lochrasterplatine prototypisch umgesetzt.