Merhaba, sağlık problemleleri sebebi ile uzun bir süredir hiç bir şey ile ilgilenemedim. Bu arada teknoloji ilerlemeye devam etti ve bir zamanlar forumlarda bir nisan şakası konusu olan akıllı LED ler piyasaya çıktı.


   Amatör elektronikçiler arasında hızla popüler olan bu küçük canavarların ARDUINO severler arasında öne çıkması dikkatimi çekti.


   Konuyu ARDUINO - PICMICRO şekllinde takım çekiştirmesine dönüştüren kullanıcıları hiç bir zaman anlamadım, muhtemelende anlamayacağım. Çünkü ARDUINO Atmel tabanlı bir geliştirme/Eğitim kartı, PICMICRO ise bir marka. Yıllardır süregelen bu tartışmaya bulaşmadan beni bu yazıya yönelten noktalara geçeyim.


   WS2812B LED i aslında LED değil. WS2812 bizzat bir LED kontrol çipi. Bu çipi çeşitli RGB LED ler içine entegre eden üreticiler kolay kullanılabilen LED dizileri yaratma imkanı sunmuşlar. Ancak bu çipin haberleşme protokolü -internet dedikodularına göre- tam bir kabus!


   ARDUINO kullanıcıları hazır kütüphaneler sayesinde (Çoğunlukla FastLed) bir kaç dakikada çok gösterişli sonuçlar alabiliyorlar. PIC kullanıcıları ise söylentilere kanıp bu çip ten uzak duruyorlar. Çünkü PIC için hazır bir kod kütüphanesi yok, olmasıda mümkün değil çünkü ARDUINO bir tane (Tamam birden fazla ama birbirlerine uyumlular), PIC ise binlerce farklı modele sahip!


   Bu çip lerin kabus diye bahsedilen problemleri zamanlamadan ibaret. Amatörler arasında yaygın kullanılan 4mHz hızdaki PIC ler ile gerekli zamanlamayı tutturmak mümkün değil. Ama nedense kimse nasıl oluyorda ARDUINO da sorun olmuyor diye düşünmüyor. Sorun olmuyor çünkü ARDUINO ATMEGA383P tabanlı. Bu işlemci 16mHz hızında! Yani 16 kat hızlı. Elma ile Portakalı karşılaştırdıklarını farketseler, uygun PIC i kullansalar sorun kalmayacak ama öyle olmuyor.


   Teknik detaylarla yazıyı uzatmadan sonuca geleyim. 20mHz ve üstünde çalışabilen HERHANGİ bir PIC ile WS2812B yi çalıştırabilirsiniz. Kaç LED e kumanda edebileceğiniz ise PIC in RAM ına bağlı. Programınızın kullandığı RAM dışında her led için 3byte lık RAM a ihtiyacınız var.


   Peki bu işi ARDUINO ile yapabiliyorken neden PIC ve çeşitliliği ile uğraşalım?

  1. Fiyat: Kendinize oyuncak yapıyorsanız sorun yok ama son ürünü ticariye çevirmek isterseniz her ışıltılı LED dizisi için 85(Orijinal)-20(Çin klon) TL yerine 5-7 TL harcamak daha mantıklı değilmi?

  2. Boyut: LED ler pek yer kaplamadığına ve bunlarla yapacağınız nesnelerde pek devre sığdıracak alan olmadığına göre, 8 bacaklı bir PIC ile yapabileceğiniz projeye sigara paketi kadar bir devreyi sığdırmaya çalışmakta nesi? Nano modeli bile yaklaşık kibrit kutusu kadar, 8 bacaklı yüzey montajlı PIC 5mm e 4mm!

  3. Tatmin: Yüzlerce kişinin yıllar boyu çalışarak hazırladığı kütüphaneyi kullanarak kod yazacaksanız işin eğlencesi nerede? Sürünün içinde az daha farklı bir koyun olmakmı, çobanlar kulübünde kahve höpürdetmekmi daha keyifli?

  4. Bilgi: Nasıl çalıştığını bilmediğiniz kütüphane algoritmalarına bağlı kalmak yerine konuyu anlayarak, ihtiyaçlarınıza uygun geliştirmeyi öğrenerek bir şeyler yapmak amatör ruhlara daha uygun değilmi?


   Gelelim detaylara, WS2812B nin dökümanları yeterli değil ve zamanlama detayları yanlış. Bu yüzden aşağıdaki kodda belirtilen zamanlama ile uyuşmuyor ancak koddaki zamanlama osiloskop ile ölçülen gerçek değerlerdir. WS2812B seri olarak gelen ilk 24 bit i alır ve bit geldikçe sonraki WS2812B ye aktarır. Bit lerin devam ettiğini anlayabilmesi için her bit HIGH ve LOW olmak üzere 2 parçadır. 50uS den uzun LOW sinyali algılarsa WS2812B bit akışı bitti kabul eder. Dökümanlarına göre bu işlem çok hassas zamanlama gerektirir. Öyleki 1 Bit 1.25uS sürmelidir. Bit in değeri sıfır ise en az 0.4uS boyunca HIGH, 0.85uS boyunca LOW olmalıdır ancak bu süreler +-150nS toleranslıdır!. Aynı şekilde Bit in değeri 1 ise 0.8uS HIGH ı takiben 0.45uS LOW olmalıdır ve bu sürelerde +-150nS toleranslıdır!


   Kafa karıştırıcı değilmi? Pratikte bu değerlerin hiçbiri işe yaramamaktadır! Bit ister bir ister sıfır olsun LOW süresi 50uS nin altında olduğu sürece her değerde olabilir. HIGH sinyali 0.5uS nin altında ise Bit sıfırdır, 0.5uS ile 0.9uS arasında ise Bit 1 dir.


   Bu durum işimizi kolaylaştırıyor, şöyleki, 5mHz de iki komutun arası 0.2uS sürüyor. Yani Portu HIGH yapıp bir sonraki satırda LOW yapmak Bit=sıfır diyebilmek için yeterli. Bu andan itibaren bir sonraki bit i okuyup göndermeye hazırlanmak için 49.8uS vaktimiz var!


   Bit = 1 için ise Portu HIGH yapıp sonrasında bir kaç NOP (No Operation) komutuyla yaklaşık 700nS oyalanıp portu LOW yapmak yeterli. Ve hala geriye işlem yapacak koca bir 49.3uS miz kalıyor! Bu LOW zamanları 50uS yi geçmediği sürece ne kadar sürdüğü önemli olmadığı için sonraki bit leri hesaplamak sorun olmuyor. WS2812B ye verinin bittiğini anlatmak için ayrıca bir şey yapmaya gerek yok. Son işlem Portu LOW a çekmek olduğu için Porta hiç bir işlem yapmadan başka işlerle uğraşmak yeterli oluyor.


   PIC lerde mimarileri gereği bir komut 4 birim işlemci zamanı sürer. Yani 4mHz lik PIC 4/4 = 1mHz, 20mHz lik PIC 20/4 = 5mHz hızındadır. (Dikkat edin hala ARDUINO nun 16mHz ine yetişemedik)


   WS2812B nin çok sıkışık zaman gereksiniminden dolayı kod assembler ile yazılmak zorunda. Kullanıcılara öcü gibi gözüksede assembler zor bir dil değil. Aşağıdaki kod kendi içinde yeterli açıklamaya sahip, bu yüzden genel çalışma şeklini anlatacağım.


   İletişim yani WS2812B chip inin sürülmesi işini Interrupt rutini içinde yapıyoruz. Interrupt TIMER1 i kullanıyor. Kolaylık olsun diye TIMER1 i öndeğerle falan yüklemiyoruz, 65535 e kadar sayıyor, sıfır olunca PIC Interrupt rutinine atlıyor ve RAM da bulunan RGB değerlerini (WS2812B bu değerleri GRB sırasıyla istiyor) WS2812B lere aktarıyor. TIMER1 in skalası 2:1 e ayarlı. Yani işlemcinin saati 2 saydığında TIMER1 1 artıyor. Bu ayar ile 5mHz lik PIC saniyede yaklaşık 38 kez bu işlemi yapıyor (ingilizce dokümanlarda frame/sec e karşılık gelir, Amerika için makbulü 30 frame/sec, Avrupa için 25 frame/sec dir.)
   Kullandığım PIC in RAM ı 64byte. 7 Byte ını yazılım kullanıyor kalan 57byte ı 3 e bölünce (R G B) 19 LED i sürebiliyorum. Ve değerleri 19 LED e aktardıktan sonra başka işler için yaklaşık 25.4mS zaman kalıyor! Küçümsemeyin, bunun anlamı renk hesaplama, animasyon, tuş kontrolu, belki başka bir seri dış birim çalıştırma vs ye 127.000 satırlık zaman bırakıyor!


   Interrupt rutini veri gönderme işini bitirince Doldur alt rutinini çağırıyor. Bu rutinde Tablo1 deki renk değerlerini, her çağrıldığında tabloyu bir kaydırarak aktarılacak LED bilgisine kopyalıyor. Tablo FastLED kütüphanesinin Rainbow paletinden alınma. Sonuçta çok az kaynakla Gökkuşağı etkisi oluşuyor.


   Birilerinin cx8 örneği varmı? cxX kütüphanesi varmı diye soracağını düşünüyorum. Yok. Çünkü 16x4 = 64mHz lik PIC lere çıkmadan C gibi üst seviye dillerle bu kadar hıza hassas iletişim yazamazsınız. Mevzu bahis PIC leri kullanmak ise mantıklı değil çünkü ARDUINO nun kullandığı ATMEGA dan daha pahalı ve büyükler. 1 bilemediniz iki I/O (Bacak) ya ihtiyaç varken 24 I/0 lu, pahalı, iri kıyım bir chip kullanmakta sakınca görmüyorsanız başka...


   İlk denememde PIC12F675 i 20mHz kristal ile kullandım. Ancak bu PIC küçük RAM ve program hafızasından dolayı 19 LED ile kısıtlı işler yapmaya izin veriyor.
   8 bacaklı küçük devi gene 8 bacaklı büyük dev kardeşi PIC16F18313 ile değiştirdim ve ortaya ticari değeri olabilecek bir ürün çıktı. PIC12F675 in sadece 1kb program hafızası, 64byte ROM u ve en yüksek 20mHz (yani saniyede 5milyon işlem) hızı vardı, PIC16F18313 ün ise say say bitmez özellikleri var ama bu yazıyı ilgilendiren özellikleri; 32mHz (yani saniyede 8milyon işlem) hız, 3.5kB program hafızası, 256byte RAM, 256byte EEPROM, donanım olarak çeşitli iletişim protokolleri desteği yeterli. Bu PIC ile 66 LED (198byte RAM) kullanıyorum ve kalan hafıza ile Interrupt rutini hariç, yazılımın animasyon, tuş kontrol vs. kısmını xc8 ile yazabiliyorum!


