PIC16F84 PORTLARINDA YAZLIMLA PWM OLUŞTURMAK

Başlatan soneryumruk, 05 Nisan 2011, 02:27:39

soneryumruk

ARKADAŞLAR BİR KONUDA SİZLERDEN FİKİR ALMAK İSTİYORUM PIC16F84 DENETLEYİCİSİNİN PORTLARINDAN TMR0 ZAMANLAYICISI ARACILIĞI İLE PWM SİNYALİ ELDE ETMEYE ÇALIŞIYORUM. FAKAT SİNYAL %100 DOLULUK ORANINDAN %0 DOLULUK ORANINA BELİRLİ BİR SÜRE DAHİLİNDE İNMESİNE RAGMEN %0 DOLULUK ORANINDAN BİRDEN %100 DOLULUK ORANINA GERİ DÖNÜYOR. NE DENEDİMSE ÇÖZEMEDİM. BU KONUDA YARDIMCI OLURSANIZ ÇOK SEVİNİRİM BUYRUN BU DA YAZDIĞIM ASM PROGRAMIM:
;PWM DENEMESI
      LIST   P=16F84A
      INCLUDE   "P16F84A.INC"
SAYI      EQU   H'0C'
SAYAC1      EQU   H'0D'
SAYAC2      EQU   H'0E'
SAYAC3      EQU   H'0F'
      CLRF   PORTB
      BSF   STATUS,5
      CLRF   TRISB
      CLRWDT
      BSF   STATUS,5
      MOVLW   B'11010001'
      MOVWF   OPTION_REG
      BCF   STATUS,5
BASLA      MOVLW   H'FF'
      MOVWF   SAYAC1
      MOVLW   H'00'
      MOVWF   SAYAC2
      MOVLW   H'FF'
      MOVWF   SAYI
ARTIR      MOVLW   H'FF'
      MOVWF   PORTB
      INCF   SAYAC1,F
      MOVF   SAYAC1,W
      CALL   TIMER1
      CLRF   PORTB
      DECF   SAYAC2,F
      MOVF   SAYAC2,W
      CALL   TIMER2
ARTIRR      MOVLW   H'0A'
      MOVWF   SAYAC3
TEKRAR      MOVLW   H'FF'
      MOVWF   PORTB
      CALL   TIMER1
      CLRF   PORTB
      CALL   TIMER2
      DECFSZ   SAYAC3,F
      GOTO   TEKRAR
      DECFSZ   SAYI,F
      GOTO   ARTIR
      MOVLW   H'00'
      MOVWF   SAYAC1
      MOVLW   H'FF'
      MOVWF   SAYAC2
      MOVLW   H'FF'
      MOVWF   SAYI
AZALT      MOVLW   H'FF'
      MOVWF   PORTB
      DECF   SAYAC1,F
      MOVF   SAYAC1,W
      CALL   TIMER1
      CLRF   PORTB
      INCF   SAYAC2,F
      MOVF   SAYAC2,W
      CALL   TIMER2
AZALTT      MOVLW   H'0A'
      MOVWF   SAYAC3
TEKRAR2      MOVLW   H'FF'
      MOVWF   PORTB
      CALL   TIMER1            
      CLRF   PORTB
      CALL   TIMER2
      DECFSZ   SAYAC3,F
      GOTO   TEKRAR2      
      GOTO   BASLA
TIMER1      MOVF   SAYAC1,W
      MOVWF   SAYAC1
      MOVWF   TMR0
TIMER11      BTFSS   INTCON,2
      GOTO   TIMER11
      BCF   INTCON,2
      MOVWF   SAYAC1
      RETURN
TIMER2      MOVF   SAYAC2,W
      MOVWF   SAYAC2
      MOVWF   TMR0
TIMER22      BTFSS   INTCON,2
      GOTO   TIMER22
      BCF   INTCON,2
      MOVWF   SAYAC2
      RETURN
      END
NE MUTLU TÜRKÜM DİYENE! M.KEMAL ATATÜRK

soneryumruk

NE MUTLU TÜRKÜM DİYENE! M.KEMAL ATATÜRK

ete

Asm den hemen bir çözüm bulmak her halde kolay olmasa gerek. En azından kullandığın mantığı burada açıklayabilirdin.
Sen açıklamamışsın ben ne olması gerektiğini açıklayayım bari.

