Picbasic ile Neopiksel Led Kullanımı

Başlatan Elektronikprojem, 30 Mayıs 2019, 13:01:25

Elektronikprojem

Merhaba. Picbasicde neopiksel led kullanan oldu mu. Bir tane 16'lı halka modülden aldım çalışma prensibini araştırıyorum modülde DI girişinden nasıl bir iletişimle her ledi ayrı renklerde yakabiliyoruz?
Teşekkürler

ete

Neopixel ledlerin temelinde WS2811 veya WS2812 led kontrol entegresi bulunur.
Basic ile haberleşme yapabilmek için bu entegreleri biraz inclemek ve data alışverii ile iligli bilgi sahibi olmak gerekiyor.
Entegrenin kabul ettiği LOW bilgisi iki bitten oluşuyor. Öncelikle T0H denilen (sıfır biti HIGH zamanı süresi) kadar bir HIGH sinyali ardından T0L (sıfır biti LOW zamanı süresi) kadar bir LOW sinyali veriliyor. Bu süreler data sheet de şu şekilde verilmiş,
T0H=0,4us
T0L=0,85us

HIGH bilgisi ise T1H süresi kadar HIGH ve ardından T1L süresi kadar LOW sinyali veriliyor.
T1H=0,8us
T1L=0,45us

Normalde Data_Out pininden 0,4us lik bir High sinyali nasıl çıkartılır?
Bu o kadar küçük bir süre ki normal Pause veya Pauseus komutları ile bu gecikmelerin sağlanması mümkün değil.
O zaman ASMBLY ye müracaat etmek gerekecek. Bu durumda bir komut çevrimi sürelerine bakmak gerekiyor. En küçük bekletme komutu NOP (no operation) komutu olup ASM dili için geçerlidir.
4 Mhz osilatörü olan bir işlemcide 1 komut çevrim süresi 4/4=1mhz (kullanılabilir frekans) ve 1/1=1us olarak bulunuyor 0,4us için bu sürenin yeterli olmayacağı hemen belli oluyor. O halde bizim OSC frekansını artırmamız ve en azından 0,1us lik bir komut çevrim süresine erişmemiz gerekiyor.
Bunun için OSC frekansımız 40 Mhz olmalı. 40/4=10 ve 1/10=0,1us.lik komut çevrim süresi elde etmiş oluyoruz.
Bu durumda 0,4us lik bir gecikme yaratabilmek için
OUTPIN=1
NOP
NOP
NOP
NOP
OUTPIN=0
şeklinde bir komut dizisi vermek yeterli olacaktır.
Ancak hala bir sorun var. Komut gecikmeleride bu komutların yaratılmasında etkili olacaktır.
Bu nedenle OUTPIN=1 komutu en azından 1 komut çevrimi kadar süre harcar. Bu nedenle peşinden 4 adet yerine 3 adet hatta OUTPIN=0 komutunuda düşünerek 2 adet NOP komutu verilmesi uygun olacaktır.
Tabiiki T0L=0,85us olduğundan bu sürelerin az da olsa biraz toleransları olabileceğini düşünerek
7 tane NOP vermenin yeterli olacağını ve sonuçta 0,8us lik bir gecikme yaratılarak komutun yerine getirilebileceğini düşünüyorum.
Benzer şekilde T1H ve T1L sinyalleride oluşturularak en azından ws2811 için gerekli olan HIGH ve LOW sinyalleri oluşturulabilecektir.
Bu bilgileri oluşturduktan sonra WS2811 e bilgi nasıl ve hangi formatta gönderiliyor ona bakalım.
RGB de R=kırmızı, G=Yeşil ve B=Mavi ledler mevcut. Her birinin renk ışık şiddeti 0-255 arasında bir değerde olması gerekiyor ve Bu renk değerleri peş peşe 3x8=24 bit olarak WS2811 e verilmesi gerekiyor.
Sıralama, G7-G0,R7-R0,B7-B0 şeklinde olmalı.
Buraya kadar verdiğim bilgilere bakacak olursanız, 8 bitlik bir renk bilgisinin her bir bitinin LOW yada HIGH olma durumuna göre nasıl ikeşer bit ile verildiğini ve tek bir WS2811 e hangi sırada bu renk bilgisinin verilmesi gerektiğini açıklamış olduk.
Sistemde kaç adet led var ise o kadar sayıda WS2811 veya WS2812 vardır demektir ve yukarıda açıkladığım data bilgisi her bir ws2811 için ayrı ayrı verilmesi gerekiyor.

