اطلاعیه

Collapse
No announcement yet.

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

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

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

    با سلام خدمت مهندسین
    من یک پروژه دارم که با ال سی دی گرافیکی دما و رطوبت را نشان می دهد طرز کار مدار بنده به گونه ای است در یک loop جداگانه ای دما و در یک loop دیگر رطوبت که با تایمر فعال شده را نشان می دهد. زمانی که برنامه وارد بخش رطوبت می شود در چند لحظه اول ال سی دی به درستی کار می کند ولی بعد از مدتی صفحه نمایشگر به هم ریخته و قاطی می کند که مجبور به قطع برق دستگاه می شوم.
    خواستم از watchdog استفاده کنم ولی بعد از ریست شدن میکرو برنامه به حالت اول خود باز می گردد که در آن دما نشان و دیگر مقدار رطوبت در آن وجود ندارد در حالی که با فشردن یک کلید برنامه وارد loop مخصوص رطوبت می شود.
    خواستم بدونم که آیا راهی است در یک loop جداگانه بدون آنکه میکرو به طور کلی ریست شود در همان loop بماند یا اینکه یک شرطی قرار دهیم که اگر میکرو ریست شد مستقیماً وارد همان loop شود و به اول برنامه باز نگردد؟
    با تشکر

    #2
    پاسخ : مشکل استفاده از watchdog میکرو در یک loop جداگانه

    نوشته اصلی توسط javad jtag
    با سلام خدمت مهندسین
    من یک پروژه دارم که با ال سی دی گرافیکی دما و رطوبت را نشان می دهد طرز کار مدار بنده به گونه ای است در یک loop جداگانه ای دما و در یک loop دیگر رطوبت که با تایمر فعال شده را نشان می دهد. زمانی که برنامه وارد بخش رطوبت می شود در چند لحظه اول ال سی دی به درستی کار می کند ولی بعد از مدتی صفحه نمایشگر به هم ریخته و قاطی می کند که مجبور به قطع برق دستگاه می شوم.
    خواستم از watchdog استفاده کنم ولی بعد از ریست شدن میکرو برنامه به حالت اول خود باز می گردد که در آن دما نشان و دیگر مقدار رطوبت در آن وجود ندارد در حالی که با فشردن یک کلید برنامه وارد loop مخصوص رطوبت می شود.
    خواستم بدونم که آیا راهی است در یک loop جداگانه بدون آنکه میکرو به طور کلی ریست شود در همان loop بماند یا اینکه یک شرطی قرار دهیم که اگر میکرو ریست شد مستقیماً وارد همان loop شود و به اول برنامه باز نگردد؟
    با تشکر
    خوب کد برنامه را قرار نداده اید و نیز ذکر نکرده اید که برای ارتباط با سنسور رطوبت از چه پروتکلی استفاده می کنید.
    اما در هر صورت به عنوان یک تشخیص افتراقی فکر می کنم که مشکل از منطق برنامه است، لذا می توانید مثلا از این راه حل ابتدائی استفاده کنید:

    با ورود به حلقه دوم جهت خواندن مقدار رطوبت، یک تایمر دیگر فعال شود و اگر بعد از گذشت زمان مشخصی، قرائت پارامتر مربوطه از سنسور به درستی انجام نشد، ضمن Reset کردن Watchdog، برنامه بتواند بدون هنگ کردن، با موفقیت از Loop خارج شده، صفحه را پاک کند و عبارت RH Sensor Failed را نمایش دهد.

    دیدگاه


      #3
      پاسخ : مشکل استفاده از watchdog میکرو در یک loop جداگانه

      نوشته اصلی توسط مهندس نوآور
      خوب کد برنامه را قرار نداده اید و نیز ذکر نکرده اید که برای ارتباط با سنسور رطوبت از چه پروتکلی استفاده می کنید.
      اما در هر صورت به عنوان یک تشخیص افتراقی فکر می کنم که مشکل از منطق برنامه است، لذا می توانید مثلا از این راه حل ابتدائی استفاده کنید:

      با ورود به حلقه دوم جهت خواندن مقدار رطوبت، یک تایمر دیگر فعال شود و اگر بعد از گذشت زمان مشخصی، قرائت پارامتر مربوطه از سنسور به درستی انجام نشد، ضمن Reset کردن Watchdog، برنامه بتواند بدون هنگ کردن، با موفقیت از Loop خارج شده، صفحه را پاک کند و عبارت RH Sensor Failed را نمایش دهد.
      خیلی ممنون
      نمی تونم از تایمر دیگری استفاده کنم برنامه من بیش از 2 تا loop است . از رطوبت سنج hs1101 استفاده می کنم همچنین نمی خوام از loop خارج بشم و زمان ماندن در loop بیش از 10 روز باید باشد
      اینم برنامه
      کد:
      Submain:
      Do
      Lcdat 1 , 4 , "welcome"
      Waitms 500
      If Pinc.0 = 1 Then Goto F1
      Loop
      End
      
      Omid:
      Config Timer1 = Counter , Edge = Rising
      Config Timer0 = Timer , Prescale = 1024
      Enable Interrupts
      Enable Timer0
      Enable Timer1
      On Ovf1 Pulsecount
      On Ovf0 Lable
      Start Timer0
      Return
      Lable:
      Incr C
      If C > 30 Then
      Stop Timer0
      M = -7587.2
      A = B * 65536
      A = A + Counter1
      A = A - 110
      U = A - 7351
      U = U * M
      U = U / 100000
      S11 = ":" + Te_bozorg + Be_koochak + Vav + Taa + Re
      Lcdat 1 , 79 , S11
      Lcdat 1 , 1 , "  %" ; U
      Lcdat 1 , 57 , "  "
      B = 0
      C = 0
      Counter1 = 0
      Start Timer0
      End If
      Return
      Pulsecount:
      Incr B : Counter1 = 0
      Return
      
      F1:
      Cls Graph
      Waitms 100
      S11 = ":" + He_koochak + Daal + Noon_koochak + Alef_chasbaan + Mim_koochak + Ye_bozorg + Alef_chasbaan + He_chasbaan_avval + Ze + Vav + Re
      Lcdat 4 , 32 , S11
      Lcdat 4 , 2 , "21"
      Set Portb.7
      Waitms 700
      Reset Portb.7
      Goto F11
      
      F11:
      Gosub Omid
      1wreset
       If Err = 1 Then
       Lcdat 1 , 1 , ""                     '
       Else
      1wwrite &HCC
      1wwrite &H44
      Waitms 100
      1wreset
      1wwrite &HCC
      1wwrite &HBE
      
      I1 = 1wread()
      I2 = 1wread()
      I = Makeint(i1 , I2)
      Temp = I / 16
      S11 = ":" + Alef_chasbaan + Mim_koochak + Daal
      Lcdat 2 , 95 , S11
      Lcdat 2 , 35 , Temp
      Lcdat 2 , 65 , "  "
      S11 = He_koochak + Jim_koochak + Re + Daal
      Lcdat 2 , 1 , S11
      If Temp < 30.5 Then
      Set Portb.3
      End If
      If Temp > 32 Then
      Reset Portb.3
      End If
      If Temp >= 32.5 Then
      Set Portb.4
      Else
      Reset Portb.4
      End If
      If Temp <= 30 Then
      Set Portd.5
      Else
      Reset Portd.5
      End If
      End If
      '***********************************
      If U < 50 Then
      Set Portb.2
      End If
      If U > 70 Then
      Reset Portb.2
      End If
      '***********************************
      Goto F11
      
      F2:
      Cls Graph
      Reset Portb.7
      Goto F22
      F22:
      Gosub Omid
      1wreset
       If Err = 1 Then
       Lcdat 1 , 1 , ""                     '
       Else
      1wwrite &HCC
      1wwrite &H44
      Waitms 100
      1wreset
      1wwrite &HCC
      1wwrite &HBE
      
      I1 = 1wread()
      I2 = 1wread()
      I = Makeint(i1 , I2)
      Temp = I / 16
      S11 = ":" + Alef_chasbaan + Mim_koochak + Daal
      Lcdat 2 , 95 , S11
      Lcdat 2 , 35 , Temp
      Lcdat 2 , 65 , "  "
      S11 = He_koochak + Jim_koochak + Re + Daal
      Lcdat 2 , 1 , S11
      If Temp < 30.5 Then
      Set Portb.3
      End If
      If Temp > 32 Then
      Reset Portb.3
      End If
      If Temp >= 32.5 Then
      Set Portb.4
      Else
      Reset Portb.4
      End If
      If Temp <= 30 Then
      Set Portd.5
      Else
      Reset Portd.5
      End If
      '***********************************
      If U < 50 Then
      Set Portb.2
      End If
      If U > 70 Then
      Reset Portb.2
      End If
      '***********************************
      End If
      Goto F22
      به فرض در loop مثلا F11 قرار می گیرد بعد مدت 2 تا 3 دقیقه ال سی دی قاطی می کند ولی زمانی که دستور GOSUB OMID را بر می دارم مشکلی ندارم
      فقط خواستم Watchdog در loop مربوط به فرضا F11 میکرو هر چند ثانیه یک بار ریست نرم افزاری شود تا اینکه ال سی دی هنگ نکند. و بعد ریست با Watchdog به اول برنامه که نمایش ابتدایی پروژه است بر نگردد.

      دیدگاه

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