اطلاعیه

Collapse
No announcement yet.

کار با تایمر SAM7X

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

    #16
    پاسخ : پاسخ : کار با تایمر SAM7X

    نوشته اصلی توسط rezaf
    سلام. این کار رو هم انجام دادم کد رو به شکل زیر تغییر دادم حتی بقیه برنامه رو برای تست بی خیال شدم و حلقه رو آوردم بالاتر روشن خاموش شدن LED تو تابع وقفه رو هم منتقل کردم به تابع main داخل حلقه while. عددای PLL رو هم مثل شما دادم اما بازممممممممممم فقطططططط یکککک بار LED روشن و خاموش میشه. هر جور acknowledge و clear لازم بود تو تابع وقفه انجام دادم حس می کنم تو تابع main هم باید یه کارایی انجام بدم که وقفه ها ادامه پیدا کنه. :cry: :angry:
    کد:
    void timer1_c_irq_handler (void)
    {
    	volatile unsigned int dummy;
    	
    	dummy = AT91C_BASE_TC1->TC_SR;
    	dummy = dummy;
    	
    	T_Counter++;
    	TimerFlag = 1;
    
    	dummy = AT91C_BASE_TC1->TC_CV;
    	*AT91C_AIC_EOICR = 0; 
            AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_TC0->TC_SR;   // Interrupt Ack
            AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);    // Interrupt Ack
    
    	AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;
    
    	AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_AIC->AIC_EOICR;	//interrupt acknowledge
    }
    
    int main (void) 
    {
    	unsigned int dummy ;
    	
    	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);   //LED 1
    	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA3);   //LED 2
    
      AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC1;     // Enable peripheral clock
    	 AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;       // Disable TC clock
      AT91C_BASE_TC1->TC_IDR = 0xFFFFFFFF;         // Disable interrupts
      dummy = AT91C_BASE_TC1->TC_SR;            // Clear status register
      AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK | AT91C_TC_CPCTRG;	 // Set mode
    
      AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN ;       // Enable the Clock counter 
      AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS;  
      
    		AT91C_BASE_AIC->AIC_IDCR = 0x1 << AT91C_ID_TC1;
    		AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC1] = (unsigned int) timer1_c_irq_handler;
    		AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC1] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 4 ;
    		AT91C_BASE_AIC->AIC_ICCR = 0x1 << AT91C_ID_TC1;
    		AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_TC1;
    		
      AT91C_BASE_TC1->TC_RC = 93857; 
      AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
    		
       while(1)
    	{
               if(TimerFlag==1) 
                {
                  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);   //timer int LED notification
                 delay_ms(100);
                  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);  
                  TimerFlag = 0;
    	    }				 
    	 }
    }
    تا آخر شب خودم مینویسم برات
    اگه دیدی چیزی ننوشتم بهم پیغام خصوصی بده
    زندگی یعنی امید و حرکت
    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
    سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

    دیدگاه


      #17
      پاسخ : کار با تایمر SAM7X

      یک دنیا ممنون. ایشالا جبران کنم. :agree: :wow: شرمنده یه سوال دیگم بپرسم. مثلا یه پین رو خروجی تعریف کردم و LED بهش وصل کردم چجوری در طول برنامه وضعیت پین رو بفهمم که بدونم LED روشنه یا خاموش ؟ اینجوری درسته :
      کد:
            if(AT91C_PIO_PA2 == 1)
      						AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);
            else if(AT91C_PIO_PA2 == 0)
      	     AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);

      دیدگاه


        #18
        پاسخ : کار با تایمر SAM7X

        نوشته اصلی توسط rezaf
        یک دنیا ممنون. ایشالا جبران کنم. :agree: :wow: شرمنده یه سوال دیگم بپرسم. مثلا یه پین رو خروجی تعریف کردم و LED بهش وصل کردم چجوری در طول برنامه وضعیت پین رو بفهمم که بدونم LED روشنه یا خاموش ؟ اینجوری درسته :
        کد:
              if(AT91C_PIO_PA2 == 1)
        						AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);
              else if(AT91C_PIO_PA2 == 0)
        	     AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);
        خواهش میکنم
        نه برای این کار باید رجیستر وضعیت رو بخونی
        به این صورت
        کد:
        AT91F_PIO_IsSet(AT91C_BASE_PIOA, AT91C_PIO_PA2);
        مقداری که بر میگردونه وضعیت پایه رو نشون میده
        زندگی یعنی امید و حرکت
        کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
        سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
        برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
        به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

        دیدگاه


          #19
          پاسخ : کار با تایمر SAM7X

          لطفا سوال من رو هم جواب بدین. :mrgreen:پروژه لنگ مونده :rolleyes:

          دیدگاه


            #20
            پاسخ : کار با تایمر SAM7X

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

            دیدگاه


              #21
              پاسخ : کار با تایمر SAM7X

              سلام شرمنده دیر شد
              برنامه رو با دیباگ تست کردم خوب جواب داد
              شرمنده دیر شد
              خواهش می کنم. ممنون که وقت گذاشتی. اما شرمنده بازم مشکل و سوال دارم. نمی دونم چرا من وقتی برنامه شما رو دیباگش می کنم میاد دقیقا آخر تابع اینتراپت وایمیسته بعدم ارور : no execute/read permission میده(احتمالا این همون اشکالی هست که تو برنامه خودمم داشتم ). برای دستورایی مثل PORTB_OUTPUT=PB20 هم ارور میده اینا از چه هدری هستن ممکنه هدر pio من فرق کنه ؟ تنظیمات رو دقیقا چی دادی (PLL DIV, PLL MUL, Prescaler, e) ؟ RC رو چجوری حساب کردی که 5000 دادی ؟



              دیدگاه


                #22
                پاسخ : کار با تایمر SAM7X

                نوشته اصلی توسط rezaf
                خواهش می کنم. ممنون که وقت گذاشتی. اما شرمنده بازم مشکل و سوال دارم. نمی دونم چرا من وقتی برنامه شما رو دیباگش می کنم میاد دقیقا آخر تابع اینتراپت وایمیسته بعدم ارور : no execute/read permission میده(احتمالا این همون اشکالی هست که تو برنامه خودمم داشتم ). برای دستورایی مثل PORTB_OUTPUT=PB20 هم ارور میده اینا از چه هدری هستن ممکنه هدر pio من فرق کنه ؟ تنظیمات رو دقیقا چی دادی (PLL DIV, PLL MUL, Prescaler, e) ؟ RC رو چجوری حساب کردی که 5000 دادی ؟



                یه کار کن
                من خودم چون زیاد طول میکشید عددی که توی تابع وقفه بود رو کم کردم منظورم 9611 هست. این عدد رو 3 یا 5 یا یه عدد کوچیک بزار تند تند باید چشمک بزنه
                بله یه هدر دیگه استفاده کردم به نام pio.h میخای اونم بهت بدم؟ خیلی راحتتره کار باهاش دیدی که چه قدر دستوراتش کوتاهه
                زندگی یعنی امید و حرکت
                کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                دیدگاه


                  #23
                  پاسخ : کار با تایمر SAM7X

                  نوشته اصلی توسط gizmo89
                  ببخشید وسط بحثتون وارد میشم، سوال برام مطرح شد.اگه بخوام از تایمر برای تولید تاخیرهای متغیر تو طول برنامم استفاده کنم باید تو مد capture ازش استفاده کنم؟
                  اون جور که من خوندم تو مود capture تایمر ورودی لازم داره تا بشماره.حالا برای ایجاد تاخیر چه ورودی دریافت میکنه؟
                  خودم ایده م این بود که رو مود wave هر وقت که rc trig داشتم وقفه بدم.
                  mck = 66000000
                  mck/1024 و rc رو واسه یه ثانیه تنظیم کنم،ra رو هم مساوی با rc بدم که هر یه ثانیه tioa یک بشه.بعد هر یه ثانیه وقفه داشته باشم و تو روتین وقفه تاخیر رو محاسبه کنم.نمی دونم، منطقش درسته یا نه!؟
                  سوال سومم هم اینه که،اگر بخوام وسط برنامه بگم که دیگه وقفه تایمر رو نمی خوام،باید از interrupt mask غیر فعال کنمش یا کلا کلاک تایمر رو غیر فعال کنم؟
                  شرمنده سوالت افتاده بود توی صفحه اول تاپیک ندیدم که جواب بدم
                  بله باید از Capture استفاده کنی
                  برای شمارش یه ورودی میخاد هم میتونه داخلی باشه و هم میتونه خارجی باش که شما برای ایجاد تاخیر به داخلی نیاز دارین یعنی همون کلاک میکرو
                  برای این کار باید از مقایسه با رجیستر RC و وقفه مربوطه استفاده کنی
                  مثلا RC = 20 میزاری و هر وقت RC شد 20 میره تو وقفه (باید وقفه مربوطه رو هم فعال کنی). توی وقفه باید تایمر رو ریست کنی تا از نو بشماره
                  یه برنامه برای Rezfa گذاشتم توی یکی دوتا پست قبل
                  این برنامه تاخیر 4 دقیقه ای تولید میکنه حالا شما باید یک متغییر رو به عنوان زمان دلخواه بگیری و محاسبات رو انجام بدی و مقدار RC رو بدست بیاری
                  محاسبات رو بلدی؟
                  زندگی یعنی امید و حرکت
                  کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                  سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                  برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                  به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                  دیدگاه


                    #24
                    پاسخ : پاسخ : کار با تایمر SAM7X

                    نوشته اصلی توسط علی ایمانی فر
                    یه کار کن
                    من خودم چون زیاد طول میکشید عددی که توی تابع وقفه بود رو کم کردم منظورم 9611 هست. این عدد رو 3 یا 5 یا یه عدد کوچیک بزار تند تند باید چشمک بزنه
                    بله یه هدر دیگه استفاده کردم به نام pio.h میخای اونم بهت بدم؟ خیلی راحتتره کار باهاش دیدی که چه قدر دستوراتش کوتاهه
                    این که تا آخر تابع اینتراپت میومد و وایمیستاد حل شد (اشکال این بود که من برای رفع ارورا __irq رو از تابع پاک می کردم در صورتی که فکر کنم این حروف یه علامت هست براش) هدری که شما داده بودی بجای lib_at91sam7x خودم گذاشتم اروراشم گرفتم (روی قسمت AES و TDES ارور میداد منم چون لازمشون نداشتم کلا پاک کردم) مشکلش حل شد(اینجاست که دیباگ بدرد میخوره).

                    یک دنیا ممنون آقای ایمانی فر.

                    دیدگاه


                      #25
                      پاسخ : پاسخ : کار با تایمر SAM7X

                      نوشته اصلی توسط rezaf
                      این که تا آخر تابع اینتراپت میومد و وایمیستاد حل شد (اشکال این بود که من برای رفع ارورا __irq رو از تابع پاک می کردم در صورتی که فکر کنم این حروف یه علامت هست براش) هدری که شما داده بودی بجای lib_at91sam7x خودم گذاشتم اروراشم گرفتم (روی قسمت AES و TDES ارور میداد منم چون لازمشون نداشتم کلا پاک کردم) مشکلش حل شد(اینجاست که دیباگ بدرد میخوره).

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

                      دیدگاه


                        #26
                        پاسخ : پاسخ : کار با تایمر SAM7X

                        نوشته اصلی توسط علی ایمانی فر
                        شرمنده سوالت افتاده بود توی صفحه اول تاپیک ندیدم که جواب بدم
                        بله باید از Capture استفاده کنی
                        برای شمارش یه ورودی میخاد هم میتونه داخلی باشه و هم میتونه خارجی باش که شما برای ایجاد تاخیر به داخلی نیاز دارین یعنی همون کلاک میکرو
                        برای این کار باید از مقایسه با رجیستر RC و وقفه مربوطه استفاده کنی
                        مثلا RC = 20 میزاری و هر وقت RC شد 20 میره تو وقفه (باید وقفه مربوطه رو هم فعال کنی). توی وقفه باید تایمر رو ریست کنی تا از نو بشماره
                        یه برنامه برای Rezfa گذاشتم توی یکی دوتا پست قبل
                        این برنامه تاخیر 4 دقیقه ای تولید میکنه حالا شما باید یک متغییر رو به عنوان زمان دلخواه بگیری و محاسبات رو انجام بدی و مقدار RC رو بدست بیاری
                        محاسبات رو بلدی؟
                        بله،محاسبات رو بلدم.ممنونم.
                        راستش تو این فرصتی که تا جواب سوالم رو بدین،رفتم و بجای تایمر کانتر سعی کردم با pit کاری که می خوام رو انجام بدم.به نظرم چون رجیستراش کمتره راحتتره و چون من تاخیری که میخوام مینیمم 2 میلی ثانیه ست و از 250 یا 300 هم قرار نیست بیشتر بشه فکر کنم مناسبتر باشه.فعلا دارم روش کار میکنم،به مشکل برخوردم میام سراغتون

                        دیدگاه


                          #27
                          پاسخ : کار با تایمر SAM7X

                          سلام مجدد. آقای ایمانی فر اینجوری تایمر دائم که اینتراپت میده مشکل ایجاد می کنه می خوام هر موقع لازم شد روشنش کنم 4 دقیقه رو بشماره بعد خاموشش کنم دیگه اینتراپتم نده.
                          برای روشن کردنش این دستور کافیه :
                          کد:
                          AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
                          برای چک کردن اینکه 4 دقیقه شده یا نه تو یه حلقه :

                          کد:
                          		 do{ 
                          				if(ENDTime == 1)
                          				 {
                          					 ENDTime = 0;
                                AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;   //Disable clock of timer
                          	     TiStatus = AT91C_BASE_TC1->TC_SR;
                          	     TiCounter = 0;					 
                          				 }
                          		 			 
                           	 }while(1);
                          برای خاموش کردنش :
                          کد:
                          ENDTime = 0;
                          AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
                          TiStatus = AT91C_BASE_TC1->TC_SR;
                          TiCounter = 0;
                          ENDTime فلگی هست که وقتی به 4 دقیقه رسید یک میشه. و TiCounter متغیری هست که با هر اینتراپت زیاد میشه تا به اندازه 4 دقیقه بشه.
                          ممنون.

                          دیدگاه


                            #28
                            پاسخ : پاسخ : کار با تایمر SAM7X

                            نوشته اصلی توسط rezaf
                            سلام مجدد. آقای ایمانی فر اینجوری تایمر دائم که اینتراپت میده مشکل ایجاد می کنه می خوام هر موقع لازم شد روشنش کنم 4 دقیقه رو بشماره بعد خاموشش کنم دیگه اینتراپتم نده.
                            برای روشن کردنش این دستور کافیه :
                            کد:
                            AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
                            برای چک کردن اینکه 4 دقیقه شده یا نه تو یه حلقه :

                            کد:
                            		 do{ 
                            				if(ENDTime == 1)
                            				 {
                            					 ENDTime = 0;
                                  AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;   //Disable clock of timer
                            	     TiStatus = AT91C_BASE_TC1->TC_SR;
                            	     TiCounter = 0;					 
                            				 }
                            		 			 
                             	 }while(1);
                            برای خاموش کردنش :
                            کد:
                            ENDTime = 0;
                            AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
                            TiStatus = AT91C_BASE_TC1->TC_SR;
                            TiCounter = 0;
                            ENDTime فلگی هست که وقتی به 4 دقیقه رسید یک میشه. و TiCounter متغیری هست که با هر اینتراپت زیاد میشه تا به اندازه 4 دقیقه بشه.
                            ممنون.
                            سلام
                            الان درست نفهمیدم سوال بود یا خبری :mrgreen: آخه همه چیو که نوشتی البته به جز وقفه
                            برای غیر فعال کردن وقفه وقفه مربوطه رو Disable کن با دستور زیر
                            کد:
                            AT91F_AIC_DisableIt(AT91C_BASE_AIC,AT91C_ID_TC1);
                            هر وقت لازم نداشتی وقفه رو هم تایمرو هم وقفه رو و همه چیو غیر فعال کن
                            برای غیر فعال کردن تایمر هم از کد زیر استفاده کن
                            کد:
                            AT91C_BASE_TC1->TC_CCR = TC_CLKDIS
                            همین دیگه چیزه دیگه ای اگه هست بگو تا بگم :smile:
                            زندگی یعنی امید و حرکت
                            کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                            سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                            برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                            به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                            دیدگاه


                              #29
                              پاسخ : کار با تایمر SAM7X

                              من هم همین مشکل رو دارم
                              هدر رو از

                              کد:
                              __inline unsigned int AT91F_AIC_ConfigureIt (
                              	AT91PS_AIC pAic, // \arg pointer to the AIC registers
                              	unsigned int irq_id,   // \arg interrupt number to initialize
                              	unsigned int priority,  // \arg priority to give to the interrupt
                              	unsigned int src_type,  // \arg activation and sense of activation
                              	void (*newHandler) (void) ) // \arg address of the interrupt handler
                              {
                              به

                              کد:
                              __inline unsigned int AT91F_AIC_ConfigureIt (
                              	AT91PS_AIC pAic, // \arg pointer to the AIC registers
                              	unsigned int irq_id,   // \arg interrupt number to initialize
                              	unsigned int priority,  // \arg priority to give to the interrupt
                              	unsigned int src_type,  // \arg activation and sense of activation
                              	void (*newHandler) (void)[color=red][b] __irq[/b][/color] ) // \arg address of the interrupt handler
                              {
                              تغییر دادم
                              و بقیه کدمم اینجوریه :
                              کد:
                              void TC_irq_handler(void) __irq{
                               int Status;
                              	
                               Status = AT91C_BASE_TC1->TC_SR;
                               //Status = Status;
                              	
                               M_Counter++;
                               if(M_Counter>=1000)
                               S_Counter++;
                              	
                               AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;
                               AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
                              }
                              
                              
                              void InitTimer(void){
                               //unsigned int F_CPU= GET_MASTER_CPU_CLOCK();
                               //int LOAD_RC;
                              
                               //LOAD_RC = F_CPU/8000000;
                              
                               AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC1;
                               AT91C_BASE_TC1->TC_CMR = 0x00000000;
                               AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK ;
                               AT91C_BASE_TC1->TC_CCR = 0x0000;
                               AT91C_BASE_TC1->TC_RC = 10000;
                              
                               //AT91C_BASE_TC1->TC_CMR = (1<<15)| 1 | (1<<6) ; // Colock IS DiV Dy 8
                               //* AT91C_TC1_CCR=0X05; 
                               //AT91C_BASE_TC1->TC_RC = LOAD_RC;//(unsigned long)TIMERCLK;
                               
                               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);
                              }
                              مشکل اینجاست که M_Counter صفر باقی میمونه تو برنامه
                              یعنی اینتراپت صدا زده نمیشه

                              دیدگاه


                                #30
                                پاسخ : کار با تایمر SAM7X

                                نوشته اصلی توسط gbg
                                من هم همین مشکل رو دارم
                                هدر رو از

                                کد:
                                __inline unsigned int AT91F_AIC_ConfigureIt (
                                	AT91PS_AIC pAic, // \arg pointer to the AIC registers
                                	unsigned int irq_id,   // \arg interrupt number to initialize
                                	unsigned int priority,  // \arg priority to give to the interrupt
                                	unsigned int src_type,  // \arg activation and sense of activation
                                	void (*newHandler) (void) ) // \arg address of the interrupt handler
                                {
                                به

                                کد:
                                __inline unsigned int AT91F_AIC_ConfigureIt (
                                	AT91PS_AIC pAic, // \arg pointer to the AIC registers
                                	unsigned int irq_id,   // \arg interrupt number to initialize
                                	unsigned int priority,  // \arg priority to give to the interrupt
                                	unsigned int src_type,  // \arg activation and sense of activation
                                	void (*newHandler) (void)[color=red][b] __irq[/b][/color] ) // \arg address of the interrupt handler
                                {
                                تغییر دادم
                                و بقیه کدمم اینجوریه :
                                کد:
                                void TC_irq_handler(void) __irq{
                                 int Status;
                                	
                                 Status = AT91C_BASE_TC1->TC_SR;
                                 //Status = Status;
                                	
                                 M_Counter++;
                                 if(M_Counter>=1000)
                                 S_Counter++;
                                	
                                 AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;
                                 AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
                                }
                                
                                
                                void InitTimer(void){
                                 //unsigned int F_CPU= GET_MASTER_CPU_CLOCK();
                                 //int LOAD_RC;
                                
                                 //LOAD_RC = F_CPU/8000000;
                                
                                 AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC1;
                                 AT91C_BASE_TC1->TC_CMR = 0x00000000;
                                 AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK ;
                                 AT91C_BASE_TC1->TC_CCR = 0x0000;
                                 AT91C_BASE_TC1->TC_RC = 10000;
                                
                                 //AT91C_BASE_TC1->TC_CMR = (1<<15)| 1 | (1<<6) ; // Colock IS DiV Dy 8
                                 //* AT91C_TC1_CCR=0X05; 
                                 //AT91C_BASE_TC1->TC_RC = LOAD_RC;//(unsigned long)TIMERCLK;
                                 
                                 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);
                                }
                                مشکل اینجاست که M_Counter صفر باقی میمونه تو برنامه
                                یعنی اینتراپت صدا زده نمیشه
                                فک کنم بدونم چیه مشکلت
                                اولا برای این که متوجه بشی برنامه وارد اینتراپت میشه داخل تابع وقفه یک پایه از میکرو رو روشن خاموش کن
                                دوما باید M_Counter رو به صورت global تعریف کنی و مثلا اگر نوعش int هست قبل از int از کلمه volatile استفاده کنی و همونجا که تعریف میشه بهش مقدار نده
                                منظورم اینجوریه
                                کد:
                                volatile int M_Counter;
                                بزن ببین مشکلت حل میشه یا نه
                                زندگی یعنی امید و حرکت
                                کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                                سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                                برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                                به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                                دیدگاه

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