Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: samedkutuk - 23 Ocak 2020, 23:05:01

Başlık: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 23 Ocak 2020, 23:05:01
Merhabalar
Frekansı sabit Pwm i tuşlar yoluyla menüden ayarlanabilir bir devre yapmaktayım.
Pwm ayarlandıktan sonra eğer kapat tuşuna basılır ise set_pwm2_duty(0); yaparak pwm i sıfırlıyorum fakat tam sıfırlanmıyor parazit gibi duty si çok düşük bir pwm kalıyor.
Bunu hem proteusda hemde gerçek devrede led ile denedim aldığım sonuç aynı düşük duty li bir pwm malesef kapanmıyor
Not: Bu olay sadece %30,%50,%70,%90 dutylerde oluyor.Diğer duty ler de sağlıklı şekilde pwm sıfırlanıyor.
Kod Şu şekilde;
#include <main.h>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#define OK      PIN_A0
#define ARTTIR  PIN_A1
#define AZALT   PIN_A2
#define STOP    PIN_A3
#define deger    PIN_B0

#include <lcd.c>
int Kontrol=0;
int Mod=0;
int cikar_2=0,cikar_3=0,cikar_4=0,cikar_5=0,cikar_6=0,cikar_7=0,cikar_8=0,cikar_9=0,cikar_10=0;
void ayar(){
lcd_putc("\f");
Mod=read_eeprom(0);
while(True){
lcd_gotoxy(2,1);
printf(lcd_putc,"***Mod Seciniz***\nMod=%d",Mod);

 if(input(ARTTIR)==1){while(input(ARTTIR)==1);delay_ms(50);
Mod=Mod+1;
if(mod>=10){mod=10;}
lcd_gotoxy(2,1);
printf(lcd_putc,"\f***Mod Seciniz***\nMod=%d",Mod);}

 if(input(AZALT)==1){while(input(AZALT)==1);delay_ms(50);
 Mod=Mod-1;
 if(mod<=0){mod=10;}
 lcd_gotoxy(1,2);
 printf(lcd_putc,"\f***Mod Seciniz***\nMod=%d",Mod);}
 
 if(input(OK)==1){while(input(OK)==1);delay_ms(50);
 printf(lcd_putc,"\f Secilen Mod= %d",Mod);
 delay_ms(1000);
 lcd_putc("\f");
 write_eeprom(0,mod);
 break;}
}
}

