اطلاعیه

Collapse
No announcement yet.

کار با تایمر SAM7X

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

    کار با تایمر SAM7X

    سلام دوستان
    من می خوام از واحد تایمر SAM7X برای ایجاد وقفه مثلا تو هر 4 دقیقه استفاده کنم. انجمن رو گشتم اما چیز بدرد بخور پیدا نکردم. اول اینکه برای این کار باید حتما اینتراپت خارجی یا اسیلاتور جدا از اسیلاتور اصلی بذارم یا نه ؟ دوم اینکه برای این کار باید تایمر/کانتر روی چه مدی باشه Capture Mode یا Waveform Mode ؟

    Each channel can independently operate in two different modes:
    • Capture Mode provides measurement on signals.
    • Waveform Mode provides wave generation.
    The TC Operating Mode is programmed with the WAVE bit in the TC Channel Mode Register.
    In Capture Mode, TIOA and TIOB are configured as inputs.
    In Waveform Mode, TIOA is always configured to be an output and TIOB is an output if it is not
    selected to be the external trigger.

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

    نوشته اصلی توسط rezaf
    سلام دوستان
    من می خوام از واحد تایمر SAM7X برای ایجاد وقفه مثلا تو هر 4 دقیقه استفاده کنم. انجمن رو گشتم اما چیز بدرد بخور پیدا نکردم. اول اینکه برای این کار باید حتما اینتراپت خارجی یا اسیلاتور جدا از اسیلاتور اصلی بذارم یا نه ؟ دوم اینکه برای این کار باید تایمر/کانتر روی چه مدی باشه Capture Mode یا Waveform Mode ؟

    Each channel can independently operate in two different modes:
    • Capture Mode provides measurement on signals.
    • Waveform Mode provides wave generation.
    The TC Operating Mode is programmed with the WAVE bit in the TC Channel Mode Register.
    In Capture Mode, TIOA and TIOB are configured as inputs.
    In Waveform Mode, TIOA is always configured to be an output and TIOB is an output if it is not
    selected to be the external trigger.
    سلام
    باید از مد Capture استفاده کنی
    ببین باید از مقایسه با رجیستر RC و اینتراپت مربوط به مقایسه با RC استفاده کنی
    البته توی یه بار مقایسه نمیتونی به 4 دقیقه برسی(دقیقا مطمئن نیستم باید با توجه به فرکانس کاری تایمرت چک کنی)
    ولی خیلی راحت میتونی یه متغییر تعریف کنی و هر بار وارد وقفه میشه اونو افزایش بدی تا بدونی چند بار مقایسه صورت گرفته و بعدش مقدار تایمر رو صفر کنی
    در نهایت میدونی که مثلا با 10 بار مقایسه به 4 دقیقه میرسی پس حالا که متغییرت شده 10 تاخیر 4 دقیقه ای سپری شده و متونی کارتو انجام بدی
    برو توی این تاپیک که برای ماژول HC-SR01 یه برنامه گذاشتم و شبیه این کارو کردم (وقفه برای مقایسه با رجیستر RC و اندازه گیری زمان (شما روی 4 دقیقه کار مورد نظر رو انجام بده))
    زندگی یعنی امید و حرکت
    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
    سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

    دیدگاه


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

      ممنون از راهنماییت.
      در کل قضیه رو متوجه شدم اما محاسباته مثال رو متوجه نشدم (خیلی وقته با تایمرا کار نکردم البته تو میکروهای 8بیتی کار می کردم) چجوری 18432000 شد 48054857.14285MHz با چه PLLی ؟ چرا تو تنظیمات PLL divider و PLL multiplier انقدر زیادن (252 و 656 در صورتی که پیش فرض روی 5 و 25 هستش)؟
      یه چیز دیگه اینکه تو این مثال با اومدن ورودی تایمر فعال میشه در صورتی که من می خوام قاطی برنامه هر جا خواستم تایمر رو روشن کنم هر جا خواستم خاموش یعنی هیچ سخت افزاری که به تایمر مربوط باشه ندارم همه کارا باید نرم افزاری انجام بشه با این حال بازم باید تو مد Capture باشه؟
      با هدر استاندارد اتمل که واسه تایمر/کانتر داده، نمیشه راحت تر کار کرد ؟

      دیدگاه


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

        نوشته اصلی توسط rezaf
        ممنون از راهنماییت.
        در کل قضیه رو متوجه شدم اما محاسباته مثال رو متوجه نشدم (خیلی وقته با تایمرا کار نکردم البته تو میکروهای 8بیتی کار می کردم) چجوری 18432000 شد 48054857.14285MHz با چه PLLی ؟ چرا تو تنظیمات PLL divider و PLL multiplier انقدر زیادن (252 و 656 در صورتی که پیش فرض روی 5 و 25 هستش)؟
        یه چیز دیگه اینکه تو این مثال با اومدن ورودی تایمر فعال میشه در صورتی که من می خوام قاطی برنامه هر جا خواستم تایمر رو روشن کنم هر جا خواستم خاموش یعنی هیچ سخت افزاری که به تایمر مربوط باشه ندارم همه کارا باید نرم افزاری انجام بشه با این حال بازم باید تو مد Capture باشه؟
        با هدر استاندارد اتمل که واسه تایمر/کانتر داده، نمیشه راحت تر کار کرد ؟
        مقدار پارامتر های PLL مهم نیست مهم حاصلشه که باید MCK*(MUL+1)/DIV بشه فرکانس دلخواه
        من 48 مگ میخاستم این مقادیر رو زدم البته شاید انتخاب های بهتری هم باشه
        بله بازم باید در مد Capture باشی
        برنامه من مربوط به سنسور آلتراسونیک بود و با Echo سنسور باید شروع به اندازه گیری طول یک پالس میکرد. حالا شما به جای شرطی که من برای ورودی گذاشتم هر جا دوست داری یه شرط نرم افزاری بزار یا اصلا بدون شرط بگو تایمر رو ریست کنه و استارت رو بزنه تا تایمر شروع به کار کنه
        مد Waveform برای تولید شکل موج در خروجی ها کاربرد داره
        هر جا اندازه گیری زمان داری باید از Capture استفاده کنی
        زندگی یعنی امید و حرکت
        کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
        سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
        برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
        به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

        دیدگاه


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

          اینجوری تغییرش دادم :
          کد:
          #include <Headers\AT91SAM7X256.H>     //global Headers
          #include <Headers\AT91SAM7X-EK.h>
          #include <Headers\lib_AT91SAM7X256.h>
          
          volatile int T_Counter;
          
          void TC_irq_handler(void) __irq 
          {
          	int Status;
          	
          	Status = AT91C_BASE_TC1->TC_SR;   //copy status register of timer
          	Status = Status;
          	
          	T_Counter++;
           AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);
           delay_ms(100);
           AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);	
          	
          	AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;
          	
          	
          	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);   //brief Acknowledge corresponding IT number
          
          }
          
          
          int main (void) {
          
          	
          	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);   //LED 1
          
          	AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC1;       //configure Timer
          	
          	AT91C_BASE_TC1->TC_CMR = 0x00000000;            //Channel Mode Register
          	AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK ;
          	
          	AT91C_BASE_TC1->TC_CCR = 0x0000;              //TC Channel Control Register
          	
          	AT91C_BASE_TC1->TC_RC = 36141;               //RC register value for compare 
          	
          	AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS | AT91C_TC_COVFS;  //interrupt on counter overflow or RC register compare match
          	AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_TC1,4,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,TC_irq_handler); //configure advanced interrupt controller for timer
          	AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_TC1);      //enable advanced interrupt controller for timer
           T_Counter = 0;                       //counter compare match addition variable 
          	
          	AT91C_BASE_TC1->TC_CCR = 0x00;
          	AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;	//enable clock of timer
          اما این ارور رو میده :

          error: #167: argument of type "void (*)(void)__irq" is incompatible with parameter of type "void (*)()"

          روی ارور که کلیک می کنم میره روی خط :

          کد:
          	AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_TC1,4,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,TC_irq_handler);
          از چی میتونه باشه ؟ مقدار MUL رو 0 دادم و DIV رو 255.

          دیدگاه


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

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

            دیدگاه


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

              ممنون اون ارور برطرف شد ولی ارورای دیگه میده :

              lib_AT91SAM7X256.h(3560): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3572): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3584): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3594): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3604): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3615): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3626): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3638): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3649): error: #20: identifier "AT91PS_AES" is undefined
              \lib_AT91SAM7X256.h(3652): error: #20: identifier "AT91C_AES_START" is undefined
              lib_AT91SAM7X256.h(3660): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3663): error: #20: identifier "AT91C_AES_SWRST" is undefined
              lib_AT91SAM7X256.h(3671): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3674): error: #20: identifier "AT91C_AES_LOADSEED" is undefined
              lib_AT91SAM7X256.h(3682): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3695): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3708): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3720): error: #20: identifier "AT91PS_AES" is undefined
              lib_AT91SAM7X256.h(3736): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3748): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3760): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3770): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3780): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3791): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3802): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3814): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3825): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3828): error: #20: identifier "AT91C_TDES_START" is undefined
              lib_AT91SAM7X256.h(3836): error: #20: identifier "AT91PS_TDES" is undefined
              lib_AT91SAM7X256.h(3839): error: #20: identifier "AT91C_TDES_SWRST" is undefined

              دیدگاه


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

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

                دیدگاه


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

                  همچنان ارور میده. میشه این دوتا هدر که برای تایمره رو یه نگاه بندازی شاید با اینا کار راحت تر شه.

                  Timer_Header.rar

                  دیدگاه


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

                    نوشته اصلی توسط rezaf
                    همچنان ارور میده. میشه این دوتا هدر که برای تایمره رو یه نگاه بندازی شاید با اینا کار راحت تر شه.

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

                    دیدگاه


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

                      قسمتی که مربوط به تایمر هستش تو پست قبلی گذاشتم تغییری ندادم همونه. مشکل اینجاست که از قسمتای مختلف چیپ استفاده کردم و هدر AT91SAM7X256 و lib_AT91SAM7X256 که دارم نسخش جدیدتره اگه نسخه اون رو قدیمی کنم که با lib_AT91SAM7X256 این مثال (اونی که شما دادی که باگ نداره) جور باشه بقیه قسمتا به هم میریزه و ارور بقیه قسمتا رو میده. برم یکم کار کنم ببینم راهی پیدا میشه.

                      دیدگاه


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

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

                        کد:
                        void timer1_c_irq_handler (void)
                        {
                        	
                        	unsigned int dummy;
                        	
                        	dummy = AT91C_BASE_TC1->TC_SR;
                        	dummy = dummy;
                        	
                        	T_Counter++;
                        	
                        	AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;
                        	
                        	
                        	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
                        	
                         AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);   //Normal work LED notification
                        	delay_ms(500);
                        	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);	
                        	
                        }
                        
                        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 = 23961; 
                          AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
                        
                         while(1)
                        		{
                        			AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA3);   //Normal work LED notification
                        			delay_ms(100);
                        			AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA3);
                        
                        			Func1();               /*first function */
                        			AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA4);   //Normal work LED notification
                        			delay_ms(100);
                        			AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA4);		
                        			Func2();            /*second function */
                        	 }
                        }
                        با این کد یا هر جوره دیگه که می نویسم فقط یک بار داخل تابع اینتراپت میره و اجراش میکنه و همونجا هم گیر میکنه بقیه برنامه رو اجرا نمی کنه. فقط LED ای که رو PA2 گذاشتم یه بار چشمک میزنه. تنظیمات رو اینجوری دادم که DIV رو 5 دادم و MUL رو 25 دادم CSS روی PLL Clock و prescaler رو هم clock/2 گذاشتم. مقدار RC رو 23961 دادم. تو همه مثالای تایمر بعد از تنظیمات یه حلقه while(1) میذارن این حلقه لازمه؟ برنامم خیلی تابع تو تابعه نمیتونم حلقه تعریف کنم این while هم که الان گذاشتم فقط برای تست بود که جواب هم نداد در حقیقت به محض اینکه کدهای تنظیم رو رد می کنه یه اینتراپت میده بعدشم اصلا بقیه کدا رو اجرا نمی کنه. محاسبات رو اینجوری انجام دادم :

                        PLLCK = Main OSC*(MUL+1)/DIV
                        PLLCK = 18432000*(25+1)/5 = 95846400
                        MCK = 95846400/2(prescaler) = 47923200 MCK = 47923200
                        Timer clock frequency = MCK/timer clock DIV = 47923200/2 = 23961600 Hz

                        از تو یه راهنمای دیگه هم خوندم مقدار RC رو میشه اینجوری حساب کرد : (t مقدار مورد نظر پریود مقایسه تایمر بر حسب ثانیه هست که من اینجا 0.001 میلی ثانیه یا 1 ثانیه گرفتم و FTC فرکانس کلاک تایمر برحسب هرتز هست)

                        RC = t*FTC = 0.001*23961600 = 23961

                        ممنون میشم راهنماییم کنی مشکلش رو حل کنم.

                        دیدگاه


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

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

                          کد:
                          void timer1_c_irq_handler (void)
                          {
                          	
                          	unsigned int dummy;
                          	
                          	dummy = AT91C_BASE_TC1->TC_SR;
                          	dummy = dummy;
                          	
                          	T_Counter++;
                          	
                          	AT91C_BASE_TC1->TC_CCR |= AT91C_TC_CLKEN | AT91C_TC_SWTRG;
                          	
                          	
                          	AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
                          	
                           AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);   //Normal work LED notification
                          	delay_ms(500);
                          	AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);	
                          	
                          }
                          
                          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 = 23961; 
                            AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG;
                          
                           while(1)
                          		{
                          			AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA3);   //Normal work LED notification
                          			delay_ms(100);
                          			AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA3);
                          
                          			Func1();               /*first function */
                          			AT91F_PIO_SetOutput(AT91C_BASE_PIOA, AT91C_PIO_PA4);   //Normal work LED notification
                          			delay_ms(100);
                          			AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA4);		
                          			Func2();            /*second function */
                          	 }
                          }
                          با این کد یا هر جوره دیگه که می نویسم فقط یک بار داخل تابع اینتراپت میره و اجراش میکنه و همونجا هم گیر میکنه بقیه برنامه رو اجرا نمی کنه. فقط LED ای که رو PA2 گذاشتم یه بار چشمک میزنه. تنظیمات رو اینجوری دادم که DIV رو 5 دادم و MUL رو 25 دادم CSS روی PLL Clock و prescaler رو هم clock/2 گذاشتم. مقدار RC رو 23961 دادم. تو همه مثالای تایمر بعد از تنظیمات یه حلقه while(1) میذارن این حلقه لازمه؟ برنامم خیلی تابع تو تابعه نمیتونم حلقه تعریف کنم این while هم که الان گذاشتم فقط برای تست بود که جواب هم نداد در حقیقت به محض اینکه کدهای تنظیم رو رد می کنه یه اینتراپت میده بعدشم اصلا بقیه کدا رو اجرا نمی کنه. محاسبات رو اینجوری انجام دادم :

                          PLLCK = Main OSC*(MUL+1)/DIV
                          PLLCK = 18432000*(25+1)/5 = 95846400
                          MCK = 95846400/2(prescaler) = 47923200 MCK = 47923200
                          Timer clock frequency = MCK/timer clock DIV = 47923200/2 = 23961600 Hz

                          از تو یه راهنمای دیگه هم خوندم مقدار RC رو میشه اینجوری حساب کرد : (t مقدار مورد نظر پریود مقایسه تایمر بر حسب ثانیه هست که من اینجا 0.001 میلی ثانیه یا 1 ثانیه گرفتم و FTC فرکانس کلاک تایمر برحسب هرتز هست)

                          RC = t*FTC = 0.001*23961600 = 23961

                          ممنون میشم راهنماییم کنی مشکلش رو حل کنم.
                          سلام
                          نه اینجورا هم که شما میگی نیست
                          ببین من یه ایراد توی برنامت میبینم و اونم اینه که توی تابع اینتراپت کدی که نشان دهنده انتهای تابع وقفه هست رو وسط تابع گذاشتی منظورم این خطه
                          کد:
                          AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
                          این خط رو ببر انتهای تابع وقفت، قبل از بسته شدن آکولاد تابع
                          تست کن خبرشو بهم بده
                          زندگی یعنی امید و حرکت
                          کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                          سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                          برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                          به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                          دیدگاه


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

                            ببخشید وسط بحثتون وارد میشم، سوال برام مطرح شد.اگه بخوام از تایمر برای تولید تاخیرهای متغیر تو طول برنامم استفاده کنم باید تو مد capture ازش استفاده کنم؟
                            اون جور که من خوندم تو مود capture تایمر ورودی لازم داره تا بشماره.حالا برای ایجاد تاخیر چه ورودی دریافت میکنه؟
                            خودم ایده م این بود که رو مود wave هر وقت که rc trig داشتم وقفه بدم.
                            mck = 66000000
                            mck/1024 و rc رو واسه یه ثانیه تنظیم کنم،ra رو هم مساوی با rc بدم که هر یه ثانیه tioa یک بشه.بعد هر یه ثانیه وقفه داشته باشم و تو روتین وقفه تاخیر رو محاسبه کنم.نمی دونم، منطقش درسته یا نه!؟
                            سوال سومم هم اینه که،اگر بخوام وسط برنامه بگم که دیگه وقفه تایمر رو نمی خوام،باید از interrupt mask غیر فعال کنمش یا کلا کلاک تایمر رو غیر فعال کنم؟

                            دیدگاه


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

                              سلام
                              نه اینجورا هم که شما میگی نیست
                              ببین من یه ایراد توی برنامت میبینم و اونم اینه که توی تابع اینتراپت کدی که نشان دهنده انتهای تابع وقفه هست رو وسط تابع گذاشتی منظورم این خطه
                              کد: [انتخاب]

                              AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);

                              این خط رو ببر انتهای تابع وقفت، قبل از بسته شدن آکولاد تابع
                              تست کن خبرشو بهم بده
                              سلام. این کار رو هم انجام دادم کد رو به شکل زیر تغییر دادم حتی بقیه برنامه رو برای تست بی خیال شدم و حلقه رو آوردم بالاتر روشن خاموش شدن 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;
                              	    }				 
                              	 }
                              }

                              دیدگاه

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