سلام
اول روش کار با تایمر :
ما میخوایم یه برنامه بنویسیم که باهاش بشه یه موج مربعی با فرکانس 50 هرتز ساخت ( بقیه کار رو مرحله به مرحله اضافه میکنیم )
خب موجمون فرکانسش 50 هرتز هست ، بنابراین زمان تنابش میشه 20 میلی ثانیه ، یعنی اگه ما یه پایه رو 10 میلی ثانیه 1 کنیم و 10 میلی ثانیه صفر واین کار رو مدام انجام بدیم ، یه شکل موج با فرکانس 50 هرتز ساختیم :
ما باید تایمر رو یه جوری پیکربندی کنیم که تا 10 میلی ثانیه بشمره و بعد از سرریز شدن به زیر روال وقفه بره و و ضعیت یه پایه رو برعکس کنه :
زمانی که تایمر میشمره از فرمول زیر بدست میاید :
فرکانس کریستال /(بیت تایمر * مقدار پرسکلیر )=زمان
از انجا که با تایمر 8 بیتی 0 و 2 بهتر میتوان زمان های کم را ساخت (دقیق تر ) ما از این دوتا استفاده میکنیم :
16 /( * (دو به توان 8 یا 256)* 64 )=1میلی ثانیه
خب با یه ضرب وتقسیم میشه فهمید که ما با استفاده از کریستال 16 مگاهرتز و پریسکلیر 64 و تایمر 16 بیتی میتونیم زمان 0.001024 ثانیه رو بدست بیاریم :
خب بر نامه رو مینویسیم :
$regfile = "M8DEF.dat" : $crystal = 16000000
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
Config Lcd = 16 * 2 : Cursor Off : Cls
Config Pinb.0 = Output
dim a as word
Config Timer0 = Timer , Prescale = 64
Enable Interrupts
Enable Ovf0
On Ovf0 Q
Do
Locate 1 , 1
Lcd "t:"
Loop
End
Q:
if a>9 then
Toggle Portb.0
a=0
endif
Return
در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا
شرح برنامه بالا :
$regfile = "M8DEF.dat" : $crystal = 16000000
در این خط میکرو و فرکانس کاری اون مشخص شده ، میکررو مورد استفاده مگا 8 و مقدار کریستال 8 مگا هرتز است .
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
در این دوخط lcd راه اندازی شده است ، lcd به پایه های پورت d متصل است .
Config Lcd = 16 * 2 : Cursor Off : Cls
در این خط نوع lcd مشخص شده ، همچنین مکان نما خاموش شده و lcd پاک میشود.
Config Pinb.0 = Output
در این خط پورت b.0 به عنوان خروجی تعریف شده ، چون ما میخواییم از این پورت ولتاژ بگیریم.
Config Timer0 = Timer , Prescale = 64
در این خط تایمر 0 راه اندازی شده
Enable Interrupts
Enable Ovf0
On Ovf0 Q
در این سه خط ، ابتدا وقفه سراسری را اندازی شده است ، شما در هنگام استفاده از هر نوع وقفه ابتدا باید این وقفه را راه اندازی کنید ، در خط بعدی وقفه تایمر ودر خط سوم ، مکانی که تایمر پس از سرریز شدن به انجا پرش میکند معین شده است
Do
Locate 1 , 1
Lcd "t:"
Loop
End
در این قسمت یک حلقه do-loop موجود است که در ان عبارت t روی lcd نمایش داده میشود و فعلا به برنامه ما ربطی ندارد .
Q:
if a>9 then
Toggle Portb.0
a=0
endif
Return
این قسمت از برنامه مکانی است که cpu بعد از سرریز شدن تایمر به ان پرش میکند ، در اینجا 1واحد به مقدار a اضافه میشود ، هنگامی که a برابر 10 شد ، وضعیت پورت b.0 برعکس میشود (اگر صفر است یک و اگر 1 است صفر میشود ) و cpu با دستور return به حلقه ی اصلی باز میگردد.
در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا
سوالاتی که ممکنه پیش بیاد ..
چرا از وقفه استفاده میشه ؟
شما توی حلقه ی do-loop تا دلت میخئاد از دستور wait استفاده کن ، اما تایمر با استفاده از وقفه کار خودش رو انجام میده ، به محض اینکه تایمر تا 256 شمرد cpu حلقه ی اصلی رو رها میکنه و به زیر روال وقفه میره ، کار های که در اونجا وجود داره رو انجام میده و دوباره به مکانی که اومده بود برمیگرده .
با استفاده از مقدار پریسکلیر و فرکانس و... شما مشخص میکنی که تایمر شمرده از 0 تا 255 رو چقدر طول بده ، توی مثال بالا این زمان 10 میلی ثانیه طول میکشه ، اگه که موارد رو تغییر بدی ممکنه این زمان کمتر یا بیشتر بشه .
همون طور که میدونی میکرو در حالت عادی با فرکانس 1 مگاهرتز کار میکنه ، شما برای اینکه نتیجه بگیرید ، باید میکرورو روی کریستال خارجی 16 مگ پروگرام کنید ، در صورتی که این کار رو انجام بدین با جدا کردن کریستال از میکرو ، میکرو خاموش میشه .
در روزگاري كه لبخند آدم ها بخاطر شكست توست برخيز تا بگريزند. كورش كبير
شاد بودن، تنها انتقامي است که ميتوان از زندگي گرفت. ارنستو چه گوارا
دیدگاه