void main()
{
   lcd_init(); 
setup_spi (FALSE);
enable_interrupts (global);

      setup_timer_2(T2_DIV_BY_4, 124, 1);
      setup_ccp1(CCP_PWM);
      set_pwm1_duty(0);
      setup_ccp2(CCP_PWM);
      set_pwm2_duty(0);
      Kontrol=1;
      output_a(0xff);
      output_b(0x00);

   while(TRUE)
   {   
        lcd_gotoxy(3,1);
        lcd_putc("HOSGELDINIZ");
      if(input(OK)==1){delay_ms(500);while(input(OK)==1);ayar();Mod=read_eeprom(0);}
     
     
     if(input(STOP)==1){delay_ms(200);while(input(STOP)==1);delay_ms(50);
     Mod=read_eeprom(0);
     Kontrol=kontrol+1;if(Kontrol>1){Kontrol=0;}
     cikar_10=0;cikar_9=0;cikar_8=0;cikar_7=0;;cikar_6=0;cikar_5=0;cikar_4=0;cikar_3=0;cikar_2=0;}
     
    switch (Kontrol) {

    case 0:
      if(mod==1){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      lcd_gotoxy(3,2);lcd_putc("SMOD 10 AKTIF");}
     
      if(mod==2){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
         if(cikar_2==0){
         set_pwm1_duty((long)25);set_pwm2_duty((long)25);
         delay_ms(2200);
         set_pwm1_duty((long)50);set_pwm2_duty((long)50);
         delay_ms(200);
         set_pwm1_duty((long)75);set_pwm2_duty((long)75);
         delay_ms(200);
         cikar_2=1;
         }
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      lcd_gotoxy(3,2);lcd_putc("SMOD 20 AKTIF");}
     
     
      if(mod==3){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
     
         if(cikar_3==0){
         set_pwm1_duty((long)25);set_pwm2_duty((long)25);
         delay_ms(200);
         set_pwm1_duty((long)50);set_pwm2_duty((long)50);
         delay_ms(200);
         set_pwm1_duty((long)100);set_pwm2_duty((long)100);
         delay_ms(200);
         cikar_3=1;
         }         
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      lcd_gotoxy(2,2);lcd_putc("SMOD 30 AKTIF");}
     
      if(mod==4){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_4==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      cikar_4=1;}
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      lcd_gotoxy(2,2);lcd_putc("MOD 40 AKTIF");}

     
      if(mod==5){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);         
      if(cikar_5==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      cikar_5=1;}
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      lcd_gotoxy(2,2);lcd_putc("SMOD 50 AKTIF");}
     
      if(mod==6){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
        if(cikar_6==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      cikar_6=1;} 
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      lcd_gotoxy(2,2);lcd_putc("SMOD 60 AKTIF");}
     
     
      if(mod==7){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_7==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      cikar_7=1;}
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      lcd_gotoxy(2,2);lcd_putc("SMOD 70 AKTIF");}
     
      if(mod==8){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_8==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      delay_ms(200);
      cikar_8=1;}
      set_pwm1_duty((long)400);set_pwm2_duty((long)400)
      ;lcd_gotoxy(2,2);lcd_putc("SMOD 80 AKTIF");}
     
      if(mod==9){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_9==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      delay_ms(200);
      set_pwm1_duty((long)400);set_pwm2_duty((long)400);
      delay_ms(200);
      cikar_9=1;}
      set_pwm1_duty((long)450);set_pwm2_duty((long)450);
      lcd_gotoxy(2,2);lcd_putc("SMOD 90 AKTIF");}
     
      if(mod==10){//setup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM);
      if(cikar_10==0){//bu döngüye bir defa gir
      set_pwm1_duty((long)50);set_pwm2_duty((long)50);
      delay_ms(200);
      set_pwm1_duty((long)100);set_pwm2_duty((long)100);
      delay_ms(200);
      set_pwm1_duty((long)150);set_pwm2_duty((long)150);
      delay_ms(200);
      set_pwm1_duty((long)200);set_pwm2_duty((long)200);
      delay_ms(200);
      set_pwm1_duty((long)250);set_pwm2_duty((long)250);
      delay_ms(200);
      set_pwm1_duty((long)300);set_pwm2_duty((long)300);
      delay_ms(200);
      set_pwm1_duty((long)350);set_pwm2_duty((long)350);
      delay_ms(200);
      set_pwm1_duty((long)400);set_pwm2_duty((long)400);
      delay_ms(200);
      set_pwm1_duty((long)450);set_pwm2_duty((long)450);
      delay_ms(200);
      cikar_10=1;}
     
      set_pwm1_duty((long)500);set_pwm2_duty((long)500);
      lcd_gotoxy(2,2);lcd_putc("SMOD 100 AKTIF");}

           break;

    case 1:
       set_pwm2_duty(0);
      set_pwm1_duty(0);
     
      //setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
      lcd_gotoxy(2,2);lcd_putc("SISTEM KAPALI ");

           break;
           

    default:
     // set_pwm1_duty(0);set_pwm2_duty(0);
    // setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
      lcd_gotoxy(2,2);lcd_putc("DEFAULT");

            break; }


      //TODO: User Code
   }

}


Sıfırlanmayan sinyal;

