In der einfachsten Ausführung benötigt das Schieberegister drei Signale von außerhalb, um richtig zu
funktionieren. Es sind die Anschlüsse SHCP, DS und STCP. Mit ihnen ist es möglich, gewünschte Bit-Kombination in das
Register zu schreiben und sie dann sichtbar zu machen. Die Voraussetzung dafür ist, dass der vierte Anschluss, OE Enable
(Pin 13), mit Masse verbunden ist. Dieser Eingang gibt die Ausgänge des Bausteins frei. In dem Versuch wird dieser Eingang
mit einem PWM-Signal verbunden. Mit dem Signal wird dann die Helligkeit der Leuchtdioden, die an die Ausgänge des
Schieberegisters angeschlossen sind, reguliert. Die Pin-Belegung von 74HC595:
Anschlusse 74HC595
In dem Beispiel werden zwei Schieberegister eingesetzt. Insgesamt kann man so 16 Dioden ansteuern. Beide
Register sind in Reihe geschaltet. Das bedeutet, dass der Ausgang SQH‘ (Pin 9) des ersten Registers mit dem Eingang DS
(Pin 14) des zweiten Registers verbunden ist. Bei der Konstellation ist zu beachten, dass beim Laden von weiteren Daten in
das erste Schieberegister, die alten Daten automatisch in das zweite Register verschoben werden. An die Schaltung könnten
problemlos weitere Schieberegister angeschlossen werden.
Die Versorgungsspannung eines Schieberegisters (hier SN74HC595) darf die Grenze von 6 VDC nicht übersteigen. Bei der
Berechnung der Widerstände soll darauf geachtet werden, dass die gesamte Leistung des SN74HC595 bei 500 mW liegt.
Schaltplan
Testschaltung
Programm
Die Steuerung und Datenübertragung wird vom Arduino verwaltet. Das Schreiben der Werte in die Schieberegister erfolgt im
Programm schrittweise. Zuerst geht SHCP auf Low, auf DS wird gewünschter Wert gelegt (0 oder 1), mit SHCP = HIGH wird der
Wert in das Register übernommen. Diese Programmschritte kann man mit dem Befehl ShiftOut() ersetzen.
Die Dioden werden im Laufe des Programms in unterschiedlichen Konstellationen ein- und ausgeschaltet. Dabei
wird dem PWM-Signal jedes Mal ein anderer Wert (HIGH-Anteil) zugewiesen. Dadurch leuchten die Dioden stets mit einer
anderen Helligkeit.
// ****************************************************************************
// Diodenspiele mit PWM
// ****************************************************************************
int SH_CP_Pin = 40; // 74HC595 Pin 11 Shift Clock
int ST_CP_Pin = 42; // 74HC595 Pin 12 Latch Clock
int DS_Pin = 44; // 74HC595 Pin 14 Data
int Enable_Pin = 8; // 74HC595 Pin 13 Enable (PWM)
int Bit_Nr, Pwm_Wert, i, j, k;
int Zufallszahl;
int Bit_Folge[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup() {
pinMode(ST_CP_Pin, OUTPUT);
pinMode(SH_CP_Pin, OUTPUT);
pinMode(DS_Pin, OUTPUT);
}
void Senden(int PWM) {
digitalWrite(ST_CP_Pin, LOW);
for (Bit_Nr=15; Bit_Nr > -1; Bit_Nr--) {
digitalWrite(SH_CP_Pin, LOW);
digitalWrite(DS_Pin, Bit_Folge[Bit_Nr]);
digitalWrite(SH_CP_Pin, HIGH);
}
digitalWrite(ST_CP_Pin, HIGH);
analogWrite(Enable_Pin, PWM);
}
void loop () {
// MUSTER 1 ***********************************************
for (i = 0; i < 15; i++) { Bit_Folge [i] = 1; }
for (j = 1; j < 2; j++) {
for (k = 255; k > 179; k--) {
Senden(k);
delay(30);
}
for (k = 180; k < 256; k++) {
Senden(k);
delay(30);
}
delay(600);
}
// MUSTER 2 ***********************************************
for (j = 0; j < 8; j++) {
for (i = 0; i < 15; i++) { Bit_Folge [i] = 0; };
k = 15 - j;
Bit_Folge [j] = 1;
Bit_Folge [k] = 1;
Pwm_Wert = j * 36;
Senden(Pwm_Wert);
delay(200);
}
delay (600);
// MUSTER 3 ***********************************************
for (i = 1; i < 11; i++) {
for (j = 0; j < 15; j++) { Bit_Folge [j] = 0; };
for (k = 0; k < 7; k++) {
Zufallszahl = random(15);
Bit_Folge [Zufallszahl] = 1;
}
Zufallszahl = random(8,15);
Pwm_Wert = 105 + (Zufallszahl * 10);
Senden(Pwm_Wert);
delay (600);
}
// MUSTER 4 ***********************************************
for (i = 1; i < 51; i++) {
for (j = 0; j < 15; j++) { Bit_Folge [j] = 0; };
Zufallszahl = random(15);
Bit_Folge [Zufallszahl] = 1;
Zufallszahl = random(8,15);
Pwm_Wert = 105 + (Zufallszahl * 10);
Senden(Pwm_Wert);
delay (100);
}
}