İki dış kesme arasındaki zaman nasıl ölçülür?

Başlatan mabasaran, 19 Nisan 2005, 18:36:57

mabasaran

Selam konu başlığından da anlaşılacağı gibi epey acebiyim.

İki dış kesme arasındaki zamanı ölçmem gerekiyor ama acemilik işte.

16f877 kullanıyorum 20Mhz Olarak.

Derleyici olarakta Picc CCS.

b0'a dakikada 100 ila 10.000 arasında sinyal geliyor ve kesme oluşması gerekiyor.

Ben timer2 yi 100us ye ayarladım ve her taşmada
zaman=zaman+1;
yaptırıyorum. Zaman değişkeni int32 tipinde.

Dış kesme oluncada zaman değişkeninin içeriğini başka bir değişkene alıp zaman=0; diyorum.

Bu yöntemi kullanarak dakidada 2580 dış kesmeyi ölçebiliyorum.

Ama dış kesme sayısı

3000 olunca 2300
4000 olunca 1000
6000 olunca 0          algılıyor.

Timer2 yi 200us ayarladığında biraz daha iyileşiyor ama yeterli değil.
Daha fazlada artırınca bir değişiklik olmuyor olsada zaten hassasiyet düşeceğinden işeme yaramayacak.

Bu ölçüm işlemini yapabileceğim bir yöntem bilen varsa cevaplarını 4 gözle bekliyor olucam.

Teşekurler...

Erol YILMAZ

Merhaba,
Iki pals arasi sure olcumu...

B0 pininden gelen her sinyalle kesme olusturabilir ve bunlar arasini da Timer0 sayaci ile sayabilirsin. Ornegin birinci de Timer0 i sifirlarsin. Ikinci de ise toplam sureyi alirsin.

Timer0 sayicisi tasmaya giderse onu da ayriyetten bir kesme ile saydirabilirsin...

bu arada her kesme ye girip-cikmaninda bir zaman kaybi var. Ama senin olcecegin sinyaller arasi sureler gayet iyi. En hizli durumda iki sinyal arasi 6 ms lik bir sure ki bunun icin 20 mHz lik bir hiz gereksiz... tabii baska isler de yaptiracaksindir, onu bilemem...

Buna bir projeyi bir sure once yapmistim, Sayesinde Motorola yi ogrendim. Timer larla yapilan islerde Motorola nin kat kat ustun oldugunu gordum. Motorola yi da incele derim.

Kolay Gelsin...

codelinker

timerlar icin kesme kullanmissin bu kesme programina atlamasi icin 30-35 komut gereklidir,tavsiyem kesme fonksiyonu kullanma onun yerine timer in kesme bayragini kullan.t2if kacinci bit nerde bulunur datasheet ten ogrene bilirsin.Eger bu bit set edilirse kesme olmuştur edilmemisse olmamistir.bir dongu icinde bunu kullan.

codelinker

tavsiyem timer2 değilde tim1 i kullan.877de ccp modulu vardir.bunu frekans ve dutyi olcmede kullana bilirsin yalniz girisi ccp1 veya ccp2 ucuna vermen gerekir.Bu modulde degisik ayarlar var.yukselen kenarda tutmaya ayarla kesme olunca dusuk kenarda tutmaya ayarla daha sonra aradaki zamani olc, aynini ccp2 pini icinde yap farki al.eger bu modulu kullanmak donanim olarak sorun cikartiyacak ise bana mail atarak detayli bilgi alabilirsin. codelinker@hotmail.com

mabasaran

İlginiz için teşekkur ederim.

Tavsiyeleriniz doğrultusunda sorunu çözdüm.

timer1 i max değerine ayarladım taşma oluncada değişkene max değeri yazdım. Taşma olmassa da gerekli an da get_timer1() ile teğerini okuyarak kaydettim.

bu yöntemle 8730 dev/dak ya kadar olan sinyalleri yakala biliyorum.

Ama programdaki butun zamanlama işlemlerini timer1 e bağlamak gerekiyor. Zor da olsa öğrendim. Aksi halde 4500 d/d nın üstüne çıkamamıştım.

İlgilenen bütün arkadaşlara TEŞEKKÜR edireim.