(https://i.ibb.co/G5L1ZKS/Ekran-Al-nt-s.png) (https://ibb.co/G5L1ZKS)
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: pwr_24 - 23 Ocak 2020, 23:51:27
pwm çıkış portlarını sıfırla sorunun kökten çözülür o zaman.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: SpeedyX - 23 Ocak 2020, 23:53:31
Duty sıfır değerine özel bir macro ile pini output yapıp sıfıra çek, CCP yi kapat
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 24 Ocak 2020, 00:12:13
Alıntı yapılan: pwr_24 - 23 Ocak 2020, 23:51:27pwm çıkış portlarını sıfırla sorunun kökten çözülür o zaman.
onu denedim fakat çözülmedi hocam
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 24 Ocak 2020, 00:14:32
Alıntı yapılan: SpeedyX - 23 Ocak 2020, 23:53:31Duty sıfır değerine özel bir macro ile pini output yapıp sıfıra çek, CCP yi kapat
önce öyle yapıyordum
başlat dediğimde ccp modülünü pwm modunda açıpsetup_ccp1(CCP_PWM);setup_ccp2(CCP_PWM); kapat dediğimde kapatıyordum setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);Bu durumda da aynı sorun şu şekilde oluyor ccp1 bir bazen kapanıyor bazen de kapanmıyor
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 24 Ocak 2020, 00:52:29
Dikkatimi çeken şu oldu 50,150,250,350 şekkinde duty verdiğim fonksiyonlar tam kapanmamış
bu değerleri 60,160,260... a çevirdim sorun çözldü
birde 256 dan büyük olmayan duty değerlerinin de önüne (long) yazmıştım onlarısildim sorun şuan tamamen çözüldü ama ne gariptir ki bir mantık bulamadım soruna :-)
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: OG - 24 Ocak 2020, 07:51:23
10bit pwm'in 2 bit'lik LSB değeri 0 olmamış olabilir,
işlemcinin ne olduğunu göremedim ama bilindik seriiler için genelde bu bitler CCPxCON bit 4 ve 5.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 24 Ocak 2020, 12:13:44
Alıntı yapılan: OG - 24 Ocak 2020, 07:51:2310bit pwm'in 2 bit'lik LSB değeri 0 olmamış olabilir,
işlemcinin ne olduğunu göremedim ama bilindik seriiler için genelde bu bitler CCPxCON bit 4 ve 5.
16f877a kullaıyorum hocam
biraz açar mısınız?
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: sinus - 24 Ocak 2020, 12:51:05
timer stop/run biti yok mu?
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 24 Ocak 2020, 13:05:42
Alıntı yapılan: sinus - 24 Ocak 2020, 12:51:05timer stop/run biti yok mu?
Timer 2 yi enable disable yapan fonksiyonşlar var direk timer i mi kapatmamı öneriyorsunuz
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: OG - 24 Ocak 2020, 20:02:14
Alıntı yapılan: samedkutuk - 24 Ocak 2020, 12:13:4416f877a kullaıyorum hocam
biraz açar mısınız?
hangi pwm modulunu kullanıyorsanız (CCP1CON / CCP2CON) o modulun 4. ve 5. bitleri 0 olmalı,
bunlar 10 bit pwm'in en küçük 2 bit'i dir. Bu bitler 1 olmama

bu modulun pwm olarak çalışabilmesi için de
bit 3-0 : 11xx = PWM mode
olmalı
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 24 Ocak 2020, 23:17:46
Alıntı yapılan: OG - 24 Ocak 2020, 20:02:14hangi pwm modulunu kullanıyorsanız (CCP1CON / CCP2CON) o modulun 4. ve 5. bitleri 0 olmalı,
bunlar 10 bit pwm'in en küçük 2 bit'i dir. Bu bitler 1 olmama

