اطلاعیه

Collapse
No announcement yet.

مشکل عمل نکردن watchdog

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل عمل نکردن watchdog

    با سلام
    من این کد ساده رو برای تست watchdog نوشتم ولی در شبیه سازی عمل نمیکنه:
    کد:
    #include <mega8.h>
    #include <delay.h>
    void main(void)
    {
    unsigned char i=1;
    WDTCR=(0<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
    while (1)
          {
          PORTB=i;
          i=i*2;
          delay_ms(500);
          }
    }
    با توجه به اینکه تایمر watchdog در برنامه ریست نشده،میکرو باید ریست بشه ولی نمیشه!
    آیا برنامه مشکل داره؟

    #2
    پاسخ : مشکل عمل نکردن watchdog

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

    دیدگاه


      #3
      پاسخ : مشکل عمل نکردن watchdog

      سلام
      بله همان طور که دوستمون گفتن شبیه ساز های دیجیتال بعضی اوقات برخی از توابع رو به درستی اجرا نمیکنن، شما بهتره که مدار رو به صورت عملی ببندید. یه نکته هم که شاید خالی از لطف نباشه اینه قبل از ریست کردن Watchdog باید اونو فعال بکنی و صرفا با دستور ریست watchdog شروع به کار نمیکنه.

      دیدگاه


        #4
        پاسخ : مشکل عمل نکردن watchdog

        سلام
        شبه کد زیر رو امتحان کن:


        #define WATCH_DOG_ON() WDTCR=(1<<WDE)|(1<<WDP1)|(1<<WDP0)

        int main()
        {
        delay_ms(1000);
        //turn on an LED
        delay_ms(500);
        WATCH_DOG_ON();

        while(1);
        return 0;
        }


        اگر LED چشمک زن شد یعنی واچ داگ داره کار میکنه...
        تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

        www.intelart.ir


        ساخت کنترلر دما PID فازي با AVR [آموزشی]

        دیدگاه


          #5
          پاسخ : مشکل عمل نکردن watchdog

          نوشته اصلی توسط Sarhadi نمایش پست ها
          سلام
          بله همان طور که دوستمون گفتن شبیه ساز های دیجیتال بعضی اوقات برخی از توابع رو به درستی اجرا نمیکنن، شما بهتره که مدار رو به صورت عملی ببندید. یه نکته هم که شاید خالی از لطف نباشه اینه قبل از ریست کردن Watchdog باید اونو فعال بکنی و صرفا با دستور ریست watchdog شروع به کار نمیکنه.
          به صورت عملی هم تست کردم جواب نداد

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          اگر کسی از دوستان از watchdog جواب گرفته لطفا کد و فایل هگز رو لطف کنن بذارن تا منم تست کنم
          با تشکر

          دیدگاه


            #6
            پاسخ : مشکل عمل نکردن watchdog

            نوشته اصلی توسط Mahdi.Faani نمایش پست ها
            سلام
            شبه کد زیر رو امتحان کن:


            #define WATCH_DOG_ON() WDTCR=(1<<WDE)|(1<<WDP1)|(1<<WDP0)

            int main()
            {
            delay_ms(1000);
            //turn on an LED
            delay_ms(500);
            WATCH_DOG_ON();

            while(1);
            return 0;
            }


            اگر LED چشمک زن شد یعنی واچ داگ داره کار میکنه...
            مهندس کد شمارو به اینصورت نوشتم:
            کد:
            #include <mega8.h>
            #include <delay.h>
            
            void main(void){
            DDRB=0xff;
            PORTB=0x00;
            delay_ms(200);
            PORTB=0xff;
            delay_ms(200);
            WDTCR=0x08;
            while(1);
            }
            در شبیه سازی فقط در حالتی کار میکنه که مقدار WDTCR=0x08 باشه و در باقی حالات اصلا کار نمیکنه(چشمک نمیزنه)
            در عملی هم که در تمامی حالات رجیستر WDTCR زمان ریست شدن یکی هست،یعنی در حالتی که WDTCR=0x08 هست با حالتی که
            WDTCR=0x0f هست زمان ریست شدن یکیه(ریتم چشمک زدن فرقی نمیکنه)

            دیدگاه


              #7
              پاسخ : مشکل عمل نکردن watchdog

              واسه فعال سازی watchdog ازین کد استفاده کن جای کد خودت

              // Watchdog Timer initialization
              // Watchdog Timer Prescaler: OSC/1024k
              #pragma optsize-
              WDTCR=(1<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (0<<WDP0);
              WDTCR=(0<<WDCE) | (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (0<<WDP0);
              #ifdef _OPTIMIZE_SIZE_
              #pragma optsize+
              #endif
              جدیدترین ویرایش توسط kinortechla; ۱۸:۰۹ ۱۳۹۵/۰۴/۱۵.

              دیدگاه


                #8
                پاسخ : مشکل عمل نکردن watchdog

                ممنون از همگی مشکل حل شد.باید به این صورت باشه
                کد:
                #include <mega8.h>
                #include <delay.h>
                
                void main(void){
                DDRB=0xff;
                PORTB=0x00;
                delay_ms(200);
                PORTB=0xff;
                delay_ms(200);
                
                WDTCR=0x1f;
                WDTCR=0x0f;
                
                
                while(1)
                }
                یعنی حتما باید اول بیت WDCE از رجیستر WDTCR یک بشه و بعد صفر بشه تا watchdog درست عمل کنه.
                هم در شبیه سازی و هم عملی مشکل حل شد.

                دیدگاه


                  #9
                  پاسخ : مشکل عمل نکردن watchdog

                  نوشته اصلی توسط abolfazles نمایش پست ها
                  ممنون از همگی مشکل حل شد.باید به این صورت باشه
                  کد:
                  #include <mega8.h>
                  #include <delay.h>
                  
                  void main(void){
                  DDRB=0xff;
                  PORTB=0x00;
                  delay_ms(200);
                  PORTB=0xff;
                  delay_ms(200);
                  
                  WDTCR=0x1f;
                  WDTCR=0x0f;
                  
                  
                  while(1)
                  }
                  یعنی حتما باید اول بیت WDCE از رجیستر WDTCR یک بشه و بعد صفر بشه تا watchdog درست عمل کنه.
                  هم در شبیه سازی و هم عملی مشکل حل شد.
                  اون کد که گذاشتم همیشه جواب داده و مشکلی نداشته...این روندی هم که فرمودید برای غیرفعال کردن واچ داگ استفاده میشه نه فعال کردنش!

                  دلیل: ادغام دو پست برای جلوگیری از اسپم

                  در عملی هم که در تمامی حالات رجیستر WDTCR زمان ریست شدن یکی هست،یعنی در حالتی که WDTCR=0x08 هست با حالتی که
                  WDTCR=0x0f هست زمان ریست شدن یکیه(ریتم چشمک زدن فرقی نمیکنه)
                  یعنی زمان روشن ماندن LED هیچ تغییری نمیکنه؟چیز خاصی نداره که بگیم از قلم افتاده...خودم اینو قبلا بارها و بارها تست کردم و هیچ مشکلی هم نبوده...اگه میکرو دیگه در دسترس دارید امتحان کنید
                  تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                  www.intelart.ir


                  ساخت کنترلر دما PID فازي با AVR [آموزشی]

                  دیدگاه


                    #10
                    پاسخ : مشکل عمل نکردن watchdog

                    الان اینو شبیه سازی کردم....
                    ببینید نتیجه رو:
                    #include <mega8.h>
                    #include <delay.h>

                    void main(void){
                    DDRB=0xff;
                    PORTB=0x00;
                    delay_ms(200);
                    PORTB=0xff;
                    delay_ms(200);
                    WDTCR=0x08;
                    while(1);
                    }





                    با تغییر جدید:

                    #include <mega8.h>
                    #include <delay.h>

                    void main(void){
                    DDRB=0xff;
                    PORTB=0x00;
                    delay_ms(200);
                    PORTB=0xff;
                    delay_ms(200);
                    WDTCR=0x0f;
                    while(1);
                    }




                    همونطور که میبینید مدت زمان روشن موندن LED تغییر مکینه و در تصویر آخر همون 2.2ثانیه شده...
                    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                    www.intelart.ir


                    ساخت کنترلر دما PID فازي با AVR [آموزشی]

                    دیدگاه


                      #11
                      پاسخ : مشکل عمل نکردن watchdog

                      برنامه اولتون مشکلش این بود که داخل وایل دیلی گذاشته بودید. تابع دیلی واچ داگ رو ریست میکنه.
                      موفق باشید
                      www.gam-co.blogsky.com

                      دیدگاه

                      لطفا صبر کنید...
                      X