avatar_Mastercodex

WS2801-WS2811-WS2812 Adreslenebilir RGB Şerit Led Kontrolü

Başlatan Mastercodex, 20 Eylül 2015, 17:12:44

Mastercodex

Merhaba Arkadaşlar,

İnternette birçok araştırma yaptım ama Picbasic ile adreslenebilir RGB ledleri kontrol etmek için kaynak bir kod yada site bulamadım. Rasberry Pi ve Arduino ile birçok kaynak olmasına rağmen Picbasic kullanıcılarının da bu konuda bilgilenmesi gerektiğini düşünüyorum.

Sonuçta iletişim protokolleri her dilde aynı şekilde çalışıyor.Sadece farklı komut ve şekillerde gönderiliyor. Bu konuda araştırma yapan arkadaşlara yardımcı olmak adına sizden gerekli yardımları bekliyorum.

WS2801
WS2811
WS2812

Yardımlarınız için şimdiden teşekkürler.
Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

Elzemefe

shiftout ile data gönderebilirsin sanırım
yalnız adres mantığı ve sıra şekli nasıl  oluşturuluyor
datasheet i tam incelemek lazım

hocam bu  linkte kodlar var ama pıc basığe çok benziyor
http://www.crazy-logic.co.uk/
https://www.youtube.com/watch?v=PNQ8R1Ptvs4

Elzemefe

Resimde  haberleşme  protokolu yazmış zaten
rgb renkleri  için sırayla  0-255 arası değerler  gönderiyorsunuz
örnek olarak

r var  byte
g var byte
b var byte
SHIFTOUT DTA,CLK,1,[r,g,b]

resimde 2. ve 3. ws için örnek data sinyalide  verilmiş
Veriyi  göndermeye başladığını an kesmeden kaç tane ws varsa diyelim ki y adet
her birinde  3 kanal led  olduğu  için  Yx3=3y  kadar değişkeniniz  olmalı
SHIFTOUT DTA,CLK,1,[3y kadar değişken buraya yazılmalı]

Dizi olabilirmi bilmiyorum çünkü 500 Mikrosaniye datayı kestiğiniz an
haberleşmeyi tekrar başlatmanız gerekiyoreğer dizi tanımlayıp
değerleri tablodan alma esnasında  500 Mikrosaniye geçmiyor ise
kod işi baya kolay  olur  ve kısa  olabilir.

yanlışım varsa affola..  kolay gelsin


oguztkn

Merhaba Arkadaşlar

Konuyu hortlatmak gibi olacak ama bu çip ile bende uğraşmakta öğrenmeye çalıştmaktayım . Herhangi bir örnek kod varsa ekleyebilir misiniz ?

ete

Bu chiplerle biraz uğraştım. Özellikle WS2811 ile. WS2801 nispeten kolay kontrol edilebilir bir chip. Normal shiftout komutu ile kod gönderilebilir ve devrede kaç adet chip var ise o kadar adet RGB değerinin bir seferde aktarılması gerekir. 500us lik bir bekleme yollanan bilginin çıkışa kilitlenmesini sağlamaktadır.

WS2811 daha farklı bir yapıya sahip. Zaman bazlı data bitleri yollanmasını gerektiriyor. Üstelik bu zaman birimleri epeyce kısa ve normal kodlarla bu işin yapılması pek mümkün değil. Kesinlikle işin içine ASM katılmasını gerektirir.
Örnek verelim, 0 biti  0,5us HIGH + 1,2us LOW pulsinden oluşmaktadır. 0,5us lik bir süre normal şartlarda 4Mhz lik OSC frekansı ile elde edilemez. Zira bir komut çevrimi 1us dir. Bize bunun yarısı gerekiyor. Bu nedenle kullanılabilecek en düşük OSC frekansı 8 Mhz olmalı. Tabiiki LOW süresine bakarsanız 1,2us gerekiyor. hadi 1 ayarlarsınız ama 0,2 için bir komut çevrim frekansının en azından 0,2us olmasını gerektirir. Bu durumda en az 20 Mhz lik bir frekans gerekecektir.
Bu frekanslarda çalışsanız bile komut gecikmeleri (ASM dekilerden bahsediyorum) süreleri etkilemektedir. Kısaca bu iş öyle sandığınız kadar kolay bir iş değil maalesef.
Sonuçta WS2811 veya WS2812 amatör işi bir entegre olmaktan çok uzaklar. ASM bilgisi gerektiriyor kesinlikle süreler komut gecikmeleride dikkate alınarak asm de hazırlanmalı ve 8 bitlik bilgi bu şekilde verilmelidir.