bu modulun pwm olarak çalışabilmesi için de
bit 3-0 : 11xx = PWM mode
olmalı
HEM ccp1 hem de ccp2 modülünü kullanıyorum fakat anlamadım
ccp1 modülünün bitlerini nerden inceleyeceğim bu konuyu açar mısınız biraz
ben ccs c kullanıyorum dediğiniz kontrol için ccs  nin içine asm mi gömmem gerekiyor?
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: HAKKITANIR - 25 Ocak 2020, 13:44:03
"ccp1 modülünün bitlerini nerden inceleyeceğim bu konuyu açar mısınız biraz"

kullanım klavuzunda ccpX modül kontrol registerinde bitler vardır.
bu registerler işlemciniz 8 bit olduğundan, tek bir 8 bitlik düzende veya yeterli gelmediyse birden fazla 8 bitlik düzende verilebilir.
orada her bir bitin ne iş yaptığı gibi şeyler yazılıdır.
genelde ilk en büyük bit ccpX modülü açıp kapatan bitdir.
diğer bitlerden pwm çalışma yöntemi ve timer seçimi gibi vesaire ayarlar yapılır.
yanlış değilsem bunlara bir bakın denmek istendi galiba.

şimdi siz 2 adet birbirinden bağımsız ccp1 ve ccp2 modülü kullanıyor ve bunları tek bir timer ilemi konfigüre ederek kullanıyorsunuz?
böyle ise pwm sinyal tetikleme topolojiniz ne oluyor sorabilir miyim?
mesela pussh-pull tarzı bir topoloji uyguluyor iseniz,
ccpX lerle bu işlemcide bu çalışma destekleniyor mu?
yada desteklenmiyorsa yazılımla yapmak için uygun bir yazılım yazılı olarak var mı?
timerin kesmeli bir yapısı kullanılması gerekiyor olabilir belki.

bu derleyici ve işlemciyi bilmemekle birlikte üst serilerinde farklı C derleyicisini kullanmışlığım var.
bunlarda ccp sizdeki gibi birleşik değilde, IC ve OC modül olarak ayrı ayrı veriliyor.

ne yapılmak istendiğini ben tam anlayamadım.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 25 Ocak 2020, 16:09:43
Dediğiniz bitleri inceleyeceğim hocam teşekkür ederim.
Yazdığım kod u en başta atmıştım.
Benim sorunum şuydu ccsc de Pwm modüülü kapatmak için belli bir fonksiyon var fakat Pwm değerim 8 bitin üzerine çıktığında pwm i tekrar kapatınca ccp modülünde düşük duty li bir pwm kalmaya devam ediyor
Alıntı yapılan: HAKKITANIR - 25 Ocak 2020, 13:44:03"ccp1 modülünün bitlerini nerden inceleyeceğim bu konuyu açar mısınız biraz"

kullanım klavuzunda ccpX modül kontrol registerinde bitler vardır.
bu registerler işlemciniz 8 bit olduğundan, tek bir 8 bitlik düzende veya yeterli gelmediyse birden fazla 8 bitlik düzende verilebilir.
orada her bir bitin ne iş yaptığı gibi şeyler yazılıdır.
genelde ilk en büyük bit ccpX modülü açıp kapatan bitdir.
diğer bitlerden pwm çalışma yöntemi ve timer seçimi gibi vesaire ayarlar yapılır.
yanlış değilsem bunlara bir bakın denmek istendi galiba.

şimdi siz 2 adet birbirinden bağımsız ccp1 ve ccp2 modülü kullanıyor ve bunları tek bir timer ilemi konfigüre ederek kullanıyorsunuz?
böyle ise pwm sinyal tetikleme topolojiniz ne oluyor sorabilir miyim?
mesela pussh-pull tarzı bir topoloji uyguluyor iseniz,
ccpX lerle bu işlemcide bu çalışma destekleniyor mu?
yada desteklenmiyorsa yazılımla yapmak için uygun bir yazılım yazılı olarak var mı?
timerin kesmeli bir yapısı kullanılması gerekiyor olabilir belki.

