Forum: Mikrocontroller und Digitale Elektronik Flipdot Display Projekt (Hilfe Logik Erbeten)


von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Guten Tag
Ich Bin Neu
Versuche mein Bestes ((wurde schon vor gewarnt hier Herrschen Raue 
Sitten,
bezüglich Anfragen korrekt Formulieren.

Sachverhalt: Das Display einer LKW Waage soll modifiziert werden.
Arduino Projekt 3 Ziffern 100-999 Anzeigen auf einem 
Landwirtschaftlichen Fahrzeug.

Ich habe Bereits Gemessen und einen Schaltplan versucht zu erstellen.

Daraus ergibt sich für mich ein Logik SCHEMA.

NUN habe ich Probleme beim Setzen der CP der 74HC138 und 74HC574

Und bitte Hier um Verständnis Hilfe

Frage : die 74HC138 Sind LOW Level wie schaltet dieser Baustein denn den 
74HC574 der Zeilensteuerung

Erkenntnis : -Es liegen alle Datenbits D0-7 auf allen 74HC574 an 21Stk
             -Die Adressen der 74HC138 Sind auch Kombiniert A0-A2
             -Alle Positiven E3 Enable (aktiv H) der 74HC138 sind 
Zusammen  Herausgeführt
             - Alle Enable2 Negiert 138er liegen auf GND
             - die E1 Negiert der 3 verbauten 138er sind herausgeführt
 DER Anschlussstecker Zeigt also die 8Datenbits der 74HC574
Die 3 Adressen der 74HC138
Je 74HC138 den E1 Negiert und den Gemeinsammen Enable der 138er

: Verschoben durch User
von Georg-G (Gast)


Lesenswert?

Dein Schema ist falsch. "Setzen" kann so nicht funktionieren. Es kommt 
zu einem Kurzschluss via N.

von Stephan H. (stephan-)


Lesenswert?

Für gewöhnlich zeichnet man Schaltpläne von links nach rechts so wie wir 
lesen. Nicht arabisch ...
Eingänge der IC nach links und Ausgänge rechts. Da tun einem ja die 
Augen weh.
Der 574 übernimmt mit steigender Flanke an CP die anliegenden daten von 
Dn an Qn sofern OE auf Low liegt.

Der 138 ist ein 3zu8 Decoder. E1 und2 müssen Low und E3 High sein. E1 
und E2 werden intern negiert.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Man zeichnet keine Leitungen durch ICs. Und man darf auch mal einen A3 
Rahmen verwenden, damit das alles nicht so extrem zusammengepreßt 
aussieht.

Schaltplan richtig zeichnen

Außerdem

https://www.mikrocontroller.net/articles/Eagle_im_Hobbybereich#Auswahl_des_Rasters

von Falk B. (falk)


Lesenswert?

@ Kurt S. (bmbbsr)

>Ich habe Bereits Gemessen und einen Schaltplan versucht zu erstellen.

Da stimmt einiges nicht. Soche Anzeigen steuern die Elemente in  einer 
Matrix an, um Leitungen und Treiber zu sparen. Die sehe ich in deiner 
Schaltung nicht.

>Frage : die 74HC138 Sind LOW Level

Diese IC sind 1 aus 8 Dekoder, sprich, einer der Ausgänge ist LOW, alle 
anderen HIGH. Normalerweise nimmt man sowas als Chip select Dekoder für 
Peripheriebausteine. Hier wird ein Speichertakt für Register erzeugt.

> wie schaltet dieser Baustein denn den
>74HC574 der Zeilensteuerung

> DER Anschlussstecker Zeigt also die 8Datenbits der 74HC574
>Die 3 Adressen der 74HC138
>Je 74HC138 den E1 Negiert und den Gemeinsammen Enable der 138er

Über die drei Adressen A,B,C und die Enable Eingänge kann genau EIN 
Ausgang ausgewählt werden, welche genau EIN Register mit einem Ladepuls 
versorgt.

Naja, ich hätte den Kram lieber mit einer Handvoll Schieberegister 
gebaut, weniger Leitungen und allemal schnell genug.

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

DANKE erst mal für den Input
Ich bin Werkzeugmacher
Nur Hobbyelektroniker
Für mich Persönlich bin ich SEHR weit gekommen denke ich

Aktuell versuch ich mal eine NANO an die Pins anzuschliessen und etwas 
zu Flippen wäre schon toll.
Angehängt habe ich die Beschaltung von einer Ziffer 5x3

Ein Labornetzteil zeigt mir hoffentlich ob ein Kurzschluss Besteht (1A)
ansonsten sind beim Manuellen Flippen 200mA am Netzteil zu sehen

HILFE für das Anlegen der signale wäre Hilfreich
Zuerst den DOT anwäglen und dann die Ziffer Freigeben

ODER erst die Ziffer Anwählen und dann die einzelnen Dots setzen

DANKE

von Falk B. (falk)


Lesenswert?

@ Kurt S. (bmbbsr)

>Nur Hobbyelektroniker
>Für mich Persönlich bin ich SEHR weit gekommen denke ich

Das kann schon sein.

>Aktuell versuch ich mal eine NANO an die Pins anzuschliessen und etwas
>zu Flippen wäre schon toll.

Kriegt man hin, denn die Schaltung ist ja schon fertig und funktionierte 
mal.

>Angehängt habe ich die Beschaltung von einer Ziffer 5x3

Arg unscharf. Außerdem sieht man auf so einem Photo keine VErbindungen.

>Ein Labornetzteil zeigt mir hoffentlich ob ein Kurzschluss Besteht (1A)
>ansonsten sind beim Manuellen Flippen 200mA am Netzteil zu sehen

Klingt OK.

>Zuerst den DOT anwäglen und dann die Ziffer Freigeben

Nein.


>ODER erst die Ziffer Anwählen und dann die einzelnen Dots setzen

Ja.


Wenn du das Ding mit einem Labornetzteil mit Strombegrenzung versorgst, 
sollte auch im Fehlerfall nix kaputt gehen.

Im Prinzip es nicht so schwer. Sowohl Spalten als auch Zeilen können per 
ULN2803 aktiv auf GND gelegt werden oder per UDN2982 auf VCC. Je ein ULN 
+ UDN sind zusammengeschaltet, das ist ein Push-Pull Treiber für Arme. 
Deine Ansteuerung muss nun sicher stellen, da0 niemals ULN + UDN an 
einer Leitung  gleichzeitig aktiv sind.

Du solltest den Schaltplan noch einmal sauber zeichnen, damit du für die 
Ansteuerung einen guten, klaren Überblick bekommst, was an welchen 
Register hängt.

von Kurt S. (bmbbsr)


Lesenswert?

Danke

Ich werde mir Heute mal eine MCP23017 besorgen und dann Damit die Nano 
Porterweiterung auf die 16Bits Auf schalten

Schaltung Neuzeichnen braucht zeit für das im ersten Beitrag habe ich 
10Tage und 1Blockbatrie verbraten .

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

NEUER SCHALTPLAN

Anbei ein Neuer Plan mit den 5x3 Dots Je Ziffer

ES Haben sich Neue Erkenntnisse ergeben So dass die Zeilensteuerung und
Spaltensteuerung durch die 74HC138 nun mit der CLK der beiden 47HV74 
verbunden sind!
Dies hat sicherlich Auswirkungen

GESUCHT IST:
Schaltablauf zum Setzen von einzelne DOTS
und Rücksetzen des gleichen BZW Löschen des kompletten Displays.

Noch mal zum Verständnis es sollen nur 3 Ziffern angezeigt werden
Zahlen 100-999

Bitte um Verständnis Hilfe
Danke

: Bearbeitet durch User
von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Wenn Ich mir die Logicliste des 74HC138 Anschaue denke ich bekomme ich 
irgendwie Probleme denn ich sollte ja Ausgang 7 zum schalten benutzen
Zusammen mit einer Ziffer
ODER mach ich da ein Denkfehler da die 74HC574 das Speichern

Also Zuerst die Ziffer anwählen.
1
void toggleEnable(){
2
  delay(5);
3
  mcp.digitalWrite(7, HIGH); // ON Enable alle 3 74HC138 
4
  delay(5);
5
  mcp.digitalWrite(7, LOW); // OFF Disable alle 3 74HC138 
6
  }
7
8
void setZiffer(int ziffer){
9
  if (ziffer & 1)mcp.digitalWrite(0, HIGH);else mcp.digitalWrite(0, LOW);
10
  if (ziffer & 2)mcp.digitalWrite(1, HIGH);else mcp.digitalWrite(1, LOW);
11
  if (ziffer & 4)mcp.digitalWrite(2, HIGH);else mcp.digitalWrite(2, LOW);
12
  delay(5);
13
  mcp.digitalWrite(3, LOW); // aktiviere !E1 vom 74HC138 der die ziffern Auswaehlt
14
  toggleEnable();
15
  mcp.digitalWrite(3, HIGH); // deaktiviere !E1 vom 74HC138 der die ziffern Auswaehlt
16
  }

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>ODER mach ich da ein Denkfehler da die 74HC574 das Speichern

Ja natürlich! Das ist ja der Witz an den Bausteinen!

Daten auf den Bus anlegen, Taktsignal für Register erzeugen, Daten 
werden gespeichert und erscheinen am Registerausgang.

Dein 2. Schaltplan ist schon deutlich besser, gut so. Aber es sind noch 
Fehler und Mängel drin.

GAnz falsch! Der Signalnale Spalte 1 erscheint vor deinem Register IC12 
und in der Relaismatrix! Das ist Unsinn! Eagle erlaubt sowas gar nicht, 
es sei denn man murkst.

Mach es richtig, du lernst dabei was Wichtiges. Der Name von Signalen 
wird mit dem Befehl LABEL sichtbar gemacht, das ist ABC unten rechts in 
der Menuleisten. Damit clickt  man ein Signal an und platziert den 
erscheinenden Namen auf dem Signal. Dann kann man den Namen mit NAME 
ändern.

Gib den Signalen in der Matrix sinnvolle Namen, z.B. Spalte1 etc. Ebenso 
dem Bus und den Steuersignalen der Register. Dann wird das auch was mit 
der Kommunikation im Forum.

Du mußt die Ziffer zeilenweise schalten. Da aber je nach Polarität die 
Relais/FlipDots ein anderes Zeilen Signal benötigen, mußt du jede Zeile 
2. Schalten

Zeile1 auf HIGH
Alle Spalten auf LOW, die LOW sein sollen
Alle Spalten auf Tristste (kein Treiber an den Spalten aktiv)
Zeile1 auf LOW
Alle Spalten auf HIGH, die HIGH sein sollen

Das Ganze für alle Zeilen mit den passenden Pausen von ein paar Dutzend 
Millisekunden.

Um das zu Erreichen, muss man die passenden Bitmuster auf den Datenbus 
legen und über die passenden Speicherpulse im Register speichern. Dabei 
muss man halt aufpassen, daß zwischendurch keine ungültigen Zustände 
entstehen und ULN und UDN am gleiche Signal gleichzeitig aktiv werden. 
Im einfachsten Fall schaltet man alle Treiber zwischendurch aus und 
stetzt immer nur die aktiven Treiberausgänge neu.

von Falk B. (falk)


Lesenswert?

Häng einfach mal die Eagle-Datei an, dann kann man dir deutlich 
einfacher zeigen, wie der Schaltplan aussehen sollte.

von Stephan (Gast)


Lesenswert?

Load Error 198 .....

duck und weg :-))

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Danke
Für die Überaus Freundlichen Hinweise
Die Datei hänge ich an.

