آموزش مد CTC واحد تایمر/ کانتر

سلام روزتون بخیر، امیدوارم که خوب باشید! امروز با سومین جلسه از سلسله جلسات Timer/Counter در خدمتتون هستم . و قراره که با هم بیشتر با جزئیات مد CTC واحد تایمر/ کانتر آشنا بشیم. اما قبل از شروع، برای درک بهتر شما عزیزان یک توضیح کوتاه درباره واحد تایمر/کانتر میدم تا بدونید این واحد به چه کاری میاد.

اما این توضیح کوتاه فقط یه مقدمه برای این جلسه است و اگر می خواهید به طور مفصل با  این با این واحد آشنا شید. حتما آموزش Timer Counter میکروکنترلرهای AVR – مقدمه رو مطالعه کنید.

مد CTC واحد تایمر/ کانتر  به چه معناست؟

CTC مخفف   Clear Timer On Compare Match است که به معنی” پاک کردن کردن تایمر هنگام تطبیق مقایسه” است.

این مد شباهت هایی به مد نرمال دارد به این شکل که، در مد CTC هم مانند مد Normal، مقدار تایمر با هر پالس ساعت زیاد میشه و با مقدار OCR نیز مقایسه می شود .

و این کار را تا زمانی ادامه می دهد ، که محتوای ثبات TCNT n =OCR n شود.

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

اما در CTC Mode  به محض رسیدن به مقدار OCR که خود مقداری بین 0 تا 255 میتواند باشد ، reset میشود.

سپس سرریز رخ می دهد و پرچم آن 1 می شود، بعد از آن در صورتیکه اینتراپت مخصوص  CTC Mode فعال باشد، Cpu به اینتراپت رفته و برنامه مخصوص آن را اجرا میکند(با ورود به اینتراپت پرچم آن reset   میشود).

برای اینکه تفاوت این دو مد را بهتر درک کنید به شکل های زیر نگاه کنید.

 

[icon name=”star-half-o” class=”” unprefixed_class=””] در نتیجه در CTC Mode رجیستر OCR n مقدار حداکثر تایمر/کانتر و رزولوشن آن را تعیین می کنند.

 

خب حالا که تا حدودی با  مد مد CTC آشنا شدید ، میریم سراغ تنظیمات رجیستر های مختلف در این مد…

 

[icon name=”star-half-o” class=”” unprefixed_class=””] از آموزش قبل بیاد داریم که تایمر در هر مد بصورت جداگانه وتوسط 2 بیت WGM00 ، WGM01 که در رجیستر TCCR قرار دارند، تنظیم میشود و بسته به اینکه به هر کدام از این بیت ها 1 یا 0 بدهیم مد تایمر تغییر میکند.

در مد CTC مقدار دهی این 2 بیت به شرح زیر است:

 

 

 

 

نمونه کاربرد های مد CTC واحد تایمر/ کانتر:

  • از این حالت می توان برای تولید شکل موج با فرکانس متغیر روی پایه خروجی OC pin استفاده نمود،

به طوری که با تغییر مقدار رجیستر OCR در طول برنامه فرکانس پایه OC خروجی طبق رابطه زیر تغییر میکند که این کاربردی ترین مزیت مد CTC است.

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””]در این رابطه N ضریب تقسیم ، (فرکانس کلاک کاری میکرو ) است ، که درون واحد تایمر/ کانتر تنظیم میشود و n مقدار رجیستر  در واحد تایمر/ کانتر شماره n است.

[icon name=”star-half-o” class=”” unprefixed_class=””]در این مد،عمل مقایسه بصورت سخت افزاری انجام میپذیره و نتیجتاً احتمال خطا کمتر میشه و بار مقایسه نرم افزاری از روی دوش CPU برداشته میشه.

 

  • مد کاری CTC معمولا برای ایجاد زمان های تاخیر دلخواه و نیز برای تولید شکل موج مربعی با فرکانس متفاوت مورد استفاده قرار می گیرد

 

[icon name=”star-half-o” class=”” unprefixed_class=””] در مد CTC واحد تایمر/ کانتر همیشه duty cycle پنجاه درصد است یعنی شکل موجی خروجی مربعی است.

 

مواردی که در بالا اشاره شد تنها تفاوت های این مد با مد Normal هستند.

حالا که مد CTC را انتخاب کردیم، میریم سراغ تنظیم سایر بیت ها …

 

[icon name=”circle” class=”” unprefixed_class=””]بیت7(FOC n):

این بیت در مد های PWM  غیر فعال است، اما در مد نرمال فعال است.

وقتی در این بیت 1 منطقی نوشته شود، بلافاصله یک سیگنال تساوی مقایسه به واحد تولید موج فرستاده می شود که بسته به چگونگی تنظیم بیت های COM00,COM01 پایه خروجی OC n را تغییر میدهد.

 