Kaynak kodunu ve HEX dosyasını sağdaki linklerden indirebilirsiniz.

;****************************  Proje Tanımı  *****************************
;***                      WS2812B RGB LED Sürücü                       ***
;***                                                                   ***
;***   Sürüm          : 1.0                                            ***
;***   Yapımcı        : Birhan TAŞKIRAN                                ***
;***   Tarih          : 17 Aralık 2017                                 ***
;***   Mikrokontrolör : 12F675                                         ***
;***                                                                   ***
;***                         --------\/--------                        ***
;***                         |                |                        ***
;***               (+5V) -> [1 Vdd        Vss 8] <- (GND)              ***
;***                         |                |                        ***
;***          20  - Xtal -> [2 GP5        GP0 7] <- ICP/Dat            ***
;***                         |                |                        ***
;***          mHz - Xtal -> [3 GP4        GP1 6] <- ICP/Clk            ***
;***                         |                |                        ***
;***          ICP/Vpp SW -> [4 GP3        GP2 5] -> Kontrol            ***
;***                         |   (PIC12f675)  |                        ***
;***                          ----------------                         ***
;***                         TRISIO = 00111000                         ***
;***                                                                   ***
;***  Pin I/O İşlev                 Pin I/O İşlev                      ***
;***   1  --- Vdd (+V)               8  --- Vss (GND)                  ***
;***   2  GP5 T1CKI/OSC1/CLKIN       7  GP0 AN0/CIN+/ICSPDAT           ***
;***   3  GP4 AN3/T1G/OSC2/CLKOUT    6  GP1 AN1/CIN-/VREF/ICSPCLK      ***
;***   4  GP3 MCLR/VPP               5  GP2 AN2/T0CKI/INT/COUT         ***
;*************************************************************************
    errorlevel    -302
    list      p=12F675, R=DEC     ; işlemci ve sayı tabanı tanımı
    #include <p12f675.inc>        ; işlemciye özel dış dosya
    __CONFIG 110010010b           ;(_BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _HS)
 