Öncelikle bit verme ve bu bitlerden 8 bitlik bir Byte verme alt programı hazırlanmalı ve kaç adet led var ise o kadarlık döngü kurularak bilgiler aktarılmalıdır.

Söyleyeceklerim şimdilik bu kadar.

Ete

Elektronikprojem

Tesekkur ederim hocam. Deneyip becerebilirsem buraya bilgi amacli yazilimi yukleyecegim.

ete

Biraz Daha yardımcı olayım,
Sistemin temeli 3 byte (24 bit den oluşan) RGB değerini ws2811'e göndermeye dayanıyor.
Önceden de dediğim gibi kaç adet led var ise o kadar sayıda 24 bitlik gönderme yapılmalı.
Bu nedenle 24 bitlik gönderme için bir alt program hazırladıktan sonra programın ana bölümünde led adedi kadar alt rpograma gönderme yapmak ledleri yakmak için yeterli olacaktır.
Önceden de söylediğim gibi PLL si olan bir işlemci kullanıp 10Mhz kristal ile 40 Mhz lik OSC frekansı elde edilerek bir komut çevriminin 0,1us ye denk getirilmesi gerekecektir.
Gelelim Alt programa,
RGB bilgileri LEDR , LEDG ve LEDB isimli byte değişkenlerinde tutulacak.
Şerit led işlemcide R_CIKIS, G_CIKIS ve B_CIKIS isimli pinlere bağlanmış olacaktır.

DEFINE OSC 40  'bir komut çevrimi 0,1us
LOWBITI:  'T0H=0,4us  T0L=0,85us
FOR I=7 to 0 step -1
  IF LEDR.0[I]=0 then
    R_CIKIS=1
@ NOP
@ NOP     
@ NOP
    R_CIKIS=0
@ NOP
@ NOP     
@ NOP
@ NOP    
@ NOP
@ NOP 
@ NOP
@ NOP 
   ELSE   'T1H=0,8us  T1L=0,45us
    R_CIKIS=1
@ NOP
@ NOP     
@ NOP
@ NOP    
@ NOP
@ NOP 
@ NOP
   R_CIKIS=0
@ NOP 
@ NOP
@ NOP        
@ NOP  
  ENDIF  
NEXT

FOR I=7 TO 0 STEP -1      'G GÖNDER
   IF LEDG.0[I]=0 then
    G_CIKIS=1
@ NOP
@ NOP     
@ NOP
    G_CIKIS=0
@ NOP
@ NOP     
@ NOP
@ NOP    
@ NOP
@ NOP 
@ NOP
@ NOP 
   ELSE   'T1H=0,8us  T1L=0,45us
    G_CIKIS=1
@ NOP
@ NOP     
@ NOP
@ NOP    
@ NOP
@ NOP 
@ NOP
   G_CIKIS=0
@ NOP 
@ NOP
@ NOP        
@ NOP  
  ENDIF  
NEXT   
 
FOR I=7 TO 0 STEP -1      'B GÖNDER
   IF LEDB.0[I]=0 then
    B_CIKIS=1
@ NOP
@ NOP     
@ NOP
    B_CIKIS=0
@ NOP
@ NOP     
@ NOP
@ NOP    
@ NOP
@ NOP 
@ NOP
@ NOP 
   ELSE   'T1H=0,8us  T1L=0,45us
    B_CIKIS=1
@ NOP
@ NOP     
@ NOP
@ NOP    
@ NOP
@ NOP 
@ NOP
   B_CIKIS=0
@ NOP 
@ NOP
@ NOP        
@ NOP  
  ENDIF  
NEXT  
RETURN
Bu program muhtemelen rgb kontrolcüsü için gereken zamanlara uygun data bitleri oluşturacaktır.

Şimdi gelelim Ledlerin kullanımına,
Diyelimki 18 adet led var şerit üzerinde.
Şimdi bütün ledleri kırmızı olarak yakmaya çalışalım,

LEDR=255:LEDG=0:LEDB=0
FOR W=0 to 17
   GOSUB BYTE_VER  '3 adet byte (24 bit) gönderme alt programı
   pause 10
NEXT 
   

deneme yaparsanız sonucu buraya yazmanızı rica ediyorum.
Ete

Powered by EzPortal