E

PWM RGB Led Chaser( Kara Simsek) basic kodlu

Başlatan Erata, 17 Kasım 2012, 09:33:25

Erata

dolaşırken buldum paylaşayım dedim


Initial Chaser Testing


Center Pulse










DEVICE 18F452
XTAL 20
       
DIM I    AS BYTE ' simple counter!
DIM BigI    AS WORD
Dim LoopCount  AS BYTE
       
Dim SwBuf1    AS BYTE
Dim SwBuf2    AS BYTE
Dim Pattern    AS BYTE
Dim PatIDX    AS BYTE

Dim RedBank    AS BYTE
Dim BlueBank   AS BYTE
Dim GreenBank  AS BYTE

BOOTLOADER    = ON
       
PORTB_PULLUPS = OFF ' disable PORTB's internal pullups
ALL_DIGITAL   = TRUE ' disable analog inputs
       
Symbol LED   = PORTA.0    ' Status LED
Symbol SW1 = PORTA.1
Symbol SW2 = PORTA.2
       
Symbol DTA = PORTC.0
Symbol Clock = PORTC.1
Symbol Latch = PORTC.2
Symbol SClr = PORTC.3
Symbol Ena = PORTC.4

Symbol TheDelay = 70

TRISA = %00000110
TRISB = 0  
TRISC = 0
TRISD = 0
       
Pattern = 0
PatIDX = 0

'setup some initial states
High SCLR
Low Latch
Low Clock
Low DTA
Low Ena

' Gosub AllOff: DelayMS 1000

      BigI = 0
LoopCount = 4
Repeat     ' blue center out of black
     PatIDX = LoopCount: Gosub GetPat
RedBank = Pattern
GoSub DoShift: DelayMS TheDelay * 6
Inc LoopCount
Until LoopCount > 6

GoSUB AllRed: DelayMS TheDelay * 6

Again:
Repeat
        LoopCount = 4
    Repeat     ' blue/green center out of red
         PatIDX = LoopCount: Gosub GetPat
BlueBank = Pattern
I = LoopCount - 1
If I >= 4 then
      If I > 6 then I = 6
  PatIDX = I: GoSub GetPat: GreenBank = Pattern
  BlueBank = $FF ^ GreenBank ^ BlueBank
  RedBank = BlueBank ^ GreenBank
Else
      RedBank = $FF ^ BlueBank
End If
     GoSub DoShift: DelayMS TheDelay
     Inc LoopCount
Until LoopCount > 7

GoSub AllGreen: DelayMS TheDelay

        LoopCount = 4
    Repeat     ' red/blue center out of green
         PatIDX = LoopCount: Gosub GetPat
RedBank = Pattern
I = LoopCount - 1
If I >= 4 then
      If I > 6 then I = 6
  PatIDX = I: GoSub GetPat: BlueBank = Pattern
  RedBank = $FF ^ BlueBank ^ RedBank
  GreenBank = BlueBank ^ RedBank
Else
      GreenBank = $FF ^ RedBank
End If
     GoSub DoShift: DelayMS TheDelay
     Inc LoopCount
Until LoopCount > 7

GoSub AllBlue: DelayMS TheDelay

        LoopCount = 4
    Repeat     ' red/green center out of blue
         PatIDX = LoopCount: Gosub GetPat
GreenBank = Pattern
I = LoopCount - 1
If I >= 4 then
      If I > 6 then I = 6
  PatIDX = I: GoSub GetPat: RedBank = Pattern
  GreenBank = $FF ^ RedBank ^ GreenBank
  BlueBank = GreenBank ^ RedBank
Else
      BlueBank = $FF ^ GreenBank
End If
     GoSub DoShift: DelayMS TheDelay
     Inc LoopCount
Until LoopCount > 7

GoSub AllRed: DelayMS TheDelay

Inc BigI
Until BigI > 4
Goto Again

LoopCount = 6
Repeat       ' red to black
     PatIDX = LoopCount: Gosub GetPat
RedBank = Pattern:
GoSub DoShift: DelayMS TheDelay * 6
Dec LoopCount
Until LoopCount < 4

GoSub AllOff: DelayMS TheDelay * 6


End

AllGreen:
RedBank = $FF: BlueBank = $FF: GreenBank = $0    ' all greens on
Goto DoShift

AllBlue:
RedBank = $FF: BlueBank = $0: GreenBank = $FF    ' all blues on
Goto DoShift

AllRed:
RedBank = $0: BlueBank = $FF: GreenBank = $FF    ' all reds on
Goto DoShift

AllOff:
RedBank = $FF: BlueBank = $FF: GreenBank = $FF    ' all off
Goto DoShift

GetPat:

Pattern = LOOKUPL PatIdx, [24, 60, 126, 255, 231, 195, 129, 0]