; Sabitler
#define     Pin7    GPIO,0        ; Port isimleri
#define     Pin6    GPIO,1        ; Port isimleri
#define     Kontrol GPIO,2        ; Port isimleri
#define     Pin4    GPIO,3        ; Port isimleri
#define     Pin3    GPIO,4        ; Port isimleri
#define     Pin2    GPIO,5        ; Port isimleri
#define     Led     19            ; Led adedi
#define     zero    STATUS,Z
#define     carry   STATUS,C
 
; Değişkenler
    udata_shr 0x20
; Ana program
W_TEMP      RES 1
S_TEMP      RES 1
 
pause       RES 1
GokkS       RES 1                ; Gök kuşağı sayacı
GokkI       RES 1                ; Gök Kuşağı index
rnd         RES 1                ; Rastgele numara üreteci
seqC        RES 1                ; Sequance counter
Leds        RES Led*3            ; her led için 3byte lık alan
 
    ORG     0x000                ; Program buradan başlar
    goto    ayarlar
 
    org     0004h                ;    Interrupt                                 
;*************************************************************************
; TIMER1 1:2 Prescalar ile yaklaşık saniyede 38 kez WS2812B i sürüyor   **
; ************************************************************************
    MOVWF   W_TEMP               ; copy W to temp register,             **
    SWAPF   STATUS,W             ; swap status to be saved into W       **
    BCF     STATUS,RP0           ; change to bank 0 regardless of       **
    MOVWF   S_TEMP               ; save status to bank 0 register       **
