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ş
34
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.
 
CCPR1 ve CCP1CON kaydedicileri hakkında ön bilgin var mı?
 
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.
 
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...
 
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 ?
 
Proteus'u kullan ancak her zaman için gerçek devrede denemen daha mantıklı.
 
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.
 
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.
 
Umarım yapmak istediklerini güzel bir şekilde gerçekleştirebilirsin.
Sonucunu buraya da yazarsın. :)
 

Yeni mesajlar

Forum istatistikleri

Konular
127,964
Mesajlar
913,940
Kullanıcılar
449,609
Son üye
cherrywine

Yeni konular

Geri
Üst