bu derleyici ve işlemciyi bilmemekle birlikte üst serilerinde farklı C derleyicisini kullanmışlığım var.
bunlarda ccp sizdeki gibi birleşik değilde, IC ve OC modül olarak ayrı ayrı veriliyor.

ne yapılmak istendiğini ben tam anlayamadım.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: HAKKITANIR - 25 Ocak 2020, 17:26:57
"Benim sorunum şuydu ccsc de Pwm modüülü kapatmak için belli bir fonksiyon var fakat Pwm değerim 8 bitin üzerine çıktığında pwm i tekrar kapatınca ccp modülünde düşük duty li bir pwm kalmaya devam ediyor"

bu fonksiyon içinde sanıyorum, ccp modülün kontrol registerindeki ilgili biti 0 yaparak kapatıyor olmalı.
siz ccp modülü açıp kapatan kontrol registerindeki ilgili bitin, kapatma pozisyonuna alındığından eminseniz ve bu durumdada ccp modül çıkışı sürekli 0V. ye çekilmiyorsa yani pwm kesilmediyse, donanımsal sorun olması muhtemel gibi geldi bana. tabi burada ccp kontrol çıkış donanımsal pinini, farklı bir amaç için, normal port işlemleri vesaire diğer işler için kullanmadığımızı düşünüyoruz. sadece ccp işlevi için ilgili pin kullanılırsa durum böyle olmalı diyebilirim.
bahsettiğiniz fonksiyon içerisindeki kodları açıkça gösteriyor mu? derleyiciniz.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 25 Ocak 2020, 20:25:53
Alıntı yapılan: HAKKITANIR - 25 Ocak 2020, 17:26:57"Benim sorunum şuydu ccsc de Pwm modüülü kapatmak için belli bir fonksiyon var fakat Pwm değerim 8 bitin üzerine çıktığında pwm i tekrar kapatınca ccp modülünde düşük duty li bir pwm kalmaya devam ediyor"

bu fonksiyon içinde sanıyorum, ccp modülün kontrol registerindeki ilgili biti 0 yaparak kapatıyor olmalı.
siz ccp modülü açıp kapatan kontrol registerindeki ilgili bitin, kapatma pozisyonuna alındığından eminseniz ve bu durumdada ccp modül çıkışı sürekli 0V. ye çekilmiyorsa yani pwm kesilmediyse, donanımsal sorun olması muhtemel gibi geldi bana. tabi burada ccp kontrol çıkış donanımsal pinini, farklı bir amaç için, normal port işlemleri vesaire diğer işler için kullanmadığımızı düşünüyoruz. sadece ccp işlevi için ilgili pin kullanılırsa durum böyle olmalı diyebilirim.
bahsettiğiniz fonksiyon içerisindeki kodları açıkça gösteriyor mu? derleyiciniz.

Ben ccs c derleyicisi kullanıyorum Ama açıkçası ccs c de ki fonksiyonların içeriğine nasıl erişebileceğimi bilmiyorum .h dosyasında böyle bir bilgi yok
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 25 Ocak 2020, 20:29:48
....................     // setup_ccp1(CCP_OFF);setup_ccp2(CCP_OFF);
....................       lcd_gotoxy(2,2);lcd_putc("DEFAULT");
0DD5:  MOVLW  02
0DD6:  MOVWF  33
0DD7:  MOVWF  34
0DD8:  BCF    0A.3
0DD9:  CALL   1A7
0DDA:  BSF    0A.3
0DDB:  MOVLW  93
0DDC:  BSF    03.6
0DDD:  MOVWF  0D
0DDE:  MOVLW  00
0DDF:  MOVWF  0F
0DE0:  BCF    0A.3
0DE1:  BCF    03.6
0DE2:  CALL   1E5
0DE3:  BSF    0A.3
.................... 
....................             break; }
0DE4:  GOTO   047
@HAKKITANIR
Yazdığım kodun Asm dosyasını açtığımda böyle bir kod ile karşılaştım Asm diline çok hakim değilim acaba dediğiniz 2 bitlik kalan kısımın sıfırlanmama olayı burası ile mi alakalıdır ?
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: HAKKITANIR - 25 Ocak 2020, 23:01:01
asm ye bende hakim değilim. c de bile iyi değilim.
siz komple kodunuzu derledğinizdeki asm kısmından ben çıkartım yapamam, böyle bir yeteneğim yok.

