Hä?
Der TLC5948 hat 16 LED-Kanäle a 7 Bit.
d.h. pro IC brauchst du 112 Bit oder 14 Byte um die in den IC
einzuschieben.
Und dann macht man sich eben mal eine Zeichnung.
Ins erste Byte kommen die 7 Bit der ersten LED + das 1 Bit der zweiten
LED
Ins zweite Byte kommen die restlichen 6 Bit der zweiten LED + die ersten
2 Bit der dritten LED
Ins dritte Byte kommen die restlichen 5 Bit der dritten LED + die ersten
3 Bits der vierten LED
Ins vierte Byte kommen die restlichen 4 Bit der vierten LED + die ersten
4 Bits der fünften LED
...
Da zeichnet sich schon ein Muster ab.
1 | ByteNr welches ist die erste LED wieviele Bits welches ist die zweite LED wieviele Bits
|
2 |
|
3 | 0 0 7 1 1
|
4 | 1 1 6 2 2
|
5 | 2 2 5 3 3
|
6 | 3 3 4 4 4
|
7 | 4 4 3 5 5
|
8 | 5 5 2 6 6
|
9 | 6 6 1 7 7
|
10 | 7 8 7 9 1
|
11 | 8 9 ....
|
Zuallererst mal fällt auf, dass sich das ganze Muster nach dem 7. zu
sendenden Byte wieder wiederholt. Im Byte 7 beginnt der ganze
Zusammenbau wieder damit, dass aus der 'ersten' LED die kompletten 7
BIts zu nehmen sind, genauso wie das auch beim Byte 0 war.
Weiters fällt auf: In jeder Zeile ergibt die Summe aus den Bits der
ersten LED und den Bits der zweiten LED 8. OK, das ist jetzt natürlich
trivial, denn das muss natürlich so sein, weil ja die Bytes, die letzten
Endes ans SPI rausgehen aus 8 Bit bestehen.
Die 'NUmmer' der zweiten LED ist immer um 1 höher als die NUmmer der
ersten LED.
In jedem derartigen 7_er Paket an SPI Bytes gilt (mit ausnahme des
jeweils letzten):
Was in der vorhergerhenden Zeile die zweite LED war, ist jetzt die erste
LED.
Die Anzahl der Bits der zweiten LED in der vorhergehenden Zeile + die
Anzahl der Bits der ersten LED in der darauffolgenden Zeile ergibt in
Summe immer 7. Ist auch logisch, denn die Helligkeit jeder LED kann mit
7 Bits eingestellt werden. Da es sich dabei immer um dieselbe LED
handelt muss da logischerweise 7 rauskommen.
Viel interessanter ist auch die Beobachtung, dass sich ausnahmslos JEDES
Byte, welches per SPI rausgeht, aus den Bits 2-er Leds zusammensetzt.
Denn das gibt uns einen einfachen Angriffspunkt. Was du brauchst ist
eine "Funktion", die aus 2 LED-Bytes das SPI-Byte zusammenbaut. Wobei
sich das SPI Bytes aus 2 Teilen zusammensetzt, die aus unterschiedlichen
Bitzahlen der beiden LED-Bytes bestehen. Die erste LED kommt immer auf
die Seite des SPI Bytes, welches das MSB beinhaltet. Dazu werden von den
7 Bits des LED Bytes eine entsprechende Anzahl der unteren Bits genommen
und entsprechend nach linke zurechtgeschoben. Dassselbe mit den Bits der
jeweils 2-ten LED, nur dass hier eine entsprechende Anzahl an Bits von
oben genommen werden und entsprechend nach rechts zurechtgeschoben
werden um das SPI Byte zu vervollständigen
1 | erste LED - 1 zweite LED - 2
|
2 | +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+
|
3 | |xx| | | | | | | | |xx| | | | | | | |
|
4 | +--+--+--+--+--+--+--+--+ +--+--+--+--+--+--+--+--+
|
5 |
|
6 | | | | |
|
7 | +-------+------+ +---+----+
|
8 | | |
|
9 | nach links schieben nach rechts schieben
|
10 | | |
|
11 | +----------------------------+
|
12 | |
|
13 | SPI v
|
14 | +--+--+--+--+--+--+--+--+
|
15 | | | | | | | | | |
|
16 | +--+--+--+--+--+--+--+--+
|
17 | 1 1 1 1 1 2 2 2
|
das ist die Operation, die aus jeweils 2 Stück 7 Bit LED-Bytes 1 Stück 8
Bit SPI-Byte zurecht-pfriemelt. Die Operation wird 7 mal benötigt um aus
8 Stück 7 Bit LED-Bytes 7 Stück 8 Bit SPI-Bytes zurechtzubauen. Und die
Tabelle sagt dir welches LED-Byte und wieviele Bits davon jeweils
benötigt werden. Die Verschiebeoperationen ergeben sich daraus. Und ich
bin sicher, du findest jetzt alleine raus, um wieviele Bits jeweils nach
links bzw. nach rechts verschoben werden muss, wenn die jeweiligen
Bitzahlen gegeben sind. Wenn das nicht augenscheinlich ist, dann mal dir
ein paar Beispiele auf Bitebene auf und zähl die Dinge aus. Es ist recht
leicht zu sehen, wenn man die konkret benötigten Bits vor Augen hat.
Und da das nur 7 derartige Operationen sind, würde ich die gar nicht in
eine Schleife packen, sondern im Prinzip (mit ein wenig Makrohilfe)
genau diese Schleife selbst aufdröseln und die ausprogrammieren.
Da du jetzt nicht 1 Stück IC hast, sondern deren 4, wird das ganze dann
eben mit wechselnden Zahlen in einer Schleife 4 mal wiederholt.