ايران ويج

نسخه‌ی کامل: نیازمند به یک دستور در بسکام
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
یه برنامه برای سنسور رطوبت سنج دارم که وقتی سنسور رو قطع میکنم کل برنامه متوقف میشه که در نهایت منجر به از کار افتادی کل مدار میشه دلیلش هم بخاطر استفاده از دستور (BIT WAIT) هست .برنامه از این قرار هست که ؛؛ پینی که سنسور بهش متصل هست توسط دستور BIT WAIT چک میشه .حالا اگر سنسور رو قطع کنم دستور BIT پالسی دریافت نمیکنه بنابراین برنامه متوقف میشه .

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

اینم برنامه


کد:
Declare Sub Read_timings
Declare Sub Humtemp_values
Declare Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte


Do
Led = 1
Call Humtemp_values

If Compare_chksum(humidityw , Temperaturew , Humsens_chksum) = 1 Then

Humiditys = Str(humidityw)
Temperatures = Str(temperaturew)

Strstring = "H:" + Format(humiditys , "0.0" )
'Strstring = Humiditys
Locate 1 , 9
Lcd Strstring

Strstring = "T:" + Format(temperatures , "0.0")
'Strstring = Temperatures
Locate 2 , 9
Lcd Strstring

Else
Strstring = "***ERROR***"
Cls
Locate 1 , 7
Lcd Strstring
End If
Waitms 100
Led = 0
Wait 1
Loop
End


Sub Read_timings
   Count = 1
   Config Pind.4 = Output : Portd.4 = 0
   Waitms 20
   Config Pind.4 = Input
   While Count < 43
      Bitwait Pind.4 , Set
      Start Timer0
      Bitwait Pind.4 , Reset
      Stop Timer0
      Signaltime(count) = Tcnt0
      Tcnt0 = 0
      Incr Count

  Wend

End Sub

Sub Humtemp_values

   Local X As Byte

   Humidityw = 0
   Temperaturew = 0
   Humsens_chksum = 0

   Call Read_timings

   For Count = 3 To 42

      Select Case Count

         Case 3 To 18
            X = 18 - Count
            If Signaltime(count) > Min_time Then Toggle Humidityw.x

         Case 19 To 34
            X = 34 - Count
            If Signaltime(count) > Min_time Then Toggle Temperaturew.x

         Case 34 To 42
            X = 42 - Count
            If Signaltime(count) > Min_time Then Toggle Humsens_chksum.x

      End Select
  Next
End Sub


Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte

Local Chksum As Byte

Chksum = Low(hsens_humidity ) + High(hsens_humidity )
Chksum = Chksum + Low(hsens_temperature)
Chksum = Chksum + High(hsens_temperature)

If Chksum = Hsens_chksum Then
Compare_chksum = 1
Else
Compare_chksum = 0
End If

End Function
سلام

تا اونجایی من متوجه شدم برنامه میاد اینجا و منتظر میمونه تا پالس دریافت کنه و count رو اضافه کنه،
کد:
While Count < 43
      Bitwait Pind.4 , Set
      Start Timer0
      Bitwait Pind.4 , Reset
      Stop Timer0
      Signaltime(count) = Tcnt0
      Tcnt0 = 0
      Incr Count

  Wend
حالا اگه سنسور وصل نباشه پس پالسی نمیگیره و count افزایش نداره، در نتیجه توحلقه میمونه.

یه کاری که میشه کرد سخت افزاریه، شما بیاین همراه با سنسور یک از پایه های میکرو رو بعنوان ورودی تعریف کنید ، مثلاً اگه سنسور وصله اون پایه هم 1 هست و حالا وارد حلقه میشه، و اگر سنسور وصل نبود اون پایه هم 0 هست پس وارد حلقه نمیشه.lمثلاً pinb.3

کد:
While Count < 43 And pinb.3=1
      Bitwait Pind.4 , Set
      Start Timer0
      Bitwait Pind.4 , Reset
      Stop Timer0
      Signaltime(count) = Tcnt0
      Tcnt0 = 0
      Incr Count

  Wend
