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

آموزش تایمر آردوینو بخش اول

آموزش Timer آردوینو
نوشته شده توسط علیرضا قربانی

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

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

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 می‌گویند.

آموزش 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

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

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

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

علیرضا قربانی

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۹ دیدگاه

  • سلام دوست عزیز و همنام من
    مرسی بابت آموزشت ولی من ب جواب سوالم نرسیدم بخاطر همین مطرحش میکنم
    من میخام تو مدت زمان بیست میلی ثانیه از ای دی سی اردوینو عدد بخونم و ذخیره کنم…چجوری میشه این کارو کرد؟؟؟
    اگ روشی داری تو ذهنت این ایمیل منه برام بفرستی ممنون میشم

    • با سلام
      ضمن عذرخواهی بابت مشکل بوجود آمده، متاسفانه این آموزش مربوط به بیش از ۲ سال پیش می‌باشد و تصاویر آن در دسترس نمی‌باشد. همچنین از دیگر کاربران تقاضا دارم تا در رفع مشکل شما همکاری کنند.

  • سلام مهندس جان من میخام یه کد بنویسم که تابع for مورد نظر بعد از ۳ دقیقه stop بشه و برنامه از اول اجرا بشود از چه تابعی باید استفاده بکنم؟با تشکر

  • سلام
    من نیاز دارم از تایمر ۲ در اردوینو uno استفاده کنم اما کتابخانه ای پیدا نکردم . بی زحمت پیوست کنید کتابخانه تایمر ۲ رو

  • سلام..
    من تو ی برنامه خیلی گیر افتادم و نمیدونم طور حل کنم:
    من میخوام بعد از برقرار شدن یک شرط بعد از مثلا یک ثانیه یک led روشن بشود..اما بدون استفاده از دستور delay ..تقریبا مثل این :
    }(if (p==HIGH
    یک تاخیر یک ثانیه ای بجز delay
    ;(digitalWrite(led,HIGH
    {
    فقط اون قسمت تاخیر مشکل دارم..لطفا کمک کنید خیلی کارم گیره

      • دیگه شفاف تر از این بگه که میخواد از تایمر ب جای دلای استفاده کنه که در روند برنامه تاخیری ایجاد نشود ؟ وقتی یک ورودی های شود بعد از یک ثانیه سک ال ای دی در پین خروجی روشن شود و بدون استفاده از دلای پس قطعا باید تایمر را استارت کند و منتظر سر ریز شدن اورفلو بشه و یا از اینتراپت تایمر استفاده کند …. شما به عنوان ی ادمین باید جوابشو میدادی

        • سپاس از همراهی شما کاربر گرامی
          برای حل مشکل بایستی سوالات کامل شفاف پرسیده شود تا راهنمایی صحیحی انجام شود نه ایجاد گمراهی کند.

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

    • با سلام
      در برنامه نویسی آردوینو دو مدل ایجاد وقفه داریم. وقفه داخلی و وقفه خارجی که پیشنهاد می‌شود کتابخانه ها را بررسی کنید.

  • سلام میخواستم بدونم برای برنامه ای که نوشته شده میتوان تایمر اضافه کرد یا باید از سر نوشته شود