Für mich wäre das Zusammenspiel der beiden unteren Register
mal interessant warum da die Zeilen und spalten getrennt wurden
Das ist ja wegen dem Rücksetzen DENKE ICH.

Mir ist der Stromfluss nicht ganz klar.

der UDN bringt die Plus der ULN die Minus
Da unten 2 74hc574 Verbaut sind denke ich das dies mit der Zeilen 
Spaltensteuerung zu tun haben wird

KANN Jemand mal bitte den Stromfluss zum Rücksetzen verdeutlichen.

Ich habe Ja die Polung im Schaltplan markiert um Auf und Zu klappen der 
Flipdots zu Realisieren.

Danke

Ich hoffe Das ich das mit meinem Verständniss von der Materie 
Hinbekomme.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

So, hier mal der veredelte Schaltplan ;-)

Und damit wird die Funktion auch sonnenklar!

Es gibt pro Ziffer 3 Register, welche zwei 8 Bit-Treiber ansteuern. IC12 
wird über 2 getrennte Register angesteuert, um Zeilen und Spalten 
getrennt zu kontrollieren. IC7 wird 1:1 von IC3 gesteuert. IC1 ist eine 
Verriegelung der Register IC4 und IC5, damit wird ein Kurzschluß 
verhindert, falls die Software falsche Steuerdaten in die Register 
schreibt. Damit ist die Ansteuerung idiotensicher ;-)

IC2, IC8 und IC9 erzeugen die Speichertakte für die jeweiligen Register. 
Der Speicherpuls wird generiert, indem man den jeweiligen Ausgang über 
die Eingangsbits selektiert, der geht dann auf LOW. Beim Deselektieren 
geht er wieder auf HIGH, mit dieser steigenden Flanke werden die Daten 
in den Registern bzw. FlipFlops gespeichert.

Der Puls zum Kippen der FlipDots wird mit IC10 erzeugt. Da hat man wohl 
auch nicht so recht der Software vertraut ;-) Um IC10 zur Pulserzeugung 
zu animieren, muß man erstmal dessen Reset freigeben (low active!) Das 
erreicht man durch Laden einer 0 in IC11A. Sprich, an D0 eine 0 anlegen 
und den Speicherpuls CLK_TRIG_EN generieren. Das muss nur einmalig 
erfolgen. Den eigentlichen Puls löst man aus, indem man in IC11B erst 
eine 0 und dann eine 1 lädt, das geschieht über D1 und CLK_TRIG.

Tja, das war's eigentlich schon.

Muster für Zeile 1 HIGH und Spalten welche LOW sein sollen in IC3, IC4 
und IC5 laden
steigende Flanke am Signal TRIGGER erzeugen
Muster für Zeile 1 LOW und Spalten welche HIGH sein sollen in IC3, IC4 
und IC5 laden
steigende Flanke am Signal TRIGGER erzeugen

Das ganze für alle Zeilen wiederholen (Schleife)

Das alles für alle Ziffern wiederholen (Funktion)

Für die Anzeige deiner Ziffern brauchts du einen einfachen Zeichensatz 
mit 3x5 Bit / Ziffer. Die speicherst man einfach in einem Array. Mach 
dir nicht zuviel Mühe, die ungenutzen Bits in dem Array zu optimieren, 
das lohnt sich nicht. Nimm einfach 5 Bytes / Ziffer und fertig.
1
void setze_ziffer(int ziffer, int wert){
2
3
  for (z=0; z<5; z++) {
4
   ....
5
  }
6
}
7
8
uint8_t hex2dot[10][5] = { {0x7, 0x5, 0x5, 0x5, 0x7}, // 0
9
                         // weitere ergänzen  
10
                         };

GGf. kann man auch mit 3 Bytes / Ziffer auskommen, wenn man spaltenweise 
arbeitet. Das ist dann halt ggf. etwa mehr Dekodierarbeit bei der 
Umwandlung in die Steuerdaten.

Prüfe, ob die Busanschlüsse alle passen, da hab ich teilweise nur 
geraten.

Für eine gute, übersichtliche Software solltest du die verschieden 
Arbeitsschritte in sinnvolle Funktionen packen z.B.
1
// erzeuge Speicherpulse
2
3
void speichern(int ziffer, int funktion) {
4
5
  ziffer &= 0x7; // Begrenzung auf 0-7
6
  // ziffer 0 ist unbenutzt
7
  // Ziffer 7 und funktion 0 = CLK_TIG_EN
8
  // Ziffer 7 und funktion 1 = CLK_TIG
9
10
  switch(funktion) {
11
    case 0: GPA = 0x88 + Ziffer; break;    // IC9
12
    case 1: GPA = 0x40 + Ziffer; break;    // IC8
13
    case 2: GPA = 0x90 + Ziffer; break;    // IC2
14
  }
15
  _delay_us(10);
16
  GPA = 0xFF;  // alle inaktiv, steigende Flanke
17
}

: Bearbeitet durch User
von Kurt S. (bmbbsr)


Lesenswert?

Danke Viel Input

Es klappt leider momentan Nicht
Da Spielt noch der der !Y7 der IC8 und oder 9 mit Denke ich
eine weitere Sicherung der IC 11A und 11B

