اطلاعیه

Collapse
No announcement yet.

سوال در مورد وقفه خارجی (کممممک)

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

    سوال در مورد وقفه خارجی (کممممک)

    سلام به همه.
    یه سوال ساده

    http://upload7.ir/uploads//a0ba3b8b6b61a360baa87758b00bae0ac6d0c6f9.jpg

    [code=c]
    #include <mega16.h>
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    while(PIND.2==0);
    PORTA.0=!(PORTA.0);
    }
    void main()
    {
    PORTA.0=0;
    DDRA.0=1;
    GICR=0x40;
    MCUCR=0x02;
    GIFR=0x40;
    #asm("sei"
    while(1);
    }
    [/code]

    مثلا ببینین، توی خط 11 خب وقفه صفر انتخاب میشه
    توی خط 12 حساسیت به لبه پایین رونده تنظیم میشه
    خط 13 رو خیلی کامل اگه میشه توضیح بدید. توضیحش توی کتاب هست ولی درک می نشود!!!
    بعد از 13 چی میشه؟؟
    کلا خط 13 و بعدش رو توضیح خیلی کامل بدین ممنون میشم.
    اون دستور while که آخر هست چیو بینهایت بار تکرار میکنه؟؟ چیزی جلوش نداره که.
    http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842
  • ۷۵٬۰۰۰٬۰۰۰ ریال ۷۲٬۷۵۰٬۰۰۰ ریال
    ۳۰۵٬۰۰۰ ریال ۲۱۳٬۵۰۰ ریال
    ۱٬۲۹۰٬۰۰۰ ریال ۷۷۴٬۰۰۰ ریال
    ۱٬۱۰۰٬۰۰۰ ریال ۹۶۸٬۰۰۰ ریال
    ۳۴٬۰۰۰٬۰۰۰ ریال ۳۲٬۳۰۰٬۰۰۰ ریال
    ۱٬۲۱۰٬۰۰۰ ریال ۹۰۷٬۵۰۰ ریال
    ۸۸۶٬۰۰۰ ریال ۷۰۸٬۸۰۰ ریال

    #2
    پاسخ : سوال ساده در مورد وقفه خارجی

    خط 13 :
    سه بیت با ارزش رجیستر GICR مربوط به فعال سازی و یا غیر فعال سازی وقفه های خارجی است.
    کد:
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    // INT2: Off
    GICR|=0x40;
    MCUCR=0x02;
    MCUCSR=0x00;
    GIFR=0x40;
    همچنین هر یک از وقفه های خارجی دارای یک بیت پرچم هستند که در صورت ترگر شدن از پین وقفه ی خارجی و فعال بودن بیت مربوطه در رجیستر GICR و فعال بودن بیت فعالساز وقفه، علاوه بر یک شدن پرچم می تواند باعث ایجاد وقفه شود که پس از اجرای ISR پرچم به صورت سخت افزاری پاک می شود.
    0 1 2 3 4 5 6 7 Bit
    INTF2 INTF0 INTF1 GIFR
    خط 14 :
    اعلان عمومی برای وقفه-(اگر نباشد وقفه هیچ وقت اجرا نخواهد شد)

    خط 15 :
    نوشته اصلی توسط saman1989t
    اون دستور while که آخر هست چیو بینهایت بار تکرار میکنه؟؟ چیزی جلوش نداره که.
    اون چیزی رو تکرار نمی کنه فقط منتظر است تا که اگر وقفه ای آمد آن را اجرا کند.
    - تو همانی که می اندیشی، هرگاه به این اندیشیدی که تو یک عقابی؟ پس به دنبال رویاهایت برو و به یاوه های مرغ و خروس های اطرافت فکر نکن.

    - یک تصمیم می تواند دریچه های زندگی ما را به روی اندوه یا شادی ، سعادت یا تنگدستی ، مصاحبت یا تنهایی ، و عمری طولانی یا مرگی زودرس باز کند

    دیدگاه


      #3
      پاسخ : سوال ساده در مورد وقفه خارجی

      ممنون از جوابتون
      گفتین که در صورت تحریک اون پایه خارجی (یعنی اینجا INT0)، بیت flag یعنی GIFR یک میشه. ولی توی خط 13 خودمون بهش مقدار دهی کردیم که. نباید بجاش دستور شرطی بذاریم؟؟ که اگه او بین 1 شد فلان کارو بکنه؟؟

      یه سوال دیگه: توی خط 14، i=1 میشه و بعدش خط برنامه میره توی وقفه و آدرس خط بعدی (یعنی 15) توی stack ذخیره میشه تا در موقع برگشت از وقفه به اونجا بره. به صورت سخت افزاری i=0 میشه. بعدش خط 4 و 5 انجام میشه. بعدش خط برنامه میاد توی خط 15. الان i=0 هست. چطور دوباره میره توی وقفه؟؟

      و باز هم یه سوال دیگه :biggrin: : چرا GICR رو OR کردین؟؟ بیت های دیگه که به صورت پیش فرض 0 هستن. ( ;GICR|=0x40 )
      http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

      دیدگاه


        #4
        پاسخ : سوال ساده در مورد وقفه خارجی

        کسی نیست کمک کنه؟؟؟
        http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

        دیدگاه


          #5
          پاسخ : سوال ساده در مورد وقفه خارجی


          کد:
          jj;
          http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

          دیدگاه


            #6
            پاسخ : سوال در مورد وقفه خارجی (کممممک)

            سوالا رو دونه دونه بپرسید تا رغبت پاسخ به اونها ایجاد شه. :mrgreen:
            1-با اینکار بیت فلاگ اینتراپت مربوطه پاک میشه. ما لازم نیست اون بیت رو چک کنیم. cpu خودش پرچم وقفه ها رو چک میکنه و بر اساس اون زیر روال مربوطه اجرا میشه.

            2- i چیه؟

            3- برای تغییر یک بیت از یک بایت یا word معمولا از این روش استفاده میکنن تا بقیه بیت ها تغییر نکنه
            گفت که دیوانه نهی لایق این خانه نهی

            دیدگاه


              #7
              پاسخ : سوال در مورد وقفه خارجی (کممممک)

              من تازه چند روزه که شروع کردم به یادگیری این مدت سوال زیاد میپرسم :redface:
              در اصل می خوام با Sim 908 کار کنم. یه سر بهش زدم دیدم هیچی بلد نیستم و اصطلاحات زیادی داره. گفتم همون مث بچه آدم از پایه شروع کنم.

              همه چیز جمع و جور و طولانی!
              http://upload7.ir/uploads//a0ba3b8b6b61a360baa87758b00bae0ac6d0c6f9.jpg

              خط 11: وقفه شماره 0 انتخاب میشه.
              خط 12: حساسیت به لبه پایین رونده تنظیم میشه.
              خط 13: که GIFR هست. معنیش اینه که اگه پین INT0 که روی پایه PD2 از میکرو کنترلر ATMEGA16 هست تحریک بشه (یعنی تغییر وضعیت بده) فلگ متناظر با اون وقفه 1 میشه. یعنی اگه وقفه 0 رو در نظر بگیریم، بین شماره 6 از رجیستر GIFR که اسمش INTF0 هست 1 میشه.
              http://upload7.ir/uploads//593cfba8bf10c2af2bab9a97cb887c5625149454.png
              تا اینجا من از کتاب فهمیدم.
              گفتین که ما نباید اون بیت رو چک کنیم. درست. پس چرا توی خط برنامه که نوشتم (خط شماره 13) مقدار دهی شده؟؟ توی توضیحات کتاب نوشته: مقدار دهی اولیه شده. چرا باید مقدار دهی اولیه بشه اصلا؟؟ اینم که روش 1 ینویسیم تا پاک بشه هم نمیتونه درست باشه چون به طور پیش فرض 0 هست خودش.

              i همون مجوز وقفه همگانی یا همون Global هست. بیت شماره 7 از Status Register
              http://upload7.ir/uploads//653a038e88dcf31305037cc006457409111f5474.png
              تا اینجا چون i=0 هست وقفه انجام نمیشه. تا میرسیم به خط 14 که i=1 میشه. حالا وقفه اجازه داره انجام بشه و اجرای برنامه میره توی وقفه و آدرس برگشت (که میشه خط شماره 15) توی stack ذخیره میشه تا در موقع برگشت از وقفه به اون خط بره. و بعدش i=0 میشه تا وقفه دیگه ای اجازه اجرا نداشته باشه. خط های 2 و 3 و 4 و 5 به ترتیب اجرا میشن. تا اینجا فکر میکنم درست باشه تحلیلم :nerd:
              من برنامه رو نوشتم و فایل HEX درست کردم و با Proteus شبیه سازی کردم. این وقفه تا بینهایت با اجرا میشه. اینکه بینهایت بار اجرا میشه دلیلش چیه؟؟
              چون وقتی خط 15 اجرا میشه، دیگه چجوری برمیگرده توی وقفه؟؟؟ دستور while اول برنامه نیست که بینهایت بار تکرار بشه. چجوری تکرار میشه تا برنامه دوباره وارد وقفه بشه؟؟ oo:
              چقد تایپ کردم :rolleyes:
              http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

              دیدگاه


                #8
                پاسخ : سوال در مورد وقفه خارجی (کممممک)

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

                علاوه بر اون باید با دستور اسمبلی sei هم وقفه ها رو فعال کنید
                گفت که دیوانه نهی لایق این خانه نهی

                دیدگاه


                  #9
                  پاسخ : سوال در مورد وقفه خارجی (کممممک)

                  خب اگه قبلا توش 1 نوشته شده باشه، برای پاک کردنش توش دوباره 1 مینوسن تا پاک شه. آخه اون خط فقط 1 بار اجرا میشه، قبلش هم که به صورت پیش فرض 0 هست مقدارش.
                  توی برنامه اون خط رو کلا پاک کردم مشکلی پیش نیومد! نویسنده حتما یه منظوری داشته!!
                  ولی اون جاش که چی میشه که وقفه چندین بار پشت سر هم تکرار میشه هنوز حل نشده.
                  http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                  دیدگاه


                    #10
                    پاسخ : سوال در مورد وقفه خارجی (کممممک)

                    دوست عزیز عبارت زیر از دیتاشیت هستش
                    The flag is cleared when the interrupt routine is executed.
                    Alternatively, the flag can be cleared by writing a logical one to it.
                    درسته که در هنگام ریست باید صفر باشه ولی به هزار دلیل(با احتمال کم) ممکنه نباشه.
                    کار از محکم کاری عیب نمیکنه :mrgreen:
                    گفت که دیوانه نهی لایق این خانه نهی

                    دیدگاه


                      #11
                      پاسخ : سوال در مورد وقفه خارجی (کممممک)

                      این خط حل شد. ممنون :agree:
                      سوال اصلی: اینکه وقفه چندین بار تکرار میشه چطور؟؟
                      برنامه قبل از وقفه باید بره توی خط 14 تا مجوز وقوع وقفه با دستور اسمبلی داده بشه.یعنی i=1 بشه. بعدش میره توی وقفه و i=0 میشه. وقتی از وقفه برمیگرده توی خط 15 به صورت سخت افزاری i=1 میشه. بعدش چجوری دوباره برمیگرده توی وقفه؟؟
                      http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                      دیدگاه


                        #12
                        پاسخ : سوال در مورد وقفه خارجی (کممممک)

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

                        دیدگاه


                          #13
                          پاسخ : سوال در مورد وقفه خارجی (کممممک)

                          نوشته اصلی توسط Finder_
                          اگه از دیدگاه اسمبلی بخواین بحث کنید
                          هر گاه وقفه ای رخ میده پردازنده بیت i رو تغییر میده و هم آدرس کنونی و هم بایت پرچم رو در استک ذخیره میکنه. بعدش هم به آدرس زیرروال مربوطه پرش میکنه. در این هنگام بیت های پرچم پاک میشند.
                          حالا اگه در حین اجرای روتین وقفه دوباره وقفه ای صادر شد باز همین ماجرا ادامه دار میشه. به این حالت میگن وقفه های تو در تو. که اندازش محدوده.
                          بعد از اجرای روتین وقفه آدرس و محتویات پرچم از استک گرفته میشه
                          اینا درست.
                          بعدش میاد توی خط 15 برنامه دیگه؟؟ درسته؟؟
                          http://upload7.ir/uploads//a0ba3b8b6b61a360baa87758b00bae0ac6d0c6f9.jpg
                          بعدش چی میشه که دوباره برمیگرده توی وقفه؟؟
                          http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                          دیدگاه


                            #14
                            پاسخ : سوال در مورد وقفه خارجی (کممممک)

                            ینی چی؟
                            اگه وقفه ای صادر بشه میره تو روتین وقفه دیگه
                            گفت که دیوانه نهی لایق این خانه نهی

                            دیدگاه


                              #15
                              پاسخ : سوال در مورد وقفه خارجی (کممممک)

                              با AVR Studio اینجوری نشون میده:
                              http://upload7.ir/preview.php?user=&file=c3e84b9e7319b0bfdfbd590 4eda458737cb54d5f
                              چرا توی وقفه رفتن رو نشون نمیده؟؟
                              برنامه باید بره توی وقفه. چون با Proteus شبیه سازی کردم.
                              http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                              دیدگاه

                              • ۵۲۵٬۰۰۰ ریال ۵۰۴٬۰۰۰ ریال
                                ۱٬۵۱۰٬۰۰۰ ریال ۱٬۴۴۹٬۶۰۰ ریال
                                ۵۶۰٬۰۰۰ ریال ۵۳۷٬۶۰۰ ریال
                              لطفا صبر کنید...