Pwm i tam olarak nasıl sıfırlarım ?

Başlatan samedkutuk, 23 Ocak 2020, 23:05:01

samedkutuk

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
samedkutuk

samedkutuk

....................     // 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 ?
samedkutuk

HAKKITANIR

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.

samedkutuk

Evet kesinlikle fonksiyonların içine erişilmemesi çok garip bir durum ve çok sınırlayıcı bir durum
samedkutuk

aliveli

enable_interrupts (global);
bu niye açık?

set_pwm1_duty(0L);
bunu denediniz mi ?

HAKKITANIR

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.

tyildizak

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

SpeedyX

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.

HAKKITANIR

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.

JOKERAS

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?