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.
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.
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:
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.
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.
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!
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.
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.
>> 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.
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...
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.
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.
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
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.
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
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
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.
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.
...
> 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.