; WS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS
; Zamanlama:  bit  = 1.220us - 1.260us 0bit = 240ns 1bit = 860ns        **
;             ölü zaman 50us nin altında olmak kaydıyla her süre...     **
;             50us den uzun LOW veri WS2812B için veri bitti demek..    **
    bcf     PIR1,0      ; TMR1 int overflow reset                       **
;Yolla                  ;                                               **
    movlw   Leds        ; Led veri adresini                             **
    movwf   FSR         ; FSR ye at                                     **
                        ;                                               **
    movlw   Led*3       ; Byte sayacı                                   **
    movwf   seqC        ; Led * 3 Byte                                  **
                        ;                                               **
Bit0                    ; 8bit gönder                                   **
;*************************************************************************
; Hız için döngüsüz direkt aktarma..                                    **
;*************************************************************************
    btfsc   INDF,7      ; Bit7 = 1 ise BitH a atla                      **
Bit0L                   ;                                               **
    goto    Bit0H       ;                                               **
    bsf        Kontrol  ; Değilse Bit=0 için 184nS (1.84uS)             **
    bcf        Kontrol  ; HIGH yolla ( 20mHz = 5.000.000 MIPS           **
    goto    Bit1        ; 1MIPS = 2uS, PORT un toparlanma hızını        **
Bit0H                   ; düşünce yaklaşık 1.84uS )                     **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit1                    ;                                               **
    btfsc   INDF,6      ; Bit 6                                         **
Bit1L                   ;                                               **
    goto    Bit1H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit2        ;                                               **
Bit1H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit2                    ;                                               **
    btfsc   INDF,5      ; Bit 5                                         **
Bit2L                   ;                                               **
    goto    Bit2H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit3        ;                                               **
Bit2H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit3                    ;                                               **
    btfsc   INDF,4      ; Bit 4                                         **
Bit3L                   ;                                               **
    goto    Bit3H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit4        ;                                               **
Bit3H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit4                    ;                                               **
    btfsc   INDF,3      ; Bit 3                                         **
Bit4L                   ;                                               **
    goto    Bit4H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit5        ;                                               **
Bit4H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit5                    ;                                               **
    btfsc   INDF,2      ; Bit 2                                         **
Bit5L                   ;                                               **
    goto    Bit5H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit6        ;                                               **
Bit5H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit6                    ;                                               **
    btfsc   INDF,1      ; Bit 1                                         **
Bit6L                   ;                                               **
    goto    Bit6H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit7        ;                                               **
Bit6H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
                        ;                                               **
Bit7                    ;                                               **
    btfsc   INDF,0      ; Bit 0                                         **
Bit7L                   ;                                               **
    goto    Bit7H       ;                                               **
    bsf     Kontrol     ;                                               **
    bcf     Kontrol     ;                                               **
    goto    Bit_ti      ;                                               **
