APA 106 neopixel benzeri 5mm RGB LED

Başlatan MC_Skywalker, 04 Şubat 2020, 16:44:42

MC_Skywalker

Bilgisayar kasamda ki fanlar üzerindeki 5mm LED'leri RGB ile değişemek için aliexpress ten neopixel alayım dedim lakin satıcı neopixel yazdığı hâlde LED chip'i WS2812 değilmiş.

Neyse ürün postaya verilmiş. Daha önce bu APA106 RGB LED ile PBP kullanarak çalışma yapan oldu mu?
https://cdn.sparkfun.com/datasheets/Components/LED/COM-12877.pdf


ete

Bir bakayım dedim nedir bu ama karşıma yalnızca 1 sayfalık bir bilgi formu çıkıyor. Data sheet yapma zahmetine bile katlanmamışlar ne hikmet ise. Bir çok yerde birebir eşdeğer deniyor ama zamanlamaları farklı WS serisi ile. Ama shift registerli led denildiğine göre sürme mantığı aynı olmalı.
Tek sorun o 1 sayfalık bilgi formunda verilen bit zamanlarının ne kadar doğru oldukları ve toleranslarının olup olmadığı.
Bir shift registeri Data girişinden data ve clokck girişinden CLK girerek nasıl sürüyorsan bunuda öyle süreceksin.
Ancak HIGH ve LOW bitleri ikişer bitle ifade ediliyor ve süreleri o bilgi formunda gösterilmiş.
Doğru dürüst bir data sheet bulursan link ver yada buraya koyda birlikte bakalım detaylarına.

Ete

MC_Skywalker

Hocam datasheet'i yok bunu da sparkfun hazırlamış :(
fellik fellik bilgi arıyorum. LED'ler gelsin önce bir neopixel gibi deneyeceğim bakalım.

ete

Prensip aynı olmalı farklı olması imkansız bence. Temel prensipler şunlar.
Her bir led için 3 ad byte yollayacaksın. Kaç ad led var ise o kadar 24 byte yollayacaksın. Her ne kadar adreslenebilir denilsede seri ledler içinde yalnızca birine bilgi yollanamıyor. Yollamak için o lede kadar olan ledlerin bilgilerini yeniden vermen gerekiyor.
3 byte ın hangisi Red hangisi G hangisi B belli değil ama deneyerek kolaylıkla bulursun.
Her bir ledin parlaklık değeri min sıfır max 255 olacak.
Bir kaç alt program gerekiyor.
Birincisi high_ver , ikincisi Low_ver
Üçüncüsü Byte_yolla.
High_ver kısmında data sheet deki bit zamanlarına uygun bir high biti verme işlemi olmalı. Benzer şekilde low biti verme işlemide ayarlandıktan sonra, Byte verme kısmında standart bir değişken adı mesela TEMP kullanılarak değişken değerindeki bitlerin high yada low olmalarıma göre sırası ile ilgili bit verme alt bölümlere gönderilerek bytebilgisi yollanmalıdır. Tabiiki byte verme kısmına gelmeden ilgili renk değeri temp eeşitlenerek renk bilgileri yollanmalıdır.
Diyeceklerim bu kadar fazlası gerekirse yardımcı olmaya çalışırım.
Ete

MC_Skywalker

#4
Yanlış anlamadıysam bu LED de kesinlikle neopxiel ile aynı çalışıyor sadece 1 ve 0 zamanlaması farklı.
Basit bir neopixel kodu yazmaya başladım. 12f675'i kristalsiz 4Mhz (elimde 20Mhz xtal yok :()çalıştırıyorum. Zamanlamayı tuturmak biraz uğrştıracak.

MC_Skywalker

Kodu yazdım ama sabit renkten başaka birşey yok. tırmalarken kafam iyice karıştı. fikir verebilecek olan varmı?

'*********************************************************************
'*  Name    : 12F675RGB.pbp                                          *
'*  Author  : MC_Skywalker                                           *
'*  Notice  : Copyright (c) 2020   MC_Skywalker                      *
'*          : All Rights Reserved                                    *
'*  Date    : 05.02.2020                                             *
'*  Version : 1.0                                                    *
'*  Notes   : requred licensed version of PBP                        *
'*          : 3.0.10.3 Silver edition                                *
'*          : 5mm Difuse RGB LED APA 106 IC included                 *
'*********************************************************************
'* APA 106  0 ---> 0.35us high 1.36us low
'* APA 106  1 ---> 1.36us high 0.35us low
'* APA 106  Reset ---> 50us low
'*********************************************************************
#CONFIG
  __config _WDT_OFF & _MCLRE_ON & _CP_OFF
#ENDCONFIG

Define OSCCAL_1K 1
DEFINE OSC 4
DEFINE NO_CLRWDT 1  'Bekci kopegini temizle
'*************************SABITLER*************************************
APA_NUM         CON 8
'*************************DEGISKENLER**********************************
APA_KIRMIZ      var byte[APA_NUM]
APA_YESIL       var byte[APA_NUM]
APA_MAVI        var byte[APA_NUM]
APA_PIKSEL      var byte
APA_PIKDEGER    var byte
'*************************ATAMALAR*************************************
APA_PIN         VAR GPIO.2         'Pin 5
'*************************KURULUM**************************************
Clear               'RAM sil

