قسمت نهم: وقفه خارجی (EXTI)

قسمت نهم: وقفه خارجی (EXTI)

قسمت نهم: وقفه خارجی (EXTI)
قسمت نهم: وقفه خارجی (EXTI)

سیسوگ در قسمت هشتم  آموزش میکروکنترلر STM8 سیستم کلاک میکروکنترلر را آموزش داد. در این قسمت از آموزش میکروکنترلر STM8 قصد دارد وقفه خارجی را توضیح دهد. با سیسوگ همراه باشید.

وقفه خارجی یکی از ویژگی های اضافه شده به GPIO ها در حالت ورودی است. که باعث می‌شود میکروکنترلر روال فرآیندهایش را متوقف کند و به تغییرات اعمالی در پین‌های ورودی توسط event ها یا trigger ها پاسخ فوری بدهد. در بسیاری از موارد استفاده از وقفه خارجی سودمند است. به عنوان مثال، دکمه اضطراری موجود روی تردمیل را در نظر بگیرید. شما با سرعت زیاد در حال دویدن هستید که ناگهان مچ پایتان درد می‌گیرد. مطمئناً شما در این حالت میخواهید بلافاصله متوقف شوید، به جای کاهش سرعت به صورت مرحله به مرحله، می‌توانید دکمه اضطراری را بزنید تا تردمیل سریعاً متوقف شود. دکمه اضطراری تمام فرآیندهای دیگر را متوقف می‌کند و بلافاصله به CPU تردمیل دستور می‌دهد تا سرعت را سریع‌تر از حد امکان تغییر دهد. در واقع اولویت آن بالاتر از سایر فرآیندها می‌باشد.

اکثر میکروکنترلرهای 8 بیتی، پین‌های وقفه خارجی کمی دارند و دارای محدودیت هستند، اما چنین محدودیتی برای میکروکنترلر‌های STM8 وجود ندارد. در STM8، تقریباً تمامی پین‌های GPIO دارای قابلیت وقفه خارجی با ورودی اشمیت تریگر هستند. علاوه بر این، کنترل کننده وقفه برای تعیین اولویت وقفه‌ها وجود دارد.

وقفه خارجی میکروکنترلر STM8

وقفه خارجی میکروکنترلر STM8

اتصالات سخت افزاری

اتصالات سخت افزاری وقفه خارجی میکروکنترلر STM8

اتصالات سخت افزاری وقفه خارجی میکروکنترلر STM8

نمونه کد وقفه خارجی

همان LED ای که در مثال GPIO استفاده کردیم را در اینجا نیز مجدداً استفاده می‌کنیم، اما این بار از سوئیچ به عنوان وقفه خارجی استفاده می‌کنیم. اکنون باید ببینیم که چگونه باید وقفه خارجی را پیکربندی و کدگذاری کرد. این کد با تمام چیزهایی که قبلاً دیده اید متفاوت است و نیاز به توجه بیشتری دارد. چون بر خلاف کامپایلرهای دیگر شما باید گام‌های خاصی را بردارید. در دیگر کامپایلرها، تنها چیزی که انجام میدادیم این بود که تابع وقفه را ایجاد کنیم و آدرس بردار وقفه را به کامپایلر بدهیم. در اینجا علاوه بر این کار مراحل دیگری را نیز باید انجام دهیم.

جدول بردار وقفه برای STM8S003 در زیر نشان داده  شده است:

جدول بردار وقفه برای STM8S003

 

این جدول را می‌توانید در دیتاشیت آی سی نیز پیدا کنید. این جدول برای هر آی سی متفاوت است پس مطمئن شوید که دیتاشیت آی سی مورد نظر خود را دریافت کرده‌اید. از آنجا که ما قصد داریم سوئیچ را به PB5 وصل کنیم پس باید از  IRQ4 ، وقفه خارجی PORTB یا EXTI1 استفاده کنیم. تمام وقفه‌های خارجی روی پین‌های GPIOB در این آدرس قرار گرفته است.

main.c

stm8_interrupt_vector.c

 

حالا قسمت‌های بالای فایل‌های stm8s_it.h و stm8s_it.c را چک کنید.

stm8s_it.h

 

stm8s_it.h

stm8s_it.c

 

stm8s_it.c

کد شما باید به صورت بالا نوشته شده باشد.

توضیح

اکثر قسمت‌های کد همانند کدهای قبلی هستند، بنابراین از توضیح آن‌ها می‌گذریم. با این حال، چیزی جدید وجود دارد:

 

