اطلاعیه

Collapse
No announcement yet.

زیر روال وقفه در اتمل استادیو

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

    زیر روال وقفه در اتمل استادیو

    سلام
    برای اینکه زیر روال های وقفه مثلا تایمر بخواهیم بنویسیم باید از کجا ببینیم که چی بنویسیم
    داخل راهنما خودش چیزی نبود
    مثلا من وقفه دریافت سریال میخوام فعال کنم . چی بنویسم . داخل کدوم تابع نوشته که چی باید بنویسم ؟؟
    مثلا برای تایمر 0 مینویسیم

    ISR(TIMER0_OVF_vect)
    {
    ++PORTC; /* Toggle PORTC */
    TCNT0=0x00;
    }


    خوب این TIMER0_OVF_vect کجا تعریف شده ؟؟؟
    جدیدترین ویرایش توسط sepehr63; ۱۴:۰۵ ۱۴۰۱/۰۹/۲۹.

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

    دوست عزیز سوالت یه مقدار نا مفهومه ،

    داخل زیر روال وقفه اون کاری که باید انجام بشه رو مینویسیم ( اصلش رو بخوای پردازنده ها اساسا غیر از رسیدگی به این وقفه ها نباید درگیر هیچ کار دیگری باشن )

    نکته اول : اینتراپتها برای آزادسازی منابع سیستم و واکنش تقریبا بلادرنگ به اتفاقات استفاده میشن
    نمته دوم حین برنامه نویسی به شکل اینتراپتی تا حد ممکن زیر روال وقفه باید کوتاه باشه و کمترین تاخیر رو در روند کاری سیستم ایجاد کنه .
    در سیستمهای avr روند کلی رسیدگی به پروستیژر وقفه اینجوریه که : بدلیل محدودیت استک وقتی یک وقفه اتفاق میفته باید وقفه های فعال دیگه رو موقتا غیر فعال کنید ، به وضعیت وقفه رخ داده رسیدگی کنید ، بعد از اتمام کار مجددا وقفه هایی که اول کار غیر فعال شده بودن رو فعال کنید .


    مثال برای پورت سریال

    void USART_Init()
    {
    //Set baud rate
    UBRRL=UBRRVAL; //low byte
    UBRRH=(UBRRVAL>>8); //high byte
    //Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
    UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
    (0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
    //Enable Transmitter and Receiver and Interrupt on receive complete
    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
    //enable global interrupts
    set_sleep_mode(SLEEP_MODE_IDLE);
    sei();
    }
    ISR(USART_RXC_vect)
    {
    //defien temp value for storing received byte
    uint8_t Temp;
    //Store data to temp
    Temp=UDR;
    Temp++;//increment
    //send received data back
    // no need to wait for empty send buffer
    UDR=Temp;
    }
    int main(void)
    {
    USART_Init();
    while(1)
    sleep_mode();
    //nothing here interrupts are working
    return 0;
    }

    چرا باید از وقفه استفاده کنیم ؟ چون یک پریفرال بسیار کند هست و میخواهیم مثلا یک بایت اطلاعات از پورت سریال بخونیم یا ارسال کنیم بدون سیستم اینتراپتی مجبوریم تمام وقت فلگهای دریافت و ارسال پورت سریال رو چک کنیم تا اگر دیتایی دریافت شده بود یا ترانسفر کامپلت شده بود بقیه ماجرا رو ادامه بدیم .
    بسته به کلاک سی پی یو و باوودریت پورت سریال این روند چندصذ تا چند هزار سیکل کلاک برای هر یک بایت منابع سیستم رو درگیر میکنه و سی پی یو ما عملا زیر بار ۱۰۰٪ تمام وقت قرار میگیره که میخواستیم یک بایت دیتا بگیریم با بفرستیم .
    یرنامه نویسی اصولی به این شکله که سی پی به شکل پیش فرض در حال انجام هیچ کاری نیست و دائم در حالت اسلیپه ، اگر اینتراپت یا ایونتی داشته باشیم از اسلیپ خارج میشه به رویداد رخ داده رسیدگی میکنه و مجددا به حالت اسلیپ میره ، اینطوری مصرف توان و منابع درگیر سیستم حداقلی میشه ( بر خلاف روند عمومی که در برنامه نویسی آموزش میدن و منابع دائم درگیر یک یا چند چیز هستن )

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

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

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

    اون بخش ISR اینتراپت سرویس روتین هست ( قانون نانوشته اینه که درسته الزامی برای کار کردن به شکل اسمبلی نیست ولی خیلی فانکشنها و روتین ها و تنظیمات و کار با رجیسترهای پریفرالها عملا اسمبلی هستن و بهتره تا حدودی اسمبلی بلد باشید وگرنه در عمل با این نوع دستورات به مشکل خواهید خورد ) ، timer0.ovf_vec پوینتر بردار سرریز وقفه تایمر صفره . این پوینتر در واقع اشاره گر به یک آدرسه که اگر از روش اشاره گر استفاده نکنیم مجبور میشید آدرس رجیستر مد نظر و بیت هاش رو مستقیم بنویسید که از نظر رابط کاری انسان و ماشین کارکردن با این طرز آدرسدهی سخته و احتمال اشتباه توش زیاده ( در اسمبلی بجای استفاده از پوینتر معمولا مستقیم با رجیسترها کار میکنیم که در برنامه نویسی یکم بالاتر از سطح آماتوری و کار کردن مستقیم با رجیسترها مجبوریم به شکل ترکیبی اسمبلی کار کنیم )
    جدیدترین ویرایش توسط Amie.s.m; ۱۸:۲۱ ۱۴۰۱/۰۹/۲۹.

    دیدگاه


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

      درسته نامفهوم نوشتم
      سوال من اینه برای تعریف وقفه در اتمل استادیو اگه بخوام وقفه تایمر 1 تعریف کنم داخل پرانتز ISR چی بنویسم .
      شما برای پورت سریال نوشتید USART_RXC_vect
      خوب این دستور کجای اتمل استادیو نوشته تعریف شده چون نیاز به تعاریف دیگه برای وقفه ها دارم
      مثلا اینتراپت خارجی
      یا ADC
      یا بقیه تایمرها
      یا کانترها (این جور که فهمیدم تعریف وقفه کانتر با تایمر فرق داره )
      داخل تابع
      interrupt.h نبود

      دیدگاه


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

        وقفه ها و بردارهای وقفه توی دیتاشیت تعریف شدن .
        کامپایلرها این بردارها رو با اسامی مشابه دیتاشیت توی هدرهای راه انداز میکرو ( هدر interrupt.h ) نوشتن .

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

        در میکروهای avr کل اینتراپتهایی که داریم یک لیست خیلی کوتاهه که چند ساعت کد نویسی کنید تقریبا کلش رو حفظ میشید ولی علی ایحال لیست کامل اینتراپتهای avr شامل این موارده


        دیدگاه

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