avatar_medes

COUNT KOMUTU

Başlatan medes, 24 Aralık 2011, 21:33:03

medes

ete hocam
ben count komutu ile bir sayıcı yapmak için çalıştım gayet güzelde oldu fakat okuma yaparken
geç kalıyor  okuma zamanını hızlandırmak için 1000ms yerine 500ms zaman kullandım okunan
frekansı 2 ile çarprak okuma zamanı kısaldı fakat ben biraz daha hızlı olmasını istiyorum 1000ms'yi
4'e bölerek denedim çok güzel oldu fakat bu seferde gelişi güzel frekanslar okumaya başladı
bu komutun okuma zamanı daha hızlı olma imkanı varmı.
çünki elimde bir devre var 16f628 kulanılmış frekans girişi PORTA.5 olarak yapılmış frekans 300Hz
girdiğinde PORTB.2 çıkışında role çekiyor ve istenilen devreyi çalıştırıyor .
ben girişin POTRA.5 olması nedeni ile bu sayıcının kesme uygulamaları ile yapılmadığı kanaatindeyim. bu konuda nasıl bir uygulama yapılabilinir. sagılarımla
medes

KAZIMUGUR

Birim zmandaki puls sayısı yeteri kadar çoksa frekansı yani pulsleri saymak makuldur.
Ama sayı az ise kesme kullanarak bir işaretle başlayıp diğerine kadar bir timer çalıştırmak daha hızlı bir yol olabilir.
Özet :
Yerine göre frekans yerine göre periyot kulanmak lazım.

ete

COUNT komutu çok güzelçalışan bir komut. Kusursuz çalışıyor ama bir kusuru programı sayma süresi kadar bloke ediyor. O esnada başka hiç bir iş yapamıyorsunuz ki buda program yavaşladı anlamına geliyor.

Bu sorunu aşmak için count komutundan vazgeçmen gerekiyor. Ne yapman gerektiğini açıklayayım.
TMR0 ve TMR1 sayaçlarının her birinin dışarıdan giriş yapabilfiği birer ayrılmış pini mevcuttur.
Bu sayaçların sıfır olanı 8 bitlik  bir olanı ise 16 bitliktir.  Her biride giriş pinlerindengelecek pulsları sayacak şekilde ayarlanabilirler. Bu durumda sana programını bloke etmeyecek bir zaman tutma sistemi yapmak kalır. Bunuda kesme ile halledersen işin tamam demektir.
Toparlarsak; TMR1 sayacını dışarıdan giriş pininden sayacak şekilde ayarlayıp , TMR0 sayacınıda kesme metodu ile 100ms yada 1000 ms zaman tutacak şekilde ayarladıkmı işin tamamdır. İşin başlatılma sürecini ya bir butona yada bir başka olaya bağlar ve zamanı başlatırsın. Süre dolduğu zaman TMR1 sayacındaki değeri alıp kendi değişkenine aktarırısın. Böyle geçen süre içinde kaç puls geldiğini hassas bir şekilde programını yavaşlatmadan öğrenmiş olursun.

Biraz teorik anlattım ama iş basit diye detay vermedim artık. Bütün yapman gereken;
İşlemciye göre hangi pinin TMR1 sayaç girişi olduğuna bakmak ve onu dışarıdan puls alacak şekilde nasıl ayarlarsın (T1CON) öğrenmek. Ayrıca TMR0 sayacını nasıl zaman tutucu olarak kullanırsın onuda öğrendinmi (pek çok RTC siz saat projesinde bu yapıldı zaten ve benim derslerde örneği mevcut) gerisi gelir sanırım.

Ete

medes

ete hocam
verdiğiniz bilgiler ışığında bayağı çalışmalar yapıyorum. Dersleriniz'deki  programlara bakıyorum
ve onların üzerinde çalışmalarda yapıyorum. ders lere sürekli göz gezdiriyorum.
elimde bir sağlam role var bir tanede arızalı dancall yıldırım'dan dolayı biri arızalandı pic 16f628
ben de devresini tamir yaptım diğer rolenin entegresini taktığım zaman gayet güzel çalışıyor.
bende COUNT komutu ile ton frekansını okuması için programı yaptım fakat telsiz mandalına basıp
konuşmak için beklemek gerekiyor  diğer role ise bastığım anda role çekiyor.
şimdi benim anlamak istediğim bu devrede frekans girişi PORTA.5 ile yapılmış bu program nasıl oluyor
hangi bir çeşit programla yapılmış olabilir mandalına basılmasıyla rolenin çekmesi bir oluyor.
bu program tmr1 ile olsa PORTB.6 kullanması gerekmezmi?
saygılarımla

ete

Yazdıklarından bir anlam çıkarmak zor. Her zmanki gibi bilen insanın mantığı ile yazmaya çalışmışsın ama bilmeyenlere göre değil.
Röle denilinca aklıma bildiğimiz röle geliyor.  "ELimde bir sağlam röle var birde Dancall arızalı " cümlesindenbir anlam çıkarmaya çalıştım sanki araç telefonu  yada telsiz gibi bir şey olsa gerek. Ama röle ile ne alakası var anlamadım.
Yazdıklarına genel anlamda bakarsak bir telsiz röle sisteminden bahsediyor gibisin.

Her neyse daha anlaşılır yazarsan sevinirim.

