Forum: Mikrocontroller und Digitale Elektronik Allgemeine fragen zum ansteuern von Dot-Matrixanzeigen.


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

hallo leute,

ich möchte einer freundin zu weihnachten ein einmaliges geschenk 
übermittel.
es soll eine laufschrift mit weihnachts- und frühjahrsgrüßen werden.

nun jedoch einige fragen zu einzelnen dingen, welche ich nicht ganz 
recht verstehe:

ich habe gelesen, dass jede zeile nur als einzige allein leuchten darf.
wieso ist das so?
in der grafik habe ich nach meinen verständis eine skizze gezeichnet. 
soll es etwa so von statten gehen?
in welchem tastverhältnis etwa sollen die leds ein- und ausgeschaltet 
werden?

und wie soll ich das dann anstellen? per avr alle kanäle manuell 
nacheinander ein und aus schalten oder gibt es etwa schon ein ic, das 
alle zeilen nacheinander aufleuchten lässt, wenn man eine flanke 
ansetzt? also praktisch wie beim schieberegister, nur, dass nicht das 
signal, sondern der "schalter" durchgeschoben wird.

jetzt die hauptfrage:

wie soll dieses system genau funktionieren können, wenn man nur pro 
modul (5x7) 12 dateneingänge hat? problem schildere ich in der 
angehangenen grafik.
dort entstehen ungewollte fehler, es gehen also leds an, die garnicht 
angehen sollen. dieses problem wird wohl nur durch abwechselndes blinken 
unterdrückt werden können, oder?
zB erst die 1. zeile und spalte 2, paar ms warten, abschalten und 
darauffolgend einfach die 5. zeile und spalte 4 einschalten. so leuchten 
in wirklichkeit immer nur eine zeile und eine spalte. ist das denn 
dieses prinzip oder irre ich mich?
denn so wäre es doch unvorstellbar aufwändig, überhaupt einen einzigen 
buchstaben zu programmieren.

ich habe bisher nur grundwissen mit bascom. ich kann mit gosub und dem 
standart umgehen. ich denke mal, dass hier gosub ausreichen wird. wenn 
nicht, könnte mir jemand für dieses projekt passende befehle nennen oder 
gute links anbieten?

ich wäre sehr für antworten dankbar.

von Karl H. (kbuchegg)


Lesenswert?

Sven schrieb:

> ich habe gelesen, dass jede zeile nur als einzige allein leuchten darf.

Dürfen ist übertrieben
Aber es ist einfacher so.

> wieso ist das so?

Weil du ansonsten für jede LED einzeln Anschlüsse brauchen würdest. Das 
wären dann bei dir 8*7 = 56 + 1 = 57 Anschlüsse. Ein bischen viel.

> in welchem tastverhältnis etwa sollen die leds ein- und ausgeschaltet
> werden?

Die Frage stellt sich nicht. Denn wenn du reihum eine Zeile (oder Spalte 
je nachdem) durchgehst landest du automatisch bei entweder 7:1 oder 8:1

> und wie soll ich das dann anstellen? per avr alle kanäle manuell
> nacheinander ein und aus schalten

Ja, genau

> oder gibt es etwa schon ein ic, das
> alle zeilen nacheinander aufleuchten lässt, wenn man eine flanke
> ansetzt? also praktisch wie beim schieberegister, nur, dass nicht das
> signal, sondern der "schalter" durchgeschoben wird.

Solche IC gibt es sicherlich auch. Aber man kann das auch mit einem µC 
machen. Ist kein großer Aufwand

> wie soll dieses system genau funktionieren können, wenn man nur pro
> modul (5x7) 12 dateneingänge hat? problem schildere ich in der
> angehangenen grafik.

Du siehst Probleme wo keine sind.

> dort entstehen ungewollte fehler,

No.

> es gehen also leds an, die garnicht
> angehen sollen.

Dann hast du einen Programmfehler.

> dieses problem wird wohl nur durch abwechselndes blinken
> unterdrückt werden können, oder?
> zB erst die 1. zeile und spalte 2, paar ms warten, abschalten und
> darauffolgend einfach die 5. zeile und spalte 4 einschalten.

So macht man das nicht.
Man richtet seine Multiplexstartegie nicht danach, was ausgegeben werden 
soll.
Es werden pauschal die Daten der ersten Spalte in allen Zeilen angelegt 
und die erste Spalte aktiv geschaltet. Dann die Daten der 2. Spalte in 
allen Zeilen und die 2.te Zeile aktiv, dann die Daten der 3. Spalte und 
dritte Spalte aktiv usw.

