আপনি অবশ্যই পারেন। ডেটাশিট অনুসারে, ওয়াচডোগ টাইমারটি এমসইউটিকে পুনরায় সেট করতে সেট করতে পারে বা ট্রিগার হওয়ার সাথে সাথে কোনও বাধা সৃষ্টি করতে পারে। দেখে মনে হচ্ছে আপনি বাধাপ্রাপ্ত সম্ভাবনার পক্ষে আরও আগ্রহী।
ডাব্লুডিসিটি সাধারণ টাইমারের চেয়ে সেটআপ করা ঠিক একই কারণে এটি কার্যকর হিসাবে কার্যকর: কম বিকল্প options এটি অভ্যন্তরীণভাবে ক্যালিব্রেটেড 128kHz ঘড়িতে চালিত হয় যার অর্থ এটির সময়টি এমসইউর মূল ঘড়ির গতি দ্বারা প্রভাবিত হয় না। এটি জাগ্রত উত্স সরবরাহ করতে গভীর ঘুমের মোডের সময় চলতেও পারে।
আমি বেশ কয়েকটি ডেটাশিটের উদাহরণ এবং পাশাপাশি কিছু কোড ব্যবহার করেছি (সি তে)।
অন্তর্ভুক্ত ফাইল এবং সংজ্ঞা
শুরু করার জন্য, আপনি সম্ভবত জিনিসগুলি কাজ করার জন্য নিম্নলিখিত দুটি শিরোনাম ফাইল অন্তর্ভুক্ত করতে চাইবেন:
#include <avr/wdt.h> // Supplied Watch Dog Timer Macros
#include <avr/sleep.h> // Supplied AVR Sleep Macros
এছাড়াও, আমি ম্যাক্রো <_BV (বিআইটি)> ব্যবহার করি যা নীচের হিসাবে মানক AVR শিরোনামগুলির মধ্যে একটিতে সংজ্ঞায়িত হয়েছে (যা আপনার পক্ষে আরও পারিবারিক হতে পারে):
#define _BV(BIT) (1<<BIT)
কোডের সূচনা
যখন এমসিইউ প্রথম শুরু করা হয়, আপনি সাধারণত I / O শুরু করতে পারেন, টাইমার সেট আপ করুন ইত্যাদি কোথাও কোথাও ডাব্লুডিটি পুনরায় সেট করার কারণ হয়নি তা নিশ্চিত করার জন্য এটি ভাল সময় কারণ এটি আপনার প্রোগ্রামকে সামনে রেখে পুনরায় কাজ করতে পারে, একটি অস্থির লুপ
if(MCUSR & _BV(WDRF)){ // If a reset was caused by the Watchdog Timer...
MCUSR &= ~_BV(WDRF); // Clear the WDT reset flag
WDTCSR |= (_BV(WDCE) | _BV(WDE)); // Enable the WD Change Bit
WDTCSR = 0x00; // Disable the WDT
}
ডাব্লুডিটি সেটআপ
তারপরে, আপনি বাকি চিপটি সেটআপ করার পরে, ডাব্লুডিটি আবার করুন। ডাব্লুডিটি সেট আপ করার জন্য "সময়সীমাবদ্ধ ক্রম" দরকার তবে এটি করা সত্যিই সহজ ...
// Set up Watch Dog Timer for Inactivity
WDTCSR |= (_BV(WDCE) | _BV(WDE)); // Enable the WD Change Bit
WDTCSR = _BV(WDIE) | // Enable WDT Interrupt
_BV(WDP2) | _BV(WDP1); // Set Timeout to ~1 seconds
অবশ্যই, আপনার বাধা এই কোডের সময় অক্ষম করা উচিত। পরে এগুলি পুনরায় সক্ষম করতে ভুলবেন না!
cli(); // Disable the Interrupts
sei(); // Enable the Interrupts
ডাব্লুডিটি বিঘ্নিত পরিষেবার রুটিন
সম্পর্কে চিন্তার পরবর্তী বিষয় হ'ল ডাব্লুডিটি আইএসআর পরিচালনা করা R এটি যেমন করা হয়:
ISR(WDT_vect)
{
sleep_disable(); // Disable Sleep on Wakeup
// Your code goes here...
// Whatever needs to happen every 1 second
sleep_enable(); // Enable Sleep Mode
}
MCU ঘুম
ডাব্লুডিটি আইএসআরের অভ্যন্তরে এমসিইউ রাখার পরিবর্তে, আমি আইএসআর শেষে কেবল স্লিপ মোডটি সক্রিয় করার পরামর্শ দিই, তারপরে MAIN প্রোগ্রামটি MCU কে ঘুমাতে দেবে। এইভাবে, প্রোগ্রামটি আসলে ঘুমানোর আগে আইএসআর ছেড়ে চলেছে, এবং এটি জেগে উঠবে এবং সরাসরি ডাব্লুডিটি আইএসআরে ফিরে যাবে।
// Enable Sleep Mode for Power Down
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep Mode: Power Down
sleep_enable(); // Enable Sleep Mode
sei(); // Enable Interrupts
/****************************
* Enter Main Program Loop *
****************************/
for(;;)
{
if (MCUCR & _BV(SE)){ // If Sleep is Enabled...
cli(); // Disable Interrupts
sleep_bod_disable(); // Disable BOD
sei(); // Enable Interrupts
sleep_cpu(); // Go to Sleep
/****************************
* Sleep Until WDT Times Out
* -> Go to WDT ISR
****************************/
}
}