اطلاعیه

Collapse
No announcement yet.

سوال در مورد فرکانس متر

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

    سوال در مورد فرکانس متر

    سلام ، وقتتون بخیر
    من یه سوال در مورد یه تیکه از کد فرکانس متر دارم
    توی کد زیر چرا اولا از TCNT0استفاده کرده و چرا در 256 ضرب کرده و اینکه timer0_ov تعداد دفعات سرریزه ؟؟؟
    in_freq = timer0_ov * 256 + TCNT0
    ممنون میشم اگه فوری جواب بدین ، واقعا ضروریه

    #2
    پاسخ : سوال در مورد فرکانس متر

    تمام کد رو لطفا قرار بدید
    ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

    امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

    دیدگاه


      #3
      پاسخ : سوال در مورد فرکانس متر

      سلام
      همونطور که دوستمون گفتن باید کد رو کامل قرار بدید
      اما از اونجا که مشابه برنامه شما رو دیدم قبلا
      نکاتی رو میگم:

      1: بخاطر این از TCNT0 استفاده کرده که احتمالا
      ورودی فرکانس متر رو مستقیما داده به پایه T0
      و هر کلاک ورودی، یکی به مقدار TCNT0 اضافه میکنه
      در واقع از تایمر/کانتر0 به عنوان شمارنده پالس استفاده کرده

      2: از اونجا که این شمارنده 8 بیتیه پس حراکثر میتونه 256 تا رو بشماره
      یعنی از 0 تا 255
      اما فرکانس ورودی که بالا بره این شمارنده سرریز میکنه
      به خاطر همین وقفه سرریز رو فعال کرده!

      3: احتمالا در زیربرنامه مربوط به وقفه سرریز
      چنین عبارتی ندارید : ;++timer0_ov ؟
      این یعنی هربار که شمارنده 256 تا رو شمرد، و وقفه صادر شد
      به متغیر timer0_ov یکی اضافه بشه

      4: با توجه به توضیحات بالا میشه فهمید که:
      256*timer0_ov یعنی تعداد پالس ها در مدت زمان معین مدنظر
      TCNT0 یعنی مقدار دقیق

      5: در فرکانس های کم، شاید timer0_ov مقدار قابل توجهی نداشته باشه
      حتی برای فرکانس زیر 256 هرتز، مقدارش 0 میشه
      اما در فرکانسهای زیاد، مقدار timer0_ov اهمیت داره
      و TCNT0 به منظور افزایش دقت شمارنده استفاده میشه

      ...
      :read:
      1: اللهم صل علی محمد و آل محمد و عجل فرجهم و ...
      2: دانش بهتره یا ثروت؟ بدون شعور هیچکدوم!
      3: دلا معاش چنان کن که گر بلغزد پای *** فرشته‌ات به دو دست دعا نگه دارد (حافظ)

      دیدگاه


        #4
        پاسخ : سوال در مورد فرکانس متر

        سلام
        TCNT0 رجیستر مربوط به تایمر و کانتر صفر می باشد و 8بیتی است.وقتی کانتر از صفر تا مقدار ماکزیمم که 255 است شمارش میکند وقفه اتفاق میفته و CPU با یک شدن بیت پرچم متوجه میشود تایمر به ماکزیمم رسیده است و به زیر برنامه وقفه می رود.تو زیر برنامه وقفه یک متغیر بنام timer0_over تعریف شده است که با هر بار اجرای زیر برنامه وقفه یک واحد به این متغیر اضافه می شود.یعنی شمارنده تعداد وقفه ها می باشد.
        حالا برای اینکه مقدار تعداد پالس های کانتر بدست بیاد باید از فرمول زیر استفاده کرد:
        in_freq = timer0_ov * 256 + TCNT0
        این فرمول به این دلیل است که مقدار متغیر timer0_ov بر عدد 256 ضرب می شود چون تایمر به تعداد این متغیر 256 پالس را شمارش کرده و دوباره از صفر شروع کرده و با مقدار نهایی TCNT0 جمع میکنیم که تعداد کل پالس های شمارش بدست بیاد.
        موفق و پیروز باشید

        دیدگاه


          #5
          پاسخ : سوال در مورد فرکانس متر

          دوستان ممنون از همتون ، واقعا لطف بزرگی کردین :nerd:
          اینم کد کاملش
          ممنون میشم اگه به این کد یه نگاه بندازینو طبق این بگین
          کد:
          [left]#include <mega16.h>
          #include <delay.h>
          #include <stdio.h>
          #include <lcd.h>
          #define xtal 8000000
          #asm
          .equ __lcd_port=0x1B ;PORTA
          #endasm
          unsigned long int timer0_ov;
          unsigned long int in_freq;
          unsigned char lcd_buff[20];
          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
          {
          
           
          timer0_ov ++;
          }
          void main(void)
          {
          // Timer/Counter 0 initialization
          // Clock source: T0 pin Falling Edge
          // Mode: Normal top=FFh
          // OC0 output: Disconnected
          TCNT0=0x00;
          OCR0=0x00;
          TCCR0=0x00;
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x01;
          // LCD module initialization
          lcd_init(16);
          while (1)
          {
          TCCR0=0x06; // Start Timer T0 pin Falling Edge
          #asm("sei") // Global enable interrupts
          delay_ms(1000);
          #asm("cli"); // Global disable interrupts
          
           
          in_freq = timer0_ov * 256 + TCNT0;
          sprintf(lcd_buff,"Freqency=%d",in_freq);
          lcd_clear();
          lcd_puts(lcd_buff);
          TCCR0=0x00; //Stopt Timer0
          timer0_ov=0; //Prepare for next count
          TCNT0=0; //Clear Timer0
          };[/left]

          دیدگاه


            #6
            پاسخ : سوال در مورد فرکانس متر

            نوشته اصلی توسط عاطفه قربانی
            سلام ، وقتتون بخیر
            من یه سوال در مورد یه تیکه از کد فرکانس متر دارم
            توی کد زیر چرا اولا از TCNT0استفاده کرده و چرا در 256 ضرب کرده و اینکه timer0_ov تعداد دفعات سرریزه ؟؟؟
            in_freq = timer0_ov * 256 + TCNT0
            ممنون میشم اگه فوری جواب بدین ، واقعا ضروریه
            تایمر مورد استفاده چون 8 بیتی هستش ممکنه نتونه فرکانسهای پایین رو بشماره. به همین خاطر برای توسعه شمارش همون طور که گفتید timer0_ov تعداد سرریز ها رو ذخیره میکنه و TCNT0 هم باقیمانده درون کانتر پس از سرریزهای متعدد رو شامل میشه و باقی رو هم دوستان خوب توضیح دادن :smile:
            ... و (بدانید) گرفتن تصمیمهاى محکم (براى رسیدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگین سازگار نیست و چه بسیار که خواب شبانه تصمیمهاى محکم روز را از میان برده و تاریکیآ‌ها، خاطره همتآ‌هاى بلند را از یادها محو کرده است. (نهجآ‌البلاغه، خطبه211)

            امام علی (ع):کسی که به وقت یاری رهبرش در خواب باشد، با لگد دشمنش بیدار می شود (غررالحکم،ص 422)

            دیدگاه


              #7
              پاسخ : سوال در مورد فرکانس متر

              سلام دوست عزیز ...
              میشه درباره پروژه ات بیشتر توضیح بدی بیشتر سخت افزارش مد نظرمه ...
              کلا چطوری کار میکنه؟؟؟

              دیدگاه

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