Du hast also im µC einen Speicherbereich, der dein Display symbolisiert. 
Dieser Speicher wird ständig und ohne ansehen des Inhalts auf die 
Anzeige rausgetaktet. Der Vorgang läuft selbstständig und autonom im 
Hintergrund (am besten in einem Interrupt). Willst du eine LED 
einschalten, dann setzt du in diesem Speicherbereich das zugehörige Bit 
auf 1 und der Hintergdunprozess sorgt dafür, dass dann auch die 
zugehörige LED leuchtet.

> so leuchten
> in wirklichkeit immer nur eine zeile und eine spalte.

Entweder eine Zeile oder eine Spalte. Je nachdem ob man die Zeilen 
multiplext oder die Spalten.

> ist das denn
> dieses prinzip oder irre ich mich?
> denn so wäre es doch unvorstellbar aufwändig,

überhaupt nicht.

> überhaupt einen einzigen
> buchstaben zu programmieren.

Ist es nicht. Wie gesagt: Du hast im µC ein Speicherabbild deiner LED. 
Dort arbeitet dann die Ebene, die Buchstaben ausgibt. Wie die dann an 
die LED kommen, darum kümmert sich der Multiplexteil völlig autonom.

> standart umgehen. ich denke mal, dass hier gosub ausreichen wird. wenn
> nicht, könnte mir jemand für dieses projekt passende befehle nennen oder
> gute links anbieten?

Ohne Timer und Interrupts wirst du nicht weit kommen.

von Zehn V. (langerblitz)


Angehängte Dateien:

Lesenswert?

danke ersteinmal für die ausführliche antwort, kbuchegg!

dauerhaft darf man die leds aber nicht anhaben, da sie sonst überhitzen, 
richtig?

nun nochmal zum steuern der einzelnen leds:

ich hab das jetzt so verstanden, dann alle zeilen auf high sind und nur 
die spalten je nach aufzuleuchtenden led auf high oder low gesetzt 
werden.
wäre aber wieder diese überkreuzung.

ich glaube, dass ich hier einfach das steuersyetem unterschätzt bzw 
falsch verstanden habe.

garnicht so einfach, wie ich es mir vorgestellt habe, wenn man nicht 
weiß, wie das gehen soll.

ich möchte das unbedingt lernen, nur verwirrt mich das wörtliche 
beschreiben der koordinaten einzelner leds.

könnte mir das jemand nochmal mit anderen worten und einfacher erklären?
eventuell programmbeispiel und was hat es mit dem hintergrund auf sich? 
ich versteh das wirklich nicht.

ich muss ja im prinzip, wenn ich einen buchstaben darstellen möchte, 
bestimmte zeilen und spalten auf high bzw auf low setzen. das muss ja 
sowieso gemacht werden.
geht das denn nicht einfach alles einzeln?

zB:
1
Do
2
Cls
3
Beginn:
4
Gosub Zeile1 : Gosub Zeile2 : Gosub Zeile3 : Gosub Z4 : Gosub Z5 : Gosub Zeile6 : Gosub Zeile7
5
6
Gosub Spalte1 : Gosub Spalte2 : Gosub Spalte3 : Gosub Spalte4 : Gosub Spalte5
7
8
9
Goto Beginn
10
Loop
11
12
Rem - - - - - - - - - - - - - - - - - - -
13
14
Zeile1:
15
Portd. 0 = 1 : Return
16
17
Zeile2:
18
Portd. 1 = 1 : Return
19
20
Zeile3:
21
Portd. 2 = 1 : Return
22
23
Zeile4:
24
Portd. 3 = 1 : Return
25
26
Zeile5:
27
Portd. 4 = 1 : Return
28
29
Zeile6:
30
Portd. 5 = 1 : Return
31
32
Zeile7:
33
Portd. 6 = 1 : Return
34
35
36
37
Spalte1:
38
Portc. 0 = 1 : Return
39
40
Spalte2:
41
Portc. 1 = 1 : Return
42
43
Spalte3:
44
Portc. 2 = 1 : Return
45
46
Spalte4:
47
Portc. 3 = 1 : Return
48
49
Spalte5:
50
Portc. 4 = 1 : Return
51
52
53
End


hier würde praktisch (in der grafik) das ganze modul leuchten, da nun 
für den buchstaben H alle zeilen und spalten auf high sein müssen.

wie soll das nun anders gehen? irgendwie muss man doch diese einzelnen 
punkte nacheinander laufen lassen. sonst ist alles an.