Bit7H                   ;                                               **
    bsf     Kontrol     ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    nop                 ;                                               **
    bcf     Kontrol     ;                                               **
Bit_ti                  ;                                               **
    incf    FSR,f       ;                                               **
    decfsz  seqC,f      ;                                               **
    goto    Bit0        ;                                               **
                        ;                                               **
    call    Doldur      ;                                               **
                        ;                                               **
IntCikis                ;                                               **
; WS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS2812BWS
    SWAPF   S_TEMP,W    ; swap STATUS_TEMP register into                **
    MOVWF   STATUS      ; move W into STATUS register                   **
     SWAPF  W_TEMP,F    ; swap W_TEMP                                   **
    SWAPF   W_TEMP,W    ; swap W_TEMP into W                            **
    retfie              ;                                               **
;*************************************************************************
;*************************************************************************
 
;*************************************************************************
;                   Gökkuşağı renk paleti. Sıralama GRB                 **
;*************************************************************************
Tablo1                  ;                                               **
    addwf   PCL,f       ;                                               **
    retlw   0xFF        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x2A        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x55        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x7F        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0x56        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xFF        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x2A        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x55        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x56        ;                                               **
    retlw   0xAA        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xFF        ;                                               **
                        ;                                               **
    retlw   0x2A        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xD5        ;                                               **
                        ;                                               **
    retlw   0x55        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xAB        ;                                               **
                        ;                                               **
    retlw   0x7F        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x81        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x55        ;                                               **
                        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x2B        ;                                               **
;-- Tablo Tekrar (Kodda çözülebilir ama tembellik işte!) --             **
    retlw   0xFF        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x2A        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x55        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x7F        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0x56        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xFF        ;                                               **
    retlw   0x00        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x2A        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x55        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x56        ;                                               **
    retlw   0xAA        ;                                               **
                        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xFF        ;                                               **
                        ;                                               **
    retlw   0x2A        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xD5        ;                                               **
                        ;                                               **
    retlw   0x55        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0xAB        ;                                               **
                        ;                                               **
    retlw   0x7F        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x81        ;                                               **
                        ;                                               **
    retlw   0xAB        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x55        ;                                               **
                        ;                                               **
    retlw   0xD5        ;                                               **
    retlw   0x00        ;                                               **
    retlw   0x2B        ;                                               **
;*************************************************************************
;*************************************************************************
 
;*************************************************************************
;***                  ALT PROGRAMLAR  (Fonksiyonlar)                   ***
;*************************************************************************
Random                  ; Rastgele sayı üreteci                         **
    bcf     STATUS,C    ;                                               **
    rrf     rnd,w       ;                                               **
    btfsc   STATUS,C    ;                                               **
    bsf     rnd,7       ;                                               **
    btfsc   STATUS,C    ;                                               **
    xorlw   0xb4        ;                                               **
    movwf   rnd         ;                                               **
    return              ;                                               **
;*************************************************************************
Doldur                  ; Gök kuşağı renklerini döndür                  **
    decfsz  pause,f     ; Gök kuşağı kayma hızı                         **
    return              ;                                               **
    movlw   2           ;                                               **
    movwf   pause       ;                                               **
                        ;                                               **
    movlw   Leds        ; Led veri adresini                             **
    movwf   FSR         ; FSR ye at                                     **
                        ;                                               **
    movlw   Led*3       ; Led adedi                                     **
    movwf   GokkS       ; Gök Kuşağı için sayaç                         **
                        ;                                               **
    ; Gökkuşağı renk tablosu index i 16*3 ü geçemez.                    **
    ; if RAMx < K                                                       **
    ; Tony Nixon (piclist.com)                                          **
    movf    GokkI,w     ;                                               **
    addlw   255-47+1    ; 16*3 = 48                                     **
    skpnc               ;                                               **
;    goto     _Endif    ;                                               **
    clrf    GokkI       ; 16 dan büyük, sıfırla                         **
_Endif                  ; 16 dan küçük, buraya atla                     **
    movf    GokkS,w     ; Sayacı al                                     **
    ;sublw    Led*3     ; tersine akış için 30 dan çıkart (Sayac 0-29 a dönüştü)
    addwf   GokkI,w     ; Gökkuşağı index ine sayacı ekle               **
    call    Tablo1      ; Tabloyu oku                                   **
    movwf   INDF        ; Leds e aktar                                  **
    incf    FSR,f       ; Leds index i bir arttır                       **
    decfsz  GokkS,f     ; Döngü sayacını bir eksilt                     **
    goto    _Endif      ; Sıfır olmadıysa bir tur daha at               **
    incf     GokkI,f    ; Tablo index i bir arttır                      **
    incf     GokkI,f    ; Tablo index i bir arttır                      **
    incf     GokkI,f    ; Tablo index i bir arttır                      **
    return              ;                                               **
