CCS C ile neopixel(adreslenebilir ledler) kullanımı (ws2812 protokolü)

Başlatan makine_terbiyecisi, 09 Nisan 2018, 13:28:35

makine_terbiyecisi

Yanıtlarınız için teşekkür ederim.
 
Şöyle yapsam:

Örneğin
x = 128; //0b10000000  --> Red
y = 128; //0b10000000  --> Green
z = 128; //0b10000000  --> Blue

Bunu bir pin üzerinden göndersem hangi komutu kullanacağım?
# ÖĞRENELİM, ÖĞRETELİM #

M.Salim GÜLLÜCE

Alıntı yapılan: makine_terbiyecisi - 10 Nisan 2018, 12:31:15Yanıtlarınız için teşekkür ederim.
 
Şöyle yapsam:

Örneğin
x = 128; //0b10000000  --> Red
y = 128; //0b10000000  --> Green
z = 128; //0b10000000  --> Blue

Bunu bir pin üzerinden göndersem hangi komutu kullanacağım?
Komut kullanmak çok doğru bir soru değil.
bir pini çıkış portu olarak tanımlayıp bir bekleme aralığı için zaman döngüsünü kullanacaksın.
sağdaki bitlerden başlayarak önce R sonra G sonra B renklerini 0 1 2 3 4 5 6 7 inci bitleri göndereceksin.
göndermeyi şöyle yapacaksın.
-bekleme zaman döngüsü en kısa pals için gereken süre kadar dönecek.
-1 için haberleşme portunu HI yapıp bekleme portunu 2 defa üstüste çağıracaksın. geri dönüşünde portu LOW Yapacaksın. yeniden çağıracaksın. HI ve LOW süreleri 2xHI + 1xLOW olmuş olacak.
-0 için ise tersini yapacağız 1xHI + 2xLOW sürelerinde olacaklar.
gödereceğin bitlerin ne olduğunu bilmen gerekecek yani.

bunuda 8 bit için yaptığında bayt yada renk-Data gönderme rutini haline getirirsen...
RGB için 3lüğ denetim yaparsan...
renkleri yazıp subrutini çağırmak kalır geriye

çıkacak dalga şekli datasheet 4. sayfadaki gibi..

makine_terbiyecisi

# ÖĞRENELİM, ÖĞRETELİM #

omereliusuk


makine_terbiyecisi

# ÖĞRENELİM, ÖĞRETELİM #

omereliusuk

en az 64mhz lazım. pwm yoluyla kullanacaksınız. geçmiş zaman 18f46k22 (64mhz/4=16mhz)veya daha yüksek bir işlemci ile pwm kanalıyla sürmüştüm. başlangıçta çok yormuştu. sonra güzel oldu.

makine_terbiyecisi

Led sayısı fazla olamayacağı için sorun teşkil edeceğini düşünmüyorum. Yoksa yanılıyor muyum.
Bildiğim kadarıyla ki siz projeyi gerçekleştirmişsin eminim benden daha deneyimlisiniz fakat led sayısı az olursa bence pic o kadar hıza gerek duymaz.

Siz ne düşünüyorsunuz?
Çalışmanızı biraz daha detaylandırır mısınız?
# ÖĞRENELİM, ÖĞRETELİM #

omereliusuk

hocama bir tane bile led yakamadım. sonra anladım ki önemli olan ne kadar uzun olduğu değil ne kadar işlevsel olduğu :). hızınız müsaitse isterseniz milyon tane yakın sorun yok. hızınız müsait değilse 1 tane bile led yakamazsınız.

makine_terbiyecisi

:D

Hangi protokol üzerinden denediniz mi? WS2812 mi yoksa eski protokol mü?
# ÖĞRENELİM, ÖĞRETELİM #


mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

ertuğrul54

merhaba belki işinizi görebilir

#include <18F4550.h>
#device ADC = 16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                  //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT              //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=48000000,crystal=20000000)

#define NeoPin PIN_E0
#define NeoNum 60
#define RAND_MAX 64
#define ALL_OUT 0x00
#define ALL_IN  0xFF
#byte PORTA = 0xF80