mensch.... schade, dass es nirgnds ein genaues toturial darüber gibt.

von Zehn V. (langerblitz)


Lesenswert?

oder einfach gefragt: WAS heißt multiplexen genau?
ich habs schon so oft gegoogelt und nichts verstanden...

von Sebastian E. (der_andere_sebastian)


Lesenswert?

Multiplexen heißt allgemein, eine Matrix spalten- oder zeilenweise 
anzusteuern, hier insbesondere, daß Ziffern oder in diesem Falle Zeilen 
nacheinander angesteuert werden, und durch die Trähgeit des menschlichen 
Auges der Eindruck entsteht, als würde das ganze Displayfeld leuchten - 
dabei leuchten nur einzelne Zeilen nacheinander.

Also: Wenn man Zeilen multiplext, werden alle LEDs einer Zeile, die 
leuchten sollen, gleichzeitig für einen kurzen Moment angesteuert, dann 
wieder ausgeschaltet, und dieser Vorgang mit der nächsten Zeile 
wiederholt.
Man kann natürlich auch umgekehrt spaltenweise multiplexen.

von Zehn V. (langerblitz)


Lesenswert?

aaaahso. (:

jetzt habe ich es verstanden! okay.

ja, es werden also doch nur einzelne leds bzw teile eines buchstabens in 
wirklichkeit angesteuert. gut.


habe jetzt dann nur noch die frage, wie das mit dem schieberegister 
funktionieren soll.

weil dann kommt ja immer ein buchstabe dazu und es verschwindet auch 
immer wieder einer.

ich bestell jetzt erstmal bei reichelt den ganzen kram und dann versuch 
ich zum anfang nur eine stehende schrift zu multiplexen!

von Karl H. (kbuchegg)


Lesenswert?

Sven Schmidt schrieb:

> dauerhaft darf man die leds aber nicht anhaben, da sie sonst überhitzen,
> richtig?

Kommt drauf an, wieviel Strom du durchjagst

> ich hab das jetzt so verstanden, dann alle zeilen auf high sind und nur
> die spalten je nach aufzuleuchtenden led auf high oder low gesetzt
> werden.
> wäre aber wieder diese überkreuzung.

Keine Überkreuzung

> ich glaube, dass ich hier einfach das steuersyetem unterschätzt bzw
> falsch verstanden habe.

Das denke ich auch

> garnicht so einfach, wie ich es mir vorgestellt habe, wenn man nicht
> weiß, wie das gehen soll.

Dabei ist es vom Prinzip her sogar ziemlich einfach :-)

> ich möchte das unbedingt lernen, nur verwirrt mich das wörtliche
> beschreiben der koordinaten einzelner leds.

Vergiss erst mal, dass du einzelne LED ansteuern willst.


> ich muss ja im prinzip, wenn ich einen buchstaben darstellen möchte,
> bestimmte zeilen und spalten auf high bzw auf low setzen. das muss ja
> sowieso gemacht werden.
> geht das denn nicht einfach alles einzeln?

OK.
Du willst ein H anzeigen.
(Es geht hier nur ums Prinzip wie das H entsteht, im Rechner machst du 
das anders)

Das ist die Matrix


  0    . . . . .
  1    . . . . .
  2    . . . . .
  3    . . . . .
  4    . . . . .
  5    . . . . .
  6    . . . . .

       A B C D E


An den SChnittpunkten sitzt jeweils eine LED. Sie leuchtet wenn die 
Zeile auf 1 ist und die Spalte (angesteuert mit den Buchstabenleitungen) 
auf 0

Setzt du also alle Spaltentreiber (die Buchstaben auf 1) dann kann erst 
mal gar nichts leuchten.

Stellst du beim Zeilentreiber an der Zeile 3 eine 1 ein (und alle 
anderen 0) UND zusätzlich den Spaltentreiber D auf 0 (und alle anderen 
auf 1) dann würde diese LED leuchten

0  0    . . . . .
0  1    . . . . .
0  2    . . . . .
1  3    . . . X .
0  4    . . . . .
0  5    . . . . .
0  6    . . . . .

        A B C D E
        1 1 1 0 1


Mit anderen Zeilen/Spalten natürlich dann entsprechend.

Gut
Die Ausgabe erfolgt von Links nach Rechts jeweils eine komplette Spalte.
Für ein H wäre das:

  alle Spalten auf 1   (damit erst mal gar nichts leuchtet)
  alle Zeilen auf 1
  Spalte A auf 0

Jetzt leuchtet auf

