۰۷-اسفند-۱۳۸۸, ۲۰:۲۸:۲۶
با سلام به همگی
من یه برنامه با atmega8 نوشتم که یک فرکانس در محدوده ی 0 تا 200 هرتز از ورودی می گیره و اونو در 1.38 ضرب می کنه و فرکانس معادل اونو در خروجی میسازه. مثلا در ورودی فرکانس 100 هرتز می گیره و در خروجی فرکانس 138 هرتز میده. همه چیزم به خوبی کار میکنه. فقط یه مشکلی هست و اونم اینه که وقتی من فرکانس ورودی رو بسرعت افزایش میدم برای یه لحظه فرکانس خروجی من صفر میشه و بعد به حالت نرمال میرسه. اما عکس این قضیه صادق نیست! یعنی اگه من فرکانس ورودی رو به سرعت کم کنم فرکانس خروجی هم بدون اینکه صفر بشه به بسرعت کم میشه.
حالا من کدی رو که نوشتم اینجا قرار میدم تا با کمک هم مشکلشو بر طرف کنیم.
و اما توضیح مختصر این برنامه ، من از تایمر 2 برای تولید زمان یک ثانیه استفاده کردم و از اونجائیکه این تایمر 8 بیتی هست با توجه به فرکانس تراشه و مقدار Prescale در مدت یک ثانیه تقریبا 62 بار سر ریز میشه.
توسط کانتر 0 تعداد لبه های بالا رونده در این یک ثانیه (که توسط تایمر 2 ایجاد شد) رو شمردم که میشه همون فرکانس موج ورودی و اونو در 1.38 ضرب کردم و دوره ی تناوبشو بدست آوردم ، بعد بوسیله ی تایمر 1 فرکانس مناسب رو در خروجی ایجاد کردم (یعنی با معکوس کردن وضعیت خروجی تایمر)
ضمنا حل این مشکل خیلی خیلی برام اهمیت داره و پای آبروم در مینه! لطفا کمکهاتونو دریغ نکنید.
ممنون
من یه برنامه با 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 فرکانس مناسب رو در خروجی ایجاد کردم (یعنی با معکوس کردن وضعیت خروجی تایمر)
ضمنا حل این مشکل خیلی خیلی برام اهمیت داره و پای آبروم در مینه! لطفا کمکهاتونو دریغ نکنید.
ممنون