PORTA.5 diy enitelediğin şey PORTA.4 olmasın? Zira TMR0 portA.4 pinini giriş olarak kullanır.
TMR1 ise (16F628 de) PortB6 yı kullanır. Puls ölçmenin muhtelif yolları vardır.
rekans yüksek ise zamanı kısa tutabilirsin. Yada 1000 ms yerine 100 ms lik bir süre alırsın 10 ile çarparsın. Bunlar sana yaklaşık gelen puls sayısını verecektir. 100 ms de 10 puls almış isen 1000 ms de bu 10*10=100 puls olacaktır.
Bazen yalnızca puls genişliğini ölçmek bile frekans konusunda insana bilgi verebilir.
100 Hzö lik sinyali esas alalım. Peryodu T=1/F dir. Yani 1/100 yada us cinsinden 1000000/100 dür. Buda 10.000 us yada 10 ms eder. Bunun yarısı Low diğer yarısıda High süresini verir. Ben şayet High süresini ölçersem ve 5 ms bulursam bu girişte 100 Hz lik bir sinyalin olduğunu gösterir. Bu tür ölçümler pek hassas sonuçlar vermesede sonuçta gelen sinyalin bilgisini yaklaşık olarak verebilir.

Ete

zoptrik

http://etepic.com/index.php?topic=199.msg1855#msg1855
Ben bu şekilde aracımın devrini ölçerken başka işlemler de yaptırabilmek için bir program yazmıştım. Videoda daha açık görünüyor. portb.0 dan kesmeyle her pulse geldiğinde sürekli sayan tmr1 sayacını sıfırlıyorum ve ekranın sol altına yazdırıyorum. bunu da f=1/t gibi bir kodla sağ alta yazdırıyorum. Kodlar daha da açıklayıcı olur işinize yarar İnşallah.
iyi forumlar...
DEHA; İMKANSIZDA MÜMKÜNÜ GÖREBİLMEK DEMEKTİR.GEMİLERİN KARADA DA YÜZEBİLECEĞİNİ SEZMEK, MEHMETLERDEN BIRINI "FATİH" YAPAR...!

medes

#6
ete hocam
verdiğiniz bilgilerden anladığım kadarı ile ya tmr1 yada count komutu ile idare edeceğim bana çok hassas ölçüm geretirmediği için PULSıN komutunu kullanacağım bu komutu hiç kullanmadım fakat
bir deneme yapacağım örneğin PULSIN PORTB.4,0,DEĞİŞKEN  portb.4'e 120Hz uyguladım bu frekans'ın benim istediğim  frekans ise IF DEĞİŞKEN  AND  İSTENEN  THEN  PORTB.1=1 portb.1'deki
ledi yak burada İSTENEN değikene 120Hz frekansı nasıl atama yapacağım.hocam kusuruma bakmayın
yaştanmıdır bilmem bazen konuları benim anlayacağım biçimde değilse kavramada zorlanıyorum.
KAZIMUĞUR' ZOPTRİK  arkadaşlara ilgilerinden dolayı  saygılarımı sunarım mutlaka fikirlerinden
faydalanıyorum ve uygulamalarını takip ediyorum.

ete

PULSIN komutu benzer şekilde bir sinyalin puls genişliğini ölçmek için kullanılıyor.
Komutta dikkat edilecek husus ölçüm sonucunun (4 Mhzde) 10us lik katlar şeklinde geleceği.
Gerçek ölçüm değeri 2500 us ise değişkene 250 değeri yerleşecektir.
Bu komut da işini görebilir sanırım.

Kolay Gelsin
Ete


medes

ETE HOCAM
pulsin komutu ve count komutlarını gayet güzel olarak kullanıyorum tabiki sayenizde dersleri sürekli okuyorum bayağı ilerleme kaydettim.şimdiki sorunum count programını dtmf programı ile
beraber kullanmak istiyorum. fakat bu iki programın etiketlerine başla komutundan nasıl dallanma
kulanacağım. burada kafam karıştı dtmf için IF STD=1 THEN SIFREOKU komutu ile dallanabiliyorum.
COUNT programına nasıl bir komut yazmam lazım bu konuda bilgi verirseniz sevinirim.saygılrımla
medes
BASLA:
IF STD=1 THEN SIFREOKU

     goto basla
SIFREOKU:
    SAYA=0:SAYB=0:SAYC=0
    gosub TUSBAK
    SAYA=DTMF
A2:
    gosub TUSBAK
    SAYB=DTMF
A3:
    GOSUB TUSBAK
    SAYC=DTMF
    HIGH ROLE
    PAUSE 100
    GOTO BASLA
TUSBAK:
    while STD=0:wend
    dtmf=0
    DTMF =Q1+(2*Q2)+(4*Q3)+(8*Q4)
    while STD=1:wend
    return
    end
'*****************frekans okuma bolumu*************************
oku:
COUNT   GIRIS,1000,FREKANS
IF FREKANS  >(KARSILASTIR-3) and FREKANS  <(KARSILASTIR+3) THEN
GOTO OKAN     
PAUSE 100     
ELSE
GOTO ERKAN                       
PAUSE 100
ENDIF   

ete

Count komutundan sonra elindeki parametre FREKANS değeridir. Dolayısıyla bu değerin büyüklüğüne göre işlem yapacağına göre en akıllıcası SELECT CASE komutunu kullanman en doğrusu olurdu.
SELECT CASE FREKANS
CASE 100
...
CASE 1000
..
END SELECT
gibi

Ete



Powered by EzPortal