TLC5940 Dot Correction

OP #2820495
Lesenswert?

Hi,

Ich habe Probleme mitt der Dot Correction bei einem TLC5940:

der GS mode läuft ohne Probleme.
Das settzten des DC-Registers hat aber irgendwie keine sichtbaren 
Auswirkungen, außer das alle Ausgänge verlischen.
im dem nächsten GS-Cyklus ist keine Helligkeits-Änderung sichtbar.

hier der Init Code (neben der SPI init):
1
  TLC5949_CTRL_DDR |= ( 1<< TLC5949_CTRL_DCPRG)
2
                   |  ( 1<< TLC5949_CTRL_VPRG);
3
  TLC5949_CTRL_PORT &= ~( 1<< TLC5949_CTRL_VPRG);
4
  TLC5949_CTRL_PORT |=  ( 1<< TLC5949_CTRL_DCPRG);

Im Kontext der Mainloop werden dann die dc-werte gesetzt und sollten 
nach meinem Verständnis sofort Auswirkungen zeigen:
1
      cli();  // sichern, damit die GS-Interrupts nicht dazwischenfunken
2
      TLC5949_CTRL_PORT |=  ( 1<< TLC5949_CTRL_VPRG);  // DC register anwählen
3
      uint8_t d[] = { // 16*6bit = 96bit = 12Byte
4
        0b00000000, 0b00010000, 0b10000011,   
5
        0b00010000, 0b01010001, 0b10000111,   
6
        0b00100100, 0b11000100, 0b00010101,   
7
        0b01110010, 0b01001100, 0b00111111
8
      };
9
      for(i=0; i< sizeof(d);++i){
10
        spi_sendByte(d[i]);               // register füllen
11
      }
12
      TLC5940_SPI_PORT |=  (1<< TLC5940_XLAT); // Daten übernehmen
13
      TLC5940_SPI_PORT &= ~(1<< TLC5940_XLAT); //
14

15
      TLC5949_CTRL_PORT &=  ~( 1<< TLC5949_CTRL_VPRG);  // wieder GS-Regsiter anwählen
16
      sei();  // weiter wie bisher

Ich hab auch schon probiert direkt am Anfang einfach nur die PWMs mit 
0xFFF zu initialisieren und ihm ein paar GS-Clocks zu geben, damit die 
Ausgänge angehen und dann mittels Dot Correction die Helligkeit zu 
regulieren.

Dies wäre sogar meine favorisierte Methode, da in dem aktuellen Projekt 
die 6bit ausreichen, ich dafür aber die Hälfte der Bandbreite einspare.


Hat jemand einen Tip für mich, was ich übersehe?

Gruß
Vlad
Gast #2824105
Lesenswert?

Hallo Vlad,
ich glaube mich erinnern zu können, dass Du in jedem Fall 12Bit pro 
Kanal übergeben musst.

Das bedeutet, dass Deine Matrix nicht 16*6bit = 96bit = 12Byte sondern 
16*12bit = 192bit = 24Byte sein muss.

Gruß
Frank
Persönliche Seite #2824621
Lesenswert?

Vlad Tepesch schrieb:
> Simon K. schrieb:
>> Aber es löst nicht zufällig das Problem, oder? ;-)
>
> Häh? seit wann kümmern sich ICs darum, wie die Variablen im Code heißen,
> oder was willst du damit sagen?

Nö das nicht, aber weiß der Geier, was da in deinem Code vorgeht, wenn 
da mehrere defines mit leicht unterschiedlichem Namen existieren und man 
sich wundert, warum sich nix ändert, wenn man das TLC5940-define ändert 
und in Wirklichkeit das TLC5949-define verwendet wird...
OP #2824635
Lesenswert?

Simon K. schrieb:
> Nö das nicht, aber weiß der Geier, was da in deinem Code vorgeht, wenn
> da mehrere defines mit leicht unterschiedlichem Namen existieren und man
> sich wundert, warum sich nix ändert, wenn man das TLC5940-define ändert
> und in Wirklichkeit das TLC5949-define verwendet wird...

Du hast mich misverstanden.
ich hab nur vorher die defines global umbenannt um den Modulnamen 
voranzustellen. Dabei habe ich mich wohl vertippt (9 statt 0)
(Es gibt auch gar keinen TLC5949)
Persönliche Seite #2824639
Lesenswert?

Vlad Tepesch schrieb:
> Simon K. schrieb:
>> Nö das nicht, aber weiß der Geier, was da in deinem Code vorgeht, wenn
>> da mehrere defines mit leicht unterschiedlichem Namen existieren und man
>> sich wundert, warum sich nix ändert, wenn man das TLC5940-define ändert
>> und in Wirklichkeit das TLC5949-define verwendet wird...
>
> Du hast mich misverstanden.

Was heißt hier "missverstanden"? Du bist im Moment der Einzige, der 
deinen gesamten Code angucken kann.
Es war ja nur eine Vermutung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren