اطلاعیه

Collapse
No announcement yet.

تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

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

    تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

    دوستان من میخام وقتی که پایه int7 تحریک شد و وقفه رخد داد ، برم دوباره از main شروع کنه برنامه ، این اتفاق میاوفته با تحریک int7 ولی وقتی که int زده میشه ، تایمر صفر به شمارش خودش ادامه میده ، ولی دستورات در بچسب تایمر صفر انجام نمیشه ، چیکار کنم که دستوارات برچسب تایمر صفر با سرریز شدن انجام بشه؟؟
    البته تا اونجایی که من فهمیدم دلیلش اینه که return مربوط به int7 رخ نمیده ، بخاطر همینه که کد تایمرصفر انجام نمیشه.
    حالا من باید چیکار کنم که تداخل نداشته باشن؟؟؟
    کد:
    $regfile = "m64def.dat"
    $crystal = 8000000
    
    
    Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , _
                 Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
    Config Lcd = 16 * 2
    Waitms 20
    'Cursor Blink
    Cursor Off
    
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Timerr
    Enable Timer0
    Start Timer0
    Config Portd = Output
    
    Config Int7 = Falling
    Enable Int7
    On Int7 Interuuptstop
    Dim A As Byte
    
    
    Declare Sub Main
    '____________________
    
    Sub Main:
    
     Cls
    Locate 1 , 1
    Lcd "hossein"
    
    
    Do
    
    A = Timer0
    Cls
    Lcd A
    Waitms 100
    
    Loop
    
    End Sub
    
    '_________________________
    
    Timerr:
    Toggle Portd
    
    
    
    
    Return
    
    
    '___________________
    Interuuptstop:
    
    Gosub Main
    
    Return


    با تشکر.
    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
    (پيش به سوي هدف)

    #2
    پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

    وقتی سرویس وقفه به پایان نرسه یعنی در کد اسمبلی به reti نرسه فلگ اینتراپت پایین نمیاد...شما از روتین وقفه میپرید به ابتدای برنامه...در حالی که فلگ پایین نیومده و البته enable interrupts هم به disable interrupts تبدیل شده...خب الان در ابتدای برنامه main هستید و درخواست اینتراپت دارید ولی چون که اجازه اینتراپت (interrupt acknowledgement) داده نمیشه برنامه کدهای مربوط به کانفیگ lcd رو انجام میده...به محض اینکه به enable interrupts میرسه سریعا وارد وقفه int0 میشه و دوباره همین اتفاقات تکرار میشه...دواقع وارد یه لوپ بی نهایت میشه...شما باید قبل از پریدن به برنامه main خودتون دستی فلگ اینتراپت رو بیارید پایین...این کار هم با نوشتن عدد 1 روی بیت مربوطه انجام میشه...
    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

    www.intelart.ir


    ساخت کنترلر دما PID فازي با AVR [آموزشی]

    دیدگاه


      #3
      پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

      نوشته اصلی توسط Mahdi.Faani نمایش پست ها
      وقتی سرویس وقفه به پایان نرسه یعنی در کد اسمبلی به reti نرسه فلگ اینتراپت پایین نمیاد...شما از روتین وقفه میپرید به ابتدای برنامه...در حالی که فلگ پایین نیومده و البته enable interrupts هم به disable interrupts تبدیل شده...خب الان در ابتدای برنامه main هستید و درخواست اینتراپت دارید ولی چون که اجازه اینتراپت (interrupt acknowledgement) داده نمیشه برنامه کدهای مربوط به کانفیگ lcd رو انجام میده...به محض اینکه به enable interrupts میرسه سریعا وارد وقفه int0 میشه و دوباره همین اتفاقات تکرار میشه...دواقع وارد یه لوپ بی نهایت میشه...شما باید قبل از پریدن به برنامه main خودتون دستی فلگ اینتراپت رو بیارید پایین...این کار هم با نوشتن عدد 1 روی بیت مربوطه انجام میشه...
      مهدی جان فکرنکنم تداخلی این گونه وجود داشته باشه فرض کن شمادریکی از وقفه هاهستی ادرس خط برنامه سیو می شه و می ره وقفه ی جدید اجرا می شه وبعد برمی گرده توی وقفه ی اصلی فکرنکنم تداخل باعث از کارافتادن وقفه بشه متاسفانه من بسکام نمی دونم ولی توی معماری ریسک تداخل وقفه وجود نداره تااونجایی که من یادمه احتمالا توی کد مشکل دارند ایشون!
      من احتمالی که می دم اینکه شما فلگ وقفه ی تایمر فعال نکردی وفقط تایمرتون پیکره بندی کردید
      Ali Reza Tarkesh Esfahani

      Yahoo: amt_1390@yahoo.com

      دیدگاه


        #4
        پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

        نوشته اصلی توسط Ali Chiefer نمایش پست ها
        مهدی جان فکرنکنم تداخلی این گونه وجود داشته باشه فرض کن شمادریکی از وقفه هاهستی ادرس خط برنامه سیو می شه و می ره وقفه ی جدید اجرا می شه وبعد برمی گرده توی وقفه ی اصلی فکرنکنم تداخل باعث از کارافتادن وقفه بشه متاسفانه من بسکام نمی دونم ولی توی معماری ریسک تداخل وقفه وجود نداره تااونجایی که من یادمه احتمالا توی کد مشکل دارند ایشون!
        من احتمالی که می دم اینکه شما فلگ وقفه ی تایمر فعال نکردی وفقط تایمرتون پیکره بندی کردید
        بله دقیقا...امکان تداخل وجود نداره..ولی معماری AVR طوری هست که وقتی وارد وقفه میشه دستور اسمبلی cli در ابتدای دستورات قرار میگیره...یعنی در حین وقفه انجام دتورات داخل وقفه در حالت دیفالت به وقفه های دیگه رسیدگی نمیشه مگر اینکه خودتون داخل وقفه دستور sei رو اجرا کنید...
        در انتها وقتی میخاد از وقفه خارج بشه دستور reti اجرا میشه یعنی سرویس وقفه به اتمام رسیده و فلگ وقفه مربوطه میاد پایین....

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

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

        ایشون میتونه دوتا کار انجام بده :

        1-اول اینکه یه چیزی شبیه به سمافور در سیستم عامل رو پیاده سازی کنه.یعنی یه متغیر تعریف کنه.مقدارشو اول برنامه بذاره 0...داخل اینتراپت int0 مقدارشو 1 کنه و از اینتراپت خارج بشه (یهو نپره اول برنامه)...داخل حلقه دائمی اصلی برنامه چک کنه که هر وقت مقدار اون متغیر 1 شد پرش کنه به اول برنامه

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

        www.intelart.ir


        ساخت کنترلر دما PID فازي با AVR [آموزشی]

        دیدگاه


          #5
          پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

          نوشته اصلی توسط Mahdi.Faani نمایش پست ها
          بله دقیقا...امکان تداخل وجود نداره..ولی معماری AVR طوری هست که وقتی وارد وقفه میشه دستور اسمبلی cli در ابتدای دستورات قرار میگیره...یعنی در حین وقفه انجام دتورات داخل وقفه در حالت دیفالت به وقفه های دیگه رسیدگی نمیشه مگر اینکه خودتون داخل وقفه دستور sei رو اجرا کنید...
          در انتها وقتی میخاد از وقفه خارج بشه دستور reti اجرا میشه یعنی سرویس وقفه به اتمام رسیده و فلگ وقفه مربوطه میاد پایین....

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

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

          ایشون میتونه دوتا کار انجام بده :

          1-اول اینکه یه چیزی شبیه به سمافور در سیستم عامل رو پیاده سازی کنه.یعنی یه متغیر تعریف کنه.مقدارشو اول برنامه بذاره 0...داخل اینتراپت int0 مقدارشو 1 کنه و از اینتراپت خارج بشه (یهو نپره اول برنامه)...داخل حلقه دائمی اصلی برنامه چک کنه که هر وقت مقدار اون متغیر 1 شد پرش کنه به اول برنامه

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

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          نوشته اصلی توسط Mahdi.Faani نمایش پست ها
          بله دقیقا...امکان تداخل وجود نداره..ولی معماری AVR طوری هست که وقتی وارد وقفه میشه دستور اسمبلی cli در ابتدای دستورات قرار میگیره...یعنی در حین وقفه انجام دتورات داخل وقفه در حالت دیفالت به وقفه های دیگه رسیدگی نمیشه مگر اینکه خودتون داخل وقفه دستور sei رو اجرا کنید...
          در انتها وقتی میخاد از وقفه خارج بشه دستور reti اجرا میشه یعنی سرویس وقفه به اتمام رسیده و فلگ وقفه مربوطه میاد پایین....

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

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

          ایشون میتونه دوتا کار انجام بده :

          1-اول اینکه یه چیزی شبیه به سمافور در سیستم عامل رو پیاده سازی کنه.یعنی یه متغیر تعریف کنه.مقدارشو اول برنامه بذاره 0...داخل اینتراپت int0 مقدارشو 1 کنه و از اینتراپت خارج بشه (یهو نپره اول برنامه)...داخل حلقه دائمی اصلی برنامه چک کنه که هر وقت مقدار اون متغیر 1 شد پرش کنه به اول برنامه

          2- دوم اینکه قبل از پریدن مستقیم به اول برنامه خودش دستی فلگ اینتراپت رو بیاره پایین بعدش بپره اول برنامه.که البته من حالت اول رو ترجیح میدم!
          اقا مهدی این حرفتون اشتباه اتفاقا دستوران وقفه های دیکه در صورت رخ دادن کاملا بررسی می شود

          بانگه داشتن تایمر در وقفه ی سطح می بینیم تایمر شمارش هنوز داره کارخودش انجام می ده!
          Ali Reza Tarkesh Esfahani

          Yahoo: amt_1390@yahoo.com

          دیدگاه


            #6
            پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

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

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

            www.intelart.ir


            ساخت کنترلر دما PID فازي با AVR [آموزشی]

            دیدگاه


              #7
              پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

              نوشته اصلی توسط Mahdi.Faani نمایش پست ها
              شما میگین با تنظیم وقفه در سطح باید مدام روتین وقفه اجرا بشه؟منظورتون اینه؟فکر کنم منظورتون همینه...اگه اینطوریه مفهوم وقفه حساس به لبه و سطح رو متوجه نشدید...اگه حرف شما درست باشه یعنی وقتی در سطح low هستیم مدام وقفه اجرا بشه پس پین مربوطه باید مدام تغییر مقدار بده که در فایل شبیه سازی خودتون هم میبینم که اینطور نیست...

              به نظر شما معنی وقفه حساس به سطح چیه؟
              مهدی جان من معنی حساسیت به سطح بلدم
              این جای کلید یک منبع پالس گذاشتم بافرکانس خیلی بالانسب به تایمر!ولی بازم مشکلی پیش نمیاد
              Ali Reza Tarkesh Esfahani

              Yahoo: amt_1390@yahoo.com

              دیدگاه


                #8
                پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

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

                حساسیت به لبه یعنی اینکه مقدار سیگنال اعمال شده به پین تغییر منطقی کند

                حالا شما برو داخل همون کدی که اول گذاشتی وقفه مربوط به int0 رو اینجوری بنویس:

                کد:
                interrupt [EXT_INT0] void ext_int0_isr(void)
                {
                    PORTA.0=~PORTA.0;
                
                    while(1);
                }
                وقتی اینطور بنویسی و یکبار وارد وقفه int0 بشی قطعا دیگه وقفه تایمر اجرا نمیشه...یعنی دیگه اون پالس زرد رنگت تغییر نمیکنه

                حالا کد مربوط به وقفه int0 رو تغییر بده و اینطور بنویس:

                کد:
                interrupt [EXT_INT0] void ext_int0_isr(void)
                {
                    PORTA.0=~PORTA.0;
                    #asm("sei")
                    while(1);
                }
                اینبار وقتی به وقفه int0 وارد بشی، علی رغم اینکه داخل وقفه int0 موندگار شدی ولی میبینی که وقفه تایمر اجرا میشه...

                حتما امتحانش کن
                تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                www.intelart.ir


                ساخت کنترلر دما PID فازي با AVR [آموزشی]

                دیدگاه


                  #9
                  پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

                  نوشته اصلی توسط Mahdi.Faani نمایش پست ها
                  من ی چیزی میگم شما امتحانش کن ببین نتیجه چی میشه:
                  میدونم که میدونی حساسیت به سطح چیه..ولی بازم میگم که آیندگان اگه ندونستن همینجا بفهمن قضیه چیه
                  حساسیت به سطح پایین(بالا) یعنی اینکه مقدار سیگنال اعمال شده به پین مربوط به اینتراپت خارجی ، به مقدار صفر(یک) برسد و برای مدتی(که از قبل تعیین شده است و ثابت است) در این مقدار باقی بماند

                  حساسیت به لبه یعنی اینکه مقدار سیگنال اعمال شده به پین تغییر منطقی کند

                  حالا شما برو داخل همون کدی که اول گذاشتی وقفه مربوط به int0 رو اینجوری بنویس:

                  کد:
                  interrupt [EXT_INT0] void ext_int0_isr(void)
                  {
                      PORTA.0=~PORTA.0;
                  
                      while(1);
                  }
                  وقتی اینطور بنویسی و یکبار وارد وقفه int0 بشی قطعا دیگه وقفه تایمر اجرا نمیشه...یعنی دیگه اون پالس زرد رنگت تغییر نمیکنه

                  حالا کد مربوط به وقفه int0 رو تغییر بده و اینطور بنویس:

                  کد:
                  interrupt [EXT_INT0] void ext_int0_isr(void)
                  {
                      PORTA.0=~PORTA.0;
                      #asm("sei")
                      while(1);
                  }
                  اینبار وقتی به وقفه int0 وارد بشی، علی رغم اینکه داخل وقفه int0 موندگار شدی ولی میبینی که وقفه تایمر اجرا میشه...

                  حتما امتحانش کن
                  مهدی جان می شه بپرسم چرا اصلا باید توی وقفه while(1)نوشته بشه؟

                  _ext_int0_isr:
                  ; 0000 001D PORTA.0=~PORTA.0;
                  SBIS 0x1B,0
                  RJMP _0x3
                  CBI 0x1B,0
                  RJMP _0x4
                  _0x3:
                  SBI 0x1B,0
                  _0x4:
                  ; 0000 001E while(1){PORTA.3=~PORTA.3;}
                  _0x5:
                  SBIS 0x1B,3
                  RJMP _0x8
                  CBI 0x1B,3
                  RJMP _0x9
                  _0x8:
                  SBI 0x1B,3
                  _0x9:
                  RJMP _0x5
                  ; 0000 001F }
                  این کد وقفه ی خارجیه مهدی جان من زیاد اسمبلیم خوب نیست ولی فکرنکنم وقفه را غیرفعال کرده باشه!
                  جدیدترین ویرایش توسط Ali Chiefer; ۲۱:۲۳ ۱۳۹۵/۰۳/۱۳.
                  Ali Reza Tarkesh Esfahani

                  Yahoo: amt_1390@yahoo.com

                  دیدگاه


                    #10
                    پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

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

                    این کد وقفه ی خارجیه مهدی جان من زیاد اسمبلیم خوب نیست ولی فکرنکنم وقفه را غیرفعال کرده باشه!
                    آفرین نکته ش همینجاس!این کار رو کامپایلر انجام نمیده بلکه خود CPU انجام میده...شما با atmel studio همین کد رو بنویس و debug کن و به بیت I در رجیستر SREG دقت کن ببین وقتی وارد وقفه میشه چه بلایی سرش میاد...جواب سوالت تو اون دیباگ کردن نهفته س!
                    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                    www.intelart.ir


                    ساخت کنترلر دما PID فازي با AVR [آموزشی]

                    دیدگاه


                      #11
                      پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

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


                      آفرین نکته ش همینجاس!این کار رو کامپایلر انجام نمیده بلکه خود CPU انجام میده...شما با atmel studio همین کد رو بنویس و debug کن و به بیت I در رجیستر SREG دقت کن ببین وقتی وارد وقفه میشه چه بلایی سرش میاد...جواب سوالت تو اون دیباگ کردن نهفته س!
                      این حتما بررسی می کنم
                      ولی مهدی جان پس چرا توی اون کدی که من نوشتم تداخل نداشتیم و همه ی موج ها درست بود؟
                      Ali Reza Tarkesh Esfahani

                      Yahoo: amt_1390@yahoo.com

                      دیدگاه


                        #12
                        پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

                        نوشته اصلی توسط Mahdi.Faani نمایش پست ها
                        بله دقیقا...امکان تداخل وجود نداره..ولی معماری AVR طوری هست که وقتی وارد وقفه میشه دستور اسمبلی cli در ابتدای دستورات قرار میگیره...یعنی در حین وقفه انجام دتورات داخل وقفه در حالت دیفالت به وقفه های دیگه رسیدگی نمیشه مگر اینکه خودتون داخل وقفه دستور sei رو اجرا کنید...
                        در انتها وقتی میخاد از وقفه خارج بشه دستور reti اجرا میشه یعنی سرویس وقفه به اتمام رسیده و فلگ وقفه مربوطه میاد پایین....

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

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

                        ایشون میتونه دوتا کار انجام بده :

                        1-اول اینکه یه چیزی شبیه به سمافور در سیستم عامل رو پیاده سازی کنه.یعنی یه متغیر تعریف کنه.مقدارشو اول برنامه بذاره 0...داخل اینتراپت int0 مقدارشو 1 کنه و از اینتراپت خارج بشه (یهو نپره اول برنامه)...داخل حلقه دائمی اصلی برنامه چک کنه که هر وقت مقدار اون متغیر 1 شد پرش کنه به اول برنامه

                        2- دوم اینکه قبل از پریدن مستقیم به اول برنامه خودش دستی فلگ اینتراپت رو بیاره پایین بعدش بپره اول برنامه.که البته من حالت اول رو ترجیح میدم!

                        ممنون از پاسخ دوستان.

                        منم دقیقا از روش یک استفاده کرده بودم، ولی چون کد تقریبا 1000 خط هست الان و هنوزم باید بیشتر بشه،
                        کم کم دارم کنترل کد رو با اینتراپت خارجی از دست میدم، یعنی تو هر زمانی امکان تحریک شدن int7 هست، و ممکنه سی پی یو هرجایی از این کد بره به اینتراپت پاسخ بده و برگرده ، و این برگشت ممکنه تو یه حلقه باشه یا دقیقا بین انتظار چند میلی ثانیه ای. و کنترل همه ی کد خیلی سخت و بعضی از جاها قابل پیش بینی نیست،
                        برای همین گفتم بیام از داخل خود لیبل اینتراپت کنترلشو به دست بگیرم، که مجبور به پرش به main شدم،
                        و من هم اومدم از روش دوم شما استفاده کردم، وقتی میره داخل لیبل اینتراپت، میآم وقفه سراسری رو غیر فعال و با رفتن به main وقفه سراسری رو فعال میکنم. تایمر 0 هم راه اوفتاد.

                        حالا از نظر شما دوستان این روش مشکلی از لحاظ استاندارد یا هرجور دیگه پیش نمیآره که؟



                        با تشکر.
                        به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                        (پيش به سوي هدف)

                        دیدگاه


                          #13
                          پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

                          نوشته اصلی توسط Ali Chiefer نمایش پست ها
                          این حتما بررسی می کنم
                          ولی مهدی جان پس چرا توی اون کدی که من نوشتم تداخل نداشتیم و همه ی موج ها درست بود؟
                          چون که اونجا اصلا برنامه داخل وقفه int0 موندگار نمیشد!یه لحظه کارشو انجام میداد و دوباره میرفت تو حلقه while اصلی...و منتظر این می موند که شما اون باتون رو بفشاری...خب معلومه که در این حالت وقفه تایمر هم میتونه بدون هیچ مشکلی اجرا بشه...

                          دلیل: ادغام دو پست برای جلوگیری از اسپم

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

                          www.intelart.ir


                          ساخت کنترلر دما PID فازي با AVR [آموزشی]

                          دیدگاه


                            #14
                            پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

                            نوشته اصلی توسط Mahdi.Faani نمایش پست ها
                            چون که اونجا اصلا برنامه داخل وقفه int0 موندگار نمیشد!یه لحظه کارشو انجام میداد و دوباره میرفت تو حلقه while اصلی...و منتظر این می موند که شما اون باتون رو بفشاری...خب معلومه که در این حالت وقفه تایمر هم میتونه بدون هیچ مشکلی اجرا بشه...

                            دلیل: ادغام دو پست برای جلوگیری از اسپم

                            خواهش مکینم...
                            وقتی میره داخل اینتراپت خود به خود وقفه سراسری غیر فعال میشه!!!نیازی نیست شما غیرفعالش کنید
                            شما فقط کافیه فلگ رو به صورت دستی بیارین پایین
                            این کار استاندارد نیست چون وقتی شما reti رو اجرا نکنید اطلاعات push شده به stack برداشته نمیشند یا در اصطلاح pop نمیشن...این یعنی اینکه یه تعداد متغیر داخل استک می مونه و حجم رم الکی اشغال میشه...
                            در کل این کار درست نیست...مگر اینکه قصد ریست کردن میکرو رو داشته باشید...منظورم ریست سخت افزاری هست!اون موقع چون همه چی به حال اول برمیگرده حالت قبلش مهم نیست ولی وقتی به ابتدای برنامه برگردید مقدار رجیستر ها تغییری نمیکنه!
                            حال کردم با این اطلاعات دقیق وریز بینانه ی شما،ایشالله که همیشه باشین.

                            سوال اول؟ شما در پست های قبل به اتمل استدیو اشاره کردین، کلا تو ویژال استدیو میشد قشنگ تمامی متغییرها رو تو دیباگ دید و قشنگ آنالیز کرد،تو اتمل استدیو هم میشه دیباگ کرد و مجازی همچیو دید؟
                            از اول با این بسکام حال نمیکردم.اصلا یجوریه، اینقد باید rem و یادداشت بزاری تا گم نکنی کد رو. سی واقعا فوقالعاده هست.


                            2- پس با اینحال چیکار باید کرد برای کد خودم، یا باید یه پایه رو دائم سرکشی کنم تا اگه یک شد برو این کار رو انجام بده، یا با اینتراپت کار کنم، اگه با اینتراپت کار کنم که شاید جایی تو این کد از قلم بندازم و اونجا گیر کنه،
                            حالا اگه بخام بعد رفتن داخل لیبل اینتراپت، بیام به main شما راه دیگه ای ندارین که پیشنهاد کنید؟



                            با تشکر از دوستان.
                            به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                            (پيش به سوي هدف)

                            دیدگاه


                              #15
                              پاسخ : تداخل دو اینتراپت int و timer0 در برنامه و عمل نکردن timer0

                              متشکرم ...لطف دارید

                              سوال اول: اتمل استودیو مجموعه ای از کامپایلر AVR-GCC و IDE ویژوال استودیو است...یعنی ظاهر ویژوال استودیو ولی کامپایلر متفاوت...اگه میخاید با زبان C کار کنید و استاندارد هم کار کنید بهتره برید سراغ اتمل استودیو....اینجا امکان شبیه سازی و دیباگ کدتون رو هم دارید

                              2- پس با اینحال چیکار باید کرد:دقیقا نگفتید که هدفتون از رفتن به MAIN چیه؟قصد دارید سیستم ریست بشه؟مثل ریست سخت افزاری؟؟یا فقط میخاین برنامه به جایی منتقل بشه؟
                              اگه هدفتون مورد اوله با همون اینتراپت میشه ولی اگه هدف دیگه ای دارین باید خودتون ببینید کدومش واستون مناسبتره
                              تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                              www.intelart.ir


                              ساخت کنترلر دما PID فازي با AVR [آموزشی]

                              دیدگاه

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