اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه ی فرکانس متر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در برنامه ی فرکانس متر

    سلام
    من میخوام با میکرو فرکانس 1Hz تا 1Mhz را اندازه گیری کنم . برنامه اش را هم نوشتم ولی نمیدونم چرا کار نمیکنه . فرکانس را به وقفه ی صفر دادم و روی حالت any change تنظیم کردم . تایمر 1 را هم با وقفه ی سرریز فعال کردم . توی وقفه ی صفر نوشتم که اگر برای مثال لبه ی بالا رونده بود ( c=0 ) تایمر را فعال کند و زمانی که لبه ی پایین رونده را حس کرد ( c=1 ) تایمر را خاموش کنه و مقدار تایمر را به عنوان نصف زمان تناوب روی LCD نمایش بده ولی عددی که نشون میده اشتباهه . ممنون میشم اگر راهنمایی کنید .
    کد:
    #include <mega16.h>
    #include <stdio.h>
    #include <alcd.h>
    int count=0,f,c=0;
    char ch[16];
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
       if(c==0)
       {
        TCCR1A=0x00;
        TCCR1B=0x01;
        TCNT1H=0x00;
        TCNT1L=0x00;
        c=1;
       }
       else if(c==1)
       {
        TCCR1A=0x00;
        TCCR1B=0x00;
        f=TCNT1H;
        f=f<<8;
        f=(f+TCNT1L);
        TCNT1H=0x00;
        TCNT1L=0x00;
        c=0;
       }
    }
    
    
    
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    
    }
    
    void main(void)
    {
    
    PORTD=0x08;
    DDRD=0x00;
    
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    
    GICR|=0x40;
    MCUCR=0x01;
    MCUCSR=0x00;
    GIFR=0x40;
    
    TIMSK=0x04;
    lcd_init(16);
    #asm("sei")
    while (1)
       { 
        
         sprintf(ch,"%d",f);
         lcd_gotoxy(0,0);
         lcd_puts(ch);
       }
    }

    #2
    پاسخ : مشکل در برنامه ی فرکانس متر

    نوشته اصلی توسط genius_m9
    سلام
    من میخوام با میکرو فرکانس 1Hz تا 1Mhz را اندازه گیری کنم . برنامه اش را هم نوشتم ولی نمیدونم چرا کار نمیکنه . فرکانس را به وقفه ی صفر دادم و روی حالت any change تنظیم کردم . تایمر 1 را هم با وقفه ی سرریز فعال کردم . توی وقفه ی صفر نوشتم که اگر برای مثال لبه ی بالا رونده بود ( c=0 ) تایمر را فعال کند و زمانی که لبه ی پایین رونده را حس کرد ( c=1 ) تایمر را خاموش کنه و مقدار تایمر را به عنوان نصف زمان تناوب روی LCD نمایش بده ولی عددی که نشون میده اشتباهه . ممنون میشم اگر راهنمایی کنید .
    کد:
    #include <mega16.h>
    #include <stdio.h>
    #include <alcd.h>
    int count=0,f,c=0;
    char ch[16];
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
       if(c==0)
       {
        TCCR1A=0x00;
        TCCR1B=0x01;
        TCNT1H=0x00;
        TCNT1L=0x00;
        c=1;
       }
       else if(c==1)
       {
        TCCR1A=0x00;
        TCCR1B=0x00;
        f=TCNT1H;
        f=f<<8;
        f=(f+TCNT1L);
        TCNT1H=0x00;
        TCNT1L=0x00;
        c=0;
       }
    }
    
    
    
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    
    }
    
    void main(void)
    {
    
    PORTD=0x08;
    DDRD=0x00;
    
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    
    GICR|=0x40;
    MCUCR=0x01;
    MCUCSR=0x00;
    GIFR=0x40;
    
    TIMSK=0x04;
    lcd_init(16);
    #asm("sei")
    while (1)
       { 
        
         sprintf(ch,"%d",f);
         lcd_gotoxy(0,0);
         lcd_puts(ch);
       }
    }
    با سلام به این سایتم یک نگاه بیندازید.
    http://www.imatak.com/index.php?option=com_content&view=article& catid=37%3Aavr-training-kit-ver-10-atmega-16&id=58%3Afrequencymeter&Itemid=61
    [img width=165 height=100]http://www.askdin.com/gallery/images/29839/1___________5.png[/img]
    وبسایت ختم صلوات
    http://www.salavaty.com/

    دیدگاه


      #3
      پاسخ : مشکل در برنامه ی فرکانس متر

      به نظر من این روش رو امتحان کن: یه تایمر راه بنداز و زمان رو اندازه گیری کن.
      فرکانس رو هم بده به پایه پالس شمارنده و تعداد پالسها رو بشمار
      بعد از گذشت یه زمان معین. تعداد دوره های تناوبی رو که تو این زمان بوده داری.

      دیدگاه

      لطفا صبر کنید...
      X