Forum: Mikrocontroller und Digitale Elektronik TLC5940 Dot Correction


von Vlad T. (vlad_tepesch)


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

von Vlad T. (vlad_tepesch)


Lesenswert?

push (sorry)

von weiß nicht genau (Gast)


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

von Vlad T. (vlad_tepesch)


Lesenswert?

im Datenblatt steht eindeutig:
> When VPRG is set to VCC, the TLC5940 enters the dot correction
> data input mode. The length of input shift register becomes 96 bits.

von Simon K. (simon) Benutzerseite


Lesenswert?

Einmal schreibst du TLC5949 und einmal TLC9540?!

von Vlad T. (vlad_tepesch)


Lesenswert?

Simon K. schrieb:
> Einmal schreibst du TLC5949 und einmal TLC9540?!

oh, der Typo ist mir noch nicht aufgefallen.
Hatte letztens erst ein paar Namen refactored, da scheint das mit 
reingeraten zu sein.
Soll aber natürlich 5940 heißen

von Simon K. (simon) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> Simon K. schrieb:
>> Einmal schreibst du TLC5949 und einmal TLC9540?!
>
> oh, der Typo ist mir noch nicht aufgefallen.
> Hatte letztens erst ein paar Namen refactored, da scheint das mit
> reingeraten zu sein.
> Soll aber natürlich 5940 heißen

Aber es löst nicht zufällig das Problem, oder? ;-)

von Vlad T. (vlad_tepesch)


Lesenswert?

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?

von Simon K. (simon) Benutzerseite


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

von Vlad T. (vlad_tepesch)


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)

von Simon K. (simon) Benutzerseite


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.

von Vlad T. (vlad_tepesch)


Lesenswert?

Simon K. schrieb:
> Was heißt hier "missverstanden"? Du bist im Moment der Einzige, der
> deinen gesamten Code angucken kann.


Ja, ich bin grad dabei, das ganze mal auf das notwenigste einzudampfen

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.