[icon name=”circle” class=”” unprefixed_class=””]بیت های 5و4 (COM00,COM01)

 

[icon name=”star-half-o” class=”” unprefixed_class=””]عملکرد بیت‌های COM در مد Normal و CTC کاملا یکسان است.

این دو بیت رفتار پایه ی خروجی OC n را کنترل میکنند.

میدانیم که در صورتیکه یکی از این دو بیت یا هر دو آنها 1 شوند، پایه OCn، وظیفه خود را بعنوان I/O را از دست میدهد و توسط تایمر کنترل می شود. البته باید توجه کنید که برای این منظور باید رجیستر DDR مربوط به این پایه حتما به صورت خروجی تنظیم شده باشد.

 

 

  • اگر 00 شوند هیچگونه عملی روی پایه OC0 رخ نمی‌دهد.
  • اگر 01 شوند، با هربار برابری OCR0 و TCNT0 منطق پایه OC0 برعکس می‌شود.
  • اگر 10 شوند، با برابری دو رجیستر نام برده منطق پایه OC0 مطلقا 0 می‌شود.
  • اگر 11 شوند، منطق پایه با برابری دو رجیستر 1 می‌شود.

 

 

[icon name=”star-half-o” class=”” unprefixed_class=””] جدول بالا برای تایمر 1 نیز همین است فقط هرجا که OC n  داریم، بجا آن OC 1A یا OC 1B   می گذاریم.

 

[icon name=”circle-o” class=”” unprefixed_class=””] بیت های 0 تا 2(Clock Select ):

همانطور که در آموزش قبل گفتیم این بیت ها برای مشخص کردن منبع کلاک تایمر/کانتر اند.

 

 

درتایمر 1:

منبع کلاک تایمر/کانتر 16 بیتی،1 میتواند داخلی و خارجی باشد.

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

و در صورتی که منبع کلاک، کلاک خارجی باشد که توسط پایه T1، به آن تایمر گفته می شود. این تنظیمات به 3 بیتی که در جدول آورده ایم، مربوط می شوند.

 

دو رجیستر TCNT ، OCR را در آموزش Timer Counter میکروکنترلرهای AVR – مقدمه بطور مفصل توضیح داده ایم .برای فهمیدن مفاهیم بالا حتما به آموزش قبل مراجعه کنید.

 

رجیستر  TIMSK(Timer/counter  Interrupt Mask Register):[icon name=”circle” class=”” unprefixed_class=””]

 

[icon name=”circle-o” class=”” unprefixed_class=””] بیت OCIE n:

درصورتی که 1 منطقی در این بیت نوشته شود و علاوه برآن بیت I در رجیستر وضعیت نیز 1 شده باشد، وقفه تساوی مقایسه خروجی تایمر/کانتر n فعال میشود.

 

[icon name=”circle-o” class=”” unprefixed_class=””] بیت TOIE n:

درصورتی که 1 منطقی در این بیت نوشته شود و علاوه بر آن بیت I در رجیستر وضعیت نیز 1 شده باشد، وقفه سرریز تایمر/کانتر n فعال میشود.

 

یادآوری:

رجیستر وضعیت…

طبق معمول 8 تا بیت داره ،با نام های I-T-H-S-V-N-Z-C .

  • این رجیستر وضعیت جاری پردازنده را نشان میدهد و بر اثر برخی از عملیاتهای  CPU  فعال میشود.
  • هنگام  Reset  شدن تمامی بیت های آن “0” می شوند.
  •  این رجیستر همواره دارای اطلاعاتی از آخرین دستور محاسباتی اجرا شده است.
  • در این رجیستر هرکدوم از بیتها که ازشون به عنوان پرچم نیز یاد می شود، با حرف اختصاری وظیفه خود،نامگذاری میشوند.

 

حالا به توضیح پرچمی که در این آموزش از آن استفاده کردیم می پردازیم…

: ( Interupt Flag) Iپرچم

این فلگ مجوز صدور وقفه را صادر میکند.

هرگاه قرار باشه وقفه ای رخ بده،بعد از اینکه دستور اجرای وقفه صادر شد میکرو چک میکنه که آیا اصلا اجازه داره اون وقفه رو عملیاتی کنه یا نه ؟!

با “یک” شدن این پرچم،مجوز صادر میشود و پس از اجرای وقفه مجددا “صفر” میشود.

 

:رجیستر TIFR (Timer/counter  Interrupt Flag Register)[icon name=”circle” class=”” unprefixed_class=””]

[icon name=”circle-o” class=”” unprefixed_class=””] بیت   OCF n:

با وقوع یک تطابق مقایسه ای (Compare match) در تایمر / کانتر n این پرچم 1 می شود و در صورتی که قبلا وقفه تطابق مقایسه فعال شده باشد، روتین وقفه اجرا میشه و سپس این پرچم پاک میشه.

 

