ايران ويج

نسخه‌ی کامل: مشکل با تایمرها در atmega8
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با سلام به همگی

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

حالا من کدی رو که نوشتم اینجا قرار میدم تا با کمک هم مشکلشو بر طرف کنیم.
کد:
$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

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

ضمنا حل این مشکل خیلی خیلی برام اهمیت داره و پای آبروم در مینه! لطفا کمکهاتونو دریغ نکنید.

ممنون
سلام

یعنی اینجا کسی نمی تونه به من کمکی بکنه؟

بابا یه راهنمایی یا کمکی ، بالاخره اینجا انجمن الکترونیکه و سوال منم الکترونیکی.