tlc5920 16x8 led driver/controller

David Belohrad david na belohrad.ch
Úterý Srpen 28 09:20:54 CEST 2018


A to je prave vec, ktera mi neni jasna. Proc by tomu tak melo byt, kdyz TLC5920 obsahuje posuvny registr a latch. Takze do posuvneho to posouvam, a pak pulsem na LATCH zapisu ta data z registru do latche a muzu vesele dal pouzivat posuvny registr bez omezeni, protoze data, ktera 'vidi' led jsou ta z latche. Nebo ne?



Pavel Hudecek <edizon na seznam.cz> writes:

> Jo a ten BLANK tady samozřejmě bude potřeba, protože jinak bude docházet k 
> prosvítání při přepínání multiplexu. Zhasnout, změnit data, přepnout COM a 
> rozsvítit.
>
> PH
>
> -----Původní zpráva----- 
> From: Pavel Hudecek
> Zkusil bych se buď podívat osciloskopem, jak to na těch COM vypadá, nebo to
> pustit tak pomalu, aby bylo vidět co to dělá.
>
> Pokud by nebyl problém s polaritou COM, tak před pár lety jsem se
> ochomejtnul okolo něčeho s jiným TLC59.. (neměl COM, jen 16 výstupů) a tam
> měli problém, že na velké desce SCLK vesele clockoval i na odrazy hran. A
> měl taky BLANK a ten vypínal výstupy, ale už si nepamatuju, zda ho bylo
> potřeba používat.
>
>
> -----Původní zpráva----- 
> From: David Belohrad
> A cim vice se divam na ten datasheet, tim mene tomu rozumim.
>
> Na strane 3 je uvedeno ze jak S[15:0] tak COM[7:0] jsou VYSTUPY, ovsem na
> nasledujici strane je napsano ze low-level output current na COM0-7 je
> 640mA, a high-level output current na S[15:0] je -30mA. Pro me to znamena,
> ze S[15:0] je v podstate current sink, a tudiz moje diody ve schematu jsou
> zapojeny obracene (doufam, ze neurazim prilozenym schematem). Za
> predpokladu, ze 'cathode common' je to co si myslim, tak bych mel schema mit
> dobre. Diody sviti, takze predpokladam, ze by mely byt zapojene spravne.
>
> Jsem zmaten a ocenim jakekoliv komentare. Pro uplnost prikladam
> systemverilog implementaci toho kontroleru. (pozn: data_ib indexy nejsou
> jeste ve spravnem poradi, ale na implementaci to nic nemeni)
>
>
>
>
>
>
>
>
> import CKRSPkg::*;
>
>
> module tlc5920
>   #(
>     // clock divider. Set to zero when ClkRs_ix provides 40MHz
>     // stream. For all faster clocks give division ratio to get to
>     // lower speeds
>     parameter   g_divider  = 4
>     )
>   (
>    // 40 MHz clock reset stream
>    input   ckrs_t ClkRs_ix,
>    // data input. Logic '1' turns the particular led on (= emits
>    // light). The vector data are as follows:
>    // [row][column][red/green]
>    input logic [1:0][15:0][3:0] data_ib,
>    // interface to the chip
>    display_x display
>    );
>
>    // clock enable
>    logic enable, latchdly1, latchdly2, latch;
>    logic sclk = 0;
>
>    // counting 32bits to be shifted in one go into both registers
>    localparam CBITS = 7;
>    logic [CBITS-1:0] counter_b = '0;
>    logic frame, subframe;
>    logic [63:0] hipart_b, lopart_b;
>
>    // column selector
>    logic [2:0] csel_b3 = '0;
>
>    // first we get clock enable out of division, get maximum speed,
>    // which is 10MHz. This is clock into serial register
>    clock_divider
>      #(.g_divider(g_divider))
>    i_clock_divider
>       (.enable_o(enable),
>        .*);
>
>    // simple counter to count the states
>    always_ff @(posedge ClkRs_ix.clk)
>      if (enable)
>        counter_b <= counter_b + (CBITS)'(1);
>
>    // always present clock
>    always_ff @(posedge ClkRs_ix.clk)
>      if (enable) sclk <= ~sclk;
>
>    // latching is every 16bits, extend
>    // pulse into SCLK domain, which is twice slower
>    always_ff @(posedge ClkRs_ix.clk)
>      if (enable) begin
> if (~(|counter_b[4:0]))
>   latchdly1 <= 1;
> else
>   latchdly1 <= 0;
> latchdly2 <= latchdly1;
> latch <= latchdly1 | latchdly2;
>      end
>
>    // frame is 4 16-bit cycles, two independent data outputs
>    // for each driver separately
>    always_ff @(posedge ClkRs_ix.clk)
>      if (enable) begin
> if (~(|counter_b))
>   frame <= 1;
> else
>   frame <= 0;
>
> if (~(|counter_b[3:0]))
>   subframe <= 1;
> else
>   subframe <= 0;
>      end // if (enable)
>
>    // chip-selects (resp driver selects). The driver is set such, that
>    // 16bits correspond to two-chip data (odd bits on com0,2,4... even
>    // bits on com1,3,5,7)
>    always_ff @(posedge ClkRs_ix.clk)
>      if (enable)
>        if (subframe && frame)
> // with frame coming in we start to load the data into col0
> // and 1, hence csel has to be two behind such, that on next
> // latch we get values for csel 0 and 1
> csel_b3 <= 3'd6;
>        else if (subframe)
> csel_b3 <= csel_b3 + 3'd1;
>
>
>    // every frame we have to load the input data into shift register:
>    logic [1:0][63:0] data_b = '0;
>    always_ff @(posedge ClkRs_ix.clk)
>      if (frame && enable)
>        data_b <= data_ib;
>      else if (sclk && enable) begin
> data_b[0] <= {1'b0, data_b[0][63:1]};
> data_b[1] <= {1'b0, data_b[1][63:1]};
>      end
>
> // assignments:
>    assign display.blank_o = '0;
>
>    always_ff @(posedge sclk)
>      display.latch_o <= latch;
>
>    // separate two data in streams. all other signals are common for
>    // both chips
>    always_ff @(posedge ClkRs_ix.clk)
>      if (enable) begin
> display.data1_o <= data_b[0][0];
> display.data2_o <= data_b[1][0];
> display.csel_ob3 <= csel_b3;
>      end
>
>    // invert clock to position data transitions wrt negative
>    // edges. this makes timing margin and should work even with crappy
>    // lines
>    assign display.sclk_o = ~sclk;
>
>
>    initial begin
>       $display("Size of input vector: %d", $bits(data_ib));
>
>    end
>
>
> endmodule // tlc5920
>
>
> David Belohrad <david na belohrad.ch> writes:
>
>> Ahojte,
>>
>> ma prosim nekdo zkusenosti s tl5920?
>>
>> www.ti.com/lit/ds/symlink/tlc5920.pdf
>>
>>
>> nevim jak spravne formulovat muj dotaz. ... nefunguje to a asi nerozumim, 
>> jak to ma fungovat. Datasheet je velice skoupy na informace. a at delam co 
>> delam, led matrix zobrazuje hovadiny. Vyrobil jsem kus systemverilog kodu, 
>> ktery dava 'blank' signal trvale na log. L. Necham vzdy do 16 bitoveho 
>> registru nacist pro dany radek tu 16-bitovou informaci, po kazdych 16 
>> bitech vytvorim puls na LATCH (transision L->H->L), a na kazdych 16-bitech 
>> cykluji csel vzdy dvakrat (tedy mezi dvema latch impulzy ma csel hodnotu 
>> 0,1 pak 2,3 pak 4,5), a tedy jeden 'frame' vyzaduje 4x latch - celkove 64 
>> bitu poslanych na kazdy frame, ktery cykluje csel od nuly do sedmi.
>>
>> Kdyz to spustim a divam se na data na SIN/SOUT, vsechno vypada perfektne, 
>> logicky. Ovsem diody si delaji co chteji. nektere z nich slabe sviti, 
>> nektere silne, skoro to vypada, jako kdyby nebyl dostatecny proud tema 
>> diodama, nebo dochazelo k nejakemu mixu mezi logikou CSEL pinu a seriove 
>> linky. Napada me jenom, ze signal BLANK proste z nejakeho neznameho duvodu 
>> musi byt take pouzivan. Ja jej mam trvale na nule, protoze chci mit ty 
>> diody neustale zapnute.
>>
>> Tak me napadlo, nema k tomuto driveru nekdo kod napsany pro ... cokoliv? 
>> arduino/jakykoliv mikrokontroler, abych si mohl proverit jestli casuji jak 
>> mam? K cemu je BLANK?
>>
>> ztratil jsem s tou hovadinou cely den 
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list