12f675 yazılımsal pwmde sorun

Başlatan Burak Tekin, 03 Şubat 2017, 15:19:41

Burak Tekin

Merhabalar,

RGB led animasyon devresinde kullanmak için 3 adet pwm kullanmak gerekliydi. Bunları timer0'a bağlayıp program içerisinde pwm'lerin değerinde değişiklik yapıyorum. Program güzel bir şekilde pwm üretiyor. Fakat arada rastgele bir çıkıştan ama sadece birinden bir döngüde çıkışı sıfırlamıyor. Diğer döngüde sıfırlıyor.Diğer çıkışlarda aynı sorunu yapmaması timer kesmesine girdiğini gösteriyor. Fakat neden çıkışı kapatmıyor?? Çözüm ararken == olan ifadeyi >= yaptığımda da aynı sorun devam etti. Ekteki resimde bahsettiğim durumu görebilirsiniz. Ana programda re,ge,be değerleri zamanla değişiyor. PWM döngüsü tamamlandığında bu değişiklik pwmdeki değişkene atanıyor. Programdaki pwm oluşturma kısmı:

void interrupt isrs(void)
{
if(T0IF){
    if(k==ree){GPIObits.GP1=0;}
    if(k==gee){GPIObits.GP0=0;}
    if(k==bee){GPIObits.GP2=0;}
    k++;

    if(k==200){k=0;
        ree=re;
        if(ree!=0)RED=1;
        gee=ge;
        if(gee!=0)GREEN=1;
        bee=be;
        if(bee!=0)BLUE=1;
    }
   
    TMR0=250;
    T0IF=0;
}

}

mehmet

GIE den kaynaklanıyor olabilir...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

ete

Benzer mantığı daha önce kullanmıştım. Sorun olmamıştı. Merakımdan aynı mantığı kullanarak ama bazı değişiklikler uygulayarak Basic de deneme programı yazdım (12F1822 ile) simulasyonda sorunsuz çalışıyor. Değişiklikleri söyleyeyim ;
Sen ,  if(k==ree){GPIObits.GP1=0;} komut satırında direk renk pini yerine port pini kullanmışsın. Ben burayı,
IF K=Ree Then Red=0 şeklinde yaptım. Sonucu etkileyecek bir değişiklik değil bu tabiiki.
if(ree!=0)RED=1; bu komut satırında da If Ree>0 Then Red=1  şeklinde yaptım. Buda sonucu etkilemez ancak biraz programa hız katar belki diye böyle yaptım.
Geri kısmı aynı.
Ana program kısmında bir sorun olsa gerek.Kesmede bu kodların bir sorun yaratacağını düşünmüyorum. Tabiiki birde C derleyicisinde bir BUG yok ise.

Ete



Burak Tekin

Yardımlarınız için teşekkürler. Sorunu şu şekilde çözümledim. Eğerki pwm değeri (re,be,ge) 200'e kadar bir değer ise yeni pwm değerini al değilse eski değerini koru. Bu sayede sorun çözüldü.
Ama hala tam olarak sorun neden kaynaklandı orasını çözebilmiş değilim. Sorunun neden kaynaklandığı hakkında fikriniz varsa duymak isterim. Onun dışında sorunum düzeldi. Tekrar teşekkürler yardımlarınız için.
Ana program bunun gibi kısımlardan oluşuyor sadece:

while(be<100){
              be++;
               __delay_ms(4);
            }


interrupt kısmının son hali:

void interrupt isrs(void)
{
if(T0IF){
    if(k==ree){GPIObits.GP1=0;}
    if(k==gee){GPIObits.GP0=0;}
    if(k==bee){GPIObits.GP2=0;}
    k++;

    if(k==200){k=0;
        if(re<201)ree=re;
        if(ree>0)RED=1;
        if(ge<201)gee=ge;
        if(gee>0)GREEN=1;
        if(be<201)bee=be;
        if(bee>0)BLUE=1;
    }
   
    TMR0=250;
    T0IF=0;
}

Powered by EzPortal