آموزش Timer آردوینو

در این آموزش مبحث تایمر را در پلت‌فرم آردوینو دنبال خواهیم کرد.با مرجع تخصصی آردوینو،دیجی‌اسپارک همراه باشید.

آموزش را با یک مثال ساعت شروع می‌کنیم.فرض کنید می‌خواهیم برنامه‌ی یک ساعت را بنویسیم ، کدهای برنامه همانند زیر می‌باشد :

فرض کنید دستور (delay(1000  به طور کاملا دقیق در۱ ثانیه درست جواب دهد اما سوال اینجاست که آیا ساعتی که توسط کد بالا نوشته شده است دقیق کار می‌کند‌؟ اگر برنامه خودش به تنهایی کار کند و هیچ‌گاه تغییرش ندهیم ، بله درست جواب می‌دهد. برای مثال اگر در برنامه یک عدد کلید استفاده کرده بودیم و به آن یک وقفه انتساب داده  بودیم با هر بار فشار دادن کلید باعث ایجاد یک intterrupt در برنامه میشد و زمان بندی داخل loop به هم می‌ریخت و ساعت درست عمل نمی‌کرد و ممکن بود دقت ساعت حتی به ۱ ثانیه در دقیقه هم نمی‌رسید.

معماران پردازنده‌ها برای رفع مشکلاتی از این نظیر یک المانی در خارج از دل cpu طراحی کرده اند به نام Timer/Counter که وظیفه آن شمارش زمان می‌باشد و چه cpu بی‌کار باشد و چه در حال پردازش ، این المان زمان‌های منظمی را تولید می‌کند. به این قسمت Timer می‌گویند.

آموزش timer arduino

اگر با پلت فرم آردوینو برنامه نویسی کرده باشید ، بی شک از تایمرها استفاده کرده‌اید بدون آن که خودتان متوجه این موضوع شده باشید زیرا آردوینو دارای زبان برنامه نویسی سطح بالایی می‌باشد و  هنگام کار با آن شما زیاد با جزئیات داخل سخت افزار روبه‌رو نخواهید شد. تعدادی از توابع موجود در آردوینو مانند millis , delay , micros , analogWrite , tone , noTone  , همچنین کتابخانه Servo از تایمر استفاده می‌کنند.

تعریف تایمر در آردوینو

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

تایمر در آردوینو

تایمر را می‌توان توسط رجیسترهای مخصوصی در آردوینو راه اندازی نمود. بردهای آردوینویی که بر پایه‌ی میکروکنترلرهای ATmega168 یا  ATmega328 هستند ، دارای پایه‌های همسان می‌باشند و در مقدار حافظه تفاوت دارند. این آردوینو ها دارای سع عدد تایمر می‌باشند که به نام ‌های  Timer0 و Timer1 و Timer2  شناخته می‌شوند. Timer0 و  Timer2 تقریبا یکسان می‌باشند.وجه تفاوت Timer1 با دو تایمر دیگر در این است که تایمر شماره ۱ ، ۱۶ بیتی و دو تایمر شماره ۰ و ۲ ، ۸ بیتی می‌باشند. تفاوت تایمر ۸ بیتی با تایمر۱۶ بیتی در این است که تایمر ۸ بیتی می‌تواند تا مقدار ۲۵۵ ( ۲ به توان ۸ منهای ۱ )  بشمارد ولی تایمر ۱۶ بیتی می‌تواند تا مقدار ۶۵۵۳۵ ( ۲ به توان ۱۶ منهای ۱ ) بشمارد  همچنین تایمر شماره ۱ دارای قابلیت‌های بسیار پیشرفته‌تری می‌باشد که بعدا در مورد آن‌ها صحبت می‌کنیم. از این رو Timer1 برای محاسبات زمان‌های طولانی تر بسیار پرکاربردتر است.

آردوینوهای سری MEGA که بر پایه‌ی پردازنده‌های ATmega1280 یا ATmega2560 هستند ، علاوه بر ۳ تایمر معرفی شده ، دارای ۳ تایمر دیگر نیز می‌باشند.یعنی در مجموع این گونه آردوینو‌ها جمعا دارای ۶ عدد تایمر می‌باشند. سه تایمر اولی همانند سه تایمر معرفی شده می‌باشند و سه تایمر دیگر با نام‌های Timer3 , Timer4 , Timer5 شناخته می‌شوند. این سه تایمر همانند تایمر۱ ، ۱۶ بیتی هستند.

عمل‌کرد هر کدام از Timer‌ها

Timer0 :  این تایمر ۸ بیتی است و در تمام آردوینو‌ها برای شمارش زمان در توابعی مانند delay , millis و micros استفاده می‌شود.اگر مقدار رجیستر‌های Timer0 تغییر کند ، ممکن است در سه تابع معرفی ذکر شده ، اختلال به وجود آید.

Timer1 : تایمر ۱۶ بیتی است . در تمام آردوینو‌ها از تایمر۱ در کتابخانه سروو استفاده می‌شود ( به غیر از آردوینو‌های سری مگا که از تایمر۵ استفاده می‌کند) .

Timer2 : این تایمر همانند تایمر۰ ، یک تایمر ۸ بیتی است. در تمام آردوینو‌ها تابع Tone از Timer2 استفاده می‌کند.

Timer3 , Timer4 , Timer5 : این تایمر‌ها ۱۶ بیتی هستند و فقط در آردوینوهای سری MEGA قابل دسترس می‌باشند.

رجیستر‌های تایمر

 

TCNTx

در این ثبات x شماره‌ی تایمر را مشخص می‌کند.برای مثال اگر x برابر ۵ بود یعنی تایمر شماره ۵ و اگر x برابر ۰ بود یعنی تایمر شماره۰٫ این رجیستر وظیفه شمارش را دارد و مقدار شمارش شده  در این رجیستر ذخیره می‌شود.  مقدار ماکزیمم این رجیستر در تایمر‌های ۸ بیتی برابر ۲۵۵ و در تایمر‌های ۱۶ بیتی برابر ۶۵۵۳۵ می‌باشد. دو نوع حالت شمارش داریم :

حالت شمارش Normal :در این حالت تایمر از صفر شروع به شمارش می‌کند تا به مقدار ماکزیمم ( در تایمر ۸ بیتی مقدار ماکزیمم برابر ۲۵۵ و در تایمر ۱۶ بیتی مقدار ماکزیزمم برابر۶۵۵۳۵ ) برسد سپس سر ریز شده و دوباره از صفر شروع به شمردن می‌کند.در حالت Normal قسمتی داریم به نام bottom  که وقتی TCTN را مقدار دهی کنیم ، از همون مقدار شروع به شماررش می‌کند با به ماکزیمم برسد.

حالت شمارش ( CTC (clear Timer on Compare match : در این مد تایمر بر خلاف حالت قبلی تا ماکزیمم مقدار تایمر  شمارش نمی‌کند ، این بار تا مقداری که کاربر برایش تعیین می‌کند شروه به شمارش می‌کند و سر ریز می‌شود. آن مقداز که تا آن شمارش می‌شود در رجیستری به نام OCR توسط برنامه نویس معین می‌شود. مثلا اگر مقدار OCR1 برابر ۱۵۰ باشد ، تایمر  از صفر تا ۱۵۰ شمارش می‌کند و سپس سر ریزز می‌شود و دوباره از صفر شروع به شمارش می‌کند.

برای مثال در عکس زیر اگر تایمر تا ۲۵۵ بشمارد در حالت Normal  و اگر تا ۲۵۰ بشمارد در مد CTC قرر دارد.

نمایش مد CTC و Normal

نمایش مد CTC و Normal

TIMSKx

از این تابع به منظور فعال و غیرفعال کردن وقفه استفاده می‌شود. دو نوع وقفه برای تایمر داریم :

OverFlow Interrupt : زمانی که مقدار تایمر به ماکیزیمم مقدار خود برسد ، یک وقفه تولید می‌کند. برای مثال در Timer0 َ، از صفر شروع به شمارش می‌کند تا به ۲۵۵ برسد سپس  اگر OverFlow Interrupt فعال باشد یک وقفه تولید می‌کند و سپس دوباره از صفر شروع به شمارش می‌کند.

 Compare math interrupt : این وقفه زمانی اتفاق می‌افتد که مقدار TCNT با مقدار OCR برابر شود

TCCRx

در این رجیشتر تقسیمات ضریب تقسیم ذخیره می‌شود.

TIFRx

در این رجیستر نیز تنظیمات وقفه ذخیره می‌شود.

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

علیرضا قربانی
علیرضا قربانی
علیرضا قربانی هستم دانشجوی مهندسی پزشکی. چیزهای خیلی زیادی رو در دنیا دوست دارم. یک گیک هستم و یشه گفت یک هکر. نه به معنی دزدی پسورد و ایمیل مردم. به معنی عشق به دونستن و عشق به تحقیق درباره خیلی از چیزهایی که می بینم و می‌شنوم. اگر بخوام علاقه‌مندی‌ درجه یکم رو نام ببرم میتونم بگم برنامه نویسی و بعد از اون امبدد سیستم ها.

1 دیدگاه

  1. […] در مطلب زیر آوزش کار با تایمر کانتر را قرار دادم بخش ۱ بخش […]

پاسخ دهید

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