Hallo,
ich hab mir eine LED-Matrix bestehend aus 256 LEDs gebaut.
Die Zeilen (2x8) werden über Schieberegister angesteuert, die Spalten
über Konstantstromsenken, ebenfalls mit Schieberegister.
Jetzt hab ich aber das Problem, dass ich eine Funktion schreiben muss,
die es erlaubt, mehr als nur eine LED gleichzeitig anzusteuern.
(für eine LED bereits entwickelt)
Ich hab mir deshalb überlegt, dass ich der Funktion ein Array übergebe,
indem die Nummern jeder einzelnen LED gespeichert sind, jetzt aber die
Frage, ist das bei 256 LEDs wirklich noch klug so zu machen? oder geht
das nicht auch einfacher?
Eine Möglichkeit wäre doch sicher ein komplexes Mathematisches Modell zu
entwickeln und die Informationen erst zu verschlüsseln und dann wieder
entschlüsseln :D
Viele Grüße
HeyHey
HeyHey schrieb:> Jetzt hab ich aber das Problem, dass ich eine Funktion schreiben muss,> die es erlaubt, mehr als nur eine LED gleichzeitig anzusteuern.> (für eine LED bereits entwickelt)
ich verstehe nicht was du machen willst.
Das einfachste ist doch eine globales Array anzulegen. Wenn die LEDs nur
ein und aus geschaltet werden können kann man das als bits ablegen.
Die funktion ändert dann in den globalen Array die passende stelle. Im
Hintergrund arbeitet dann die TimerISR und gibt das array ständig über
die Schieberegister aus.
Kannst du auch die helligkeit pro led selektieren ? Dann 8x8x8bit also
256 bytes fuer 256 leds mit 256 werte helligkeit
Oder wenn die helligkeit nicht pro led einzustellen ist dann 8x8bit also
8 bit innsgesammt.
HeyHey schrieb:> Hallo,>> ich hab mir eine LED-Matrix bestehend aus 256 LEDs gebaut.> Die Zeilen (2x8) werden über Schieberegister angesteuert, die Spalten> über Konstantstromsenken, ebenfalls mit Schieberegister.>> Jetzt hab ich aber das Problem, dass ich eine Funktion schreiben muss,> die es erlaubt, mehr als nur eine LED gleichzeitig anzusteuern.> (für eine LED bereits entwickelt)
Ich denke du bist auf dem Weg 'Multiplexing' zu entdecken.
Deine Funktion die du 'für eine LED bereits entwickelt' hast, kannst du
dabei auf den Müll werfen. Mit der kommst du nicht weiter. Dein ganzer
Ansatz dazu taugt dann nichts.
mein Problem ist nicht das Ansteuern der LED Matrix an sich sondern das
Problem wie ich am Effizientesten die Paraneter für das Abbild auf den
256 LEDs übergebe die in 16x16 angeirdnet sind. Es können halt
theoretisch alle 256 leds angesteuert werden...
Erstelle dir ein PAP mit den Schritten, die Du nacheinander auszuführen
hast. Wenn der Algorithmus mit dem PAP klar ausformuliert ist, dann
erstellst du deinen Programm-Code nach dem PAP.
Am besten Du legst dir ein globales Array an. Oder lokal in Main und
übergibst einen Zeiger auf das Array an deine Funktionen. Für LED an/aus
sind es 2 Byte pro Zeile und 16 Zeilen. Da wären 32 Byte.
1
unsignedcharledarray[16][2];// 16 Zeilen á 2 Byte
Das Array arbeitest du dann in einer for-Schleife von [0..15] ab.
Wann Du welche Schieberegister füllst darfst du selbst herausfinden. Das
PAP und eine Skizze der LED-Matrix sind da hilfreich.
HeyHey schrieb:> mein Problem ist nicht das Ansteuern der LED Matrix an sich sondern das> Problem wie ich am Effizientesten die Paraneter für das Abbild auf den> 256 LEDs übergebe die in 16x16 angeirdnet sind. Es können halt> theoretisch alle 256 leds angesteuert werden...
Jetzt mal Karten auf den Tisch.
Was ist der Zweck des ganzen?
Willst du eine Art 'Bild' auf die Matrix klatschen? Wenn ja, dann mach
dir eine Beschreibung für ein ganzes Bild, zb 16 Stück uint16_t in einem
Array, wobei jedes Bit für eine LED steht.
Willst du aber in der Mehrzahl der Fälle nur einzelne LED ein/aus
schalten, dann machst du dir eben Funktionen dafür um eine einzelne LED
im Matrix-Speicher ein/auszuschalten.
Effizienzbetrachtungen von APIs muss man immer mit dem Hintergrund der
zu erwartenden Verwendung machen.
Im übrigen bin ich immer noch nicht davon überzeugt, dass dir klar ist,
wie eine Matrix-Multiplex Ansteuerung arbeitet. Dazu erzählst du viel zu
viele Details die für die reine Argument Passing Sache irrelevant sind,
die dir aber anscheinend trotzdem im Kopf rumspuken.
Wenn ich dich mal beim Wort nehme, dann geht es einzig und alleine
darum, in einem Array von Bytes (dem Bildspeicher) Bits zu setzen und
die Frage ist, wie beschreibt man die zu setzenden Bits je nach
Anwendungsfall ohne allzuviel Aufwand.
Aber: in dubio pro reo.
HeyHey schrieb:> Es können halt> theoretisch alle 256 leds angesteuert werden...
Auch praktisch, nennt sich Multiplexen.
Die Frage ist allerdings, ob Du beim Aufbau der Treiberstufen ans
Multiplexen gedacht hast.
Bei 1:16 Multiplex brauchst Du nämlich den 16-fachen Impulsstrom durch
jede LED, damit sie gleich hell ist, wie bei statischer Ansteuerung.
die Schaltung ist aufs Multiplexen ausgerichtet, maximaler Strom der
übern Treiber fließen kann sind 100mA, der Plan sieht jedenfalls vor,
ultrahelle blaue LEDs mit 3000 bis 5200mCd zu nehmen und die nur mit
etwa 5mA zu betreiben.
Die Frage und das was ich ehrlich gesagt nicht weiß ist, ob 750mCd
immernoch sehr hell sind oder nicht
HeyHey schrieb:> Die Frage und das was ich ehrlich gesagt nicht weiß ist, ob 750mCd> immernoch sehr hell sind oder nicht
wirklich Helle LEDs werden nicht in mCd angegeben, sondern in Lumen.
1cd sind ja so hell wie eine Kerze in etwa 2 Meter Entfernung, laut
Wikipedia.
die 5mA sind als Mittelwert pro LED gemeint, was ja bei 100mA des
Treibers und 1:16 klappen sollte.
Kann man das dann wirklich so sagen, dass man bei einer LED die bei 20mA
3cd besitzt bei einem Mittelwert von 5mA auch ein viertel der Helligkeit
besitzt, ich schätze mal des ist doch eher eine Hyperbelkurve und
schwankt von LED zu LED ganz gewaltig?
Gruß
HeyHey
HeyHey schrieb:> Kann man das dann wirklich so sagen, dass man bei einer LED die bei 20mA> 3cd besitzt bei einem Mittelwert von 5mA auch ein viertel der Helligkeit> besitzt
So ungefähr stimmt das schon.
Irgendwann ist nach oben natürlich Schluss, weil dann die LED nicht mehr
kann und kaputt geht.
Da spielt allerdings dann auch die Kennlinie des Auges mit rein, welches
kleinere Helligkeitsvariationen bei hellen Gegenständen weniger stark
wahrnimmt als bei dunklen.
Sprich eine Änderung des PWM Wertes (8 Bit PWM) von 1, um von 5 auf 6 zu
kommen, nimmt man als starke Änderung wahr, während dieselbe absolute
Änderung von 253 auf 254 praktisch für einen Menschen nicht mehr
wahrnehmbar ist.
> ich schätze mal des ist doch eher eine Hyperbelkurve und> schwankt von LED zu LED ganz gewaltig?
Natürlich sind 2 LED nie exakt gleich. Aber wenn das ein riesengroßes
Problem wäre, dann hätten alle die, die eine LED-Matrix bauen ein
enormes Problem.
Aber: Warum probierst du es nicht einfach im Vorfeld mal aus?
Kabel eine LED an deinen µC, leg eine 1:16 PWM an den Portpin (wenn geht
mit der Frequenz, die dann auch das Multiplexen haben wird) und sieh
nach, wie hell die LED dann noch ist. Nichts einfacher als das. Dazu
muss die Matrix noch nicht aufgebaut sein.
das sind die Daten zu den LEDs, die ich mir eigentlich ausgesucht hab,
noch nicht gekauft und nicht verlötet.
Haltet ihr die für geeignet?
Der maximal mögliche Mittelwert wäre 6,25mA.
HeyHey schrieb:> Haltet ihr die für geeignet?
Der Ausschnitt zeigt doch nur die relative Helligkeitsänderung.
Allerdings haben die Dinger lt. Beam Pattern einen Abstrahlwinkel von
+-15° für 50% Intensität, d. h. die Matrix wird einen relativ
eingeschränkten Sichtbereich haben.
HeyHey schrieb:> die Schaltung ist aufs Multiplexen ausgerichtet, maximaler Strom der> übern Treiber fließen kann sind 100mA
Wenn Du die Zeilen multiplext, liegen die Spalten parallel an.
Können die Spaltentreiber 100mA, müssen die Zeilentreiber 1,6A können.
Es können ja alle 16 Spalten in einer Zeile an sein.
Der effektive Strom je LED ist dann 100mA / 16 bzw. 1,6A / 256.