اطلاعیه

Collapse
No announcement yet.

تکرار یک وقفه

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

    تکرار یک وقفه

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

    ممنون میشم اگر اساتید بفرمایند که چکار کنم بهتره ؟

    ممنون

    راستی با مگا 8 و بسکام کار می کنم.

    ممنون

    #2
    پاسخ : تکرار یک وقفه

    اگر منظورت اینه که بعد از وقفه اول مادامی که 10 ثانیه بگذره یا وقفه دوم بیاد که راه حل خیلی راحته. در داخل روال وقفه؛ با استفاده از یک متغیر چک کن آیا این دفعه اول هست که وارد وقفه میشی یا نه. اگر دفعه اول هست وقفه ها رو مجددا فعال کن. از یک تایمر برای 10 ثانیه استفاده کن. و همونجا بمون تا وقفه بعدی بیاد. در صورت سپری شدن 10 ثانیه یا بروز وقفه دوم بیا بیرون. همین. اما مسلما در طی این زمان میکروی شما غیر از عملیاتی که داخل وقفه انجام میده کار دیگه ای نمیکنه. یک چیزی مثل این:
    (من بسکام بلد نیستم. یک کد فرضی نوشتم برای درک بهتر مطلب)

    Dim IrqCallState As Byte

    IrqCallState = 0
    On Interrupt Int0 IRQ0


    .... place your main code here....


    IRQ0:
    If IrqCallState = 0 Then
    ' This is 1st Time IRQ invoked
    IrqCallState = 1
    Enable Interrupts
    For i = 1 to 10000
    WaitMs 1
    If IrqCallState = 0 Then
    ' IRQ Inoked during 10seconds Wait...
    Return
    End If
    Next i
    Else
    ' This is 2nd Time IRQ invoked
    End If
    IrqCallState = 0
    Return

    دیدگاه


      #3
      پاسخ : تکرار یک وقفه

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

      اجرای برنامه اصلی
      -رفتن به وقفه و یک کردن یک پایه تا 10 ثانیه
      -خروج از وقفه در صورت پایان یافتن 10 ثانیه
      - ادامه برنامه اصلی تا رسیدن فرمان وقفه
      -حالا اگر هم 9 ثانیه از 10 ثانیه مذکور گذشته بود و فرمان وقفه مجددا به پایه رسید از این وقفه خارج نشود و مجددا از صفر ثانیه بشمرد و همین صورت الی اخر.

      $regfile = "m8def.dat"
      $crystal = 8000000
      Enable Interrupts
      Enable Int0
      On Int0 Int_test
      Dim F As Byte
      Config Int0 = Rising
      Config Portc = Output
      Config Pind.2 = Input

      Main:
      Do


      Loop


      End
      Int_test:

      Enable Int0
      Set Portc.1
      Waitms 100

      Reset Portc.1
      Return

      منتظر راهنمایی شما هستم.
      ممنون

      دیدگاه


        #4
        پاسخ : تکرار یک وقفه

        آقای عزیز. اصلا حرف من رو نگرفتی. اولین مسئله در روال وقفه اینه که کلیه وقفه ها رو دوباره با Enable Interrupts فعال کنی. شما فقط امکان بروز وقفه صفر رو فعال کردی. اینکه از قبل فعال بوده منتهی وقتی یک وقفه حادث میشه کلیه وقفه ها غیر فعال میشن تا پردازش اون وقفه تموم بشه. فعال شدن یک وقفه بخصوص به دو مورد بستگی داره. اول اینکه امکان بروز وقفه توسط تجهیز مربوطه در میکرو امکانپذیر باشه. که برای وقفه صفر با Enable Int0 اینکار رو میکنی. و بعد به میکرو اطلاع بدی که کلا وقفه ها میتونن اجرا بشن. که اینم با Enable Interrupts کار میکنه.

        دیدگاه


          #5
          پاسخ : تکرار یک وقفه

          جناب اقازاده من همه ی اون کار ها را که فرموده بودین را هم انجام دادم . حتی کل روال وقفه را هم در زیرروال irq0 گذاشتم اما جواب نمیده . اصلا فقط یکبار اجرا می شه وقفه و دیگر وقفه اجرا نمی شه. .. :cry:

          دیدگاه


            #6
            پاسخ : تکرار یک وقفه

            بهتره استک را در اول برنامه مقدار دهی کنید مثل hwstack و بقیه

            دیدگاه


              #7
              پاسخ : تکرار یک وقفه

              این منطقی که شما شرح دادی یه کوچولو با اون چیزی که در ابتدا گفتی فرق فوکوله!!
              من بسکام ندارم. ببین این کد جواب میده یا نه (همون کد قبلی ولی با فرم جدید.) فرض رو بر این میذارم که میکروی شما مگا هشت هست و با سرعت 8 مگا هرتز.


              $regfile = "m8def.dat"
              $crystal = 8000000

              Enable Int0
              On Interrupt Int0 Int_test
              Config Int0 = Rising
              Config Portc = Output
              Config Pind.2 = Input
              Config Timer0 = Timer, Prescale = 64 ' 8000 / 64 => 125 KHz
              On Ovf0 Tim0_isr

              Dim F As Byte
              Dim RemainTime As Word

              RemainTime = 0
              Tcnt0 = 255 - 125
              Start Timer0
              Enable Interrupts

              Main:
              Do


              Loop
              End

              Tim0_isr:
              Tcnt0 = 255 - 125
              If RemainTime = 0 Then
              Reset Portc.1
              Else
              RemainTime = RemainTime - 1
              EndIf
              Return

              Int_test:
              RemainTime = 10000
              Set Portc.1
              Return


              تایمر صفر برای سرعت 125 کیلو هرتز ست شده. و هر بار پس از 125 مرحله شمارش یکبار وقفه میده. در حین وقفه تایمر رو ریست میکنه و چک میکنه اگه زمانی برای صبر کردن هست از این زمان یکی کم میکنه. اگر زمان سپری شده باشه پورت خروجی رو صفر میکنه. از طرفی با بروز وقفه IRQ0 زمان 10 ثانیه یا همون 10000 میلی ثانیه ست میشه.

              به این صورت مادامی که قبل از 10 ثانیه دوباره وقفه فعال بشه باز پورت مربوطه ست میشه و زمان باقی مانده به 10 ثانیه افزایش پیدا میکنه. اما در انتهای 10 ثانیه پورت مربوطه صفر میشه.

              دیدگاه

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