پالس ورودي به ميكرو دارای یك سطح بالا رونده و یك سطح پایین رونده است ، وقتی پالس بالا میيرود تایمر روشن ميشود و وقتی پالس پایین میيرود، آنرا خاموش ميکنیم ، در نتيجه مي توانيم زمان ناحیه مثبت را اندازه بگیریم . براي اینکار میشود از پایه های وقفه استفاده کرد.
در برنامه بالا پایه 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 ضرب کنیم تا زمان اصلی بدست بیاید .
دوستانی که علاقه مند به هر قسمت از کاربردهای میکرو کنرلر یا آموزش اون هستند اعلام کنند تا در حد توان آموزشش رو قرار بدیم






پاسخ با نقل قول