Aber Schonmal weitergekommen
1
const int CLK_TRIG_EN = 8; // LOW Activ 
2
const int CLK_TRIG = 9; //Puls = Low  dann High  
3
4
5
// die Zeichenkodierung 
6
uint8_t hex2dot[11][5] = { {0x7, 0x5, 0x5, 0x5, 0x7}, // 0
7
        {0x2, 0x2, 0x2, 0x2, 0x2}, // 1  
8
        {0x7, 0x1, 0x7, 0x4, 0x7}, // 2  
9
        {0x7, 0x1, 0x3, 0x1, 0x7}, // 3  
10
        {0x5, 0x5, 0x7, 0x1, 0x1}, // 4  
11
        {0x7, 0x5, 0x7, 0x1, 0x7}, // 5  
12
        {0x4, 0x4, 0x7, 0x5, 0x7}, // 6  
13
        {0x7, 0x5, 0x1, 0x1, 0x1}, // 7  
14
        {0x7, 0x5, 0x7, 0x5, 0x7}, // 8  
15
        {0x7, 0x5, 0x7, 0x1, 0x1}, // 9  
16
        {0x0, 0x7, 0x0, 0x7, 0x0}, // =  
17
        };

DOT Kodierung 5x3 Wem es Hilft

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>Es klappt leider momentan Nicht
>Da Spielt noch der der !Y7 der IC8 und oder 9 mit Denke ich
>eine weitere Sicherung der IC 11A und 11B

Siehe oben!

Prüfe erstmal deinen Schaltplan und die Verdrahtung. Zuerst prüfst du 
die CLK-Generatoren. Dort läßt du nacheinander die einzelnen Takte 
wackeln und mißt, ob das am richtigen Pin wackelt. Danach die Register. 
Dazu gibst du nacheinander die Werte 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 
0x02, 0x01, einzeln in jedem Register IC3, IC4 und IC5 aus. Dann mißt du 
jeweils, ob die Ausgänge den richtigen Wert haben. Das Gleiche mit IC11, 
dort gibst du bei beiden Ausgängen abwechselnd 1 und 0 aus.

Wenn das alles geprüft ist, geht's weiter.

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

Was soll man mit diesem Fragment anfangen?

von Kurt S. (bmbbsr)


Lesenswert?

Messung mach ich Montag

hier mal die Funktion

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);

  }
}

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>hier mal die Funktion

Sowas sollte man als C-Quelltext formatieren, dann ist es auch besser 
lesbar. Dafür braucht man die eckigen Klammern, siehe den Text unter 
"Antwort schreiben".
1
void setze_ziffer(int ziffer, int wert){
2
3
  if (ziffer > 0x07) return;
4
5
  if (ziffer & 1) mcp.digitalWrite(0, HIGH); else mcp.digitalWrite(0, LOW);
6
  if (ziffer & 2) mcp.digitalWrite(1, HIGH); else mcp.digitalWrite(1, LOW);
7
  if (ziffer & 4) mcp.digitalWrite(2, HIGH); else mcp.digitalWrite(2, LOW);
8
9
  for (int z=0; z<5; z++) {
10
    if (z == 0 ) mcp.digitalWrite(8, HIGH); else mcp.digitalWrite(8, LOW);
11
    if (z == 1 ) mcp.digitalWrite(9, HIGH); else mcp.digitalWrite(9, LOW);
12
    if (z == 2 ) mcp.digitalWrite(10, HIGH); else mcp.digitalWrite(10, LOW);
13
    if (z == 3 ) mcp.digitalWrite(11, HIGH); else mcp.digitalWrite(11, LOW);
14
    if (z == 4 ) mcp.digitalWrite(12, HIGH); else mcp.digitalWrite(12, LOW);
15
    
16
    uint8_t spaltewert = hex2dot[wert][z];
17
    if (spaltenwert > 0x07) return;  // das ist hier überflüssig
18
19
    if (spaltewert & 1) mcp.digitalWrite(15, HIGH); else mcp.digitalWrite(15, LOW);
20
    if (spaltewert & 2) mcp.digitalWrite(14, HIGH); else mcp.digitalWrite(14, LOW);
21
    if (spaltewert & 4) mcp.digitalWrite(13, HIGH); else mcp.digitalWrite(13, LOW);
22
23
  }
24
}


Im Ansatz sieht das OK aus, aber es fehlt nocht viel, u.a. die Pulse für 
die Register.

: Bearbeitet durch User
von Kurt S. (bmbbsr)


Lesenswert?

Das Wird So nicht Funktionieren mit Zeile und spalte in einer Funktion !
Denn es ist Ja ion Positiv und Negative Seite gesplitet mit den IC 7 UDN
und IC12 ULN

Wenn der UDN 2982 Eine Spalte auf Positiv Schaltet und der ULN eine 
Zeile auf Negativ  Wird der DOT gesetzt. / Sichtbar

Schaltet der UDN die Zeile auf Positiv und der ULN die Spalte auf 
Negativ
wird der Dot wieder Zugeklappt.

somit müssen unterschiedliche Bitmuster geladen werden für auf und zu

ca 30std Arbeit und noch kein Flip ;-)

DAS war mit der LED 130stk  7seg eigenbau schon lang mit dem max 7219 
erledigt


und ein ganz kurzer Quellcode

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>Das Wird So nicht Funktionieren mit Zeile und spalte in einer Funktion !

Mal langsam. Du bist da mal sicher nicht die Fachkraft, die das 
beurteilen kann.

>Denn es ist Ja ion Positiv und Negative Seite gesplitet mit den IC 7 UDN
>und IC12 ULN

Ja und?

>Wenn der UDN 2982 Eine Spalte auf Positiv Schaltet und der ULN eine
>Zeile auf Negativ  Wird der DOT gesetzt. / Sichtbar

Schon klar.

>Schaltet der UDN die Zeile auf Positiv und der ULN die Spalte auf
>Negativ
>wird der Dot wieder Zugeklappt.

Auch klar.

>somit müssen unterschiedliche Bitmuster geladen werden für auf und zu

Schrieb ich das nicht bereits?

Beitrag "Re: Flipdot Display Projekt (Hilfe Logik Erbeten)"

"Muster für Zeile 1 HIGH und Spalten welche LOW sein sollen in IC3, IC4
und IC5 laden
steigende Flanke am Signal TRIGGER erzeugen
Muster für Zeile 1 LOW und Spalten welche HIGH sein sollen in IC3, IC4
und IC5 laden
steigende Flanke am Signal TRIGGER erzeugen

Das ganze für alle Zeilen wiederholen (Schleife)

Das alles für alle Ziffern wiederholen (Funktion)"

>ca 30std Arbeit und noch kein Flip ;-)

Naja, nicht wirklich witzig. Aber wenn du so flatterhaft und 
unstrukturiert arbeitest und denkt wie du hier schreibst, erklärt das 
einiges. Wobei das für einen gelernten, deutschen Werkzeugmacher eher 
untypisch ist.

>DAS war mit der LED 130stk  7seg eigenbau schon lang mit dem max 7219
>erledigt

Das wäre hier auch schon passiert, wenn du strukturiert vorgegangen 
wärst.

Ich wiederhole mich.
Prüfe den Schaltplan
Prüfe, ob deine Ansteuerung die einzelnen Ausgänge der ICs richtig 
anspricht
Schreib die Funktion zu Ansteuerung der einzelne Ziffern.

Es gab ja nun mehr als genug Hinweise. Setze sie SYSTEMATISCH um.

>und ein ganz kurzer Quellcode

Wo?

von Falk B. (falk)


Lesenswert?

Zeig doch einfach mal deinen aktuellen Quelltext als Anhang.

von Falk B. (falk)


Lesenswert?

Noch ein Tip. Du nutzt ja den MCP23017 als Portexpander. Vorsicht! Wenn 
man da die Ausgänge mittels digitalWrite() einzeln setzt, kann das im 
Einzelfall dazu führen, daß die Takterzeugung für die Register falsche 
Takte für die falschen Register erzeugt! Das muss man vermeiden, indem 
man den Steuerbus möglichst in einem Rutsch beschreibt. Dafür gibt es 
die Methode writeGPIOAB(uint16_t), damit kann man auf einen Rutsch die 
16 Bit schreiben und die erscheinen dann auch auf einen Rutsch an den 
Ausgängen.

Außerdem ist die Funktion deutlich schneller, denn digitalWrite() liest 
zuerst den aktuellen Stand aus dem IC, setzt das Bit und schreibt die 
Daten zurück. Das spielt zwar für die langsame Mechanik keine Rolle, 
aber vielleicht für andere Dinge.

von Kurt S. (bmbbsr)


Lesenswert?

So auf Vielfachen Wunsch hier mal mein Murgs code.

