اطلاعیه

Collapse
No announcement yet.

step step sam7

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

    step step sam7

    آشنایی با سیستم نامگذاری رجیستر ها در ARM :
    در میکروکنترلرهای SAM7 گروهی از رجیسترهای مربوط به پیگربندی و کنترل تجهیزات سخت افزار در 3 آدرس قابل دسترسی است. اولی برای Clear کردن رجیستر که معمولا در انتهای نامشان دو حرف DR (Disable Register) قرار دارد. مثلا اگر شما در آدرس PIO_PUDR مقدار 0x0000003 را بنویسید، PullUp بیتهای 0 ام و 1 ام غیر فعال شده و مابقی تغییری نمی کنند.
    دومی برای Set کردن رجیستر که معمولا در انتهای نامشان دو حرف ER (Enable Register) قرار دارد. مثلا اگر شما در آدرس PIO_PUER مقدار 0x0000009 را بنویسید، PullUp بیتهای 0 ام و 3 ام فعال شده و مابقی تغییری نمی کنند.
    سومین آدرس هم برای خواندن از رجیستر تعبیه شده و با دو حرف SR(Status Register) شناخته می شود و نوشتن در آن چیزی را تغییر نمیدهد و مشکلی هم به وجود نمی آورد در واقع این آدرس مقدارفلیپ فلاپهایی را که بوسیله DR و SR آنها را ست و ریست می کرده ایم را می خواند . برای مثال اگر PIO_PUER مقدار 0x0000009 را بنویسید و در آدرس PIO_PUDR مقدار 0x0000003 را بنویسید وقتی از رجستر PIO_PUSR بخوانید مقدار 0x00000008 خوانده می شود.


    آشنایی با پورتهای ورودی و خروجی در SAM7 ها
    میکروکنترلرهای SAM7 پورتهای ورودی و خروجی پیشرفته ای دارند که در دیتاشیت به نام PIOA,PIOB,… شناخته شده است. تمام بیتهای این پورتها قابلیت آن را دارند که :
    • یک اینتراپت از لبه پایین رونده یا بالارونده را بوجود بیاورند.
    • به صورت Open Drain یا Push pull کار کنند.
    • مجهز به glitch filter برای حذف نویز از ورودی.
    • ...
    ساختار این پورتها به صورت زیر است :



    تشریح رجیسترهای پورت ورودی و خروجی (PIO) :
    • PIO_PUER, PIO_PUDR, PIO_PUSR (Pull-up Resistor Control) :
    این رجیسترها برای کنترل Pull-up است.

    • PIO_OER , PIO_ODR , PIO_OSR (Output Control) :
    این رجیستر دقیقا همانند رجیستر DDR در میکروکنترلرهای AVR است.

    • PIO_MDER, PIO_MDDR, PIO_MDSR (Multi Drive Control):
    این رجیستر برای کنترل نوع درایو پورت در حالت خروجی است. در صورت 1 بودن هر بیت بیت نظیر به صورت Open Drain عمل می کند و در صورت 0 بودن به صورت Push pull (همانند پورتهای AVR)

    • PIO_SODR (Set Output Data Register)
    PIO_CODR (Clear Output Data Register)
    PIO_ODSR (Output Data Status Register)
    PIO_OWSR (Output Write Status Register)
    PIO_OWER (Output Write Enable Register)
    PIO_OWDR (Output Write Disable Register)
    این سه رجیستر پورت را در حالت خروجی کنترل می کنند. رجیستر PIO_ODSR در واقع رجیستر اصلی است که دو رجیستر PIO_SODR و PIO_CODR فلیپ فلاپ های این رجیستر را Set و یا Clear می کنند. این رجیستر در حالت عادی ReadOnly است ، اما در صورت 1 شدن هر یک از بیتهای رجیستر PIO_OWSR آن بیت در PIO_ODSR را می توان مستقیما Write کرد.

    • PIO_PER , PIO_PDR , PIO_PSR( I/O Line or Peripheral Function Selection)
    این رجیسترها برای این است تعیین کنید، آیا پورت مستقیما توسط رجیسترهایی که تا بحال معرفی شدند کنترل شود، یا بوسیله تجهیزات داخلی (Peripherals) میکروکنترلر (همانند سریال پورت، TWI ،SPI و ...) کنترل شود. توجه کنید که در صورتی که پورت در اختیار تجهیزات داخلی قرار گیرد، فقط کنترل PullUp در اختیار شماست. قسمتهایی که مربوط به ورودی پورت هستند کاملا مستقل از موارد گفته شده عمل می کنند.

    • PIO_PDSR (Pin Data Status Register) :
    این رجیستر همان رجیستر PINx در میکروکنترلرهای AVR است.

    • PIO_IFER (Input Filter Enable Register)
    PIO_IFDR (Input Filter Disable Register)
    PIO_IFSR (Input Filter Status Register)
    این رجیسترها برای فعال و غیر فعال کردن Glitch Filter برای هر یک از بیتهای پورت است. Glitch Filter برای حذف نویز ورودی است. با مراجعه به دیتاشیت می توانید در رابطه با این فیلتر اطلاعات کاملی بدست بیاورید.

    مثال اول :
    یک فلاشر ساده بدون فعال کردن قابلیت دسترسی مستقیم به PIO_SODR . LED ها به پایه های PA8-PA15 متصل هستند.

    کد:
    #include <AT91SAM7S64.H>
    
    void wait()
    {
    	int t;
    	for( t = 0x4ffff ; t != 0 ; t-- );
    }
    
    int main (void) {
    	int i;
    	// Enable the Clock of the PIO
    	AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
    	
    	// Configure the PIO Lines as Outputs
    	AT91C_BASE_PIOA->PIO_PER = 0xff00;
    	AT91C_BASE_PIOA->PIO_OER = 0xff00;
    	
    	// Clear the LED's. On the Board we must apply a "0" to turn off LEDs
    	AT91C_BASE_PIOA->PIO_CODR= 0xff00;
    	
    	// Loop forever
    	for (;;) {
    		for (i = 8; i < 16; i++) {
    		 AT91C_BASE_PIOA->PIO_SODR = 1<<i;
    		 wait();
    		 AT91C_BASE_PIOA->PIO_CODR = 1<<i;
    		 wait();
    		}
    	}
    }

    مثال دوم :
    یک فلاشر ساده با فعال کردن قابلیت دسترسی مستقیم به PIO_SODR . LED ها به پایه های PA8-PA15 متصل هستند.


    کد:
    #include <AT91SAM7S64.H>
    
    void wait()
    {
    	int t;
    	for( t = 0x4ffff ; t != 0 ; t-- );
    }
    
    int main (void) {
    	int i;
    	// Enable the Clock of the PIO
    	AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
    	
    	// Configure the PIO Lines as Outputs
    	AT91C_BASE_PIOA->PIO_PER = 0xff00;
    	AT91C_BASE_PIOA->PIO_OER = 0xff00;
    	
    	// Clear the LED's. On the Board we must apply a "0" to turn off LEDs
    	AT91C_BASE_PIOA->PIO_CODR = 0xff00;
    
    	// enable direct access to PIOA.8...PIOA.15.
    	// after this we can update port output by PIO_ODSR register.
    	AT91C_BASE_PIOA->PIO_OWER = 0xff00;
    	
    	// Loop forever
    	for (;;) {
    		for (i = 8; i < 16; i++) {
    		 AT91C_BASE_PIOA->PIO_ODSR = 1<<i;
    		 wait();
    		 AT91C_BASE_PIOA->PIO_ODSR = 0;
    		 wait();
    		}
    	}
    }


    مثال سوم :
    یک فلاشر ساده با فعال کردن قابلیت دسترسی مستقیم به PIO_SODR که در صورت1 شدن پایه PA31 متوقف شده و در صورت 0 شدن این پایه دوباره شروع به کار می کند. LED ها به پایه های PA8-PA15 متصل هستند.

    کد:
    #include <AT91SAM7S64.H>
    
    void wait()
    {
    	int t;
    	for( t = 0x4ffff ; t != 0 ; t-- );
    }
    
    int main (void) {
    	int i;
    	// Enable the Clock of the PIO
    	AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
    	
    	// Configure the PIO Lines as Outputs
    	AT91C_BASE_PIOA->PIO_PER = 0xff00;
    	AT91C_BASE_PIOA->PIO_OER = 0xff00;
    	
    	// Clear the LED's. On the Board we must apply a "0" to turn off LEDs
    	AT91C_BASE_PIOA->PIO_CODR = 0xff00;
    
    	// enable direct access to PIOA.8...PIOA.15.
    	// after this we can update port output by PIO_ODSR register.
    	AT91C_BASE_PIOA->PIO_OWER = 0xff00;
    
    	// enable pullUp on PA31
    	AT91C_BASE_PIOA->PIO_PPUER = 0x80000000;
    	
    	// Loop forever
    	for (;;) {
    		for (i = 8; i < 16; i++) {
    		 AT91C_BASE_PIOA->PIO_ODSR = 1<<i;
    		 wait();
    		 while( AT91C_BASE_PIOA->PIO_PDSR & 0x80000000 );
    		 AT91C_BASE_PIOA->PIO_ODSR = 0;
    		 wait();
    		}
    	}
    }
    فایل های پیوست شده
    بت در بغل و به سجده پیشانی ما کافر زده خنده بر مسلمانی ما
    اسلام به ذات خود ندارد عیبی هر عیب که هست در این مسلمانی ماست
لطفا صبر کنید...
X