معماری

Timer Counter در codewizard

فعال کردن تایمر کانترها تو کدویژن توسط کدویزارد برعکس کدنویسی کار خیلی ساده ایه که با چن تا کلیک انجام میشه=)

به این صورت که وارد محیط کدویژن شده و پس  از انتخاب پروژه ی جدید ،در قسمت های مشخص شده در شکل بالا تنظیماتمون رو اعمال میکنیم.

بسته به نوع تایمری که میخواییم تو برنامه استفاده کنیم،سربرگ مربوطه رو انتخاب میکنیم ک چهار سربرگ timer0 و timer1 و timer2 و watchdog (در جلسات بعدی آموزشش گفته میشه) داریم.

در بخش Clock Source نوع منبع تولید کننده پالس رو مشخص میکنیم که کلاک داخلی باشه یا کلاک خارجی.

از سه گزینه ی مشاهده شده دراین قسمت،اگه System Clock انتخاب بشه در آنصورت از کلاک داخلی سیستم استفاده میشه.

دو گزینه ی بعدی استفاده از کلاک خارجی رو تعیین میکنن که همونطور که از اسمشون مشخصه باید به پایه T0 (PORTB.0)وصل بشن که دو حالت falling (حساس به لبه پایین رونده) و rising (حساس به لبه بالارونده)دارن.

اگه بخواییم در حالت falling بزاریم باید این پایه رو در حالت Pull up قرار بدیم و اگه هم بخواییم در حالت rising قرار بدیم باید پایه ی T0 رو در Pull down میکنیم.

 

گزینه ی Clock Value فقط هنگامی که System Clock انتخاب بشه،هستش.این گزینه برای تقسیم فرکانسی کلاک سیستم کاربرد داره و اگه کلاک خارجی  رو انتخاب کنیم در آنصورت به تقسیم فرکانسی نیازی نیس.مثلن کلاک داخلی میکرو رو روی ۸۰۰۰۰۰۰HZ تنظیم کردیم(تو قسمتCHIP کدویزارد تنظیم میشه) ولی این کلاک برای کارهای موردنظرمون خیلی بالاس،برا همین میاییم تو قسمت Clock Value با استفاده از مقسم ها استفاده میکنیم که کلاک سیستم رو به ۸ و ۶۴ و ۲۵۶ و ۱۰۲۴ تقسیم میکنه و کلاک های با اندازه کوچکتر در اختیار ما قرار میده.

همونطوریی که در شکل بالا مشخصه،گزینه های به نام Mode و Output وجود نداره.به این نکته هم دقت داشته باشین که بعضی از میکروکنترلر ها از حالت ساده ۸بیتی هستن و خروجی ندارن و این مورد بسته به نوع میکروکنترلر ممکنه یه خروجی،دو تا خروجی یا  حتی سه تا خروجی داشته باشن.شکل بالایی مربوط به Atmega8 و شکل زیر مربوط به Atmega32 هستش که یه خروجی داره.

چون میکروکنترلر Atmega32،هشت بیتیه پس میتونه تا مقدار ۰xFF یعنی۲۵۵بشمره که در جلوی مد نوشته شده که این هم بسته به نوع میکرو میتونه ۰xFFFF (در ۱۶بیتیا)باشه یا ۰xFF(در ۸ بیتیا).

 

در قسمت Mode نوع مد رو انتخاب میکنیم که طبق آموزش قبلی چهار مد Normal,CTC,Fast PWM,Phase Correct PWM داریم که بسته به کارایی هر کدوم،انتخابشون میکنیم.

در جلوی هر مد،مقدار Top(ماکزیمم مقداری که میتونه بشمره) نوشته شده همونطوری که مشخصه CTC حداکثر تا مقدار رجیستر OCR0 و بقیه مد ها میتونن حداکثر تا ۰xFF بشمرن.

در قسمت Output ،نوع خروجی که میخواییم در پایه ی OC0 مشاهده کنیم در هنگام برابری مقدار رجیستر TCNT0 و OCR0 ،اعمال میکنیم.

