بررسی مُد CTC در تایمر/کانتر میکروکنترلرهای AVR ؟ [24](نویسنده: احسان نوری)
در ادامه سلسله مباحث آموزشی تایمر/کانترها اینبار به بررسی مدهای مختلف کاری تایمر/کانترها و علی الخصوص مد CTC میپردازیم.
پس با ما در ادامه مطلب همراه باشید...
به نام خدا
سلام
بازهم اومدم با دست پُر !!!
این پست،یکی از نفس گیرترین پستهای وبلاگ خواهد بوووود.(حواستونو جمع کنید!)
و اما آغاز درس ....
تا اینجای کار خیلی خوب متوجه شدیم که تایمر/کانتر کار اصلیش چیه و به چه دردی میخوره !
اما از اینجا به بعد وقت اینه که بتونیم حرفه ای تر با تایمر/کانترها کار کنیم.
برای استفاده از تایمر/کانترها بصورت بهینه تر و با میزای خطای احتمالی کمتر و همچنین کاربردهای خاص که در ادامه مباحث بیشتر آشنا میشید باهاشون،شرکت Atmel مودهای کاری متفاوتی رو برای بخش تایمر/کانتر میکروکنترلرهاش تعریف کرده.
تایمر/کانترها در میکروکنترلرهای AVR در 4 حالت (مود(Mode)) اصلی میتونند مورد استفاده قرار بگیرند :
1.Normal Mode
2.CTC Mode
3.Fast PWM Mode
4.Phase Correct PWM Mode
5.Phase And Frequency Correct PWM Mode ==> در بعضی از میکروکنترلرهای AVR
در ابتدا،نگاهی گذرا میندازیم به حالت Normal و البته زیاد روش مانور نمیدیم،چون در مبحث امروز که CTC هست بیشتر با ریزه کاری های کار آشنا میشید.
در ابتدا تایمر/کانتر شماره صفر رو بررسی میکنیم.
1.Normal Mode :
این مود همون حالتی هست که تا حالا باهاش کار کردیم !
تایمر/کانتر از صفر شروع میکنه به شمارش تا به مقدار Max خودش برسه.
بعد از اون مجددا صفر میشه و این چرخه تکرار میشه.
به روایت تصویر :
توصیه میشه که از این مود برای عملیات ساده ای مثل شمارش استفاده کنید ! (بریم جلو متوجه میشید چرا ؟!)
2.CTC Mode :
که مخفف Clear Timer On Compare Match میباشد.
اگه جمله بالا رو بخوایم ترجمه کنیم داریم : پاک کردن تایمر در هنگام مچ شدن عمل مقایسه !
یعنی چه ؟! یعنی هر وقت که مقدار تایمر (TCNT0) با یه مقدار دیگه (OCR0) برابر شد،مقدار تایمر/کانتر رو صفر کن .
به عبارت دیگر،مقدار Max ما در اینجا دیگه FF نیست.بلکه مقدار ماکزیمم مثل شکل زیر OCR0 میباشد.
بذارید یه جور دیگه هم به این قضایا نگاه کنیم.
در قسمتهای قبلی آموزش،عمل مقایسه رو بصورت نرم افزاری انجام میدادیم ! یادتونه ؟!
یعنی میومدیم با فرمول،مقدار TimerCount رو حساب میکردیم و داخل برنامه یه شرط میذاشتیم که هر وقت مقدار رجیستر TCNTx برابر با مقدار TimerCount شد،فلان کار رو انجام بده !!!
اما استفاده از اینگونه شروطی که دائما CPU رو درگیر خودش میکنه و در واقع استفاده از روش polling،ایده آل و مطلوب نیست.
با استفاده از مود CTC،عمل مقایسه بصورت سخت افزاری انجام میپذیره و نتیجتاً احتمال خطا کمتر میشه و بار مقایسه نرم افزاری از روی دوش CPU برداشته میشه.
در ادامه بیشتر در اینباره توضیح میدم.
اینم یه تصویر کاملتر :
در اینجا هم میبینید که مقدار Max ، هر مقداری میتونه تعیین بشه و در سیکلهای متفاوت مقدارهای متفاوتی رو اختیار کنه !
اینم یکی دیگه :
این شکل مربوط به تایمر/کانتر صفره .
ببینید در ردیف شکل ردیف اول یه موج دندان اره ای داریم که از 0 شروع میکنه و تا 255 میشمره.بعد از اون مجددا صفر میشه و ...
یه خط چین افقی وجود داره که همون مقدار مقایسه ای ما (Compare Match) میباشد.==> OCR0A که برای مثال مقدارش 250 در نظر گرفته شده.
اما دقت کنید که نمودار اولی،توسط میکرو ساخته نمیشه،بلکه یک نمایشی هست برای درک بهتر مسئله !
میکرو فقط پالس سرش میشه !!!
خب.تایمر شروع میکنه از صفر به شمردن و میرسه به مقدار OCR0.
وقتی به OCR0 رسید (که همون Max ما باشه)،میکرو رو مطلع میکنه که مقدار تایمر/کانتر با مقدار رجیستر مقایسه ای برابر شده.(از طریق رجیستر مربوطه و وقفه)
در شکل بالا چون یک مثاله،براش تعریف شده که با مچ شدن مقادیر دو رجیستر TCNT0 و OCR0،پایه OC0 میکرو Toggle بشه !
اما در ادامه میبینید که میتونید حالتهای مختلفی برای پایه OCx انتخاب کنید.
دقت داشته باشید که مباحث داره به ساده ترین حالت ممکن پیش میره و هیچ ادعایی بر کامل بودن مطالب وجود نداره !
بررسی رجیسترها در تایمر/کانتر صفر :
بررسی رجیستر OCR0 :
Output Compare Register
مقداری که میخوایم مقدار Max ما باشه رو داخل این رجیستر میریزیم.
دقت داشته باشید که تایمر/کانتر صفر 8 بیتی هست و میتونه مقداری بین 0 تا 255 رو اختیار کنه.
مقدار این رجیستر همون مقدار TimerCount هست که با فرمول حسابش میکردیم !
بررسی رجیستر TCCR0 :
Timer/Counter Control Register
بیت های 3 و 6 ؛ Bit 6 , 3 – Wave Generation Mode Bits :
با استفاده از این دوتا بیت و همچنین جدول زیر،میتونیم مود کاری تایمر/کانتر صفر رو مشخص کنیم :
که در اینجا ردیف سوم جدول بالا منظورمونه و مقدار WGM0:1 برابر با 10 در نظر گرفته خواهد شد.
بیت های 4 و 5 ؛ Bit 5 , 4 – Compare Match Output Mode :
مشخصا در میکروکنترلر ATmega32 پایه ای داریم به نام OC0 .
یه جدول هم داریم به قرار زیر :
این جدول میگه که با برابر شدن مقدار تایمر/کانتر صفر با مقدار رجیستر 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
بیت 1 ؛ Bit 1 – OCF0: Output Compare Flag 0 :
هنگامی که مقدار تایمر/کانتر صفر و رجیستر OCR0 با همدیگر برابر شد و هون مچینگ خودمون اتفاق افتاد،این فلگ یک میشه.
OCF0 پس از انجام وقفه و اجراشدن دستور زیرروال وقفه بصورت سخت افزاری و اتوماتیک صفر خواهد شد.
همچنین با نوشتن 1 بر روی این فلگ،میتوان بصورت دستی آن را صفر کرد.
دقت داشته باشید که با فعال بودن بیت وقفه سراسری (I) از رجیستر SREG ( با دستور اسمبلی "sei" در محیط کدویژن ) و همچنین بیت OCIE0 از رجیستر TIMSK و فعال شدن همین بیت،وقفه اجرا خواهد شد.
بررسی رجیسترها در تایمر/کانتر یک :
بررسی رجیسترهای OCR1A , OCR1B :
Output Compare Register 1 A - OCR1AH and OCR1AL
Output Compare Register 1 B - OCR1BH and OCR1BL
دوتا رجیستر داریم از نوع 16 بیتی که عددی بین 0-65535 رو میتونند در خودشون جای بدند.
اگه یادتون باشه بالاتر گفتم براتون که دیگه اینجا مقایسه نرم افزاری نیست و سخت افزاریه !
یه عددی هم از مسئله بدست آوردیم که مقدارش 24999 بود.
حالا این عدد رو میریزیم داخل یکی از این دوتا رجیستر.
اما تو کدوم یکیشون بریزیم ؟!
تو هرکدوم که دوست داشتید !
در واقع کمپانی اتمل برای این بخش 2 تا Compare Register تعریف کرده که قادر باشیم مقدار تایمر/کانتر یک رو همزمان با دو مقدار (OCR1A , OCR1B) مقایسه کنیم.
پس این دوتا ماهیتاً هیچ تفاوتی با هم ندارند !
بررسی رجیستر TCCR1A :
Timer/Counter1 Control Register A - TCCR1A
بیت های 0 و 1؛ Bit 1:0 – Wave Generation Mode Bits :
با این دو بیت و بیتهای WGM12:13 از رجیستر TCCR1B میتونیم مود کاری تایمر/کانتر یک رو مشخص کنیم.
بیت های 4 و 5 و 6 و 7 ؛ Bit 4:7 – Wave Generation Mode Bits :
برای تایمر/کانتر یک هم مشخصا پایه هایی با نام های OC1A و OC1B وجود داره.
که طبق توضیحات قبلی برای تایمر/کانتر صفر و جدول زیر داریم :
بررسی رجیستر TCCR1B :
Timer/Counter1 Control Register B - TCCR1B
بیت های 3 و 4؛ Bit 4:3 – Wave Generation Mode Bits :
از این رجیستر هم با دو بیت WGM12,WGM13 کار داریم.
این چهار بیت (WGM10,WGM11,WGM12,WGM13) از دو رجیستر TCCR1A و TCCR1B در کنار هم میتونند مود کاری تایمر/کانتر رو تعیین کنند !
چجوری ؟!
اینجوری ! :
مود شماره 4 و 12 جدول بالا مدنظر ماست !
که فعلا ما مود 4 رو انتخاب میکنیم.مود 12 رو اگه وقت شد یه توضیحاتی براش میدم !
که مقدار متناظرش برای 4 فلگ WGM10:13 برابر 0100 خواهد بود.
بررسی رجیستر TIMSK :
Timer/Counter Interrupt Mask Register
بیت 3 و 4 ؛ Bit 3:4 – OCIE1A:B: Timer/Counter1, Output Compare A:B Match Interrupt Enable :
با یک کردن هر یک از دو بیت بالا میشه،وقفه های برابری مقدار تایمر/کانتر یک با رجیستر های OCR1A و OCR1B رو فعال کرد.
بررسی رجیستر 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) یک خواهد شد.
این فلگ پس از اجرا شدن روتین وقفه بصورت اتوماتیک صفر خواهد شد.
در صورت عدم استفاده از وقفه با نوشتن 1 بر روی این فلگ میتوانید مقدارش رو به صفر برگردونید.
با فعال بودن فلگ وقفه سراسری از رجیستر SREG و همچنین فعال بودن بیت OCIE1A (یا OCIE1B) و فعال شدن فلگ OCF1A (یا OCF1B) وقفه رخ خواهد داد.
بررسی رجیسترها در تایمر/کانتر دو :
دیگه برای این یکی توضیح نمیدم.
آخه چقدر من باید توضیح بدم برای شما ؟! هان ؟؟؟؟؟
بررسی رجیستر OCR2 :
Output Compare Register
مقدار مورد نظر برای مقایسه داخل این رجیستر ریخته میشه !
بررسی رجیستر TCCR2 :
Timer/Counter Control Register
بیت های 3 و 6 ؛ Bit 6, 3 – WGM21:0: Waveform Generation Mode :
از این دوتا بیت برای تعیین مود کاری تایمر/کانتر دو استفاده میشه.
جدول زیر هم هست :
بیت های 4 و 5 ؛ Bit 5:4 – COM21:0: Compare Match Output Mode :
با این بیتها هم میشه مث قبل وضعیت پایه OC2 رو مشخص کرد.
طبق جدول زیر :
بررسی رجیستر TIMSK :
Timer/Counter Interrupt Mask Register
بیت 7 ؛ Bit 7 – OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable :
با یک کردن این بیت،وقفه تایمر/کانتر دو رو میشه فعال کرد.
بررسی رجیستر TIFR :
Timer/Counter Interrupt Flag Register – TIFR
بیت 7 ؛ Bit 7 – OCF2: Output Compare Flag 2 :
اگر مقدار تایمر/کانتر دو با مقدار رجیستر OCR2 برابر بشه،این بیت یک میشه.
و توضیحات قبلی ...
همونطور که دیدید مطالب بصورت متناوب برای تایمر/کانترهای مختلف تکرار شد.
اگه دوست دارید که قاط نزنید ! سعی کنید مطالب رو تو ذهنتون طبقه بندی کنید.
و این را بدانید که مطلب زیاده برای گفتن،اما کی حالشو داره ؟؟؟!!!
پس اگه دنبال این هستید که بصورت کامل از تایمر/کانتر سر در بیارید،حتما مرجعمون که دیتاشیت باشه رو مطالعه کنید ...
از دوستان گلم که مطالب وبلاگو خوندن و استفاده کردن تقاضا دارم که منو هم دعا کنند که انشاالله امتحانات با نمراتی خوب پاس بشن و انگیزه من برای وقت گذاشتن و پست زدن داخل وبلاگ دو چندان بشه !