اطلاعیه

Collapse
No announcement yet.

نحوه راه اندازی اینتراپت در at91sam7x256

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

    نحوه راه اندازی اینتراپت در at91sam7x256

    سلا
    یکی می تونه به زبونه ساده به من یه توضیحی بده که چجوری میتونم در keil اینتراپت خارجی
    یا مثلا اورفلو تایمر رو داشته باشم
    من دیتا شیت رو نگاه کردم خیلی پیچیده بود oo: oo:
    مجله کویر هم یه جورایی پیچونده بود
    ممنون
    www.tehranelec.com

    #2
    پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

    یه نفر پیدا نمیشه ما رو یه راهنمایی کنه؟ :cry: :cry:
    www.tehranelec.com

    دیدگاه


      #3
      پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

      یه مرد پیدا نمیشه به ما بگه چه خاکی باید تو سرمون بکنبم(ببخشید خیلی تند گفتم اخه چند روزه من این بحث باز کردم)
      www.tehranelec.com

      دیدگاه


        #4
        پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

        محسن جان من تا به حال هیچ تجربه ای با ارم نداشتم که هیچ، حتی از نزدیک لمسش هم نکردم!
        اما شاید همین تاپ شما باعث شه که آستینو بالابزنم
        یه سری سمپل کد پیداکردم که این بخشیشه:

        کد:
        void tim0_isr (void) __irq
        {                   
          if ((led ^=1) == 0)
            AT91F_PIO_ClearOutput(AT91C_BASE_PIOC, HEARTBT_OUTPUT);  /* LED OFF */
          else
           AT91F_PIO_SetOutput (AT91C_BASE_PIOC, HEARTBT_OUTPUT);  /* LED ON */
        
          AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_TC0->TC_SR;      /* Interrupt Ack*/
          AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);       /* Interrupt Ack*/
          *AT91C_AIC_EOICR = 0;                     /* End of Interrupt*/
        }
        
        void timer_init()
        {
          AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC0);   /* Enable Clock for TIM0*/
           AT91C_BASE_TC0->TC_CCR  = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
           AT91C_BASE_TC0->TC_CMR  = 4 | AT91C_TC_CPCTRG;
           AT91C_BASE_TC0->TC_RC   = 46875;                /* period is 1 Sec*/
           AT91C_BASE_TC0->TC_IER  = AT91C_TC_CPCS;
        
           /* TIM0 Interrupt: Mode and Vector with Lowest Priority and Enable */
           
           AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 5;
           AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) tim0_isr;
           AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
        }
        امتحان کن ببین جواب میده

        حیف که پرونیوس ارم اتمل نداره، وگرنه تا حالا پاسختو داده بودم!
        {خلاف قوانین - امضا ویرایش شد}

        دیدگاه


          #5
          پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

          اینم واسه اکسترنال:

          کد:
          // PIOA ISR
          void isr_pioa(void)
          {
            static unsigned int nCntr = 0;
          
            nCntr++;
          }
          
          // Main
          int main()
          {
            // Setup PIO
            AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);	// Enable clock
            AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91C_PIO_PA15);	// Input on PA15
            AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA, AT91C_PIO_PA15);	// Interrupt on PA15
          
            // Setup interrupts
            AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_PIOA, AT91C_AIC_PRIOR_LOWEST, 0, isr_pioa);
            AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOA);
          
            while(1);
          }
          {خلاف قوانین - امضا ویرایش شد}

          دیدگاه


            #6
            پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

            نوشته اصلی توسط nanoware
            محسن جان من تا به حال هیچ تجربه ای با ارم نداشتم که هیچ، حتی از نزدیک لمسش هم نکردم!
            اما شاید همین تاپ شما باعث شه که آستینو بالابزنم
            یه سری سمپل کد پیداکردم که این بخشیشه:

            کد:
            void tim0_isr (void) __irq
            {                   
              if ((led ^=1) == 0)
                AT91F_PIO_ClearOutput(AT91C_BASE_PIOC, HEARTBT_OUTPUT);  /* LED OFF */
              else
               AT91F_PIO_SetOutput (AT91C_BASE_PIOC, HEARTBT_OUTPUT);  /* LED ON */
            
              AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_TC0->TC_SR;      /* Interrupt Ack*/
              AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);       /* Interrupt Ack*/
              *AT91C_AIC_EOICR = 0;                     /* End of Interrupt*/
            }
            
            void timer_init()
            {
              AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC0);   /* Enable Clock for TIM0*/
               AT91C_BASE_TC0->TC_CCR  = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
               AT91C_BASE_TC0->TC_CMR  = 4 | AT91C_TC_CPCTRG;
               AT91C_BASE_TC0->TC_RC   = 46875;                /* period is 1 Sec*/
               AT91C_BASE_TC0->TC_IER  = AT91C_TC_CPCS;
            
               /* TIM0 Interrupt: Mode and Vector with Lowest Priority and Enable */
               
               AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 5;
               AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) tim0_isr;
               AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
            }
            امتحان کن ببین جواب میده

            حیف که پرونیوس ارم اتمل نداره، وگرنه تا حالا پاسختو داده بودم!
            اینا تو مجله های pmm کویر الکترونیک بود من اینا رو دیدم ولی تو اون مجله یه جورایی پیچونده بحثو و اصلا توضیح نداده که چطور یه روتین وقفه درست میکنند یهو ور داشته این کدا رو گذاشته و اصلا توضیح نداده
            من می خوام بدونم چجوری میشه مثلا الان برای هر peripheral در میکروم یه روتین وقفه درست کنم
            اینا کد در keil کامپایل میشه و به جز چند تا ارور که رفع میشه مشکلی نداره و لی این مشکل منو حل نمی کنه
            چون اصلا متوجه نمیشم چجوری یه روتین رو درست کرده قواعد ساختش چیه و ...
            ok یه پایه پیدا شد که خودمون پیدا کنیم راستش من یه کم خسته شده بودم من یه ماهی است شروع کردم به کار
            بردم دارم و دارم روش تست می کنم
            سر واچ داگ و ... بیچاره شدم تا راه افتاد کسیم اینجا جواب نمی داد
            ولی دوباره شروع میکنم
            برای شروع بریم تک تک این دستور ها رو تو هدرای خودش پیدا کنیم شاید فرجی شد می تونیم دنبال برنامه دیگه هم بگردیم شاید راه درست کردن روتینشو پیدا کنیم

            www.tehranelec.com

            دیدگاه


              #7
              پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

              فکر کنم با این کد دومی که گذاشتی یه چیزایی دستگیرم شد
              بذار یه امتحانی بکنم کار کرد همینجا جوابشو می ذارم
              www.tehranelec.com

              دیدگاه


                #8
                پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

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

                ...
                {خلاف قوانین - امضا ویرایش شد}

                دیدگاه


                  #9
                  پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

                  کد:
                  #include "AT91SAM7X256.h"
                  #include "lib_AT91SAM7X256.h"									
                  #include "delay.h"
                  #include "lcd4bit.h" 
                  //********************
                  char buf[35];
                  int count=3;
                  //*************************interrupt rutine********************
                  void isr_pi_ob(void)
                  {
                    count++;
                  
                  }
                  //****************************************8
                  main(void){
                  
                  
                  // Setup PIO
                    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB);  // Enable clock
                    AT91F_PIO_CfgInput(AT91C_BASE_PIOB, AT91C_PIO_PB12);  // Input on PA15
                    AT91F_PIO_InterruptEnable(AT91C_BASE_PIOB, AT91C_PIO_PB12);  // Interrupt on PA15
                  
                    // Setup interrupts
                    AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_PIOB, AT91C_AIC_PRIOR_LOWEST, 0, isr_pi_ob);
                    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOB);
                  //*********lcd_initial*************
                  lcd_pin(2,0,1,2,3,4,5);
                  //**********************************
                  
                  
                   
                  while(1){
                  //lcd_clear();
                  //sprintf(buf,"counter is=%d",count);
                  //lcd_putsf(buf);
                  //delay_ms(100);
                  }//end of while(1)
                  }
                  برنامه وارد اینتراپت میشه و کانتر زیاد میشه ولی فقط برای یک بار
                  :angry: :angry: :angry:
                  www.tehranelec.com

                  دیدگاه


                    #10
                    پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

                    کجا رفتی تازه یه پایه پیدا کرده بودم این مشکلو حل کنیم
                    :cry2:
                    www.tehranelec.com

                    دیدگاه


                      #11
                      پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

                      راستش نمیدونم، باید دیتاشیت و هلپ رو خوند!
                      یه راه کثیف به نظرم میرسه: قبل از
                      count++;
                      اینتراپت رو دیزیبل کن و بعدش دوباره ستاپ کن؛ اینو میگم:
                      // Setup interrupts
                      {خلاف قوانین - امضا ویرایش شد}

                      دیدگاه


                        #12
                        پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

                        نوشته اصلی توسط nanoware
                        راستش نمیدونم، باید دیتاشیت و هلپ رو خوند!
                        یه راه کثیف به نظرم میرسه: قبل از
                        count++;
                        اینتراپت رو دیزیبل کن و بعدش دوباره ستاپ کن؛ اینو میگم:
                        // Setup interrupts
                        تمام این حالت ها رو امتحان کردم
                        تازه یک سری تابع های دیگه که تو فایل خودش بود رو هم امتحان کردم
                        راست میگی بهتره تنبلی رو بذارم کنار و کامل دیتاشیت رو بخونم :read: :read:
                        www.tehranelec.com

                        دیدگاه


                          #13
                          پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

                          خسته نباشی دوست عزیز
                          برای فعال کردن مجدد اینتراپت باید Interrupt Flag مربوطه رو مجددا 1 کنی یا به قول معروف اینتراپت رو Reset کنی

                          موفق باشی

                          دیدگاه


                            #14
                            پاسخ : نحوه راه اندازی اینتراپت در at91sam7x256

                            واقعا جالبه که خیلیا جواب این جور سوالا رو میدونن ولی جواب نمیدن!!! :NO: :NO: :NO:

                            دیدگاه

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