آخرین نوشته‌ها
خانه | میکروکنترلر | دوره آموزشی AVR | تایمر WatchDog در میکروکنترلر AVR (جلسه ی ۲۱)

تایمر WatchDog در میکروکنترلر AVR (جلسه ی ۲۱)

سلام می کنم به شما دوستای گلم، تا الان هرچی بوده و نبوده در مورد تایمرهای AVR گفتیم الا تایمر نگهبان یا همون تایمر watchdog که اینم توی این جلسه در موردش صحبت خواهیم کرد. حُسن ختام مبحث تایمرها هم همین موضوع یعنی تایمر واچ داگ خواهد بود.  امیدوارم که مفید واقع بشه.

  • توضیحات
  • کدنویسی
  • شبیه سازی

Watchdog timer

میکروکنترلرهای سری AVR دارای یک تایمر داخلی به نام تایمر watchdog هستند. این تایمر همان طور که از نام لاتین آن پیداست به معنای «سگ نگهبان» است. علت این نام گذاری را در ادامه خواهیم گفت. این تایمر دارای قابلیت های خوبی است، از جمله : دارا بودن منبع ساعت مجزای ۱۲۸ کیلوهرتز، توانایی ریست کردن میکروکنترلر و ایجاد وقفه. از دید سخت افزاری تایمر واچ داگ چیزی نیست جز یک کانتر ساده که پس از این که به حد نهایی خود رسید یک پالس تولید می کند. این پالس می تواند ایجاد وقفه کند و یا MCU میکروکنترلر را ریست کند و یا این که هر دو کار را به طور همزمان انجام دهد.

این تایمر را هر زمان که می خواهیم می توانیم روی مقدار صفر ریست کنیم. این کار با دستور اسمبلی WDR امکان پذیر است. و اینجاست که قضیه جالب می شود. اگر تصمیم گرفتید که از تایمر watchdog استفاده کنید باید در طول برنامه به طور مدام قبل از این که این تایمر پر شود آن را ریست کنید. وگرنه به طور ناخواسته MCU ریست می شود و برنامه تان از ابتدا اجرا می شود. شاید بپرسید که «پس تایمر watchdog چه کاربردی دارد؟» فرض کنید که برنامه تان جایی هنگ نموده و یا در حلقه ی تکرار بینهایت گرفتار شود، در این صورت دیگر طبق روال برنامه تایمر watchdog ریست نشده و پس از این که پر شد سیستم را ریست می کند. در این صورت شما یک محافظ کارامد برای برنامه تان دارید که همیشه مراقب روال اجرای برنامه است. به همین دلیل است که این تایمر به تایمر watchdog یا سگ نگهبان موسوم است.

پالس ساعت و مقسم فرکانس تایمر واچ داگ

تایمر watchdog با اسیلاتور ۱۲۸ کیلوهرتزی مجزایی کار می کند. این اسیلاتور یک اسیلاتور توان پایینی است که برای عملیات های زمان دقیق به اندازه ی کافی دقت ندارد. البته تحت تنظیمات خاصی در فیوزهای MCU می توان از این اسیلاتور به عنوان منبع ساعت اصلی میکروکنترلر استفاده نمود که در این صورت تایمر سگ نگهبان با کلاک پالس اصلی همزمان (سنکرون) می شود. اما این یک مورد خاص است که در این جا با آن کاری نداریم و آن را در نظر نمی گیریم. تایمر watchdog سیستم تقسیم فرکانسی مشابه با دیگر تایمرها دارد تا استفاده از آن دارای انعطاف پذیری بیشتری باشد. بر اساس تنظیماتی که روی بیت های WDP3:0 از رجیستر WDTCSR انجام می گیرد می توان زمان وقفه ی تایمر واچ داگ را از ۱۶ میلی ثانیه تا ۸ ثانیه تنظیم نمود (البته حداکثر زمان قابل تنظیم، از تراشه ای به تراشه ی دیگر تفاوت می کند).

مد وقفه ی تایمر watchdog

وقفه ی تایمر واچ داگ یک منبع وقفه ی باارزش است، زیرا به منبع ساعت مستقلی وابسته است. به همین دلیل می توان از این وقفه برای راه اندازی MCU پس از حالت sleep استفاده نمود. به عنوان مثال شما می توانید یک سیستم باتری دار و با راندمان بالا بسازید که مثلا هر ۸ ثانیه از حالت sleep خارج شده، وظیفه ای را انجام داده و دوباره به حالت sleep بازگردد. البته یک حالت خاص هم وجود دارد که تایمر watchdog می تواند هر دو موردِ وقفه و ریست را باعث شود. در چنین حالتی این امکان را دارید که قبل از ریست کردن MCU مقادیر باارزش را (مثلا در EEPROM داخلی) ذخیره نمایید (قابلیت ایجاد وقفه توسط تایمر واچ داگ فقط در بعضی از تراشه ها موجود است).

