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:
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.
oder einfach gefragt: WAS heißt multiplexen genau? ich habs schon so oft gegoogelt und nichts verstanden...
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
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. ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.