Osc Frekansi Olcumu

Başlatan mcan, 17 Şubat 2011, 22:51:57

mcan

#include <18f452.h>
#device *=16
#device adc=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES Hs                       //High speed osc //with HW enabled 4X PLL
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT               //No brownout reset
#FUSES PUT                      //Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NOLVP                    //NO LOW VOLTAGE PROG.

#use delay(clock=33800000)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#BIT    TMR1IF =0XF9E.0
#BIT    TMR0IF =0XFF2.2
#Byte   SPBRG  =0XFAF

int b;
int32 k;
float j;

void set_timers(void)
{
   SETUP_TIMER_0(T0_INTERNAL|T0_DIV_1);
   SETUP_TIMER_1(T1_EXTERNAL_SYNC|T1_DIV_BY_1|T1_CLK_OUT );
}

int osc_olc(int32 *p)
{
	long i;

    TMR1IF =0;
	TMR0IF =0;
    SET_TIMER0(0);
    SET_TIMER1(65408);
    while(!TMR1IF){}
    i=get_timer0();
    if(TMR0IF)
		return 0;
    *p=(int32)i<<10;
	return 1;
}

void set_d(int32 d)
{     
	  int t;
      d=d/614400;
      t=(int)d;
      SPBRG =t;	
}

void main(void) 
{
   delay_ms(5);
   set_timers();

   printf("\r\ndeneme\r\n");

   while(true)
   {
	  if(osc_olc(&k))
	  {
	    set_d(k);
		j=(k>>6)/15625.00;
      	printf("\r\nfreq=%4.1fMhz\r\n",j);
	  }
	  else
     	printf("\r\nhata\r\n");

      delay_ms(500);
   }
}


Yukaridaki kodu yazdim rs232 den islemcinin osc frekansini gorebilirsiniz.Islemci calisirken kristali farkli degerlerdekilerle degistirip denedim,sonuc soyle boyle... optimize edilebilir.Oynamak isteyen olursa diye buraya koyuyorum.