mikrocontroller.net

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


Autor: Kurt S. (bmbbsr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Georg-G (Gast)
Datum:

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

Autor: Stephan H. (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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_...

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt S. (bmbbsr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht 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 .

Autor: Kurt S. (bmbbsr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
Autor: Kurt S. (bmbbsr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
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
  }

Autor: Falk B. (falk)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Falk B. (falk)
Datum:

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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Load Error 198 .....

duck und weg :-))

Autor: Kurt S. (bmbbsr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk B. (falk)
Datum:
Angehängte Dateien:

Bewertung
2 lesenswert
nicht 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.

void setze_ziffer(int ziffer, int wert){

  for (z=0; z<5; z++) {
   ....
  }
}

uint8_t hex2dot[10][5] = { {0x7, 0x5, 0x5, 0x5, 0x7}, // 0
                         // weitere ergänzen  
                         };

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.

// erzeuge Speicherpulse

void speichern(int ziffer, int funktion) {

  ziffer &= 0x7; // Begrenzung auf 0-7
  // ziffer 0 ist unbenutzt
  // Ziffer 7 und funktion 0 = CLK_TIG_EN
  // Ziffer 7 und funktion 1 = CLK_TIG

  switch(funktion) {
    case 0: GPA = 0x88 + Ziffer; break;    // IC9
    case 1: GPA = 0x40 + Ziffer; break;    // IC8
    case 2: GPA = 0x90 + Ziffer; break;    // IC2
  }
  _delay_us(10);
  GPA = 0xFF;  // alle inaktiv, steigende Flanke
}

: Bearbeitet durch User
Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht 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
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}, // =  
        };

DOT Kodierung 5x3 Wem es Hilft

: Bearbeitet durch User
Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht 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);

  }
}

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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".
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;  // das ist hier überflüssig

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

  }
}


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

: Bearbeitet durch User
Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch einfach mal deinen aktuellen Quelltext als Anhang.

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So auf Vielfachen Wunsch hier mal mein Murgs code.

Ich habe nun angefangen die 16bit zu Füllen und als ganzes auszugeben .
/********************************************************
**  Projekt Flipdot                                   **
********************************************************/

#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp;
// PINOUT MCP23017 to Display 
//int adr0 = 0;
//int adr1 = 1;
//int adr2 = 2;
//int udnNumber = 3; Positiv Power to be set 
//int ulnrow = 4;
//int ulncolum = 5;
//int cycleLED = 6;
//int enable =7;
//int spalteA = 8;
//int spalteB = 9;
//int spalteC = 10;
//int zeileA = 11;
//int zeileB = 12;
//int zeileC = 13;
//int zeileD = 14;
//int zeileE = 15;

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

// 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}, // =  
        };

#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))

void setup() {  
  mcp.begin();      // use default address 0
  for (int i=0;i<16;i++)
  {
    mcp.pinMode(i, OUTPUT);
  }
  // led blinken
  pinMode(LED_BUILTIN, OUTPUT);
  // startbedingung 
  mcp.digitalWrite(3, HIGH);  //74HC138 E1 Oben
  mcp.digitalWrite(4, HIGH);   // E1 Links
  mcp.digitalWrite(5, HIGH);   // E1 Rechts
  for (int i=7;i<16;i++)
  {
    mcp.digitalWrite(i, LOW); // init low 
  }
}
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 spaltenwert = hex2dot[wert][z];
    if (spaltenwert > 0x07) return;
    if (spaltenwert & 1)mcp.digitalWrite(15, HIGH);else mcp.digitalWrite(15, LOW);
    if (spaltenwert & 2)mcp.digitalWrite(14, HIGH);else mcp.digitalWrite(14, LOW);
    if (spaltenwert & 4)mcp.digitalWrite(13, HIGH);else mcp.digitalWrite(13, LOW);

  }
}
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 setADR(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(2);
  }

void restetdatabits(){
    for (int i=8;i<16;i++)
      {
         mcp.digitalWrite(i, LOW); // init low 
      }
  }
  
void startPulse(){
  restetdatabits();
  mcp.digitalWrite(CLK_TRIG_EN, LOW);
  }