Ich habe nun angefangen die 16bit zu Füllen und als ganzes auszugeben .
1
/********************************************************
2
**  Projekt Flipdot                                   **
3
********************************************************/
4
5
#include <Wire.h>
6
#include "Adafruit_MCP23017.h"
7
8
Adafruit_MCP23017 mcp;
9
// PINOUT MCP23017 to Display 
10
//int adr0 = 0;
11
//int adr1 = 1;
12
//int adr2 = 2;
13
//int udnNumber = 3; Positiv Power to be set 
14
//int ulnrow = 4;
15
//int ulncolum = 5;
16
//int cycleLED = 6;
17
//int enable =7;
18
//int spalteA = 8;
19
//int spalteB = 9;
20
//int spalteC = 10;
21
//int zeileA = 11;
22
//int zeileB = 12;
23
//int zeileC = 13;
24
//int zeileD = 14;
25
//int zeileE = 15;
26
27
const int CLK_TRIG_EN = 8; // LOW Activ 
28
const int CLK_TRIG = 9; //Puls = Low  dann High  
29
uint16_t mcpvalue;
30
31
// die Zeichenkodierung 
32
uint8_t hex2dot[11][5] = { {0x7, 0x5, 0x5, 0x5, 0x7}, // 0
33
        {0x2, 0x2, 0x2, 0x2, 0x2}, // 1  
34
        {0x7, 0x1, 0x7, 0x4, 0x7}, // 2  
35
        {0x7, 0x1, 0x3, 0x1, 0x7}, // 3  
36
        {0x5, 0x5, 0x7, 0x1, 0x1}, // 4  
37
        {0x7, 0x5, 0x7, 0x1, 0x7}, // 5  
38
        {0x4, 0x4, 0x7, 0x5, 0x7}, // 6  
39
        {0x7, 0x5, 0x1, 0x1, 0x1}, // 7  
40
        {0x7, 0x5, 0x7, 0x5, 0x7}, // 8  
41
        {0x7, 0x5, 0x7, 0x1, 0x1}, // 9  
42
        {0x0, 0x7, 0x0, 0x7, 0x0}, // =  
43
        };
44
45
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
46
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
47
48
void setup() {  
49
  mcp.begin();      // use default address 0
50
  for (int i=0;i<16;i++)
51
  {
52
    mcp.pinMode(i, OUTPUT);
53
  }
54
  // led blinken
55
  pinMode(LED_BUILTIN, OUTPUT);
56
  // startbedingung 
57
  mcp.digitalWrite(3, HIGH);  //74HC138 E1 Oben
58
  mcp.digitalWrite(4, HIGH);   // E1 Links
59
  mcp.digitalWrite(5, HIGH);   // E1 Rechts
60
  for (int i=7;i<16;i++)
61
  {
62
    mcp.digitalWrite(i, LOW); // init low 
63
  }
64
}
65
void setze_ziffer(int ziffer, int wert){
66
  if (ziffer > 0x07) return;
67
  if (ziffer & 1)mcp.digitalWrite(0, HIGH);else mcp.digitalWrite(0, LOW);
68
  if (ziffer & 2)mcp.digitalWrite(1, HIGH);else mcp.digitalWrite(1, LOW);
69
  if (ziffer & 4)mcp.digitalWrite(2, HIGH);else mcp.digitalWrite(2, LOW);
70
71
  for (int z=0; z<5; z++) {
72
    if (z == 0 )mcp.digitalWrite(8, HIGH);else mcp.digitalWrite(8, LOW);
73
    if (z == 1 )mcp.digitalWrite(9, HIGH);else mcp.digitalWrite(9, LOW);
74
    if (z == 2 )mcp.digitalWrite(10, HIGH);else mcp.digitalWrite(10, LOW);
75
    if (z == 3 )mcp.digitalWrite(11, HIGH);else mcp.digitalWrite(11, LOW);
76
    if (z == 4 )mcp.digitalWrite(12, HIGH);else mcp.digitalWrite(12, LOW);
77
    uint8_t spaltenwert = hex2dot[wert][z];
78
    if (spaltenwert > 0x07) return;
79
    if (spaltenwert & 1)mcp.digitalWrite(15, HIGH);else mcp.digitalWrite(15, LOW);
80
    if (spaltenwert & 2)mcp.digitalWrite(14, HIGH);else mcp.digitalWrite(14, LOW);
81
    if (spaltenwert & 4)mcp.digitalWrite(13, HIGH);else mcp.digitalWrite(13, LOW);
82
83
  }
84
}
85
void toggleEnable(){
86
  delay(5);
87
  mcp.digitalWrite(7, HIGH); // ON Enable alle 3 74HC138 
88
  delay(5);
89
  mcp.digitalWrite(7, LOW); // OFF Disable alle 3 74HC138 
90
  }
91
92
void setADR(int ziffer){
93
  if (ziffer & 1)mcp.digitalWrite(0, HIGH);else mcp.digitalWrite(0, LOW);
94
  if (ziffer & 2)mcp.digitalWrite(1, HIGH);else mcp.digitalWrite(1, LOW);
95
  if (ziffer & 4)mcp.digitalWrite(2, HIGH);else mcp.digitalWrite(2, LOW);
96
  delay(2);
97
  }
98
99
void restetdatabits(){
100
    for (int i=8;i<16;i++)
101
      {
102
         mcp.digitalWrite(i, LOW); // init low 
103
      }
104
  }
105
  
106
void startPulse(){
107
  restetdatabits();
108
  mcp.digitalWrite(CLK_TRIG_EN, LOW);
109
  }
110
111
void trigger(){
112
  mcp.digitalWrite(9, HIGH);
113
  delay(1);
114
  mcp.digitalWrite(9, LOW);
115
  delay(1);
116
  mcp.digitalWrite(9, HIGH);
117
  }
118
  
119
void clearFlipDotDisplay(){
120
121
  for (int number=0;number<7;number++){
122
    for (int row=0;row<5;row++){
123
      for (int col=0;col<3;col++){
124
        
125
      }
126
    }
127
  }
128
  
129
  }
130
  
131
void loop() {
132
  delay(1000);
133
  mcp.digitalWrite(8, HIGH);
134
  digitalWrite(LED_BUILTIN, HIGH);
135
  delay(5);
136
  trigger();
137
  delay(500);
138
139
  mcp.digitalWrite(8, LOW);
140
  digitalWrite(LED_BUILTIN, LOW);
141
  delay(5);
142
  trigger();
143
144
}

: Bearbeitet durch User
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@Kurt S. (bmbbsr)

>So auf Vielfachen Wunsch hier mal mein Murgs code.

Was hast du an dem Wort "Anhang" nicht verstanden?

>Ich habe nun angefangen die 16bit zu Füllen und als ganzes auszugeben

Ud wo ist das ersichtlich? In deinem Code sicher nicht. Mann O Mann, so 
langsam kommen mit arge Zeifel, ob du WIRKLICH der/das bist, was du 
vorgibst!

Ein paar Tips. Deine ganzen Definitionen ala
1
//int adr0 = 0;
2
//int adr1 = 1;

sind sinnlos. Man kann die als #define schreiben und nutzen, aber auch 
das ist hier kaum sinnvoll.

Siehe Anhang, so könnte das aussehen und laufen. Teste mal. Im 
Arduino-Terminal siehst du ein paar Texte, die sagen dir, was gerade 
geprüft wird. Das mußt du in deine Hardware messen. Erst wenn die 
Grundtest alle laufen kommt was Gescheites raus!

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

OK, da waren gestern abend noch ein paar Fehler drin, so sollte es 
besser funktionieren.

von Kurt S. (bmbbsr)


Lesenswert?

Danke
IM Schaltplan ist auch noch ein Fehler
IC4  die Zeilen liegen natürlich auf 4,5,6,7,8


mit dem Ersten Code ging IC 8 und 9 parallel

DANKE

Nochmal das PINOUT
// PINOUT MCP23017 to Display
//int adr0 = 0;
//int adr1 = 1;
//int adr2 = 2;
//int udnNumber = 3; IC2 Enable Positiv Power to be set
//int ulnrow = 4;  IC9 Enable
//int ulncolum = 5; IC8 Enable
//int cycleLED = 6; TEST Kanal
//int enable = 7; Alle 74HC138 Enable
//int spalteA = 8;
//int spalteB = 9;
//int spalteC = 10;
//int zeileA = 11;
//int zeileB = 12;
//int zeileC = 13;
//int zeileD = 14;
//int zeileE = 15;

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Kurt S. (bmbbsr)

>IM Schaltplan ist auch noch ein Fehler
>IC4  die Zeilen liegen natürlich auf 4,5,6,7,8

Dann solltest du das korrigieren und einen aktuellen Schaltplan in Form 
von PDF und SCH bereitstellen. Es fehlt auch noch GND an IC12/Pin9. 
Außerdem geht IC12/Pin 10 sichern an V+, damit die internen 
Freilaufdioden wirksam werden.

