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 ضرب کنیم تا زمان اصلی بدست بیاید .
دوستانی که علاقه مند به هر قسمت از کاربردهای میکرو کنرلر یا آموزش اون هستند اعلام کنند تا در حد توان آموزشش رو قرار بدیم
در برنامه بالا پایه 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 ضرب کنیم تا زمان اصلی بدست بیاید .
دوستانی که علاقه مند به هر قسمت از کاربردهای میکرو کنرلر یا آموزش اون هستند اعلام کنند تا در حد توان آموزشش رو قرار بدیم