Her bir chip için 3 adet R-G-B byte değeri yollanması gerekiyor. Bu durumda programınız 3 byte bilgiyi bir anda vermeli ve devredeki chip sayısı kadar 3 byte da peşi sıra gönderilmelidir.
Aşağıda WS2811 için kullanmış olduğum 3 byte yollama rutini örneğini veriyorum. Bu program parçası 32Mhz lik OSC frekansından elde edilen 0,125us lik komut çevrim süresini kullanmaktadır. Ana program içinden bu alt programa gönderme yaparsanız 3 byte bilgi sisteme yollanacaktır. Kullandığım işlemci 12F1822 idi. Dahli 32Mhz osc si olduğu için tercih etmiştim.

WS2801 için bir çalışma yapmadım. Bu nedenle örnek kod veremiyorum ama arkadaşların belirttiği gibi Shiftout komutu ile 3 byte lık bilgi kolaylıkla yollanabilir.

Ete


ASM
;----------------------------------------------------------------------
;3 byte yollama rutini
;----------------------------------------------------------------------
     call BYTE_AYARLA

SEND_NEXT_R
    btfsc BYTE_R, 7;x0
    goto SEND_R_1

SEND_R_0
    ; Is '0'
    BSF LATA, 0;x0  ;2 cycle =0,250 us '32 mhzde
    NOP             ;0,375us  '0,100 ile 0,400 arası bu ok

    BCF LATA, 0;x0  ;0,25us
   
   
    GOTO KALAN_R_BITLERI

SEND_R_1
    ; Is '1'
    BSF LATA, 0;x0  ;0,250us
    NOP             ;0,375us
    NOP             ;0,5 su   0,450 ile 0,750 arası bu ok
    NOP
    NOP
       
    BCF LATA, 0;x0  ;0,25 us

KALAN_R_BITLERI
    RLF BYTE_R, f
    DECFSZ BIT_SAY, f
    GOTO SEND_NEXT_R
   
G_GONDER
        CALL BYTE_AYARLA
SEND_NEXT_G           
    BTFSC BYTE_G, 7;x0
    GOTO SEND_G_1

SEND_G_0
    ; Is '0'
    BSF LATA, 0;x0  ;2 cycle =0,250 us '32 mhzde
    NOP             ;0,375us  '0,100 ile 0,400 arası bu ok

    BCF LATA, 0;x0  ;0,25us

    GOTO KALAN_G_BITLERI

SEND_G_1
    ; Is '1'
    BSF LATA, 0;x0  ;0,250us
    NOP
    NOP             ;0,375us
    NOP             ;0,5 su   0,450 ile 0,750 arası bu ok
    NOP
   
    BCF LATA, 0;x0  ;0,25 us
 
KALAN_G_BITLERI
    RLF BYTE_G, f
    DECFSZ BIT_SAY, f
    GOTO SEND_NEXT_G

B_GONDER
        CALL BYTE_AYARLA
SEND_NEXT_B           
    BTFSC BYTE_B, 7;x0
    GOTO SEND_B_1

SEND_B_0
    ; Is '0'  1=0,25us+1,0us
    BSF LATA, 0;x0  ;2 cycle =0,250 us '32 mhzde
    NOP             ;0,375us  '0,100 ile 0,400 arası bu ok
    BCF LATA, 0;x0  ;0,25us
   
    GOTO KALAN_B_BITLERI

SEND_B_1
    ; Is '1'
    BSF LATA, 0;x0  ;0,250us
    NOP             ;0,375us
    NOP             ;0,5 su   0,450 ile 0,750 arası bu ok
    NOP
    NOP

    BCF LATA, 0;x0  ;0,25 us   
   
KALAN_B_BITLERI
    RLF BYTE_B, f
    DECFSZ BIT_SAY, f
    GOTO SEND_NEXT_B
    RETURN

BYTE_AYARLA
;    BANKSEL  PORTA
;    CLRF LATA
    MOVLW 0x8   ; Total bits to send
    MOVWF BIT_SAY
    RETURN
ENDASM

KILIT:
asm
movlw D'128' ;'1 cycle
movwf SAYAC  ;'1 cycle
BCF LATA, 0
DELAY_0
decfsz SAYAC,f ;'1 cycle
goto DELAY_0 ;'2 ycle

BSF LATA, 0
return          ;'2
endasm

END



Maxim


mehmet

İşlenmiş veri ve gönderim için 8Mips kritik kalıyor,
işin içine devamlı hesaplama da girerse 12Mips ve
üzerine çıkmak gerekiyor. WS2812b biraz daha
toleranslı. Fazla uzun olmayan şerit ledlerde
8Mips ile sıkıntısız çalışma yapılabilir diye
düşünüyorum...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Powered by EzPortal