von Kurt S. (bmbbsr)


Lesenswert?

Frage Bist du auch im IRC

Ich denke für die bessere Lesbarkeit sollte man Binär Verwenden.

Da ich Ja Bit Kontroliere
Desweiteren ist der Enabe !E1 der einzelnen 138er LOW actiiv
1
void testCLK(uint8_t ziffer, uint8_t funktion) {
2
    uint16_t tmp=0;
3
4
    switch(funktion) {
5
        case 0: tmp |= B10101000 + ziffer; break;    // IC9, lade IC4, Zeilencode LOW  
6
        case 1: tmp |= B10011000 + ziffer; break;    // IC8, lade IC5, Spaltencode LOW 
7
        case 2: tmp |= B10110000 + ziffer; break;    // IC2, lade IC3, Sp + Zei HIGH   
8
    }
9
    mcp.writeGPIOAB(tmp);    // Speicherpuls erzeugen
10
    delay(2000);
11
    tmp &= ~0xFF;             // Steuerbus auf 0x00, alles inaktiv
12
    mcp.writeGPIOAB(tmp);
13
    delay(2000);
14
}

SMILE Ein Riesenschritt

von Falk B. (falk)


Lesenswert?

@ Kurt S. (bmbbsr)

>Frage Bist du auch im IRC

Nein.

>Ich denke für die bessere Lesbarkeit sollte man Binär Verwenden.

Kann man machen. Aber das ist nebensächlich! Mach die Test und korrigier 
den Schaltplan!

>Desweiteren ist der Enabe !E1 der einzelnen 138er LOW actiiv

Ja und? Das ist berücksichtigt. Wenn dein Plan stimmt.

>SMILE Ein Riesenschritt

Was denn? Was geht denn? Lies mal was über Netiquette.

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Entschuldigung wenn ich etwas euphorisch wurde Metall-er und 
Digitaltechnik speziell BIT Logik sind selten.

Zum Schaltplan
Ich habe nochmal alles Beschriftet und Durchgemessen
Es Haben sich Änderungen an den Steuer IC ergeben.
Geändert wurde auch IC4 zu IC12 Zeilensteuerung Negativ

DAS Wichtigste aber
#Erkenntnis das die LIB mcp23017 zuerst den Steuerbus setzt dann den 
Datenbus.
Somit habe ich die LIB (cpp,h,keyword) bearbeitet. nun werden die 
Datenbits und Steuerbits separat geschrieben.
Hier ergibt sich für mich wieder das BIT Problem
& 0xFF  oder  | 0xFF oder vileicht sogar direkt

##
TEST
Der Test
A void testCLK(uint8_t ziffer, uint8_t funktion) OK
Taktendes Signal an den Y der 138 IC 8,9,2

B:  Register Test Sollte angesichts der Änderungen nochmal überprüft 
werden . Die Ausgänge reagieren ABER sollte da positiv oder Negatives 
Signal anliegen?
1
void schreibeRegister(uint8_t ziffer, uint8_t funktion, uint8_t wert) {
2
    uint8_t datenport,steuerport; // Datenport GPIOB , Steuerport GPIOA
3
    if (ziffer > 7) return;
4
    //tmp = ((uint16_t)wert <<8);
5
    datenport = wert;
6
    Serial.println(datenport,BIN);
7
    mcp.writeGPIOB(datenport);    // Datenbus schreiben, Steuerbus inaktiv
8
    delay(2);
9
    ziffer &= 0x7; // Begrenzung auf 0-7
10
    // ziffer 0 ist unbenutzt
11
    // Ziffer 7 und funktion 0 = CLK_TIG_EN
12
    // Ziffer 7 und funktion 1 = CLK_TIG
13
    switch(funktion) {
14
        case 0: steuerport |= B10101000 + ziffer; break;    // IC9, lade IC4, Zeilencode LOW  
15
        case 1: steuerport |= B10011000 + ziffer; break;    // IC8, lade IC5, Spaltencode LOW 
16
        case 2: steuerport |= B10110000 + ziffer; break;    // IC2, lade IC3, Sp + Zei HIGH   
17
    }
18
    Serial.println(steuerport, BIN);
19
    // Speicherpuls vorbereiten, Dekoder aber noch inaktiv lassen (A7 und A6 auf LOW)
20
    // um Glitches zu vermeiden
21
    //mcp.writeGPIOAB(tmp & ~0xC0);    
22
    // Speicherpuls erzeugen, nur eine Dekoderleitung schalten, das ist glitchfrei
23
    mcp.writeGPIOA(steuerport);
24
    delay(2000);
25
    steuerport &= ~0xFF;             // Steuerbus auf 0x00, alles inaktiv
26
    mcp.writeGPIOA(steuerport);
27
    delay(2000);
28
29
    //mcp.writeGPIOAB(tmp & ~0xC0);    // Dekoder deaktivieren
30
}

geänderte LIB mcp23017
1
 
2
void Adafruit_MCP23017::writeGPIOA(uint8_t a) {
3
  Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
4
  wiresend(MCP23017_GPIOA);
5
  wiresend(a & 0xFF);
6
  Wire.endTransmission();
7
}
8
9
void Adafruit_MCP23017::writeGPIOB(uint8_t b) {
10
  Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
11
  wiresend(MCP23017_GPIOB);
12
  wiresend(b & 0xFF);
13
  Wire.endTransmission();
14
}

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>Entschuldigung wenn ich etwas euphorisch wurde Metall-er und

Dafür mußt du dich nicht entschuldigen, wohl aber an deiner 
Kommunikation arbeiten. Ich und der Rest des Forum sitzen nicht neben 
dir. Also solltest du möglichst GENAU und umfassend beschreiben, wenn 
was geht. Oder wenn was nicht geht.

>Ich habe nochmal alles Beschriftet und Durchgemessen
>Es Haben sich Änderungen an den Steuer IC ergeben.
>Geändert wurde auch IC4 zu IC12 Zeilensteuerung Negativ

Hmm.


>#Erkenntnis das die LIB mcp23017 zuerst den Steuerbus setzt dann den
>Datenbus.

Sicher? Wie hast du das gemessen? Nur weil die Übertragung seriell 
erfolgt, heißt das nicht, daß die Ausgabe auch zeitversetz erfolgt. Was 
sagt das Datenblatt?
Aber selbst wenn es so wäre, ist das für die Software, so wie sie 
aufgebaut ist, egal.

>Somit habe ich die LIB (cpp,h,keyword) bearbeitet.

Na, ob das der rechte Ansatz für einen Mechaniker ist, der so oder so 
schon viel zu tun hat?

> nun werden die
> Datenbits und Steuerbits separat geschrieben.

NEIN!

Hier ergibt sich für mich wieder das BIT Problem

>A void testCLK(uint8_t ziffer, uint8_t funktion) OK
>Taktendes Signal an den Y der 138 IC 8,9,2

Auch in der rich´tigen Reihenfolge/Zuordnung?

>B:  Register Test Sollte angesichts der Änderungen nochmal überprüft
>werden . Die Ausgänge reagieren ABER sollte da positiv oder Negatives
>Signal anliegen?

Es wird jeweils ein Bit auf HIGH gesetzt, die anderen auf LOW.

>geänderte LIB mcp23017

Die Änderung brauchst du nicht. Dann mußt du nämlich auch wieder ne 
Menge andere Dinge in der Software ändern. Laß es.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@Kurt S. (bmbbsr)

>    flipdot_V01.pdf | anzeigen

Wenn man eine korrigierte VErsion erstellt, sollte man das auch im Namen 
kennzeichnen. Denn zweimal eine Datei mit gleichem Namen aber 
verschiedenen Inhalten ist Mist.

Bist du sicher, daß C2 so angeschlossen ist, wie in deinem Plan? Das 
wäre nämlich arg sinnlos.

Ich hab mal ein paar Schönheitsfehler korrigiert. Mit den korrigierten 
Anschlüssen der LOW-Register ist die Kodierung auch wieder eindeutig und 
gleichmäßig für LOW und HIGH.

Wenn A7 wirklich am CLR von IC11A hängt, muss das RESET des 
Pulsgenerators immer wieder freigegeben werden. Oder A7 dauerhaft auf 
HIGH bleiben. Ist kein Probblem, man muss es nur richtig machen. Hab ich 
mal angepaßt, A7 bleibt jetzt immer auf HIGH, für die Dekodierung des 
ChipSelects braucht man es hier nicht. Siehe Anhang.

Die Kodierung der Register für die LOW-Daten ist auch korrigiert.

von Falk B. (falk)


Lesenswert?

