راه اندازی پورت های میکرو ARM

هدف پروژه

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

سخت افزار مورد استفاده

این پروژه مبتنی بر میکرو کنترلر ARM طراحی شده است. برای سادگی کار از برد آموزشی AT91SAM7X256 برای پیاده سازی استفاده شده است. امکانات استفاده شده در زیر ذکر شده است.

  • پورت 32 بیتی A
  • پورت 32 بیتی B
  • 5 عدد LED متصل شده به پورت B
  • 4 عدد دیپ سوئیچ (DIP Switch) متصل شده به پین های پورت B

کتابخانه های استفاده شده

  • کتابخانه PIO برای کنترل پورت های میکرو (برای یاد گیری درباره این کتابخانه اینجا کلیک کنید)
  • کتابخانه PMC به منظور فعال کردن کلاک پورت های میکرو (برای یاد گیری درباره این کتابخانه اینجا کلیک کنید)

تشریح کد برنامه

در ابتدا برنامه کتابخانه های مورد ایستفاده را include میکنیم که شامل کتابخانه های زیر میباشد.

#include <board.h>
#include <pio/pio.h>

در کتابخانه board.h همانطور که در فیلم های آموزشی گفته شده تمامی پورت های میکرو برای اتصال به بخشهای جانبی تعریف شده اند به عنوان مثال برای معرفی پین هایی که به دیود های نورانی و کلید ها متصل به پین های مربوطه در برد آموزشی به شکل زیر در کتابخانه board.h تعریف میشوند.

/// LED #0 pin definition.
#define PIN_LED_0  {1 << 19, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT}
/// LED #1 pin definition.
#define PIN_LED_1  {1 << 20, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT}
/// LED #2 pin definition.
#define PIN_LED_2  {1 << 21, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT}
/// LED #3 pin definition.
#define PIN_LED_3  {1 << 22, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT}

 

و برای کلید های فشاری به شکل زیر تعریف شده اند:

/// Push button #0 definition.
#define PIN_PUSHBUTTON_1    {1 << 23, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEGLITCH | PIO_PULLUP}
/// Push button #1 definition.
#define PIN_PUSHBUTTON_2    {1 << 24, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEGLITCH | PIO_PULLUP}
/// Push button #2 definition
#define PIN_PUSHBUTTON_3    {1 << 21, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEGLITCH | PIO_PULLUP}
/// Push button #3 definition.
#define PIN_PUSHBUTTON_4    {1 << 22, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEGLITCH | PIO_PULLUP}

و به روش مشابه برای بخش های دیگر مانند USART,SPI,… تعریف شده اند.

در مرحله اول پروژه می بایست پین های متصل به دیود نورانی با استفاده از کتابخانه PIO.h پیکر بندی نماییم ،برای این کار بعد از تعریف دیود های نورانی از دستور زیر استفاده میکنیم.

const Pin pinLED[]={PINS_LEDS};
PIO_Configure(pinLED,PIO_LISTSIZE(pinLED));

و سپس کلید های فشاری:

const Pin pinPB1 = PIN_PUSHBUTTON_1;
const Pin pinPB2 = PIN_PUSHBUTTON_2;
 
PIO_Configure(&pinPB1,1);
PIO_Configure(&pinPB2,1);

بعد از تعریف پین های متصل به کلید های فشاری و دیود های نورانی وارد بخش اصلی برنامه یا Main میشویم در این بخش هدف ما نوشتن برنامه است که با فشردن یک کلید دیود های نورانی شروع به چشک زدن بکنند و سپس با فشردن کلید فشاری دیگر تمام نود های نورانی روشن شوند و در همین وضعیت بمانند.ابتدا میبایست یک تابع تاخیر یا delay برای چشمک زدن دیود های نورانی بسازیم که به شکل زیر عمل میکنیم.

void delay_ms(unsigned long b)
{
    unsigned long y=0;  
    unsigned long e=0;
    do
    {
        for (e=0; e<3686; e++);
        y++;
    } while (y<b);
}

از این تابع برای تاخیر در حد میلی ثانیه استفاده میکنیم به عنوان مثال برای ایجاد یک تاخیر پانصد میلی ثانیه از دستو زیر استفاده میکنیم.

delay_ms(500);

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

دانلود سورس کد

سورس کد کامل را از اینجا دانلود کنید.

مشاهده نتیجه

با کلیک بر روی عکس زیر فیلم راه اندازی این پروژه را مشاهده کیند.

فیلم ساخت چشمک زن با ARM

Tags: , , , , , , ,