;*************************************************************************
Rastgele                ; Led leri rastgele renklerle doldur            **
    movlw    Led*3      ; Byte sayacı                                   **
    movwf    seqC       ; Led * 3 Byte                                  **
Devam                   ;                                               **
    call    Random      ;                                               **
    movwf    INDF       ;                                               **
    ;rrf        INDF,f  ; Parlaklığı yarıya düşürmek için               **
    incf    FSR,f       ;                                               **
    decfsz    seqC,f    ;                                               **
    goto    Devam       ;                                               **
    return              ;                                               **
;*************************************************************************
;*************************************************************************
 
;*************************************************************************
; ***                            Ana Döngü                             ***
;*************************************************************************
basla                   ;                                               **
    call    Rastgele    ; Ledlere Gökkuşağı paletini yükle              **
    movlw    180        ; Rastgele sayı üreticisi başlama               **
    movwf    rnd        ; sayısı                                        **
                        ;                                               **
Bekle                   ; Sonsuz döngü                                  **
    goto    Bekle       ; Malum bütün iş Interrupt içinde..             **
;*************************************************************************
;*************************************************************************
 
ayarlar
; ************************************************************************
; ***                         Donanım ayarları                         ***
    call    0x3FF       ; OSCCAL                                       ***
    banksel OSCCAL      ;                                              ***
    movwf   OSCCAL      ;                                              ***
; Pin I/O ayarı         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***
    banksel TRISIO      ;                                              ***
    movlw   00111000b   ; 1=In 0=Out                                   ***
    movwf   TRISIO      ;                                              ***
    banksel GPIO        ;                                              ***
    movlw   00000000b   ;                                              ***
    movwf   GPIO        ;                                              ***
; set up comparator     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***
    banksel CMCON       ;                                              ***
    movlw   00000111b   ; 111=comparator off                           ***
    movwf   CMCON       ;                                              ***
; set up A/D converter  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***
    banksel ANSEL       ;                                              ***
    movlw   00001000b   ;                                              ***
    movwf   ANSEL       ;                                              ***
    banksel ADCON0      ;                                              ***
    movlw   10001101b   ;                                              ***
    movwf   ADCON0      ;                                              ***
; initialize interrupts XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***
    banksel OPTION_REG  ;                                              ***
    movlw   00000110b   ; PullUps On                                   ***
    movwf   OPTION_REG  ; TMR0 1:28                                    ***
    banksel INTCON      ;                                              ***
    movlw   11000000b   ; Global Int En., Perip.                       ***
    movwf   INTCON      ; Ints. En, TMR0 Int. Dis.                     ***
; initialize TMR1       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***
    banksel T1CON       ;                                              ***
;  T1 Prescaler ||   00=1:1 01=1:2 10=1:4 11=1:8                       ***
    movlw   00010001b   ; TMR1 enabled    1:2                          ***
    movwf   T1CON       ;                                              ***
    movlw   1           ; TMR1 Int. enabled                            ***
    banksel PIE1        ;                                              ***
    movwf   PIE1        ;                                              ***
; Program ön ayarlar    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***
    banksel 0           ;                                              ***
    goto    basla       ;                                              ***
;*************************************************************************
 
 
;   EEPROM Sürüm Bilgisi
    ORG    0x2100
    DE    'm','o','d','e','l','c','i','.','n','e','t',' ','W','S','2','8','1','2',',' ','S','U','R','U','C','U',' ','©','2','0','1','7'
    end
Projemiz:

WS2812B Chipli LED i PIC12F675 ile sürmek

WS122812B RGB LED Modülleri


Malzeme Listesi

  1. WS2812B addicore.com | adafruit.com
  2. PIC12F675 (dorukanstore.com | direnc.net)
  3. Breadboard, koblo vs. (Size kalmış)

PIC Programcı: Expkits PK3
NOT: Proje MPLAB IDE v9.82 ile derlenmiştir.
İlgili Dosyalar:
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )

Neden olmasın?


En Alt??