PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

emrah

ete hocam açıklamaların için teşekkür ederim. birkaç sorum olacak.

kesme konusnu detaylı bilmiyorum ve ilk kez pwm ile ugraşıyorum. sizin pwm ders anlatımınız olan projede kesme kısmındada  254 yazılmış.  bunu bu şekilde yazdıgımızda dediginiz gibi 2us lik zaman. sizin projede ne amaçla böyledir hocam?  benim programda 254 yerine 0 mı yazmalıyım ? pwm frekansı içinmi bu böyledir? 

gecikme kısmında 10 pauseus gibi gecikme yapsam olurmu peki? iç içe iki döngü yapıpta? kesmeye bu beklemede etki yaparmı?

justice_for_all

#346
230 yazarak dene bakalım beklemeyi kaldır tamamen nedeni ise timer a fazla dgr yuklersen programın surekli kesme icinde dolanır diger islemleri yapamaz buyuzdn timera diger islemleri yapabilmesi icin timer degerini dusurmelisin
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

emrah

hocam beklemeyi kaldırırsam butona bastıgım zaman duty degerini nasıl artıracam?   16f777 ile 3 çıkış pwm programı varmıdır hocam? yada 16f877 ile yapılmıs 2 çıkışlı hpwm uygulamasına aynı komutlarla 3.  çıkış için uyarlasam olurmu regesterleri aynımıdır?

justice_for_all

buton varsa bekleme olmalı ozaman timer degerini dgstrip denedinizmi ben 10f200 ile yaptm hc kıprasma olmuyo hocam
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

emrah

yarın deneyecegim, malzemeler iş yerinde. hocam cevaplar için teşekkür ederim.

ete

Bekleme olmayacak demedimki. Döngüde bir beklemedir.
FOR X=0 to 100 yerine FORX=0 to 500 yada daha afzlasını yazın benzer süreleri yakalayabilirsiniz.
Ama arada ciddi bir fark olur. Birinde kesme oluştuğu anda 1000us sonra kesmeye gider program birine belkide 1us sonra gider.
Bu nedenle kritik durumlarda döngü ile gecikme yaratacaksanız döngüyü uzatın ama araya gecikme koymayın. Koyarsanızda en fazla 1us ile 5us arası bir değer koyun.

HPWM ile ilgili bir soru sormuşsun. Tek HPWM çıkışı olan ile iki veya 3 çıkışı olan aynı şekilde kontrol edilir.
Bunun örneği derslerde mevcut.
Tek olanda CCP1CON  iki olan CCP1CON ve CCP2CON , 3 çıkış olanda CCP1CON ve CCP2CON ve CCP3CON regsiterleri kullanılmaktadır.

CCPxCON.2=1:CCPxCON.3=1    (x yerine 1 -2 veya 3 gelecektir) komutu ile HPWM kanallarını aktif edersin.
Duty değerini aşağaki şekilde registerin diğer birimlerine yerleştirirsin.
      CCPxCON.4=Duty.0
      CCPxCON.5=Duty.1
      CCPRxL=Duty>>2
Hespi bu.
Tabiiki Duty değeri işlemci frekansına, ve PWM frekansına göre değişir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

Alıntı yapılan: ete - 05 Ocak 2012, 19:32:55

Bir trick vereyim; trick, butonların pulldown çalışması halinde geçerli yalnız.
IF PORTB.0=0 THEN DUTY_a=DUTY_a+1:GOSUB BEKLE  satırı yerine
DUTY_a=DUTY_A+PORTB.0 :GOSUB BEKLE şeklinde yaz bakalım ne olacak. Butona basılmış ise PORTB.0=1 olacağı için toplama sonucu Duty_A değeri bir artar. Ama butona basılmamış ise değer sürekli sıfır ekleneceği için değer değişmeyecektir.
BU mantığı diğer satırlarada uygularsan programında belirli bir hızlanma olacaktır.

Ete

hocam burada bahsettiğiniz  DUTY_a=DUTY_A+PORTB.0 :GOSUB BEKLE  komutunu her buton için yaptıgım zaman, butonlara basılmadıgı zaman bile her buton satırında eşitlemeden sonra bekle döngusunue gidiyor.