Öncelikle PWM frekansına karar vermen gerekiyor. Diyelimki 500 Hzlik bir sinyal oluşturacaksın. BU sinyalin (T) peryot süresi T=1/F formülünden,
T=1000/500=2 ms olarak bulunur. Bu süre içinde hem HIGH hemde LOW süreleri yer alacağından toplam süreye 100 değerini vereceksin.
Yada toplam süreyi 100 e böleceksin. Bu senin bir birimlik sinyal süren olacak daha doğrusu %1 lik sinyal süren olacak.
2ms=2000us ettiğinden biz us üzerinden yürüyelim istersen.
2000/100=20us senin %1'e tekabül eden süren olacak. O halde sen her 20us de bir kesme oluşturur ve kesmeleri sayarak;
PWM sinyali oluşturacağın pin çıkışını Duty değeri kadar HIGH ve 100-Duty değeri kadar da LOW da tutarsan isteğini yapmış olacaksın.
Diyelimki %40 lık bir duty değerine sahip bir sinyal oluşturacaksın.
O halde kesmeleri sayarak 40 kesme süreince çıkış HIGH ve 60 kesme süresince çıkış LOW daha sonra yeniden 40 kesme HIGH ve 60 kesme LOW oalcak şekilde çıkışı organize edersen istediğin sinyali elde edersin.
İŞin mantığı böyle . Şimdi sen kendi programını kontrol et ve nerde yanlış yaptığını kendin bul. Yada kullandığın mantığı anlat ona göre düşünelim.

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

soneryumruk

Öncelikle mesajımda açıklama eksikliği yaptığım için özür dilerim, benim mantığımda aynen sizin söylediğiniz gibi. Ben portb'ye bağlı ledlerin parlaklığını kontrol etmekle uğraştığım için frekansın çok önemi yok benim için. 100 Hz olmuş 1K Hz olmuş şuan çok önemli değil. Ben yukardaki asm kodlarında yaptığımı söyleyeyim. İki tane sayac değerim var. İkisinin toplam değeri h'255' Birisi artarken diğeri azalıyor. Ben bu sayac değerlerini azaltırken ya da artırırken her defasında ilgili TIMER alt programlarını (TIMER1 ya da TIMER2) çağırıyorum. Burada tmr0 içine o sayacın değerini yüklüyorum ve tmr0 o değer kadar sayıp kesme oluşuyor ve program kaldığı yere tekrar dönüyor. Bu şekilde portb tmr0 süresi kadar 1 ve 0 oluyor. Ve bunu sinyali düzgün görmek açısından başka bir sayaçla aynı işlemin 100 defa tekrar edilmesini sağlıyorum. Bu şekilde portb'nin lojik 1 olma durumu %100 değerinden %0 a doğru giderken lojik 0 olma durumu %0 dan %100 e doğru gidiyor. Buraya kadar bir sıkıntı yok. Fakat burdan sonra yazdığım programa göre portb'nin  lojik1 olma durumu bulunduğu %0 oranından %100 e doğru ilerlemesi gerekirken birden tekrar %100 e dönüyor ve program ilk baştaki gibi çalışıyor. Ben portb'nin %0 doluluk oranından %100 doluluk oranına da aynı şekilde ilerlemesini istiyorum. Sorunum bu konuydu. Umarım yaptığım açıklama yeterli olmuştur. Tekrar söyleyeyim amacım herhangi bir sabit doluluk oranında bir frekans elde atmek değil. Amacım doluluk oranı %0-%100-%0 arasında sürekli ve düzenli olarak değişen frekans sinyali elde etmek.
NE MUTLU TÜRKÜM DİYENE! M.KEMAL ATATÜRK

ete

Asm yi bir yere kadar takip edebiliyorum ama senin yazdıklarından fazlaca bir anlam çıkartamadım. Bana göre lüzumsuz satırlar var.
Mesela;
ARTIR      MOVLW   H'FF'
      MOVWF   PORTB
      INCF   SAYAC1,F
      MOVF   SAYAC1,W
      CALL   TIMER1
Burada yer alan MOVF SAYAC1,W komutunu veriyor ve TIMER1 etiketine gidiyorsun. Peki orada ne yapıyorsun;
TIMER1      MOVF   SAYAC1,W  ;  bu komutu zaten verdin bir daha neden veriyorsun.?
      MOVWF   SAYAC1
      MOVWF   TMR0
Her neyse benim için gerisini takip etmek zor. Özellikle duty HIGH konumu artarken LOW konumu nasıl azalıyor ona bakmıştım ama bir türlü çıkartamadım. ASM nin zorluğu burada bir anlık konsantre olup her şeyi yazabilirsin ama sonradan bakınca insan kendi yazdığınıda anlayamıyor maalesef.
Doğru dürüst kesme kullanmadan bu işi yapmak gerçekten zor. Sayaçları takip etmekten sinyalin şekli bozulur gibime geliyor ama yinede iddia etmiyorum. Beni aşan bir konu olduğu için daha fazla yorum yapmayacağım.

Ete


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