#include <stdlib.h>

unsigned int8 NeoGreen [NeoNum];
unsigned int8 NeoBlue [NeoNum];
unsigned int8 NeoRed [NeoNum];

void NeoBit (int1 Bit)
{
  if (Bit == 1)
  { output_high (NeoPin); delay_cycles (6); output_low (NeoPin); } // delay_cycles (3); // Bit '1'  
  else
  { output_high (NeoPin); delay_cycles (3); output_low (NeoPin); } // delay_cycles (6); // Bit '0'  
}
void NeoInit (void)
{
  unsigned int8 NeoPixel;
  for (NeoPixel = 0; NeoPixel < NeoNum; NeoPixel++)  
  {
      if (NeoPixel < 10)
        { NeoGreen[NeoPixel] = 0; NeoBlue[NeoPixel] = 0; NeoRed[NeoPixel] = 64; }
      else if ((NeoPixel >= 10) & (NeoPixel < 20))
        { NeoGreen[NeoPixel] = 0; NeoBlue[NeoPixel] = 64; NeoRed[NeoPixel] = 0; }
      else if ((NeoPixel >= 20) & (NeoPixel < 30))
        { NeoGreen[NeoPixel] = 0; NeoBlue[NeoPixel] = 64; NeoRed[NeoPixel] = 64; }
      else if ((NeoPixel >= 30) & (NeoPixel < 40))
        { NeoGreen[NeoPixel] = 64; NeoBlue[NeoPixel] = 0; NeoRed[NeoPixel] = 0; }
      else if ((NeoPixel >= 40) & (NeoPixel < 50))
        { NeoGreen[NeoPixel] = 64; NeoBlue[NeoPixel] = 0; NeoRed[NeoPixel] = 64; }
      else if ((NeoPixel >= 50) & (NeoPixel < NeoNum))
        { NeoGreen[NeoPixel] = 64; NeoBlue[NeoPixel] = 64; NeoRed[NeoPixel] = 0; }      
  }
}
void NeoDraw (void)
{
  unsigned int8 NeoPixel;
  signed int8 BitCount;
  for (NeoPixel = 0; NeoPixel < NeoNum; NeoPixel++)
  {    
      for (BitCount = 7; BitCount >= 0; BitCount--)      
        NeoBit(bit_test(NeoGreen[NeoPixel], BitCount));      
      for (BitCount = 7; BitCount >= 0; BitCount--)          
        NeoBit(bit_test(NeoRed[NeoPixel], BitCount));            
      for (BitCount = 7; BitCount >= 0; BitCount--)      
        NeoBit(bit_test(NeoBlue[NeoPixel], BitCount));      
  }
  output_low (NeoPin);
}
void NeoRotate (void)
{
  unsigned int8 NeoPixel;  
  for (NeoPixel = 0; NeoPixel < NeoNum - 1; NeoPixel++)  
  {          
      NeoGreen[NeoPixel] = NeoGreen[NeoPixel + 1];
      NeoBlue[NeoPixel] = NeoBlue[NeoPixel + 1];
      NeoRed[NeoPixel] = NeoRed[NeoPixel + 1];
  }
  NeoGreen[NeoNum - 1] = NeoGreen[0];
  NeoBlue[NeoNum - 1] = NeoBlue[0];
  NeoRed[NeoNum - 1] = NeoRed[0]; 
}
void main()
{  
  NeoInit ();  
  while(true)
  {      
      NeoDraw ();
      NeoRotate ();
      delay_ms (25);
  }
}

makine_terbiyecisi

Onu bende gördüm fakat değişme olmuyor. Benim kullandığım ledler eski tip galiba. Çünkü ledler 3'lü gruplar halindeler. Ondan kaynaklanıyor olabilir.
# ÖĞRENELİM, ÖĞRETELİM #


makine_terbiyecisi

Sanırsam öyle. Ama üstünde entegre yok. İlk baştaki entegre 4 bacaklı ve üstünde entegre var.
Sonraki iki tane led ise 3 bacaklı.
# ÖĞRENELİM, ÖĞRETELİM #