Return

DoShift:
' shift data out to the registers
SHOUT DTA, Clock, LSBFirst, [RedBank, BlueBank, GreenBank]
PulsOut Latch, 1 ' pulse latch
Return




alıntıdır

ete

Şema ile program bir birini tutmuyor. Şema 12f serisine göre verilmiş ama program 18f452 ye göre verilmiş.

Ete

Erata

evet yaf ona dikkat etmemisim ama genede   yapacak arkadaşlara ön bilgi olur

PWM kara şimsek  olayını çok merak eden var

ete

#3
Kara şimşek imajını yaratmanın iki yolu var. Önce gerçek olanı söyleyeyim.
Belirli sayıdaki led gurubu yakılarak sağa sola hareket etmektedir. Ancak hareket yönünde yanan ledlerin ilk baştaki led en parlak en sondaki ise en sönük olarak hareket etmektedirler.

Bir ikincisi ve kolay olanı ise yine belirli sayıdaki led gurubu aynı parlaklıkta yakılarak sağa sola hareket etmektedirler.

Birinci gurup sistemde işin içine Çoklu pin, PWM uygulaması girmekte ve program açısından epeyce zor bir iş. Zira mantık bazında düşünürsek,
- Birinci led %100 duty
- İkinci led  %75   duty
- üçüncü led  %50 duty
- dördüncü led %25 duty
oranı ile yakılarak sürülecektir.
Sistemde 4 adet led yakılarak yürütüldüğünü varsaydık. Ledleri 1 bit sola kaydırdığımız zaman yeni gelen led %100 duty ile önceden %100 olan %75 .. şeklinde sıralama devam edecek ve bu iş bir döngü şeklinde devam edecektir.
Her şeyden önce Çok pinli  PWM sistemi için bildiğimiz ve Kesme ile yaratılan PWM sistemi hız açısından yeterli gelmemektedir.
Bunu sebebi ayet açık. Frekansı 100 Hz olan bir sinyalde peryot başına 256 kesme (0-255) gerekmektedir. Bu durumda 1 sn de 256*100=25.600 kesme ile bu iş helledilebilmektedir. Gerçekten kesme sayısı çok fazla. Bu kadar kesme ile sistemde göz kırpışmaların olmaması imkansız hale gelmektedir. Birde işe led sayısı açısından bakın. En azından 16 led  kullanmanız ve 4 der adedini yakarak ilerletmeniz gerekiyor. 16 Led için PWM uygulanması gerçekten kolay bir iş değil.
Peki ne yapılması gerekiyor?. Bizden önce birileri düşünmüş ve BAM denilen bir sistem bulmuşlar. BAM , Bit Açısı Modulasyonu kelimelerinin baş harflarinden oluşmuş. Bu sistemde sinyalin HIGH peryodunu verilen duty değerinin bitleri oluşturmaktadır.
Temel amaç  bir peryot (1/Frekans) süresinin yarısı Bit 7 için kullanılıyor sonrasında gelen her bit bir öncekinin yarı değerini alıyor. Bütün sistem bu.  100 Hz lik bir sinyalde peryot 0,01 sn dir. O halde bit7 süresi 0,01/2=0,005sn.  Bit6 süresi 9,005/2=0,0025sn .... şeklinde devam etmektedir.
Verilen süreler hem HIGH değerleri hem LOW değerleri için geçerlidir.
Örnek vermek gerekir ise Duty Değerimiz %10010010 olan bir sinyal için,
- Toplam High süresi : 0,005 + 0,000625 + 0,00015625=0,00578125 sn olmaktadır.
- Toplam Low süresi : ......................................................0,00421875 sn olmaktadır.

Aynı değeri pwm ainyali olarak değerlendirelim. %10010010 binary sayısı desimal olarak  146 sayısına eşittir. Duty aralığı 0-255 olan bir sistemde bu 146/256=%57 lik bir duty değerine denk gelmektedir. peryodu 0,01 sn olan bir sinyalde ise,
high süresi= 0,0057 sn
Low süresi= 0,0043 sn ye denk gelmektedir.
İki sistemide karşılaştırırsanız sürelerin pek farklı olmadıklarını görebilirsiniz.

Bu sistemin asıl avantajı bir peryotta 8 kesme ile halledilebilmesidir. Dolayısıyla 100 hzlik sinyal için toplm 800 kesme gerekmektedir. 25600'e karşılık 800 kesme epeyce büyük bir fark ve avantaj.
Sonuç olarak çoklu PWM çıkışlı sistemlerde kesin olarak BAM sisteminin kullanılması büyük avantaj sağlamaktadır.