1  0    X . . . .
1  1    X . . . .
1  2    X . . . .
1  3    X . . . .
1  4    X . . . .
1  5    X . . . .
1  6    X . . . .

        A B C D E
        0 1 1 1 1

im nächsten Durchgang wird dann eingestellt

   alle Spalten auf 1   (damit wieder nichts leuchtet)
   alle Zeilen auf 0, Zeile 3 auf 1
   Spalte B auf 0

0  0    . . . . .
0  1    . . . . .
0  2    . . . . .
1  3    . X . . .
0  4    . . . . .
0  5    . . . . .
0  6    . . . . .

        A B C D E
        1 0 1 1 1

im nächsten Zeitschritt

     alle Spalten auf 1   (damit wieder alle LED aus sind)
     Alle Zeilen auf 0, Zeile 3 auf 1
     Spalte C auf 0

0  0    . . . . .
0  1    . . . . .
0  2    . . . . .
1  3    . . X . .
0  4    . . . . .
0  5    . . . . .
0  6    . . . . .

        A B C D E
        1 1 0 1 1


im nächsten Zeitschritt

     alle Spalten auf 1   (damit wieder alle LED aus sind)
     Alle Zeilen auf 0, Zeile 3 auf 1
     Spalte D auf 0

0  0    . . . . .
0  1    . . . . .
0  2    . . . . .
1  3    . . . X .
0  4    . . . . .
0  5    . . . . .
0  6    . . . . .

        A B C D E
        1 1 1 0 1

im nächsten Zeitschritt

     alle Spalten auf 1   (damit wieder alle LED aus sind)
     Alle Zeilen auf 1
     Spalte E auf 0

1  0    . . . . X
1  1    . . . . X
1  2    . . . . X
1  3    . . . . X
1  4    . . . . X
1  5    . . . . X
1  6    . . . . X

        A B C D E
        1 1 1 1 0


und dann beginnt das Spiel wieder von vorne.

Nun habe ich hier natürlich gewusst, welche LED notwendig sind und wie 
daher die Ausgangsleitungen in der Zeile sein müssen.

Im Allgmeinen will ich das aber gar nicht wissen.

Ich mach mir ein 2D Array (Ich schätze dich so ein, dass du mit 
Bitbearbeitung auf Kriegsfuss stehst). Jedes Element im 2D Array steht 
für eine LED. Das 2D Array ist daher genau 7 mal 5 Einträge gross.

Ein Programmteil arbeitet das in einem Interrupt in regelmässigen 
Zeitabständen ab. In jedem Zeitschritt passiert:

   aktuelle Spalte = aktuelle Spalte + 1
   if aktuelle Spalte gleich 6 then aktuelle Spalte = 0

   Alle Spaltenleitungen auf 1
   die Zeilenleitungen auf 1 oder 0 je nachdem was die
   entsprechenden Inhalte des 2D Arrays in der Spalte 'aktuelle Spalte'
   für einen Inhalt haben
   Die Spalte 'aktuelle Spalte' durch setzen einer 0 aktivieren


Damit ist der Mechanismus fertig. du brauchst nur noch dafür sorgen, 
dass er regelmässig aufgerufen wird. Zb. mit einem Timer und einem 
Timerinterrupt.

Durch Einschreiben einer 0 oder einer 1 in das 2D Array kannst du jede 
beliebige LED ein oder ausschalten. Zb auch alle LED die ein H bilden. 
Um den ganzen Mechanismus des Mulitplexings musst du dich da dann nicht 
mehr kümmern. Der läuft dann über den Timer gesteuert von alleine im 
Hintergrund und gibt den Arrayinhalt spaltenweise auf die Matrix aus.


> mensch.... schade, dass es nirgnds ein genaues toturial darüber gibt.

Selber denken.

von Sebastian E. (der_andere_sebastian)


Lesenswert?

Schon nahe dran an der Lösung. Mit stehendem Text anzufangen ist auch 
gut. Eigentlich steht der Text immer, die Verschiebung ergibt sich nur 
im "Bildspeicher" des Mikrocontrollers. Oder man macht diesen Speicher 
größer als das Display und stellt immer nur einen Ausschnitt dar, auch 
so kann man scrollen.

Der entscheidende Punkt ist: Es wird nicht zeichenweise ausgegeben, 
jedes Zeichen besteht aus - je nach Multiplexrichtung - fünf oder sieben 
Zeilen.

