آموزش AVRآموزش الکترونیک

آموزش مود های مختلف تایمر / کانتر در میکروکنترلر های AVR (آموزش AVR #17)

سلام. آموزش مود های مختلف تایمر کانتر (مد CTC) در میکروکنترلر های AVR را آماده کردیم.

مد های مختلف Timer / Counter در میکروکنترلر AVR

در این قسمت از سری آموزش های AVR ما به طور کامل با مد های مختلف تایمر / کانتر در میکروکنترلر های AVR آشنا میشویم. مهم ترین مد برای ما مود CTC خواهد بود.

حتما حتما حتما قبل از خواندن این قسمت از آموزش AVR ، قسمت های قبلی را بخوانید :

خب تا اینجا ما به طور کامل متوجه شدیم که تایمر کانتر چیست و چه میکند. از این به بعد مبحث timer / counter ها را حرفه ای تر ادامه میدهیم. برای استفاده بهتر و بهینه تر از تایمر و کانتر ها شرکت اتمل مد های متفاوتی را تعریف کرده است.

انواع مود های تایمر کانتر ها در AVR

  1. Normal Mode = مود معمولی
  2. CTC Mode = مود CTC
  3. Fast PWM Mode = مود PWM سریع
  4. Phase Correct PWM Mode = مود PWM فاز صحیح
  5. Phase And Frequency Correct PWM Mode > فقط در بعضی از میکروکنترلر های AVR

در ابتدا نگاهی گذرا به حالت Normal میاندازیم. اما در این آموزش بیشتر با مود CTC آشنا میشویم.

Normal Mode = مود معمولی چیست؟

این مود همان مدی است که تا کنون با ان کار کرده ایم. در مود معمولی تایمر کانتر از صفر شروع میکند و تا مقدار ماکزیموم خود میشمارد و سپس 0 میشود و تکرار این داستان. از این مود تایمر کانتر برای عملیات های ساده استفاده میشود.

CTC Mode = مود CTC چیست ؟

CTC مخفیف Clear Timer On Compare Match میباشد که به معنی “پاک کردن تایمر در هنگام مچ شدن عمل مقایسه”  است. یعنی هر وقت مقدار تایمر (TCNT0) با یک مقدار دیگر (OCR0) برابر شد، مقدار تایمر/کانتر 0 میشود. به عبارت دیگر، مقدار ماکزیمم ما در اینجا FF نیست. بلکه مقدار ماکزیمم مثل شکل زیر OCR0 میباشد.

CTC Mode = مود CTC چیست ؟

در قسمتهای قبلی آموزش،عمل مقایسه رو بصورت نرم افزاری انجام میدادیم. یعنی با فرمول، مقدار TimerCount را حساب میکردیم و در برنامه شرط میگذاشتیم که هر وقت مقدار رجیستر TCNTx برابر با مقدار TimerCount شد، یک کاری انجام شود.

اما استفاده از اینگونه شروطی که دائما CPU را درگیر خود میکند برای همیشه مناسب نیست. با استفاده از مود CTC، عمل مقایسه بصورت سخت افزاری انجام میشود و در نتیجه احتمال خطا کمتر میشود و بار مقایسه نرم افزاری از روی دوش CPU برداشته میشود.

تصویر زیر را ببینید :

آموزش مود های مختلف تایمر / کانتر در میکروکنترلر های AVR

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

مد های مختلف Timer / Counter در میکروکنترلر AVR

این تصویر مربوط به تایمر کانتر 0 است. ببینید در ردیف شکل ردیف اول یک موج دندان اره ای داریم که از 0 شروع میشود و تا 255 میشمارد. بعد از آن مجددا صفر میشود و تکرار داستان.

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

یک خط چین افقی وجود دارد که همان مقدار مقایسه ای ما است یعنی OCR0A که برای مثال مقدار آن 250 در نظر گرفته شده است. توجه داشته باشید که نمودار اول، توسط میکروکنترلر ساخته نمیشود و کاملا نمایشی است برای درک مسئله ! تایمر شروع به شمردن از 0 میکند و به مقدار OCR0 میرسد.

حتما ببینید :  آموزش تبدیل عکس به کد HEX هگز برای آردوینو نمایش در ال سی دی گرافیکی

هنگامی که تایمر به OCR0 برسد یعنی همان مقدار ماکزیمم ، Microcontroller مطلع میشود که مقادیر با هم برابر شده اند. در شکل بالا که یک مثال است ، با برابر ششدن مقدار دو رجیستر TCNT0 و OCR0،پایه OC0 میکرو فعال / غیر فعال میشود. اما ما میتوانیم حالتهای مختلفی برای پایه OCx انتخاب کنیم.

رجیستر ها در تایمر کانتر 0 میکروکنترلر AVR

در اینجا رجیستر های مربوط به timer counter صفر را بررسی میکنیم.

بررسی رجیستر OCR0 : Output Compare Register

بررسی رجیستر OCR0 : Output Compare Register

مقدار ماکزیمم مورد نظر خود را در این رجیستر قرار میدهیم. دقت داشته باشید که تایمر کانتر صفر ، یک تایمر کانتر 8 بیت است تنها میتواند مقداری بین 0 تا 255 را استفاده کنیم.

بررسی رجیستر TCCR0 : Timer/Counter Control Register

بررسی رجیستر TCCR0 : Timer/Counter Control Register

بیت های 3 و 6 ؛ Bit 6 , 3 – Wave Generation Mode Bits : با استفاده از این 2 بیت و جدول پایین میتوانیم مود کاری تایمر کانتر 0 را مشخص کنیم.

بیت های 3 و 6 ؛ Bit 6 , 3 – Wave Generation Mode Bits :

که در اینجا ردیف سوم جدول بالا مد نظر ماست و مقدار WGM0:1 برابر با 10 در نظر گرفته خواهد شد.

بیت های 4 و 5 ؛ Bit 5 , 4 – Compare Match Output Mode :

مشخصا در میکروکنترلر ATmega32 پایه ای داریم به نام OC0 . به جدول زیر نگاه کنید :

این جدول میگوید با برابر شدن مقدار تایمر / کانتر 0 با مقدار رجیستر OCR0 ، در پایه OC0 میکروکنترلر فعالیتی انجام شود.

  • حالت 00 : غیر فعال بودن OC0 یعنی پایه OC0 در حالت عادی به کار خود ادامه خواهد داد.
  • حالت 01 : به محض برابر شدن، وضعیت پایه OC0 میکروکنترلر Toggle خواهد شد یعنی اگر 1 منطقی روی پایه هست 0 میشود و اگه 0 هست 1 میشود !
  • حالت 10 : به محض برابر شدن، وضعیت پایه OC0 میکرو Clear خواهد شد. یعنی وقتی برابری اتفاق بیافتد وضعیت پایه OC0 صفر خواهد شد.
  • حالت 11 : به محض برابر شدن، وضعیت پایه OC0 میکرو Set خواهد شد یعنی وقتی برابریاتفاق افتاد وضعیت پایه OC0 یک خواهد شد.

بررسی رجیستر TIMSK : Timer/Counter Interrupt Mask Register

بیت 1 ؛ Bit 1 – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable :

با یک کردن این بیت، میتوانید وقفه برابری مقدار تایمر/کانتر صفر و مقدار رجیستر OCR0 را فعال کنید.

بررسی رجیستر TIFR : Timer/Counter Interrupt Flag Register – TIFR

بررسی رجیستر TIFR : Timer/Counter Interrupt Flag Register – TIFR

بیت 1 ؛ Bit 1 – OCF0: Output Compare Flag 0 :

هنگامی که مقدار تایمر / کانتر 0 و رجیستر OCR0 با همدیگر برابر شود این فلگ 1 میشود. OCF0 پس از انجام وقفه و اجرا شدن دستور زیر روال وقفه به صورت سخت افزاری و اتوماتیک 0 خواهد شد.

همچنین با نوشتن 1 بر روی این فلگ، میتوانیم به صورت دستی آن را 0 کنیم. دقت داشته باشید که با فعال بودن بیت وقفه سراسری (I) از رجیستر SREG ( با دستور اسمبلی “sei” در محیط کدویژن ) و همچنین بیت OCIE0 از رجیستر TIMSK و فعال شدن همین بیت، وقفه اجرا خواهد شد.

مد های مختلف Timer / Counter در میکروکنترلر AVR

رجیستر ها در تایمر کانتر 1 میکروکنترلر AVR

در اینجا رجیستر های مربوط به timer counter یک را بررسی میکنیم.

رجیسترهای OCR1A , OCR1B :

Output Compare Register 1 A – OCR1AH and OCR1AL و Output Compare Register 1 B – OCR1BH and OCR1BL

بررسی رجیسترهای OCR1A , OCR1B :

این دو رجیستر از نوع 16 بیتی هستند و میتوانند عددی بین 0-65535 را در خود قرار دهند. گفتیم که این مقایسه به صورت سخت افزاری انجام میشود. اگر یادتان باشد عددی بدست آوردیم که مقدارش 24999 بود. حالا این عدد را در یکی از این دو رجیستر قرار میدهیم. در واقع کمپانی اتمل برای این بخش 2 تا Compare Register تعریف کرده است تا قادر باشیم مقدار تایمر/کانتر یک را همزمان با دو مقدار (OCR1A , OCR1B) مقایسه کنیم. این دو رجیستر تفاوتی با هم ندارند.

حتما ببینید :  فیوز چیست ؟ انواع Fuse و آموزش کامل نحوه کار

رجیستر TCCR1A : Timer/Counter1 Control Register A – TCCR1A

رجیستر TCCR1A : Timer/Counter1 Control Register A - TCCR1A

بیت های  و 1؛ Bit 1:0 – Wave Generation Mode Bits :
با این دو بیت و بیتهای WGM12:13 از رجیستر TCCR1B میتوانیم مد کاری Timer / Counter 1 را مشخص کنیم.

بیت های 4 و و 6 و 7 ؛ Bit 4:7 – Wave Generation Mode Bits :

برای تایمر / کانتر یک هم مشخصا پایه هایی با نام های OC1A و OC1B وجود دارد. جدول زیر را ببینید :

بررسی رجیستر TCCR1B : Timer/Counter1 Control Register B – TCCR1B

بررسی رجیستر TCCR1B : Timer/Counter1 Control Register B - TCCR1B

بیت های 3 و 4؛ Bit 4:3 – Wave Generation Mode Bits :

از این رجیستر هم با دو بیت WGM12,WGM13 سر و کار داریم. این چهار بیت (WGM10,WGM11,WGM12,WGM13) از دو رجیستر TCCR1A و TCCR1B در کنار هم میتوانند مود کاری تایمر/کانتر را تعیین کنند.

بیت های 3 و 4؛ Bit 4:3 – Wave Generation Mode Bits :

مود شماره 4 و 12 جدول بالا مدنظر ماست. ما مود 4 رو انتخاب میکنیم که مقدار متناظر آن برای 4 فلگ WGM10:13 برابر 0100 خواهد بود.

رجیستر TIMSK : Timer/Counter Interrupt Mask Register

رجیستر TIMSK : Timer/Counter Interrupt Mask Register

بیت 3 و 4 ؛ Bit 3:4 – OCIE1A:B: Timer/Counter1, Output Compare A:B Match Interrupt Enable :

با یک کردن هر یک از دو بیت بالا میشود وقفه های برابری مقدار timer / counter 1 با رجیستر های OCR1A و OCR1B را فعال کرد.

بررسی رجیستر TIFR : Timer/Counter Interrupt Flag Register – TIFR

بررسی رجیستر TIFR : Timer/Counter Interrupt Flag Register – TIFR

بیت 3 و 4 : Bit 4:3 – OCF1A:B – Timer/Counter1, Output Compare A/B Match Flag Bit :

هرگاه مقدار رجیستر TCNT1 با مقدار رجستر OCR1A (یا OCR1B) برابر باشد، مقدار فلگ OCF1A (یا OCF1B) یک خواهد شد. این فلگ پس از اجرا شدن روتین وقفه بصورت اتوماتیک 0 خواهد شد. در صورت عدم استفاده از وقفه با نوشتن 1 بر روی این فلگ میتوانید مقدار آن را به 0 برگردانید. فعال بودن فلگ وقفه سراسری از رجیستر SREG و همچنین فعال بودن بیت OCIE1A (یا OCIE1B) و فعال شدن فلگ OCF1A (یا OCF1B) وقفه رخ خواهد داد.

رجیستر ها در تایمر کانتر 2 میکروکنترلر AVR

در اینجا رجیستر های مربوط به timer counter دو را بررسی میکنیم.

رجیستر OCR2 : Output Compare Register

بررسی رجیستر OCR2 : Output Compare Register

مقدار مورد نظر برای مقایسه در این رجیستر قرار میگیرد.

رجیستر TCCR2 : Timer/Counter Control Register

رجیستر TCCR2 : Timer/Counter Control Register

بیت های 3 و 6 ؛ Bit 6, 3 – WGM21:0: Waveform Generation Mode :

از این دو بیت برای تعیین مود کاری تایمر/کانتر دو استفاده میشود. جدول زیر را ببینید :

بیت های 3 و 6 ؛ Bit 6, 3 – WGM21:0: Waveform Generation Mode :

بیت های 4 و 5 ؛ Bit 5:4 – COM21:0: Compare Match Output Mode :

با این بیتها هم میشود مثل قبل وضعیت پایه OC2 را مشخص کرد. طبق جدول زیر :

بیت های 4 و 5 ؛ Bit 5:4 – COM21:0: Compare Match Output Mode :

رجیستر TIMSK : Timer/Counter Interrupt Mask Register

رجیستر TIMSK : Timer/Counter Interrupt Mask Register

بیت 7 ؛ Bit 7 – OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable :

با یک کردن این بیت،وقفه تایمر/کانتر دو فعال میشود.

رجیستر TIFR : Timer/Counter Interrupt Flag Register – TIFR

رجیستر TIFR : Timer/Counter Interrupt Flag Register – TIFR

بیت 7 ؛ Bit 7 – OCF2: Output Compare Flag 2 :

اگر مقدار تایمر/کانتر دو با مقدار رجیستر OCR2 برابر شود، این بیت 1 میشود.


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

قسمت بعدی : بزودی …

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
برچسب ها

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم.

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

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

دکمه بازگشت به بالا
بستن
بستن