اطلاعیه

Collapse
No announcement yet.

اینترپت خارجی در میکروی ARM

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

    اینترپت خارجی در میکروی ARM

    سلام دوستان من مدتی است که دارم با میکروی SAM7S64 کار میکنم. تقریبا توانستم با قسمتهای دیگه کار کنم و از IAR سر در بیارم. در ضمن یک تاپیک هم زدم که برای بقیه دوستان که تمایل دارن کار کنم آموزشهایی را بدهم.

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


    -----------------------------------------------------------
    مشکل من اینه که اینترپت نمی زنه!!!!!

    اگه برنامه یکم ناجور دیده میشه وقتی در IAR کپی کنید درست دیده میشه.

    در این برنامه وقتی اینترپت زده میشه باید پورت A17 چند بار چشمک بزنه و بعد خاموش بشه.
    در ضمن برای تست صفر یا یک بودن بعضی بیتها یک IF در حلقه while اصلی نوشتم که پین A16 را صفر یا یک می کنه.

    برنامه :






    void TC0_Interrupt()
    {
    set_port(17);
    delay_ms(250);

    clear_port(17);
    delay_ms(250);

    set_port(16);
    set_port(17);
    delay_ms(250);

    clear_port(17);
    delay_ms(250);

    set_port(16);
    set_port(17);
    delay_ms(250);

    clear_port(17);
    delay_ms(250);
    //
    }
    ////////////////////////////////////////////////////////////////////////////////
    void init_irq0()
    {
    // AT91C_BASE_AIC->AIC_SMR[(1<<AT91C_ID_IRQ0)]=(AT91C_AIC_SRCTYPE_POSITIVE_EDGE|IRQ0_prtiority);
    // newHandler = TC0_Interrupt;
    // AT91C_BASE_AIC->AIC_SVR[(1<<AT91C_ID_IRQ0)]=0x163 ;
    // AT91C_BASE_AIC->AIC_IECR=(1<<AT91C_ID_IRQ0);

    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_IRQ0, IRQ0_prtiority,AT91C_AIC_SRCTYPE_POSITIVE_EDGE, TC0_Interrupt);
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0);
    }
    //////////////////////////////////////////////////////////////////////////////
    void main()
    {
    AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
    clear_port(17);
    init_irq0();
    AT91C_BASE_AIC->AIC_ISCR=(1<<AT91C_ID_IRQ0);

    lcd_init(16);
    lcd_integer(256);
    while(true)
    {
    if ((((AT91C_BASE_AIC->AIC_CISR)&0x2)!=0))
    {
    set_port(16);
    delay_ms(250);
    clear_port(16);
    delay_ms(250);
    AT91C_BASE_AIC->AIC_ICCR=(1<<AT91C_ID_IRQ0);
    AT91C_BASE_AIC->AIC_IECR=(1<<AT91C_ID_IRQ0);
    lcd_clear();
    reg=AT91C_BASE_AIC->AIC_SVR[30];//(AT91C_ID_IRQ0)];//
    lcd_integer(reg);
    delay_ms(250);
    }
    else
    {
    clear_port(16);
    delay_ms(250);
    }



    }

    }

    #2
    پاسخ : اینترپت خارجی در میکروی ARM

    سلام،

    در IAR قبل از ISR مربوط به اون وقفه، باید با رهنمود #pragma آدرس (یا نام مستعار) بردار وقفه رو مشخص کنید، مثلا:

    کد:
    #pragma vector=TIMER0_OVF_vect
    __interrupt void MotorPWMBottom()
    {
      // code
    }
    There is nothing so practical as a good theory. — Kurt Lewin, 1951

    دیدگاه


      #3
      پاسخ : اینترپت خارجی در میکروی ARM

      ممنونم ولی من دقیقا متوجه نشدم جلویPragma vector چه چیزی را باید بنویسم. باید اسم روتین اینترپت را بنویسم؟


      interrupt__ قبل از Void برای چیه؟

      اگه سوالات خیلی سطح پایین اند، علتش تازه کار بودن بنده است.

      دیدگاه


        #4
        پاسخ : اینترپت خارجی در میکروی ARM

        نوشته اصلی توسط وحید سلیمانزاده
        ممنونم ولی من دقیقا متوجه نشدم جلویPragma vector چه چیزی را باید بنویسم. باید اسم روتین اینترپت را بنویسم؟


        interrupt__ قبل از Void برای چیه؟

        اگه سوالات خیلی سطح پایین اند، علتش تازه کار بودن بنده است.
        باید نام یا آدرس بردار وقفه رو بنویسید که در فایل Header مربوط به میکروتون وجود داره. مثلا در فایل iom.16 بخش زیر رو میبینید:

        کد:
        /*==============================*/
        /* Interrupt Vector Definitions */
        /*==============================*/
        
        /* NB! vectors are specified as byte addresses */
        
        #define  RESET_vect      (0x00)
        #define  INT0_vect      (0x04)
        #define  INT1_vect      (0x08)
        #define  TIMER2_COMP_vect   (0x0C)
        #define  TIMER2_OVF_vect   (0x10)
        #define  TIMER1_CAPT_vect   (0x14)
        #define  TIMER1_COMPA_vect  (0x18)
        #define  TIMER1_COMPB_vect  (0x1C)
        #define  TIMER1_OVF_vect   (0x20)
        #define  TIMER0_OVF_vect   (0x24)
        #define  SPI_STC_vect     (0x28)
        #define  USART_RXC_vect    (0x2C)
        #define  USART_UDRE_vect   (0x30)
        #define  USART_TXC_vect    (0x34)
        #define  ADC_vect       (0x38)
        #define  EE_RDY_vect     (0x3C)
        #define  ANA_COMP_vect    (0x40)
        #define  TWI_vect       (0x44)
        #define  INT2_vect      (0x48)
        #define  TIMER0_COMP_vect   (0x4C)
        #define  SPM_RDY_vect     (0x50)

        که آدرس و نام هر Interrupt Vector به صورت ماکرو تعریف شده است.

        در مورد interrupt__ هم شناسه هایی که قبلشون __ وجود داره از کلمات کلیدی ذاتی IAR هستند و برای کامپایلر معنی خاصی دارند. مثلا استفاده از interrupt__ قبلا از نام تابع، به کامپایلر اعلام میکنه که این بخش، ISR است و نه یک تابع معمولی.

        There is nothing so practical as a good theory. — Kurt Lewin, 1951

        دیدگاه


          #5
          پاسخ : اینترپت خارجی در میکروی ARM

          از آقای سپاس یار خیلی متشکرم مشکل حل شد. مشکل چند تا بود یکی همین مورد و دیگری در قسمت Cstartup بود که به لطف خدا توانستم حلش کنم.

          دیدگاه

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