void trigger(){
  mcp.digitalWrite(9, HIGH);
  delay(1);
  mcp.digitalWrite(9, LOW);
  delay(1);
  mcp.digitalWrite(9, HIGH);
  }
  
void clearFlipDotDisplay(){

  for (int number=0;number<7;number++){
    for (int row=0;row<5;row++){
      for (int col=0;col<3;col++){
        
      }
    }
  }
  
  }
  
void loop() {
  delay(1000);
  mcp.digitalWrite(8, HIGH);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(5);
  trigger();
  delay(500);

  mcp.digitalWrite(8, LOW);
  digitalWrite(LED_BUILTIN, LOW);
  delay(5);
  trigger();

}

: Bearbeitet durch User
Autor: Falk B. (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
//int adr0 = 0;
//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!

Autor: Falk B. (falk)
Datum:
Angehängte Dateien:

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

Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt S. (bmbbsr)
Datum:

Bewertung
0 lesenswert
nicht 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
void testCLK(uint8_t ziffer, uint8_t funktion) {
    uint16_t tmp=0;

    switch(funktion) {
        case 0: tmp |= B10101000 + ziffer; break;    // IC9, lade IC4, Zeilencode LOW  
        case 1: tmp |= B10011000 + ziffer; break;    // IC8, lade IC5, Spaltencode LOW 
        case 2: tmp |= B10110000 + ziffer; break;    // IC2, lade IC3, Sp + Zei HIGH   
    }
    mcp.writeGPIOAB(tmp);    // Speicherpuls erzeugen
    delay(2000);
    tmp &= ~0xFF;             // Steuerbus auf 0x00, alles inaktiv
    mcp.writeGPIOAB(tmp);
    delay(2000);
}

SMILE Ein Riesenschritt

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kurt S. (bmbbsr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?
void schreibeRegister(uint8_t ziffer, uint8_t funktion, uint8_t wert) {
    uint8_t datenport,steuerport; // Datenport GPIOB , Steuerport GPIOA
    if (ziffer > 7) return;
    //tmp = ((uint16_t)wert <<8);
    datenport = wert;
    Serial.println(datenport,BIN);
    mcp.writeGPIOB(datenport);    // Datenbus schreiben, Steuerbus inaktiv
    delay(2);
    ziffer &= 0x7; // Begrenzung auf 0-7
    // ziffer 0 ist unbenutzt
    // Ziffer 7 und funktion 0 = CLK_TIG_EN
    // Ziffer 7 und funktion 1 = CLK_TIG
    switch(funktion) {
        case 0: steuerport |= B10101000 + ziffer; break;    // IC9, lade IC4, Zeilencode LOW  
        case 1: steuerport |= B10011000 + ziffer; break;    // IC8, lade IC5, Spaltencode LOW 
        case 2: steuerport |= B10110000 + ziffer; break;    // IC2, lade IC3, Sp + Zei HIGH   
    }
    Serial.println(steuerport, BIN);
    // Speicherpuls vorbereiten, Dekoder aber noch inaktiv lassen (A7 und A6 auf LOW)
    // um Glitches zu vermeiden
    //mcp.writeGPIOAB(tmp & ~0xC0);    
    // Speicherpuls erzeugen, nur eine Dekoderleitung schalten, das ist glitchfrei
    mcp.writeGPIOA(steuerport);
    delay(2000);
    steuerport &= ~0xFF;             // Steuerbus auf 0x00, alles inaktiv
    mcp.writeGPIOA(steuerport);
    delay(2000);

    //mcp.writeGPIOAB(tmp & ~0xC0);    // Dekoder deaktivieren
}

geänderte LIB mcp23017
 
void Adafruit_MCP23017::writeGPIOA(uint8_t a) {
  Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
  wiresend(MCP23017_GPIOA);
  wiresend(a & 0xFF);
  Wire.endTransmission();
}

void Adafruit_MCP23017::writeGPIOB(uint8_t b) {
  Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
  wiresend(MCP23017_GPIOB);
  wiresend(b & 0xFF);
  Wire.endTransmission();
}

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk B. (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.