در ادامه تایمر watchdog در میکروکنترلر Atmega32 را تشریح خواهیم نمود:

کار با تایمر سگ نگهبان

ابتدا با رجیسترهای مرتبط با تایمر watchdog آشنا شویم.

رجیستر WDTCR :

رجیستر WDTCR مخفف عبارت watchdog timer control register و به معنای رجیستر کنترل تایمر واچ داگ می باشد. در این رجیستر پنج بیت قابل تنظیم وجود دارند. شکل زیر نشان دهنده این رجیستر می باشد:

 

WDTCR

 

در ادامه هریک از این پنج بیت را شرح می دهیم:

بیت های WDP0:2

بیت های WDP0 ، WDP1 و WDP2 بیت هایی هستند که مقسم فرکانس تایمر واچ داگ را هنگامی که این تایمر فعال باشد، تعیین می کنند. جدول زیر مقادیر مختلف مقسم فرکانس و تنظیم های متناظر بیت ها را نشان می دهد:

WDP table

 

بیت های WDE و WDTOE :

WDE مخفف WatchDog Enable و به معنای فعالسازی واچ داگ و WDTOE مخفف WatchDog Turn-Off Enable به معنای فعالسازی خاموشی واچ داگ می باشد.

فعال کردن تایمر واچ داگ:

برای فعال کردن تایمر watchdog باید مقدار “۱” بر روی بیت WDE نوشته شود.

غیرفعال کردن تایمر واچ داگ:

به منظور غیرفعال نمودن تایمر watchdog باید روند زیر انجام پذیرد:

  • در یک عملیات هر دو بیت WDE و WDTOE را “۱” می کنیم. حتما باید “۱” منطقی بر روی بیت WDE اعمال کرد حتی اگر قبل از شروع روند غیرفعالسازی مقدار آن یک شده باشد.
  • در طی ۴ سیکل ساعت بعدی بیت WDE را صفر می کنیم. با این کار تایمر واچ داگ غیر فعال خواهد شد.

 

رجیستر MCUCSR :

رجیستر MCUCSR مخفف MCU Control and Status Register و به معنای رجیستر وضعیت و کنترل واحد MCU می باشد. در این رجیستر با یک بیت سر و کار داریم.

MCUCSR

بیت WDRF

عبارت Watchdog Reset Flag به معنای پرچم ریست واچ داگ می باشد و همانطور که از اسم آن پیداست هنگامی که ریست واچ داگ رخ می دهد، مقدار آن یک می شود.

برای این که با برنامه نویسی و به کاربردن تایمر watchdog آشنا شوید، اجازه دهید تا مثالی را طرح نموده و ادامه ی نکات را با آن مثال پیش ببریم. همانطور که مشاهده می کنید این مثال ساده را به این دلیل مطرح خواهیم کرد که فقط با مفهوم به کارگیری تایمر واچ داگ و چگونگی برنامه نویسی آن آشنا شوید.

مثال

فرض کنید می خواهیم با میکروکنترلر Atmega32 برنامه ای بنویسیم که در آن یک LED به طور مداوم خاموش و روشن شود. فقط در ابتدای راه اندازی میکروکنترلر پس از گذشت دو ثانیه LED به مدت چند ثانیه خاموش شود و سپس به روال چشمک زدن ادامه دهد.

این کار را می شود با تایمرهای دیگر نیز انجام داد. ولی در این جا هدف ما به کاربردن تایمر نگهبان است. به منظور برنامه نویسی این مثال ابتدا باید تایمر واچ داگ را برای تاخیر ۲ ثانیه فعال کنیم. سپس در یک حلقه LED را خاموش و روشن کنیم. پس از گذشت دو ثانیه MCU ریست شده و برنامه از ابتدا اجرا می شود. قبلا گفتیم که به هنگام ریست شدن MCU توسط تایمر Watchdog، بیت WDFR یک می شود. برای همین ابتدای برنامه چک می کنیم که آیا مقدار این بیت یک است یا صفر. اگر یک بود، یعنی تایمر Watchdog قبلا ریست شده و الان باید LED به مدت چند ثانیه خاموش بماند و سپس طبق روال قبل چشمک بزند. پس تایمر واچ داگ را نیز غیرفعال می کنیم. ولی اگر مقدار بیت WDFR برابر صفر بود یعنی برنامه برای اولین بار اجرا شده و تاکنون تایمر واچ داگ ریست نشده است. پس باید تایمر watchdog را فعال کنیم. با نوشتن این برنامه به هدف خود خواهیم رسید.

برنامه ی نوشته شده برای این مثال را در بالای صفحه در تب “کدنویسی” مشاهده کنید. توضیحات مربوطه در کنار کد بیان شده است.

