Forum: Compiler & IDEs 256 verschiedene LEDs, wie am klügsten an Funktion übergeben


von HeyHey (Gast)


Lesenswert?

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

von HeyHey (Gast)


Lesenswert?

Controller ist ein ATmega1284p, angesteuert werden die Schieberegister 
über den SPI

von Peter II (Gast)


Lesenswert?

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.

von Patrick C. (pcrom)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von zebra (Gast)


Lesenswert?

Ich denke du bist auf dem Weg 'Programmieren' zu entdecken.

von Falk B. (falk)


Lesenswert?

SIehe LED-Matrix

von HeyHey (Gast)


Lesenswert?

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

von PAP (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von HeyHey (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von HeyHey (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von HeyHey (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Patrick (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.