Schieberegister braucht man, wenn man zeilenweise multiplext, und das 
machen die meisten kommerziellen Displays. Das Display hat dann sieben 
Zeilen, aber jede Zeile ist (Anzahl der einzelnen Displays * 5) Pixel 
lang. Das sind ganz schön viele Portleitungen, wenn man die alle 
gleichzeitig bedienen will. Also lädt man immer die Daten für eine Zeile 
in das Schieberegister, läßt die Zeile aufleuchten, macht die Zeile 
wieder aus, lädt die Daten für die nächste Zeile... Übliche 
Schieberegister für solche Zwecke (z.B. TPIC6595) haben Latches 
(Halteregister) an den Ausgängen, so daß man die nächste Zeile laden 
kann, während die erste noch leuchtet. Das ist dann ein 1:7-Multiplex, 
die LEDs können - grob gesagt - mit dem 7fachen Strom betrieben werden, 
der Displayinhalt darf nicht durch Programmabsturz stehen bleiben, sonst 
leiden die LEDs nach ein paar Sekunden.

Die schäbige Alternative bei eher kurzen Displays ist, spaltenweise zu 
multiplexen. Dabei braucht man kein Schieberegister, aber 
leistungsstarke Treiber. Warum? Es leuchten in diesem Fall nur sieben 
untereinanderliegende LEDs gleichzeitig, gemultiplext wird dann über 
alle Spalten des Displays. Das kann dann schnell 1:40 und mehr sein, 
also die LEDs wären nur ein vierzigstel der Zeit an. -> schlechter 
Wirkungsgrad, EMV-Probleme durch hohe Pulsströme, wenn die Ansteuerung 
stehenbleibt, ist die gerade leuchtende Spalte futsch.

Noch ein Tip: Es gibt hier im Forum ein paar Beispiele zur Ansteuerung 
eines VQC10 Displays. Das ist zwar ein Spezialfall, da ein kleiner Teil 
der Ansteuerlogik (zeichenweise Adressierung, die gibt es beim 
Standard-Punktmatrixdisplay nicht) im Display integriert ist, aber das 
gezeigte Prinzip des Multiplexens ist auf jeden Fall übertragbar.

von Meckermensch (Gast)


Lesenswert?

>> mensch.... schade, dass es nirgnds ein genaues toturial darüber gibt.
>Selber denken.

Und besser schreiben! Wundert mich das überhaupt jemand hilft, 
eigentlich schade, denn so wird man den Leuten nie beibringen 
(einigermaßen - Nobody is perfect) richtig zu schreiben.

von Zehn V. (langerblitz)


Lesenswert?