ANSEL = 0
WPU = 0
TRISIO.2 = 0        'APA pini

APA_PIN=0

GOSUB APAKurulum

'*************************ANA PROGRAM***********************************
anaprogram:

  gosub APAPikselDose
  gosub APAPikselDondur
  
  pause 50
  goto anaprogram
end

APAKurulum:
'8 LED için ilk degerler
    for APA_PIKSEL = 0 to (APA_NUM -1)
    
        if APA_PIKSEL < 2 then
            APA_YESIL[APA_PIKSEL] = 0
            APA_MAVI[APA_PIKSEL] = 0
            APA_KIRMIZ[APA_PIKSEL] = 64
            
        elseif APA_PIKSEL < 4 then
            APA_YESIL[APA_PIKSEL] = 0
            APA_MAVI[APA_PIKSEL] = 64
            APA_KIRMIZ[APA_PIKSEL] = 0
            
        elseif APA_PIKSEL < 6 then
            APA_YESIL[APA_PIKSEL] = 64
            APA_MAVI[APA_PIKSEL] = 0
            APA_KIRMIZ[APA_PIKSEL] = 0
            
        else 
            APA_YESIL[APA_PIKSEL] = 64
            APA_MAVI[APA_PIKSEL] = 64
            APA_KIRMIZ[APA_PIKSEL] = 64
        endif
        next
        return
            
APAPikselDondur:   
    for APA_PIKSEL = 0 to (APA_NUM -1)
        APA_YESIL[APA_PIKSEL] = APA_YESIL[APA_PIKSEL + 1]
        APA_MAVI[APA_PIKSEL] =  APA_MAVI[APA_PIKSEL + 1]
        APA_KIRMIZ[APA_PIKSEL] = APA_KIRMIZ[APA_PIKSEL + 1]
    next
    
    APA_YESIL[APA_NUM - 1] = APA_YESIL[0]
    APA_MAVI[APA_NUM - 1] = APA_MAVI[0]
    APA_KIRMIZ[APA_NUM - 1] = APA_KIRMIZ[0]
    
    return
                  
          
APAPikselDose:            
    for APA_PIKSEL = 0 to (APA_NUM -1)
        APA_PIKDEGER = APA_YESIL(APA_PIKSEL)
            if  APA_PIKDEGER.7 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.6 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.5 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.4 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.3 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.2 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.1 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.0 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
        APA_PIKDEGER = APA_KIRMIZ(APA_PIKSEL)
            if  APA_PIKDEGER.7 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.6 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.5 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.4 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.3 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.2 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.1 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.0 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
    
        APA_PIKDEGER = APA_YESIL(APA_PIKSEL)
           if  APA_PIKDEGER.7 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.6 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.5 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.4 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.3 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.2 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.1 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
            if  APA_PIKDEGER.0 = 0 then
                APA_PIN = 1
                  asm
                    nop
                  endasm
                APA_PIN = 0    
            else
                APA_PIN = 1
                  asm
                    nop
                    nop
                    nop
                  endasm
                APA_PIN = 0
            endif
        
    next
    return
            


ete

4 Mhz osc frekansı ile bu iş kesinlikle olmaz.
1 komut çevrimi (cycle) 1us iken sen nasıl 0,35us lik süreyi elde edeceksin? Mümkün değil.
Unutma sana 0,35us lik bir süre ve 1,36us lik bir başka süre (gecikmeler) gerekiyor.
Bunları yaratatabilmen için 1 komut çevriminin en azından 0,35us olması daha da iyisi bu değerin çok altında olması gerekir.

Bu kadar karmaşık program yerine yalnızca tek ledi bile sürecek basit bir program yaz bence.
Bende uğraşacağım en uygun süreyi verecek bir OSC frekansı yakalamak lazım.
1/0,35=2,857143  2,857143*4= 11 Mhz lik OSC yaklaşık olarak bu değeri veriyor ama bence en az 32 Mhz osc frekansı ile çalışmak gerekir.
32/4=8 ve 1/8=0,125us lik komut çevrimini kullanacak olursak
3 adet NOP=0,375 us eder ki 150 ns lik toleransla birlikte bu değer rahatlıkla kullanılabilir.
Bu durumda;
LOW biti için ; çıkış HIGH yapılıp ,3 adet NOP kadar bekleyip çıkış LOW yapılacak ardından + 10 ad. NOP  kadar beklenecek. KOmut gecikmeleri biraz etkin olabilir bu durumda High için 2 adet ve LOW için 8 adet gibi değerlerle deneme yapmak gerekir.

HIGH biti için ; Çıkış HIGH yapılıp 10 adet NOP ve ardından çıkış LOW ve 3 adet NOP yapılacak.