اگه خروجی رو Disconnected انتخاب کنین یعنی نمیخوایین خروجی (پایه OC0) فعال باشه.اگه Toggle رو انتخاب کنین در هنگام برابری رجیستر OCR0 و TCNT0،مقدار خروجی not مقدار قبلی میشه.اگه Clear رو انتخاب کنین در هنگام برابری،پایه OC0 صفر میشه و اگه Set رو انتخاب کنین خروجی یک رو نشون میده.(چون در اینجا از تایمر صفر استفاده کردیم برای همین نوشتیم OC0,TCNT0,OCR0.اگه از تایمر دو استفاده میکردیم در آنصورت داشتیم:OC2,TCNT2,OCR2).

خب آپشن هایی که در شکل بالا دیده میشه برای فعال سازی اینتراپت و مقدار دهی برای رجیستر ها به کار برده میشن.اگه بخواییم در هنگام سرریز(زمانی که مقدار رجیستر TCNT به ۲۵۵ برسه)وقفه داخلی فعال بشه تا طبق اون بعضی از کارها(مثل کم کردن خطای زمان یا شمارش  تعداد سرریزها و یا…)انجام بشه،از گزینه ی Overflow Interrupt استفاده میکنیم.

از گزینه ی Compare Match Interrupt هم زمانی استفاده میکنیم که میخواییم در هنگام برابری رجیستر OCR با TCNT وقفه ایی اتفاق بیفته.

Timer Value هم همون مقدار اولیه ی رجیستر TCNT هستش که در این قسمت بهش مقداردهی میشه که همون طور که میبینین در جلوی اون h نوشته شده و منظور از آن hex  هستش که باید  عددی که میدیم تو مبنای هگز باشه.همچنین Compare  هم به رجیستر OCR مقدار میده که این هم در مبنای هگزه.

 

خب اگه یه مرور کلی به کارهامون داشته باشیم،اولین گاممون بازه ی زمانی بود که باید با محاسبه و از روی اون تعداد شمارش رو  به دست میاوردیم و از روی تعداد شمارش هم تعداد سرریز وقفه و مقدار TCNT و OCR رو بدست میاریم و متناسب با اونا از مقسم های فرکانس و مد و خروجی و Overflow and Compare Match Interrupt و Timer and Compare Value استفاده میکنیم که به جای همه ی این کارها میتونستیم بعد از انتخاب Clock در قسمت Chip و دادن بازه ی زمانی به قسمت Period(تو شکل زیر مشخصه)،به این هدفمون برسیم که اول تو قسمت Period زمان رو برحسب میلی ثانیه بدین و بعد Apply رو کلیک کنین که در اون صورت همه ی تنظیمات این پیچ بطور اتومات تنظیم میشه ولی بهتره که خودتون هم تنظیمات اعمال شده رو چک کنین.

تو شکل بالا،من بازه ی زمانی مورد نظر(۱۰۰ms)رو دادم و با Apply مقدار کادر های قرمز اتومات نوشته شد ولی همون طور که میبینین Compare Match Interrupt فعال نشد که اونو هم باید برحسب نیازتون انتخاب کنین یا همچنین مد هم روی حالت Normal قرار گرف که درصورت نیاز میتونین تغییرش بدین.

 

این نکته هم نباید فراموش بشه که تایمر کانترها جزه وقفه های داخلی میکرو بوده و برای استفاده از  تایمر کانترها،حتمن باید  وقفه عمومی فعال  باشه که با دستور زیر فعال میشه.

#asm(“sei”)

البته اگه از کدویزارد استفاده کنیم، این کد به همراه بقیه ی کدهای فعال سازی تایمر کانتر ،در محیط کدنویسی به طور اتومات نوشته میشه.

این مطالبی که تو این قسمت گفتم برای هر سه Timer0,Timer1,Timer2 صادقه و پیج Watchdog رو تو آموزش های بعدیم میگم…=)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قالب وردپرس