[icon name=”circle-o” class=”” unprefixed_class=””] بیت   TOV n 0:

با وقوع سرریز  تایمر / کانتر n این پرچم1 می شود و در صورتی که قبلا وقفه سرریز تایمر فعال شده باشد، روتین وقفه اجرا میشه و سپس این پرچم به صورت خودکار پاک میشه.

 

[icon name=”circle-o” class=”” unprefixed_class=””] نکته کلی تایمر یک:

این تایمر تفاوت های اندکی با تایمر 0و2 دارد که آنها نیز به دلیل 16 بیتی بودن این تایمر اند، در ادامه به بررسی این تفاوت ها می پردازیم.

 

رجیسترها:

رجیسترهای TCNT1,OCR1A/BوICR1 اینها رجیستر های 16 بیتی اند.

رجیسترهای  OCR1A/B رجیسترهای 8 بیتی هستند که برای کنترل نحوه عملکرد تایمر /کانتر 1 استفاده می شوند.

برای توضیح برخی تفاوت ها به تعبیری دیگر به تصویر زیر دقت کنید…

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] Clock Source:

در قسمت Clock Source، میتوانید منبع کلاک تایمر را به صورت داخلی یا خارجی ( لبه ی پایین رونده یا بالا رونده پایه ی T1 ) انتخاب کنید.

درصورتی که منبع کلاک را بصورت داخلی انتخاب کرده باشید…

میتوانید در قسمت Clock Value ، خود کلاک سیستم و یا تقسیمی از آن را به عنوان کلاک تایمر انتخاب کنید.

 

[icon name=”circle-o” class=”” unprefixed_class=””] Mode:

در این قسمت می توانید یکی از 16 مد عملیاتی تایمر/کانتر را انتخاب کنید که ما در این آموزش مد نرمال مد نظرمان است.

در این مد در قسمت های  Out. A  ، Out. B می توانید به ترتیب وضعیت پایه های خروجی OC1B  و OC1A به 4 صورت تغییر دهید…

 

حالا می خواهیم با یه مثال کاربرد عملی مد CTC واحد تایمر/ کانتر رو ببینیم…

 

[icon name=”laptop-code” style=”solid” class=”” unprefixed_class=””] میخواهیم برنامه بنویسیم که فرکانس 1KHz  روی پایه OCR0 ایجاد کند (فرکانس میکرو 1MHz می‌باشد).

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

Include <mega16.h>

با این دستور کتابخانه Atmega16 رو به برنامه فرا می خونیم.

Include <mega16.h>

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

#include <delay .h>

با این کار تابع تاخیر را به برنامه فرا می خوانیم که وظیفه اش ایجاد وقفه زمانی است. مثلا در اینجا باعث چشمک زدن led میشه.

#include <delay .h>

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

DDRB=0xff;

با این دستور پورت  A را خروجی میکنیم.

DDRB=0xff;

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

;PORTB.0 = 1

پایه OC0 نقش دیگر پایه 4 میکروکنترلر است، یادتان نرود حتما پایه را خروجی کرده باشید.

;PORTB.0 = 1

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

;TCNT0 = 0x00

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

;TCNT0 = 0x00

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

;OCR0 = 61

طبق فرمولی که در ادامه به آن اشاره میکنیم، با قرار دادن مقدار 1 مگاهرتز بجای ClkI/O و مقدار 1KHz بجای Focn و همچنین ضریب تقسیم 8 برای N ، مقدار OCR0 بصورت تقریبی برابر 61 شد.

;OCR0 = 61

 

 

 

[icon name=”circle-o” class=”” unprefixed_class=””] دستور:

TCCR0 = 0b00010101

با دادن این مقدار،طبق جدول “سبز رنگ”ضریب تقسیم فرکانس 8انتخاب میشود.

TCCR0 = 0b00010101

 

[icon name=”circle-o” class=”” unprefixed_class=””]با نوشتن b 0 می‌توان به صورت دودویی مقداردهی کرد.

 

در تصویر بالا مربع های آبی رنگ به صورت چشمک زن هستند.

 

دورنما :

در جلسه بعد به بررسی تایمر در مد FAST PWM  می پردازیم، پس یادتون نره که مطالب مارو دنبال کنید.

 

خب اینم از آموزش امروز امیدوارم که لذت برده باشید، یادتون نره قسمت های بعدی این آموزش رو از دست ندید

راستی یادتون نره ، حتما به اینستاگرام ماهم سربزنید

اگر می‌خواهید از آخرین و محبوب‌ترین مقالات ما در ایمیل خود مطلع شوید، همین الان ایمیل و شماره موبایل خود را در کادر زیر وارد کنید:
تعداد علاقه مندانی که تاکنون عضو خبرنامه ما شده اند: 0 نفر
دیدگاه

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

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