DUTY_A=DUTY_A+PORTB.0:gosub BEKLE
DUTY_A=DUTY_A-PORTB.1:gosub BEKLE

DUTY_B=DUTY_B+PORTB.2:gosub BEKLE
DUTY_B=DUTY_B+PORTB.3:gosub BEKLE

DUTY_C=DUTY_C+PORTB.4:gosub BEKLE
DUTY_C=DUTY_C+PORTB.5:gosub BEKLE

şeklinde.

ıf komutları var iken ve tmr 230 yaptıgmda kırpıma dahda fazlalaştı?  ıf komutlarını hepsini kaldırdıgmda kırpısma olmuyor!

ete

Bekle komutlarının tamamını kaldır ve o satırların sonuna bir tane GOSUB BEKLE yaz. Olur sanırım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

hocam bekle dongusunu kısa yaptım bu şekildede oldu. if komutlarını ve  lcd ye yazdrma komutlarını ana dönguden kaldırdım sadece sizn dediginiz buton artırma satrlarını ekledım. kırpılma olmuyor bu şekilde. tmr degerine 230 da yukledım 200 de yukledım bi değişim göremedim.  tmr içine ne yuklemeliyim ?

ete

Ledlerin parlaklığını artıran ve kırpışma yapmamasını sağlayan en yüksek değeri yazmalısın.
Yada Kesme kısmından TMR0=xxx komutunu tamamen sil bakalım ne olacak. Sorun yok ise silik kalsın.
Burada önemli olan ledlere uygun bir PWM frekansını vermektir.Bunuda TMR0 sayacı sağlayacak elbette.
Frekans aralığı 100-500 Hz dolayındadır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

TMR0 a 254,230,180,0 gibi degerler denedim hepsindede aynı, yani kırpısma yok if komutlarını kaldırdımdan bri bir değişim göremedim, görememde heralde. en son dedgnız gibi tmr0 komutunu kaldırdım yine birşey belli olmuyor.

hepsini denerkende ufak bi sorun oluyor sadece. smulasyonda da yaparken bu görünüyor. butonla basılı tutarak braz artırmaya başladıgımda belli bir noktada frekans kayması oluyor sanki. onoktadan gecerken simulsayonda osiloskopta bakıyorum  sabit bir şekilde duty artarken veya azaltırken o noktadan gecince  o pwm sinyaliileri yada geriye atlıyomuş gibi oluyor. boarda denedigmdede aynısı oluyor rgb ledde gözlemlerken sanki o kanaldan bi anlık kesinti oluyo

ete

O oluşum bence doğal. Butona bastıkça Duty değeri artıyor. Bir kısıtlama yok. Sonuçta arta arta 255 ve ardından birden 0 oluyor. İşte bu noktada duty registeri bir maksimum bir minimum değer uygulamak zorunda kalıyor. Olay budur.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

hocam 99 değerinden sonra led maksimum şekilde yanıyor 99 ile 255 arası kanal çıkışı dogrudan +5volt oluyor osiloskopta duz çizgı oluyor +5 seviyesinde. bu olay bu aralıkta normalmı hocam ? dedigm olay 1 ile 99 degerleri arasında  oluyor.  osiloskopta baktıgımda anlık  faz kayması diyebilirm

ete

O zaman max duty değeri 100 (%100 gibi) kullanıyorsundur ve bu olayda 99 dan sonra meydana geliyordur.
PWM %100 duty değerini pek sevmez. O nedenle 1 den aşağıya düşmesin 99 dan yukarıya çıkmasın şeklinde komut koyarsan bu sorun oluşmaz.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

Bende if komutları ile  şunu eklemiştim zaten

'IF DUTY_A=100 THEN DUTY_A=1
'IF DUTY_B=100 THEN DUTY_B=1
'IF DUTY_C=100 THEN DUTY_C=1

'IF DUTY_A=255 THEN DUTY_A=99
'IF DUTY_B=255 THEN DUTY_B=99
'IF DUTY_C=255 THEN DUTY_C=99

bu seferde bunlar olunca kırpşmalar baslıyor malesef.