اطلاعیه

Collapse
No announcement yet.

مشکل با تایمرهای atmega8

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

    مشکل با تایمرهای atmega8

    با سلام به همگی

    من یه برنامه با atmega8 نوشتم که یک فرکانس در محدوده ی 0 تا 200 هرتز از ورودی می گیره و اونو در 1.38 ضرب می کنه و فرکانس معادل اونو در خروجی میسازه. مثلا در ورودی فرکانس 100 هرتز می گیره و در خروجی فرکانس 138 هرتز میده. همه چیزم به خوبی کار میکنه. فقط یه مشکلی هست و اونم اینه که وقتی من فرکانس ورودی رو بسرعت افزایش میدم برای یه لحظه فرکانس خروجی من صفر میشه و بعد به حالت نرمال میرسه. اما عکس این قضیه صادق نیست! یعنی اگه من فرکانس ورودی رو به سرعت کم کنم فرکانس خروجی هم بدون اینکه صفر بشه به بسرعت کم میشه.

    حالا من کدی رو که نوشتم اینجا قرار میدم تا با کمک هم مشکلشو بر طرف کنیم.

    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

    {خلاف قوانین}
    [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

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

    کد:
     
     $regfile = "m8def.dat" 
    $crystal = 4000000 
    
    $hwstack = 32 
    $swstack = 10 
    $framesize = 40 
    
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Configurations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    
    Config Timer0 = Counter , Edge = Rising , Prescale = 256  'count input frequency 
    Config Timer1 = Timer , Compare A = Toggle , Clear Timer = 1 , Prescale = 64    'generat suitable output frequency 
    Config Timer2 = Timer , Prescale = 256           'generate 1 second duration 
    
    Enable Timer0 
    Enable Timer1 
    Enable Timer2 
    
    Enable Ovf2 
    Enable Oc1a 
    
    Enable Interrupts 
    
    Stop Timer1 
    Stop Timer2 
    
    Timer2 = 0 
    Timer1 = 0 
    Counter0 = 0 
    
    On Ovf2 One_secend 
    
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    
    Dim Fin As Single 
    Dim Tin As Single 
    Dim Tout As Single 
    Dim Tout1 As Integer 
    
    Dim Scale As Single : Scale = 1.38 
    
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ initionaliz ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    
    Start Timer2 
    
    Start Timer1 
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Main program ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    
    Do 
    
    Loop 
    
    End 
    
    
    One_secend: 
    
     If K = 62 Then 
    
      Stop Timer2 
    
      K = 1 
    
      Fin = Counter0 
      Fin = Fin * Scale 
    
      Tin = 1 / Fin 
      Tin = Tin / 2                      'Diuration of '1's 
    
      Tout = 62500 * Tin 
    
      Tout1 = Tout                       'convert single value to integer value 
    
      Compare1a = Tout1 
    
      Timer2 = 0 
      Counter0 = 0 
    
      Start Timer2 
    
     Else 
    
      Incr K 
    
     End If 
    
    
    Return

    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

    {خلاف قوانین}
    [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

    دیدگاه


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

      و اما توضیح مختصر این برنامه ، من از تایمر 2 برای تولید زمان یک ثانیه استفاده کردم و از اونجائیکه این تایمر 8 بیتی هست با توجه به فرکانس تراشه و مقدار Prescale در مدت یک ثانیه تقریبا 62 بار سر ریز میشه.
      توسط کانتر 0 تعداد لبه های بالا رونده در این یک ثانیه (که توسط تایمر 2 ایجاد شد) رو شمردم که میشه همون فرکانس موج ورودی و اونو در 1.38 ضرب کردم و دوره ی تناوبشو بدست آوردم ، بعد بوسیله ی تایمر 1 فرکانس مناسب رو در خروجی ایجاد کردم (یعنی با معکوس کردن وضعیت خروجی تایمر)

      ممنون

      اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

      {خلاف قوانین}
      [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

      دیدگاه


        #4
        پاسخ : مشکل با تایمرهای atmega8

        به به ، چقدر کمک دریافت کردم ، دمتون گرم!

        :angry: :angry: :angry: :angry:



        اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

        {خلاف قوانین}
        [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

        دیدگاه


          #5
          پاسخ : مشکل با تایمرهای atmega8


          ببخشید ظاهرا این مشکل را خیلی ها دارن . تو کتاب علی کاهه در ضمیمه آخر کتاب در بخش خطاهای میکرو نوشته شده در اتمگا 8 کانتر 2 اشکال داره! روش اصلاحشم اونجا توضیح داده. توصیه اکید می کنم زمانی که میکرو را تهیه می کنید قبل از کار کردن اون ضمیمه را بخونید تا سر کار نرید!

          دیدگاه


            #6
            پاسخ : مشکل با تایمرهای atmega8

            سلام دوست عزیز

            من اون مشکل رو خیلی وقت پیش مطرح کرده بودم. همون زمانها هم مشکلم رفع شد. بهرحال از توجه شما سپاسگذارم.

            موفق باشید.

            اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم

            {خلاف قوانین}
            [img width=124 height=100]http://mortezark.persiangig.com/image/Web/6_3.PNG[/img]

            دیدگاه

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