این قسمت از کد جایی است که وقفه خارجی را تنظیم می‌کنیم. دو خط اول، کنترل کننده وقفه را پیکربندی می‌کند و اولویت‌ها را در زمان شروع تعیین می‌کند. این قسمت اجباری نیست مگر اینکه شما قصد داشته باشید برای وقفه‌های کد خود اولویت قرار دهید. سپس وقفه‌های خارجی را روی پین‌های PORTD پیکربندی می‌کنیم. هم چنین تنظیم می‌کنیم که وقفه با لبه فعال شود.

حال وقت آن رسیده تا فایل stm8_interrupt_vector.c را توضیح دهیم. قسمت بالای این فایل باید شامل خط #include “stm8s_it.h”  باشد. همچنین باید بخش زیر را در نظر داشته باشید:

 

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

 

 

در این قسمت راجب وقفه خارجی صحبت کردیم. در قسمت دهم آموزش میکروکنترلر STM8 سیسوگ قصد دارد، برنامه ای با استفاده از بیپر (Beeper) را آموزش دهد. با سیسوگ همراه باشید.

 

منبع

لینک‌های دانلود

مطالب مرتبط

 

 

حمایت از electronic girl

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

electronic girl
electronic girl

دوستدار الکترونیک

دیدگاه ها

