اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام.
    این برنامه خیلی خیلی ساده رو نوشتم اما عجیب و غریب کار می کنه. یعنی رو پایه PA2 یه LED گذاشتم، این تقریباً همیشه روشنه، یه لحظه خاموش میشه بعد دوباره روشن. تنظیمات کریستال و نوع میکروم هم درسته. با keil دارم می نویسم.
    کد:
    #include <AT91SAM7s64.H>            /* AT91SAMT7S64 definitions */
    #include <lib_AT91SAM7s64.h>
    void wait(void); 
    int main (void) {
    	AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);
    	
    	while (1){
    	 
    	 AT91F_PIO_SetOutput (AT91C_BASE_PIOA, AT91C_PIO_PA2);
       wait();
     AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2);
       wait();
    	}
    }
    void wait (void) {
     unsigned int n;
     for (n = 0; n < 100000; n++);
    }

    لطفاً بگید مشکل چیه :cry2: :cry2: :cry2:
    دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

    #2
    پاسخ : لطفاً بگید مشکل این برنامه چیه

    من با ارم کار نکردم اما چند تا اشکال تو برنامتون هست یکی } اخر برنامتون هست که باید با { تعویض بشه
    و یه احتمال دیگه که میشه داد اینکه میکروتون ریست بشه و دائم چراغ روشن بشه شما برنامتون رو برعکس کنید یعنی اول پین رو کلیر کنید و بعد ست کنید ببینید اصلا led روشن میشه؟

    دیدگاه


      #3
      پاسخ : پاسخ : لطفاً بگید مشکل این برنامه چیه

      نوشته اصلی توسط علی علی پور ریکنده
      من با ارم کار نکردم اما چند تا اشکال تو برنامتون هست یکی } اخر برنامتون هست که باید با { تعویض بشه
      و یه احتمال دیگه که میشه داد اینکه میکروتون ریست بشه و دائم چراغ روشن بشه شما برنامتون رو برعکس کنید یعنی اول پین رو کلیر کنید و بعد ست کنید ببینید اصلا led روشن میشه؟
      نه دیگه علی جان توی برنامه نویسی DUMB نیستم که. اون } که میگی بخاطر کپی پیست توی اینجا اینجوری شده. ضمناً اگه } باشه کامپایلر خطا میده. این حرفت یعنی هم من و هم Keil رو DUMB فرض کردی :mrgreen:

      و در مورد احتمال دوم، همون طور که معلومه، اگه اول خاموش کنم و بعد روشن، میکرو اکثراً خاموشه، یه لحظه روشن میشه و بعدم دوباره خاموش...
      دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

      دیدگاه


        #4
        پاسخ : لطفاً بگید مشکل این برنامه چیه

        سلام دوباره
        نظرت رو در مورد احتمال دوم رو دقیقا متوجه نشدم اما من با avr این مشکل رو داشتم و led با نور متوسطی روشن میموند چون بهش در واقع pwm میرسید!

        دیدگاه


          #5
          پاسخ : لطفاً بگید مشکل این برنامه چیه

          سلام
          برنامه شما درست هست البته به نظر من مستقیم اگر با رجیسترها کار می کردید بهتر از این بود. برای اینکه یک پین را در حالت خروجی قرار دهید باید رجیستر PIO_PER و PIO_OER را باید مقدار دهی نمایید. که تابع AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA2); این کارو انجام می دهد.
          کد:
          __inline void AT91F_PIO_CfgOutput(
          	AT91PS_PIO pPio,       // \arg pointer to a PIO controller
          	unsigned int pioEnable)   // \arg PIO to be enabled
          {
          	pPio->PIO_PER = pioEnable; // Set in PIO mode
          	pPio->PIO_OER = pioEnable; // Configure in Output
          }
          و برای روشن وخاموش کردن پین باید رجیسترهای PIO_SODR و PIO_CODR را باید مقداردهی نمایید که توابع استفاده شده این کار را می کند.
          اما یک مشکل در تابع تاخیر شما می باشد که من با IAR این مشکل را داشتم که در مسیر زیر در این مورد بحث بسیاری شده
          http://www.eca.ir/forum2/index.php?topic=47811.0
          تغییر زیر را در تابع تاخیر ایجاد کن ببین مشکل حل می شود یا نه ؟
          کد:
          void delay (void)
          {
          unsigned int i,j;
          for (i=0;i<0xfffff;i++)
           j=AT91C_BASE_PMC->PMC_SCSR;
          }

          دیدگاه


            #6
            پاسخ : لطفاً بگید مشکل این برنامه چیه

            ممنون از پاسختون.
            متاسفانه نه. البته من اومدم برنامه رو مستقیم رو خود رجیستر ها نوشتم و delay رو هم همون طور که فرمودید تغییر دادم، اما همچنان همونه:
            کد:
            # include <AT91SAM7S64.H>            /* AT91SAMT7S64 definitions */ 
            void delay(void); 
            
            int main (void) { 
            	*AT91C_PIOA_PER = 0x00001; // Set in PIO mode 
            	*AT91C_PIOA_OER = 0x00001; // Configure in Output 
            	while(1){ 
            		*AT91C_PIOA_SODR = 0x00001; // PA.0 to be set 
            		delay(); 
            		*AT91C_PIOA_CODR = 0x00001;  // PA.0 to be cleared 
            		delay(); 
            	} 
            } 
            void delay (void)
            {
            unsigned int i,j;
            for (i=0;i<0xfffff;i++)
             j=AT91C_BASE_PMC->PMC_SCSR;
            }

            یعنی هنوزم بیشتر وقت روشنه.
            دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

            دیدگاه


              #7
              پاسخ : لطفاً بگید مشکل این برنامه چیه

              فرکانس کاری میکرو رو چند هستآ‌ ؟ دم دستت اسکوپ داری ؟ اگه فرکانس کاری شما پایین است مدت این تاخیر را کمتر کنید ببینیم نتیجه چی می شود .

              دیدگاه


                #8
                پاسخ : لطفاً بگید مشکل این برنامه چیه

                نوشته اصلی توسط حامد AT91
                فرکانس کاری میکرو رو چند هستآ‌ ؟ دم دستت اسکوپ داری ؟ اگه فرکانس کاری شما پایین است مدت این تاخیر را کمتر کنید ببینیم نتیجه چی می شود .
                فرکانس 18.432 هست. از همین هدر بردای فروشگاه.

                نه متاسفانه، توی خونه ام، اسکوپ ندارم! :cry2:
                دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

                دیدگاه


                  #9
                  پاسخ : لطفاً بگید مشکل این برنامه چیه

                  نوشته اصلی توسط حامد پور آزاد
                  فرکانس 18.432 هست. از همین هدر بردای فروشگاه.

                  نه متاسفانه، توی خونه ام، اسکوپ ندارم! :cry2:
                  ببین یک اشکال که در ذهن کسایی که با SAM کار می کنند همین هست. درسته که کریستال 18.432 به میکروتون متصل می باشد اما لزومی ندارد که میکرو شما با این فرکانس کار کند. در SAM7 ها سه منبع کلاک مورد استفاده قرار می گیرد :
                  1- کلاک آهسته که داخل میکرو یک RC وجود دارد که فرکانس آن حدود 32KHZ است.
                  2- اسیلاتور اصلی که به کریستال متصل شده به میکرو بستگی دارد که چه فرکانسی دارد. محدوده آن 3 تا 20 مگا هرتز می باشد.
                  3- خروجی PLL. البته ورودی PLL از اسیلاتور اصلی می باشد و توسط رجیسترهای قسمت PLL می توانید فرکانس ورودی را چند برابر کنید.
                  حال اگر شما رجیسترهای مربوط به قسمت PMC و CKGR را تنظیم نکنید و این رجیسترها مقدار اولیه خود را داشته باشد میکرو از طریق کلاک آهسته کلاک خود را تامین می کند یعنی اگر شما تنظیمات مربوطه را انجام ندهید میکرو با 32KHZ کار می کند.

                  من با KEIL کار نکرده ام و این قضیه رو که الان می خوام بگم را مطمئن نیستم . من دیدم برای تنظیمات KEIL در یک جای آن یک فرکانس را مشخص می کنید! حالا قضیه این می باشد که وقتی KEIL کامپایل می کند در کد خروجی رجیسترهای PLL و CKGR را مقدار دهی می کند یا این فرکانسی که شما در آن قسمت مشخص کرده اید فقط برای شبیه سازی KEIL می باشد؟!؟!
                  مثلا در codevision هم اگه یادتون باشه وقتی پروژه را می خواستید ایجاد کنید در یک جای آن مقدار فرکانس را مشخص می کردید که مثلا اگر از تابع Delay () استفاده کردید آن تاخیر به درستی ایجاد شود و با توجه به آن فرکانس مشخص شده. اما در عمل هم شما باید آن فرکانس را با توجه به فیوز بیت ها و کریستال درست می کردید. مثلا اگر در پروژه فرکانس را 8mhz تنظیم می کردید و یک تاخیر 1 ثانیه را با تابع Delay ایجاد می کردید و بعد اگر آنرا بر روی میکرو پروگرام میکردید و فیوز بیت ها و کریستال را رو 4mhz تنظیم می کردید آن تاخیر 2 ثانیه می شد.
                  حال برای چک کردن این کار راه های بسیاری است اما در برنامه شما با همان مقداری که برای تاخیر در نظر گرفته اید را عوض نکنید و فقط دو خطی که پایه میکرو را SET و CLR می کند را جابجا کنید و بعد از پروگرام نمودن ببینید نتیجه چی می شود و آن پایه برعکس حالت قبل کار می کند یا نه ؟ اگر برعکس حالت قبل کارکرد معلوم می شود که فرکانس میکرو همان 32KHZ می باشد و برای آنکه شما چشمک زدن LED را به خوبی ببینید باید تابع تاخیر را خیلی کمتر از این مقدارها قرار دهید. اما اگر برعکس کار نکرد معلوم می شود که فرکانس شما زیاد می باشد و KEIL رجیسترهای مربوطه را مقداردهی کرده است و در اینجا باید مقدار تاخیر را خیلی زیاد کنید. این مراحلی که گفتمو چک کن نتیجه رو اعلام کن :biggrin:

                  ببخشید خیلی پر حرفی کردم.

                  دیدگاه


                    #10
                    پاسخ : لطفاً بگید مشکل این برنامه چیه

                    نه، اتفاقاً حرفهات خیلی هم خوب بود. ممنون واقعاً.

                    من که دقیقاً دلیلش رو نفهمیدم. اما با تغییر دادن کد به این شکل الان درست چشمک می زنه:
                    کد:
                    # include <AT91SAM7S64.H>            /* AT91SAMT7S64 definitions */ 
                    void delay(int); 
                    
                    int main (void) { 
                    	*AT91C_PIOA_PER = 0x00001; // Set in PIO mode 
                    	*AT91C_PIOA_OER = 0x00001; // Configure in Output 
                    		*AT91C_PIOA_SODR = 0x00001; // PA.0 to be set 
                    		delay(10000); 
                    		*AT91C_PIOA_CODR = 0x00001;  // PA.0 to be cleared 
                    		delay(10000); 
                    } 
                    void delay (int n)
                    {
                    	while (n!=0){
                    		n--;
                    	}
                    
                    //unsigned int i,j;
                    //for (i=0;i<0xfffff;i++)
                     //j=AT91C_BASE_PMC->PMC_SCSR;
                    }

                    فکر می کنم این آی سی ها به خاطر معماری RISC هر دستور رو لزوماً توی یه کلاک اجرا نمی کنن (مثل AVR که معماریش CISC هست).
                    به همین خاطر این عدد شمارشی که من گذاشتم با این که خیلی کمه، اما الان داره با زمان تقریباً 1 ثانیه درست کار می کنه. تو 8051 هم مل یه همچین مشکلی رو داشتیم.
                    بر اساس اون چیزی که گفتی به نظر میرسه که الان فرکانس میکرو 32KHz هست. من که الان تازه شروع کردم keil یاد بگیرم، اما فکر می کردم چون روی خود هدر برد این کریستال هست و موقع پروگرم کردن SAMBA خودش یه برنامه اولیه میریزه، طبیعتاً باید این فرکانس باشه.
                    دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

                    دیدگاه


                      #11
                      پاسخ : لطفاً بگید مشکل این برنامه چیه

                      یه سوال، من از کدایی که واسه IAR دیدم به نظرم رسید که اون از Keil ساده تره. درسته؟

                      اگه اون ساده تره برم سراغش. البته اگه بتونم یه سری PDF واسش پیدا کنم :rolleyes:
                      دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

                      دیدگاه


                        #12
                        پاسخ : لطفاً بگید مشکل این برنامه چیه

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

                        من که دقیقاً دلیلش رو نفهمیدم. اما با تغییر دادن کد به این شکل الان درست چشمک می زنه:
                        کد:
                        # include <AT91SAM7S64.H>            /* AT91SAMT7S64 definitions */ 
                        void delay(int); 
                        
                        int main (void) { 
                        	*AT91C_PIOA_PER = 0x00001; // Set in PIO mode 
                        	*AT91C_PIOA_OER = 0x00001; // Configure in Output 
                        		*AT91C_PIOA_SODR = 0x00001; // PA.0 to be set 
                        		delay(10000); 
                        		*AT91C_PIOA_CODR = 0x00001;  // PA.0 to be cleared 
                        		delay(10000); 
                        } 
                        void delay (int n)
                        {
                        	while (n!=0){
                        		n--;
                        	}
                        
                        //unsigned int i,j;
                        //for (i=0;i<0xfffff;i++)
                         //j=AT91C_BASE_PMC->PMC_SCSR;
                        }

                        فکر می کنم این آی سی ها به خاطر معماری RISC هر دستور رو لزوماً توی یه کلاک اجرا نمی کنن (مثل AVR که معماریش CISC هست).
                        به همین خاطر این عدد شمارشی که من گذاشتم با این که خیلی کمه، اما الان داره با زمان تقریباً 1 ثانیه درست کار می کنه. تو 8051 هم مل یه همچین مشکلی رو داشتیم.
                        بر اساس اون چیزی که گفتی به نظر میرسه که الان فرکانس میکرو 32KHz هست. من که الان تازه شروع کردم keil یاد بگیرم، اما فکر می کردم چون روی خود هدر برد این کریستال هست و موقع پروگرم کردن SAMBA خودش یه برنامه اولیه میریزه، طبیعتاً باید این فرکانس باشه.
                        من در برنامه ات حلقه while (1) را نمی بینم ؟!؟!
                        این ARM معماری آن RISC است AVR و PIC هم معماری RISC دارند و دستورات در یک کلاک اجرا می شوند. و در معماری CISC مثل 8051 دستورات در یک کلاک اجرا نمی شوند و در8051 مثلا در 12 کلاک اجرا می شود. البته دستورات اسمبلی در یک کلاک اجرا می شوند نه دستورات زبان C چون ممکن است یک دستور زبان C چند دستور اسمبلی شود.
                        آره معلوم می شود که میکرو با فرکانس 32KHZ دارد کار می کند بخاطر همین مقدار آن تاخیر انقدر کم می باشد.
                        برنامه SAMBA بر طبق کریستال 18.432 می آید فرکانس میکرو را روی 48MHZ تنظیم می کند و با کامپیوتر ارتباط برقرار می کند و بعد از اینکه برنامه خود را درون میکرو پروگرم کنید و میکرو را ریست کنید رجیسترها مقدار اولیه خود را میگیرد. اما این تاخیرها هیچ وقت دقیق نمی باشد و کامپایلر بر روی آن تاثیر دارد و بستگی به کل برنامه شما دارد برای تاخیر دقیق باید از تایمرها استفاده کرد.

                        دیدگاه


                          #13
                          پاسخ : لطفاً بگید مشکل این برنامه چیه

                          نوشته اصلی توسط حامد AT91
                          من در برنامه ات حلقه while (1) را نمی بینم ؟!؟!
                          دقیقاً!
                          بود و نبودش فرقی نداره. من به عمد این شکلی نوشتم که بپرسم واقعاً چرا؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :angry:
                          اما یادم رفت بپرسم. خوب شد گفتید!
                          نوشته اصلی توسط حامد AT91
                          این ARM معماری آن RISC است AVR و PIC هم معماری RISC دارند و دستورات در یک کلاک اجرا می شوند. و در معماری CISC مثل 8051 دستورات در یک کلاک اجرا نمی شوند و در8051 مثلا در 12 کلاک اجرا می شود. البته دستورات اسمبلی در یک کلاک اجرا می شوند نه دستورات زبان C چون ممکن است یک دستور زبان C چند دستور اسمبلی شود.
                          آره معلوم می شود که میکرو با فرکانس 32KHZ دارد کار می کند بخاطر همین مقدار آن تاخیر انقدر کم می باشد.
                          برنامه SAMBA بر طبق کریستال 18.432 می آید فرکانس میکرو را روی 48MHZ تنظیم می کند و با کامپیوتر ارتباط برقرار می کند و بعد از اینکه برنامه خود را درون میکرو پروگرم کنید و میکرو را ریست کنید رجیسترها مقدار اولیه خود را میگیرد. اما این تاخیرها هیچ وقت دقیق نمی باشد و کامپایلر بر روی آن تاثیر دارد و بستگی به کل برنامه شما دارد برای تاخیر دقیق باید از تایمرها استفاده کرد.
                          در مورد نوع معماری حق با شماست. من اسم ها رو قاطی کردم.

                          یعنی شما می گید که فرکانس میکرو رو میشه تو خود برنامه تعیین کرد؟ یعنی فیوز بیت داره؟

                          این سوال دیگه رو هم جواب میدید؟ یعنی به نظر شما IAR ساده تره یا Keil؟ اینم بگم که من برنامه نویسیم خوبه. مشکلی از این بابت ندارم.
                          دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

                          دیدگاه


                            #14
                            پاسخ : لطفاً بگید مشکل این برنامه چیه

                            نوشته اصلی توسط حامد پور آزاد
                            یه سوال، من از کدایی که واسه IAR دیدم به نظرم رسید که اون از Keil ساده تره. درسته؟

                            اگه اون ساده تره برم سراغش. البته اگه بتونم یه سری PDF واسش پیدا کنم :rolleyes:
                            ببین IAR از KEIL ساده تر نیست و اتفاقا حرفه ای تر هم می باشد و مشکلات خودش را دارد اما در کل من IAR را ترجیح می دهم الان کلی برنامه باهاش نوشتم و هیچ مشکلی نداشته است. PDF برای آموزشش که زیاد من ندیدم PDF های خود IAR هم به طور کلی در مورد ARM می باشد و در مورد AT91SAM ها توضیح نداده است چون یک سری فایل باید برای آن به پروژه خود اضافه کنید با توجه به کاری که می خواهید انجام دهید مخصوصا برای راه اندازی وقفه های میکرو. اگه تازه شروع به کار با ARM کرده اید بهتر از اول با IAR کار کنید برای اینکه نرم افزار را یاد بگیرید و همین طور قسمت های مختلف میکرو را به خوبی یاد بگیرید من پیشنهاد می کنم کتاب "مرجع کامل میکروکنترلرهای ARM سری AT91" انتشارات نص را بگیرید و از روی آن برید جلو مصمئنا میکرو را به خوبی یاد خواهید گرفت.

                            دیدگاه


                              #15
                              پاسخ : لطفاً بگید مشکل این برنامه چیه

                              نوشته اصلی توسط حامد پور آزاد
                              دقیقاً!
                              بود و نبودش فرقی نداره. من به عمد این شکلی نوشتم که بپرسم واقعاً چرا؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :angry:
                              اما یادم رفت بپرسم. خوب شد گفتید!
                              من واقعا نمی دونم :sad: اصولا برنامه که به هر زبانی برای میکرو می نویسید باید در یک حلقه بی نهایت باشد. دلایل آن هم که فکر کنم همه می دونند به خاطر چی می باشد و باید انتها برنامه حتما با یک حلقه بی نهایت بسته شود.

                              نوشته اصلی توسط حامد پور آزاد
                              یعنی شما می گید که فرکانس میکرو رو میشه تو خود برنامه تعیین کرد؟ یعنی فیوز بیت داره؟
                              آره داخل میکرو یک واحد به نام PMC هست که یک سری رجیستر مربوط به خود دارد( نه فیوز بیت) یعنی با ریست شدن این رجیسترها مقدار اولیه خود را می گیرند و باید برنامه نویس در ابتدای برنامه خود در main آنها را مقدار دهی نماید. توسط این واحد شما می توانید کلاک هر قسمت را کنترل و تنظیم نمایید و فرکانس کاری میکرو را هم می توانید تنظیم نمایید. حتی توسط این قسمت می توان کلاک پردازنده را غیر فعال کرد :biggrin: و پردازنده دیگر کاری انجام نمی دهد و در حالت بی کاری می رود و وقتی یک وقفه بیاید کلاک پردازنده دوباره به صورت خودکار فعال می شود.

                              دیدگاه

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