Frekans Ölçme ( Kare Dalga )

Başlatan saucompeng, 14 Aralık 2011, 20:15:01

justice_for_all

bence soyle yapin timer2 16 bitliktir yani 65535 e kadar sayar buda esittir osc 10mhzdi sanirim 26 ms sayabilir sen 50 hz olcecegine gore bu deger sana yeter.

program basladiginda set_timer2(0); yap daha sonra

#define sys_frenkans 1/2500000

#int_ext
void ext_isr()
{
     temptime=get_timer2();
     set_timer2(0);
     newtime= sys_frekans * temptime;
     
}


buna benzer olcak
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

CaFFeiNe

problem kesme kaçırmadan dolayı kaynaklanabilir, bir kesme içindeyken başka kesme gelirse bu algılanmayabilir!

saucompeng

Alıntı yapılan: justice_for_all - 14 Aralık 2011, 22:05:13
bence soyle yapin timer2 16 bitliktir yani 65535 e kadar sayar buda esittir osc 10mhzdi sanirim 26 ms sayabilir sen 50 hz olcecegine gore bu deger sana yeter.

program basladiginda set_timer2(0); yap daha sonra

#define sys_frenkans 1/2500000

#int_ext
void ext_isr()
{
     temptime=get_timer2();
     set_timer2(0);
     newtime= sys_frekans * temptime;
     
}


buna benzer olcak

Tamamdır bunu denememiştim , bunu deneyip yarın sonucu buraya yazarım. Teşekkür ederim.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

saucompeng

Alıntı yapılan: justice_for_all - 14 Aralık 2011, 22:05:13
bence soyle yapin timer2 16 bitliktir yani 65535 e kadar sayar buda esittir osc 10mhzdi sanirim 26 ms sayabilir sen 50 hz olcecegine gore bu deger sana yeter.

program basladiginda set_timer2(0); yap daha sonra

#define sys_frenkans 1/2500000

#int_ext
void ext_isr()
{
     temptime=get_timer2();
     set_timer2(0);
     newtime= sys_frekans * temptime;
     
}


buna benzer olcak


Merhabalar ;  sadece temptime değişkenini tuttum , 07 çoğunlukta olmak üzere 01-0C arasında değişen değerler çıktı. Şimdi sorun nerede bunu düşünmek gerek...
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

saucompeng

#include <18F2585.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)

int sampleCount=0;

int16 freqCount=0;
int16 newtime=0;
int16 freqTimer=0;

#int_timer2 //200uS
void timer2_isr(void)
{
	freqTimer++;
}


#int_EXT
void  EXT_isr(void) 
{  
   if(sampleCount==0)
   {
     freqTimer=0;
   }
 
   sampleCount++;
	
   if(sampleCount==6)  // 5 sample
   {
   		disable_interrupts(INT_EXT);
   		newtime=freqTimer;
        sampleCount++;
   } 
   
}

unsigned int16 i=0;


void main()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,24,5); //200us
   setup_vref(FALSE);
   
   ext_int_edge(H_TO_L);
   
   enable_interrupts(INT_TIMER2);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
        if(sampleCount==7)
        {
			write_eeprom(16*freqCount++,newtime/5);
            sampleCount=0;
            enable_interrupts(INT_EXT); 
        } 
   }
}



Kod bu haliyle gayet düzgün çalışmaktadır. Kullanmak isteyen arkadaşlar için ekleyeyim dedim. İyi çalışmalar, düşüncelerini paylaşan arkadaşlara teşekkürler...
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

Erol YILMAZ

Alıntı yapılan: CaFFeiNe - 14 Aralık 2011, 22:13:35
problem kesme kaçırmadan dolayı kaynaklanabilir, bir kesme içindeyken başka kesme gelirse bu algılanmayabilir!

diğer kesmeden çıkılıp tekrar kesmeye girilir...
Kaçmaz...
Aynısından ardı ardına gelirse kesme progunu görmeden o zaman kaçmış olur.

OptimusPrime

bence öncelikle timer ın çalıştığından emin olmalısın. mesela timer kesmesi içerisine herhangi pini 1-0 yapan bir kod ekle. scope da gözle. belki timer kesmesinde belkide timer kurulumunda bir hata yapıyorsundur.

ayrıca konuyla ilgili microchipin bir uygulama notu var
http://ww1.microchip.com/downloads/en/AppNotes/00592d.pdf

burada işareti timer a clock olarak vermiş ve belirli bir süre yazılımsal gecikme ile beklemiş. sonra ölçtüğü pini 0 seviyesine çekip (fazladan clock saymamak için) beklediği süre içerisinde ne kadar puls geldiğine bakıp frekansı hesaplamış.

bu yöntemi, yukarıda verdiğim uygulama notundan esinlenerek pic16f84 de denemiştim. uygulama notunda bahsettiği gibi 50MHz ye kadar deneyemedim ama 10kHz ye kadar multimetremdeki frekans metre ile neredeyse aynı ölçüyordu. hemde sapıtmadan...:)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||