اطلاعیه

Collapse
No announcement yet.

سوالات کتاب at91 (نص)

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

    #76
    پاسخ : سوالات کتاب at91 (نص)

    سلام
    ببین اگر کتاب AT91 را دارید طریقه دیباگ کردن با نرم افزار را در صفحه 156 به بعد گفته در حالت معمولی و اگر بخواهید با JTAG دیباگ کنید هم تنظیماتش را در صفحه 167 گفته است. اما در کل (پایین صفحه 156) شما الان در حالت Release هستید و فقط می توانید برنامه اسمبلی را دیباگ کنید. اگر پیکربندی خود را در حالت Debug قرار دهید و تنظیمات پروژه خود را هم دوباره انجام دهید می توانید هم برنامه اسمبلی و هم c را دیباگ نمایید.

    دیدگاه


      #77
      پاسخ : سوالات کتاب at91 (نص)

      سلام
      1) تو مثال 6-4 صفحه 146 موقعی که برنامه رو کامپایل میکنم این Warning رو میده

      Warning[Pe068]: integer conversion resulted in a change of sign D:\d\Program Files\IAR 5\My Project\test. 146\main.cpp 18


      ولی وقتی مقدار31 رو به 30 تغیر میدم درست میشه چرا؟

      تو همین مثال کار این ریجیستر PIO_PDR غیر فعال کردن pullup خروجی؟


      2) مثال 1-8 صفحه 217
      چرا مقدار ریجیستر TCB_BMR رو 0 داده با این حساب اگه بیتهای 2و3و4و5 هم صفر بشن که TCLK1 , TCLK2 هم انتخاب میشن

      با تشکر از دوستان...
      ذکات علم یاد دادنه ....

      دیدگاه


        #78
        پاسخ : سوالات کتاب at91 (نص)

        سلام
        1- نباید warning رو بده. نمی دانم برای چی هست. حالا warning زیاد مهم نیست برنامه باید درست کار کند. رجیستر PIO_PDR (توضیحاتش صفحه 132) برای این می باشد که شما از پین 31 به عنوان ورودی و خروجی استفاده نمی کنید و آنرا برای دستگاه جانبی (حالت Aو حالت B) فعال می کنید.
        2- درسته آنها هم برای XC1,XC2 انتخاب می شوند اما شما در رجیستر TC_CMR توسط بیت های TCCLKS (صفحه 203) کلاک مورد نظر (XC0) را انتخاب می کنید. اگر برای تایمر دیگری به طور مثال XC1 را هم انتخاب کردید در اینصورت باید در رجیستر TC_BMR دقیقا XC1 را درست انتخاب کنید. در صورتی که از XC1,XC2 برای تایمر دیگری استفاده نکنید مقدار آنها مهم نمی باشد.

        دیدگاه


          #79
          سوالات کتاب at91 (نص)

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

          دیدگاه


            #80
            پاسخ : سوالات کتاب at91 (نص)

            مرجع کامل میکروکنترلرهای ARM سری AT91
            پدیدآورندگان: مهندس حامد پورخواجه، مهندس میثم شفیع طلایی
            ناشر: نص
            قیمت با CD:
            10000 تومان

            دیدگاه


              #81
              پاسخ : سوالات کتاب at91 (نص)

              http://www.fardab.com/index.php?option=com_bookcity&Itemid=58&ta sk=detailproduct&id=11353

              دیدگاه


                #82
                lمشکل با کتاببخانه Lcd

                سلام.من از هدر بورد x256 استفاده میکنم.با استفاده از کتابخانه lcd کاراکتری موجود در کتاب یه برنامه ساده نوشتم که یه متغیر هر چند میلی ثانیه زیاد میشه و این متغیر روی lcd کاراکتری نمایش داده میشه.برای اعداد دو رقمی مشکلی وجود نداره ولی اعداد سه رقمی به بالا مشکل پیدا میکنه.مشکلش اینه که مثلا عدد 123 را بصورت 321 نشون میده و یا 124 را به صورت 421 نمایش میده و به همین ترتیب تا اعداد چار رقمی هم ادامه داره.کسی تا حالا به این مشکل برخورد کرده؟؟؟چکارش باید بکنم؟؟؟ممنون

                دیدگاه


                  #83
                  پاسخ : سوالات کتاب at91 (نص)

                  کسی نیست جواب ما را بده؟؟؟ :bye

                  دیدگاه


                    #84
                    پاسخ : سوالات کتاب at91 (نص)

                    یه سایت عالی و کاملا فارسی با آموزش رایگان و شماتیک سخت افزار
                    www.armcenter.org
                    www. a r m c e n t e r. o r g

                    دیدگاه


                      #85
                      پاسخ : سوالات کتاب at91 (نص)

                      با سلام
                      دوستان من این مثال فصل هفتم که مربوط به RTT هست رو به همون شیوه ای که تو کتاب گفته شده کامپایل کردم و بعد پروگرام کردم و جواب داد .

                      حالا من میخوام این رو با دیباگر IAR تست کنم ، وارد دیباگر میشم بعد میزارمش روی اتو استپ با استپهای 1 میلی ثانیه ، طبیعتا باید مقدار رجیستر RTVR شروع به شمارش کنه اما اصلا تکون نمیخوره و روی صفر میمونه ! چرا ؟

                      فکر کنم مشکل از این قسمت که تو عکس پایین مشخص کردم باشه و باید مثل فایل لینکر مربوط به میکرو با پسوند icf یه فایلی با پسوند ddf مربوط به میکرو اینجا انتخاب بشه تا درست عمل کنه البته فایلی هم که الان هست برای همین میکرو هست (at91sam7x256) .

                      pic1


                      دیدگاه


                        #86
                        پاسخ : سوالات کتاب at91 (نص)

                        آقا این وقفه ها چرا اینقدر اینجا پیچیده است !؟

                        اگه میشه یکی بیاد این مشکل اسلام و مسلمین رو با این اینتراپت اجنبی حل کنه :mrgreen:

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

                        البته اینجاست که شاعر میگه :

                        فهم سخن چون نکند مستمع (یعنی بنده) قوت طبع از متکلم(نویسنده ها)مجوی !

                        دیدگاه


                          #87
                          پاسخ : سوالات کتاب at91 (نص)

                          آقا حرفم رو پس میگرم ، واقعا که کتاب خیلی خوبیه و خیلی خوب گفته و مثال های عالی و روشنی داره .

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

                          خوب به ترتیب با ید کار های زیر صورت بگیره :

                          1. تو روال اصلی برنامه ، تو قسمت تنظیمات باید در ابتدا آدرس روتین سرویس وقفه (اسم تابع روتین وقفه) متناظر با منبع وقفه در رجیستر :

                          کد:
                          AIC_SVR[X] //X=0:31


                          به ترتیب زیر ذخیره بشه :

                          کد:
                          AT91C_BASE_AIC-> AIC_SVR[شناسه پریفرال مورد نظر] = (unsigned int) "اسم تابع روتین وقفه پریفرال مورد نظر"


                          مثلا فرض کنیم میخواهیم از وقفه تایمر/کانتر 0 استفاده کنیم و اسم تابع روتین وقفه اش رو گزاشتیم :

                          کد:
                          timer0_irq_handler

                          پس مینویسیم :

                          کد:
                          AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int) timer0_irq_handler;


                          شناسه پریفرالها از داخل هدر i/o هدر میکرو :


                          کد:
                          // *****************************************************************************
                          //        PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256
                          // *****************************************************************************
                          #define AT91C_ID_FIQ  ((unsigned int) 0) // Advanced Interrupt Controller (FIQ)
                          #define AT91C_ID_SYS  ((unsigned int) 1) // System Peripheral
                          #define AT91C_ID_PIOA  ((unsigned int) 2) // Parallel IO Controller A
                          #define AT91C_ID_PIOB  ((unsigned int) 3) // Parallel IO Controller B
                          #define AT91C_ID_SPI0  ((unsigned int) 4) // Serial Peripheral Interface 0
                          #define AT91C_ID_SPI1  ((unsigned int) 5) // Serial Peripheral Interface 1
                          #define AT91C_ID_US0  ((unsigned int) 6) // USART 0
                          #define AT91C_ID_US1  ((unsigned int) 7) // USART 1
                          #define AT91C_ID_SSC  ((unsigned int) 8) // Serial Synchronous Controller
                          #define AT91C_ID_TWI  ((unsigned int) 9) // Two-Wire Interface
                          #define AT91C_ID_PWMC  ((unsigned int) 10) // PWM Controller
                          #define AT91C_ID_UDP  ((unsigned int) 11) // USB Device Port
                          #define AT91C_ID_TC0  ((unsigned int) 12) // Timer Counter 0
                          #define AT91C_ID_TC1  ((unsigned int) 13) // Timer Counter 1
                          #define AT91C_ID_TC2  ((unsigned int) 14) // Timer Counter 2
                          #define AT91C_ID_CAN  ((unsigned int) 15) // Control Area Network Controller
                          #define AT91C_ID_EMAC  ((unsigned int) 16) // Ethernet MAC
                          #define AT91C_ID_ADC  ((unsigned int) 17) // Analog-to-Digital Converter
                          #define AT91C_ID_18_Reserved ((unsigned int) 18) // Reserved
                          #define AT91C_ID_19_Reserved ((unsigned int) 19) // Reserved
                          #define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved
                          #define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved
                          #define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved
                          #define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved
                          #define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved
                          #define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved
                          #define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved
                          #define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved
                          #define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved
                          #define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved
                          #define AT91C_ID_IRQ0  ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0)
                          #define AT91C_ID_IRQ1  ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1)
                          #define AT91C_ALL_INT  ((unsigned int) 0xC003FFFF) // ALL VALID INTERRUPTS
                          
                          // *****************************************************************************


                          اسم تابع هم مهم نیست چی باشه هر چیزی میتونه باشه فقط هر چقدر با ربط تر باشه مسلما به خوانا تر شدن کد کمک میکنه .

                          2. حالا باید نوع منبع وقفه تنیم بشه ، یعنی اینکه وقفه تو چه سطحی از سیگنال تریگر کننده رخ بده ، این عمل به واسطه بیت های SRCTYPE در رجیستر :

                          کد:
                          AT91C_BASE_AIC->AIC_SMR[X] //X=0:31


                          انجام میشه ، به فرمی که تو جدول زیر مشخص شده :



                          علاوه بر این باید اولویت وقفه مورد نظر با مقدار دهی به بیت های PRIOR از 0 تا 7 در همین رجیستر مشخص بشه .
                          0 : پایین ترین اولویت .
                          7 : بالاترین اولویت .

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

                          فرم کلی کار به صورت زیر هست :

                          کد:
                          AT91C_BASE_AIC->AIC_SMR[شناسه پریفرال مورد ننظر ] = 0Xxxxxxxxx;


                          به عنوان مثال فرض کنیم که میخواهیم تنظیمات این قسمت رو برای همون تایمر/کانتر0 با اولویت 7 و حساس به لبه بالا رونده تنظیم کنیم .

                          طبق جدول چون تایمر/کانتر0 یه منبع داخلی هست پس برای اینکه حساس به لبه بالا رونده باشه باید مقدار بیت ها ی SRCTYPE برابر با صفر باشه .

                          و برای اینکه وقفه مورد نظر دارای اولویت 7 باشه باید مقدار بیت های PRIOR برایر با 7 باشه .

                          پس باید بنویسیم :

                          کد:
                          AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0x00000007;



                          3. حالا باید بیت رجیستر AIC_ICCR متناظر با پریفرال مورد نظر پاک بشه برای اینکار باید مقدار یک رو در اون بیت نوشت ، به ترتیب زیر :


                          کد:
                          AT91C_BASE_AIC->AIC_ICCR = (1<<شناسه پریفرال مورد ننظر);


                          ه عنوان مثال برای تایمر/کانتر0 داریم :


                          کد:
                          AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_TC0);


                          4. حالا باید نوع وقفه مورد نظر از پریفرال که میخواهیم منجر به رخ دادن وقفه تایمر/کانتر0 بشه رو با یک کردن بیت متناظرش در رجیستر :

                          کد:
                          پریفرال مورد نظر_IER[X] //X=0:2

                          به فرم زیر :

                          کد:
                          AT91C_BASE_پریفرال مورد نظر ->پریفرال مورد نظر _IER = (1<<بیت مورد نظر)


                          به جای این قسمت از کد بالا :

                          کد:
                           (1<<بیت مورد نظر)


                          میشه از داخل فایل هدر I/O میکرو معادل با مسماش رو گزاشت که برای تمام رجیستر ها تعریف شده استفاده کرد مثلا برای رجیستر های TC_SR به قرار زیر هستند :


                          کد:
                          // -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- 
                          #define AT91C_TC_COVFS    ((unsigned int) 0x1 << 0) // (TC) Counter Overflow
                          #define AT91C_TC_LOVRS    ((unsigned int) 0x1 << 1) // (TC) Load Overrun
                          #define AT91C_TC_CPAS     ((unsigned int) 0x1 << 2) // (TC) RA Compare
                          #define AT91C_TC_CPBS     ((unsigned int) 0x1 << 3) // (TC) RB Compare
                          #define AT91C_TC_CPCS     ((unsigned int) 0x1 << 4) // (TC) RC Compare
                          #define AT91C_TC_LDRAS    ((unsigned int) 0x1 << 5) // (TC) RA Loading
                          #define AT91C_TC_LDRBS    ((unsigned int) 0x1 << 6) // (TC) RB Loading
                          #define AT91C_TC_ETRGS    ((unsigned int) 0x1 << 7) // (TC) External Trigger
                          #define AT91C_TC_CLKSTA    ((unsigned int) 0x1 << 16) // (TC) Clock Enabling
                          #define AT91C_TC_MTIOA    ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror
                          #define AT91C_TC_MTIOB    ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror
                          // -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- 
                          // -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- 
                          // -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register --------


                          حالا به عنوان مثال میخواهیم این تنظیمات رو برای تایمر/کانتر0 انجام بدیم و وقفه مورد نظر هم مثلا ، وقفه مقایسه رجیستر (C (RC هست برای این منظور باید بنویسیم :

                          کد:
                          AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; // AT91C_TC_CPCS=(1<<4)


                          ت.و 2: این قسمت برای قسمت های بلادرنگ انجام نمیشه مثل RTT , PIT .

                          5. حالا باید در رجیستر AIC_IECR با یک کردن بیت متناظر با پریفرال مورد نظر وقفه مربوط به اون رو فعال کنیم ، به فرم کلی زیر :


                          کد:
                          AT91C_BASE_AIC->AIC_IECR = (1<<شناسه پریفرال مورد ننظر);


                          مثلا برای همین تایمر/کانتر0 داریم :

                          کد:
                          AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_TC0);


                          6. حالا باید وقفه سراسری IRQ فعال بشه ، برای این منظور میشه از تابع

                          کد:
                          __enable_interrupt();


                          استفاده کرد و همینطور از تابع زیر برای غیر فعال کردن :

                          کد:
                          __disable_interrupt();


                          اما برای استفاده از این توابع باید در ابتدای برنامه فایل هدر intrinsics.h رو اینکلود کنیم .

                          7. حالا باید تابع روتین وقفه رو بنویسیم ، اما قبل از اون باید به یک مورد توجه کرد و اون اینکه همیشه در ابتدای روتین تابع باید اول منبع وقفه تعیین بشه به همین جهت در ابتدای روتین وقفه باید رجیستر وضعیت پریفرال مورد نظر خونده بشه ، به فرم کلی زیر :


                          کد:
                          void اسم تابع روتین وقفه(void)
                          {
                          
                          unsigned int dummy;
                          dummy = AT91C_BASE_پریفرال مورد نظر->اسم رجیستر وضعیت پریفرال مورد نظر;
                          dummy = dummy;
                          
                          //Plcae you'r code here
                          
                          }


                          مثلا برای همین تایمر/کانتر0 باید بنویسیم :


                          کد:
                          void timer0_irq_handler(void)
                          {
                          
                          unsigned int dummy;
                          dummy = AT91C_BASE_TC0->TC_SR;
                          dummy = dummy;
                          
                          //Plcae you'r code here
                          
                          }


                          8. به غیر از اینها یکسری فایل ها هم باید به دایرکتوری اصلی پروژه اضافه بشن و سورسهاشون به برنامه add بشن که تو کتاب کامل گفته شده دیگه توضیح نمیدم.



                          دیدگاه


                            #88
                            پاسخ : سوالات کتاب at91 (نص)

                            سلام.مهندس میتونید مشکلی که من در چند پست بالاتر بهش اشاره کردم را حل کنید؟؟؟؟

                            دیدگاه


                              #89
                              پاسخ : سوالات کتاب at91 (نص)

                              سلام
                              خوب شما برای اینکه اعداد رو روی lcd نمایش بدید به چه صورتی عمل میکنید ، منظورم اینه که با چی عدد رو به رشته تبدیل میکنید ، من بعید میدونم مشکل از کتابخونه lcd باشه ، اگه براتون مقدور هست کد تون رو هم قرار بدید تا بهتر بشه نظر داد .
                              ولی چیزی که حدس میزنم اینه که شما عدد رو تبدیل به رشته نمیکنید و مستقیم اون رو به تابع میدید ، این درحالیه که توابع ارسال معمولا ورودیشون کارکتر هست یعنی اعداد به صورت کد اسکی ارسال میشن .

                              دیدگاه


                                #90
                                پاسخ : سوالات کتاب at91 (نص)

                                سلام.ممنون از توجه شما
                                ببینید من از تابع puts استفاده میکنم و نمونه کدی که داخلش مشکل مذکور برای نمایش اعداد بزرگتر از 9 بوجود میاد هم در زیر آوردم :
                                کد:
                                //Timer 1 interrupt subroutine definition
                                void timer1_irq_handler(void)
                                {
                                 unsigned int dummy;
                                 dummy = AT91C_BASE_TC1->TC_SR;
                                 dummy = dummy;
                                 AT91C_BASE_PIOA->PIO_SODR=(1<<0);
                                 t++;
                                 if(t==4){
                                  t1++;
                                  t=0;
                                  if(write==0){
                                  lcd_gotoxy (0,0);    
                                  lcd_putsf ("Sampling...");
                                  lcd_gotoxy(1,0);    
                                  lcd_puts(t1); 
                                  }
                                  if(readmem==1){
                                  lcd_gotoxy (0,0);    
                                  lcd_putsf ("Reading Memory");
                                  lcd_gotoxy(1,0);    
                                  lcd_puts(t1); 
                                  }
                                 }
                                 if(t1==10){
                                  write=1;
                                  AT91C_BASE_AIC->AIC_IDCR = (1<<AT91C_ID_TC1); 
                                 }
                                }
                                لازم به ذکر هست که متغیر t1 بصورت unsigned long int t,t1; تعریف شده است.جالا بی زحمت بگین باید چکار کنم.
                                باز هم ممنون

                                دیدگاه

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