Bu sistemin avantajlarına rağmen çok azda olsa meydana gelen kırpışmaların azaltılabilmesi için birde mirror imaj yani ayna görüntüsü sinyale eklenmiş. Bunada Mirror İmaj Bit Angle Modulasyon yani MİBAM demişler. 
İlişikte bir dosya ekledim. 16F877 ile yaptığım MIBAM sisteminde çalışan bir RGB sistemine ait bir projedir.
Özellikle skop görüntüsünü inceleyin konuyu daha iyi anlayacaksınız.

İkinci eklediğim dosya ise 16F877 ile yapılmış toplam 20 adet led kullanan bir Kara Şimşek sistemidir ve Mibam ile çalıştığı için ledler sönümlü olarak ilerlemektedir. Yalnız sistem 20 Mhz de çalışmaktadır.
Mibam sisteminde 4 Mhz frekansta 4 adet çıkışı aynı anda sürebiliyorsunuz. 8 Mhzde 8 adet , 10 Mhzde 10 adet, 20 Mhzde ise 20 adet led aynı anda sürülebilmektedir. Aslında daha fazla ledi de sürebilirsinzi. Programın yoğunluğuna bağlı olarak bu adetlerden fazlaları kırpışmaya sebep olmaktadır. Gerçi ben 24 adet ledle kara şimşeği çalıştırdım bir sorunda görmedim.
Simulasyonda ledlerin PWM yapmaları pek izlenemiyor. Hatta aksine gerideki ledlerinbir yanıp sönmesi ters bir imaj yaratıyor. Bu nedenle simulasyonda değilde gerçek devrede izelemey gayret edin.

Ete

coco

iyi çalışmalar ete hocam!

16F628A ile ilgili dosyanın Led sıralaması, proteusdaki
sıralama gibi mı bağlanacak?

ete

Aslında gölgeli çıkış yani asıl kara şimşek olayı portb.0 ile portb.7 pinleri arasında sıralı diziliş olatak çalışıyor. A portunu hiç kullanmadanda olur o yalnızca bir kaç pinde sağa sola normal gidiş geliş yapıyor.
Ete

coco

#6
Bu çalışmanın kaynak kodu varmı?16f628 için yazılmış bende 16f628A lı olanı var. (A)

Sorun beslemeyi ayırıp  tekrar başlatınca ledler Işıldamıyor  pici söküp tekrardan program atınca çalışıyor ve  tekrar beslemeyi ayırınca aynı....  (8 tane ledi çalıştırdım)

100nf ve 100Mf bağlantılarını mcr ucuna 10kohm direnç  ve 100nf bağladım 20mhz ve 10 mhz denendi.ikinci bir 16f628A ile denedim.

Nedir acaba sorun?

ete

Programı düzelttim ve aynı yere geri yükledim. Düzgün olanı oradan yükleyebilirsin.
16F628 veya 16F628A dan birisini kullanabilirsin farketmez.

Ete

coco


coco

çalıştı.hocam neden osilatör olarak XT değilde Hs seçtiniz bu projede.Üzerinde madeni kılıf bulunan kristal XT değil mi?

ete

Mibam sistemi led başına 1Mhz frekans istiyor. 8 led en az 8 Mhz de çalışması lazım. Bende standart olan 10Mhz'i seçtim.
Metal kılıf kristaller her türlü değerde bulunabilir. Değerlari üzerlerinde yazmaktadır. 10mHz lik rezonatör bile bulabilirsiniz.
Sonuçta bu sistemin çalışma frekansı 10Mhz dir ve bu yüzden sigorta ayarında HS_OSC seçilidir.

Ete

zeynal

Merhaba Erol bey.Merhaba arkadaşlar.PIC16F777 nin hafızasına bilgi yazıp okumakla ilgili sorun yaşiyorum.
@ DEVICE PIC16F777
@ DEVICE PIC16F777,WDT_ON
@ DEVICE PIC16F777,HS_OSC
@ DEVICE PIC16F777,MCLR_OFF
@ DEVICE PIC16F777,PROTECT_OFF

PMCON1=%10000001
EECON1=%00000111
EECON2=%00000111
ADCON1 = 15   
TRISA=%00000000
TRISB=%00011111
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
SAAT VAR BYTE
READ $01,SAAT
BASLA:
WRITE $01,SAAT
GOTO BASLA
Derleme hata veriyor.Yardım ederseniz sevinirim.
Teşekkürler

ete

Çok normal çünki bu işlemcide dahili Eeprom bulunmuyor.

Ete

zeynal

Erol bey çok teşekkür ederim.Gözden kaçırmışım.Daha dikkatli olmam gerekiyor.Teşekkürler

MS_59

arkadaşlar ETE hocanım yaptığı MIBAM_şimşek devresinin baskılı devre çizimini yaptım
yapmak isteyenler için dosyalar ekte
mehmet

Powered by EzPortal