حالا باز دوستان میان بیشتر اطلاعات میدن...
سلام با دستور DEBOUNCE پایه رو چک کنین
البته از if هم می تونین استفاده کنین
آموزش هم توی سایت هست یکم بگردین پیدا می کنین
سلام دوست عزیز اگر از دستورات وقفه یا interupt استفاده کنی و سنسور رو به یکی از پین های میکرو با نام int0 یا int1 وصل کنی مشکلی که ذکر کردید بوجود نمی یاد چون در برنامه نویسی بر اساس وقفه برنامه کار خودشو انجام می ده وقتی وقفه ای رخ بده برنامه به توابعی که برای وقفه تعریف کردیم پرش می کنه وبعد از اتمام کار به همون نقطه قبلی برنامه بر می گرده
نقل قول: سلام دوست عزیز اگر از دستورات وقفه یا interupt استفاده کنی و سنسور رو به یکی از پین های میکرو با نام int0 یا int1 وصل کنی مشکلی که ذکر کردید بوجود نمی یاد چون در برنامه نویسی بر اساس وقفه برنامه کار خودشو انجام می ده وقتی وقفه ای رخ بده برنامه به توابعی که برای وقفه تعریف کردیم پرش می کنه وبعد از اتمام کار به همون نقطه قبلی برنامه بر می گرده
سلام
بدلیل اینکه از چند تا سنسور استفاده میکنم نمیتونم از interupt و پین های مربوطه استفاده کنم
نقل قول: سلام با دستور DEBOUNCE پایه رو چک کنین
البته از if هم می تونین استفاده کنین
آموزش هم توی سایت هست یکم بگردین پیدا می کنین
سلام
این دستور رو تست کردم جواب نداد ضمن اینکه باید کلیت برنامه هم تغییر داد .که حالشو ندارم .ممنون
بهترین دستور استفاده از if هست ورودی رو بخون و داخل متغیر بریز بعد با if چک کن ببین اونی که میخوای هست یا نه اگه بود ادامه برنامه اگه نبود بره اونجایی که میخوای
کد:
بهترین دستور استفاده از if هست ورودی رو بخون و داخل متغیر بریز بعد با if چک کن ببین اونی که میخوای هست یا نه اگه بود ادامه برنامه اگه نبود بره اونجایی که میخوای

سلام
من برنامه رو در اول تاپیک قرار دادم ممنون میشم همین نظرتون رو بهش اضافه کنید تا بهتر منظورتون رو متوجه بشیم .پیشاپیش از زحمات شما سپاسگذاری میکنم
کلا یه زمان تایم اوت باید بزارید
یعنی مثلا بین هر پالس حداکثر ۱ ثانیه ممکن هست وقفه بیفته حالا شما یه تایمر رو رو این زمان می زاری
به محض اینکه میخوای وضعیت یک پین رو چک کنی تایمر رو صفر و فعال می کنی حالا بجای بیت ویت از یه while استفاده می کنی توش هم یه If میزاری که اگه تایم اوت اتفاق افتاد کلا از زیر برنامه بیاد بیرون و مشکل شما حل میشه
اگه کلا دیگه نباید اون سنسور چک بشه که با یه متغییر غیر فعالش کنید اگه نه اگه همین جوری باید بمونه دیگه
ولی حواستون باشه اگه زمان تایم اوت زیاد باشه برنامه زیادی معطل میشه
سلام دوست گرامی
تا اونجایی که من تاپیک ها رو خوندم و از برنامه شما متوجه شدم ، قرار هست زمان بین یک(1) شدن تا صفر(0) شدن را اندازه گیری کنید .
خب این کار رو می تونی با دستور PULSEIN انجام بدی . هم می تونی زمان 1 و هم زمان صفر رو بسنجی
توضیح کاملش هم داخل help بسکام هست می تونی از اونجا یاد بگیری .

موفق باشی .....