شبیه سازی این مثال در محیط پروتئوس را در تب “شبیه سازی” در بالای صفحه مشاهده کنید.

برنامه نویسی مثال طرح شده

کد این مثال به زبان سی و در محیط کدویژن ورژن ۳٫۱۲ نوشته شده است.

 

برای دیدن این کد باید عضو باشید. با مراجعه به قسمت حساب کاربری در ستون سمت چپ با نام کاربری خود وارد شوید یا ثبت نام کنید.

 

شبیه سازی مثال طرح شده

این مثال در محیط پروتئوس شبیه سازی شده است.  نتیجه ی شبیه سازی به صورت انیمیشن gif در تصویر زیر قرار داده شده است.

 

تایمر watchdog

 

توضیحات :

همانطور که در انیمیشن بالا مشاهده می شود. در ابتدا LED به مدت دو ثانیه چشمک می زند. پس از آن تایمر واچ داگ ایجاد ریست کرده و سپس LED به مدت چند ثانیه خاموش می ماند. بعد از آن تایمر Watchdog غیر فعال شده و LED به روال چشمک زدن سابق بر می گردد.

فایل های مربوط به مثال (شامل کد زبان سی و فایل hex) را می توانید از طریق لینک زیر دانلود کنید:

پسورد: www.microlearn.ir

دانلود فایل های تایمر WatchDog

خب یه خسته نباشید درست و حسابی می گم به همه ی دوستانی که از ابتدای مبحث تایمرها ما رو دنبال کردن. بالاخره این بحث مفصل هم به پایان رسید. حالا که دیگه  با مفاهیم و اصول میکروکنترلر AVR و اجزای داخلی اون آشنا شدیم، وقت اینه که بریم سراغ پروژه های جذاب و کابردی. در پست های بعدی در خدمتتون هستیم.

درباره‌ی مجتبی

کارشناس الکترونیک و کارشناس ارشد مخابرات سیستم | زمینه ی تحقیقاتی : پردازش تصویر و تعقیب اشیاء متحرک |‌فعال در حوزه ی الکترونیک مبتنی بر میکروکنترلر | برنامه نویس و طراح بردهای الکترونیکی مبتنی بر میکروکنترلر

