PDA

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



soonaeid
1st November 2012, 14:59
پالس ورودي به ميكرو دارای یك سطح بالا رونده و یك سطح پایین رونده است ، وقتی پالس بالا میيرود تایمر روشن ميشود و وقتی پالس پایین میيرود، آنرا خاموش ميکنیم ، در نتيجه مي توانيم زمان ناحیه مثبت را اندازه بگیریم . براي اینکار میشود از پایه های وقفه استفاده کرد.
در برنامه بالا پایه int0 برای پالس با لبه ی پایین رونده و پایه int1 برای پالس با لبه ی بالا رونده برنامه ریزی شده ، این دو پایه به هم متصل شده و پالس ورودی به آنها اعمال میشود ، هنگامی که پالس از سطح صفر به یک میرود (بالا رونده) وقفه ی int1 فعال شده و به زیر برنامه ان یعنیE پرش میشود ، در آنجا تایمر صفر شروع به کار میکند ، هنگامی که پالس از سطح یک به صفر میرود ، وقفه ی int1 فعال میشود و به زیر برنامه اش یعنیW پرش میشود ، آنجا هم تایمر متوقف شده و مقدار شمرده شده در متغیر c ریخته میشود و c در حلقه do-loop روی LCD نمايش داده ميشود.





$regfile = "m16def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinc.0 , Db5 = Pinc.1 , Db6 = Pinc.2 , Db7 = Pinc.3 , E = Pinc.4 , Rs = Pinc.5
Config Timer0 = Timer , Prescale = 1
Config Int0 = Falling
Config Int1 = Rising
Enable Interrupts
Enable Int0
Enable Int1
Enable Ovf0
On Ovf0 Q
On Int0 W
On Int1 E
Dim A As Byte , B As Long , C As Long
Cursor Off
Do
Locate 1 , 1 : Lcd "t= " ; C ; " us "
Loop
End
Q:
Incr B
Return
W:
Stop Timer0
B = B * 16 : C = B : B = 0
Return
E:
Start Timer0
Return
نحوه کار تایمر ها :



میکرو mega16 دارای 3 تایمر است ، دو تایمر هشت بیتی 0 و 2 که میتوانند از صفر تا 255 بشمارند و تایمر شانزده بیتی 1 که میتواند تا 65565 شمارش نماید .
تایمر ها با دستور زیر راه اندازی میشوند :
Config Timerx = Timer , Prescale =y
x شماره تایمر است که میتواند 0 یا 1 یا 2 باشد و y مقدا رPrescaleاست که میتواند 1,8,64,256 و 1024 باشد . Prescale مشخص کننده فرکانس کار تایمر است و به نوعی مشخص میکند که مثلا شمارش از صفر تا 255 برای تایمر 0 چقدر زمان ببرد
با دستورات زیر میتوان وقفه ی تایمر را فعال کرد :
Enable Interrupts
Enable Ovfx
On Ovfx Q
x شماره تایمر است و q برچسبی است که تایمر هنگام سرریز شدن به آن پرش میکند ، شمردن تا حداکثر مقدار را سرریز شدن میگویند ، مثلا حداکثر مقدار برای تایمر 0 برابر 255 است .
برگشت از زیر برنامه با دستور return انجام میشود .
با توجه به موارد بالا کمترین و بیشترین زمانی که میتوان با تایمر های مختلف ساخت به شرح زیر است ( با کمترین و بیشترین کریستال و Prescale
تایمر صفر : بیشترین 262144 میلی ثانیه ، کمترین 16 میکرو ثانیه
تایمر دو : مطابق بالا
تایمر یک : بیشترین :67.108864 ثانیه ، کمترین 4096 میکرو ثانیه
در این پروژه ما به زمان های خیلی کم نیاز داریم چون استب بالای میخواهیم ، بنابراین باید از تایمر 0 یا دو استفاده کنیم
برای داشتن استپ بالا ، اولین پیشنهاد استفاده از کریستال 16 مگاهرتز و پرسکلیر 1 است ، با این کار تایمر 16 میکرو ثانیه میشمارد و ما بیشترین استب را خواهیم داشت (62 استپ (
در برنامه بالا 16 میکرو ثانیه طول میکشد تا تایمر 0 از 0 تا 255 بشمارد ، هنگامی که رقم شمرده شده به 255 رسید ، به زیر برنامه رجوع میشود و در انجا یک رقم به b افزوده میشود . این کار تاوقتی که لبه یک به صفر نرسیده ادامه مییابد .
بعد از رسیدن لبه ی مذکور به زیر برنامه w پرش میشود ، هر رقم b یعنی 16 میکرو ثانیه ، پس ما باید b را در 16 ضرب کنیم تا زمان اصلی بدست بیاید .

دوستانی که علاقه مند به هر قسمت از کاربردهای میکرو کنرلر یا آموزش اون هستند اعلام کنند تا در حد توان آموزشش رو قرار بدیم