30 دیدگاه

  • محمد
    ۲۵ فروردین ۱۴۰۱

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

  • محمد
    ۲۵ فروردین ۱۴۰۱

    سلام.آقا شما جایتون توبهشت هس به نظرمن چون با این کار زیبا که دارید به مردم رایگان آموزش میدین واگه بدونین این کارشما چقد خوبه هیچوقت متوقفش نمیکنید.به نظرمن آدم با نمازو دعا این دری وری ها بهشت نمیره وگرنه تمام مردم دنیا بایدبرن جهنم فقط مابریم بهشت چون نمازمیخونیم آدم چقدجاهل باشه.براتون آرزوی سلامتی دارم.فقط خواهشن درمورد تردمیل برنامه کامل بزارید.مرسی

    • Zeus ‌
      Zeus ‌
      ۲۷ فروردین ۱۴۰۱

      متشکرم دوست عزیز
      نظر لطف شماست، ما سعیمون رو میکنم که این مسیر رو ادامه بدیم ولی ادامه راه نیاز به همراهی و کمک دوستان داریم
      بزرگترین کمکی که میتویتد به ما بکنید اینه که ما رو به دوستان خودتون معرفی کنید 🙂

  • معین
    ۲۰ شهریور ۱۴۰۰

    سلام و وقت بخیر
    ممنون میشم یه توضیحی در خصوص تفاوت وقفه و رویداد بدهید

    • Zeus ‌
      Zeus
      ۲۱ شهریور ۱۴۰۰

      سلام دوست عزیز
      فکر نمیکنم تفاوت خاصی داشته باشن و هر دو یک مفهموم رو می رسونن 🙂

  • reza
    ۱۱ اسفند ۱۳۹۹

    با سلام من با روش رجیستری اولویت وقفه هارو تنظیم میکنم ولی انگار که انگار! جواب نمیده
    مثلا در کد زیر من میخوام وقتی وارد وقفه اول شده که توش while(1); نوشتم چراغ بتونه چشمک بزنه چرا که میخوام وقفه تو در تو بتونه اتفاق بیفته
    ولی جواب نمیده و هنگ می کنه
    #include
    #include

    int main( void )
    {

    CLK_CKDIVR_HSIDIV=1;
    PA_DDR_DDR3=1;
    PA_CR1_C13=1;

    TIM2_CR1_CEN=0;
    TIM2_IER_UIE=1;
    TIM2_CNTRH=0;
    TIM2_CNTRL=0;
    TIM2_PSCR=6;
    TIM2_ARRH=0xff;
    TIM2_ARRL=0xff;
    TIM2_CR1_CEN=1;

    PD_DDR_DDR4=0;
    PD_CR2_C24=1;
    EXTI_CR1_PDIS=1;

    __enable_interrupt();
    while(1);

    }

    #pragma vector=TIM2_OVR_UIF_vector
    __interrupt void timer2_isr(void){
    PA_ODR_ODR3^=1;

    TIM2_SR1_UIF=0;

    }

    #pragma vector=EXTI3_vector
    __interrupt void exti0_isr(void){
    while(1);

    }

  • saeed
    ۲۲ آذر ۱۳۹۹

    باسلام و عرض وقت بخیر و تشکر
    سوالی از محضرتون داشتم اونم اینکه من بعد از BUILD کردن برنامه به یه اروری میخورم که میگه symbol f_NonHandledInterrupt multiply defined (Debug\stm8s_it.o) به این معنی که یک تابع با اسم مذکور رو چندبار تعریف کردم ولی خب درست بم گرا نمیده که بدونم دقیقا کجا اضافه تعریف شده
    ممنون میشم اکر راهنماییم کنین

    • Zeus ‌
      زئوس Zeus
      ۲۰ دی ۱۳۹۹

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

  • VHD
    ۲۳ مهر ۱۳۹۹

    سلام
    فکر کنم وقفه اشتباه نوشته شده در “main.c” و “stm8s_it.c”

  • VHD
    ۲۲ مهر ۱۳۹۹

    سلام
    خیلی ممنون از مطالب خوبتون
    فقط یک نکته هست…
    فایل سورس و هدری به نام stm8s_it.c و stm8s_it.h که در پوشه های SPL وجود نداره!!!
    بجاش stm8s_itc.c و stm8s_itc.h هست که اونا هم فرق دارن با مثال 🙁

  • محمدرضا
    ۱۴ مرداد ۱۳۹۹

    سلام وقت بخیر
    برای دو تا کلید که به دوتا از پین های پورت A و B میکرو Stm8s وصل کردم اینتراپت تعریف کردم. تنظیمات مربوط به رجیستری GPIO و EXTI رو به طور کامل نوشتم . برنامه اینتراپت هم یک Blink ساده است.
    با زدن دکمه ها اینتراپ ها کار میکنه و ال ای دی ها روشن و خاموش میشن ولی به محض اتمام برنامه اینتراپت ، میکرو ریست میکنه!منظور اینکه اینتراپت اجرا میشه ولی میکرو ریست میکنه. ممنون میشم راهنمایی کنید.

    • Zeus ‌
      زئوس Zeus
      ۱۸ شهریور ۱۳۹۹

      این مساله میتونه به دلیل کم بودن استک اینتراپت باشه و این که بعد از تمام شدن اینتراپت cpu نتونه مسیر برگشت به برنامه اصلی رو پیدا کنه

      • فرید
        ۱۷ آبان ۱۴۰۰

        خب یعنی چه کار باید کرد؟

        • Zeus ‌
          Zeus ‌
          ۲ مرداد ۱۴۰۱

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

    • فرید
      ۱۷ آبان ۱۴۰۰

      سلام منم دقیقا همین مشکل رو دارم اگر مشکلتونو حل کردین به منم بگین چجوری حل شد؟

  • فدا
    ۱۵ اردیبهشت ۱۳۹۹

    سلام این کتابخانه stm8s_it. را از کجا اوردید و کارش چیه توی spl نبود برنامه بدون اینها کامپایل میشه بدون خطا ولی وقفه جواب نداد

    • Zeus ‌
      زئوس Zeus
      ۲۷ اردیبهشت ۱۳۹۹

      اینو خودتون ایجاد میکیند
      فکر میکنیم سمپلش رو بتونید توی مثال های خود کتابخانه پیدا کنید.
      کارش هم اینه که روال وقفه رو توش تعریف میکنید – وجودش الذامی نیست و میتونید روال های مروبط به وقفه رو توی فایل مین هم تعریف کنید.

  • حسین
    ۸ اسفند ۱۳۹۸

    سلام وقت بخیر
    بنده تمام موارد رو اجرا کردم و یک کد کوچیک با led و اینتراپت نوشتم که وقتی اینتراپت میخوره ال ای دی روشن بشه و داخل وایل اگر فلگ داخل اینتراپت یک شده بود ، کمی صبر کنه و خاموش کنه. اما مشکل اینجاست که به محض اینتراپت خوردن ، ال ای دی سریع روشن میشه (اینتراپت اجرا میشه) و میکرو ریست میکنه!! (ابتدای کد یک تعدادی چشمک زن گذاشتم و مطمئن هستم میکرو ریست میشه.) لازم به ذکره که تایمر ،adc و gpio عادی رو راه انداختم بدون مشکل اما اینتراپت خیلی اذیت میکنه. (البته در این کد خبری از تایمر و adc نیست)

    • Nasim Hematian
      electronic girl
      ۱۱ اسفند ۱۳۹۸

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

    • محمد
      ۸ مرداد ۱۳۹۹

      سلام منم به همین مشکل برخورد کردم. چطوری میشه رفعش کرد؟

      • Zeus ‌
        زئوس Zeus
        ۱۸ شهریور ۱۳۹۹

        آیا واچ داگ فعال نیست ؟ یکی از احتمال های اینه که واچ داگ فعال باشه
        برنامه نویسی اصولی میگه شما نباید برنامه تان رو در وقفه متوقف کنید یکی از دلایل میتونه این باشه
        دلیل دوم میتونه پر شدن استک باشه (استک مروبط به اینتراپت) دلیل دیگه میتونه پاک نکردن فلگ اینتراپت باشه

  • Winiston ZZZ
    Winiston ZZZ
    ۲۶ تیر ۱۳۹۸

    با سلام
    با ارور : ?ASlink-Warning-Undefined Global ‘_EXTI_SetTLISensitivity’ referenced by module ‘main’
    make: *** [makefile:56: main] Error 1
    “make all” terminated with exit code 2. Build might be incomplete.
    مواجه میشوم

    • Winiston ZZZ
      Winiston ZZZ
      ۲۶ تیر ۱۳۹۸

      22:07:32 **** Incremental Build of configuration Default for project STM8 ****
      make all
      sdcc -c -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug -obin/StdPeriphLib/src/ StdPeriphLib/src/stm8s_clk.c
      sdcc -c -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug -obin/StdPeriphLib/src/ StdPeriphLib/src/stm8s_gpio.c
      sdcc -IStdPeriphLib/inc -DUSE_STDPERIPH_DRIVER -mstm8 -Ddouble=float –std-c99 –nolospre –opt-code-size –out-fmt-ihx –debug main.c -o bin/ bin/StdPeriphLib/src/stm8s_gpio.rel bin/StdPeriphLib/src/stm8s_clk.rel

      ?ASlink-Warning-Undefined Global ‘_ITC_DeInit’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_EXTI_SetExtIntSensitivity’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_EXTI_DeInit’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_ITC_SetSoftwarePriority’ referenced by module ‘main’

      ?ASlink-Warning-Undefined Global ‘_EXTI_SetTLISensitivity’ referenced by module ‘main’
      make: *** [makefile:56: main] Error 1
      “make all” terminated with exit code 2. Build might be incomplete.

      22:07:33 Build Failed. 1 errors, 0 warnings. (took 1s.535ms)

      • Zeus ‌
        زئوس Zeus
        ۲۹ تیر ۱۳۹۸

        سلام دوست عزیز
        خطاهایی که مواجه شدید به این معنی است که از توابعی استفاده کردید که توی فایل های پروژه تعریفی برای اون وجود نداره ؛ الان داره میگه که مثلا ‘_ITC_DeInit’ تایعی رو که توی مین برنامه مورد استفاده قرار دادید ؛ هیچ کجا دیفاین نشده و هیچ تعریفی براش پیدا نمیکنه

  • zeos
    ۱۶ بهمن ۱۳۹۷

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

    • Sisoog Os
      Sisoog OS
      ۱۶ بهمن ۱۳۹۷

      ممنون از نظر شما
      این اولین نظر به این تندی در حدود یکسال کاری سیسوگ هست 🙂
      و به جرات میتونم بگم شاید دو مطلب در کل سایت داریم که قسمتهایی از اون کپی شدند که دقیقا هم اشاره شده
      خیلی از محتواهای ایجاده شده هم عملی تست شده اند و اکثر آموزش میکروکنترلر STM8 دقیقا تست شده که میتونید حتی نمونه بردهای تست شده را هم در زیر برخی از پست ها ببنید

      بسیاری از مطالب وب سایت هیچ نمونه حتی خارجی ندارند و خیلی از اونها هم دقیقا ایجاد شده اند

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

    • FireFly_tw
      ۶ اسفند ۱۳۹۸

      این آموزشتون واقعا ترجمه ناقص و ایراد داری هستش، لطفا اصلاحش کنید
      منبع اصلی تصاویر و آموزش هم لینک زیر هستش
      http://embedded-lab.com/blog/starting-stm8-microcontrollers/10/

      • Zeus ‌
        زئوس Zeus
        ۱۰ اسفند ۱۳۹۸

        همین لینک که به عنوان منبع ذکر شده 😐 انتهای مطلب رو اگر ببینید
        بررسی میکنیم
        ممنون برای پیگیری موضوع

        • FireFly_tw
          ۱۳ اسفند ۱۳۹۸

          عذرخواهی میکنم بابت لحن تندم
          منبع رو ندیده بودم
          متشکرم

          • Nasim Hematian
            electronic girl
            ۱۴ اسفند ۱۳۹۸

            خواهش میکنم 😐

            0

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک