ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 5 از 5
  1. #1
    2008/02/02
    4
    0

    فراخوانی وقفه در at91sam7

    سلام
    میخواستم ببینم چطور میشه یه وقفه رو به صورت دستی فراخوانی کرد. :angry:
    مثلن بدون اینکه داده ای روی پورت بفرستیم وقفه مربوط به USART0 رو تریگر کنیم؟
    ممنون میشم راهنمایی کنین
  2. #2
    2010/06/05
    222
    10

    پاسخ : فراخوانی وقفه در at91sam7

    سلام،
    اصولا وقفه زمانی رخ می ده که عاملی داشته باشه،
    این عامل می تونه داخلی یا خارجی باشه، پس غیر منطقی و غیر اصولی هست که خودش خودش رو تریگ کنه...
    شما بهتر بگین دنبال این هستین که چه کار کنید تا دوستان بهتر بتونن راهنمایی تون کنن.
    هر انسانی که احساس بی نیازی کند سرکش و طغیان گر می شود...
  3. #3
    2008/02/02
    4
    0

    پاسخ : فراخوانی وقفه در at91sam7

    راستش من تونستم وقفه رو دستی اعمال کنم
    یعنی تو رجیستر AIC_ISCR وقفه usart0 رو فعال کردم
    ولی سوال کلی اینه که من از روی این داکیومنت

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    با usart0 کار کنم.
    ولی موفق نشدم.
    اگر بخوام قدم قدم مشکلات بگم اولین مشکلی که داشتم این بود که این داکیومنت اگر اشتباه نکنم برای gcc و eclipse نوشته شده.
    مثلا تو صفحه 39 داکیومنت یک سری توابع اسمبلی استفاده کرده که توی keil نمیشه استفاده کرد بعنوان نمونه
    کد:
    unsigned enableIRQ(void) {
    unsigned _cpsr;
    _cpsr = __get_cpsr();
    __set_cpsr(_cpsr & ~IRQ_MASK);
    return _cpsr;
    }
    که اگر کسی لطف کنه که معادل این تابع رو توی keil چی میشه و راهنمایی کنه ممنون میشم.
  4. #4
    2008/02/02
    4
    0

    پاسخ : فراخوانی وقفه در at91sam7

    سلام دوستان
    با توجه به این دو لینک زیر
    http://www.keil.com/support/man/docs/armccref/armccref_CJAEAEHA.htm
    http://www.keil.com/support/man/docs/armccref/armccref_CJAFBCBB.htm
    باید از
    __enable_irq();
    استفاده کنیم :nice:
    الان یه مشکل دیگه باقی هست اونم اینه که وقتی یک بار وقفه dma اجرا میشه دیگه اجرا نمیشه.
    که دنبال راه حلش هستم
    اگر کسی میدونه کمک کنه یا اگر پیدا کردم علتشو اینجا میگم
  5. #5
    2014/05/10
    42
    2

    پاسخ : فراخوانی وقفه در at91sam7

    سلام دوست من،
    راستش من دقیقا یادم نمیاد نکته این کد چی بود که بالاخره تونستم اینتراپت مربوط به یوزارت رو فعال کنم ولی دقیقا از روی همین داکیومنتی که قرار دادی پیش رفتم.
    متوجه منظورت در مورد dma نشدم. تا اونجایی که یادمه اصلا درگیر dma نبودم. تنها کاری که میتونم برات انجام بدم اینه که کد درستی که جواب گرفتم ازش رو بزارم.
    امیدوارم موفق باشی.
    کد:
    /*-------------------------------------------------------------------------------
      USART0 receive interrupt 
    --------------------------------------------------------------------------------*/
    /*-------------------------------------------------------------------------------
    
    8 bits
    Baud rate : 9600
    --------------------------------------------------------------------------------*/
    
    #include <AT91SAM7X256.H> 
    #include <stdio.h>
    #include "delay.h"
    #include "usart.h"
    #include "aic.h"
    
    
    
    #define LCD_PORT_A      //CHAR LCD pins definition
    #define LCD_RS 3
    #define LCD_E  5
    #define LCD_DB4 6
    #define LCD_DB5 7
    #define LCD_DB6 8
    #define LCD_DB7 9
    
    #include "lcd.h"
    
    void usart0_irq_handler(void) __irq; // function prototype for USART0 handler
    
    
    //global variables
    
    float *h;
    char buffer[]={0,0,0,0,0};
    
    
    	float out = 1;
    	int d;
    
    
    int main ()
    {
    	
    	
    
    
    	//int d;
    	
    	*AT91C_PMC_PCER = (1<<AT91C_ID_IRQ0 );
    	AT91C_BASE_PIOB->PIO_PER = (1<<27)|(1<<28);
    	AT91C_BASE_PIOB->PIO_OER = (1<<27)|(1<<28);
    	AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0); // step1: activate usart0 clock
    	AT91C_BASE_PIOA->PIO_PDR = AT91C_PA0_RXD0 | AT91C_PA1_TXD0; //step2: disable I/O pin on PA0 and PA1
    	AT91C_BASE_PIOA->PIO_ASR = AT91C_PIO_PA0 | AT91C_PIO_PA1;  //step3: activate peripheral A select register for PA0 and PA1 for using usart0 on this pin
    	AT91C_BASE_PIOA->PIO_BSR = 0;                //step4: disable peripheral B 
    	// At this point, we have the USART0 peripheral clock turned on and the two pins (RXD0 and TXD0 ) are
     //associated with the USART0 peripheral.
    	
    	// Set up the Advanced Interrupt Controller (AIC) registers for USART0	
    
    	AT91C_BASE_AIC->AIC_IDCR = (1<<AT91C_ID_US0);  // Disable USART0 interrupt in AIC
    	AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int)usart0_irq_handler; // Set the USART0 IRQ handler address in AIC 
    	AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] =(AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x4 ); // Set the int source type and pri 
    	AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_US0); // Enable the USART0 interrupt in AIC
    	
    	
    // Control Register - Reset then Disable the Receiver/Transmitter
    	AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | // reset receiver
                 AT91C_US_RSTTX | // reset transmitter
                 AT91C_US_RXDIS | // disable receiver
                 AT91C_US_TXDIS; // disable transmitter
    	
    	
    	AT91C_BASE_US0->US_MR = (AT91C_US_PAR_NONE | 0x3 << 6); // no parity 8-bit characters
    	AT91C_BASE_US0->US_IER = 0x0000;
    	AT91C_BASE_US0->US_IDR = 0xFFFF;
    	AT91C_BASE_US0->US_BRGR= 0x138; // CD = 0x138 (312 from calculation)  FP=0 (not used) 
    	AT91C_BASE_US0->US_RTOR= 0; // receiver time-out (disabled)
    	AT91C_BASE_US0->US_TTGR= 0; // transmitter timeguard (disabled)
    	AT91C_BASE_US0->US_FIDI= 0; // FI over DI Ratio Value (disabled)
    	AT91C_BASE_US0->US_IF= 0; // IrDA Filter value (disabled)
    	
    	
    	
    
    
    // Final Preparations for USART0 Interrupt Processing
    
    
    	AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN ;  // enable the USART0 receiver 
    	AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;  // enable RXRDY usart0 receive interrupt
    	AT91C_BASE_US0->US_IDR = ~AT91C_US_RXRDY; // disable all other interrupts except RXRDY
    	AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_US0);
    
    
    
    
    	  ////////////
    	AIC_ConfigureInt(AT91C_ID_IRQ0);
    	AIC_EnableInt(AT91C_ID_IRQ0);     // enable IRQ0 interrupt
      ///////////
    		
    //------------ LCD config -------------------------------//
    	 lcd_init(); 
     	lcd_clear();
     	cursor_off();
    		delay_ms(10); // me
    //-----------------------------------------------------//
    	while(1){
    			 	lcd_clear();
    					cursor_off();
    					delay_ms(10); // me
    			
    			
    			lcd_gotoxy(1,1); 
    			lcd_putsf("Hi");
    			//delay_ms(100);
    		
    			*AT91C_PIOB_SODR = (1<<28);
    				delay_ms(2000);
    		 *AT91C_PIOB_CODR = (1<<28);
    				delay_ms(2000);
    		
    		
    			 d = getkey();
    				lcd_gotoxy(1,1); 
    				lcd_putsf("       ");
    				lcd_gotoxy(1,1); 
    				lcd_putsf("in data :");
    				sprintf(buffer,"%d",d);
    				lcd_putsf(buffer);
    				lcd_putsf("   ");
    				delay_ms(1000);
    		
    				lcd_gotoxy(2,1);
    				lcd_putsf("out data :");
    				sprintf(buffer,"%f",out);
    				lcd_putsf(buffer);
    				lcd_putsf("    ");
    				delay_ms(1000);
    				
    
    			
    
    }
    	
    	
    	
    	
    	
    }
    
    void usart0_irq_handler(void) __irq {
    	volatile unsigned int dummy;
    	extern float *h;
    	extern float out;
    	extern int d;
    	int n=0;
    		dummy = AT91C_BASE_AIC->AIC_IVR;
    	dummy = AT91C_BASE_US0->US_RHR;
    				*AT91C_PIOB_SODR = (1<<27);
    			 delay_ms(500);
    		  *AT91C_PIOB_CODR = (1<<27);
    			 delay_ms(500);
    //if ((AT91C_BASE_US0->US_CSR & AT91C_US_RXRDY) == AT91C_US_RXRDY) {
    // we have a receive interrupt, 
    
    		 
    				
    					n = *AT91C_US0_RHR ;
    					
    					out = n * 0.1;
    	
    	
    	 AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_US0);
      
    	 AT91C_BASE_AIC->AIC_EOICR=0;
    	AT91C_BASE_AIC->AIC_EOICR= AT91C_BASE_AIC->AIC_EOICR;
    	 AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_AIC->AIC_ISR;
    	AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_US0->US_CSR;
    		//}
    }
نمایش نتایج: از 1 به 5 از 5

موضوعات مشابه

  1. AT91SAM7 در نرم افزار پروتئوس
    توسط dr hamid در انجمن ATMEL
    پاسخ: 1
    آخرين نوشته: 2015/08/04, 17:00
  2. حذف آدرس بازگشت در فراخوانی وقفه؟
    توسط hamidzare در انجمن میکروکنترلرهای AVR
    پاسخ: 11
    آخرين نوشته: 2014/08/17, 13:45
  3. سرعت پين هاي at91sam7
    توسط IRT در انجمن ATMEL
    پاسخ: 0
    آخرين نوشته: 2014/01/25, 10:23
  4. مقایسه AT91SAM7 با سری LPC
    توسط rezaf در انجمن پروسسورهای ARM
    پاسخ: 7
    آخرين نوشته: 2013/07/27, 13:35
  5. رجیسترهای at91sam7
    توسط spman در انجمن ATMEL
    پاسخ: 3
    آخرين نوشته: 2010/08/20, 21:00

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •