Forum: Mikrocontroller und Digitale Elektronik 257-bit SPI-Register Algorythmus


von Alex E. (alex_e)


Lesenswert?

Hallo,

habe den LED Driver TLC5948A 7x in Reihe geschaltet habe(SOUT->SIN).
Dieser Treiber hat ein SPI-Register von 257-bit.
Nun stehe ich vor der Aufgabe einen 257-bit also 33-byte die ich im 
Buffer liegen habe so in die 7x 257-bit zu schieben, das die an der 
richtigen Stelle stehen. Also die 257-bit in allen LED-Treibern zu 
vervielfältigen.
Da ich das nicht jeden Tag machen, bitte ich hier um Unterstützung.

hier mal mein nicht funktionierende Idee als Codeausschnitt:
1
              shiftCount = 1;
2
              data = 0;
3
              byte = 0;
4
              for(driver=0; driver<7; driver++)
5
              {
6
                data |= ((u16)MessageReceive.data[byte++]) << shiftCount;
7
                globalData = data;
8
                SendDataLED((u8)(data >> 8));
9
                globalData = data;
10
                data <<= 8;
11
                globalData = data;
12
                for(i=0; i<31; i++)
13
                {
14
                  data |= ((u16)MessageReceive.data[byte++]) << shiftCount;
15
                  globalData = data;
16
                  SendDataLED((u8)(data >> 8));
17
                  data <<= 8;
18
                }
19
                // shiftCount auf 8 begrenzen
20
                if (shiftCount == 0)
21
                  shiftCount = 8;
22
                if (shiftCount = 1)
23
                {
24
                  data |= ((u16)MessageReceive.data[byte] & 0x01) << --shiftCount+8;
25
                  globalData = data;
26
                  SendDataLED((u8)(data >> 8));
27
                  data <<= 8;
28
                  byte = 0;
29
                }
30
                else
31
                  data |= ((u16)MessageReceive.data[byte] & 0x01) << --shiftCount+8;
32
                  byte = 0;
33
                
34
              }

Bin für jede Hilfe dankbar...

: Bearbeitet durch User
von Alex E. (alex_e)


Lesenswert?

globalData hab ich nur fürs debuggen gebaucht ;-)

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Alex E. (alex_e)


Lesenswert?

Karl Heinz Buchegger schrieb:
> 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.

Viele Dank für diese Antwort. Das ist sicher nicht in 5 Minuten 
geschrieben.

Ne stimmt nicht ganz, der hat 17LED-Kanäle a 16-Bit plus einem 
"Latch-Select-Bit". und damit sind das 32,125byte...
Wenn es eine grade Byteanzahl wäre....
Aber so muss ich ja am Anfang zum großen Teil ein fast leeres bzw. 
nutzloses bit reinschieben...und deis abhänig von den in Reihe 
geschaltenen Treiber....

Aber ich werde mal versuchen, es per Makro zu lösen.

Für tipps wäre ich aber weiterhin dankbar.

PS: Ich kann dem IC TLC5948A kein Datenblatt zufügen. Es kommt ein 
Fehler.

: Bearbeitet durch User
von Hagen R. (hagen)


Lesenswert?

Alex E. schrieb:
> Ne stimmt nicht ganz, der hat 17LED-Kanäle a 16-Bit plus einem
> "Latch-Select-Bit".

er hat 16 Kanäle a 16 Bit plus 1 Bit am Anfang des Datenstromes zur 
Selektierung in welches interne Shiftregister diese Daten geschoben 
werden.

Ich würde es also so machen:

Loopstart:
- 1. Bit per BitBanging manuell raussenden
- SPI aktivieren
- 2x16 Bytes an RGB Daten rausschieben
- SPI deaktivieren
- nächsten 32 Bytes Block auswählen
- springe Loopstart 7 mal

Nicht sehr schön aber im Vergleich zu dem Aufwand die RGB-Daten Bitweise 
auf 7*257 Bits aufteilen zu wollen immernoch besser.

Gruß hagen

von Karl H. (kbuchegg)


Lesenswert?

Hagen Re schrieb:
> Alex E. schrieb:
>> Ne stimmt nicht ganz, der hat 17LED-Kanäle a 16-Bit plus einem
>> "Latch-Select-Bit".
>
> er hat 16 Kanäle a 16 Bit plus 1 Bit am Anfang des Datenstromes zur
> Selektierung in welches interne Shiftregister diese Daten geschoben
> werden.

Tschuldigung.
Ich war ein wenig in Eile und hab den Titel des Datenblattes nicth genau 
genug gelesen
1
16-Channel, 16-Bit, ES-PWM LED Driver with Full Self-Diagnosis
2
for LED Lamp with 7-Bit DC and 7-Bit Global BC

Daher die Fixierung auf 7 Bit

von Hagen R. (hagen)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hagen Re schrieb:
>> Alex E. schrieb:
>>> Ne stimmt nicht ganz, der hat 17LED-Kanäle a 16-Bit plus einem
>>> "Latch-Select-Bit".
>>
>> er hat 16 Kanäle a 16 Bit plus 1 Bit am Anfang des Datenstromes zur
>> Selektierung in welches interne Shiftregister diese Daten geschoben
>> werden.
>
> Tschuldigung.
> Ich war ein wenig in Eile und hab den Titel des Datenblattes nicth genau
> genug gelesen
>
1
> 16-Channel, 16-Bit, ES-PWM LED Driver with Full Self-Diagnosis
2
> for LED Lamp with 7-Bit DC and 7-Bit Global BC
3
>
>
> Daher die Fixierung auf 7 Bit

Ist ja auch korrekt, jenachdem wie das 1. Bit gesezt wird entscheidt es 
sich danach welche Daten man senden muß. Und die Dot-Correction arbeitet 
mit 7 Bit breiten Daten.

Ich bezog mich auf die 17 Kanäle vom Alex, es sind nur 16.

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.