اطلاعیه

Collapse
No announcement yet.

مشکل با رجیستر Watchdog

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

    مشکل با رجیستر Watchdog

    سلام دوستان
    همینطور که میدونید وقتی که تایمر Watchdog عمل میکنه و میکرو ریست میشه ، یک بیت جهت آشکار سازی ریست ناشی از Watchdog ست میشه که میتونیم اونو تا قبل از اینکه دوباره تایمر رو Config کنیم آشکار سازی کنیم .
    این بیت به گفته کاتالوگ MCUCSR – WDRF و توی مثال بسکام Mcusr.wdrf نام داره ولی من نتونستم ازش جواب بگیرم .
    یعنی بلافاصله بعد از ریست شدن میکرو اونو میخونم که از دست نره ولی همیشه مقدارش صفره .
    کسی تا حالا از این بیت توی بسکام جواب گرفته ؟
    مدل میکرو Mega32A
    سخت است حرفت را نفهمند،

    سخت تر اين است که حرفت را اشتباهي بفهمند

    #2
    پاسخ : مشکل با رجیستر Watchdog

    کسی از اساتید مستونه کمک کنه ؟
    کسی تا حالا با این رجیستر کار کرده ؟
    سخت است حرفت را نفهمند،

    سخت تر اين است که حرفت را اشتباهي بفهمند

    دیدگاه


      #3
      پاسخ : مشکل با رجیستر Watchdog

      با سلام



      پس به نظرم باید اولین کاری که توی بردار ریست و قبل از پرش به روتبن اصلی برنامه انجام میشه خوندن این فلگ باشه وگرنه یک شدندش رو از دست میدید
      به خاطر همین شاید با بسکام نشه اونو تشخیص داد چون احتمالا خوندن فلگ توی روتین اصلی انجام میشه و لذا یک شدنش از دست میدید چرا که شاید قبل از پرش به روتین اصلی یسری کارای احتمالی دیگه انجام میشه البته من فقط حدس میزنم چون دقیقا نمیدونم خروجی بسکام چیه!

      دیدگاه


        #4
        پاسخ : مشکل با رجیستر Watchdog

        فکر میکنید میشه قبل از اینکه مدل میکرو را تعریف کنیم این رجیستر رو بخونیم ؟
        یه مثال خود بسکام داره که این بیت رو بعد از ریستارت میخونه و خیلی هم درگیر اول برنامه نوشتن نمیشه .
        ولی خوب اونم کار نمیکنه !!!!
        سخت است حرفت را نفهمند،

        سخت تر اين است که حرفت را اشتباهي بفهمند

        دیدگاه


          #5
          پاسخ : مشکل با رجیستر Watchdog

          نوشته اصلی توسط dr_mnf
          فکر میکنید میشه قبل از اینکه مدل میکرو را تعریف کنیم این رجیستر رو بخونیم ؟
          تا اونجا که من میدونم توی سی این فقط یک دستور پیش پردازشی که فایل سرایندی که شامل اسم رجیسترهای مربوط به میکرو مورد نظر هست رو به برنامه الصاق میکنه تا کامپایلر بتونه با استفاده از اون برنامه رو کامپایل کنه از این رو جزو دستورات برنامه بحساب نمیاد که بخواهیم دستوری رو قبل اش بنویسیم یا ننویسیم که فکر میکنم میشه همین موضوع رو هم به بسکام تعمیم داد

          یه مثال خود بسکام داره که این بیت رو بعد از ریستارت میخونه و خیلی هم درگیر اول برنامه نوشتن نمیشه .
          ولی خوب اونم کار نمیکنه !!!!
          خوب این مثالی که میگید شاید یه شرایطی داره تا درست اجرا بشه اگه میشه بزاریدش تا یه بررسی با هم داشته باشیم.

          دیدگاه


            #6
            پاسخ : مشکل با رجیستر Watchdog

            اینم نمونه برنامه از خود بسکام

            '-----------------------------------------------------------------------------------------

            'name : watchd.bas

            'copyright : (c) 1995-2008, MCS Electronics

            'purpose : demonstrates the watchdog timer

            'micro : Mega88

            'suited for demo : yes

            'commercial addon needed : no

            '-----------------------------------------------------------------------------------------



            $regfile = "m88def.dat" ' specify the used micro

            $crystal = 8000000 ' used crystal frequency

            $baud = 19200 ' use baud rate

            $hwstack = 32 ' default use 32 for the hardware stack

            $swstack = 32 ' default use 32 for the SW stack

            $framesize = 40 ' default use 40 for the frame space

            Dim B As Byte

            Dim Wdbit As Bit



            Print "Watchdog test"

            If Mcusr.wdrf = 1 Then ' there was a WD overflow

            Wdbit = 1 'store the flag

            End If



            Config Watchdog = 2048 'reset after 2048 mSec

            If Wdbit = 1 Then 'just print it now since it is important that CONFIG WATCHDOG runs early as possible

            Print "Micro was reset by Watchdog overflow"

            End If



            Start Watchdog 'start the watchdog timer

            Dim I As Word

            For I = 1 To 1000

            Waitms 100

            Print I 'print value

            B = Inkey() ' get a key from the serial port

            If B = 65 Then 'letter A pressed

            Stop Watchdog ' test if the WD will stop

            Elseif B = 66 Then 'letter B pressed

            Config Watchdog = 4096 'reconfig to 4 sec

            Start Watchdog 'CONFIG WATCHDOG will disable the WD so start it

            Elseif B = 67 Then 'C pressed

            Config Watchdog = 8192 ' some have 8 sec timer

            'observe that the WD timer is OFF

            Elseif B = 68 Then 'D pressed

            Start Watchdog ' start it

            End If

            'Reset Watchdog

            'you will notice that the for next doesnt finish because of the reset

            'when you unmark the RESET WATCHDOG statement it will finish because the

            'wd-timer is reset before it reaches 2048 msec

            'When you press 'A' you will see that the WD will stop

            'When you press 'B' you will see that the WD will time out after 4 Sec

            'When you press 'C' you will see the WD will stop

            'When you press 'D' you will see the WD will start again timing out after 8 secs

            Next

            End



            And this shows how to read the register r0:

            Dim Breset As Byte

            Breset = Peek(0)

            When you show this value on an LCD display you will see a value of 7 the first time, and later a value of 15 when the WD reset occured.
            سخت است حرفت را نفهمند،

            سخت تر اين است که حرفت را اشتباهي بفهمند

            دیدگاه


              #7
              پاسخ : مشکل با رجیستر Watchdog

              احتمالا زمان اجرای دستور پرینت بقدری زیاد هست که دیگه مجالی برای تشخیص اینکه wdrf یک شده نمی مونه
              آخه اگه بگیم ارسال هر کاراکتر با توجه به بود ریت حدود 521 میکرو ثانیه صرف نظر از زمان لازم برای اجرای بقیه روتین نوشتن طول بکشه اینجا 13 تا کاراکتر داریم میشه حدود 6.78 میلی ثانیه که با توجه به فرکانس کار میکرو میشه معادل 54240 کلاک ساعت به نظرم دیگه بعد از این زمان wdrf صفر شده ، این مسئله رو چک کردید ؟

              دیدگاه


                #8
                پاسخ : مشکل با رجیستر Watchdog

                آره چک کردم .
                توی برنامه خودم اومدم اول میکرو رو تعریف کردم وبلافاصله یه متغییر تعریف کردم و رجیستر Mcusr.wdrf رو درونش ذخیره کردم و بعدش رفتم سراغ تعریف Boud و دیگر چیزا .
                فکر نمیکنم اینجوری 10تا سیکل هم زمان ببره . ولی بازم بیفایده بود و همیشه صفر نشون میده !!
                اونجوری هم که فهمیدم این بیت تغییر نمیکنه تا وقتی که مجددا Config Watchdog کنی !!
                سخت است حرفت را نفهمند،

                سخت تر اين است که حرفت را اشتباهي بفهمند

                دیدگاه

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