CCP1 den belirli sayıda pals üretme

Başlatan axionvb, 05 Nisan 2011, 00:30:42

axionvb

18F452 nin CCP1 portundan 5 Khz lik palslerin istediğim kadar üretilmesi ve aynı anda LCD ekranda gösterilmesini nasıl sağlarım.

https://www.picproje.org/index.php/topic,32746.0.html bu linkte soruyu daha önce sordum fakat bir cevap çıkmadı.

Erol YILMAZ

ürettiğin palsleri başka bir pinden girerek sayarsın ve istediğin yerde dur dersin....

axionvb

Öncelikle teşekkür ederim. Bu şekilde benimde aklıma gelmedi değil fakat böyle bir uygulama yapmak doğru olmaz diye düşünüp vazgeçmiştim. Sizin verdiğiniz bu bilgiden şunu anlıyorum. hiçbir ek eleman kullanmadan RC2 portundan çıkıp örneğin RA4 portuna bağlayacağım. Çıkış palslerini RC2 den dış devreye verirken aynı zamanda RA4 portundan giriş yaparak ölçeceğim.

linkte verdiğim örnek çalışmayı inceleyebildiniz mi? Yeni başlayan biri olarak doğru yoldamıyım ? Amacım bir gaz sayacının ölçüm sisteminin kontrolü için pals ölçme ve pals üretme işlemini yerine getirecek bir devre. Pals ölçme modunda gaz sayacının Namur sensöründen gelen palsleri saymak ve etiketinde verilen pals karşılığı m3 değerini ölçmek ayrıca gaz sayacının ürettiği palsleri sayan totalizer devresinden namur sensörü ayırıp buraya devreyi bağlayarak simulasyon modunda belirli sayıda pals göndermek. Tüm bu işlemlerde gerçek zamanlı olarak değerlerin LCD ekranda gösterilmesini sağlamak.

picmanya

#3
Alıntı yapılan: axionvb - 05 Nisan 2011, 00:30:42
18F452 nin CCP1 portundan 5 Khz lik palslerin istediğim kadar üretilmesi ve aynı anda LCD ekranda gösterilmesini nasıl sağlarım.

https://www.picproje.org/index.php/topic,32746.0.html bu linkte soruyu daha önce sordum fakat bir cevap çıkmadı.

CCPx portu kullanıldığına göre,
pwm çıkış pals leri timer2 veya 3 kurularak kullanılıyor olmalı,
pwm duty oranınızı yazmamışsınız ama bu tarz bir istekde farketmese gerek,
CCPx için kurulan timer'ın TMR register içeriğini uygun yerlerde okuyarak veya bu timer'in kesmesini ayarlayıp kullansanız istediğiniz olmazmı?
çözüm CCPx modülünün kullanım zamanlarını yürüten timerx modülünde olabilir.
lcd kullanımını biliyorsanız lcd ekranına değişken içeriklerini basabiliyorsanız,
pwm palsleri ekranda göstermek zor olmasa gerek.

axionvb

İlgilendiğin için teşekkür ederim picmanya,

Sorun değerin ekrana yazdırılması yada palslerin üretilmesi değil. Eğer ilk mesajımda verdiğim linki açar ve orada rpid ve hotfile yüklediğim proje dosyasını alıp çalıştırır ve mesajı incelersen sorunu sizde göreceksiniz. Problem tam olarak istenen sayıda pals üretilmesidir. Örneğin 102481 pals ürettildiğinde LCD nin 1. satırına bu değer canlı olarak yazılacak ve 102481 e ulaşıldığında pals üretimi duracak. Örneği incelediğinizde ben palslerin durması olayını ancak fonksiyondaki >= şartı ile sağlıyorum ama devre hiçbir zaman = şartını yakalayamıyor bir sonraki çevrimde > şartı sağlandığı için duruyor.

iyildirim

#5
Eğer tam istenen sayıda puls üretilmek isteniyorsa LCD ye sonuçları yazmak ikinci derece de önemli olmalı. 
Puls sayma işlemi timer2 kesmesinde yapılıyor. Ancak istenen puls sayısına ulaşıldığı kontrolu burada değil de LCD'ye değerleri yazma sırasında yapılıyor.

İstenen sayıya ulaşıldığı kontrolu timer2 kesmesinde yapılmalı.
Ancak timer2 kesmesi puls üretilmeye başladığında oluşuyor. Bu durumda timer2 kesmesi sırasında puls sayısı kontrol edilip şart sağlandığında hemen CCP ve/veya timer durdurulduğunda son puls güdük kalır.
Bunun için kesmede eşitlik sağlandığında ikinci bir if ile TMR2= PR2/2 olana kadar bekleyip timer2 ccp durdurulabilir. Veya frekans çok düşük ve burada beklenmek istenmez ise bir değişken ile  son darbede olduğumuz belli edilir. main içerisinde son darbedeyiz değişkeni set edilmiş ise tmr2=pr2/2  şartına bakılarak timer2 ve ccp durdurulabilir.


axionvb

Verdiğin bilgiler için teşekkür ederim. Ben bu sorunu hallettim. Değişikliği projeyi düzenleyip gereksiz kodları eledikten sonra siteye koyacağım. Böylece bu tarz bir program yazacak arkadaşlara ışık tutmuş olur.

Bunun dışında başka bir sorun var. henüz çözemedim ama üzerinde çalışmaya devam ediyorum. Eğer projeyi incelersen ANA MENU > AYARLAR > HF=M3 DEGERI GIR menusünü takip ederek ekranda oluşturduğumuz set değeri 16383.61 e kadar olan sayılar eproma doğru kaydediliyor tekrar okuttuğumda aynı değer ekrana geliyor. Fakat 16383.62 olarak girdiğimde bu değer eproma 16383.61 olarak kaydediliyor 0.01 eksik okunuyor bunun sebebini biliyormusunuz. Projeyi inceleyip düzeltmenin nasıl yapılacağını yazabilirmisin. Birde mümkünse hazırladığım projenin mantığı menu yapısının oluşturulması ile görüşlerin nedir. Yani şu bölümü gereksiz yapmışsın bunu şu şekilde yaparsan daha verimli ve daha hızlı bir kod olur gibi

Teşekkür ederim.

iyildirim

#7
Float sayıların epromdan okunduğunda farklı olmasının mantığı yok.. 

Olsa olsa CCS nin float kütüphaneleri ile ilgilidir diye düşünüyorum. Sonuçda PC de de  float sayılarla çalışırken 1.5 yerine 1.499999999  gibi şeyler görülebiliyor. 

Sorunu anlamak için epromu devreden çıkaralım.

Girilen string değeri atof ile float a dönüştürdükten  sonra direkt olarak LCD'ye yazıp kontrolunü  yapabilirsin.

Ayrıca iki ayrı float değişkene de bahsettiğin 16383.61 ve 16383.62 sayılarını gir. Sonra bunların bellekte nasıl göründüklerine bakıp sorunun CCS de mi, epromda mı, başka bir yerde mi olduğu anlaşılabilir. Sayılar bellekte aynı ise direkt olarak CCS nin float lib'i, sayılar bellekte farklı, ama lcd ye yazdırınca aynı ise printf lib'i suçlu olmalı. Birde bu sayıları eproma yazdığımızda bellekte nasıl göründüklerine bakılabilir. Diğer yerlerde sorun yok ve eprom bölgesinde bellekte farklı görünüyorlar ise sorunu write_eeprom  da aramalı.