اطلاعیه

Collapse
No announcement yet.

مشکل وقفه در arm

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

    مشکل وقفه در arm

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

    #2
    پاسخ : مشکل وقفه در arm

    نوشته اصلی توسط soheyl_60
    سلام.
    توی برنامم وقتی وقفه ای رخ میده میکرو پس از اجرای وقفه وارد مد abort میشود و میکرو به اخرین مکانیکه قبل از رخ دادن وقفه بود برنمیگردد.چرا؟
    وضعیت watch dog فعال است؟
    ازکجا متوجه شدید که abort می کنید؟

    دیدگاه


      #3
      پاسخ : مشکل وقفه در arm

      واچ داگ رو فعال نکردم.من توی keilآ‌شبیه سازی کردم.اونجا گزینه abortآ‌فعال میشه و میکرو دیگه به وقفه پاسخ نمیده.
      نمونه کد:
      کد:
      # include <AT91SAM7X256.H>
      unsigned int ram[];
      void timer0_irq_handler(void)
      {
      unsigned int k=0;
      
      	 if((AT91C_BASE_TC0->TC_SR&0x20)==0x20)
      	 {
      	 ram[k]=AT91C_BASE_TC0->TC_RA;
      	 }
      else
      {	 
      	 ram[k]=*AT91C_TC0_RB;
      }
      k=k+1;
      }
      
      int main (void) {
      *AT91C_WDTC_WDMR=1<<15;
      *AT91C_RSTC_RMR=0XA5000001;
      //------------------------------------------
      	*AT91C_CKGR_MOR=0XF01;		 // Oscillator USED EXTERNAL CRYSTAL(01)
      	*AT91C_CKGR_PLLR=0X2903FFC;	 // F0*656(290)/252(FC)	=48 MHZ
      //--------------------------------------------------------------------------
      *AT91C_PMC_SCER=1;	      //ENABLE CLOCK MICRO
      *AT91C_PMC_MCKR=3;						  //USED FROM PLL CLOCK
      *AT91C_PMC_PCER=1<<12; 	 //ENABLE CLOCK TIMER0
      //---------------------------------------------	------------------------
      *AT91C_PIOB_PDR = 1<<23;  // DISABLE PORTB.23 AS OUT/IN PUT AND READY AS PIOA0=PORT B.23
      *AT91C_PIOB_MDER = 1<<23; // PORT IS OPEN DRAIN 
      *AT91C_PIOB_ASR=1<<23;	 //PRIPHERAL A ENABLE & PIOA0 IS PERIPHERAL A
      //------------------------------------------
      *AT91C_TC0_IER=3<<5;   //INTTRUPT LOAD RA & LOAD RB        	
      	while ((*AT91C_PIOB_PDSR&0X800000));  //UNTILE PB23 IS 1 IT'S HERE
      *AT91C_TC0_CCR = 5<<0;					  //TIMER ENABLE & START
      *AT91C_TC0_CMR=1<<2 | 0<<15 | 1<<16 | 1<<19; // CLK/1024 ;CAPTURE ENABLE ; RA LOAD AT HIGH & RB LOAD AT LOW
      
      AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0]=(unsigned int)timer0_irq_handler;
      AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0]=0X7;
      AT91C_BASE_AIC->AIC_ICCR=1<<AT91C_ID_TC0;
      AT91C_BASE_AIC->AIC_IECR=(1<<AT91C_ID_TC0);	  
      while(1){
      }
      }

      دیدگاه


        #4
        پاسخ : مشکل وقفه در arm

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

        دیدگاه


          #5
          پاسخ : مشکل وقفه در arm

          متاسفانه توی شبیه سازی سخت افزاری هم دچار مشکل شدم.لطفا کسی میتونه بگه اشکال برنامم چیه؟یا یه نمونه برنامه وقفه تایمر0 توی keil واسه at91 واسم بذاره ممنون میشم.

          دیدگاه


            #6
            پاسخ : مشکل وقفه در arm

            انواع تریگر ها رو تست کن
            مثلا این که با لبه بالا رونده باشه یا پاییم رونده
            یا اصلا سطح High باشه یا LOW چون اینا مهم اند
            من تو برنامت متوجه نشدم کجا اینو تعیین کردی :sad:
            اگه اولین باره میخای راش بندازی بهتره از تابع های آماده ای که توی lib-at91sam7x256.h هست استفاده کن
            کد:
            void TC_irq_handler(void) __irq 
            {
            	int Status;
            	
            	Status = AT91C_BASE_TC1->TC_SR;
            	Status = Status;
            	
            	
            	//AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS;
            	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
            	
            	//* get Usart status register
            	
            }
            
            
            
            
            //533 with RTPRES=0x8000 is equal to 10 minute
            int main (void)
            {
            	
            	
            	
            	AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS | AT91C_TC_COVFS;
            	AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_TC1,4,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,TC_irq_handler);
            	AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_TC1);
            این کدو رو من با تایمر جواب گرفتم
            البته بقیه تنظیمات تایمر رو باید اضافه کنی
            تو این کد با مقایسه RC میره تو وقفه
            زندگی یعنی امید و حرکت
            کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
            سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
            برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
            به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

            دیدگاه


              #7
              پاسخ : مشکل وقفه در arm

              با تشکر از همه شما.مشکل حل شد.اولا باید IRQ__ رو در ابتدای تابع وقفه اضافه میکردم ثانیا دستور خاتمه وقفه رو در اخر خط تابع وقفه باید مینوشتم.
              توی برنامه از تریگر نرم افزاری
              کد:
              *AT91C_TC0_CCR = 5<<0;
              استفاده کرده بودم.
              اما باید اقرار کنم دیباگ سخت افزاری در AVRآ‌خیلی قویتر از ARM هست.حالا نمیدونم برداشت من اینجوری بود.یا واقعا اینجوریه.

              دیدگاه


                #8
                پاسخ : مشکل وقفه در arm

                نوشته اصلی توسط soheyl_60
                با تشکر از همه شما.مشکل حل شد.اولا باید IRQ__ رو در ابتدای تابع وقفه اضافه میکردم ثانیا دستور خاتمه وقفه رو در اخر خط تابع وقفه باید مینوشتم.
                توی برنامه از تریگر نرم افزاری
                کد:
                *AT91C_TC0_CCR = 5<<0;
                استفاده کرده بودم.
                اما باید اقرار کنم دیباگ سخت افزاری در AVRآ‌خیلی قویتر از ARM هست.حالا نمیدونم برداشت من اینجوری بود.یا واقعا اینجوریه.
                اگر __IRQ رو نزاری اصلا وارد وقفه نمیشه و اگر خاتکه وقفه رو نزاری وقفه فقط یک بار عمل میکنه و دفعه دوم دیگه وارد وقفه نمیشه
                موفق باشید
                زندگی یعنی امید و حرکت
                کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                دیدگاه

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