اطلاعیه

Collapse
No announcement yet.

مشکل در منبع وقفه یکم (SYS) در نرم افزار Keil

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

    مشکل در منبع وقفه یکم (SYS) در نرم افزار Keil

    با سلام خدمت دوستان عزیز و مدیران سایت
    همونطور که میدونیم برای استفاده از اینتراپت تایمر های PIT و RTT باید از وقفه شماره یک یا (SYS) استفاده کرد
    ولی در نرم افزار Keil هر کاری که کردم نتونستم این کار رو انجام بدم
    تمام تنظیمات مربوط به تایمر PIT رو انجام دادم ولی هیچ وقفه ای ایجاد نمیشه لطفا راهنمایی بفرمایید
    کد:
    #include <meisam_sam7s64io.h>
    #include <meisam_delay.h>	  // chon dar lcd.c be tore dasti "meisam_delay.h" ra include karde am inja naabyed benevisim
    #include <meisam_micro_init.h>
    #include <lcd.h>
    #include <lcd.c>
    #include <stdio.h>
    int i=45;
    
    void pit_meisam_interrupt (void) __irq
    {
    	 unsigned int dm;
    	 dm=*AT91C_PITC_PIVR;
    	 dm=dm;
    
    	*AT91C_AIC_ICCR = (1 << AT91C_ID_SYS); /* Interrupt Ack*/
    	*AT91C_AIC_EOICR = 0; /* End of Interrupt*/
    	i++;
    }
    
    void pit_init()
    {
    
    *AT91C_PITC_PIMR =0x30B749E;	  // compare with RC interrupt & mck/128
    AT91C_AIC_SVR[AT91C_ID_SYS] =	(unsigned int) pit_meisam_interrupt;
    AT91C_AIC_SMR[AT91C_ID_SYS]	= 0x23;
    *AT91C_AIC_ICCR=(1<<AT91C_ID_SYS);
    *AT91C_AIC_IECR=(1<<AT91C_ID_SYS);
    
    };
    
    
    
    
    
    
    int main()
    {
    int j=45;
    unsigned char c[16];
    
    disable_watchdog();
    enable_external_reset();
    oscilators_init(1);	//0=32k internal  1=48M crystal(18432M)
    pit_init();
    
    delay(48000,1000);
    lcd_pininit(7,9,10,11,12,26,25,24,13,14); //(PA13->4lcd PA24->6lcd PA25->7lcd PA26->8lcd PA12->9lcd PA11->10lcd PA10->11lcd PA9->12lcd PA8->13lcd PA7->14lcd)
    lcd_init();
    lcd_clear();
    
    
    
    
    while(1)
    	{
    
    delay(48000,1000);
    lcd_gotoxy(0,0);
    sprintf(c,"salam: %2d %2d",i,j);
    lcd_putsf(c);
    j++;
    	}
    }

    #2
    پاسخ : مشکل در منبع وقفه یکم (SYS) در نرم افزار Keil

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

    دیدگاه


      #3
      پاسخ : مشکل در منبع وقفه یکم (SYS) در نرم افزار Keil

      من برای PIT این را نوشتم :
      کد:
      //------------------------------------------------------------------------------
      /// Handler for PIT interrupt. Increments the timestamp counter.
      //------------------------------------------------------------------------------
      void ISR_Pit(void) __irq
      {
        unsigned int status;
      
        // Read the PIT status register
        status = PIT_GetStatus() & AT91C_PITC_PITS;
        if (status != 0) {
      
          // Read the PIVR to acknowledge interrupt and get number of ticks
          timestamp += (PIT_GetPIVR() >> 20);
        }
      *AT91C_AIC_EOICR = AT91C_BASE_AIC->AIC_ISR; 
      }
      
      //------------------------------------------------------------------------------
      /// Configure the periodic interval timer to generate an interrupt every
      /// millisecond.
      //------------------------------------------------------------------------------
      void ConfigurePit(void)
      {
        // Initialize the PIT to the desired frequency
        PIT_Init(PIT_PERIOD, BOARD_MCK / 1000000);
      
        // Configure interrupt on PIT
        AIC_DisableIT(AT91C_ID_SYS);
        //AIC_ConfigureIT(AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);
      	
      	AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 6;
      	AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) ISR_Pit;
      	// Clear interrupt
        AIC_ICCR = 1 << AT91C_ID_SYS;
        AIC_EnableIT(AT91C_ID_SYS);
        PIT_EnableIT();
      
        // Enable the pit
        PIT_Enable();
      
      }
      هر یک میلی ثانیه یک وقفه ایجاد میشه که مقدار در timestamp قرار می گیره

      دیدگاه

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