تایمر سگ نگهبان با آردوینو

بورد آردوینو Uno یک چیپ ATmega328P را به عنوان واحد کنترل کننده در قلب خود دارد.

ATmega328P دارای یک تایمر سگ نگهبان (Watchdog Timer) است. این تایمر در سناریوهایی که سیستم در اثر وجود خطا در کد نوشته شده هنگ کرده و فریز می‌شود و یا در شرایطی که مشکلات سخت‌افزاری موجب هنگ شدن سیستم می‌شود، بسیار مفید است.

تایمر سگ نگهبان چگونه کار می‌کند؟

تایمر سگ نگهبان باید مطابق با کاربرد و نیاز پیکربندی شود.

تایمر سگ نگهبان از یک منبع کلاک داخلی ۱۲۸ کیلوهرتزی بهره می‌گیرد.

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

تایمر سگ نگهبان ATmega328P را می‌توان برای ده زمان متفاوت تنظیم کرد. (زمانی که تایمر نگهبان بعد از سرریز کردن از آن، یک ریست ایجاد می‌کند)

زمان‌های مختلف عبارتند از:

 16ms ،32ms ،64ms ،0.125s ،0.25s ،0.5s ،1s ،2s ،4s و 8s .

مثال: حال اجازه دهید نحوه پیکربندی تایمر سگ نگهبان را برای بورد آردوینو Uno با هم مشاهده کنیم. در اینجا، از یک مثال ساده چشمک‌زنی LED استفاده می‌کنیم.

LEDها برای یک زمان مشخص پیش از ورود به حلقه while(1) چشمک‌زنی می‌کنند. حلقه while(1) به عنوان چیزی مشابه حالت هنگ در سیستم به کار می‌رود.

مطلب پیشنهادی:  ارتباط RS-485 بین STM32 و بورد Arduino Uno

از آنجایی که تایمر سگ نگهبان هنگام حضور در درون حلقه while(1) ریست نمی‌شود، تایمر یک ریست سیستمی ‌را باعث شده و سبب می‌شود که LEDها پیش از هنگ و راه‌اندازی مجدد بعدی، دوباره چشمک بزنند. این فرآیند درون یک حلقه ادامه می‌یابد.

در اینجا، از LED روبردی متصل به پین ۱۳ بورد آردوینو استفاده می‌کنیم. برای اسکچ این مثال، تنها قطعه مورد نیاز بورد آردوینو Uno می‌باشد.

احتیاط: تایمر سگ نگهبان در هنگام شروع کد غیرفعال است. یک تاخیر ۳ ثانیه‌ای پیش از فعال‌سازی تایمر به کار برده می‌شود.

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

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

این وضعیت به بورد آردوینو آسیب رسانده و سبب می‌شود که هیچ اسکچی درون بورد آپلود نشود.

این وضعیت برای Optiboot loader، که همراه با نسخه جدید آردوینو عرضه می‌شود محتمل نیست، اما قطعا برای نسخه‌های قدیمی‌تر رخ خواهد داد.

مطلب پیشنهادی:  نصب بوت لودر روی ATmega328 با آردوینو UNO

در موردی که این شرایط برای آردوینو شما به وجود آمد، باید bootloader را با استفاده از یک آردوینو دیگر و از طریق ISP، درون آردوینو مذکور بریزید.

اسکچ

#include<avr/wdt.h> /* Header for watchdog timers in AVR */

void setup() {
  Serial.begin(9600); /* Define baud rate for serial communication */
  Serial.println("Watchdog Demo Starting");
  pinMode(13, OUTPUT);
  wdt_disable();  /* Disable the watchdog and wait for more than 2 seconds */
  delay(3000);  /* Done so that the Arduino doesn't keep resetting infinitely in case of wrong configuration */
  wdt_enable(WDTO_2S);  /* Enable the watchdog with a timeout of 2 seconds */
}

void loop() {
  for(int i = 0; i<20; i++) /* Blink LED for some time */
  {
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
    wdt_reset();  /* Reset the watchdog */
  }
  while(1); /* Infinite loop. Will cause watchdog timeout and system reset. */
}

بقیه آموزش‌های آردوینو را هم مطالعه کنید. کامنت هم یادتون نره:)

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

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

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

2 دیدگاه

  1. مفید بود ممنون

  2. لطفا واچ داگ رو روی میکرو Atmega32a وAtmega16a چهل پایه توضیح بدید خیلی گیر افتادم وقتی واچ داگ رو روی 4 ثانیه ست میکنم نرم افزاری تا متد ش رو اجرا میکنه ریست میشه و به 1 ثانیه نرسیده میکرو ریست میشه .چند جا دیدم نوشته با اسیلاتور داخلی اوکی میشه ولی سر در نیاوردم.ممنون میشم توضیح بدین.