Ich versuche, eine Schaltung zu bauen, die drei 4094 verwendet, um mir genügend Ausgänge zu geben, um eine Reihe von LEDs anzusteuern. Ich habe in der Vergangenheit schon einige ähnliche Schaltungen mit demselben Code und Schaltplan gebaut, aber aus irgendeinem Grund habe ich diesmal Probleme bei der Steuerung der Schieberegister.
Der erste 4094 ist über die folgenden Ausgänge mit meinem Arduino UNO verbunden:
CD4094_CLOCK - Digital 2
CD4094_DATA - Digital 3
CD4094_STROBE - Digital 4
Zu Testzwecken habe ich die 4094 OEs an +5 V angeschlossen, aber sie werden in Wirklichkeit an einem PWM-Pin liegen. Ich habe alle 4094 STROBE
und CLOCK
Eingänge angeschlossen, wie ich es zuvor auch getan habe.
Ich verwende das folgende Programm, aber egal welchen Wert ich shiftOut
an den 4094 stelle, die meisten Ausgänge bleiben hoch:
// CD4094 Constants
#define CD4094_CLOCK 2
#define CD4094_DATA 3
#define CD4094_STROBE 4
//#define CD4094_OE 3
char Display1 = 0, Display2 = 0, Display3 = 0;
void setup() {
pinMode(CD4094_CLOCK, OUTPUT);
pinMode(CD4094_STROBE, OUTPUT);
pinMode(CD4094_DATA, OUTPUT);
//pinMode(CD4094_OE, OUTPUT);
}
void loop() {
Display1 = 63;
Display2 = 6;
Display3 = 91;
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display3);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display2);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display1);
digitalWrite(CD4094_STROBE, HIGH);
digitalWrite(CD4094_STROBE, LOW);
delay(3000);
Display1 = 0;
Display2 = 0;
Display3 = 0;
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display3);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display2);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display1);
digitalWrite(CD4094_STROBE, HIGH);
digitalWrite(CD4094_STROBE, LOW);
delay(3000);
}
Hier ist auch ein Bild von meinem Steckbrett, falls es jemandem helfen könnte?
Hat jemand irgendwelche Vorschläge, wie ich diese Art von Problem debuggen kann? Die einzigen Werkzeuge, die ich habe, sind mein Multimeter und Arduino-Boards. Gibt es irgendein Problem mit meinem Code?
Das Strobe-Signal ist als Ausgang konfiguriert, aber nie als hoch initialisiert. Der von Ihnen bereitgestellte Code schaltet ihn nur für einen Moment hoch und hält ihn dann während der Übertragung niedrig. Wenn ich das Datenblatt richtig verstehe, muss der Strobe während Ihrer Datenübertragung hoch gehalten werden
shiftOut
und ich die erwarteten Ergebnisse erhalte :)// CD4094 Constants
#define CD4094_CLOCK 18
#define CD4094_DATA 19
#define CD4094_STROBE 17
#define CD4094_OE 16
char Display1 = 1, Display2 = 2, Display3 = 3;
void setup() {
pinMode(CD4094_CLOCK, OUTPUT);
pinMode(CD4094_STROBE, OUTPUT);
pinMode(CD4094_DATA, OUTPUT);
//pinMode(CD4094_OE, OUTPUT);
}
void loop() {
Display1 = 63, 6, 91, 79, 102, 109, 125, 7, 127, 111;
Display2 = 63, 6, 91, 79, 102, 109, 125, 7, 127, 111;
Display3 = 63, 6, 91, 79, 102, 109, 125, 7, 127, 111;
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display3);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display2);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display1);
digitalWrite(CD4094_STROBE, HIGH);
digitalWrite(CD4094_STROBE, LOW);
delay(3000);
Display1 = 0;
Display2 = 0;
Display3 = 0;
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display3);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display2);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display1);
digitalWrite(CD4094_STROBE, HIGH);
digitalWrite(CD4094_STROBE, LOW);
delay(30);
}
Gerben
QSn
) eines Schieberegisters nicht mit dem Dateneingang (D
) des nächsten Schieberegisters verbundenGerben
edcs
CLOCK
ist anD0
,DATA
ist anD1
undSTROBE
ist anD2
- danke, dass Sie auch darauf hingewiesen haben. Ich habe meine Konstanten entsprechend aktualisiert, jetzt, wenn ich das Programm ausführe, bleiben alle meine 4094-Ausgänge hoch.Gerben