okay, jetzt habe ich es endgültig verstanden. (:

ich danke nochmals herzlich!

wie sieht das denn dann bei zB 25 spalten aus? müssen dann alle 25 
spalten (5 module) einezeln hintereinander angesteuert werden? 
logischerweise ja. aber wie siehts dann mit dem flimmern aus? ich könnte 
jede spalte maximal 1ms lang auf high lassen, da sonst die maximale 
wartezeit (periode) für jede spalte 25ms überschreitet. das sind schon 
weniger als 50 hz. und noch weniger bedeutet flimmern.

aber nein, das hängt natürlich auch noch von der zahl der überhaupt 
benutzen spalten ab. bei dem buchstaben I würde ich zB nur 3 spalten 
brauchen, die leeren spalten könnte man ja praktisch überspringen. würde 
man jetzt also trotzdem die maximale on-zeit von 1ms einhalten, würde 
sich die multiplexfrequenz stätig und abhängig von der anzahl der 
benutzten spalten ändern.

ich habe nun bestellt. werde das also ersteinmal mit einer stehenden 
schrift versuchen. wie das mit den schieberegistern funktinoieren wird, 
weiß ich noch nicht so recht...

von Sebastian (Gast)


Lesenswert?

Die Überlegung zum Timing ist richtig. Tatsächlich hat man beim 
1:25-Multiplex nur etwa eine Millisekunde Leuchtzeit für eine Spalte, 
wenn die Bildwiederholrate vernünftig sein soll.
Und ja, dann müssen alle 25 Spalten nacheinander angesteuert werden, 
alles andere wird von der Verdrahtung her schnell unübersichtlich und 
von der Programmierung her erst recht.
Nun geht es ans Eingemachte. Datenblatt der Anzeigen kontrollieren: Wie 
hoch darf der Strom sein, wenn die LEDs eine Millisekunde lang belastet 
werden und dann 24 Millisekunden abkühlen können? Manche Hersteller 
geben Diagramme zur Impulsbelastbarkeit an. Ansonsten schätzen. Die 
Transistoren, die jede Spalte ansteuern, müssen entsprechend schnell 
sein, um die Schaltverluste gering zu halten. Man kann die 25 Spalten 
über eine Zählerkette bedienen, zum Beispiel aus drei CD4017. Die 7 
Zeilen müssen nun über entsprechende Vowiderstände für den maximalen 
Laststrom, den eine LED im Impulsbereieb verträgt, über große 
Transistoren oder MOSFETs angesteuert werden. Die Basis- oder 
Gateanschlüsse davon gehen an 7 Portleitungen des Mikros und werden 
gleichzeitig bedient, Takt und Reset der Zählerkette gehen an zwei 
weitere. Braucht 9 Leitungen insgesamt. Wer gut ist, sieht noch 
UKW-Drosseln in den Zuleitungen der Zeilen vor.
Achtung: Die Polarität der gekauften Anzeigen (also Spalten = Anode, 
Zeilen = Kathode oder umgekehrt) bestimmt, welche Seite mit N-Kanal 
("Low-Side") bzw. NPN-Bauteilen und welche Seite mit P-Kanal (oder PNP, 
"High-Side") invers anzusteuern ist.

Noch etwas: Man läßt die Frequenz konstant, unbenutzte Spalten werden 
mit Nullen belegt, aber der Takt ändert sich nicht. Alles andere würde 
ungleichmäßige Helligkeit bedeuten.

Außerdem: Zum Testen den Strom stark begrenzen, so daß die LEDs nicht 
gleich durchbrennen, wenn mal ein paar anbleiben. Im endgültigen Produkt 
möglicherweise eine Möglichkeit vorsehen, die LED-Stromversorgung 
abzuschalten, wenn der Takt für die Zählerkette ausbleibt.

von Karl H. (kbuchegg)


Lesenswert?

Sven Schmidt schrieb:

> wie sieht das denn dann bei zB 25 spalten aus? müssen dann alle 25
> spalten (5 module) einezeln hintereinander angesteuert werden?

Im Prinzip ja.

Nur dreht man dann aber um.
Dann werden nicht mehr die Spalten gemultiplext, sondern die Zeilen.

Denn man hat nur 7 Zeilen. Und da dann einen 7:1 multiplex und keinen 
25:1 mehr.

> aber nein, das hängt natürlich auch noch von der zahl der überhaupt
> benutzen spalten ab.


Du hast kein Wort verstanden.

Nein! Es hängt nicht davon ab, was man ausgeben will.
Der Multiplex Vorgang kümmert sich nicht darum! Und wenn alle LED einer 
Spalte auf aus sind, dann bedeutet das für den Multiplex Vorgang 
lediglich, dass an die Zeilenleitungen lauter 0-en auszugeben sind. Aber 
es ist ein Multiplexvorgang für eine SPalte wie jeder andere!

In einer vollkommen leeren Anzeige wird trotzdem reihum jede Spalte 
ausgegeben und angezeigt.

von Sebastian (Gast)


Lesenswert?

Ach ja, den Tip für die Kaskadierung der CD4017 (oder HEF4017), die die 
Transistoren, an denen die 25 Spalten hängen, ansteuern, wird im HEF4017 
Datenblatt von NXP auf Seite 11 unter "Application Information" 
beschrieben. Man braucht zusätzlich ein paar UND-Gatter, Die Ausgänge 
können nur NPN-Transistoren oder N-Kanal Mosfets ansteuern, also hoffen 
wir mal, daß die Displays die Spalten als Kathode beschaltet haben, 
sonst sind ein paar Inverter fällig.

relevanter Forumsbeitrag zur Kaskadierung, mit Datenblattlink:
http://www.elektrikforen.de/elektronik-allgemein/8925-zeitanzeige.html

von Hannes L. (hannes)


Lesenswert?

Schaut mal hier:
http://cgi.ebay.de/0832-LED-Dot-Matrix-Red-Display-Information-Board-NEW-/250723975981?pt=LH_DefaultDomain_0&hash=item3a6050432d
Für den Preis kann ich nichtmal den verwendeten Schaltkreis einlöten. 
;-)
Und davon lassen sich 4 Stück kaskadieren, das sind 128 Spalten bei 8 
Zeilen.

Und nein, was ganz Fertiges ist das nicht, es bleibt noch genügend 
Programmierarbeit übrig, eigene Daten für das Interface aufzubereiten.

...

von Zehn V. (langerblitz)


Lesenswert?

wenn also der multiplexvorgang nichts bestimmt, sollte man von ihm auch 
nicht den schiebetakt abhängig machen?

