راه اندازی تایمر PIT و وقفه

هدف پروژه

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

کاربردها

از تایمر PIT برای استفاده در سیستم هایی با مدت زمان پاسخ طولانی تر مورد استفاده قرار میگیرد.معمولا برای راه اندازی یک سییتم عامل بر روی میکرو سیتم عامل مربوط برای زمان بندی خود از این تایمر استفاده میکند.

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

دراین پروژه از تایمر PIT موجود در میکروکنترلر ARM استفاده میکنیم.تایمر PIT یک تایمر بیست بیتی میباشد که سورس کلاک ورودی این تایمر برابر یک بیستم سورس کلاک سیستم میباشد که با توجه به اینکه سورس کلاک ما برابر 48000000 هرتز میباشد پس کلاک تایمر برابر 30000 هرتز میباشد.

همچنین برای راه اندازی وقفه از واحد AIC میکرو استفاده شده است.بدین صورت که پس از هر بار سر ریز شدن تایمر برنامه به روتین وقفه تایمر میرود.

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

کتابخانه PIT برای راه اندازی تایمر PIT (برای یاد گیری درباره این کتابخانه اینجا کلیک کنید)

کتابخانه AIC برای راه اندازی واحد وقفه (برای یاد گیری درباره این کتابخانه اینجا کلیک کنید)

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

در این بخش به بررسی main برنامه میپردازیم.

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

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

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

PIO_Configure(&pinLED,2);

در مرحله بعد میبایست تایمر PIT را پیکر بندی نماییم در main  برنامه از تابع ConfigurePit استفاده شده است که به بررسی این تابع میپردازیم.

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);
    AIC_EnableIT(AT91C_ID_SYS);
    PIT_EnableIT();
 
    // Enable the pit
    PIT_Enable();
}

در ابتدا با استفاده از دستور PIT_Init تایمر را پیکر بندی مینماییم.در دستور PIT_Init متغیر اول مشخص کننده زمان تناوب تایمر و متغیر دوم کلاک سیستم میباشد که در ورودی این دستور برای راه اندازی تایمر PIT به آن داده میشود.

سپس وقفه تایمر را پیکر بندی مینماییم برای این کار از دستور AIC_ConfigureIT استفاده میکنیم البته قبل از آن با دستور AIC_DisableIT وقفه را غیر فعال میکنیم.ورودی دستور AIC_ConfigureIT شامل سه متغیر میباشد.متغیر اول AT91C_ID_SYS منبع وقفه را مشخص میکند،چون تایمر PIT خود داری یک منبع وقفه نمیباشد می بایست از وقفه سیستم برای آن استفاده کنیم.

متغیر بعدی در ورودی تابع AIC_ConfigureIT مربوط به سطح اولویت وقفه میباشد که در این میکرو کنترلر ما دارای هفت سطح اولویت وقفه میباشید بدین معنی که اگر دو وقفه با هم روی دهد ابتدا وقفه ای که دارای سطح بالاتری میباشد اجرا میشود.در برنامه پایین ترین سطح وقفه برای تایمر در نظر گرفته و از مقدار ورودی  AT91C_AIC_PRIOR_LOWEST استفاده شده است.

متغیر آخری که می بایست به ورودی تابع  AIC_ConfigureIT داده شود نام روتینی است که پس از وقوع یک وقفه روتین برنامه میبایست به انجا رود ، در این برنامه برای تایمر PIT روتین ISR_Pit نوشته شده است.

نکته:تابع وقفه که در اینجا ISR_Pit میباشد میبایت در بالای دستور AIC_ConfigureIT قرار گیرد.

پس از پیکر بندی وقفه تایمر با استفاده از دستور (AIC_EnableIT(AT91C_ID_SYS وقفه سیستم را فعال میکنیم البته هنوز وقفه خود تایمر را فعال نکرده ایم که وقفه تایمر را با استفاده از دستور PIT_Enable فعال میکنیم.

حال تایمر شروع به کار میکند و با توجه زمان تنوابی که برای آن در نظر گرفته ایم یعنی هر یک میلی ثانیه وارد روتین وقفه خود میشود.

حال به  main  برنامه باز میگردیم،در برنامه از تابع wait برای ایجاد تاخیر استفاده شده است،مقدار تاخیر ایجاد شده به مقداری که در ورودی این تابع داده میشود که بر حسب میلی ثانیه میباشد بستگی دارد.

void Wait(unsigned long delay)
{
    volatile unsigned int start = timestamp;
    unsigned int elapsed;
    do {
        elapsed = timestamp;
        elapsed -= start;
    }
    while (elapsed < delay);
}

این تابع با استفاده از   وقفه تایمر PIT عمل میکند،بدین صورت که با هر بار رفتن برنامه به وقفه تایمر مقدار متغیر timestamp به روز میشود.

در پایان دیود های نورانی با استفاده از تابع wait شروع به چشمک زدن میکنند،و چون برنامه در حلقه بینهایت قرار دارد عمل چشمک زدن دیودهای نورانی تکرار میشود.

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

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

مشاهده نتیجه

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

فیلم راه اندازی pit در arm

Tags: , , , , , , , ,