اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    دیدگاه


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

      نوشته اصلی توسط حامد AT91
      من واقعا نمی دونم :sad: اصولا برنامه که به هر زبانی برای میکرو می نویسید باید در یک حلقه بی نهایت باشد. دلایل آن هم که فکر کنم همه می دونند به خاطر چی می باشد و باید انتها برنامه حتما با یک حلقه بی نهایت بسته شود.
      جالبه که توی اون مجله pmm که داشتم از روش می خوندم همه برنامه هاش همین طوریه. یعنی حلقه بی نهایت نداره. نمی دونم چرا این اتفاق میفته :cry2:
      نوشته اصلی توسط حامد AT91
      آره داخل میکرو یک واحد به نام PMC هست که یک سری رجیستر مربوط به خود دارد( نه فیوز بیت) یعنی با ریست شدن این رجیسترها مقدار اولیه خود را می گیرند و باید برنامه نویس در ابتدای برنامه خود در main آنها را مقدار دهی نماید. توسط این واحد شما می توانید کلاک هر قسمت را کنترل و تنظیم نمایید و فرکانس کاری میکرو را هم می توانید تنظیم نمایید. حتی توسط این قسمت می توان کلاک پردازنده را غیر فعال کرد :biggrin: و پردازنده دیگر کاری انجام نمی دهد و در حالت بی کاری می رود و وقتی یک وقفه بیاید کلاک پردازنده دوباره به صورت خودکار فعال می شود.
      ای ول. چه میکرو خفنیه ها!!!
      دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

      دیدگاه


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

        نوشته اصلی توسط حامد پور آزاد
        ممنونم واقعاً.
        البته این کتاب رو آنلاین پیدا نکردم. اما فردا میرم می گیرمش. این طور که فهمیدم با IAR کار کرده. درسته؟
        اگه نتونستی گیرش بیاری از سایت زیر می توانی آنلاین خرید کنی و با پست برات می فرستن.
        http://www.fardab.com/index.php?option=com_bookcity&Itemid=58&ta sk=detailproduct&id=11353
        آره با IAR کار کرده و کلی هم مثال برای هر قسمت داره . نرم افزار IAR داخل cd کتاب رو حتما اول نصب کن تا خوب یادش بگیری بعد اگه خواستی برو ورژن های بالاتر رو نصب کن.

        دیدگاه


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

          نوشته اصلی توسط حامد پور آزاد
          جالبه که توی اون مجله pmm که داشتم از روش می خوندم همه برنامه هاش همین طوریه. یعنی حلقه بی نهایت نداره. نمی دونم چرا این اتفاق میفته :cry2:
          ای ول. چه میکرو خفنیه ها!!!
          من برنامه های pmm را دقیقا ندیدم چون با keil کار می کرد و من با iar کار می کردم. ولی باید این حلقه بی نهایت باشد.
          همین قضیه غیرفعال کردن کلاک میکرو هم برنامه اش داخل این کتاب فکرکنم فصل وقفه ها هستش.

          دیدگاه


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

            یه سوال دیگه. الان من این برنامه رو نوشتم. توش اومدم همه رجیسترهایی که به کلاک سیستم مربوط هست رو تنظیم کردم که بیاد از رو کریستال خروجی مقدار فرکانس رو بخونه. الان با همین تابع تاخیر هم که نوشتم چشمک به شکل قابل قبولی زده میشه (تقریباً توی هر ثانیه 3 بار کامل چشمک میزنه) اما یه مشکل دیگه هست. اونم این که این چشمک زدن دائمی نیست، یعنی وقتی تغذیه رو وصل می کنم، LED اول یه 20 ثانیه تقریباً روشنه، بعد خاموش میشه و 20 ثانیه خاموشه، بعد شروع میکنه طبق برنامه چشمک زدن. یعد از اینکه حدود 20 ثانیه چشمک زد، دوباره بر می گرده از اول همین سیکل رو انجام میده...

            کد:
            #include <Atmel/ioat91sam7s64.h>
            
            #define MCK_MHZ		(18.432)
            
            void delay (unsigned int);
            void main ()
            {
             *AT91C_CKGR_MOR = 0x00000001;
             *AT91C_PMC_MCKR = 0x00000001;
             *AT91C_PIOA_PER = 0x00000001;
             *AT91C_PIOA_OER = 0x00000001;
             while (1)
              {
               
            	*AT91C_PIOA_SODR = 0x00000001; // PA.0 to be set 
            	delay(1000000);
                *AT91C_PIOA_CODR = 0x00000001;  // PA.0 to be cleared 
            	delay(1000000);
              }
            }
            
            void delay (unsigned int i)
            {
             unsigned int j=0;
             j = i;
             
             while (j)
             {
              j--;
             }
            }
            دانش فني تا به عمل تبديل نشده، ذره اي ارزش نداره. اما بعضي وقت ها بايد از دانش براي باز کردن مرزهاي جديدي در علم استفاده کرد، نه اينکه اونها رو صرفاً فقط به عمل تبديل کرد.

            دیدگاه


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

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

              دیدگاه


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

                سلام
                برای استفاده از هر فرکانسی بهتر هست حتما از PLL استفاده کرد مثلا برای اینکه خود فرکانس 18.432 کریستال را استفاده کنی مقدار DIV=2 , MUL=1 قرار بده مشکلت حل می شود من برنامه شما را اصلاح کردم و در این قسمت برای فرکانس 18.432 تنظیم کردم برنامه رو اجرا کنی می بینید که به درستی کار می کند و مشکلی هم ندارد.
                کد:
                #include <Atmel/ioat91sam7s64.h>
                
                void delay (unsigned int);
                void main ()
                {
                //--------------------speed up--------------------------
                AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
                AT91C_BASE_CKGR->CKGR_PLLR = 0x13F02; 
                AT91C_BASE_PMC->PMC_MCKR = 0x3;
                AT91C_BASE_PMC->PMC_SCER = 0x1;
                //-----------------------------------------------------
                *AT91C_PIOA_PER = 0x00000001;
                *AT91C_PIOA_OER = 0x00000001;
                while (1)
                 { 
                 *AT91C_PIOA_SODR = 0x00000001; // PA.0 to be set
                 delay(1000000);
                 *AT91C_PIOA_CODR = 0x00000001;  // PA.0 to be cleared
                 delay(1000000);
                 }
                }
                
                void delay (unsigned int i)
                {
                unsigned int j=0;
                j = i; 
                while (j)
                 {
                 j--;
                 }
                }
                البته به نظر من اگه قرار بود از فرکانس 18.432 استفاده کنیم خوب چرا این همه به خودمون زحمت می دهیم از AVR استفاده می کردیم :biggrin: بهترین فرکانس برای 7S,7X فرکانس 48MHZ می باشد. قسمت SPEED UP را به طور زیر تغییر بده و از فرکانس 48 استفاده کن
                کد:
                //--------------------speed up--------------------------
                AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
                AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; 
                AT91C_BASE_PMC->PMC_MCKR = 0x3;
                AT91C_BASE_PMC->PMC_SCER = 0x1;
                //-----------------------------------------------------

                دیدگاه


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

                  من واقعاً ازت ممنونم آقا حامد. خیلی به من کمک کردی. اگه راه داشت 10 بار تشکر می زدم، اما چه میشه کرد که فقط یه بار میشه روی هر کامنت تشکر زد :mrgreen: :rolleyes:

                  اما چندتا سوال دیگه هم دارم.

                  1- اینکه مثلاً چرا توی همین برنامه ای که نوشتی، مثلاً تو بخش speed up به متغیرا مستقیم دسترسی نداشتی، اما تو بقیه بخشا با اشاره گر مستقیم رفتی سر اونها. این متغیرا فرق دارن؟ مثلاً نمیشه مستقیم بهشون رسید؟

                  2- مگه نه اینکه رجیسترا اینجه 32 بیتیه؟ باید 8 تا عدد هگز بنویسیم. اما یه سری جاها تعدادش کمتره. من فکر می کنم وقتی کمتر می نویسیم، از LSB شروع میکنه به نوشتن، هر چند بیت که عدد گذاشتیم رو برمیداره، بقیش رو صفر میذاره. درسته؟

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

                  دیدگاه


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

                    نوشته اصلی توسط حامد پور آزاد
                    من واقعاً ازت ممنونم آقا حامد. خیلی به من کمک کردی. اگه راه داشت 10 بار تشکر می زدم، اما چه میشه کرد که فقط یه بار میشه روی هر کامنت تشکر زد :mrgreen: :rolleyes:

                    اما چندتا سوال دیگه هم دارم.

                    1- اینکه مثلاً چرا توی همین برنامه ای که نوشتی، مثلاً تو بخش speed up به متغیرا مستقیم دسترسی نداشتی، اما تو بقیه بخشا با اشاره گر مستقیم رفتی سر اونها. این متغیرا فرق دارن؟ مثلاً نمیشه مستقیم بهشون رسید؟

                    2- مگه نه اینکه رجیسترا اینجه 32 بیتیه؟ باید 8 تا عدد هگز بنویسیم. اما یه سری جاها تعدادش کمتره. من فکر می کنم وقتی کمتر می نویسیم، از LSB شروع میکنه به نوشتن، هر چند بیت که عدد گذاشتیم رو برمیداره، بقیش رو صفر میذاره. درسته؟

                    ممنون.
                    نه بابا خواهش می کنم این چه حرفیه من به شخصه هر چی بلد باشم و در اختیار دیگران می گذارم تا حد اقل دعای خیرشون تو اون دنیا شاید به درد ما بخورد. :biggrin:
                    من به شخصه برنامه هامو شبیه همون قسمت speed up می نویسم چون به این روش عادت دارم و چون احساس می کنم اصولی تر باشد و اصلاح برنامه راحتتر می باشد. مثلا برای usart1 اگر برنامه ای نوشته باشید و بخواهید برای usart0 آن را تبدیل بکنید کافی است US1 را به US0 در برنامه تغییر داد که می شود از Find نرم افزار استفاده کنید
                    کد:
                    AT91C_BASE_US1->US_CR=0x8;
                    AT91C_BASE_US1->US_MR=0xD0;
                    AT91C_BASE_US1->US_BRGR=0x27;
                    AT91C_BASE_US1->US_CR=0x40;
                    کد:
                    AT91C_BASE_US0->US_CR=0x8;
                    AT91C_BASE_US0->US_MR=0xD0;
                    AT91C_BASE_US0->US_BRGR=0x27;
                    AT91C_BASE_US0->US_CR=0x40;
                    چون برنامه شما را من copy و paste کردم اون قسمت ها را دیگر تغییر ندادم :biggrin:
                    در مورد 2 هم درسته عددی که می نویسیم را از سمت LSB پر می کند. بعضی رجیسترها با قرار دادن مقدار صفر هیچ اتفاق خاصی برای آنها نمی افتد پس وقتی ما با بیت های پر ارزش آن کاری نداریم می توانیم آنها را ننویسیم که صفر در نظر بگیرد.

                    دیدگاه


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

                      یکی این برنامه من هم یه نگاه میندازید؟ قراره چند تا LED رو به ترتیب خواموش و روشن کنه، ولی LEDها فقط روشن می مونن.
                      کامپایلر:IAR 6.10 ، هدر برد AT91SAM7X256 ECA
                      http://www.up98.org/images/vulthyw717mdkb70e3r9.rar
                      ;()((void (*)(void))0x0000))

                      دیدگاه


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

                        فکر کنم شاید هم مطمئنم که تاخیرم رو غلط نوشتم، ولی بدون i++و i-- و j++ هم نوشتم همین بود جوابش، چه کارش کنم به نظر شما؟ i-- رو حذف کنم درست نمیشه؟
                        ;()((void (*)(void))0x0000))

                        دیدگاه


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

                          خوب معلومه که تابع wait رو اشتباه نوشتی. ببین:
                          کد:
                          void wait(void)
                          {
                           unsigned int i,j;
                           for(i=0;i<1000000;i++){
                            i++;
                             for(j=0;j<1000000;j++){
                              j++;
                              i--;
                             }
                           }
                          }

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

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

                          دیدگاه


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

                            اون صفحه رو خوندم برای همین هم اون 2تا ++ رو نوشتم بین کد، اون -- هم می دونم خیلی اشتباه محضی بود، حالا کد شما کوشش؟
                            ;()((void (*)(void))0x0000))

                            دیدگاه


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

                              این ++ که میگی رو متوجه نشدم کدوم یکی رو میگی. اما برای اینکه کامپایلر نیاد بلافاصله مقدار آخر رو برای متغیر جایگزین کنه، کافیه داخل تابع به متغیر دیگه تعریف کنی و با اون کار کنی. حداقل من که اینطور می نویسم کار می کنه. اینم کد:
                              کد:
                              void delay (unsigned int i)
                              {
                              unsigned int j=0;
                              j = i; 
                              while (j)
                               {
                               j--;
                               }
                              }


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

                              دیدگاه


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

                                خیلی ممنون، بلاخره برا من راه افتاد، هم با کد آقا حامد و هم با کد اصلاح شده ی خودم. که به این صورت قسمت wait اصلاح شده:
                                کد:
                                void wait(void)
                                {
                                 unsigned int i,j;
                                 for(i=0;i<2000000;i++){
                                  i++;
                                   for(j=0;j<2000000;j++){
                                    j++;
                                   }
                                 }
                                }
                                ;()((void (*)(void))0x0000))

                                دیدگاه

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