Scheibenkleister, die Dekodierung der CLK-Generatoren stimmt so nicht.

Eher so.
1
void schreibeRegister(uint8_t ziffer, uint8_t funktion, uint8_t wert) {
2
    uint16_t tmp;
3
4
    if (ziffer > 7) return;
5
    tmp = ((uint16_t)wert <<8);
6
    mcp.writeGPIOAB(tmp  | 0xFF);    // Datenbus schreiben, Steuerbus inaktiv
7
8
....
9
}

von Kurt S. (bmbbsr)


Lesenswert?

Guten Tag
@ falk

Danke Zuerst Mal wir haben ein ERFOLG Ergebniss Zeile 3 und 4 Flippen 
und bringen Muster.
der Rest Zeile 0-2 bleiben stumm.

In Schaltplan ist an IC8 PIN 6 mit A6 Verbunden DER ist an pin A7 
Angelegt,
Ich Denke das ist aber ein versehen bei der Datenleitung Auswahl 
gewesen.

was bewirkt
1
 tmp = 0x80 >> z; [/ c] in
2
[c]
3
    void setzeZiffer(int ziffer, int wert) {
4
    uint8_t tmp, muster;
5
6
    if (ziffer > 6) return;
7
8
    for (int z=0; z<5; z++) {
9
        muster = hex2dot[wert][z];
10
        tmp = 0x80 >> z;

Ist mir momentan nicht so klar.
Und für was Steht "Glitschfrei" im Arduino code

Es sieht nicht schlecht aus. und schnell ist das auch noch.

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>Danke Zuerst Mal wir haben ein ERFOLG Ergebniss Zeile 3 und 4 Flippen
>und bringen Muster.

Na immerhin.

>In Schaltplan ist an IC8 PIN 6 mit A6 Verbunden DER ist an pin A7
>Angelegt,

Merkwürdiger Satz. Geht das auch auf deutsch?

>Ich Denke das ist aber ein versehen bei der Datenleitung Auswahl
>gewesen.

Hattest du nicht gesagt, daß du alles nochmal geprüft, durchgemessen, 
getestet und im Schaltplan aktualisiert hast? Was denn nun?
Hast du den Test der CLK-Generatoren und der Registerzugiffe VOLLSTÄNDIG 
und ERFOLGREICH durchgeführt?

>was bewirkt
> tmp = 0x80 >> z;

Man nehme den Wert 0x80, für dich 0b10000000, und schiebe ihn z mal nach 
rechts. Damit wird die aktive Zeile angesprochen, alle anderen bleiben 
inaktiv.

>Und für was Steht "Glitschfrei" im Arduino Code

Damit wird ABSOLUT sichergestellt, daß die CLK-Generatoren KEINE 
Glitches verursachen können, was vor allem bei Takten an Registern 
tödlich sein kann. Siehe Glitch.

>Es sieht nicht schlecht aus. und schnell ist das auch noch.

Naja, im Moment sind nach dem FlipPulse noch 500ms Pause drin, das war 
der erste, konservative Ansatz. Die Pause kann man sicher noch 
vermindern. Muß man mal testen.

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Anbei mal ein Video vom Bisherigen Funktionstest.
Da stimmt irgendwas mit der Datenbits Umwandlung nicht es Flippen nur 
4Dots  je Ziffer.

Weiterhin angehängt die Laufende Arduino Datei.

Ich Bitte Weiterhin um Hilfe in Sachen Digitaltechnik Bitoperation.

Danke

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

Es wäre nett bis sinnvoll, wenn du meine Fragen aus vorherigen Beiträgen 
beantworten würdest. Das sind die Sätze, welche mit dem Zeichen ? enden.

Du hast im Code einiges geändert. Die Kodierung der CLK-Dekoder, aber 
VERSCHIEDEN für den Test und den normalen Registerzuugriff! Das ist 
sicher nicht so gewollt.

Die Pause am Ende des FlipPulses muss sein!!! Denn sonst schaltest du 
schon andere Zeilen ein, wenn die aktuelle noch flipt!!! Die Zeit für 
Geschwindigkeitsoptimierungen ist JETZT noch nicht da! Mach die wieder 
rein!

>Ich Bitte Weiterhin um Hilfe in Sachen Digitaltechnik Bitoperation.

Siehe Bitmanipulation.

: Bearbeitet durch User
von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Ich Bemühe mich nach Kräften.

>Merkwürdiger Satz. Geht das auch auf deutsch?
In Schaltplan ist an IC8 PIN6 mit A7 zu Verbinden!

>Hattest du nicht gesagt, daß du alles nochmal geprüft, durchgemessen,
>getestet und im Schaltplan aktualisiert hast? Was denn nun?
>Hast du den Test der CLK-Generatoren und der Registerzugiffe VOLLSTÄNDIG
>und ERFOLGREICH durchgeführt?

Mehrmals das passt alles An den Eingängen der REGISTER IC.
Die Ausgänge werden ja beim Test nicht getriggert.

Ich musste die Setze Ziffer Dunklen und Hellen/Dots setzen drehen.
JETZT gehen zu mindestens alle Flipdots Aus.
Bei der Original sind Wilkürlich Spalte1 Zeile 2-4 aufgesprungen ON

###
Ich habe nun auch ein Osziloskop billig aber immerhin.
###

Beim Einschalten der Dots kommt auf den GPIOB Kein Zeilensignal
Beim Ausschalten sind 3 Pulse zusehen.
Ich teste mit Muster 0xFF ALLES AUS und 0x00 sollte Alles An sein.
Sind aber nur die 4 unten Rechts.

##
Pinout nochmal Port A klappt prima alles OK
GPIOB
B0 Steuert Spalte0
B1 Spalte1
B2 Spalte2

B3 Zeile0
B4 Zeile1
...

SOLLTE da nicht -> muster = ~muster & 0x03; EHER sein muster = ~muster & 
0x07;

FRAGE: wo muss ich das Bitmuster abfangen,
 Serial.println(tmp,BIN);
und warum wird das abgeschnitten zB. 10 nicht 00000010 da 8Bit
1
void setzeZiffer(int ziffer, int wert) {
2
    uint8_t tmp, muster;
3
4
    if (ziffer > 6) return;
5
6
    for (int z=0; z<5; z++) {
7
        //delay(500);
8
        test=1;
9
        //Serial.println(z);
10
        muster = hex2dot[wert][z];
11
        tmp = 0x80 >> z;
12
        
13
        // alle dunklen DOTs schalten
14
        schreibeRegister(ziffer, 0, 0);          // Zeile LOW inaktiv
15
        schreibeRegister(ziffer, 1, muster);     // Spaltenmuster LOW setzen
16
        schreibeRegister(ziffer, 2, tmp);        // Zeile HIGH, Spalte HIGH inaktiv
17
18
        if (test ==0){
19
          Serial.println(F("Dots off"));
20
          Serial.println(tmp,BIN);
21
          Serial.println(muster,BIN);
22
          }
23
        flipPulse();
24
        
25
        // alle hellen DOTs schalten
26
        muster = ~muster & 0x03;
27
        schreibeRegister(ziffer, 0, tmp);        // Zeile LOW setzen
28
        schreibeRegister(ziffer, 1, 0);          // Spaltenmuster LOW inaktiv
29
        schreibeRegister(ziffer, 2, muster);     // Spalte HIGH, Zeilen HIGH inaktiv
30
        if (test ==0){
31
          Serial.println(F("Dots on"));
32
          Serial.println(tmp,BIN);
33
          Serial.println(muster,BIN);
34
          }
35
        flipPulse();
36
        
37
    }
38
}

Beitrag #5562682 wurde vom Autor gelöscht.
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ Kurt S. (bmbbsr)

>    mcp_flipdot_v3.ino (5,47 KB, 0 Downloads) | Codeansicht
>    flipdot_V02.sch (526 KB, 0 Downloads)

>Ich Bemühe mich nach Kräften.

Und bist schon wieder gescheitert. flipdot_V02.sch hatte ich
hochgeladen, du hättest nach der Änderung ein V03 draus machen sollen.

>>Merkwürdiger Satz. Geht das auch auf deutsch?
>In Schaltplan ist an IC8 PIN6 mit A7 zu Verbinden!

OK, damit wird die Dekodierung auch etwas logischer. A6 ist demnach
unbenutzt.

>Mehrmals das passt alles An den Eingängen der REGISTER IC.

Gut.

>Die Ausgänge werden ja beim Test nicht getriggert.

??
Meinst du die Ausgänge der Leistungstreiber ULN/UDN?

>Ich musste die Setze Ziffer Dunklen und Hellen/Dots setzen drehen.

Kann sein, das war geraten.

>JETZT gehen zu mindestens alle Flipdots Aus.

Schon mal was.

>Beim Einschalten der Dots kommt auf den GPIOB Kein Zeilensignal

Merkwürdig.

>Ich teste mit Muster 0xFF ALLES AUS und 0x00 sollte Alles An sein.
>Sind aber nur die 4 unten Rechts.

Welche denn?

>SOLLTE da nicht -> muster = ~muster & 0x03; EHER sein muster = ~muster &
>0x07;

Ja, mein Fehler!

Und du hast IMMER NOCH den Fehler in der CLK Dekodierung drin! Kein
Wunder daß der TEST zwar geht, der echte Registerzugriff aber nicht!

>FRAGE: wo muss ich das Bitmuster abfangen,
> Serial.println(tmp,BIN);
>und warum wird das abgeschnitten zB. 10 nicht 00000010 da 8Bit

Weil die bei Arduino ein wenig doof sind und keie gescheite, formatierte
Ausgabe haben. Wenn du das willst, mußt du das selber programmieren.

Ich hab mal wieder aufgeräumt und die Fehler korrigiert. Siehe Anhang.

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Neuer Versuch Aus Geht
An Nicht

>Meinst du die Ausgänge der Leistungstreiber ULN/UDN?
ich messe nur die Logik nicht die Leistungstreiber  Netzteil Labor 0,2A

KANN Es Sein das die Initialisierung Probleme macht mit allem High (Nur 
eine Idee)

Und das Timing der Register Setzung da ja IC 10 eine eigene Taktung hat.

Anbei der Beweis alles aus. ## ICH teste nur Ziffer 0 da ich die Im 
Betrieb nicht Brauche. Sollte mal was schief laufen

Hier die Logik Ausgabe:

Clear Display

Zeile- 0 Dots off -> tmp 10000000 -> muster 00000111
Zeile- 0 Dots ON  -> tmp 10000000 -> muster 00000000

Zeile- 1 Dots off -> tmp 01000000 -> muster 00000111
Zeile- 1 Dots ON  -> tmp 01000000 -> muster 00000000

Zeile- 2 Dots off -> tmp 00100000 -> muster 00000111
Zeile- 2 Dots ON  -> tmp 00100000 -> muster 00000000

Zeile- 3 Dots off -> tmp 00010000 -> muster 00000111
Zeile- 3 Dots ON  -> tmp 00010000 -> muster 00000000

Zeile- 4 Dots off -> tmp 00001000 -> muster 00000111
Zeile- 4 Dots ON  -> tmp 00001000 -> muster 00000000
DOTS Cleard

SET ALL

Zeile- 0 Dots off -> tmp 10000000 -> muster 00000000
Zeile- 0 Dots ON  -> tmp 10000000 -> muster 00000111

Zeile- 1 Dots off -> tmp 01000000 -> muster 00000000
Zeile- 1 Dots ON  -> tmp 01000000 -> muster 00000111

Zeile- 2 Dots off -> tmp 00100000 -> muster 00000000
Zeile- 2 Dots ON  -> tmp 00100000 -> muster 00000111

Zeile- 3 Dots off -> tmp 00010000 -> muster 00000000
Zeile- 3 Dots ON  -> tmp 00010000 -> muster 00000111

Zeile- 4 Dots off -> tmp 00001000 -> muster 00000000
Zeile- 4 Dots ON  -> tmp 00001000 -> muster 00000111

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>Neuer Versuch Aus Geht
>An Nicht

Und wie bekommst du die FlipDots dann an?

>>Meinst du die Ausgänge der Leistungstreiber ULN/UDN?
>ich messe nur die Logik nicht die Leistungstreiber  Netzteil Labor 0,2A

Und mit welchem Netzteil versorgst du die Anzeige für den Test? 0,2A 
klingt mir recht wenig.

>KANN Es Sein das die Initialisierung Probleme macht mit allem High (Nur
>eine Idee)

Nein. Vor allem dann nicht, wenn der Registerzugriff WIRKLICH 
funktioniert. Dann ist es eher zu wenig Strom. Möglicherweise brauchen 
die FlipDots zum Einschalten deutlich mehr Strom als zum Ausschalten. 
Ich würde mal mit 1-2A ins Rennen gehen.

>Und das Timing der Register Setzung da ja IC 10 eine eigene Taktung hat.

???

>Anbei der Beweis alles aus. ## ICH teste nur Ziffer 0 da ich die Im
>Betrieb nicht Brauche. Sollte mal was schief laufen

Das sollte die Logik auf dem Board verhindern.

>Hier die Logik Ausgabe:

Naja, man sieht auf deinem Video, daß Zeile 1 unten ist. Man muss also 
oben anfangen. Aber das ist nebensächlich. Erstmal muß die Anzeige der 
aktiven Pixel laufen.

von Kurt S. (bmbbsr)


Lesenswert?

@ falk
>Und wie bekommst du die FlipDots dann an?
Mit 2 Kabeln direkt auf ULN UDN Pin2

>Und mit welchem Netzteil versorgst du die Anzeige für den Test? 0,2A
>klingt mir recht wenig.

Labornetzteil Begrenzung Ampere

>Ich würde mal mit 1-2A ins Rennen gehen.
Die Untere Reihen schalten JA mit Strombegrenzung und man sieht auch bei 
80mA Strombegrenzung das Sie Flippen wollen.

>Naja, man sieht auf deinem Video, daß Zeile 1 unten ist. Man muss also
>oben anfangen. Aber das ist nebensächlich. Erstmal muß die Anzeige der
>aktiven Pixel laufen.

DA Ist Was Nicht so wie es sein Soll den Zeilendrehung während des Laufs 
?

Phänomen
Mit dem Arduino Code gehen die unteren Zeilen AN aber Nicht wieder Aus
1
void setzeZiffer(int ziffer, int wert) {
2
    uint8_t tmp, muster;
3
    if (ziffer > 6) return;
4
    for (int z=3; z<5; z++) {

SO gehen die unteren Zeilen Aus aber nicht wieder AN
1
void setzeZiffer(int ziffer, int wert) {
2
    uint8_t tmp, muster;
3
    if (ziffer > 6) return;
4
    for (int z=0; z<2; z++) {

Natürlich Unlogisch gehen Sie dann mit dem Hier An und Aus Kopfweh
1
void setzeZiffer(int ziffer, int wert) {
2
    uint8_t tmp, muster;
3
    if (ziffer > 6) return;
4
    for (int z=0; z<5; z++) {

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>>Und wie bekommst du die FlipDots dann an?
>Mit 2 Kabeln direkt auf ULN UDN Pin2

Das heißt aber, daß der UDN funktioniert. Merkwürdig.

>>Und mit welchem Netzteil versorgst du die Anzeige für den Test? 0,2A
>>klingt mir recht wenig.

>Labornetzteil Begrenzung Ampere

Geht es nicht noch etwas sparsamer? Ich weiß, Techniker sind keine 
Literaten und Plaudertaschen, aber ein paar vernünftige Sätze kann man 
wohl verlangen.

>Die Untere Reihen schalten JA mit Strombegrenzung und man sieht auch bei
>80mA Strombegrenzung das Sie Flippen wollen.

Hmm.

>>Naja, man sieht auf deinem Video, daß Zeile 1 unten ist. Man muss also
>>oben anfangen. Aber das ist nebensächlich. Erstmal muß die Anzeige der
>>aktiven Pixel laufen.

>DA Ist Was Nicht so wie es sein Soll

Schon klar. Die Änderung ist einfach!!!

Ändere folgende Zeile in setzeZiffer()

tmp = 0x08 << z;


>Phänomen
>Mit dem Arduino Code gehen die unteren Zeilen AN aber Nicht wieder Aus
>void setzeZiffer(int ziffer, int wert) {
>    uint8_t tmp, muster;
>    if (ziffer > 6) return;
>    for (int z=3; z<5; z++) {

>SO gehen die unteren Zeilen Aus aber nicht wieder AN
>void setzeZiffer(int ziffer, int wert) {
>    uint8_t tmp, muster;
>    if (ziffer > 6) return;
>    for (int z=0; z<2; z++) {

Klingt danach, als ob dein Schaltplan doch nicht stimmt. Miß nochmal 
GENAU nach, ob die Bits wirklich an den richtigen Stellen der Register 
und Treiber ankommen!

von Kurt S. (bmbbsr)


Lesenswert?

Der Fehler kann nur in der Software sein.
mittlerweile messe ich das komplette System schon zum 10 mal Pin für Pin

Die Hardware passt so 100 %

sonst würde beim Rücksetzen was nicht passen

da werden ja die Zeilen auch Einzel Dunkel und für alle Ziffern

Ich bin immer noch der Meinung das die Ports A/B niemals Gleichzeitig 
wechseln dürfen. Wir setzen ja immer alle 16 Bits um

und zumal zuerst der Port A Geschaltet wird von der LIB nicht die
Daten Vor dem Steuersignal wie üblich .

von Falk B. (falk)


Lesenswert?

@ Kurt S. (bmbbsr)

>Ich bin immer noch der Meinung das die Ports A/B niemals Gleichzeitig
>wechseln dürfen.

Das tun sie ja nicht, denn die Daten auf GPB werden mehrfach, aber 
IDENTISCH geschieben.

> Wir setzen ja immer alle 16 Bits um

Das ist kein Problem, erst recht nicht, wenn man es richig macht. Und 
bis zum Beweis des Gegenteils behaupte ich, daß es richig gemacht wird.

>und zumal zuerst der Port A Geschaltet wird von der LIB nicht die
>Daten Vor dem Steuersignal wie üblich .

Doch, ganz am Anfang!!!
1
    tmp = ((uint16_t)wert <<8);
2
    mcp.writeGPIOAB(tmp  | 0xFF);    // Datenbus schreiben, Steuerbus inaktiv

Was noch denkbar ist, daß du in deinem Schaltplan IC5 und IC4 
verwechselt hast. Denn dann kann es passieren, daß die Schutzschaltung 
in IC1 das Schalten verhindert. Das kann man mal testen.
1
// TEST, verdrehte Ansteuerung von IC4 und IC5
2
3
void setzeZiffer(int ziffer, int wert) {
4
    uint8_t tmp, muster;
5
6
    if (ziffer > 6) return;
7
8
    for (int z=0; z<5; z++) {
9
        //delay(500);
10
        //Serial.println(z);
11
        muster = ~hex2dot[wert][z] & 0x7;
12
        tmp = 0x80 >> z;
13
        
14
        // alle dunklen DOTs schalten
15
        schreibeRegister(ziffer, 0, muster);          // Zeile LOW inaktiv
16
        schreibeRegister(ziffer, 1, 0);          // Spaltenmuster LOW setzen
17
        schreibeRegister(ziffer, 2, tmp);        // Zeile HIGH, Spalte HIGH inaktiv
18
19
#ifdef TEST
20
          Serial.println(F("Dots off"));
21
          printBIN(tmp);
22
          Serial.print("  ");
23
          printBIN(muster);
24
          Serial.println("");
25
#endif
26
        flipPulse();
27
        
28
        // alle hellen DOTs schalten
29
        muster = ~muster & 0x07;
30
        schreibeRegister(ziffer, 0, 0);        // Zeile LOW setzen
31
        schreibeRegister(ziffer, 1, tmp);          // Spaltenmuster LOW inaktiv
32
        schreibeRegister(ziffer, 2, muster);     // Spalte HIGH, Zeilen HIGH inaktiv
33
34
#ifdef TEST
35
          Serial.println(F("Dots on"));
36
          printBIN(tmp);
37
          Serial.print("  ");
38
          printBIN(muster);
39
          Serial.println("");
40
#endif
41
        flipPulse();
42
    }
43
}

von Kurt S. (bmbbsr)


Lesenswert?

Danke Für den Hinweis
Der Schaltplan Stimmt aber so korrekt,nichts vertauscht.
Diese Woche sind Prüfungen.
Ich werde mich erst Freitag wieder melden!

Leider ausser den Unteren Beiden Zeilen an allen Ziffern die nach 
belieben codieren kann. Volle Funktion
an den oberen 3 Zeilen kein Erfolg.

Das Wird schon werden Hoffe Ich

von Falk B. (falk)


Lesenswert?

Wenn du willst, kannst du mir den Kram komplett zuschicken und ich 
bring's zum Laufen. Wenn du aber die sportliche Herausforderung suchst 
und es selber machen willst, dann eher nicht ;-)

von Kurt S. (bmbbsr)


Lesenswert?

@ Falk D
Danke für das Angebot momentan bastle ich noch etwas weiter!
DER Obige Arduino Code SETZE ZIFFER Gedreht bring überhaupt kein Output.

Ich werde heute und Morgen mal eine Schnelle Platine Fräsen Habe gerade 
die PCB Fräse hier. Zweck: Ausschliessen das irgend ein Kontakt wackelt!

ich melde mich Morgen wieder.

von Kurt S. (bmbbsr)



Lesenswert?

Neues von der Flipdot Front

Control Board erstellt gefräst und Gelötet

Daten Anbei

Leider ist beim Controllbus eine Änderung eingetreten Pins Vertauscht
Kein grosser Akt aber der Code Ändert sich.
1
#define DEOCDE_IC4 0b11110000
2
#define DEOCDE_IC5 0b11011000
3
#define DEOCDE_IC3 0b11101000

DAS Ergebniss ist aber das Gleiche nur die unteren Beiden Zeilen sind 
zum Anschalten der Dots zu Bewegen
Aber Ausschalten lassen sie sich alle.
SOMIT ist Hardwaremässig alles in Ordnung!

Die Zeilen sind ja Bit 11-15 da stimmt was mit dem Bitshift nicht im 
16Bit GPIO Muster

Analyse Folgt

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

Analyse Daten zum Neuen Arduino Code

Ich habe Beide Dateien angehängt.

Zeile3 Dot1 wird nicht gesetzt
Zeile2 dot1 WIRD
Zeile1 dot1 WIRD

In der TXT Datei ab Abschnitt ## SET

Ich bitte weiterhin um Unterstützung mit der Bitmuster Logik

Danke

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Kurt S. schrieb:
> Ich bitte weiterhin um Unterstützung mit der Bitmuster Logik

 Manoman.
 Ich habe selten so etwas unnötig kompliziertes gesehen...

 Für so etwas (3 Ziffern a 3x5 Dots) braucht man 5 + 3 * 3 = 14
 Leitungen insgesamt, also nimmt man 1 x UDN, 1 x ULN, 1 x NPN/PNP,
 je nachdem ob CC oder CA, 10 x Widerstände und 1 x MCP23017.
 Das sind 3 (DREI) ICs.
 Falls einzelne Dots nicht mehr als 25mA brauchen, reicht nur ein
 MCP23017 und 9 Widerstände.
 Das ist 1 (EIN) IC.

 Displays werden reihenweise angesteuert, alle 3 Displays zusammen,
 d.h. 5 Reihen nacheinander, bei einer Refresh rate von 50/sec =
 5 x 50 = 250/sec = 4ms Interrupt.

 Setzen der Ports wird im Interrupt erledigt, dauert kaum Zeit.
 Main() braucht nur die Daten für darzustellende Ziffern oder Zeichen
 ins RAM zu kopieren (aber nur wenn die Daten sich ändern), ansonsten
 merkt er kaum etwas davon.

 Wozu Ihr beide über 20 ICs und mehr als 250 Zeilen Code braucht,
 wird für mich ein ewiges Rätsel bleiben...

 P.S.
 Selbstverständlich kann auch ein Arduino ohne MCP23017 das Ganze
 ohne Probleme steuern...

: Bearbeitet durch User
von Kurt S. (bmbbsr)


Lesenswert?

Danke
leider ist die Steuerung so fertig und ich würde ungern alles auslöten 
und neu aufbauen.

Des weiteren braucht es ja auch ein Rücksetzung also alles umgekehrt

Mal sehen ob ich das hin-bekomme

von Kurt S. (bmbbsr)


Angehängte Dateien:

Lesenswert?

########
ERFOLG
########

Das Negieren des Systems brachte mun den Erfolg

Es klackert zwar nun um so mehr und ich brauche auch 400mA
Aber es Funktioniert.
anbei die Final Dateien und das Video

DANKE AN DIE HELFER

von Falk B. (falk)


Lesenswert?

@Kurt S. (bmbbsr)

>Das Negieren des Systems brachte mun den Erfolg

???
Was hast du denn negiert?

Ob das hier so gewollt ist?

setZiffer...

 tmp = 0x07 << z;

Damit werden drei Zeilen geleichzeitig angesteuert.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk B. schrieb:
>>Das Negieren des Systems brachte mun den Erfolg
>
> ???
> Was hast du denn negiert?

 Ich glaube mit negieren meint er, dass zuerst alle Dots gesetzt
 werden und dann, je nach Wert, die entsprechenden Dots gelöscht
 werden.

 P.S.
 Was weder so klappt wie gewünscht, noch ist es irgendwie
 besser als anders rum.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.