به نام خدا : آموزش آرم میکروکنترلر lpc1768 جلسه 14 watchdog timer ؛ در این مطلب مبحث (Watchdog Timer (WDT از دیتاشیت lpc176x/5x ( نام کامل فایل : UM10360 ) که فصل 28 ام هستش رو توضیح بدم، در واقع این مطلب ترجمه و خلاصه شده فصل 28 دیتایشت هستش؛ در یه مطلب دیگه ( شاید هم ته همین مطلب ) کتابخونه راه اندازی تایمر نگهبان + پروژه های نمونه رو قرار میدم.
آموزش آرم میکروکنترلر lpc1768 جلسه 14 watchdog timer
مقدمه تایمر واچ داگ
توجه : پاور تایمر واچ داگ ( تایمر نگهبان، سگ نگهبان ) همیشه فعال هستش و امکان غیر فعال کردنش وجود نداره ( کلا فعال و غیر فعال کردن پاورش درست ما نیست، همیشه پاورش فعال هستش )
وظیفه ( کاربرد ) تایمر واچ داگ : هدف و وظیفه تایمر واچ داگ ریست کردن میکروکنترلر هستش، اگه در یک وضعیت اشتباه بیش از مدت زمان تعیین شده ( توسط کاربر ) قرار بگیره. ( در حین اجرای یه قسمتی از پروژه، میکرو هنگ کنه و بقیه کدهای پروژه رو اجرا نکنه؛ تو یه قسمتی از پروژه بیش از حد وایسه، یه چی تو این مایه ها )
خصوصیات تایمر واچ داگ
1) دارا بودن یه تایمر 32 بیتی مجزا و مخصوص خودش.
2) وجود مدل دیباگ ( وقفه ) و ریست ( وقتی وقفه رخ داد وقفه رخ بده یا میکرو ریست بشه؟ که توسط کاربر قابل تعیین هستش )
3) تایمر واچ داگ توسط کدنویسی ( کاربر ) فعال میشه اما برای غیر فعال کردنش نیاز به یک ریست سخت افزاری ( توسط کاربر ) و یا وقفه/ریست تایمر واچ داگ هستش ( توضیحات بیت WDEN از رجیستر WDMOD رو بخونید )
4) وجود یک flag ( بیت WDEN از رجیستر WDMOD مربوط به این فلگ/پرچم هستش ) برای مشخص نمودن ریست واچ داگ، این فلگ باید توسط کاربر پاک بشه ( مثلا بفهمیم الان که میکرو ریست شد، توسط کاربر این کار انجام شد یا توسط تایمر واچ داگ که میایم این فلگ رو میخونیم و متوجه میشیم که علت ریست واچ داگ بوده یا نه )
5) کلاک واچ داگ ( WDCLK ) میتونه از طریق ( Internal RC oscillator ( IRC و یا RTC oscillator تامین بشه؛ که طیف گسترده ای از محدوده زمانی هایی رو به ما میده که برای واچ داگ قابل انتخاب هستند تحت شرایط مختلف کاهش ولتاژ؛ برای افزایش ضریب اطمینان، قابلیت اجرای تایمر واچ داگ بصورت داخلی که هیچ وابستگی به کریستال خارجی نداره فراهم شده.
6) تایمر واچ داگ همچین قابلیت پیکربندی برای اجرا در مد Deep Sleep رو هم داره وقتی از IRC به عنوان منبع کلاک تایمر واچ داگ استفاده میکنیم.
7) واحد تایمر نگهبان ( واچ داگ ) از دو منبع کلاک PCLK و WDCLK استفاده میکنه که PCLK استفاده میشه برای دسترسی APB به رجیسترهای تایمر نگهبان و WDCLK هم برای شمارش تایمر نگهبان مورد استفاده قرار میگیره.
8) وقتی رجیسترهای WDMOD و WDTC مقدارشون توسط APB تغییر میکنه، مقدار جدید بعد از 3 کلاک WDCLK اعمال میشه.
9) برای خوندن مقدار شمارنده تایمر نگهبان ( که کلاکش توسط WDCLK تامین میشه )، ابتدا مقدار شمارنده قفل میشه و سپس میتونیم رجیستر WDTV رو بخونیم ( که کلاکش توسط PCLK تامین میشه )
توضیح مختصر راه اندازی تایمر واچ داگ
1) مقدار ثابت شمارنده واچ داگ رو در جریستر WDTC قرار بدید.
2) مد واچ داگ رو در رجیستر WDMOD تعیین کنید.
3) تایمر واچ داگ رو با نوشتن 0xAA و سپس 0x55 در رجیستر WDFEED فعال کنید.
4) تایمر واچ داگ باید قبل از این که شمارنده اش به مقدار حداکثر تعیین شده براش برسه، ریست بشه ( وگرنه میکرو رو ریست میکنه یا باعث رخ دادن وقفه واچ داگ میشه – برای ریست کردن شمارنده تایمر واچ داگ باید مورد شماره 3 -خط بالا- رو اجرا کنیم )
توضیح رجیسترهای تایمر نگهبان
لیست رجیسترهای تایمر نگهبان رو مشاهده میکنید، 5 تا رجیستر هستش همش، بریم سراغ توضیح تک تک رجیسترهای فوق :
رجیستر WDMOD : رجیستر مد واچ داگ، این رجیستر حاوی مد ابتدایی و وضعیت تایمیر نگهبان هستش.
بیت 0 ( WDEN ) : فعال کردن تایمر نگهبان؛ این بیت فقط قابلیت فعال کردن تایمر واچ داگ رو داره، قابلیت غیرفعال کردنشو نداره؛ برای غیر فعال کردن تایمر نگهبان نیاز به یک ریست سخت افزاری ( توسط کاربر ) و یا وقفه/ریست تایمر واچ داگ هستش.
بیت 1 ( WDRESET ) : یک کردن این بیت باعث رخ دادن وضعیت timeOut تایمر نگهبان میشه و میکرو ریست میشه ( 0 کردن این بیت تاثیری نداره )، این بیت همونطور که در توضیحات بیت WDEN گفتم برای غیرفعال کردن تایمر نگهبان میتونه بکار بره.
توجه : ترکیب بیت WDEN و WDRESET، مد تایمر نگهبان رو تعیین میکنن، که بعد از توضیح ریجستر ها بهش میپردازم.
بیت 2 ( WDTOF ) : پرچم رخ دادن ریست ( تایم اوت ) تایمر نگهبان، همونطور که قبلا گفتم وقتی ریست توسط تایمر نگهبان رخ میده این بیت 1 میشه و باید توسط کاربر مقدارش پاک بشه؛ و تنها وقتی مقدارش توسط خود میکرو پاک میشه که یک ریست سخت افزاری رخ بده ( کاربر پایه ریست میکرو رو تحریک کنه )
بیت 3 ( WDINT ) : پرچم وقفه تایمر نگهبان، با رخ دادن timeOut تایمر نگهبان این بیت یک میشه، این بیت توسط کاربر پاک نمیشه ( وقتی هر نوع ریستی رخ داد، این بیت پاک میشه )، که این بیت قابلیت دیباگ کردن تایمر نگهبان رو به ما میده بدون این که ریست شدن میکرو در هنگام timeOut ( چطوری؟ )؛ اگه وقفه تایمر نگهبان در مدهای Sleep یا Deep Sleep رخ بده، باعث بیدار شدن میکرو میشه.
رجیستر WDTC : این رجیستر حاوی مقدار ثابت شمارنده هستش، که مقدار timeOut رو تعیین میکنه ( شمارنده واچ داگ به این مقدار برسه، میکرو رو ریست میکنه )
حداقل مقداری که برای این شمارنده میتونید تنظیم کنید 0xFF هستش ( تنظیم مقادیر کمتر از 0xFF همون 0xFF در نظر گرفته میشن )
رجیستر WDFEED : نوشتن مقدار 0xAA و سپس 0x55 دراین رجیستر باعث میشه تایمر نگهبان با مقدار timeOut ذخیره شده در رجیستر WDTC شروع به کار بکنه، و همچین باعث ریست شدن شمارنده تایمر واچ داگ میشه ( اینطوری این کد رو در قسمت های مختلف پروژه قرار میدیم تا شمارنده تایمر نگهبان رو ریست کنه تا 24یی هی میکرو ریست نشه )
رجیستر WDTV : مقدار شمارنده فعلی تایمر نگهبان در این رجیستر ذخیره میشه. ( شمارش شمارنده تایمر واچ داگ از مقدار max یی که براش تعریف کردیم شروع به شمارش میکنه و وقتی 0 شد، وضعیت timeOut رخ میده )
the lock and synchronization procedure takes up to 6 WDCLK cycles plus 6 PCLK cycles, so the value of WDTV is older than the actual value of the timer when it’s being read by the CPU
رجیستر WDCLKSEL : انتخاب منبع کلاک تایمر نگهبان.
بیت 0 و 1 ( WDSEL ) : تعیین منبع کلاک تایمر نگهبان، مقدار 0=IRC، مقدار 1=PLCK، مقدار 2=RTC که IRC کلاک داخلی میکرو هستش، PLCK هم کلاک نهایی پریفرال ها ( میکرو ) هستش که معمولا ما رو 100 میگ تنظیمش میکنیم ( توضیح بیشتر در مطلب کلاک، که بعدا میزارم تو سایت )؛ IRC هم که مطلبشو قبلا گزاشتم میتویند برید مطالعه کنید ( کریستال 32.768 کیلو هرتز )
آموزش آرم میکروکنترلر lpc1768 جلسه ۱۲ rtc
آموزش پروژه محور آرم lpc1768 مبحث rtc
بیت 31 ( WDLOCK ) : قفل کردن تایمر نگهبان، با 1 کردن این بیت، دیگه نمیتونید منبع کلاک تایمر نگهبان رو تغییر بدید ( بیت های WDSEL رو نمیتونید تغییر بدید اون وقت ) مگر این که ریستی رخ بده تا این بیت پاک بشه، کاربر نمیتونه این بیت رو پاک ( 0 ) کنه.
توجه : تایمر واچ داگ، یک شمارنده 32 بیتی قابل برنامه ریزی ( مختص تایمر واچ داگ ) با تقسیم کننده داخلی 4 ( این مقدار غیر قابل تغییر است ) میباشد.
تعیین مد عملیاتی تایمر نگهبان :
همونطور که قبلا گفتم، ترکیب بیت WDEN و WDRESET از رجیستر WDMOD، مد تایمر نگهبان رو تعیین میکنن، انواع حالت مقدار این دو بیت رو در زیر مشاهده میکنید :
WDEN = 0, WDRESET = X : نفهمیدم کار این مد چیه.
WDEN = 1, WDRESET = 0 : مد وقفه تایمر نگهبان؛ در این مد بعد از سرریز شدن شمارنده تایمر نگهبان، فلگ WDINT یک میشه و درخواست رخ دادن وقفه واچ داگ ارسال میشه.
WDEN = 1, WDRESET = 1 : مد ریست تایمر نگهبان؛ در این مد بعد از سرریز شدن شمارنده تایمر نگهبان، میکروکنترلر ریست میشه، اگرچه وقفه تایمر نگهبان هم فعال میشه اما شناسایی نمیشه به دلیل این که ریست واچ داگ باعث پاک شدن فلگ WDINT میشه.
توجه : من فقط تونستم مد resert رو تست کنم و جواب بگیرم، دوتا مد دیگه رو نتونستم، کسی اگه تست کرده و جواب گرفته اعلام کنه لطفا.
آموزش مقدار دهی رجیستر WDTC بر اساس مقدار زمان دلخواه
خب الان میخوایم نحوه مقدار دهی شمارنده تایمر واچ داگ رو با هم ببینید، مثلا من میخوام تایمر واچ داگم به اندازه 100میلی ثانیه بشموره و بعد وضعیت TimeOut رخ بده، چطور باید این رجیستر رو مقدار دهی کنیم؟ در ادامه توضیح میدم :
در عکس بالا محدوده تناوب زمانی تایمر واچ داگ مشخص شده ( مثلا محدوده زمانی که تایمر واچ داگ میتونه تولید کنه بین 1 میلی ثانیه تا 10 ثانیه هستش – مثلا )، که فرمول 1 در دیتاشیت ذکر شده و فرمول 2 هم تقریبا همون فرمول 1 هستش ولی من ساده ( قابل فهم ) ترش کردم ( البته برا من یکی که ساده و قابل فهم تر شده، شما رو نمیدونم )؛ فرمول شماره 2 رو یکم توضیح بدم، محدوده زمانی که تایمر واچ داگ ( با کلاکی که براش تعیین کردم ) میتونه ایجاد کنه بین این محدوده مشخص شده در فرمول 2 قرار داره؛ که wdclk کلاک تایمر واچ داگ هستش؛ خب همونطور که در ادامه “رجیستر WDCLKSEL” رو میخونید، میبینید که یک divider ( تقسیم کننده کلاک ) با مقدار ثابت 4 داریم که هر منبع کلاکی که برای تایمر واچ داگ تعیین کنیم تقسیم بر 4 میشه و به عنوان منبع کلاک تایمر واچ داگ مورد استفاده قرار میگیره، خب همونطور که در بالا گفتم 3 تا منبع کلاک داریم :
1) IRC : مقداری که در دیتاشیت براش ذکر شده 4 میگ هستش، که تقسیم بر 4 بشه، کلاک تایمر واچ داگ میشه 1میگ.
2) PCLK : که معمولا روی مقدار حداکثر یعنی 100 میگ هستش و بعد از تقسیم بر 4 مقدارش میشه 25میگ، اما باید بر یک divider دیگر هم تقسیم بشه که توسط رجیستر PCLKSEL0 تعیین میکنیمش ( مقدار پیشفرض این divider هم 4 هستش که میتونید اینو تغییر بدید )، با فرض این که این divider رو 4 تنظیم کردیم،مقدار کلاک تایمر واچ داگ میشه 6.25میگ ( 25میگ رو بر 4 تقسیم میکنیم )
3) RTC : که کلاکش برابر 32.768 کیلو هستش که تقسیم بر 4 بشه میشه 8192 هرتز، لذا کلاک تایمر واچ داگ برابر 8192 هرتز میباشد.
خب حالا طبق توضیحات بالا و منبع کلاکی که انتخاب کردید، میاید مقدار کلاک تایمر واچ داگ رو در فرمول2 قرار میدیم محدوده زمانی به صورت زیر میشه ( محدوده زمانی مربوط به هر 3 منبع کلاک رو در زیر محاسبه کردم و قرار دادم – فقط پیش نیازش بلد بودن خط میخی هستش ^_^ – برای دیدن عکس در اندازه بزرگتر روش کلیک کنید) :
بلوک دیاگرام تایمر واچ داگ
کتابخونه این مطلب هم بمونه برا بعد، کتابخونش آماده هستش؛ تست هم شده، گزاشتنش داستان هایی داره که حس توضیحش نی، بمونه برای بعد.
=============
مهمان
سلام
فقط صفای آقا مهدی دمیرچی لو فدای جوانان انقلابی مثل آقا مهدی که با درج این فرمایش امام خمینی در خصوص آل سعود ملعون و در این زمان که خیلی از جوانان که با تاریخ معاصرو افتخارات کشور خود آشنا نیستند وتوسط بوقهای غربی مورد بمباران تبلیغی قرار گرفته اند وشستشوی مغزی روانی شده اند و مخالفت با هنجارهای دینی و ملی برای آنها مد شده با افتخار مسیر فرهنگی سایت خود را مشخص کرده،انشاالله در پناه خدا باشید.
با تشکر:کریم