اطلاعیه

Collapse
No announcement yet.

<Counter OR Interrupt>کانتر یا اینتراپت؟

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

    <Counter OR Interrupt>کانتر یا اینتراپت؟

    با سلام

    برای شمارش یه وقفه خارجی ، چه فرقی داره که از counter استفاده کنیم یا interrupt و شمارنده نرم افزاری؟
    کدوم قابلیت شمارش بیشتر در یک ثانیه رو داره؟(کدوم فرکانس بیشتری داره؟)
    هر کدوم تا چه فرکانسی میتونند بشمارند؟اگه این مطلب توی datasheet هست با ذکر منبع ذکر کنید.

    با تشکر

    #2
    پاسخ : &lt;Counter OR Interrupt&gt;کانتر یا اینتراپت؟

    تا اونجایی که بنده مطلعم سرعت کانتر از اینتراپت بیشتره.
    www.gam-co.blogsky.com

    دیدگاه


      #3
      پاسخ : &lt;Counter OR Interrupt&gt;کانتر یا اینتراپت؟

      نوشته اصلی توسط vahidabedi
      تا اونجایی که بنده مطلعم سرعت کانتر از اینتراپت بیشتره.
      منم همین نظرو دارم ولی اگه یه منبع بدید توی دیتاشیت بهتره.
      مشکل من بیشتر در مورد ماکزیمم فرکانس ورودی در counter و interrupt هست.توی دیتا شیت میکرو باید باشه ولی من چیزی ندیدم.
      در واقع من نسبت رابطه فرکانس ورودی رو نسبت به clock میکرو میخام .مثلا اگه clock میکرو 8MHz باشه،فرکانس ورودی counter یا interrupt حداکثر چقدر میتونه باشه؟ حالا اگه clock میکرو 16MHz بود چطور؟

      دیدگاه


        #4
        پاسخ : &lt;Counter OR Interrupt&gt;کانتر یا اینتراپت؟

        منم توی دیتاشیت ندیدم و توی یکی از بحثای همینجا خوندم.
        من با کریستال 8 مگ با وقفه خارجی تا فرکانس 33 کیلو رو هم تست کردم جواب داد. بیشتر از اون رو تست نکردم ولی فک کنم جواب بده.
        www.gam-co.blogsky.com

        دیدگاه


          #5
          پاسخ : &lt;Counter OR Interrupt&gt;کانتر یا اینتراپت؟

          با سلام
          علت سوالهای قبلی این بود که میخاستم فرکانس متر بسازم و دقیقا به مشکلی که فکر میکردم برخوردم.اونم اینکه فرکانس متر توی رنج 1Hz تا 100Hz به خوبی عمل میکنه و بعد از اون هر چی فرکانس بره بالاتر خطا بیشتر میشه(البته احتمال داره مشکل از نوع متغیر ها باشه)
          اینم برنامه:
          کد:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.05.3 Standard
          Automatic Program Generator
          © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : 
          Version : 
          Date  : 7/25/2015
          Author : PerTic@n
          Company : If You Like This Software,Buy It
          Comments: 
          
          
          Chip type        : ATmega8
          Program type      : Application
          AVR Core Clock frequency: 8.000000 MHz
          Memory model      : Small
          External RAM size    : 0
          Data Stack size     : 256
          *****************************************************/
          
          #include &lt;mega8.h&gt;
          
          // Alphanumeric LCD functions
          #include &lt;alcd.h&gt;
          #include &lt;stdio.h&gt;
          
          char ov=0;
          int f=0;
          char str_f[20];
          
          // Timer1 overflow interrupt service routine
          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
          {
          ov++;
          TCNT1=0;
          
          }
          
          // Timer2 overflow interrupt service routine
          interrupt [TIM2_OVF] void timer2_ovf_isr(void)
          {
          //TCCR2=0x00;
          //TIMSK=0x00;
          f=ov*65535;
          f=f+TCNT1;
          
          lcd_gotoxy(0,0);
          sprintf(str_f,&quot;%d  &quot;,f);
          lcd_puts(str_f);
          
          ov=0;
          TCNT1=0;
          //TIMSK=0x44;
          TCCR2=0x05;
          
          }
          
          // Declare your global variables here
          
          void main(void)
          {
          // Declare your local variables here
          // Input/Output Ports initialization
          // Port B initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTB=0x00;
          DDRB=0x00;
          
          // Port C initialization
          // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTC=0x00;
          DDRC=0x00;
          
          // Port D initialization
          // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
          // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
          PORTD=0x00;
          DDRD=0x00;
          
          // Timer/Counter 0 initialization
          // Clock source: System Clock
          // Clock value: Timer 0 Stopped
          TCCR0=0x00;
          TCNT0=0x00;
          
          // Timer/Counter 1 initialization
          // Clock source: T1 pin Rising Edge
          // Mode: Normal top=0xFFFF
          // OC1A output: Discon.
          // OC1B output: Discon.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer1 Overflow Interrupt: On
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: Off
          // Compare B Match Interrupt: Off
          TCCR1A=0x00;
          TCCR1B=0x07;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;
          
          // Timer/Counter 2 initialization
          // Clock source: TOSC1 pin
          // Clock value: PCK2/128
          // Mode: Normal top=0xFF
          // OC2 output: Disconnected
          ASSR=0x08;
          TCCR2=0x05;
          TCNT2=0x00;
          OCR2=0x00;
          
          // External Interrupt(s) initialization
          // INT0: Off
          // INT1: Off
          MCUCR=0x00;
          
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x44;
          
          // USART initialization
          // USART disabled
          UCSRB=0x00;
          
          // Analog Comparator initialization
          // Analog Comparator: Off
          // Analog Comparator Input Capture by Timer/Counter 1: Off
          ACSR=0x80;
          SFIOR=0x00;
          
          // ADC initialization
          // ADC disabled
          ADCSRA=0x00;
          
          // SPI initialization
          // SPI disabled
          SPCR=0x00;
          
          // TWI initialization
          // TWI disabled
          TWCR=0x00;
          
          // Alphanumeric LCD initialization
          // Connections are specified in the
          // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
          // RS - PORTC Bit 0
          // RD - PORTC Bit 1
          // EN - PORTC Bit 2
          // D4 - PORTC Bit 3
          // D5 - PORTC Bit 4
          // D6 - PORTC Bit 5
          // D7 - PORTD Bit 7
          // Characters/line: 16
          lcd_init(16);
          
          // Global enable interrupts
          #asm(&quot;sei&quot;)
          
          while (1)
             {
             
             }
          }
          تایمر 2 واسه زمان 1 ثانیه هست و تایمر یک شمارنده.

          با تشکر

          دیدگاه


            #6
            پاسخ : &lt;Counter OR Interrupt&gt;کانتر یا اینتراپت؟

            با سلام.
            بنده با میکرو atmega8 با فرکانس داخلی 8MHz و با استفاده از Input Capture تونستم یه فرکانس متر بسازم ولی فقط تا 25kHz جواب میده.
            چجوری میتونم رنج فرکانس متر رو بیشتر کنم؟

            دیدگاه


              #7
              پاسخ : &lt;Counter OR Interrupt&gt;کانتر یا اینتراپت؟

              سلام.
              شما روند زیر رو در پیش بگیر :
              در 1 ثانیه تعداد پالس ها ورودی به میکرو رو بشمر.

              برای تولید زمان 1 ثانیه از یک تایمر استفاده کن و برای شمارش تعداد پالس ها از یک کانتر.

              یا اینکه از تایمر استفاده نکن.
              توسط delay زمان 1 ثانیه رو تولید کن و بعد تعداد پالس های شمارش شده رو در نظر بگیر. ( البته قبل از delay کانتر رو فعال کن )

              برای بالا بردن رنج فرکانسی هم میتونی زمانی که در اون تعداد پالس ها رو میشمری کمتر کنی تا رجیستر مربوط به کانتر سر ریز نشه که مشکل ساز بشه. چرا که وقتی تعداد پالس ها از ماکزیموم مقدار رجیستر کانتر بیشتر میشه مقدار کانتر 0 میشه و دوباره از اوّل شمارش صورت میگیره.
              پس باید ببینی اگر تعداد پالس هایی که شمارش میشه در 1 ثانیه ، از ماکزیموم عدد اون رجیستر ( کانتر ) بیشتر میشه باید زمان رو کمتر کنی. مثلاً در 0.5 ثانیه اندازه گیری کنی تعداد پالس ها رو. بعد تعداد پالس های شمارش شده رو 2 برابر کنی تا فرکانس به دست بیاد. اگر 0.5 ثانیه خوب نبود باید 0.25 ثانیش کنی و ...
              البته این اعداد رو مثال گفتم. باید تقسیمات زمانی رو بر حسب فرکانس کاری میکرو و کلاک به دست بیاری ولی خوب همین حول و حوش هستش. ( به طور کلی )

              مقدار ماکزیموم رجیستر کانتر هم فکر کنم 65534 یا همچین چیزی بود. پس توی 1 ثانیه تقریباً تا 65k هرتز میتونی اندازه گیری کنی. اگر بخای بیشتر اندازه بگیری باید زمان رو کمتر کنی.
              البته یک تکنیک دیگه ام هستش و اونم اینه که تعداد سر ریز های کانتر رو بشمری و در 65534 ضرب کنی و بعد با مقدار فعلی رجیستر کانتر جمع کنی. ( در حالت استفاده از 1 ثانیه )
              هر کدوم دقت خودشونو دارن.
              //
              من برنامه شما رو نگاه نکردم ولی روش کلی رو گفتم.

              دیدگاه

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