دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

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

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 7 , از مجموع 7

موضوع: آموزش keil

  1. #1
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    smilee1 آموزش keil

    آموزش keil



    خانواده میکروکنترلرهای ARM مدتی است که پا یه دنیای الکترونیک گذاشته اند. این معماری باعث ایجاد میکروکنترلرهای بسیار زیادی شده که از جمله شرکتهای محبوب و معروف در ایران میتوان به atmel و philips اشاره کرد.ARM ها از نظر هسته CPU به چند دسته تقسیم میشوند که معروفترین آنها arm7 و arm9 است. کامپایلرهای معروف این سری میکروکنترلرها IAR و KEIL میباشد.
    در اینم مبحث برروی میکرو کنترلرهای ARM شرکت فیلیپس کار خواهد شد و پروژه ها برای LPC2378 بسته میشوند. (این میکروکنترلر در حال حاضر در بازار ایران به مبلغ 18000 موجود است و از امکانات و سرعت زیادی برخوردار است)

    برای دریافت برنامه KEIL از سایت keil.com میتوانید دانلود کنید. این برنامه به طور کامل و صحیح کار میکند و مشکلی تا کنون از آن مشاهده نشده است. بعد از نصب این برنامه در مسیر نصب فایل .pdf موجود است که طریقه ساخت یک دیباگر/پروگرامر ساده و کارآمد میکروکنترلرهای ARM را نشان داده است. این برنامه قابل اضافه شدن به KEIL بوده و از بسیاری از میکروکنترلرها از شرکتهای مختلف پشتیبانی میکند.
    برنامه Flash magic یکی از برنامه های پرقدرت پروگرامر فیلیپس بوده که قابلیت آنرا دارد که از طریق bootloader موجود در ROM میکروکنترلر (بصورت کارخانه ای روی میکرو کنترلر قرار دارد) میکروکنترلر را پروگرام کند. از مزایای این برنامه ارتباط UART بوده و تنها راه بیرون آوردن میکروکنترلر lock شده به حالت عادی این برنامه میباشد.
    نکته: دو برنامه بالا در بورد آزمایشی موجود در سایت فیلیپس (MB2300) به کار برده میشود. و میتوانید به راحتی سخت افزار این دو برنامه را در شماتیک MCB2300 مشاهده کنید.






    مرجع پردازنده های دیجیتال

  2. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


  3. #2
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    پیش فرض پاسخ : آموزش keil

    شروع کار با arm و keil قسمت اول(Gpio)

    برای شروع کار اول میرم سراغ ورودی خروجی ها.میکروهای ARM بسته به مدل دارای تعداد زیادی ورودی ،خروجی همه منظوره می باشد که معمولا توسط چهار رجیستر 32 بیتی IOPIN,IOSET,IODIR و IOCLR کنترل می شوند .در هنگام ریست قطعه همه IO ها به ورودی تبدیل می شوند در نتیجه مانند سایر قطعات شما باید در ابتدای برنامه نوع پین ها و جهت صحیح انها را تعریف کنید.

    رجیستر IODIR به شما این امکان را می دهد که هر پین را به طور مستقل به عنوان ورودی (0) یا خروجی (1) تعریف کنید. اگر پینی به عنوان خروجی تعریف شده باشد به وسیله رجیسترهای IOSET و IOCLR می توانید وضعیت این پینها را کنترل کنید .قرار دادن مقدار 1در این رجیسترها پین مورد نظر را 1 یا 0 می کند.به یاد


    داشته باشید که برای صفر کردن خروجی نیز باید در رجیستر IOCLR مقدار 1 را قرار دهید .وضعیت پین GPIO را می توانید در هر لحظه با خواندن محتوای رجیستر IOPIN بدست اورید. اگر میکرو شما بیشتر از 32 ورودی و خروجی داشته باشد نام این رجیسترها دار شماره دسته پین مورد نظر نیز خواهد بود .به عنوان مثال اگر میکرو شما دارای پورتهای ورودی خروجی P0.0-P0.31 وP1.16-P1.31 باشد رجیسترهای مربوطه به صورت IO0PIN یا IOPIN1 تغییر نام خواهند داشت که برای اطلاعات بیشتر می توانید به دیتاشیت میکرو مورد نظر مراجعه کنید.حالا برای اشنایی بهتر با عملکرد رجیسترهای IO نحوه انجام یک مثال ساده با کامپایلر Keil و شبیه سازی ان توسط نرم افزار پروتئوس توضیح می دهم.



    ابتدا نرم افزار Keil را باز کنید و از منوی PROJECT گزینه new uVision Project را انتخاب کنید.

    در پنجره باز شده نامی برای پروژه خود انتخاب کنید و روی دکمه save کلیک کنید.سپس پنجره جدیدی باز خواهد شد.شما از این پنجره می توانید پردازنده مورد نظر خود را انتخاب کنید.از پردازنده های شرکت NXP یک از پردازنده های سری LPC2100 مثلا LPC2104 را انتخاب کنید.

    بعد از انتخاب این قطعه از شما پرسیده خواهد شد که ایا مایلید فایل Startup به پروژه اضافه شود یا خیر.روی yes کلیک کنید.بعدا درباره فایل Startup توضیح خواهم داد.

    حال به پنجره چپ نگاه کنید یک پوشه به نام Target1 اضافه شده است با کلیک رو علامت + می توانید محتویات انرا مشاهده کنید.که تنها فایل Startup در ان قرار دارد.

    حال از منوی File روی New کلیک کنید.یک پنجره بازخواهد شد که می توانید کد مورد نظر خود را در ان قرار دهید.

    حالا قطعه برنامه زیر را در ان وارد کنید.
    کد:
    #include <LPC210x.h>
    int main (void) {
    unsigned int delay;
    unsigned int flasher=0x00010000;
    IODIR=0x00ff0000;
    while(1) {
    for(delay = 0;delay<0x40000;delay++) {
    ;
    }
    IOCLR=~flasher;
    IOSET= flasher;
    flasher=flasher<<1;
    if(flasher&0x1000000)flasher=0x00010000;
    }
    }

    پس از وارد کردن کد بالا با کلیک روی ایکون save در نوار ابزار فایل را با پسوند.c به شکل مثلا test.c ذخیره کنید. اکنون فایل برنامه را با راست کلیک روی source Group از پنجره سمت راست و انتخاب Add File to Group به پروژه اضافه کنید.حالا با راست کلیک روی عبارت Target1 در پنجره سمت چپ و کلیک روی گزینه اول یعنی option for target به قسمت تنظیمات پروژه وارد می شوید.در سربرگ target میتوانید فرکانس کلاک خارجی متصل به قطعه را انتخاب کنید که به طور پیش فرض رو 12MHz می باشد در سربرگ سوم یعنی output گزینه create HEX File را انتخاب کنید تا نرم افزار فایل HEX لازم برای شبیه سازی در پروتئوس را تولید کند. سپس روی ok کلیک کنید.

    حالا با دابل کلیک روی فایل startup پنجره مربوط به ان را باز کنید.این فایل شامل اطلاعات لازم برای تنظیم پارامترهای قطعه مانند حافظه پشته PLL و غیره می باشد که محتوی اطلاعات پیش فرض لازم می باشد که شما می توانید بنابر نیاز خود انهارا تغییر بدهید.ازقسمت پایین پنجره startup سربرگ configuration wizard را انتخاب کنید . از قسمت PLL setup مقادیر MSEL که مقدار ضریب PLL و PSEL که مقدار مقسم PLL را مشخص می کند ، طوری تنظیم کنید که کلاک اعمالی به هسته در حدود 10MHz قرار بگیرد تا نرم افزار پروتئوس توان شبیه سازی را داشته باشد وگرنه هنگام شبیه سازی با خطای overclock مواجه خواهید شد. تغییرات را ذخیره کنید.حالا زمان کامپایل برنامه است. از منوی Project و با انتخاب گزینه Build Target یا با استفاده از دکمه قرار داده شده در نوار ابزار پروژه را کامپایل کنید .خطا ها و اخطار های احتمالی برنامه در پنجره خروجی در پایین محیط نرم افزار قابل مشاهده است. ادامه کارمانند سایر شبیه سازی ها با پروتئوس می باشد. فایل شبیه سازی را دانلود و باز کنید با دابل کلیک روی میکرو و از پنجره باز شده فایل HEX خروجی را از محل ذخیره سازی پروژه وارد کنید فرکانس کلاک را نیز رو 12MHz قرار دهید .حالا همه چیز برای شبیه سازی امده است و با کلیک بر روی RUN شما اولین پروژه خود را با میکرو کنترلر های ARM انجام داده اید.

    منبع:dspworld.gigfa.com

  4. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


  5. #3
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    پیش فرض پاسخ : آموزش keil

    قسمت دوم تایمرها:

    میکروکنترولرهای سری LPC210X دارای دو تایمر 32 بیتی می باشند که دارای ویژگیهای زیر هستند:

    -چهار کانال 32 بیتی capture برای تایمر 1 و3 کانال برای تایمر 0.

    -چهار رجیستر 32 بیتی تطابق که ویژگیهای زیر را دارند

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

    -توقف تایمر در زمان تطابق با قابلیت وقوع وقفه .

    -ریست تایمر در هنگام تطابق با قابلیت تولید وقفه.

    -چهار خروجی برای تایمر 1 و سه خروجی برای تایمر 0 که منطبق بر عملکرد رجیستر های تطابق می باشند که دارای قابلیتهای زیر هستند.

    -سطح منطقی پایین در هنگام تطابق.

    - سطح منطقی بالا در هنگام تطابق.

    -تغییر وضعیت پین (toggle) در هنگام تطابق.



    -بدون تغییر ماندن حالت پین.

    رجیستر های مربوط به تایمر ها به صورت زیر می باشند:

    -IR-این رجیستر مربوط به کنترل وقفه های تایمر 1 و 0 می باشد.

    -TCR- رجیستر کنترل تایمر که عملکرد ان را کنترل می کند.

    -TC-شمارنده تایمر که یک شمارنده 32 بیتی می باشد وبه ازای هر PR+1 سیکل Pclk یک واحد افزایش می یابد.

    -PR- رجیسترمقسم کلاک.

    -PC-شمارنده مقسم،این شمارنده 32 بیتی هنگامیکه مقدار ان با مقدار داخل رجیستر PR برابر شود یک واحد به TC اضافه می شود.

    -MCR-رجیستر کنترل حالت تطابق. با استفاده از این رجیستر می توان تعیین کرد که هنگام وقوع یک تطابق چه اتفاقی بیافتد.یک وقفه ایجاد شود یا رجیستر TC ریست شود .

    -MR0..3-هنگامیکه مقدار این رجیستر ها با TC برابر شود بسته به تنظیمات MCR رجیستر TC متوقف یا ریست می شود و یا یک وقفه ایجاد خواهد شد.

    -CCR-رجیستر کنترل واحد Capture .این رجیستر نحوه تحریک شدن پین Capture را تعیین می کند و همچنین مشخص می کند که در هنگام تحریک وقفه اتفاق بیافتد یا خیر.

    -CR0..3-این رجیستر در هنگام تحریک Capture با مقدار TC پر می شود.

    -EMR-این رجیستر عملکرد پینهای وابسته به رجیستر MAT را کنترل می کند.

    برای اشنایی بیشتر با بیتهای مربوط به رجیسترهای نامبرده به دیتا شیت مراجعه کنید.
    عملکرد تایمر:

    کلاک شمارنده تایمر به وسیله مقدار ذخیره شده در رجیستر PR تعیین می شود.شمارنده PC در هرلبه Pclk افزایش می یابد تا زمانیکه به مقدار ذخیره شده در رجیستر PR برسد هنگامیکه مقدار این دو رجیستر برابر شد رجیستر TC یک واحد افزایش می یابد و PC ریست می شود و عملیات شمارش مجددا شروع می شود..
    عملکرد تایمر در مد Capture :

    واحد Capture به شما این امکان را می دهد که در هر تغییر وضعیت پین Capture مقدار TC را بخوانید.

    هرکانال Capture یک پین متناظر دارد که می توان بوسیله رجیستر PINSEL0..1 ان را به عنوان ورودی Capture فعال کرد.با استفاده از رجیستر CCR می توان این پین را نسب به لبه بالا رونده،پایین رونده یا هر دو حالت حساس کرد که در صورت تحریک شده واحد Capture توسط هر یک از این حالتها مقدار موجود در شمارنده به داخل رجیستر Capture (CR) بار می شود و اگر قبلا تنظیم شده باشد وقفه ای نیز تولید خواهد شد.این واحد به عنوان مثال می توان برای اندازه گیری فاصله زمانی دو لیه پالس یا محاسبه فرکانس یا چرخه کار یک پالس استفاده کرد. در تکه برنامه زیر نحوه استفاده از این واحد و تنظیم رجیستر های مربوطه را مشاهده می کنید.

    کد:


    #include <LPC21xx.H>
    void T0isr(void) __irq;
    int main(void)
    {
    VPBDIV = 0x00000002; //Set pclk to 30 Mhz
    PINSEL0 = 0x00000020; //Enable pin 0.2 as capture channel0
    T0PR = 0x0000001E; //Load prescaler for 1 Msec tick
    T0TCR = 0x00000002; //Reset counter and prescaler
    T0CCR = 0x00000005; //Capture on rising edge of channel0
    T0TCR = 0x00000001; //enable timer
    VICVectAddr4 = (unsigned)T0isr; //Set the timer ISR vector address
    VICVectCntl4 = 0x00000024; //Set channel
    VICIntEnable = 0x00000010; //Enable the interrupt
    while(1)
    {
    ;
    }
    }
    void T0isr (void) __irq
    {
    static int value;
    value = T0CR0; // read the capture value
    T0IR |= 0x00000001; //Clear match 0 interrupt
    VICVectAddr = 0x00000000; //Dummy write to signal end of interrupt
    }






  6. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


  7. #4
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    پیش فرض پاسخ : آموزش keil

    قسمت سوم عملکرد واحد مقایسه :

    بعد از اشنایی با واحد capture میرم سراغ عملکرد تایمر در حالت مقایسه.هر تایمردر سریLPC2xxx دارای چهار کانال مقایسه می باشد. که هر کانال دارای یک رجیستر مقایسه 32 بیتی می باشد.مقدار موجود در شمارنده تایمر در هر لحظه با مقدار رجیستر مقایسه چک می شود و هنگامیکه دومقدار برابر شدند خروجی تحریک می شود این تحریک می تواند روی عملکرد تایمر به صورت ریست،توقف یا وقفه اثر بگذارد وهمچنین می تواند روی یک پین خروجی تاثیر بگذارد. برای تنظیم تایمر در مد مقایسه باید رجیستر مقایسه(MRn) را با مقدار مورد نظر پر کنید.همچنین عملکرد واحد مقایسه هنگام وقوع یک تطابق با استفاده از رجیستر کنترل واحد مقایسه(MRC) تنظیم می شود.در این رجیستر هر کانال یک گروه از بیتهای منحصر بفرد دارد که عملکرد واحد مقایسه هنگام وقوع یک تطابق را تعیین می کند که می تواند تایمر را ریست،متوقف یا تولید یک وقفه نماید.همچنین می توان تلفیقی از این حالات را انتخاب کرد. پینهای خروجی واحد مقایسه به وسیله چهار بیت اول در

    رجیستر خروجی مقایسه(EMR) فعال و بوسیله بیتهای 4 تا11 می توان رفتار پین خروجی را تعیین کرد.(00 بدون تغییر،01 پین را صفر می کند،10 پین خروجی را ست می کند و11 حالت Toggle می باشد).

    برنامه زیر نشان می دهد که چطور می توان با استفاده از دو کانال مقایسه یک موج PWM ساده تولید کرد .کانال صفر برای تولد زمان تناوب موج PWM استفاده شده است.هنگامیکه یک حالت تطابق روی میدهد تایمر ریست میشود و یک وقفه تولید می شود.از وقفه برای ست کردن پین خروجی مقایسه یک استفاده شده است.کانال مقایسه 1 نیز برای کنرل چرخه (Duty Cycle) استفاده می شود. هنگامیکه یک تطابق در رجیستر مقایسه 1 روی میدهد پین خروجی مقایسه 1 صفر می شود.بنابراین با تغییر مقدار داخل رجیستر مقایسه 1 میتوان موج PWM دلخواه را تولید کرد.

    در زیر دو نمونه برنامه قرار دادم که برنامه اول یک موج PWM با چرخه کاری ثابت 50% و برنامه دوم با چرخه کار متغیر تولید می کند.
    کد:
    #include <LPC21xx.H>
    void T0isr(void) __irq;
    int main(void) {
    VPBDIV = 0x00000002;
    PINSEL0 |= 0x00000800;
    T0PR = 0x0000001E;
    T0TCR = 0x00000002;
    T0MCR = 0x00000003;
    T0MR0 = 0x00000010;
    T0MR1 = 0x00000008;
    T0EMR = 0x00000042;
    T0TCR = 0x00000001;
    VICVectAddr4 = (unsigned)T0isr;
    VICVectCntl4 = 0x00000024;
    VICIntEnable |= 0x00000010;
    while(1);
    }
    void T0isr (void) __irq
    {
    T0EMR |= 0x00000002;
    T0IR |= 0x00000001;
    VICVectAddr = 0x00000000;
    }

    روال برنامه اول به این صورت است که ابتدا توسط رجیستر VPBDIV نسبت کلاک اعمالی به واحدهای جانبی (Pclk) تعیین می شود سپس توسط رجیستر T0PR کلاک اعمالی به شمارنده تایمر یعنی TC مشخص می شود بدین صورت که به ازای هر PR+1 کلاک، TC یک واحد افزایش می یابد حال توسط رجیستر TOMCR تعیین می کنیم که هنگامیکه مقدار TC با مقدار موجود در رجیستر T0MR0 برابر شد تایمر ریست و یک وقفه تولید شود .TM0R0 دارای مقدار 16 و T0MR1 نیز دارای مقدار 8 است که چرخه کاری 50% را تولید می کند و نهایتا مقدار داخل رجیستر T0EMR باعث می شود که هنگام تطابق رجیستر TC با T0MR1 خروجی صفر شود و هنگامیکه وقفه روی داد یعنی در پایان چرخه کاری با فعال شدن وقفه در زیر برنامه وقفه ،با دستور T0EMR|=0X00000002 خروجی ست می شود.

    برنامه دوم :

    کد:

    #include <LPC21xx.H>

    void T0isr(void) __irq;

    int main(void)

    {

    VPBDIV = 0x00000002;

    PINSEL0 |= 0x00000800;

    T0PR = 0x0000001E;

    T0TCR = 0x00000002;

    T0MCR = 0x00000003;

    T0MR0 = 0x00000101;

    T0MR1 = 0x00000000;

    T0EMR = 0x00000042;

    T0TCR = 0x00000001;



    VICVectAddr4 = (unsigned)T0isr;

    VICVectCntl4 = 0x00000024;

    VICIntEnable |= 0x00000010;



    while(1);

    }



    void T0isr (void) __irq

    {

    T0EMR |= 0x00000002;

    T0MR1++;

    T0MR1 = T0MR1&0x000000FF;

    T0IR |= 0x00000001;

    VICVectAddr = 0x00000000;

    }







    عملکرد این برنامه نیز مانند برنامه قبلی می باشد با این تفاوت که مقدار T0MR1 با هر بار وقوع وقفه افزایش می یابد و باعث می شود که در خروجی یک موج PWM با چرخه کاری متغییر داشته باشیم. با شبیه سازی به وسیله پروتئوس می توانید خروجی برنامه را مشاهده کنید.

  8. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


  9. #5
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    پیش فرض پاسخ : آموزش keil


    قسمت چهارم عمکرد واحد PWM:


    در نگاه اول به مدولاتور PWM ممکن است پیچیده تر از تایمر های عمومی بنظر اید اما در اصل این واحد نیز یک تایمر عمومی بیشتر به اضافه تعدادی سخت افزار دیگر می باشد.مدولاتور PWM می تواند شش کانال PWM با یک لبه کنترل شده یا سه کانال با دولبه کنترل شده تولید نمایید. در تایمر های عمومی هنگامیکه یک مقدار جدید در رجیستر مقایسه نوشته می شد سریعا روی عملکرد تاثیر می گذاشت اما در حالت PWM باید مراقب باشید که این اتفاق در برنامه شما نیافتد چون باعث می شود که چرخه PWM به هم بریزد..اگر شما چندین کانال را با مقادیر جدید بروز کنید مقدار جدید مدولاتور PWM در نقاط مختلف در چرخه PWM تاثیر می گذارند و باعث می شوند که نتیجه اشتباه شود.مدولاتور PWM دارای مکانیزم لچ سایه می باشد که به شما این امکان را می دهد که مقادیر PWM به صورت انی وارد شوند اما مقادیر جدید در هنگان شروع چرخه جدید اعمال می شوند. مقادیر داخل رجیستر مقایسه در هر زمان می تواند بروز شوند اما تا زمانی که بیت متناظر کانال مقایسه در رجیستر فعال سازی لچ (LER) ست نشود مقادیر اعمال نمی شوند.هنگامیکه LER ست شد مقادیر داخل رجیستر مقایسه در شروع چرخه بعدی به رجیستر سایه انتقال داده خواهند شد.با صرف نظر از لچ سایه مدولاتور PWM همانند رجیستر های مقایسه تایمر عمل می کنند. دومین سخت افزار اضافه شده به مدولاتور PWM نسبت به تایمر معمولی درقسمت پین های خروجی قرار دارد.به جای اینکه خرجی های کانال مقایسه مستقیما به وسیله پین های خروجی کنترل شوند دارای یک سری فیلیپ فلاپ SR می باشند. در عکس زیر دیاگرام کلی واحد PWM را مشاهده می کنید.



    این ارایش از فلیپ فلاپهای SR و مولتی پلکسها به واحد PWM این امکان را می دهند تا هردو حالت PWM با کنترل یک لبه یا دولبه را تولید کند. مولتی پلکسرها به وسیله رجیستر PWMSEL کنترل می شوند و می توانند سطح خروجی را در هر دوحالت تنظیم کنند. در حالت کنترل یک لبه مولتی پلکسر رجیستر مقایسه 0 را به ورودی S هر فلیپ فلاپ و کانال های باقیمانده را به ورودی R متصل می کند. با این روش رجیستر مقایسه 0 برای تولید دوره تناوب PWM استفاده می شود. در انتهای هر سیکل شمارنده ریست و رجیستر مقایسه 0 ست می شود که این باعث ست شدن فلیپ فلاپها در ابتدای هر چرخه می شود. خرجی Q بالا می رود و همه خروجی هارا یک می کند..مدولاسیون سیگنال PWM به وسیله باقی رجیسترهای مقایسه انجام می شود. هر کانال PWM یک کانال مقایسه وابسته دارد که به ورودی R فلیپ فلاپ متصل است .هنگامیکه یک تطابق رخ می دهد فلیپ فلاپ ریست می شود و پین PWM به حالت LOW ست می شود. شما می توانید با تغییر مقدار رجیسترهای مقایسه مرتبط سیگنال PWM رو به دلخواه مدوله کنید. با برنامه ریزی مجدد مولتی پلکسرها خروجی PWM می توان به صورت کنترل هر دولبه در بیاید.در این روش رجیستر مقایسه 0 به هیچ خروجی متصل نیست و تنها برای ریست تایمر در انتهای دوره PWM استفاده می شود. در این حالت ورودیهای S و R هر فیلیپ فلاپ به یک رجیستر مقایسه متصل است.در شروع چرخه PWM خروجی LOW است لبه بالا رونده هر پالس به وسیله رجیستر مقایسه متصل به ورودی S کنترل می شود و لبه پایین رونده نیز به وسیله رجیستر مقایسه متصل به S .مثال زیر استفاده از واحد PWM را در حالت کنترل هر دولبه نشان می دهد. برای اشنایی با نحوه تنظیمات رجیستر های مربوطه به دیتا شیت مراجعه کنید.
    ویرایش توسط M@hdi42 : 16th January 2014 در ساعت 10:30 AM

  10. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


  11. #6
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    smilee1 پاسخ : آموزش keil

    شروع کار با arm و keil قسمت پنجم(RTC)

    RTC:
    ساعت سری LPC2xxx یک ساعت دقیق که برای کار تا سال 2099 تنظیم شده است می باشد. مانند تمام واحدهای جانبی دیگر میکرو های ارم ،RTC نیز توسط PCLK کلاک زده می شود و احتیاج به اسیلاتور خارجی ندارد .RTC این سری به گونه ای طراحی شده است که یک واحد جانبی با مصرف توان فوق العاده پایین باشد و در صورت استفاده از LPC2xxx در مدهای کم توان مناسب برای استفاده برای عملکرد بدون باتری می باشد.علاوه بر فراهم کردن یک تقویم زمانی RTC دارای یک دسته از رجیسترهای هشدار (alarm)می باشد که می تواند برای تریگر کردن یک زمان و تاریخ خاص و یا در هنگام رسیدن به یک مقدار ذخیره شده در رجیستر زمان شمار استفاده شود.



    کلاک RTC در فرکانس استاندارد 32.7KHz کار می کند. به منظور فراهم کردن این فرکانس PCLK به مقسم کلاک مرجع متصل است. این مقسم می تواند با دقت فراوان هر فرکانسی از PCLK را برای تولید فرکانس 32.7KHz استفاده کند.
    <a href="http://www.noandishaan.com/upload/viewer.php?file=he9kal7qkxgtgdao6a71.jpg"><img src="http://www.noandishaan.com/upload/images/he9kal7qkxgtgdao6a71_thumb.jpg" border="0" alt="he9kal7qkxgtgdao6a71.jpg" /></a>
    برای اطمینان از اینکه کلاک RTC بتواند با دقت از مقادیر مختلف PCLK بدست آید مقسم این واحد پیچیده تر از مقسم تایمر همه منظوره عمل می کند. این مقسم به وسیله دو رجیستر به نامهای PREINT و PREFRAC برنامه ریزی می شود . همانطور که از نام آنها مشخص است این رجیسترها مقدار صحیح و اعشار مقدار مقسم را نگه می دارد. معادله استفاده شده برای محاسبه مقادیر لازم برای این رجیستر به صورت زیر می باشد.
    کد:
    PREINT=(int)(PCLK/32768)-1.
    PREFRAC=PCLK-((PREINT+1)*32768).

    به عنوان مثال برای PCLK=30MHz داریم:

    کد:
    PREINT=(int)(30,000,000/32768)-1=914.
    PREFRAC=30,000,000-((914+1)*32768)=17280.

    حال این مقادیر می تواند به صورت مستقیم در داخل رجیسترهای مقسم RTC قرار بگیرد و بعد از آن RTC آماده کارکردن می باشد. در انتها باید کلاک را در رجیستر کنترل کلاک فعال کرد تا شمارنده های زمان به کار افتد. واحد RTC دارای هشت رجیستر شمارنده زمان است که هر کدام از آنها شامل یک کمیت زمانی مستقل خواهد بود که می توان به طور مستقل در هر زمان خوانده شوند.به علاوه یک دسته از رجیستر های پیوسته وجود دارند که همان کمیت های زمانی را در یک رجیستر سه کلمه ای نگه می دارد که به کاربر اجازه می دهد همه اطلاعات زمانی را در طی سه عملیات بخواند. همچنین RTC می تواند آلارمهایی را به صورت وقفه در زمان های قابل برنامه ریزی تولید کند. دو مکانیزم برای تولید وقفه وجود دارد.در حالت اول شما می توانید RTC را برای تولید وقفه هنگامیکه هر یک از رجیستر های شمارنده زمان افزایش می یابد تنظیم کنید بطوریکه به عنوان مثال شما می توانید یک وقفه را هر یک ثانیه هنگامیکه شمارنده ثانیه به روز می شود تولید کنید یا یکبار در سال هنگامیکه شمارنده سال افزایش می یابد. رجیستر شمارنده افزایش وقفه CIIR این امکان را به شما می دهد که یک وقفه افزایشی را برای هر یک از این 8 رجیستر فعال کنید. حالت دوم برای تولید وقفه به وسیله رجیستر های آلارم می باشد.هر بار که رجیستر شمارنده یک تطابق با رجیستر آلارم داشته باشد اگر رجیستر انطباق آلارم ماسک نشده باشد و با رجیستر شمارنده زمان مطابقت یابد یک وقفه تولید می شود. اگر همه رجیستر های آلارم با رجیسترهای شمارنده زمان تطابق یابد یک وقفه تولید خواهد شد که در این صورت می توان یک وقفه بین زمان حال تا سال 2099 با دقت یک ثانیه تولید کرد. رجیستر پوشش آلارم تعیین می کند که کدام رجیستر آلارم در هنگام مقایسه فعال شود. هر دو رویداد آلارم و افزایش می توانند یک وقفه RTC تولید کنند و ضروری است که بین آنها تمایز قائل شوید. رجیستر محل وقفه ILR دارای دو پرچم می باشد که می توان برای مشخص کردن علت وقفه RTC مورد بازبینی قرار گیرد.همچنین بیاد داشته باشید که این پرچم ها باید برای لغو کردن وقفه پاک شوند. یک نمونه برنامه RTC که ساعت را تنظیم و از هر دونوع وقفه استفاده می کند در زیر آمده است.
    کد:
    #include <LPC21xx.H>
    void clock(void);
    void RTC_isr(void)__irq;
    unsigned counter = 0;
    int main(void)
    {
    IODIR1 = 0x00FF0000; // set LED ports to output
    IOCLR1 = 0x00FF0000;
    PREINT = 0x00000392; //Set RTC prescaler for 12.000Mhz Xtal
    PREFRAC = 0x00004380;
    CIIR = 0x00000001; //Enable seconds counter interrupt
    SEC = 0x00000000;
    ALSEC = 0x00000003; //Set alarm register for 3 seconds
    AMR = 0x000000FE; //Enable seconds Alarm
    CCR = 0x00000001; //Start the RTC
    VICVectAddr13 = (unsigned)RTC_isr; //Set the timer ISR vector address
    VICVectCntl13 = 0x0000002D; //Set channel
    VICIntEnable = 0x00002000; //Enable the interrupt
    while(1)
    {
    counter++;
    }
    }
    void RTC_isr(void) __irq
    {
    unsigned led;
    if(ILR&0x00000001) //Test for RTC counter interrupt
    {
    led = IOPIN1; //read the current state of the IO pins
    IOSET1 = 0x00010000; //Set the idle LED
    ILR = 0x00000001; //Clear the interrupt register
    }
    if(ILR & 0x00000002)
    {
    IOSET1 = 0x00100000; //Set LED 0.7
    ILR = 0x00000002;
    }
    VICVectAddr = 0x00000000; //Dummy write to signal end of interrupt
    }

    در زیر رجیسترهای RTC را مشاهده می کنید که در مورد هرکدام یک توضیح مختصر داده ام. ILR : رجیستر محل وقوع وقفه؛ این رجیستر تعیین می کند که کدام بلوک درخواست وقفه کرده است.نوشتن یک در هر بیت وقفه متناظر را پاک کمی کند.این روش به برنامه نویس این امکان را می دهد که مقدار این رجیستر را بخواند و مجددا در آن بنویسد تا فقط وقفه ای که روی داده شده است پاک شود.این رجیستر دارای دوبیت RTCCIF مربوط به وقفه افزایش شمارنده و RTCALF وقفه مربوط به رجیستر آلارم می باشد.



    رجیستر CCR :رجیستر کنترل ساعت؛ این رجیستر عملکرد مدار تقسیم کلاک را کنترل می کند که دارای 4 بیت می باشد. CLKEN که با یک کردن این بیت کانتر فعال می شود.CTCRST هنگامیکه این بیت یک است مقدار رجیستر CTC ریست می شود و تا هنگامیکه به صفر تغییر نکند در همین حالت باقی می ماند.CTTEST این بیتها باید در حال عملکرد عادی صفر بمانند.

    رجیستر CIIR: این رجیستر این قابلیت را دارد که هر بار که شمارنده افزایش یابد تولید یک وقفه نماید و این وقفه معتبر می ماند تا هنگامیکه بوسیله نوشتن مقدار یک در رجیستر [0]ILR پاک شود.

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


  12. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


  13. #7
    کاربر اخراج شده
    رشته تحصیلی
    مهندسی عمران
    نوشته ها
    0
    ارسال تشکر
    11,136
    دریافت تشکر: 25,270
    قدرت امتیاز دهی
    0
    Array
    M@hdi42's: لبخند

    پیش فرض پاسخ : آموزش keil

    قسمت ششم(WatchDog)

    سگ نگهبان


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

    این واحد جانبی دارای چهار رجیستر می باشد که در شکل بالا ملاحضه می کنید.مدت زمان شمارش سگ نگهبان به وسیله نوشتن مقدار موردنظر در رجیستر WDTCR مشخص می شود.این مدت زمان به وسیله فزمول زیر محاسبه می شود.
    Wdperiod=pclk*WDTC*4.
    حداقل مقدار WDTC 256 و حداکثر مقدار آن32^2 می باشد.بنابراین حداقل زمان شمارش سگ نگهبان در کلاک 60MHz ،17.066 میکرو ثانیه می باشد و حداکثر آن کمی کمتر از 5 دقیقه. هنگامیکه ثابت سگ نگهبان برنامه ریزی شد حالت عملکرد آن را می توان تنظیم کرد.رجیستر حالت سگ نگهبان شامل سه بیت کنترلی می باشد که توسط ان تعیین می شود که آیا در موقع لزوم یک وقفه یا یک ریست تولید شود و بیت آخر هم برای فعال کردن عملیات استفاده می شود. رجیستر حالت شامل دو پرچم می باشد.پرچم WDTOF که هنگام سرریز تایمر ست می شود و فقط بعد از یک ریست خارجی به حالت اول برمی گردد .این پرچم به برنامه راه انداز امکان می دهد که مشخص کند که آیا ریست بخاطر تغذیه(POWER ON) بوده است یا به علت وقوع خطا در برنامه.پرچم دیگر رجیستر حالت پرچم وقفه سگ نگهبان WDINT است.این پرچم نوع فقط خواندنی می باشد و برای پاک کردن آن باید خوانده شود.

    هنگامیکه ثابت تایمر سگ نگهبان و رجیستر های حالت تنظیم شد به وسیله نوشتن در رجیستر Feed شروع به کار می کند. این عملیات نیازمند رویه ای مانند پردازنده های دیگر می باشد یعنی ابتدا مقدار 0xAA و پس از آن0x55 در رجیستر مذکور باید نوشته شود که عدم رعایت این توالی باعث تولید یک وقفه می شود. مهم است که به این نکته توجه داشته باشید که اگرچه تایمر سگ نگهبان ممکن است به وسیله رجیستر حالت فعال شود اما تا زمانی که توالی صحیح مقدار دهی رجیستر Feed انجام نشود تایمر شروع به شمارش نمی کند. پس از شروع به شمارش تایمر باید به صورت پیوسته با توالی مناسب Feed را مقدار دهی کرد تا از رسیدن مقدار شمارنده به صفر و منقضی شدن زمان جلوگیری شود. آخرین رجیستر WDT رجیستر نگهدارنده زمان جاری WDTV می باشد که به شما امکان خواندن مقدار جاری تایمر را می دهد.





    قسمت هفتم (UART)

    قطعات سری LPC2xxx در حال حاضر دارای دو واحد UART می باشند.روش استفاده از هر دوواحد به یک صورت می باشد با این تفاوت که UART2 دارای سیستم پشتیبانی از سیستم ارتباطی مودم می باشد.هردو واحد از استاندارد صنعتی 550 پیروی میکنند و هردو واحد دارای تولید کننده نرخ انتقال و دارای16 بایت بافر انتقال و دریافت از نوع FIFO می باشند.

    مقدار دهی اولیه واحدUART به صورت زیر می باشد:
    Void init_serial(void) /*Initialize Serial Interface */
    {
    PINSEL0 = 0X00050000; /*Enable RxD1 and TxD1
    */
    U1LCR =0x00000083; /*8 bits, no parity , 1 stop bit
    */
    U1DLL = 0x000000c2; /*9600 Baud Rate @ 30MHz VPB Clock
    */
    U1LCR = 0x00000003; /*DLAB = 0
    */
    {

    ابتدا بلوک انتخاب پین برای سوئیچ از حالت GPIO به حالت عملکرد UART با مقدار مناسب برنامه ریزی شود. سپس با استفاده از رجیستر کنترل خط(LCR) واحد UART برای تنظیم فرمت انتقال کاراکترها تنظیم می شود.

    در مثال ما فرمت کاراکترها به صورت 8 بیتی بدون بیت توازن و با یک بیت توقف تنظیم شده است دررجیستر LCR یک بیت اضافی به نام DLAB وجود دارد که برای فعال کردن لچ مقسم نرخ سرعت استفاده می شود که به منظور برنامه ریزی تولید کننده نرخ انتقال این بیت باید ست شود. تولید کننده نرخ سرعت انتقال یک مقسم 16بیتی می باشد که با تقسیم Pclk بر آن برای کلاک واحد UART که باید 16 برابر نرخ سرعت باشد بدست می آید.بنابراین فرمول استفاده شده برای محاسبه نرخ سرعت UART به صورت زیر می باشد:
    کد:
    Divisor = Pclk/16 x BAUD

    که با کلاک 30 مگاهرتز داریم: کد:
    Divisor = 30,000,000/16 x 9600 = (approx) 194 or 0Xc2

    این فرمول نرخ واقعی 9665 را به ما می دهد و اغلب غیرممکن است که یک نرخ انتقال دقیق برای uart بدست آورد اما این واحد می تواند با خطای %5 نیز کار کند. بنا براین شما مقداری انحراف در زمانبندی UART خواهید داشت اگرم لاز داشته باشید که مقدار Pclk را به طور دقیق برای زمانبندی واحدهای جانبی دیگر مانند CAN تنظیم کنید.مقدار مقسم در دو رجیستر نگه داشته می شود ،لچ قسمت MSB مقسم (DLM) و لچ قسمت LSB مقسم (DLL).هشت بیت اول هر رجیستر نصف مقدار مقسم را همانطور که در شکل زیر نشان داده شده است نگه می دارد. سرانجام بیت DLAB در رجیستر LCR باید برای محافظت از مقدایر رجیسترهای مقسم به مقدار صفر برگردد.

    یکبار که واحد UART مقدار دهی اولیه شود کاراکترها می توانند با نوشتن در رجیستر نگه دار انتقال منتقل شوند. به طور مشابه کاراکترها می توانند با خواندن از رجیستر بافر دریافت خوانده شوند.در واقع هر دو این رجیسترها مکان یکسانی در حافظه اشغال می کنند.نوشتن یک کاراکتر،کاراکتر را در رجیستر انتقال FIFO قرار می دهد و خواندن از این مکان یک کاراکتر را از رجیستر دریافت FIFO بار می کند. روشی که در زیر نشان داده شده است نحوه ارسال و دریافت کاراکتر را نشان می دهد. [
    int putchar (int ch) /* Write character to Serial Port */
    {
    if (ch == '\n') {
    while (!(U1LSR & 0x20));
    U1THR = CR; /* output CR */
    }
    while (!(U1LSR & 0x20));
    return (U1THR = ch);
    }
    int getchar (void) /* Read character from Serial Port */
    {
    while (!(U1LSR & 0x01));
    return (U1RBR);
    }
    ] توابع ()Putchar و ()Getchar برای نوشتن و خواندن یک کاراکتر منفرد توسط UART استفاده می شود.این درایورهای سطح پایین به وسیله توابع STDIO در نرم افزار Keil مانند ()printf و ()scanf فراخوانی می شوند.بنابراین اگر شما می خواهید از I/O های استاندارد به عنوان UART برای کار با LCD و KEYPAD استفاده کنید این توابع را برای پشتیبانی از ارسال و دریافت یک کاراکتر به ورودی و خروجی قطعه مورد نظر باید بازنویسی کنید.هردو تابع()putchar و ()getchar رجیستر وضعیت ارتباط (LSR) را برای چک کردن خطاهای UART و چک کردن وضعیت FIFO های ارسال و دریافت بررسی می کنند.

    واحد UART دارای یک کانال وقفه در VIC می باشد اما دارای سه منبع وقفه است.وقفه UART می تواند به وسیله تغییر در رجیستر وضعیت خط تولید شود.بنابراین اگر یک شرایط خطا اتفاق بیافتد یک وقفه تولید می شود و LSR می تواند خوانده شود تا علت خطا مشخص شود. دو منبع باقی مانده تولید وقفه،وقفه ارسال و دریافت می باشند. وقفه دریافت به وسیله شروع دریافت کاراکتر دررجیستر RXFIFO اغاز می شود.عمقی که در آن وقفه تریگر می شود به وسیله رجیستر کنترل UART FIFO تعیین می شود.

    وقفه دریافت می تواند طوری تنظیم شود که بعد از دریافت 1،4،8 یا 14 کاراکتر تریگر شود.بنایراین اگر وقفه طوری تنظیم شود که هنگامیکه 8 کاراکتر در بافر دریافت هست و 34 کاراکتر ارسال شده است بنابراین چهار وقفه تولید خواهد شد و دو کاراکتر در FIFO باقی خواهد ماند.این کارکترهای باقی مانده سبب بروز وقفه
    (character time out indication”(CTI" می شود.وقفه CTI هنگامیکه یک یا چند کاراکتر در FIFO باقی مانده باشد و هیچ فعالیتی برای3.5 تا 4.5 برابر زمان دریافت یک کاراکتر انجام نشود اتفاق می افتد.
    FIFO انتقال نیز هنگامیکه رجیستر نگه دار داده انتقالی خالی است و یا هنگامیکه رجیستر شیفت انتقال خالی است تولید یک وقفه می کند.

    UART1 نیز ساختاری مانند UART0 دارد اگرچه امکانات بیشتری برای کنترل حالت عملکرد مودم دارد. UART1 دارای پینهای اضافی برای پشتیبانی از رابط مودم کامل می باشد.(CTS,DCD,DSR,DTR,RI,RTS) .دو رجیستر اضافی نیز به نامهای رجیستر کنترل مودم و رجیستر وضعیت مودم و یک منبع وقفه اضافی برای فراهم کردن وقفه وضعیت ارتباط وجود دارد. این ویژگی اضافی امکان ارتباط بهینه با یک مودم با تولید یک وقفه هربار که یک تغییر در رجیستر وضعیت مودم اتفاق افتد را به کاربر می دهد.

  14. کاربرانی که از پست مفید M@hdi42 سپاس کرده اند.


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

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

  1. سوال: کسی بلده با برنامه keil کار کنه؟
    توسط parisa niakan در انجمن برنامه نویسی
    پاسخ ها: 1
    آخرين نوشته: 16th January 2014, 10:27 AM
  2. سوال: کسی بلده با برنامه keil کار کنه؟
    توسط parisa niakan در انجمن منابع و جزوات
    پاسخ ها: 0
    آخرين نوشته: 16th November 2013, 08:37 PM
  3. دانلود نرم افزار Keil MDK-ARM 4.2
    توسط hadi elec در انجمن نرم افزار ها
    پاسخ ها: 0
    آخرين نوشته: 23rd March 2012, 12:57 AM
  4. پاسخ ها: 0
    آخرين نوشته: 17th December 2009, 12:14 PM

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

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

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