habe es nämlich so überlegt:
jeder buchstabe, der aus der rechten ecke heraus in die anzeige 
geschoben wird, muss EINMAL komplett gemultiplext werden, um wie bei der 
laufschrift dann um eine spalte nach links verschoben zu werden.

oder wird hier etwa mit interrupts gearbeitet?

und ich versteh das nicht mit dem zeilen multiplexen. kommt es nicht 
aufs selbe raus? man wird doch eh immer diese 25 spalten einzeln 
durchschalten müssen. sei es ein 1- oder 0-bit.

von Peter D. (peda)


Lesenswert?

Sven Schmidt schrieb:
> oder wird hier etwa mit interrupts gearbeitet?

Das Multiplexen muß ein Timerinterrupt sein!
Anders geht es nicht, das wird nur Pfusch (Flackern, extrem hohe 
CPU-Last, extrem aufwendige Programmierung).

Im Main schreibst Du den Text an die gewünschte Position im SRAM.
Im Interrupt gibst Du den SRAM aufs Display aus.

Für Laufschrift schreibst Du den Text einfach neu, aber um einen Pixel 
versetzt.
Damit die Schreibroutinen nicht ständig die Pixeladresse auf Gültigkeit 
abtesten müssen, reservierst Du im SRAM links und rechts einen 
unsichtbaren Bereich von 4 Pixeln (eine Zeichenbreite-1).


Peter

von Robin F. (gehacktes)


Lesenswert?

Hey,

wenn du mich per email kontaktierst kann ich dir alles geben und 
erklären was du für die matrix brauchst, schaltplan mit 2 matrix hab ich 
bereits fertig + layout, programm ist auch geschrieben für c wenn du 
also interesse hast kann ich es dir geben und alles erklären ;) ich habe 
das erst letzten do meiner freindin zum GB geschenkt! Ne matrix mit 
schöner laufschrift.


Mfg Robin

von Karl H. (kbuchegg)


Lesenswert?

Sven Schmidt schrieb:

> oder wird hier etwa mit interrupts gearbeitet?

Bingo

> und ich versteh das nicht mit dem zeilen multiplexen. kommt es nicht
> aufs selbe raus?

Das eine mal hast du ein Verhältnis von 25:1 das andere mal 7:1

Das eine mal glimmen die LED, das andere mal leuchten sie.

> man wird doch eh immer diese 25 spalten einzeln
> durchschalten müssen. sei es ein 1- oder 0-bit.

Die Frage ist, ob immer 25 LED nebeneinander gleichzeitig brennen oder 
nur 7 übereinander.
Wenn du in 1 Sekunde möglichst oft alle LEDs mindestens einmal ein und 
wieder ausgeschaltet haben willst, dann wird das Ziel sein, möglichst 
viele LED gleichzeitig in einem Multiplex-Durchgang zu bearbeiten. Und 
das geht nun mal dann am besten, wenn man entlang der kleineren Achse 
multiplext. Also über die 7 Zeilen und nicht über die 25 Spalten.

von Hannes L. (hannes)


Lesenswert?

Sven Schmidt schrieb:
> wenn also der multiplexvorgang nichts bestimmt, sollte man von ihm auch
> nicht den schiebetakt abhängig machen?

Ich verstehe die Frage nicht ganz.

>
> habe es nämlich so überlegt:
> jeder buchstabe, der aus der rechten ecke heraus in die anzeige
> geschoben wird, muss EINMAL komplett gemultiplext werden, um wie bei der
> laufschrift dann um eine spalte nach links verschoben zu werden.

Ich vermute noch (mindestens) ein Missverständnis. man multiplext keine 
Buchstaben, sondern Pixel. Man gibt auch keine Buchstaben aus, sondern 
Pixelzeilen oder Pixelspalten.

Dabei spielt eine große Rolle, wieviele Spalten die Anzeige hat. Sind es 
nur bis zu 15 Spalten, würde ich noch riskieren, die Spalten 
nacheinander auszugeben. Sind es (viel) mehr Spalten, dann bleibt der 
einzelnen Spalte wohl zu wenig Leuchtzeit.

Um nun vom Buchstaben zu Pixelspalten zu kommen, braucht es einen 
Zeichensatz. Per ASCII-Wert (als Index) wird der Buchstabe (Ziffer, 
Sonderzeichen, usw.) ausgewählt. Bei Spaltenmultiplex und fester 
Zeichenbreite von 5 Pixeln braucht jedes Zeichen im Zeichensatz 5 Bytes, 
also 5 Pixelspalten. Reserviert man 8 Bytes, so wird der Zugriff 
einfacher.

