Go Down

Topic: Flipflop Display mit Nano UDN ULN Push-Pull mit D-flipflop Register (Read 277 times) previous topic - next topic

bmbbsr

Guten Tag Ich bin Neu aber nicht ganz "Taufrisch" >50

Persönlich habe ich schon einiges Bewerkstelligt In sachen Display LED Matrix

Nun ist mir eien Kontrastreiche Flipdot Matrix mit 6 Ziffern von je 5 Zeilen und 3 Spalten in die Finger gekommen
dies ist ein echtes TTL Grab 21 74HC574  Je Ziffer sind ULN2803 und UDN 2982 als pushpull Treiber Verbaut

ICH Habe eine Eagle Schaltplan erstellt

und mit einem Nano die ersten Schritte unternommen


Code: [Select]
void toggleEnable(){
  delay(5);
  mcp.digitalWrite(7, HIGH); // ON Enable alle 3 74HC138
  delay(5);
  mcp.digitalWrite(7, LOW); // OFF Disable alle 3 74HC138
  }

void setZiffer(int ziffer){
  if (ziffer & 1)mcp.digitalWrite(0, HIGH);else mcp.digitalWrite(0, LOW);
  if (ziffer & 2)mcp.digitalWrite(1, HIGH);else mcp.digitalWrite(1, LOW);
  if (ziffer & 4)mcp.digitalWrite(2, HIGH);else mcp.digitalWrite(2, LOW);
  delay(5);
  mcp.digitalWrite(3, LOW); // aktiviere !E1 vom 74HC138 der die ziffern Auswaehlt
  toggleEnable();
  mcp.digitalWrite(3, HIGH); // deaktiviere !E1 vom 74HC138 der die ziffern Auswaehlt
  }


ES Fehlt das Verständniss über die Schaltreienfolge der Signale

Bitte um Mithilfe
Danke

DrDiettrich

Ein sehr interessantes Puzzle :-)

Mir ist vor allem nicht klar, ob der MCP auf dem Board sitzt (und bleibt), und was der Nano ansteuert (mcp.???). Ich sehe eine gewisse Chance, das I2C Protokoll des MCP auszuknobeln.

Die Chips muß ich mir erst noch anschauen, mir kommen nur die 74 und 138 aus alten Zeiten bekannt vor.

bmbbsr

Der MCP ist die Porterweiterung des NANO
und sitzt nicht auf dem Display

Für Mich Als Metall er und nicht Logikfest wäre  ein Stromlauf Schema durch die Spule beim Setzen und Rücksetzen das wichtigste das ist mir nicht klar

Dann sollte das kein Problem sein
Das Display setzt ja in weniger als 1sekunde alle Dots
Zu mindestens konnte ich das beim auffahren eines Fahrzeugs auf Die LKW Waage beobachten.


Ich bedanke mich schonmal für ein ersten Post welches das projekt im Forum Hier anerkennt


DrDiettrich

Sehe ich das richtig, daß die Segmente nur gekippt werden müssen, und dann so bleiben?

Was ich nicht verstehe: wenn die 74HC574 Tristate-Ausgänge haben, macht für mich das Abschalten der Ausgänge keinen Sinn. Hängen da noch pull-up/down Widerstände dran?

uwefed

Die Dislay-Punkte werden von Spulen angesteuert und ich nehme an es Braucht positive und negative Impulse um ein Pixel des Displays zu komutieren. Danach bleibt das Pixel so wie es ist.

Die UDN und ULN mit den ganzen Dioden sind eine 5x3 H-Spar-Brücke, nsonsten bräuchte es 1 H-Brücke pro Pixel.

Da die Daten vom MCP auf eine 16 Bit Bus gehen sind die 574 zum Zwischenspeichern des Daten des Datenbusses, Die 138 zum erzeugen des Enable Signals (es wird immer nur 1e Ziffer angesteuert) und die anderen TTL ICs zum generieren der notwendigen Signale für die anderen iCs.

Grüße Uwe

DrDiettrich

