بازدیدها: 473
با سلام خدمت همه دوستان و همراهان
مقدمات و نکات تایمر کانتر صفر از جمله مدها، رجیسترها و … را در مطلب قبلی گفتیم و امروز در مورد مد CTC (مقایسه) تایمر صفر صحبت خواهیم کرد.
در حالت مقایسه رجیستر TCNT0 به طور دائم با رجیستر OCR0 مقایسه، و در صورت تطابق (مساوی شدن) رجیستر TCNT0 برابر صفر می شود. از این نتیجه مقایسه می توان برای تولید شکل موج روی پایه خروجی OC0 استفاده نمود که خود چهار حالت دارد:
در هنگام تطبیق مقایسه در صورت فعال بودن وقفه و تولید پرچم OCF0 می توان یک وقفه مقایسه را ایجاد نمود و از روال وقفه برای بروزرسانی مقدار رجیستر OCR0 استفاده نمود. به هر حال تغییر رجیسیتر OCR0 به یک مقدار جدید در زمانی که تایمر در حال شمارش است باید با احتیاط انجام شود، زیرا که حالت CTC دارای بافر مضاعف نمی باشد.
مثال: برنامه ای بنویسید که هر 30 میلی ثانیه پایه OCR0 را مکمل (معکوس سازی) کند؟
هدف ما ساختن یک شکل موج می باشد که طول هر نیم سیکل آن 30ms است. یعنی 30ms پین در وضعیت یک و 30ms دیگر در وضعیت صفر. البته چون 30ms عدد نسبتا بالایی است و با توجه به اینکه فرکانس نوسان ساز ما 8MHz می باشد پس ما N=1024 قرار می دهیم تا فرکانس کاری تایمر برابر 7.813KHz شود تا بتوانیم این تاخیر بالا را ایجاد کنم. همانطور که می دانید با انتخاب N بالا فرکانس کاری تایمر پایین خواهد آمد و درنتیجه زمان پر شدن رجیستر ها بالا می رود.
#include <mega16.h> #define xtal 8000000 void main(void){ PORTB=0x00; DDRB=0x08; //H1 TCNT0=0x00; //H2 OCR0=0xEA; //H3 TCCR0=0x1D;//H4 while (1); //H5 }
توضیحات برنامه:
نحوی محاسبه زمان 30 میلی ثانیه ای:
234 برابر با EA هگز می باشد که باید در رجیستر ORC0 قرار بگیرد.
نحوی محاسبه با Codewizard :
نکته: شما می توانید که مقدار رجیستر TCNT0 را نیز با عدد دلخواه حساب شده پر کنید مثلا اگر عدد 8 را وارد کردید در هنگام شروع کار، تایمر دیگر از صفر شروع به بالا رفتن نمی کند بلکه از 8 شروع می کند بنابراین با تغییر این عدد می توانید زمان های دقیق را داشته باشید.
سوالات و پیشنهادات خودتان را در نظرات همین صفحه اعلام کنید.
نویسنده: سید محسن قاسمیان