CD4094BE Arduino-Probleme

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 STROBEund CLOCKEingänge angeschlossen, wie ich es zuvor auch getan habe.

Ich verwende das folgende Programm, aber egal welchen Wert ich shiftOutan 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?

Brotschneidebrett

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?

Sie haben den Datenausgang ( QSn) eines Schieberegisters nicht mit dem Dateneingang ( D) des nächsten Schieberegisters verbunden
Es sieht auch so aus, als ob Pin 2 mit dem Data-In verbunden ist, während der Code besagt, dass es Pin 3 sein sollte.
QS-Anschlüsse vergessen - danke! Ich habe die Ausgänge für den ersten 4094 jetzt verschoben, CLOCKist an D0, DATAist an D1und STROBEist an D2- 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.
Könnten Sie Ihre Frage mit diesen neuen Daten und einem neuen Bild aktualisieren? Ich kann nicht ganz nachvollziehen, was du geändert hast. Versuchen Sie auch, D0 und D1 zu vermeiden, da sie für Serial/UART verwendet werden, und ich denke, es gibt Pull-ups auf dem Uno-Board.

Antworten (2)

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

Danke für die Lösung des Problems! Ich habe meinen Code so geändert, dass Strobe währenddessen hoch ist shiftOutund 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);
}