Was soll dann die Ansteuerung der ULN/UDN mit Tristate-Ausgängen? Was passiert mit ihren Ausgängen, wenn die Eingänge hochohmig gemacht werden? Werden dann die Ausgänge auch (sicher?) abgeschaltet?

bmbbsr

So weitergehts nun die Enable routinen und die DOT Codierung

Code: [Select]

const int CLK_TRIG_EN = 8; // LOW Activ
const int CLK_TRIG = 9; //Puls = Low  dann High 


// die Zeichenkodierung
uint8_t hex2dot[11][5] = { {0x7, 0x5, 0x5, 0x5, 0x7}, // 0
        {0x2, 0x2, 0x2, 0x2, 0x2}, // 1 
        {0x7, 0x1, 0x7, 0x4, 0x7}, // 2 
        {0x7, 0x1, 0x3, 0x1, 0x7}, // 3 
        {0x5, 0x5, 0x7, 0x1, 0x1}, // 4 
        {0x7, 0x5, 0x7, 0x1, 0x7}, // 5 
        {0x4, 0x4, 0x7, 0x5, 0x7}, // 6 
        {0x7, 0x5, 0x1, 0x1, 0x1}, // 7 
        {0x7, 0x5, 0x7, 0x5, 0x7}, // 8 
        {0x7, 0x5, 0x7, 0x1, 0x1}, // 9 
        {0x0, 0x7, 0x0, 0x7, 0x0}, // = 
        };

DrDiettrich

Die OR Gatter (IC1) verhindern, daß die Treiber IC7 (UDN: high) und IC12 (ULN: low) gegeneinander arbeiten. Das gilt einmal für die Spalten (Q1..Q3 von IC3/5) und nochmal für die Zeilen (Q4..Q8 von IC3/4). Zum Löschen von Segmenten müssen die Zeilen mit SetZeile in IC4 eingetragen werden, und die Spalte sowie Nullen für die Zeilen mit SetZiffer in IC3. Zum Setzen die Spalte mit SetSpalte in IC5, die Zeilen sowie Nullen für die Spalten mit SetZiffer in IC3.

Wie die Impulse mit IC10/11 erzeugt werden, wäre noch auszuknobeln.

bmbbsr

und weiter im Takt mit der Ziffer Zeilen Spalten setung in die IC

Code: [Select]
void setze_ziffer(int ziffer, int wert){
  if (ziffer > 0x07) return;
  if (ziffer & 1)mcp.digitalWrite(0, HIGH);else mcp.digitalWrite(0, LOW);
  if (ziffer & 2)mcp.digitalWrite(1, HIGH);else mcp.digitalWrite(1, LOW);
  if (ziffer & 4)mcp.digitalWrite(2, HIGH);else mcp.digitalWrite(2, LOW);

  for (int z=0; z<5; z++) {
    if (z == 0 )mcp.digitalWrite(8, HIGH);else mcp.digitalWrite(8, LOW);
    if (z == 1 )mcp.digitalWrite(9, HIGH);else mcp.digitalWrite(9, LOW);
    if (z == 2 )mcp.digitalWrite(10, HIGH);else mcp.digitalWrite(10, LOW);
    if (z == 3 )mcp.digitalWrite(11, HIGH);else mcp.digitalWrite(11, LOW);
    if (z == 4 )mcp.digitalWrite(12, HIGH);else mcp.digitalWrite(12, LOW);
    uint8_t spaltewert = hex2dot[wert][z];
    if (spaltenwert > 0x07) return;
    if (spaltewert & 1)mcp.digitalWrite(15, HIGH);else mcp.digitalWrite(15, LOW);
    if (spaltewert & 2)mcp.digitalWrite(14, HIGH);else mcp.digitalWrite(14, LOW);
    if (spaltewert & 4)mcp.digitalWrite(13, HIGH);else mcp.digitalWrite(13, LOW);

  }
}

DrDiettrich

Ich würde die Ports so verwenden, wie sie sind. Es ist ziemlich umständlich und unnötig, sie bitweise zu ändern. Hilfreich wären dafür Funktionen bzw. Methoden
Code: [Select]
void SetZeile(byte z);
void SetSpalte(byte s);
void SetZiffer(byte z; byte s);

Go Up