ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





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









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 13

موضوع: interrupt در mplab

  1. #1
    2014/11/07
    128
    0

    interrupt در mplab

    سلام به جميع مهندسين
    يه سوال دارم اونم اينکه :
    من AVR رو بلدم و باهاش کار ميکنم و چن وقتيه دارم با pic کار ميکنم و با mplab x ide و کامپايلر c18 کد ميزنم
    ميخام از interrupt ميکرو استفاده کنم . چنتا برنامه رو نگاه کردم اما راستشو بخايد چيزي نفهميدم ميشه لطف کنيد يه توضيح کلي در مورد interrupt هاي pic و بالاخص سري 18f452 بديد ؟ اينکه چه جوري فعال ميشن يا چه جوري بايد ازشون استفاده کرد و . . . . . . . ؟
    اگه بتونيد يه سورس هم برام بزاريد واقعا ممنون ميشم

    راستي mplab x ide با mplab ide فرق داره؟ يا جفتشون يکي هستن؟

    اضافه شده در تاریخ :
    واقعا کسي بلد نيست جواب بده يا نميخايد جواب بديد يا حال جواب دادنو نداريد ؟
    سوال خيلي سختيه ؟!!!!!!!!!!!!!
    لطفا جواب بديد
    *****براي آدمي بهتر است که اصلا به دنيا نيايد تا اينکه بيايدو هيچ تاثيري نگذارد *****
    ناپلئون بناپارت
  2. #2
    2008/10/10
    اصفهان
    67
    1

    پاسخ : interrupt در mplab

    دوست عزيز سلام از اينکه منتظر بوديد معظرت مي خوام

    اينتراپت ها توي avr و pic به جز چند تا فرق اساسي تفاوتي با هم ندارند:

    1- توي avr براي هر ماژولي (adc-timer-وقفه هاي خارجي و....) يه بردار وقفه تعريف ميشه .(خودتون که ديگه بهتر مي دونيد.)
    2- توي avr اولويت وقفه ها قابل تغيير نيست (مثلا اولويت وقفه ي خارجي 0 هميشه بالاتر از وقفه ي تايمر است.)
    3-هر وقفه که اتفاق بي افته به صورت خودکار پرچم وقفه هم reset مسشه
    اما در pic هاي هشت بيتي :

    فقط دو بردار وقفه تعريف ميشه (high و low) ولي در عوض ميتونيد اولويت وقفه ي ماژول ها رو خودتون تعيين کنيد.
    مثلا اگه وقفه ي تايمر 0 و adc فعال باشه ميتونيد وقفه ي تايمر 0 رو high وقفه ي adc رو low تعيين کنيد.
    پرچم وقفه ها بايد به صورت نرم افزاري reset بشه.

    در مورد ميکروي pic18f452 اگه ميخواين خوب متوجه بشيد اول بريد ديتاشيت رو باز کنيد و صفحه ي 77 رو بخونيد.
    من يه توضيح مختصر ميدم:

    رجيستر intcon(اينتراپت کنترل رجيستر)
    رجيستر مهمي هست دو تا بيت مهم دار يعني بيت هاي 7 و6 توضيحات رو بخونيد.

    رجيستر هاي PIR :
    توي اين رجيستر ها پرچم وقفه هاي که شما قبلا فعال کرديد وجود دارند که و در زماني که وقفه اتفاق مي افته شما باد پرچم مورد نظر رو صفر
    کنيد.

    رجيستر هاي PIE:
    توي اين رجيستر شما وقفه هايي رو که ميخواين فعال بشند تنظيم مي کنيد.

    رجيستر هاي IPR:
    توي اين رجيستر ها شما اولويت وقفه ها رو مشخص مي کنيد(وقفه با ارزش کم يا زياد)

    رجيستر RCON:
    توي اين رجيستر مشخص مي کنيد که وقفه ها اولويت دار باشن يا نه(بيت IPEN)

    (انگشتام افتاد :redface

    اگه ميخواين يه وقفه رو تنظيم کنيد (مثلا تايمر) بعد از اينکه اين صفحات رو خونديد بريد توي صفحه ي تايمر بلوک دياگرام رو ببنيد
    بعدش در آخر کار جدولي وجود دار ه به نام REGISTERS ASSOCIATED توي اين جدول بيت هايي که بايد تنظيم شند هاي لايت
    شده اند وبه راحتي مي فهميد که کجا رو بايد تنظيم کنيد.

    من با کامپايلر XC کار مي کنم و يه تفاوت جزيي توي تعريف بردار وقفه با c18 دار من توي XC8 رو اينجا مينويسم.

    يه مثال براي تايمر 0:

    کد:
    void Timer0_init(void){
    
      T0CONbits.T0PS = 1;//1:4PRES
      T0CONbits.PSA = 0;
      T0CONbits.T0CS = 0;//INTERNAL CLOCK
      T0CONbits.T08BIT = 0;//16BIT TIMER
     
      TMR0 = 45535;
      INTCONbits.T0IF = 0;
      INTCONbits.T0IE = 1;//ENABLE INTERRUPT
    
      T0CONbits.TMR0ON = 1;//START TIMER0
    RCONbits.IPEN = 0; //Disable priority levels
      INTCONbits.PEIE = 1;
      INTCONbits.GIE = 1;
    }
    کد:
    void interrupt timer0_isr(void){
          TMR0 = 45535;
      INTCONbits.T0IF = 0;
    تايمر صفر هر 20ms سر ريز ميشه ويه وقفه ميده(کلاک ميکرو 16 MHz )
    اگه خوب توضيح ندادم معضرت ميخوام اگه جاييشو متوجه نشديد بگيد تا چنتا مثاله ديگي بزارم.
    در زندگيت به کسي اعتــــماد کن که به او ايمــــان داري نه احســاس . . .

    چه بسيار انسان ها ديدم تنشان لباس نبود؛و چه بسيار لباس ها ديدم که انساني درونش نبود ...!
  3. #3
    2014/11/07
    128
    0

    پاسخ : interrupt در mplab

    نه داداش دمت واقعا گرم
    و انگشتات درد نکنه که در مورده رجيستراش توضيح دادي ولي ........!
    من هنوز بلد نيستم که چه جوري توي برنامه ازشون استفاده کنم
    منظورم من #pragma code و اين جور صحبتاشه
    مثلا توي CV دستور زيرو مينوشتيم:
    کد:
    interrupt [EXT_INT0] void x (void)
      {
     دستورات وقفه
      };
    حالا ميخاستم شبيه به يه چنين چيزيو توي mplab x ide ,c18 بگيد
    راستي mplab x ide با mplab ide فرق داره؟ يا جفتشون يکي هستن؟
    بازم ممنون

    اضافه شده در تاریخ :
    راستي توي pic اگه اولويت يه وقفه از يکي ديگه بالاتر باشه و مثلا جفتشون با هم رخ بدن به اوني که اولويتش بالا تره رسيديگي ميشه و اولويت پايينه بعدا رسيدگي ميشه يا پايينيه کلا حذف ميشه ؟
    يه سوال ديگه : توي avr به ازاي هر flag يه بردار داشتيم و دستورات مربوط به هر کدوم رو از هم جدا مينوشتيم حالا توي اينجا که کلا دوتا بيشتر نيست چه جوري بايد وقفه مورد نظرتو انتخاب و توي اون دستورات لازمو بنويسي؟منظورم اينه که چه جوري ميفهمه که الان اين دستوراتي که توي isr نوشتيم مربوط به کدوم يک از وقفه هاست؟ مثلا فرض کنيد ميخايم از 4 يا 5 تا وقفه استفاده کنيم به صورت همزمان؟ آيا بايد توي هر روتين بيايم تمامي flag هارو خودمون چک کنيم و if بزاريم که اگه اين flag يک بود اين کارو کن و اگه اون يکي يک بود اون کارو انجام بده ؟
    *****براي آدمي بهتر است که اصلا به دنيا نيايد تا اينکه بيايدو هيچ تاثيري نگذارد *****
    ناپلئون بناپارت
  4. #4
    2006/08/16
    867
    15

    پاسخ : interrupt در mplab

    سلام. من با کامپایلر های میکروچیپ کار نکردم ولی میدونم که توی PIC هر وقفه برای خودش بردار نداره. شما باید پرچم ها رو بررسی کنید.

    نقل قول نوشته اصلی توسط اوس موسي
    راستي mplab x ide با mplab ide فرق داره؟ يا جفتشون يکي هستن؟
    MPLABX IDE نسخه جدید MPLAB IDE هست که کامپایلرهای جدید XC8, XC16 و XC32 روش نصب میشن. بعلاوه تفاوتهای کوچیک دیگه.

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  5. #5
    2009/02/18
    تهران
    270
    1

    پاسخ : interrupt در mplab

    سلام

    استفاده از وقفه ها در C18 کار مشکلی نیست

    1 . ابتدا کد های زیر رو به پروژه اضافه کنید


    کد:
    void high_isr(void);
    void low_isr(void);
    
    /*============================*/
    
    #pragma code high_vector = 0x08
    void interrupt_at_high_vector(void) {
      _asm GOTO high_isr _endasm
    }
    #pragma code /* return to the default code section */
    
    
    #pragma code low_vector = 0x18
    void interrupt_at_low_vector(void) {
      _asm GOTO low_isr _endasm
    }
    #pragma code /* return to the default code section */
    
    /*============================*/

    که به وسیله این کدها , هنگام وقفه جریان برنامه رو به آدرس تابعی که بردار وقفه در اون قرار داره هدایت میکنید , یعنی همون تابع high_isr و low_isr

    2 . حال فقط کافیست روتین وقفتون رو درون دو تابع فوق بنویسید :


    کد:
    /**********< high_isr >**********/
    #pragma interrupt high_isr
    void high_isr(void){
    
    // your code
    
    }// end high_isr()
    /**********************< low_isr >***********************/
    #pragma interruptlow low_isr
    void low_isr(void){
    
    // your code
    
    }// end low_isr()


    برای مثال :


    کد:
    /**********< high_isr >**********/
    #pragma interrupt high_isr
    void high_isr(void){
    
      #if defined(USB_INTERRUPT)
        USBDeviceTasks();
      #endif
    
        //XX2++ ;
    }// end high_isr()
    /**********************< low_isr >***********************/
    #pragma interruptlow low_isr
    void low_isr(void){
    
      if (PIR1bits.RC1IF == 1) {
    
        i_BuffUSART1_RX[ il_x1 ] = getc1USART();
        il_x1++ ;
        il_x2 = il_x1 ;
        if( i_BuffUSART1_RX == 0 ){
          il_x1 = 0 ;
        }
    
    
        PIR1bits.RC1IF = 0;
      }// END RC1
    
    
    }// end low_isr()

    در کد های بالا رسیدگی به وضایف USB در اولویت بالا قرار دارد و دریافت سریال در اولویت پایین
    حال اگر هر دو وقفه با هم اتفاق بیفتد , ابتدا به بردار وقفه , با اولویت بالا , رسیدگی میشود
    دقت کنید که در روتین وقفه پایین ابتدا چک میکنم که آیا بیت PIR1bits.RC1IF ست شده است یا خیر , این کار برای تفکیک وقفه ها از هم صورت میگیرد , پس اگر وقفه تایمر یا وقفه ... اتفاق افتاد فقط با چک کردن پرچم آن متوجه دلیل رخ دادن وقفه میشیم و در انتهای رسیدگی به آن وقفه , پرچم فوق را 0 میکنیم تا دوباره وقفه رخ ندهد

    بله میکروهای 8 بیتی PIC به این شکل عمل میکنند , اما میکروهای 16 و 32 بیتی دارای بردار وقفه مجزا هستند
    نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
    تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه
  6. #6
    2013/04/06
    yazd
    996
    88

    پاسخ : interrupt در mplab

    با عرض سلام تو PIC كه هر موقعي يه وقفه اي رخ ميده و بردار وقفه ميپره من تو ديتا شيت چيز تحت عنوان ادرس دهي بردار وقفه نديدم پس چطور ميكرو از روي بردار وقفه متوجه ميشه كه به كدام سرويس روتين وقفه پرش كنه
  7. #7
    2014/07/20
    البـــرز - کـــرج - گوهـــردشت
    694
    156

    پاسخ : interrupt در mplab

    نقل قول نوشته اصلی توسط mostafa6369

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    با عرض سلام تو PIC كه هر موقعي يه وقفه اي رخ ميده و بردار وقفه ميپره من تو ديتا شيت چيز تحت عنوان ادرس دهي بردار وقفه نديدم پس چطور ميكرو از روي بردار وقفه متوجه ميشه كه به كدام سرويس روتين وقفه پرش كنه
    سلام
    متوجه سوالتون نمیشم!
    خب در زبان C، کامپایلر به عبارات خاصی حساسه و وقتی وقفه اتفاق میفته، مستقیم به همون قسمت پرش می کنه!
    وظیفه ی کامپایلر هم همینه که اون عبارات خاص رو به آدرس تعبیر می کنه و کد هگزش رو تولید می کنه!
    این قضیه منحصر به میکروی PIC نیست!
    سوال دیگه ای مورد نظرتون هست؟؟
    *** يا راهي خواهم يافت، يا راهي خواهم ساخت ... ***
  8. #8
    2018/01/19
    زیاران
    15
    8

    پاسخ : interrupt در mplab

    نقل قول نوشته اصلی توسط mostafa6369

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    با عرض سلام تو PIC كه هر موقعي يه وقفه اي رخ ميده و بردار وقفه ميپره من تو ديتا شيت چيز تحت عنوان ادرس دهي بردار وقفه نديدم پس چطور ميكرو از روي بردار وقفه متوجه ميشه كه به كدام سرويس روتين وقفه پرش كنه
    PIC ها فقط دوتا بردار وقفه دارن و مثلا شما تعریف می کنین UART و SPI اینتراپتشون توی تقدم بالا باشه و وقتی هر کدموم اینتراپتش فعال بشه آدرس 0008h اجز می شه . حالا شما باید توی برنامه ی اینتراپت بیایین پرچم اینتراپت ها رو چک کنین ببینین اینتراپت کدوم ماژول رخ داره که برنامه ی متناسب با اون رو اجرا کنه
  9. #9
    2013/04/06
    yazd
    996
    88

    پاسخ : interrupt در mplab

    جناب اقاي مرادي خيلي ممنون از اينكه پاسخ دادين من تو مثال زير اومدم و هر دو وقفه مربوط به تايمر صفر و يك را فعال كردم و فرض ميكنم كه اولويت وقفه اينجا مطرح نيستش اما زمانيكه برنامه را ديباگ ميكنم و در اينجا تايمر يك زودتر سر ريز ميشه و تو سرويس روتين هر دو وقفه اومدم و پرچمها را چك ميكنم اما موققع ديباگ نمودن وقتي تايمر يك سريز شد و درخواست وقفه ميده ميپره روي تابع اولي كه مربوط به تايمر صفر است و چون شرط پرچم اين تايمر صدق نميكنه وارد تابع نميشه اما داخل همين تابع دايما دور ميزنه و به Void بعدي كه مربوط به تايمر يك است نميرود تا شرط را بررسي كنه چرا دليلش چيه؟
    اما اگر تايمر صفر را حالت low_priority اضافه كنم مشكلم حل ميشه ممكنه كمكم كنيد چون در حالت اولويت يكسان براي تمام وقفه هم بايد درست كار كنه درسته؟
    نمونه كد داخل شكل زير امده است

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

  10. #10
    2018/01/19
    زیاران
    15
    8

    پاسخ : interrupt در mplab

    نقل قول نوشته اصلی توسط mostafa6369

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    جناب اقاي مرادي خيلي ممنون از اينكه پاسخ دادين من تو مثال زير اومدم و هر دو وقفه مربوط به تايمر صفر و يك را فعال كردم و فرض ميكنم كه اولويت وقفه اينجا مطرح نيستش اما زمانيكه برنامه را ديباگ ميكنم و در اينجا تايمر يك زودتر سر ريز ميشه و تو سرويس روتين هر دو وقفه اومدم و پرچمها را چك ميكنم اما موققع ديباگ نمودن وقتي تايمر يك سريز شد و درخواست وقفه ميده ميپره روي تابع اولي كه مربوط به تايمر صفر است و چون شرط پرچم اين تايمر صدق نميكنه وارد تابع نميشه اما داخل همين تابع دايما دور ميزنه و به Void بعدي كه مربوط به تايمر يك است نميرود تا شرط را بررسي كنه چرا دليلش چيه؟
    اما اگر تايمر صفر را حالت low_priority اضافه كنم مشكلم حل ميشه ممكنه كمكم كنيد چون در حالت اولويت يكسان براي تمام وقفه هم بايد درست كار كنه درسته؟
    نمونه كد داخل شكل زير امده است

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    من زیاد با کامپایلر xc8 کار نکردم و با ccs کد میزنم و زیاد از xc8 سر در نمیارم.
    اگه از CCI syntax استفاده کنید باید مشخص کنید که تابعی که نوشتید اینتراپت اولویت بالا هست یا پایین(این کار فقط برای سری 8 بیتی PIC18 هست) اگر هم مشخص نکنید کامپایلر به صورت دیفالت اولویت بالا رو در نظر میگیره. توی همه ی PIC ها (8-bit) یک بردار وقفه هست و در PIC18 ها دو بردار وقفه وجود داره که دارای اولویت است، اولویت بالا و پایین. البته وقتی CCI syntax روشن باشه به جز این باید توی تعریف تابع اینتراپت یه نکاتی رو رعایت کنید.
    خوب شما اینتراپت هایی که تعریف کردید هر دو توی اولویت بالا هست پس لازم نیست توی 2 تا تابع جدا گنه کد ها رو بنویسید و وقتی اینتراپت تایمر 1 هم رخ بده میکرو میره از آدرس اولویت بالا شروع میکنه دستورات رو اجرا میکنه به خاطر همین هم اول دستورات تایمر 0 رو اجرا میکنه .
    شما میگین که توی تابع دور میزنه . شما که دستور شرطی نوشتید فقط باید یک بار اجرا کنه . شاید به خاطر اینکه برای یک اولویت دو تا تابع نوشتین خطا رخ میده . اگه شما بیاید از روی دستورات اسمبلی تولید شده رو تو ذهن خودتون اجرا کنین خیلی سریع به اشکال برنامه پی میبرید

    این کدی که بر اساس CCI syntax نوشته شده
    void __interrupt(high_priority) timers_isr(void)
    {
    if (TMR0IE && TMR0IF) { // any timer 0 interrupts?
    TMR0IF=0;
    //your code
    }
    if (TMR1IE && TMR1IF) { // any timer 1 interrupts?
    TMR1IF=0;
    //your code
    }
    // process other interrupt sources here, if required
    return;
    }


    این کد رو یک بار تست کنید احتمالا درست کار کنه
    ویرایش توسط M. Moradi : 2019/06/10 در ساعت 11:42
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 13

موضوعات مشابه

  1. nested interrupt در AVR
    توسط mori64 در انجمن میکروکنترلرهای AVR
    پاسخ: 5
    آخرين نوشته: 2014/06/22, 14:10
  2. interrupt
    توسط koroush.badi در انجمن XMEGA
    پاسخ: 4
    آخرين نوشته: 2013/12/16, 07:45
  3. at 91 sam7x interrupt
    توسط imanhelmi در انجمن ATMEL
    پاسخ: 15
    آخرين نوشته: 2013/10/09, 17:26
  4. adc مد Interrupt
    توسط mohsen.hex در انجمن NXP
    پاسخ: 1
    آخرين نوشته: 2013/07/30, 15:02

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •