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
Controller ist ein ATmega1284p, angesteuert werden die Schieberegister über den SPI
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.
Ich denke du bist auf dem Weg 'Programmieren' zu entdecken.
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 | unsigned char ledarray[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.
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.