Moin µC.net!
Ich habe mir mal die Schaltung für eine LED-Matrix
(http://www.mikrocontroller.net/articles/LED-Matrix) und ein paar
Threads dazu gelesen und verstehe das Ganze auch ganz gut, glaube ich.
Allerdings habe ich ein paar Fragen dazu:
1.
Wenn ich die LEDs an-pulse, muss der Strom ja recht hoch sein, und ich
muss die passenden LEDs auswählen. Kann dann ja auch nicht so lange
anbleiben, sonst brennt's durch. Schon klar.
Was ist aber, wenn ich einmal eine LED anschalte, und in der nächsten
Zeile aber alle 16? (soll 16x16 werden...)? Dann müsste doch der Strom
durch die einzelne LED 16mal so hoch sein, wie der durch die der
nächsten Zeile, richtig? Wie kann ich das begrenzen? Oder machen das die
Widerstände allein über das Ohmsche Gesetz?
2.
Schieberegister.
Kommt mir irgendwie total unpraktisch vor. Keine Ahnung, ob ich da was
falsch verstanden habe. Noch mal also zur Klärung:
Wenn ich zB in einem 8-bit-SR bspw. die Zahl 00000000 gespeichert habe
bzw. ausgebe, daraus aber 10101010 machen will, brauche ich wieviele
Prozessortakte? Wenn ich nicht irre, dann 24 Stück:
1 setzen, Clock hoch, clock runter, 0 setzen, wieder clock h/l, und für
die anderen 6 bits dann auch noch. Oder gibt es da effizienteres?
Überhaupt: Wenn ich mehrere S-Register hintereinanderschalte, kann ich
doch in allen immer nur das Gleiche speichern, weil der Ausgang OH*
immer den Eingangswert übernimmt. Richtig?
Bitte sagt mir, dass ich da was falsch verstanden habe...! Ich allein
verstehe es ums Verrecken nicht besser.
3.
MOSFETs.
Die npn-Transis kann ich doch problemlos durch MOSFETs ersetzen, oder?
Ich mag die einfach irgendwie lieber... g Oder brächte das hier
irgendwelche Nachteile?
Hoffe, meine Fragen sind nicht allzu seltsam gestellt und freue mich auf
ein paar klärende Antworten :)
1. LED-Matrizen sind so verschaltet, dass pro Widerstand und Zeitpunkt
eine konstante Zahl von LEDs (üblicherweise eine) angeschaltet ist.
Hängen mehr LEDs am selben Widerstand, werden die anderen zu anderen
Zeitpunkten geschaltet. Ist nicht so kompliziert wie es klingt; schau
Dir einfach eine ausgeführte Schaltung an.
2. Was tun Dir 24 Zyklen weh? Musst Du sie einzeln bezahlen? Du hast
um die 8 Millionen oder so pro Sekunde an Zyklen zu verbraten - ob Du
sie brauchst oder nicht. Für die davon, die zeitkritisch sind, gibt es
spezielle Programmiertechniken, damit Deine 24 Zyklen denen nicht in die
Quere kommen.
3. Ein MOSFET wird anders beschaltet als ein bipolarer Transistor und
benimmt sich anders. Was davon man wählt, hängt erst mal von den
gewünschten Schaltungseigenschaften und vom Preis ab und nicht davon,
was man lieber mag. Von Letzterem kannst Du Dich bei Deiner
Musikauswahl leiten lassen, nicht aber bei der Bauelementewahl.
> Dann müsste doch der Strom durch die einzelne LED 16mal so> hoch sein, wie der durch die der nächsten Zeile, richtig?
Nein. Der Strom ist immer das x-fache des Nennstroms,
mit x der Mutiplexfaktor.
> Bitte sagt mir, dass ich da was falsch verstanden habe...!
Prozessoren sind schnell, rasend schnell.
> Die npn-Transis kann ich doch problemlos durch MOSFETs ersetzen
Wenn du gerade auf DIESEN
http://www.mikrocontroller.net/articles/LED-Matrix
Schaltplan beziehst: Da gibt es viele NPN.
Die unteren kannst du durch MOSFETs ersetzn,
die senkrecht aufgereihten sind Emitterfolger und daher
nicht durch NMOSFETs ersetzbar.
Wenn die LEDs mit 5V, also derselben Spannung wie der
uC laufen, könntest du PMOSFETs nehmen und die
Ansteuerung umpolen (aus 0 wird 1 aus 1 wird 0).
Siehe
http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.8.1
für unterschiedlichste Ansteuermethoden.
Hc Zimmerer schrieb:> Was davon man wählt, hängt erst mal von den> gewünschten Schaltungseigenschaften und vom Preis ab und nicht davon,> was man lieber mag. Von Letzterem kannst Du Dich bei Deiner> Musikauswahl leiten lassen, nicht aber bei der Bauelementewahl.
Hehe, schon klar ;)
Also, ich hab da schonmal was vorbereitet: Siehe Anhang.
Das ist mal die vorläufige Schaltung, wobei ich noch keine
Schieberegister eingeplant habe. Wollte ich sowieso auf eine andere
Platine auslagern. Als MOSFET hatte ich mir den hier:
http://www.reichelt.de/?ACTION=3;ARTICLE=41142;GROUPID=2879;PROVID=2351
ausgeguckt.
Also verstehe ich richtig, dass ich dann nicht 16 "Zyklen" brauche für
einen Bildaufbau, sondern 256?
Gut, ich habe ja um die 20 Millionen mit meinem Mega644 + Quarz ;)
Könnte denn mal jemand einen Beispielcode liefern, wie man so ein
Schieberegister ansteuert? Hat doch bestimmt jemand rumfliegen...
Gruß,
euer LDer
> Also, ich hab da schonmal was vorbereitet:
Bloss hast du vergessen vorher die Beiträge und Links zu lesen.
NMOSFETs sind da falsch (und brauchen an der anderen Stelle keine
"Basisvorwiderstände" am Gate).
Der ausgesuchte MOSFET wäre auch für 320mA (Zeilen) bzw. 5.12A (Spalten)
komplett wahnwitzig unterdimensioniert, der hält maximal 0.2A aus bei
dann schon 1V Spannungsabfall.
Du wirst auch keine LEDs die offiziell 16-fachen Spitzenstrom
aushalten finden.
Eine 16x16-Matrix ist schon etwas Anderes als das Beispiel, auf das Du
Dich zunächst bezogst. Ich würde mich spätestens jetzt mit Alternativen
beschäftigen, also den schon genannten Schieberegistern oder mehreren
parallelen Matrizen. Die Ströme, die Du schnell schalten musst, werden
sonst zu unhandlich (vorausgesetzt, Du hast irgendwoher LEDs, die ihn
verarbeiten).
MaWin schrieb:> Bloss hast du vergessen vorher die Beiträge und Links zu lesen.> NMOSFETs sind da falsch (und brauchen an der anderen Stelle keine> "Basisvorwiderstände" am Gate).
Ja, ich habe die Beiträge vorher gelesen, und habe darauf gehofft, nicht
unverzüglich meine Schaltung anpassen zu müssen; dass die Folgeposter
darauf kommen, dass ich schon alles lese. Wie auch immer
Kannst du vielleicht so tun, als ständen da die richtigen Transistoren?
Danke :)
> Der ausgesuchte MOSFET wäre auch für 320mA (Zeilen) bzw. 5.12A (Spalten)> komplett wahnwitzig unterdimensioniert, der hält maximal 0.2A aus bei> dann schon 1V Spannungsabfall.
Okay, ich sehs auch. Da muss ich wohl noch mal nachschaun.
> Du wirst auch keine LEDs die offiziell 16-fachen Spitzenstrom> aushalten finden.
Also dann: Thread vergammeln lassen, Projekt eingraben und vergessen,
dass es LEDs und Elektronik gibt? klingt sehr optimistisch.
Gruß,
euer LDer
Hc Zimmerer schrieb:> Eine 16x16-Matrix ist schon etwas Anderes als das Beispiel, auf das Du> Dich zunächst bezogst. Ich würde mich spätestens jetzt mit Alternativen> beschäftigen, also den schon genannten Schieberegistern oder mehreren> parallelen Matrizen.
Da kann ich dann doch die richtigen Transistoren/Widerstände einsetzen
und dann das Controllerboard so designen, dass ich die Matrix als vier
Blöcke ansteure. Flexibel genug müsste die Schaltung dafür doch sein,
oder?
LDericher schrieb:
Und um die andere Baustelle auch noch aufzumachen
> 2.> Schieberegister.> Kommt mir irgendwie total unpraktisch vor. Keine Ahnung, ob ich da was> falsch verstanden habe. Noch mal also zur Klärung:> Wenn ich zB in einem 8-bit-SR bspw. die Zahl 00000000 gespeichert habe> bzw. ausgebe, daraus aber 10101010 machen will, brauche ich wieviele> Prozessortakte? Wenn ich nicht irre, dann 24 Stück:> 1 setzen, Clock hoch, clock runter, 0 setzen, wieder clock h/l, und für> die anderen 6 bits dann auch noch. Oder gibt es da effizienteres?> Überhaupt: Wenn ich mehrere S-Register hintereinanderschalte, kann ich> doch in allen immer nur das Gleiche speichern, weil der Ausgang OH*> immer den Eingangswert übernimmt. Richtig?> Bitte sagt mir, dass ich da was falsch verstanden habe...!
Die Prozessortakte werden sogar noch mehr sein, denn du musst ja
irgendwie auch noch entscheiden, ob da jetzt eine 1 oder eine 0 auf die
Datenleitung muss :-)
Aber:
1) µC sind schnell.
2) mit einer Hardware SPI Unit, macht das die Hardware ganz von alleine
Zwecks Kaskadierung:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister
Okay, ich habe einen Befehl gefunden, mit dem ich wenig anfangen kann:
".org $60" direkt nach einem ".dseg". Was macht das? Setzt es die
Startadresse für das Datensegment auf $60? Oder wie?
Die Schieberegister dürfte ich mittlerweile verstanden haben: Mir hat
noch die Funktion des RCK gefehlt, dane für den Link @khbuchegg: Hatte
das zwar schon gelesen, bis auf den Teil, der meine Frage geklärt hat.
;)
Weitere Frage: Wenn ich das 16er Ding als 4 parallele Matrizen behandeln
will (was von der Bechaltung ja schon möglich ist), muss ich dann 4 µCs
nehmen, oder kann ich da auch über einen drauf zugreifen? Ich befürchte
nämlich, dass ich dort 4 brauche, weil ich ja, um die Pulsströme zu
verringern, auch die Zeitkomplexität verbessern muss (also nicht n^2,
sondern n^2/4 ...?)
Gruß,
euer LDer
LDericher schrieb:> Okay, ich habe einen Befehl gefunden, mit dem ich wenig anfangen kann:> ".org $60" direkt nach einem ".dseg". Was macht das? Setzt es die> Startadresse für das Datensegment auf $60? Oder wie?
So ungefähr.
Es sagt dem Assembler, das er seine interne Bytezählung die sich durch
die OpCodes der Befehle ergeben hat vergessen soll, das nächste was
ausgegeben wird, soll auf Adresse $60 landen.
> Weitere Frage: Wenn ich das 16er Ding als 4 parallele Matrizen behandeln> will (was von der Bechaltung ja schon möglich ist), muss ich dann 4 µCs> nehmen,
du musst die Aufteilung ja nicht machen, weil der µC mit der 16*16
Matrix nicht mehr mitkommen würde.
Du musst die Aufteilung machen, weil du sonst mit dem Strom in Regionen
landest, die nicht mehr beherrschbar sind.
Dein µC ist schnell genug
(Hast du schon mal was mit µC gemacht? Du hast ständig Angst, das du mit
dem Tempo nicht hinterherkommst.
Die Dinger sind schnell! Sauschnell! Noch schneller!)
> oder kann ich da auch über einen drauf zugreifen? Ich befürchte> nämlich, dass ich dort 4 brauche, weil ich ja, um die Pulsströme zu> verringern, auch die Zeitkomplexität verbessern muss (also nicht n^2,> sondern n^2/4 ...?)
Du musst ja nicht alle 4 Untermatrizen hintereinander ansteuern. Es
spricht ja nichts dagegen, wenn alle Matrizen gleichzeitig jeweils
Spalte 0 anzeigen. Dann wird in allen 4 Matrizen Spalte 1 geladen,
umgeschaltet und dann zeigen alle 4 Matrizen gleichzeitig Spalte 1 an.
etc.
De Facto hast du einen 8-er Multiplex, der vielleicht nicht ganz
Full-Speed läuft (weil du ja 4 Spalten laden musst und nicht nur eine)
aber sagte das schon wer: Die Dinger sind schnell! Man muss es nur ein
wenig geschickt machen.
Karl heinz Buchegger schrieb:> Hast du schon mal was mit µC gemacht? Du hast ständig Angst, das du mit> dem Tempo nicht hinterherkommst.> Die Dinger sind schnell! Sauschnell! Noch schneller!
Liegt bestimmt daran, dass ich bisher nur mit Tiny13 auf CKDIV8 mit
Warteschleifen (um auch noch was sehen zu können) gemacht habe und mein
Mega644 quasi jungfräulich ist :D
Karl heinz Buchegger schrieb:> gleichzeitig
Klingt entweder nach 16-Bit-Ausgabe, oder aber nach "quasi-gleichzeitig,
weil die Dinger eben verdammt schnell sind!". Letzteres gefällt mir
besser ;)
Also heißt das, dass ich die Spannungs/Stromquelle vierteilen muss.
Richtig?
Karl heinz Buchegger schrieb:> Man muss es nur ein wenig geschickt machen.
das klingt fast nach einem "für den LDer unschaffbar". Und auch wenn's
doch nicht so gemeint ist:
Wer mich kennt, der weiß, dass ich prinzipiell dazu neige, unmögliches
vorzuhaben und es dann auch zu schaffen.
Gruß,
euer LDer
LDericher schrieb:> was von der Bechaltung ja schon möglich ist
Äh. Nein
Du musst die komplette Matrix schon aus 4 voneinander unabhängigen 8*8
Teile ansehen.
Du kannst entweder die Spalten oder die Zeilen Treiber der
Einzelmatrizen zusammenschalten und gleichzeitig ansteuern. Aber die
jeweils anderen (Zeilen/Spalten) müssen voneinander unabhängig sein.
LDericher schrieb:> Karl heinz Buchegger schrieb:>> gleichzeitig> Klingt entweder nach 16-Bit-Ausgabe, oder aber nach "quasi-gleichzeitig,> weil die Dinger eben verdammt schnell sind!". Letzteres gefällt mir> besser ;)
Hier heisst es tatsächlich gleichzeitig.
Wenn du eine extreme Zeitlupe hättest, würde man sehen, dass tatsächlich
in den Submatrizen gleichzeitig jeweils Spalte 0 leuchtet und bei allen
4 Submatrizen gleichzeitig auf Spalte 1 umgeschaltet wird.
> Also heißt das, dass ich die Spannungs/Stromquelle vierteilen muss.> Richtig?
Wenn du das meinst, was ich denke das du meinst, dann: ja
LDericher schrieb:> Karl heinz Buchegger schrieb:>> Man muss es nur ein wenig geschickt machen.>> das klingt fast nach einem "für den LDer unschaffbar".
Das wollte ich damit nicht sagen.
Was ich sagen wollte: Nicht dem ersten Augenschein nachgeben sondern
sich überlegen wie man es besser machen kann.
Karl heinz Buchegger schrieb:>> ".org $60" direkt nach einem ".dseg".> Es sagt dem Assembler, das er seine interne Bytezählung die sich durch> die OpCodes der Befehle ergeben hat vergessen soll,
Kleine Korrektur (auch wenn ich Atmels Assembler wenig kenne, wird er
sich wohl da nicht anders verhalten): da es sich um dseg (nicht um cseg)
handelt, hat sich die interne Bytezählung auf Variable bezogen (nicht
auf Opcodes von Befehlen) und die nächste Variable (nicht der
Programmzähler) wird um 0x60 nach hinten verlegt.
Karl heinz Buchegger schrieb:> Hier heisst es tatsächlich gleichzeitig.> Wenn du eine extreme Zeitlupe hättest, würde man sehen, dass tatsächlich> in den Submatrizen gleichzeitig jeweils Spalte 0 leuchtet und bei allen> 4 Submatrizen gleichzeitig auf Spalte 1 umgeschaltet wird.
Natürlich. Hab wieder das Prinzip der Schieberegister aus den Augen
verloren~
Die Eingabe der Werte in die Register erfolgt quasi-gleichzeitig, aber
das Umschalten der Werte auf die Ausgänge ist wieder parallel. Okay, ich
glaub' ich habs.
Werde mich später nochmal an den Schaltplan ranmachen und dann nochmal
ne geupdatete Version reinstellen ;)
LDericher schrieb:> Karl heinz Buchegger schrieb:>> Hier heisst es tatsächlich gleichzeitig.>> Wenn du eine extreme Zeitlupe hättest, würde man sehen, dass tatsächlich>> in den Submatrizen gleichzeitig jeweils Spalte 0 leuchtet und bei allen>> 4 Submatrizen gleichzeitig auf Spalte 1 umgeschaltet wird.>> Natürlich. Hab wieder das Prinzip der Schieberegister aus den Augen> verloren~
Darum gehts hier gar nicht.
Um 4 Stück 8*8 Matrizen anzuschliessen, müsstest du 5 Stück 8-Bit Ports
haben. Dann könntest du jeden Spalten/Zeilenanschluss direkt an den µC
hängen.
An 4 Ports stellst du den Spalteninhalt jeder Submatrix ein (über die
Zeilenleitungen) und am gemeinsamen Spaltenanschluss aller Matrizen
entscheidest du in welcher Spalte die Werte der 4 Zeilenports in jeder
Submatrix angezeigt werden sollen.
Da du aber wahrscheinlich keine 5 Stück 8-Bit Ports haben wirst, muss
man sich die eben mit Schieberegistern selbst machen. Dann reichen zb
für die 4 Stück Zeilenports lediglich 3 Ausgänge am µC und ob man die 8
Spaltentreiber direkt am µC anschliesst oder ebenfalls über die SR führt
... das muss man entscheiden, wenn feststeht was sonst noch so an den µC
ran muss. Hat man die 8 Pins, dann würde ich da kein SR dafür nehmen,
hat man sie nicht, dann kommt eben ein SR zusätzlich in die SR-Kette und
man ist weiterhin bei 3 verbrauchten Pins.
Ich habs schon verstanden, aber danke trotzdem nochmal für die Mühe ;)
Ja, genug Pins dafür sind frei, um die Spalten direkt anzusteuern, das
ist nicht das Problem. Habe 4 8-bit-Ports frei und brauche nur noch
einen Pin zusätzlich, um das Ganze über RS232 ansteuern zu können.
Soweit habe ich das schon durchgeplant.
Also heute Abend gegen 22:00h grabe ich den Thread vermutlich nochmal
aus, um mein Schaltungs-Update zu präsentieren.
Gruß,
euer LDer
Nur ne kleine alternative Sichtweise: die 4 parallelen Matrizen stell
ich mir für die Ansteuerung lieber als eine 8x32 Matrix vor. Dabei sind
die LEDs aber nicht in 8x32 angeordnet, sondern ein 8x16 Block ist unter
den anderen 8x16 Block verschoben. Sichtbar ist also eine 16x16 Matrix,
angesteuert wird eine 8x32 Matrix.
Wenn du z.B. 4 8-Bit Schieberegister hintereinander hängst und die
Steuerleitungen (bis auf den ser-eingang) parallel schaltest, verhalten
sie sich genau wie ein 32-Bit Schieberegister. 4x 8 Bit = 32 Bit rein
schieben, alle Ausgänge updaten mit RCK. Das Daten reinschieben könntest
du mit dem Hardware-SPI des Megas machen. Der kann mit bis zur halben
Taktrate des µC-Controllers, also bis zu 10MHz laufen. Das wird kaum
langsamer als wenn du direkt mit Ports rausgehst. Ist allerdings
zusätzlicher Einarbeitungsaufwand. Mir reicht das sogar für 24x32
zweifarbige LEDs in 16 Abstufungen. Der µC hat in deinem Fall also noch
ordentlich Luft.
Gruß, Alex