در این آموزش مبحث تایمر را در پلتفرم آردوینو دنبال خواهیم کرد.با مرجع تخصصی آردوینو،دیجیاسپارک همراه باشید.
آموزش را با یک مثال ساعت شروع میکنیم.فرض کنید میخواهیم برنامهی یک ساعت را بنویسیم ، کدهای برنامه همانند زیر میباشد :
int sec = 0; int _min = 0; int hour = 0; void setup() { } void loop() { delay(1000): sec++; if (sec == 60) { sec = 0; _min++; if (_min == 60); { _min = 0; hour++; } } }
فرض کنید دستور (delay(1000 به طور کاملا دقیق در۱ ثانیه درست جواب دهد اما سوال اینجاست که آیا ساعتی که توسط کد بالا نوشته شده است دقیق کار میکند؟ اگر برنامه خودش به تنهایی کار کند و هیچگاه تغییرش ندهیم ، بله درست جواب میدهد. برای مثال اگر در برنامه یک عدد کلید استفاده کرده بودیم و به آن یک وقفه انتساب داده بودیم با هر بار فشار دادن کلید باعث ایجاد یک intterrupt در برنامه میشد و زمان بندی داخل loop به هم میریخت و ساعت درست عمل نمیکرد و ممکن بود دقت ساعت حتی به ۱ ثانیه در دقیقه هم نمیرسید.
معماران پردازندهها برای رفع مشکلاتی از این نظیر یک المانی در خارج از دل cpu طراحی کرده اند به نام Timer/Counter که وظیفه آن شمارش زمان میباشد و چه cpu بیکار باشد و چه در حال پردازش ، این المان زمانهای منظمی را تولید میکند. به این قسمت Timer میگویند.
اگر با پلت فرم آردوینو برنامه نویسی کرده باشید ، بی شک از تایمرها استفاده کردهاید بدون آن که خودتان متوجه این موضوع شده باشید زیرا آردوینو دارای زبان برنامه نویسی سطح بالایی میباشد و هنگام کار با آن شما زیاد با جزئیات داخل سخت افزار روبهرو نخواهید شد. تعدادی از توابع موجود در آردوینو مانند 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 قرر دارد.
TIMSKx
از این تابع به منظور فعال و غیرفعال کردن وقفه استفاده میشود. دو نوع وقفه برای تایمر داریم :
OverFlow Interrupt : زمانی که مقدار تایمر به ماکیزیمم مقدار خود برسد ، یک وقفه تولید میکند. برای مثال در Timer0 َ، از صفر شروع به شمارش میکند تا به ۲۵۵ برسد سپس اگر OverFlow Interrupt فعال باشد یک وقفه تولید میکند و سپس دوباره از صفر شروع به شمارش میکند.
Compare math interrupt : این وقفه زمانی اتفاق میافتد که مقدار TCNT با مقدار OCR برابر شود
TCCRx
در این رجیشتر تقسیمات ضریب تقسیم ذخیره میشود.
TIFRx
در این رجیستر نیز تنظیمات وقفه ذخیره میشود.
به علت مشکل بودن تنظیمات تایمر به سیله رجیسترها ، در قسمت بعدی لایبرری را معرفی خواهیم کرد که به کمک آن به راحتی میتوان تایمر را راهاندازی نمود.
سلام دوست عزیز و همنام من
مرسی بابت آموزشت ولی من ب جواب سوالم نرسیدم بخاطر همین مطرحش میکنم
من میخام تو مدت زمان بیست میلی ثانیه از ای دی سی اردوینو عدد بخونم و ذخیره کنم…چجوری میشه این کارو کرد؟؟؟
اگ روشی داری تو ذهنت این ایمیل منه برام بفرستی ممنون میشم
سلام
ممنون از اموزشتون.
میخواستم بگم برا چی تصاویر معلوم نیستن.ممنون
با سلام
ضمن عذرخواهی بابت مشکل بوجود آمده، متاسفانه این آموزش مربوط به بیش از ۲ سال پیش میباشد و تصاویر آن در دسترس نمیباشد. همچنین از دیگر کاربران تقاضا دارم تا در رفع مشکل شما همکاری کنند.
سلام مهندس جان من میخام یه کد بنویسم که تابع for مورد نظر بعد از ۳ دقیقه stop بشه و برنامه از اول اجرا بشود از چه تابعی باید استفاده بکنم؟با تشکر
سلام
لطفا واضح تر توضیح دهید.
سلام
من نیاز دارم از تایمر ۲ در اردوینو uno استفاده کنم اما کتابخانه ای پیدا نکردم . بی زحمت پیوست کنید کتابخانه تایمر ۲ رو
سلام
در این خصوص به لینک زیر مراجعه کرده و در قسمت دانلود کتابخانه Timer2 را دانلود نمایید.
آردوینو Uno R3 به همراه کیس شفاف
سلام.
بنده جایی از سایت که میشه کتابخانه رو دانلود پیدا نمی کنم.
هر بار که روی یه لینک کلیک می کنم، یه صفحه تبلیغاتی رو از همین سایت ( برای فروش محصولات الکترونیک ) باز می کنه.
میشه یه آموزش تصویری برامون بذارین؟
مچکرم
با سلام
کاربر گرامی برای دسترسی به کتابخانهها نیاز نیست از طریق سایت ما دانلود کنید. کافیست از مخازن آردوینو آنرا دانلود کنید.
سلام..
من تو ی برنامه خیلی گیر افتادم و نمیدونم طور حل کنم:
من میخوام بعد از برقرار شدن یک شرط بعد از مثلا یک ثانیه یک led روشن بشود..اما بدون استفاده از دستور delay ..تقریبا مثل این :
}(if (p==HIGH
یک تاخیر یک ثانیه ای بجز delay
;(digitalWrite(led,HIGH
{
فقط اون قسمت تاخیر مشکل دارم..لطفا کمک کنید خیلی کارم گیره
با سلام
در این خصوص بایستی شفاف تر توضیح دهید تا راهنمایی گردد.
همچنین در وبینار آنلاین دوره آردوینو این سرفصل تدریس میشود که از طریق لینک زیر میتوانید ثبت نام کنبد.
دیگه شفاف تر از این بگه که میخواد از تایمر ب جای دلای استفاده کنه که در روند برنامه تاخیری ایجاد نشود ؟ وقتی یک ورودی های شود بعد از یک ثانیه سک ال ای دی در پین خروجی روشن شود و بدون استفاده از دلای پس قطعا باید تایمر را استارت کند و منتظر سر ریز شدن اورفلو بشه و یا از اینتراپت تایمر استفاده کند …. شما به عنوان ی ادمین باید جوابشو میدادی
سپاس از همراهی شما کاربر گرامی
برای حل مشکل بایستی سوالات کامل شفاف پرسیده شود تا راهنمایی صحیحی انجام شود نه ایجاد گمراهی کند.
درود بر شما مهندس جان.تایمری میخوام که با یک شدن ورودی خروجی به مدت مشخصی فعال شود و قابل تنظیم با ولوم.اگر مریوط به این قسمت نیست لطفا آدرس بدید واسه مطالعه.سپاس
با سلام
لطفا لینک زیر را مطالعه کنید و سوالات تکمیلی را در بخش نظرات مطرح کنید.
آموزش و بررسی زمان سنجی با تابع millis در آردوینو Arduino
سلام برای ایجاد تأخیر های چند ساعته در آردوینو باید از چه روشی استفاده کرد ؟
با سلام
در برنامه نویسی آردوینو دو مدل ایجاد وقفه داریم. وقفه داخلی و وقفه خارجی که پیشنهاد میشود کتابخانه ها را بررسی کنید.
سلام وقتتون بخیر برای تنظیم ساعت بوسیله کلید های روی برد آردوینو برناه خاصی لازمه ؟؟
با سلام
بله بایستی از ماژول های ساعت و یا وقفه و تایمر استفاده کنید.
سلام میخواستم بدونم برای برنامه ای که نوشته شده میتوان تایمر اضافه کرد یا باید از سر نوشته شود
با سلام
بایستی کد جدیدی نوشته شود.