اطلاعیه

Collapse
No announcement yet.

یه مشکل عجیب دیگه، این بار با وقفه های خارجی

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

    یه مشکل عجیب دیگه، این بار با وقفه های خارجی

    من برنامه زیر رو نوشتم در این برنامه اگر کلید S1 را فشار بدهیم اینتراپت مربوط به اون(Int0) غیر فعال میشه و اینتراپت 1 فعال میشه و اگر کلید S2 را فشار بدهیم اینتراپت مربوط به اون(Int1) غیر فعال میشه و اینتراپت 0 فعال میشه، یعنی با فشردن هر کلید اینتراپت آن غیر فعال شده و دیگر نباید کار کند تا زمانیکه کلید دیگر فشار داده شود.
    حال ببینید اگر به این شکل کلیدها را فشار دهیم برنامه مشکل دار میشود:
    1-کلید S1 را یک بار فشار دهیم
    2- کلید S2 را 2 بار فشار دهیم
    3-اگر کلید S1 را 2 بار فشار دهیم هر بار وقفه رخ میدهد در صورتی که در بار اول فشردن وقفه اش غیر فعال شده بود.

    این مدار را عملا بسته ام و دقیقا همین مشکل پروتیوس را دارد.

    این برنامه
    $regfile = "m8def.dat"
    $crystal = 4000000

    Dim Value As Byte

    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , _
    Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0

    On Int0 Int0_isr
    Disable Int0
    Config Int0 = Rising

    On Int1 Int1_isr
    Disable Int1
    Config Int1 = Rising

    Config Lcd = 16 * 2

    Enable Interrupts

    Cls

    Enable Int0

    Do
    Loop
    End

    Int0_isr:
    Disable Int0
    Incr Value
    Home
    Lcd Value
    Enable Int1
    Return

    Int1_isr:
    Disable Int1
    Enable Int0
    Return

    اینم فایل برنامه و پروتیوس
    ورژن پروتیوس نیز 7.6 و بیسکام 1.11.9.8
    http://upload.iranblog.com/7/1273162653.zip

    #2
    پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

    یعنی کسی تا حالا با 2 وقفه خارجی توی یک برنامه کار نکرده؟
    یکی بیاد کمک کنه...............

    دیدگاه


      #3
      پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

      دوست عزیز مطابق توضیحاتی که داده اید در بار دوم که کلید S2 را می زنید، درست است که وقفه ای اتفاق نمی افتد، اما FLAG مربوط به INT1 یک می شود و منتظر وقفه می ماند. بعد از این مرحله اگر مجددا S1 را بزنید،بعد از خروج از INT0 و به دلیل یک بودن FLAG مربوط به INT1، یک رفت و برگشت به INT1 بوجود می آید و در آنجا دستور Enable Int0 اجرا می شود. به همین دلیل است که در بار بعدی که S1 را مجددا فشار می دهید، وقفه آن قبول می شود.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #4
        پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

        ممنون.
        حالا با این تفاسیر باید چکار کنم؟
        فلگ را غیر فعال کنم یا ....؟

        دیدگاه


          #5
          پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

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

          دیدگاه


            #6
            پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

            نوشته اصلی توسط Saeed Bagherani
            صلا چرا این قدر برنامه رو پیچوندی
            می شه بگی می خوای چه کار کنی
            برنامه خیلی خیلی پیچیده تر از این حرفاس، 2 تا تایمر ها هم فعال هستند...:eek: :nice:
            اما تو این قسمت دچار مشکل شدم که باید برطرف بشه....

            دیدگاه


              #7
              پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

              نوشته اصلی توسط جواب ندی قهر میکنما...
              ممنون.
              حالا با این تفاسیر باید چکار کنم؟
              فلگ را غیر فعال کنم یا ....؟
              صرف نظر از اینکه اعمال کلید به ورودی های وقفه و نوع برنامه نویسی آن کار اصولی و درستی نیست، برای رفع این مسئله در برنامه وقفه INT0 دستور set INTF1 و در در برنامه وقفه INT1 دستور set INTF0 را بنویسید تا Flag مربوط به وقفه مقابل پاک شود. توضیح اینکه در AVR برای پاک کردن Flag وقفه باید روی آن یک نوشته شود.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                نوشته اصلی توسط طراح
                برای رفع این مسئله در برنامه وقفه INT0 دستور set INTF1 و در در برنامه وقفه INT1 دستور set INTF0 را بنویسید تا Flag مربوط به وقفه مقابل پاک شود. توضیح اینکه در AVR برای پاک کردن Flag وقفه باید روی آن یک نوشته شود.
                آقای "طراح" مشکل برطرف نمیشه... :angry:

                دیدگاه


                  #9
                  پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                  برای کمک به حل مشکل شما اولا بفرمائید برای ورودی کلیدها مقاومتPull down یا Pull up قرار داده اید یا خیر(که در صورت دوم باید لبه از نوع falling تعریف شود). دوم اینکه آیا بصورت عملی آزمایش می کنید و یا در محیط پروتئوس اینکار را انجام می دهید.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #10
                    پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                    نوشته اصلی توسط طراح
                    برای کمک به حل مشکل شما اولا بفرمائید برای ورودی کلیدها مقاومتPull down یا Pull up قرار داده اید یا خیر(که در صورت دوم باید لبه از نوع falling تعریف شود). دوم اینکه آیا بصورت عملی آزمایش می کنید و یا در محیط پروتئوس اینکار را انجام می دهید.
                    بله برای هر کدام یک مقاومت 1کیلو گذاشتم و لبه رو هم به Falling تغییر دادم و مدار رو هم با بردبرد بستم اما باز هم کار نمیکنه.
                    برنامه را هم به این شکل نوشتم اما بازم درست نمیشه که نمیشه :angry:

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

                    Dim Value As Byte

                    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , _
                    Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0

                    On Int0 Int0_isr
                    Disable Int0
                    Config Int0 = Falling

                    On Int1 Int1_isr
                    Disable Int1
                    Config Int1 = Falling

                    Config Lcd = 16 * 2

                    Enable Interrupts

                    Cls

                    Enable Int0

                    Do
                    Set Intf1
                    Set Intf0
                    Loop
                    End

                    Int0_isr:
                    Disable Int0
                    Incr Value
                    Home
                    Lcd "Value: " ; Value
                    Enable Int1
                    Return

                    Int1_isr:
                    Disable Int1
                    Enable Int0
                    Return

                    دیدگاه


                      #11
                      پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                      با وجود کمبود فوق العاده وقت و به دلیل روشن شدن این مسئله، نرم افزار شما را تست کردم و درنهایت معلوم شد که این مشکل ناشی از کرامات BASCOM است. برنامه را به شکل زیر بنویسید و نتیجه را تست کنید تا در مورد مشکل قضیه توضیح داده شود ( به pullup خارجی نیازی نیست اما اگر وجود داشته باشد بهتر است):

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

                      Dim Value As Byte
                      On Int0 Int0_isr
                      On Int1 Int1_isr
                      Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , _
                      Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
                      Config Lcd = 16 * 2
                      Portd = &H0C
                      Config INT0 = Falling
                      Config INT1 = Falling
                      GIFR = &HC0
                      Cls
                      Enable Int0
                      Enable Interrupts

                      Do
                      Loop
                      End

                      Int0_isr:
                      Disable Int0
                      Incr Value
                      Home
                      Lcd "Value: " ; Value
                      Gifr = &HC0
                      Enable Int1
                      Return

                      Int1_isr:
                      Disable Int1
                      Gifr = &HC0
                      Enable Int0
                      Return
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


                        #12
                        پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                        نمیدونم چطور ازتون تشکر کنم که با وجود کمبود وقتتون مشکل من رو حل کردید :applause:

                        اگر وقت دارید یه توضیحی هم بدید که من هم سر در بیارم چه اتفاقی تو برنامه افتاده.
                        آیا واقعا این بیسکام مشکل داره...

                        ممنون.

                        :wow:!!!!!!!!!!!!!!!!

                        دیدگاه


                          #13
                          پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                          نوشته اصلی توسط شازده
                          اگر وقت دارید یه توضیحی هم بدید که من هم سر در بیارم چه اتفاقی تو برنامه افتاده.
                          آیا واقعا این بیسکام مشکل داره...
                          مشکل این بود که دستورات SET INTF0 و SET INTF1 عمل نمی کردند و بجای آنها دستور GIFR=&HC0 قرار داده شد.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #14
                            پاسخ : یه مشکل عجیب دیگه، این بار با وقفه های خارجی

                            سلام منم یه همین جور مشکلی دارم که برنامه هم با C نوشته شده ولی مشکل رفع نمیشه .

                            ( تو نرم افزار پرتیوس به خوبی عمل میکنه اما در عمل نه

                            میخوام هرموقع وقفه خارجی INT0 یک لبه پایین رونده بهش امد یک پین را معکوس کنه.کد زیر نوشتم اما جواب نگرفتم.و زمانیکه پین INT0 را صفر میکنم .خروجی معکوس میشه ولی به محض اینکه مجددا این پین (یعنی همان INT0 یک میشه باز تابع وقفه اجرا میشه و پین را معکوس میکنه
                            ممکنه کمکم کنید.این هم برنامه ام
                            while(1){
                            }
                            interrupt input(void)
                            if (INT0IF && INT0IE(
                            INT0IF =0;
                            PORTBbits.RB1 (1^PORTBbits.RB1) ;
                            }
                            ضمنا توی برنامه بیت INTEDG0 را هم صفر کردم تا بردار وقفه با لبه پایین رونده عمل کنه.اخه چرا وقتی بردار وقفه عمل میکنه و من تو بردار وقفه حتی امدم فلگ مربوطه یعنی INT0IF را هم صفر کردم ولی باز دستم را که از کلید برمیدارم .مجددا خروجی من معکوس میشه

                            دیدگاه

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