اطلاعیه

Collapse
No announcement yet.

یه سوال در مورد بازگشت از ISR (بیسیک)

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

    یه سوال در مورد بازگشت از ISR (بیسیک)

    با سلام
    آقا چطوری میشه بعد از بازگشت از زیر برنامه به جای این که میکرو به آدرسی که از اونجا پرش کرده بره به یه آدرسی که براش تعریف میکنیم بره.
    مثلاً وقتی وقفه تایمر خورد و زیر برنامش اجرا شد دیگه به اون آدرسی که ازش اومده بر نگرده و به یه آدرس دیگه بره و از اونجا شروع به اجرای برنامه کنه.
    این کار رو با 8051 انجام دادم اما با AVR نه.
    کسی تا به حال این کار رو کرده؟
    گیرم گلاب ناب شما اصل قمصر است/اما چه سود، حاصل گلآ‌های پرپر است!-از آن زمان که آیینهآ‌گردان شب شُدید*آیینه دل از دَم دوران مکدر است-وقتی بهار، وصله ناجور فصلآ‌هاست*وقتی تبر، مدافع حق صنوبر است-وقتی به دادگاه عدالت، طناب دار*بر صدر میآ‌نشیند و قاضی و داور است-از من مخواه شعرِ تر، ای بیآ‌خبر ز درد!*شعری که خون از آن نچکد ننگ دفتر است!-ای از تبار هرچه سیاهی، سرشتآ‌تان*رنگ جهنم است تمام بهشتآ‌تان
    "گزیده ابیاتی چند از بیداد خراسانی"

    #2
    پاسخ : یه سوال در مورد بازگشت از ISR (بیسیک)

    این کار فکر نکنم با دستورات بیسیک بشه ولی با اسمبلی و فقط برای توابع (نه وقفه ها) امکان پذیره به این ترتیب که شما قبل از فراخانی برنامه ادرس اون خط از برنامه که میخوای برگرده توی پشته قرار میدی به این صورت
    ldi r16,low(2*lable1)
    push r16
    ldi r16,high(2*lable1)
    push r16


    lable1:

    خوب حالا داخل زیر برنامه کافیه که دو بایت pop کنی تا ادرس برگشت واقعی از پشته حذف بشه و ادرسی که خودت توی پشته قرار دادی به عنوان ادرس برگشت در نظر گرفته بشه به همین سادگی دقت کن که lable1: برچسب اون خطیه که میخوای از زیر برنامه به اون برگردی :nice:


    Qt - A cross-platform application and UI framework

    با کامپایلرهای قدرتمند GCC در Linux و MinGw در Windows

    دیدگاه


      #3
      پاسخ : یه سوال در مورد بازگشت از ISR (بیسیک)

      با سلام
      وتشکر از شما دوست عزیز
      من با 8051 به زبان اسمبلی دقیقاً همین کار رو کرده بودم (خواندن آدرس درون پشته و...) ولی توی avr نمیدونم دستورات اسمبلیش چطوریه.
      میشه برنامه ای که گذاشتین رو توضیح بدین.
      متشکرم.
      گیرم گلاب ناب شما اصل قمصر است/اما چه سود، حاصل گلآ‌های پرپر است!-از آن زمان که آیینهآ‌گردان شب شُدید*آیینه دل از دَم دوران مکدر است-وقتی بهار، وصله ناجور فصلآ‌هاست*وقتی تبر، مدافع حق صنوبر است-وقتی به دادگاه عدالت، طناب دار*بر صدر میآ‌نشیند و قاضی و داور است-از من مخواه شعرِ تر، ای بیآ‌خبر ز درد!*شعری که خون از آن نچکد ننگ دفتر است!-ای از تبار هرچه سیاهی، سرشتآ‌تان*رنگ جهنم است تمام بهشتآ‌تان
      "گزیده ابیاتی چند از بیداد خراسانی"

      دیدگاه


        #4
        پاسخ : یه سوال در مورد بازگشت از ISR (بیسیک)

        هیچی دیگه چیز دیگه ای نداره فقط یه برچسب برای اون خطی که می خوای به اون برگردی می زاری این برچسب در واقع یه ادرس 2 بایتی است دقت کن که اول high بایت push میشه بعد low بایت
        در واقع میکرو هم برای رفتن به یه subrotin( یا همون تابع زبان سطح بالا) دقیقا همین کار رو میکنه و ادرس برگشت رو به صورت 2 بایت توی پشته ذخیره میکنه که تو با ورود به subrotin اونها رو از پشته برمیداری و در نتیجه ادرسهایی که تو Push کردی به عنوان ادرس برگشت از پشته Pop میشه


        این یه مثال ساده assmbly که این مطلبو نشون میده میتونی توی isis دیباگ کنی و ببینی که بعد از خروج از sub2 (با دستور ret) به جای اینکه به بعد از فراخوانی برگرده به اون ادرسی که تو پشته قرار میدیم برمیگرده

        فکر کنم دیگه کاملا فهمیده باشی

        .include "m16def.inc"

        ldi r16,low(ramend)
        out spl,r16
        ldi r16,high(ramend)
        out sph,r16

        rjmp while1




        ;;;;;;;;;;;;;;;;;;;;;;;
        sub1: ;; in sub1

        pop r17
        pop r17


        nop
        nop
        nop

        ret ;payane subrotin
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;
        nop
        nop
        nop




        lable: ;;lable
        nop
        nop
        nop


        while1:

        nop
        nop

        ldi r16,low(lable)
        push r16
        ldi r16,high(lable)
        push r16


        rcall sub1


        rjmp while1


        اگه اینو نمیفهمی این هم یه مثال با زبون سطح بالا(اگه کدویژن داری کامپایلش کن و یه lcd به PORTC وصل کن و نتیجه رو خودت ببین)


        /************************************************** ***
        This program was produced by the
        CodeWizardAVR V1.24.4 Standard
        Automatic Program Generator
        © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
        http://www.hpinfotech.com
        e-mailffice@hpinfotech.com

        Project :
        Version :
        Date : 8/12/2008
        Author : sally
        Company : sr
        Comments:


        Chip type : ATmega16
        Program type : Application
        Clock frequency : 3.686400 MHz
        Memory model : Small
        External SRAM size : 0
        Data Stack size : 256
        ************************************************** ***/

        #include <mega16.h>
        #include <delay.h>
        // Alphanumeric LCD Module functions
        #asm
        .equ __lcd_port=0x15 ;PORTC
        #endasm
        #include <lcd.h>

        // Declare your global variables here

        void sub1(void)
        {
        #asm
        pop r16
        pop r16
        #endasm

        lcd_clear();
        lcd_putsf("daroone subrotin"
        delay_ms(1000);

        }
        ///////////////////////////////////////
        void main(void)
        {

        PORTA=0x00;
        DDRA=0x00;

        PORTB=0x00;
        DDRB=0x00;

        PORTC=0x00;
        DDRC=0xFF;

        PORTD=0x00;
        DDRD=0x00;


        #asm
        lable1:
        #endasm

        lcd_clear();
        lcd_putsf("bargash az subrotin"
        delay_ms(1000);



        lcd_init(16);

        while (1)
        {
        #asm
        ldi r16,low(lable1) ;push low byte address
        push r16
        ldi r16,high(lable1) ;push high byte address
        push r16

        #endasm

        sub1(); //invoke subrotin


        lcd_clear();
        lcd_putsf("bad az farakhani"
        delay_ms(1000);

        };
        }









        Qt - A cross-platform application and UI framework

        با کامپایلرهای قدرتمند GCC در Linux و MinGw در Windows

        دیدگاه

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