Bu iki bit çıkışlarını alt program haline getirirsen byte bilgisini buradaki bitlerle yapıp işi kıvırmak lazım gelir.
İşlemci olarak 16F1825 veya 12F1822 uygun göüküyor. 675 ile bu iş olmaz.

Ete
Ete

MC_Skywalker

#7
Elimde en hızlı 12MHz xtal vardı onunla denedim. 20Mhz lik xtal bulmak gerek. ayrıca kodu düzeltmeliyim.


ete

20 Mhz de pek uygun değil gibi.
20/4=5 ediyor ve 1/5=0,2us ediyor. 2 tane NOP kullansan 0,40us eder, Diğer süre 1,26 için 7 adet kullansan 1,4 us eder. Belki toleransla kurtarır. Denemeden bilinmez.
Bence en uygunu 32 Mhz oluyor. Dahili OSC+PLL ile 1825 veya 1827 veya 1822 hepsi olur.

Ete

MC_Skywalker

#9
18F2550 ile deneyeceğim. Yeni nesil PIC ler için lisans yetmiyor 1825, 1827. 1822 ler silver edition de yok gold editon da var.

4Mhz xtal + PLL (HSPLL)ve /CPUDIV3 ile 32Mhz oluyor gibi. bir deneyeyim

MC_Skywalker

#10
programı yeniden düzenleyip yazdım ama çalıştırmadım. kafam iyice çorba oldu. biraz ara vereyim. ilgilenmek isteyenler için kaynak kodlar ekte.


https://drive.google.com/open?id=1V6yEStxrkjXJuAhZ4FUg1uMYQMjfk-lZ

NOT:
Kod da PIC18F config kısmı pbp version  3 e göre yeni şekilde yazılmıştır sizi yanıltmasın. hata yoktur.

#CONFIG
   CONFIG  PLLDIV = 1
   CONFIG  CPUDIV = OSC2_PLL3
   CONFIG  FOSC = HSPLL_HS
   CONFIG  MCLRE = ON
   CONFIG  CPD = OFF
#ENDCONFIG

ete

Bu kez ben bir örnek yazdım.
Senin program formatın üzerine oturttum eksikleride tamamladım.
Bu işlemcide Komparatör mevcut ayrıca analog pinler default açılıyor. Onları kapatmak gerekir.
Her ne kadar o pinleri kullanmasakda sorun çıkmasın istedim.

Öncelikle bu yolladığım dosyayı bir dene . Umarım 32 Mhz ayarların doğrudur. İşlemci biraz karışık. 8Mhz osc si var ve PLL nin açılması gerekiyor.
Yazdığın programı da inceledim. Hala hatalar var.
En önemli hata ise Bir ve SIfır bitlerini düzgünce tanımlayamamışsın.
Ne diyor data sheet HIGH (1) biti için; APA 106  1 ---> 1.36us high 0.35us low bunları sen yazmışsın zaten. Yanlış değil. Peki senin uyguladığın 1 bitine bakalım;
APA_PIN = 1
asm
    nop
    nop
    nop
    nop
    nop
    nop
    nop  
endasm
APA_PIN = 0
BIR biti iki parçadan oluşuyor ve sen yalnızca bir parçasını ayarlamışsın.
Birinci parça 1,36us lik HIGH ve ardından ikinci parça olarak 0,35 us lik LOW sinyali olması gerek.
Benim programda bunların doğru şekillerini görebilirsin.
Verdiğim program 10 adet led de sabit bir renk oluşturacak. Kırmızı=128, Yeşil=255 ve Mavi=128 şeklinde uyguladım ne renk çıkar bilemiyorum. Gerekirse değiştirirsin.
BU aşamadan sonra sistem çalışırsa sen kendi programını bu bit ve byte verme mantığına uygun olarak düzeltebilirsin. Zamanlama önemli bu işte. O nedenle 32Mhz lik işlemci frekansından emin olmak gerek. Dahili OSC si ile PLL çalışmıyor gibi bir intiba edindim acaba doğrumudur?.

Ete

MC_Skywalker

#12
Hocam verdiğiniz kodalrı MCU yükleyip denedim aşağıdaki gibi bir görüntü oluştu. LED'nin gerçek zamanlama bilgileri datasheet te verilenlerden farklı yada benim MCU veya xtal sıkıntılı.



https://i.postimg.cc/RZ74bDbg/IMG-2626-1.jpg

ete

Görüntüyü göremiyorum. Linkde bir sorun olsa gerek.
Elinde başka işlemci yokmudur?. Direk hex dosyasını verceğim için derleme sorunun olmayacak.
12F1822 veya 16F1827 gibi bir şey olursa süper olurdu.

Ete

MC_Skywalker

Lojik analzör ile baktım 32MHz yaptığımız 18F2550 dan bir sinyal çıkmıyor.

12Mhz lik 12f675 ten aşağıdaki sinyal çıkıyor. zamanlama konusuna iyice bir bakayım.



https://i.postimg.cc/vmqwR7Qx/screenshot.png

Powered by EzPortal