Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom - sterowanie diody RGB przez WS2811

*zaba* 17 Lut 2013 14:22 7302 16
  • #1 17 Lut 2013 14:22
    *zaba*
    Poziom 13  

    Witam chciałbym sie dowiedzieć jak można sterować układami WS2811, WS2801, WS2803 lub HL1606 takie które są stosowane w taśmach led gdzie można każdą diodą osobno sterować. Wiem że te HL1606 chodzą po SPI ale nie umiem znaleść informacji jakie dane wysyłać do tych układów a co z tymi WS bo mają tylko wejście DIN i SET czy ktoś sterował tymi układami w bascomie ?
    No chyba że proponujecie jakieś inne układy do sterowanie diodami RGB jakieś łatwiejsze.
    Bascom - sterowanie diody RGB przez WS2811 Bascom - sterowanie diody RGB przez WS2811

    1 16
  • #2 17 Lut 2013 14:26
    BlueDraco
    Specjalista - Mikrokontrolery

    WS2801 ma interfejs typu SPI. WS2811 ma prostszy interfejs. Opisy obu układów łatwo da się wygooglować.

    2
  • #3 17 Lut 2013 15:47
    *zaba*
    Poziom 13  

    Oczywiście googlowałem ale z racji tego że słabo znam angielski to za dużo nie znalazłem.
    Ramek ma taką postać
    Composition of 24bit data: R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0
    Czyli dajmy na to że chcemy ustawić kolor czerwony to powinno tak wyglądać 111111110000000000000000 czy dobrze myślę i wystarczy to wysłać po SPI
    Posiadam książkę "Programowanie mikrokontrolerów AVR w języku BASCOM" Marcina Wiązanie i jak patrzałem na komunikacje po SPI z przetwornikiem A/C to nie ma żadnej filozofii w tym czy do tego WS2811 wystarczy wysłać 3 bajty określające wartość wypełnienie PWM dla danego koloru czy coś jeszcze.
    Niestety nie umiem nic znaleść po polsku ani w Bascomie

    0
  • #4 17 Lut 2013 16:06
    BlueDraco
    Specjalista - Mikrokontrolery

    No patrz, do wczoraj ramek był samicą. Jak to się zmienia...

    WS2811 nie ma interfejsu SPI, ale można użyć SPI lub UART do wyrzucania do niego danych. Każdy bit dla WS2811 przesyłasz po SPI jako 4 bity. Jedynkę kodujesz jako 1100, a zero - jako 1000. Dla trybu low speed powinieneś ustawić częstotliwość transmisji na 1.6 MHz.

    0
  • #5 17 Lut 2013 17:07
    *zaba*
    Poziom 13  

    Haha oczywiście ramka miała być nie ramek :D .
    1.Aha czyli trzeba wysyłać 24 bity danych w częstotliwości 1.6MHz.
    2.Musze wysłać 4*24bity dlatego że 1 bit trzeba wysłać jako 4 bity czyli razem 96 bitów czy dobrze rozumiem
    3. Czy jeśli zdecyduję się jednak na UARTa to bity można wysyłać poprzez timer i wtedy ustawić go aby częstotliwość wynosiła 1.6MHz
    4. A czy w tej ramce nie trzeba wysyłać żadnych bitow stopów itp
    5. W takiej ramce są podane parametry koloru a jak są adresowane takie układy ?
    Wielkie dzięki za błyskawiczne odpowiedzi

    0
  • Pomocny post
    #6 17 Lut 2013 20:23
    BlueDraco
    Specjalista - Mikrokontrolery

    Prawie dobrze. 24 bity przy 400 kHz, każdy bit kodowany na czterech, czyli 96 bitów przy 1.6 MHz.

    Najłatwiej będzie do tego zaprząc SPI. Użycie UART będzie sporo trudniejsze i nie zawsze możliwe (zależy, jaki UART) - nie radzę, jeśli nie rozumiesz dobrze tego, co robi UART.

    Jak wygląda ramka - to dokładnie widać w opisie WS2811. Nic tam nie ma poza sprytnie zakodowanymi 24 bitami danych.

    Adresowanie jest b. proste, a raczej nie ma go wcale - każdy układ zjada pierwsze 24 bity, które odbierze, a następne przepuszcza dalej nie interpretując ich. Warunek - nie może być między nimi przerwy, czyli musisz zadbać o ciągłość nadawania całej sekwencji bitów dla wszystkich układów w łańcuchu.

    0
  • #7 17 Lut 2013 20:57
    *zaba*
    Poziom 13  

    Czyli aby sterować 2 układami trzeba wysłać w ciągu 48bitow pierwsze 24 do pierwszego a drugie do drugiego.
    Jeszcze nie programowałem nic na SPI ale kupie te układy i będę próbował bo rzeczywiście taka taśma led z tymi układami to dobra rzecz.
    Ale jeszcze takie wysyłanie bitów po SPI umieścić w przerwaniu aby uzyskać tą potrzebną częstotliwość czy inaczej się to robi ?
    Czy te wszystkie cenne informacje które mi podałeś znajdę w nocie katalogowej tego układu bo czytałem go po angielsku i po przetłumaczeniu no ale...
    Link

    0
  • #8 17 Lut 2013 21:01
    BlueDraco
    Specjalista - Mikrokontrolery

    SPI sam wysyła dane z ustawioną częstotliwością, trzeba tylko odpowiednio szybko wpychać w niego kolejne bajty, co na AVR nie musi być takie proste, ale daje się zrobić (w C lub asemblerze, nie w Bascom). Obawiam się, że na AVR może się tego nie dać zrobić w przerwaniu - potrzebna będzie raczej mała, dobrze napisana pętla.

    Tak, wszystko, co wiem, wyczytałem w tym właśnie dokumencie.

    0
  • #9 17 Lut 2013 22:47
    *zaba*
    Poziom 13  

    Czyli cały problem leży po częstotliwości z jaką trzeba wysyłać dane do tego układu.
    Wiesz może na jakim procesorze są zrobione fabryczne sterowniki do tych taśm led.
    Jaki byś polecał procesor aby uzyskać bez problemu taką częstotliwość po SPI jakiś ARM ??

    0
  • Pomocny post
    #10 17 Lut 2013 23:10
    BlueDraco
    Specjalista - Mikrokontrolery

    Dowolny, najmniejszy ARM Cortex M0 - STM32F05x, LPC8xx albo LPC11xx.

    0
  • #11 13 Paź 2013 15:56
    *zaba*
    Poziom 13  

    Witam ponownie z WS2803 nie miałem problemów, postanowiłem zająć się taśmą led z WS2812 z tego względu że ma tylko jedną linie danych nie ma linii zegara dane trzeba wysyłać o ściśle określonych czasach:
    logiczne 1 stan wysoki 0,7us stan niski 0,6us
    logiczne 0 stan wysoki 0,35us stan niski 0,8us.
    Jako że próbowałem w bascomie to pisać i mi się nie udawało głównie używałem instrukcji waitus to postanowiłem napisać coś w asemblerze napisałem udało mi się to ruszyć na sztywno wysyłanymi bitami. Używam atmegi8 z kwarcem 16MHz z tego względu 1 cykl trwa 0,0625us jeśli zmienię uC na inny i zastosuje 20MHz to wyjdzie mi dokładnie 1 cykl 0,05 us wiec nie będzie problemu z uzyskanie tego czasu, narazie używam atmegi z 16MHz działa.
    Mój problem dotyczy pętli którą zrobiłem w bascomie i połączyłem z asm pętli For Next a chciałbym tą pętle też napisać w asm aby policzyć ile potrzebuje cykli głownie nie wiem jak wydostać z zmiennej typu Byte poszczególne jej bity.
    Wiem że będę musiał użyć instrukcji sbis i sbic ale które jeszcze. Potrzebną literaturę dotyczącąza asemblera niedługo zamówię bo mam tylko o bascomie.
    Byłbym wdzięczny o jakiś przykład, sugestie, i podpowiedzi jak to napisać.
    Dodaje program napisany w Bascomie z wstawką asm

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #12 13 Paź 2013 16:16
    BlueDraco
    Specjalista - Mikrokontrolery

    I pomyśleć, że można to zrobić na zwykłym SPI bez liczenia cykli, wstawek asemblerowych itp. udziwnień...

    0
  • #13 13 Paź 2013 18:39
    *zaba*
    Poziom 13  

    Jak przez spi można zmienić czas pomiędzy bitami?

    0
  • #14 13 Paź 2013 20:04
    BlueDraco
    Specjalista - Mikrokontrolery

    Można nadawać każdy bit jako 3 bity z częstotliwością 2.4 MHz. Zamieniasz bajt do wysłania na 24 bity i wysyłasz po kolei 3 razy 8 bitów.

    W poniedziałek odbieram płytkę pod WS2812, za parę dni będę miał to przećwiczone.

    0
  • #15 15 Paź 2013 19:21
    *zaba*
    Poziom 13  

    Daj znać jak to opanujesz i uchyl troszkę tajemnicy jak bo próbowałem z tym SPI ale nic z tego nie wyszło

    0
  • #16 15 Paź 2013 23:25
    BlueDraco
    Specjalista - Mikrokontrolery

    Zrobione, sprawdzone, działa.
    SPI zaprogramowany na częstotliwość 2.4 MHz. Używana jest tylko linia MOSI, która jest dołączona do wejścia pierwszej kostki WS2812.

    Bit o wartości 0 jest wysyłany jako 100, a bit o wartości 1 - jako 110. Aby przesłać jeden bajt do WS2812, trzeba zamienić wartość bajtu na 24 bity.

    Ja użyłem mikrokontrolera z rdzeniem Cortex, zegarem 24 MHz i SPI zaprogramowanym na ramki 12-bitowe, w ten sposób jeden bajt przysyłam jako dwa słowa po 12 bitów.

    Ponieważ nie miałem na pokładzie DMA, trzeba było zrobić transmisję SPI na przerwaniach. Na 12 MHz uC nie wyrabiał, przy 24 MHz jest ok. Warto zauważyć, że kolejne słowa są przesyłane z częstotliwością 200 kHz. Kodowanie czwórek bitów zrobiłem na stałej tablicy, zdefiniowanej tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kiedy nie ma nic do transmitowania, są nadawane słowa o wartości 0 - w ten sposób robi się start transmisji dla WS2812. Przerwanie SPI chodzi ciągle. Prawdopodobnie wyżera ono ponad 50% czasu procesora.

    Wątpię, czy da się to zrobić na AVR, a jeśli już, to zapewne nie w Bascomie - to już nie zabawa, tu musi być spora wydajność.

    Kol. TMF zapewne zaraz opowie, jak łatwo to samo uzyskać na XMEGA. ;)

    1
  • #17 25 Kwi 2014 19:28
    maciek 222
    Poziom 10  

    Witam Żaba czy coś zrobiłem w asemblerze z tymi LED WS2812?

    Dodano po 3 [minuty]:

    Aha chyba przesadziłeś z tymi zerami w crystal :)

    0