اطلاعیه

Collapse
No announcement yet.

راهنمایی کوچک واسه حل یه مشکل تو بسکام

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

    راهنمایی کوچک واسه حل یه مشکل تو بسکام

    با سلام خدمت همه ی بزرگواران عزیز
    بنده در حال یادگیری هستم ببخشید اگه سوالم خیلی ابتدایی هست
    من یه برنامه ای نوشتم که با برقرار شدن یک IF مثلا pind.0=1 به زیر برنامه پرش میکنه من میخوام یه شرط دومی بزارم که با برقرار شدن اون مثلا pind.1=1 بلافاصله از زیر برنامه شرط اول خارج بشم اما برنامه تا وقتی که تمامی خط هاش اجرا نشده از شرط خارج نمیشه ممنون میشم راهنماییم کنین که چیکار باید بکنم
    باسپاس
    کد:
    If Pind.0 = 1 Then
    Goto A
    End If
    Loop
    End
    
    A:
    Do
    Portb = &B10000000
    Waitms 600
    Portb = &B10000001
    Wait 10
    Portb = &B00000001
    Waitms 600
    Portb = &B00000000
    Wait 15
    Portb = &B10000000
    Waitms 600
    Portb = &B10000010
    Wait 10
    Portb = &B00000010
    Waitms 600
    Portb = &B00000000
    Wait 15
    Portb = &B10000000
    Waitms 600
    Portb = &B10000100
    Wait 10
    Portb = &B00000100
    Waitms 600
    Portb = &B00000000
    Wait 15
    Loop
    End

    #2
    پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

    چند راه داره
    یکی از راهها گذاشتن این دستور بعد از همه ی wait ها است
    if portd.1=1 then exit do

    موفق باشید

    دیدگاه


      #3
      پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

      نوشته اصلی توسط alirazmjoo
      چند راه داره
      یکی از راهها گذاشتن این دستور بعد از همه ی wait ها است
      if portd.1=1 then exit do

      موفق باشید
      دوست عزیز ممنونم از راهنماییت به جز این روش چه کار دیگه ای میتونم بکنم؟
      چون احتمالا تعداد wait ها شاید زیاد بشه در اینصورت یکم سخته واسه همشون این دستور بزارم
      بازم ممنونم از راهنماییت

      دیدگاه


        #4
        پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

        از دستور زیر هم میشه:

        WHILE portd.0=1

        برنامه ات رو که میخوای انجام بشه

        WEND


        موفق باشید :nice:

        دیدگاه


          #5
          پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

          نوشته اصلی توسط alirazmjoo
          از دستور زیر هم میشه:

          WHILE portd.0=1

          برنامه ات رو که میخوای انجام بشه

          WEND


          موفق باشید :nice:
          یعنی اگه تو این دستور pind.0=0بشه از حلقه خارج میشه؟ :read:

          دیدگاه


            #6
            پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

            آره

            دیدگاه


              #7
              پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

              نوشته اصلی توسط alirazmjoo
              آره
              :cry:
              امتحان کردم اینجوری فقط شرط حلقه برقرار میشه وقتی وارد حلقه میشه دیگه بیرون نمیاد فکر کنم چاره ای نیست باید از همون راه حل اول استفاده کنم به هر حال ممنونم ازتون :agree:

              دیدگاه


                #8
                پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                while-wend :
                یک حلقه است ولی قبلش یه شرط بررسی میشه اگه برقرار بود وارد حلقه میشه و تا وفتی که این شرط برقرار باشه دستورات این حلقه اجرا میشن
                شما بعد از wend دستوری رو باید بذارید که وقتی از شرط برقرار نبود اون اجرا شه
                do-loop رو دیگه نذارین

                دیدگاه


                  #9
                  پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                  شما میگین به این صورت عمل کنم؟
                  کد:
                  while pind.0=1
                  Portb = &B10000000
                  Waitms 600
                  Portb = &B10000001
                  Wait 10
                  Portb = &B00000001
                  Waitms 600
                  Portb = &B00000000
                  Wait 15
                  Portb = &B10000000
                  Waitms 600
                  Portb = &B10000010
                  Wait 10
                  Portb = &B00000010
                  Waitms 600
                  Portb = &B00000000
                  Wait 15
                  Portb = &B10000000
                  Waitms 600
                  Portb = &B10000100
                  Wait 10
                  Portb = &B00000100
                  Waitms 600
                  Portb = &B00000000
                  Wait 15
                  End
                  wend 
                  portb=&b00000000
                  اگه اینجوره خب من امتحان کردم نشد
                  :sad:

                  دیدگاه


                    #10
                    پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                    دوستان ممنون میشم راهنمایی کنین یعنی راهی نیست به جز گذاشتن if بعد از wait ها ؟

                    دیدگاه


                      #11
                      پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                      کاری که شما میخواید بکنید شبیه کار وقفه خارجی هست .یعنی پایه مورد نظر همیشه چک میشه واگر مثلا 1 یا صفر بشه (بستگی داره چطور وقفه رو تعریف کردیم ) برنامه رو همونجا که هست رها میکنه وبه زیر برنامه وقفه پاسخ میده وبعدا برمیگرده به ادامه برنامه
                      معلوليت محدوديت نيست

                      آنکس که عاجز از خلق لحظه هاست، معلول است. نه من...روح بلند آدمیت فراتر از هر معلولیتی است.

                      دیدگاه


                        #12
                        پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                        نوشته اصلی توسط mahdi210
                        کاری که شما میخواید بکنید شبیه کار وقفه خارجی هست .یعنی پایه مورد نظر همیشه چک میشه واگر مثلا 1 یا صفر بشه (بستگی داره چطور وقفه رو تعریف کردیم ) برنامه رو همونجا که هست رها میکنه وبه زیر برنامه وقفه پاسخ میده وبعدا برمیگرده به ادامه برنامه
                        دوست عزیز ممنون از توجهتون
                        به نظر شما من چطوری میتونم بجز روشی که دوستمون در بالا اشاره کردن فورا از زیر برنامه خارج بشم؟

                        دیدگاه


                          #13
                          پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                          سلام مهندس
                          بهترین و مطمین ترین راه واسه کار شما اینه که interupts ها رو فعال کنی
                          اینطوری حین اجرای برنامه زمانی که کلید مورد نظرت فشرده بشه سریعا به لیبلی که شما میخوای پرش میکنه و کاری که میخوای رو انجام میده و دوباره برمیگرده به ادامه ی برنامه ی اصلی
                          تا جایی که خاطرم هست در atmega32 پایه های 17 و 18 مخصوص همین کار هستن که با int 1 و int2 مشخص شدن
                          بازم اگه توی فعال کردنش تو برنامه مشکل داشتی بگو تا یه مثال بزارم واست
                          امير مسعود مقدم

                          دیدگاه


                            #14
                            پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                            سلام دوست عزیز دلیل اینکه برنامه شما جواب نمیده اینه که از تایم های بالا مثلا 10 ثانیه با دستور wait استفاده کرده اید و میکرو رو فقط مشغول به شمردن ثانیه ها وادار کرده اید که این کار باعث میشود میکرو از بررسی ورودی شما که جهت خارج شدن از حلقه است غافل شود
                            بهترین راه استفاده از تایمر به جای wait است که برنامشو در زیر گذاشتم

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

                            $regfile = "M8def.dat"
                            $crystal = 1000000

                            dim x as integer
                            dim t1 as integer
                            dim t3 as integer
                            Config Timer0 = Timer , Prescale = 1024

                            Enable Interrupts
                            Enable Timer0
                            On Timer0 K
                            Start Timer0






                            If Pind.0 = 1 Then
                            Goto A
                            End If
                            Loop
                            End

                            A:
                            Do
                            Portb = &B10000000

                            Waitms 600

                            Portb = &B10000001

                            do
                            if t1>10 then
                            if pind.1=1 then
                            x=1
                            exit do
                            end if
                            exit do
                            loop
                            if x=1 then exit do


                            Portb = &B00000001

                            Waitms 600

                            Portb = &B00000000

                            Wait 15

                            Portb = &B10000000

                            Waitms 600

                            Portb = &B10000010

                            Wait 10

                            Portb = &B00000010

                            Waitms 600

                            Portb = &B00000000

                            Wait 15

                            Portb = &B10000000

                            Waitms 600

                            Portb = &B10000100

                            Wait 10

                            Portb = &B00000100

                            Waitms 600

                            Portb = &B00000000

                            Wait 15

                            Loop

                            End


                            K:
                            Incr T3

                            If T3 > 3 Then
                            Incr T1
                            T3 = 0
                            End If


                            Return

                            دیدگاه


                              #15
                              پاسخ : راهنمایی کوچک واسه حل یه مشکل تو بسکام

                              برنامه رو کاملترش میکنم :

                              نحوه کارکرد به این صورت هست که هنگامی که برنامه به خط دستور call wait10 یا call wait15 می رسد به جای اینکه دستور wait را اجرا کند داخل حلقه ای می رود و علاوه بر اینکه درون ان 10ثانیه یا 15ثانیه صبر میکند و بعد از ان از حلقه بیرون می اید ; با دستور ورودی pind.1=1 نیز به حلقه اصلی پرش میکند

                              ضمنا برنامه کامپایل شده وهیچ مشکلی نداره فقط کپی کن و پروگرام کن ببین درست کار میکنه یا نه
                              فقط اینکه شرط رفتن به حلقه بالایی و اصلی فقط اینه که ورودیت یک بشه و اگه نشه برنامه لیبل a بصورت مکرر در حلقه دو لوپ اجرا میشه
                              و همچنین با دستور waitms 600 کاری نداشتم و بدترین حالتش اینه که در حالتی خاص که دکمه ورودی رو فشار میدی باید 600 میلی ثانیه نگهش داری تا عمل کنه
                              کد:
                              
                              $regfile = "M8def.dat"
                              $crystal = 1000000
                              
                              
                              dim t1 as integer
                              Dim T3 As Integer
                              
                              Declare Sub Wait10
                              Declare Sub Wait15
                              Declare Sub Wait600ms
                              
                              Config Timer0 = Timer , Prescale = 1024
                              
                              Enable Interrupts
                              Enable Timer0
                              On Timer0 K
                              Start Timer0
                              
                              
                              
                              B:
                              Do
                              T1 = 0
                              If Pind.0 = 1 Then
                              Goto A
                              End If
                              Loop
                              End
                              
                              A:
                              Do
                              Portb = &B10000000
                              
                              Waitms 600
                              
                              Portb = &B10000001
                              
                              Call Wait10
                              
                              Portb = &B00000001
                              
                              Waitms 600
                              
                              Portb = &B00000000
                              
                              Call Wait15
                              
                              Portb = &B10000000
                              
                              Waitms 600
                              
                              Portb = &B10000010
                              
                              call Wait10
                              
                              Portb = &B00000010
                              
                              Waitms 600
                              
                              Portb = &B00000000
                              
                              Call Wait15
                              
                              Portb = &B10000000
                              
                              Waitms 600
                              
                              Portb = &B10000100
                              
                              Call Wait10
                              
                              Portb = &B00000100
                              
                              Waitms 600
                              
                              Portb = &B00000000
                              
                              call Wait15
                              
                              Loop
                              
                              End
                              
                              
                              K:
                              Incr T3
                              
                              If T3 > 3 Then
                              Incr T1
                              T3 = 0
                              End If
                              
                              
                              Return
                              
                              
                              Sub Wait10
                              
                              do
                              If T1 > 9 Then
                              Exit Do
                              T1 = 0
                              End If
                              
                              if pind.1=1 then
                              Goto B
                              End If
                              
                              Loop
                              End Sub
                              
                              
                              Sub Wait15
                              
                              do
                              If T1 > 14 Then
                              Exit Do
                              T1 = 0
                              End If
                              
                              if pind.1=1 then
                              Goto B
                              End If
                              
                              Loop
                              End Sub

                              دیدگاه

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