اطلاعیه

Collapse
No announcement yet.

مشکل با interrupt

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

    مشکل با interrupt


    سلام به همگی دوستان و اساتید عزیز
    من یه برنامه چپگرد راست گرد نوشتم با اینتراپت.
    خلاصه کار اینجوره که میخام یه درب برقی شیشه ای رو که یه چشم و 2تا میکرو سوییچ در دو طرف داره رو کنترل کنم.
    چشم رو به صورت اینتراپت تعریف کردم چون میخام تا حضور شخص رو حس میکنه درب رو باز کنه .حالا میخاد درب بسته باشه یا در حال بسته شدن باشه .
    2 تا پین دیگه هم پول اپ کردم برا میکرو سوییچ ها که تا تغییر وضعیت داد درب بسته بشه.ولی مشکل اینجایست که تا زیر برنامه وقفه اجرا میشه سریع از زیربرنامه میپره بیرون و زمان کافی برای باز شدن کامل درب وجود نداره.از delay هم که استفاده میکنم تو اینتراپت اصلا وضعیت خوب نیس.قاطی میکنه.در ضمن نمیخام کنترلی رو سرعت داشته باشم فعلا.اگرچه دوس دارم ولی زیاد حرفه ای نیستم. :( :cry:
    اینم برنامه
    #include <mega32.h>
    #include <Delay.h>

    void main () {
    DDRB=0b00000011 ;
    PORTB=0b11111100;
    DDRD=0b00000000;
    PORTD=0b1111111;
    MCUCR=00000101;
    GICR=11000000;
    GIFR=00000000;

    while (1) {
    #asm ("sei&quot
    if(PINB.6==0 || PINB.5==0){ //limit sw chap ya rast
    PORTB.0=0; // khamosh shodan motor
    PORTB.1=0;
    delay_ms(100);
    PORTB.0=0;
    PORTB.1=1; // baste shodan darb
    delay_ms(100);
    delay_ms(100);
    delay_ms(100);
    delay_ms(100);
    PORTB.0=0;
    PORTB.1=0;
    };
    };
    };
    interrupt [ EXT_INT0 ] void int0 (){
    PORTB.0=0; //khamosh shodan motor
    PORTB.1=0;
    delay_ms(50);
    PORTB.0=1; //baz shodan (enable rast gard)
    PORTB.1=0;
    delay_ms(100);
    };

    #2
    پاسخ : مشکل با interrupt

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

    دیدگاه


      #3
      پاسخ : پاسخ : مشکل با interrupt

      نوشته اصلی توسط سوران آراسته
      سلام
      دوست عزیز شما باید وقتی وارد وقفه شدی به تابع باز شدن یا بسته شدن در بری و با استفاده از میکروسویچ ها که باز و بسته بودن رو اعلام می کنن یه حلقه با شرط صفر شدن میکروسویچ مورد نظر قرار بدی که تا زمانی در به طور کامل باز نشده به کارش خودش ادامه بده. اینا رو حل کن بعد کم کم میریم سراغ تنظیم سرعت
      دستت درد نکنه داداش ولی ساده تر بگو من بفهمم اخه :biggrin:
      تابع باز شدن و بسته شدن درب برم یعنی چی؟!!یعنی تو خود interrupt با for یه حلقه بنویسم؟!!!
      میشه بیشتر توضیح بدی!!
      مرسی

      دیدگاه


        #4
        پاسخ : مشکل با interrupt

        منظور از تابع باز و بسته کردن همون یک و صفر کردن پین هاست که باعثحرکت موتور میشه.
        نه در روال وقفه هیچ وقت برنامه شنگین قرار ندین بلکه با اجرای وقفه از داخل اون به تابعی برای باز کردن در رجوع کنید که قبلا تعریف کردین.
        اگر بازم متوجه نشدین بفرمایین تا یه نمونه کد براتون قرار بدم
        چرا ناراحتی پاتریک!
        + امروز ی بچه دیدم سرچهارراه گل میفروخت
        - از دیدنش ناراحت شدی؟
        + نه
        پس چی ناراحتت کرده
        + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
        ------------------------------------------------------------------------------------------------------
        تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
        ------------------------------------------------------------------------------------------------------
        محصولات

        دیدگاه


          #5
          پاسخ : پاسخ : مشکل با interrupt

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

          دیدگاه


            #6
            پاسخ : مشکل با interrupt

            اقا من اومدم از این دستور استفاده کردم...
            do {
            }
            while ();

            الان یه جورایی هم درست کار میکنه هم قاطی میکنه.دفغع اول که اینتراپت میاد خوبه ولی بعد مثه اینکه زود از تو حلقه while میپره بیرون.چشه؟!! :((((
            الان برنامه اینجوری شده :میشه ببنید ایراداتش چیه؟!!
            #include <mega32.h>
            #include <Delay.h>

            void main () {
            DDRB=0b00000011 ;
            PORTB=0b11111100;
            DDRD=0b00000000;
            PORTD=0b1111111;
            MCUCR=00000101;
            GICR=11000000;
            GIFR=00000000;
            #asm ("sei&quot
            while (1) {

            if(PINB.6==0 || PINB.5==0){ //limit sw chap ya rast
            PORTB.0=0; // khamosh shodan motor
            PORTB.1=0;
            delay_ms(100);
            PORTB.0=0;
            PORTB.1=1; // baste shodan darb
            delay_ms(100);
            delay_ms(100);
            delay_ms(100);
            delay_ms(100);
            PORTB.0=0;
            PORTB.1=0;
            };
            };
            };
            interrupt [ EXT_INT0 ] void int0 (){
            do {
            PORTB.0=1;
            PORTB.1=0;
            }
            while (PINB.6==0 || PINB.5==0);
            };


            ممنون

            دیدگاه


              #7
              پاسخ : مشکل با interrupt

              کاری که میخام بکنم اینه!!
              یه درب کشویی داریم.
              2تا میکرو سوییچ سمت چپ و راست درب.
              1 چشم که به عنوان اینتراپت تعریف شده است بالای درب.(خودم اینتراپت تعریفش کردم چون باید درب در هر حالتی که هست مثلا بسته یا درحال بسته شدن وقتی چشم دید شروع به باز شدن کنه!
              زمان بسته شدن کامل درب 5 ثانیه است.
              وقتی اینتراپت میاد (یعنی چشم میبینه).باید درب باز بشه و تا زمانی که بخوره به میکروسووییچ چپ یا راست روشن بمونه تا درب تا انتها باز بشه ولی یعد از زمان کوناهی خاموش میشه بعضی وقتا هم قاط میزنه انگار..(رو تغذیه خازن هست و تغذیه موتور از میکرو جداست).
              خروجی ها مشکل نداره.راش انداختم و کار میده فقط این برنامه و اینتراپت رو ببیند.مرسی
              این برنامه من اشکال زیاد داره که نمیدونمم دقیقا کجاهاس.
              اگه لینکی هست که همچسن کاری کرده بهم معرفی کنید.مرسی

              دیدگاه

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