Schieberegister:
Beim Spalten-Multiplex wählt man mit dem Schieberegister die aktive 
Spalte aus. Also:
- alle Zeilen aus
- Schieberegister um 1 weiter takten (die 1 im Schieberegister um eine
  Position weiter schieben)
- LEDs mit neuem Bitmuster (Pixelspalte) einschalten

Sind alle Spalten durch, wird von vorn begonnen, indem dem 
Schieberegister wieder eine 1 eingeschoben wird. Das Schieberegister 
enthält also immer nur eine 1 (je nach Ansteuerung kann das auch 
invertiert sein, also eine 0 und den Rest 1en), also eine aktive Spalte.

Beim Zeilen-Multiplex ist das anders.
- alle Zeilen aus
- die komplette Pixelzeile n in das Schieberegister schieben
- die zum Zeilenbitmuster passende Zeile einschalten

Gängige Schieberegister erlauben das Laden eines neuen Wertes, während 
der alte Wert noch am Ausgang anliegt. Somit kann das Vorladen noch in 
der Hellzeit passieren, was die Dunkelzeit kurz hält:

- neue Pixelzeile in Schieberegister schieben, aber noch kein Strobe
- alle Zeilen aus
- neue Werte durch Strobe-Impuls übernehmen
- neue Zeile ein

> oder wird hier etwa mit interrupts gearbeitet?

Wenn es nicht flackern soll, muss im Timer-Interrupt gearbeitet werden.

>
> und ich versteh das nicht mit dem zeilen multiplexen. kommt es nicht
> aufs selbe raus? man wird doch eh immer diese 25 spalten einzeln
> durchschalten müssen. sei es ein 1- oder 0-bit.

Naja, einmal schaltest Du nacheinander 25 Spaltenbitmuster (je 7 Bit) 
durch, im anderen Fall 7 Zeilen-Bitmuster (je 25 Bit). Im ersten Fall 
klappert das Schieberegister nur 1 mal pro Zyklus durch, dafür leuchtet 
jede LED-Spalte nur (etwas weniger als) 1/25 der Zeit. Im zweiten Fall 
klappert das Schieberegister bei jeder Zeile einmal voll durch 
(Bitmuster der Zeile einschieben), dafür leuchtet jede LED-Zeile knapp 
1/7 der Zeit.

...

von Sebastian (Gast)


Lesenswert?

> wenn also der multiplexvorgang nichts bestimmt, sollte man von ihm auch
> nicht den schiebetakt abhängig machen?

Man kann den Schiebetakt als Bruchteil des Multiplextaktes anlegen, das 
vereinfacht die Programmierung. So nach der Devise "alle 5 
Multiplexdurchgänge (d.h. 5x25 Takte) wird der Bildinhalt eine Spalte 
weitergeschoben" oder ähnlich, das geht. Ansonsten: Natürlich 
Timerinterrupt, wie Peter Danegger richtig gesagt hat.

Die Sache mit dem Zeilen- und Spaltenmultiplexen, das sind zwei 
verschiedene Techniken. Ich versuche, das noch einmal zusammenzufassen:

Beim Zeilenmultiplex sind es sieben Zeilen, zwischen denen 
durchgeschaltet wird. Jede Zeile leuchtet ein Siebentel der Zeit. Hier 
werden Schieberegister benutzt, um die "Bilddaten" einer Zeile zu 
halten.
Dieses Verfahren ist effizienter und wird in Industrie und Technik 
bevorzugt.
Der Multiplexzyklus läuft in Y-Richtung, also von oben nach unten.

Beim Spaltenmultiplex wird zwischen 25 Spalten umgeschaltet, jede Spalte 
leuchtet ein Fünfundzwanzigstel der Zeit und es werden keine 
Schieberegister verwendet. Die Spalten werden stattdessen über eine 
Zählerkette angesteuert, die Daten für die Zeilen direkt durch 7 
Portleitungen ausgegeben statt in Register geschoben. Diese Methode ist 
vom Wirkungsgrad der LEDs her nachteilig. Es treten auch größere 
Stromspitzen auf.

von 8051 (Gast)


Lesenswert?

vielleicht hilft ein Video
http://www.youtube.com/watch?v=lZyc6ulpkyM

von Robin F. (gehacktes)


Angehängte Dateien:

Lesenswert?

hier einmal mein schaltplan!
Wenn der interesse an dem programm besteht melden

Mfg

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.