setup_timer_2(T2_DIV_BY_4, 124, 1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(0);
delay_ms(1000);

üst deki fonksiyonları kendi yazdığınız kodunuz da hazır olarak sadece argümanlarını girerek kullanıyorsunuz.
bu fonksiyon içlerindeki kodlar c derleyicisi kullandığınız için, c kodları ile yazılmış ve görülebiliyordur diye düşünüyorum. en kötü ihtimal içleri asm dir belki bu c fonksiyonlarının.
Buradan şunu demek istiyorum. ilgili ccp modülün kontrol register kodları yazılı bu fonksiyonda. setup_ccp1(CCP_PWM);
fonksiyon içinden bunu görüp, yada daha iyisi direkt işlemci kullanım klavuzu pdf. dosyasında ccp modülün kontrol registerleri bitlerine ve bu bitlerin ne yaptığının açıklamalarına bakmak gerekir.
ccpX için toplamda hepsi dolu bile değildir, belki 1X8 yada 2X8 bit vardır en fazla.
işte sizin 2 bit olayıda o register bitleriyle alakalı.

set_pwm1_duty(0); bununla pwm ccp bir modülü kapatılmıyor olabilir belki.
setup_ccp1(CCP_PWM); belkide bunun içindeki kontrol bitleriyle kapatılıyor olabilir.

İşin diğer bir yüzü, yukarıdaki fonksiyon içleri gerçekden görülemiyor ve bu fonksiyon içlerine hakim olunamıyorsa, içlerinde ne olup ne döndüğü muallaktaysa o zaman kocaman bir soru işreti koymak gerekir. burada bence bir sıkıntı var diyebilirim ancak.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: samedkutuk - 25 Ocak 2020, 23:44:37
Evet kesinlikle fonksiyonların içine erişilmemesi çok garip bir durum ve çok sınırlayıcı bir durum
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: aliveli - 26 Ocak 2020, 01:01:16
enable_interrupts (global);bu niye açık?

set_pwm1_duty(0L);bunu denediniz mi ?
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: HAKKITANIR - 26 Ocak 2020, 01:21:25
ben bunu bilmiyorum. siz içinin görülemediğini söylüyorsunuz şu anda. bunu doğru kabul etmiş oluyoruz.
hazır kullanılan fonksiyon içlerine gerçekten girilemiyor ve içeriği gerçekten bir şekilde görülemiyorsa. bana göre sorun var.

birde şuna bakın bakalım belki bu olabiliyordur. fonksiyonlarını kullanmadan,
modüllerden ccpX ve timer2 nin kontrol registerlerine siz main içinde kendiniz gereken değerleri manuel atamayı deneyin. tabi burda c yazımı önemli oluyor, yazım şekli bir şekilde yardım dosyalarından veya header dosyasından bilinmeli ve bu modüllerin registerler datasheet belgesindeki açıklamalara göre tanımlanmalı.

eğer derleyici bu şekilde bir tanımlamayı da kabul etmiyorsa yani ccpX ve timer kontrol registerine manuel müdahale mümkün değilse, demek ki tüm modüllerde bunu yapacaktır denebilir. bana göre sorun dahada büyüdü. şimdi kocaman oldu.

herhangi bir modülün kesmesi nasıl kullanılabiliyor ve kesme önceliği nasıl veriliyor, yine fonksiyonlar ve fonksiyon argümanlarıyla mı iş kotarılmış.

sizin C derleyici 8 bitlik işlemciler için, belki daha üst bir versiyonunda mesela 16 bitlik işlemciler için olanında durum farklı olabilir. anlattığım işlemleri karşılıyor olabilir. tabi burada işlemcide değişiyor bir üst katagoriye atlanmış oluyor.

yada diyelim siz şu anki sorununuzu çözdünüz ve bu seferlik sıkıntınızı bir şekilde atlattınız.
o zaman sizin derleyici benim yukarıda bahsettiğim kısımlarda gerçekten de sınıfta kalıyor ve elinden bir şey gelmiyorsa, sizin için hala iyi bir derleyici mi olmuş olacak?

size başarılar ve kolaylıklar dilerim. umarım sorununuzu çözersiniz.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: tyildizak - 26 Ocak 2020, 01:31:20
Alıntı yapılan: samedkutuk - 25 Ocak 2020, 23:44:37Evet kesinlikle fonksiyonların içine erişilmemesi çok garip bir durum ve çok sınırlayıcı bir durum


Sınırlamaz, kendi pwm fonksiyonunuzu yazabilirsiniz, atla deve değil, altı üstü t2con-ccprxl-ccpxcon-pr2 registerlerine değer atayacaksınız. İnanın buralarda cevap aramak fonksiyonu yazmaktan kat be kat uzun sürer
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: SpeedyX - 26 Ocak 2020, 16:54:48
Konu CCS ye çamur atma konusuna dönmüş yine :) Kendiniz beceremeyince hemen suçlu aramayın. Bunlar çok basit çözümlerdir. CCS de ister register bazında hiç bir built-in fonksiyon kullanmadan da kod geliştirilebilir.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: HAKKITANIR - 26 Ocak 2020, 17:24:11
evet bilmemekle birlikte bende manuel kod tanımlaması olabileceğini tahmin etmiştim.
yalnız yinede hazır kullanılan kütüphane fonksiyon içlerinin bir şekilde görülebileceğini düşünüyorum.
eğer gerçek den görülemiyorsa bence bu bir eksiktir çamur değil. bana göre eksik diğerine göre normal olabilir.
konuyu tartışmam bana bir şey kazandırmaz. çünkü bu derleyiciyi kullanmıyorum. bana ne deyip bilgim oldu yalnızca diye bitireyim.
Başlık: Ynt: Pwm i tam olarak nasıl sıfırlarım ?
Gönderen: JOKERAS - 26 Ocak 2020, 17:36:33
void PwmInit(void) {
 
    TRISBbits.TRISB0 = 1;    //Buton.
    TRISCbits.TRISC2 = 0;    //PWM OUT.

    T2CONbits.TOUTPS = 0x05; //Timer2 Out frq Bölücü İnterrupt için lazım olur.
    T2CONbits.T2CKPS = 0x00; //Timer2 Clock Kaynağı ön bölücü.Değiştirilen değer PR2'yi değiştirir!
    T2CONbits.TMR2ON = 1;    //Start Timer2.

    PR2 = 255;                //Peryot REG.
    CCP1CONbits.CCP1M = 0x0F; //PWM Mod.
    CCPR1L = 10;              //Duty Ccyle Reg...Sallama bir ilk değer.

}

void main(void) {
   
    PwmInit();

    while (1) {

        if (PORTBbits.RB0 == 0) {
            --CCPR1L;             
            while (PORTBbits.RB0 == 0);
        }
    }
}

Butona her bastığınızda Duty azalacak.CCPR1L Sıfır olduğunda PWM'de sıfır olması lazım.
Bunu alıp olduğu gibi CCS'ye ekleyin.Kodunuzdaki Arttır Azalt Değişkenlerini Direkt olarak
CCPR1L Duty registerine atayın.Aynı şey.

Koskoca Derleyicide Register bazlı Kod yazmamak olurmu?