۱۰ ديدگاه

  1. با سلام
    “در طی ۴ سیکل ساعت بعدی بیت WDE را صفر می کنیم. با این کار تایمر واچ داگ غیر فعال خواهد شد.”
    سیکل ساعت اصلی میکرو یا واچ داگ؟
    ——————————————————————————————————————————
    ببخشید اجرای هرخط دستور در میکرو چند سیکل هست ؟ میکرو به میکرو فرق داره ؟

    • سلام
      منظور از سیکل در اینجا سیکل منبع ساعت اصلی میکروکنترلر هس.
      خطی که به زبان سی مینویسیم رو نمیشه گفت چند سیکل استفاده می کنه. باید به فایل asm تولید شده توسط کامپایلر مراجعه کنی و دستورات اسمبلی مربوطه رو پیدا کنی، بعد از روی دیتاشیت میکروکنترلر ببینی هر دستور چند سیکل برای اجرا نیاز داره.
      این که هر دستور اسمبلی چند سیکل نیاز داره تا اجرا بشه میکروکنترلر به میکروکنترلر میتونه متفاوت باشه. البته ناگفته نمونه که مثلا در بین همه ی میکروکنترلرهای AVR ممکنه یه مقدار سیکل ببره. ولی برای اطمینان همیشه به دیتاشیت خود میکرو باید مراجعه کرد.

      • اگه نمیشه گفت چند سیکله پس چرا اینو اینجوری نوشتین
        ;(WDTCR |= (1<<WDTOE) | (1<<WDE
        ; WDTCR = 0x00

        مگه نگفتین باید چهار سیکل بعد صفرش کنیم

        • بله، من فراموش کردم بگم.
          اکثر اوقات واقعا نمیشه گفت که دقیقا هر خط زبان سی چند سیکل طول میکشه.
          ولی اینجا ما مطمئنیم که حتما تا قبل از سپری شدن چهار سیکل، خط دوم اجرا میشه. چون که بلافاصله خط دوم رو نوشتیم.
          اما به طور غیر دقیق بگم که:
          در خط اول مقداری که باید در رجیستر WDTCR ریخته بشه، قبل از تبدیل به زبان ماشین محاسبه میشه و مثلا در اینجا عدد ۰۰۰۱۱۰۰۰ جایگزینش میشه. و بعد هم این مقدار با رجیستر WDTCR باید OR بشه که بین یک تا دو سیکل بیشتر وقت نمیگیره. پس حتما تا قبل از سپری شدن چهار سیکل خط دوم هم اجرا میشه.

  2. ببخشید این دوتا حلقه تودرتو زمان خاصی رو نشون میدهد ؟ یعنی برای تاخیر مشخصی اینجوری نوشته شده ؟

    • نخیر، این دو تا حلقه برای تاخیر حدودی نوشته شده. مقادیر هم از روی شبیه ساز با سعی و خطا تعیین شدن تا در حدود مقدار مورد نیاز تاخیر تولید بشه.
      برای اینکه بتونین دقیقا با حلقه های تو در تو تاخیر دقیق مشخص کنید باید به زبان اسمبلی بنویسید و از دستور NOP هم استفاده کنید و با استفاده از دیتاشیت و راهکاری که در کامنت قبلی گفتم تعداد سیکل استفاده شده توسط حلقه و تاخیرش رو محاسبه کنید.

  3. سلام
    من چند مورد رو در مثال متوجه نمیشم اگه میشه بیشتر توضیح بدین:
    اول این که دستور if و else در تابع main قرار دارند و با run کردن برنامه “فقط یک بار بررسی می شوند” پس وقتی برنامه اجرا شود شرط if برقرار نیست ولی دستورات else احرا خواهد شد.بعد هم حلقه ی while….
    *پس چه طور با گذر ۲ ثانیه دستورات if اجرا می شوند؟؟(چرا خط ۶ بررسی خواهد شد؟؟)
    *در مورد تابع تاخیری که نوشتید : استفاده از delay_ms() که معمولا استفاده می کنیم به جای این تابع ظاهرا باعث می شود ریست انجام نشود. (حتی اگر فقط بجای delay های خطوط ۲۴,۲۶ استفاده شود!)چرا؟
    *این تابعی که نوشتید دقیقا باید چه تاخیری را بدهد تا مدار کار کند؟!

    • سلام
      در این برنامه اون شرط ها فقط یک بار بررسی نمیشن، دو بار بررسی میشن. چون بار اول دستورات درون else اجرا میشن تایمر واچ داگ برای زمان دو ثانیه فعال میشه. برنامه وارد حلقه ی while میشه و بعد از دوثانیه تایمر واچ داگ ایجاد ریست می کنه. بعد از ریست برنامه از ابتدا خونده میشه و این بار دستورات داخل شرط if اجرا میشن و بعد از وارد شدن به حلقه ی while برنامه درون حلقه می مونه.
      وقتی که از delay_ms استفاده می کنین این تاخیر با استفاده از تایمر واچ داگ نوشته شده، و با تنظیمات واچ داگ شما تداخل میکنه و همه چی به هم می ریزه. اصلا به همین دلیل بنده از delay_ms استفاده نکرده م.
      متوجه منظورتون از سوال آخر نشدم متاسفانه. با بیان دیگه ای بپرسین لطفا.
      متشکرم

  4. خیلی خوب بود.متوجه شدم.
    در مورد چطور طراحی کردن اون تابع تاخیر ابهام دارم.
    چرا از دو تا حلقه تو در تو استفاده کردین؟نمی شد یه دونه بنویسین ولی مثلا تعداد شمارش رو بیشتر کنین؟ یا بجای ۴ فراخوانی تابع در خطوط۹-۱۲ مثلا ۶ بار فراخوانی کنین؟
    یعنی کلا این نوشتن این تابع طبق یه روال منطقی انجام میشه یا همون طور که گفتین فقط با سعی خطا بوده و استفاده از دو حلقه یه مدل دلخواه و ابتکاری برای ایجاد یه تاخیر خاص هستش؟؟؟

    • عملا اون تابع تاخیر کاملا سلیقه ای نوشته شده و بابدی در کار نیست، چون هدفم صرفا ایجاد یه تاخیر بوده و حتی مقدار دقیق تاخیر هم خیلی مهم نبوده. علتش هم این بوده که اینجا فقط یه مثال آموزشی ارائه شده که کاربرد خاصی هم نداره.
      اگه جایی نیاز به ایجاد تاخیر بدون استفاده از توابع کدویژن باشه باید برای یه تاخیر خاص از دستورات اسمبلی استفاده کرد که در کامنت های قبل توضیح داده م.

پاسخ دهید

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

Time limit is exhausted. Please reload CAPTCHA.

کانال تلگرام میکرولرن
  • سلام دوست من :)
  • دوس داری AVR را ساده یاد بگیری؟
  • برنامه نویسی C را توی دانشگاه خوب یاد نگرفتی؟
  • از سایت های جذاب و تکنولوژیکی دنیا خبر داری؟
  • میونت با فیلمای با نمک و جذاب رباتیک چطوره؟
  • دنبال پروژه های جذاب برای دانشگاه یا کارای مورد علاقت میگردی؟
  • پس رو دکمه ی زیر یه تلنگر کوچولو بزن