CCP Modülünde Capture Mode Kullanımı ve Karşılaştırma

ghostrider

Üye
Katılım
4 May 2011
Mesajlar
7
Puanları
1
Yaş
33
Arkadaşlar merhaba,

Bitirme projem var ve bu projede CCP modülünden Capture modunda veri almam ve alınan veriye göre işlem yapmam gerekiyor. Problemler şunlar:

1) Alınacak olan input bir PWM sinyali ve elde edilmesi gereken veri duty cycle. Duty Cycle'ı capture mode da nasıl elde edebilirim?

2) Programın yazıldığı dil PIC Assembly. Elde edilen duty cycle değerini nasıl karşılaştırmaya sokabilirim? Yani küçükse, büyükse, eşitse işlemlerini PIC'te nasıl yapabilirim?

Not: Kullanılan Mikrodenetleyici 16F877'dir. Dil, PIC Assembly'dir.
 

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
CCPR1 ve CCP1CON kaydedicileri hakkında ön bilgin var mı?
 
Konu Sah

ghostrider

Üye
Katılım
4 May 2011
Mesajlar
7
Puanları
1
Yaş
33
Evet var. Nasıl kullanılacağını biliyorum. Fakat duty cycle değerini nasıl elde edebileceğimi ve assembly de küçük ise, büyük ise komutlarını nasıl gerçekleştirebileceğimi çözemedim.
 

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
Duty cycle elde edebilmen için timer kaydedicisine de ihtiyacın var.
Öncelikle timer kaydedicisini sıfırlayıp 1:1 oranına ayarla.
Böylelikle PIC için 4MHz kullanıyorsan, 1uS'lik bir clock elde etmiş olursun.
Hesapların kolay olur.
Ondan sonra kesmeyi oluşturacak olay tipini seçmen gerekir.
Bu işlemi de, CCP1CON kaydedicisinin ilk 3 biti ile yaparsın.
000 ==> CCP modülünü kapatır.
100 ==> Her düşen kenarda kesme oluşur.
101 ==> Her yükselen kenarda kesme oluşur.
110 ==> Her dördüncü yükselen kenarda kesme oluşur.
111 ==> Her onaltıncı yükselen kenarda kesme oluşur.
Kesme tipini belirledikten sonra kesme oluştuğunda;
Timer içindeki cycle 16 bitlik olan CCPR1 kaydedicisinin içine aktarılır.
İşte sen o zaman CCPR1 kaydedicisinin içeriğini okuyup işleyeceksin.
Atıyorum içeriği 25000 ise 25 bin cycle geçmiş demektir.
1 uS x 25000 = 25000 uS = 25 mS
1 / 0.025 = 40Hz
40Hz lik bir sinyal geliyor demektir. (Tabi bu söylediğimi doğru bir şekilde yapmalısın)
Programda karşılaştırma yapmak istersen de;
Yukarıda aldığın CCPR1 kaydedicisinin içeriğini, kendi sabit değerinden çıkartacaksın.
Sonuca göre programı dallandıracaksın...
 
Konu Sah

ghostrider

Üye
Katılım
4 May 2011
Mesajlar
7
Puanları
1
Yaş
33
Yardımın için teşekkür ederim. karşılaştırma konusuna da flaglerle çözüm buldum. ancak ccp girişine bir pulse kaynağı bağladığımda duty cycle değerine göre değişen bir sonuç vermiyor. tabii bu işlemleri proteus'ta yapıyorum. Acaba Duty Cycle a göre sonucu vermemesi programdan kaynaklı bişi olabilir mi? fiziksel devre kursam durum değişir mi ?
 

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
Proteus'u kullan ancak her zaman için gerçek devrede denemen daha mantıklı.
 
Konu Sah

ghostrider

Üye
Katılım
4 May 2011
Mesajlar
7
Puanları
1
Yaş
33
Son olarak;
Sabit değerimden çıkartıp sonuca göre dallandırmamı söylemişsiniz. Matematiksel işlemlerden sonra zero flag ya da overflow flag gibi değerler var mı? varsa bunlarla yapılacak kesmeler hangi register üzerinden kontrol ediliyor.
 

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
Matematiksel ve aritmetiksel işlemler sonucunda etkilenen 2 tane bayrak var.
O da STATUS kaydedicisindeki Z (Zero-Sıfır) ve C (Carry-Elde) bayraklarıdır.

STATUS,2 = Z (Zero-Sıfır)
STATUS,0 = C (Carry-Elde)

Z (Zero-Sıfır) : Aritmetiksel işlemler sonucunda, değerler birbirine eşit ise bu bayrak 1 olur. Değilse 0 olur.
C (Carry-Elde) : Matematiksel işlemler sonucunda, sonuçta taşma var ise bu bayrak 1 olur. Değilse 0 olur.
 

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
589
Puanları
1
Umarım yapmak istediklerini güzel bir şekilde gerçekleştirebilirsin.
Sonucunu buraya da yazarsın. :)
 

Forum istatistikleri

Konular
122,175
Mesajlar
861,662
Kullanıcılar
438,652
Son üye
elifesma

Yeni konular

Çevrimiçi üyeler

Üst