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://ibb.co/G5L1ZKS)
pwm çıkış portlarını sıfırla sorunun kökten çözülür o zaman.
Duty sıfır değerine özel bir macro ile pini output yapıp sıfıra çek, CCP yi kapat
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
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çıp
setup_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
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 :-)
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.
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?
timer stop/run biti yok mu?
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
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 ol
mamalı
bu modulun
pwm olarak
çalışabilmesi için de
bit 3-0 : 11xx = PWM mode
olmalı
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 olmamalı
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?
"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.
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.
"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.
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
.................... // 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 ?
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.
Evet kesinlikle fonksiyonların içine erişilmemesi çok garip bir durum ve çok sınırlayıcı bir durum
enable_interrupts (global);
bu niye açık?
set_pwm1_duty(0L);
bunu denediniz mi ?
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.
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
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.
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.
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?