رفتن به مطلب

پست های پیشنهاد شده

خانواده میکروکنترلرهای 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 مشاهده کنید.

 

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

به اشتراک گذاری این ارسال


لینک به ارسال

شروع کار با 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

به اشتراک گذاری این ارسال


لینک به ارسال

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

 

میکروکنترولرهای سری 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) بار می شود و اگر قبلا تنظیم شده باشد وقفه ای نیز تولید خواهد شد.این واحد به عنوان مثال می توان برای اندازه گیری فاصله زمانی دو لیه پالس یا محاسبه فرکانس یا چرخه کار یک پالس استفاده کرد. در تکه برنامه زیر نحوه استفاده از این واحد و تنظیم رجیستر های مربوطه را مشاهده می کنید.

[left]#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
[/left]


[left]T0PR       = 0x0000001E;                        //Load prescaler for 1 Msec tick 
T0TCR    = 0x00000002;                       //Reset counter and prescaler 
T0CCR    = 0x00000005;                      //Capture on rising edge of channel0[/left]


[left]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   
}
[/left]

به اشتراک گذاری این ارسال


لینک به ارسال

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

 

بعد از اشنایی با واحد 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 با چرخه کاری متغییر داشته باشیم. با شبیه سازی به وسیله پروتئوس می توانید خروجی برنامه را مشاهده کنید.

به اشتراک گذاری این ارسال


لینک به ارسال

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

 

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

 

pdf0rxwped4ipuwxwli9_thumb.jpg

 

این ارایش از فلیپ فلاپهای 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 را در حالت کنترل هر دولبه نشان می دهد. برای اشنایی با نحوه تنظیمات رجیستر های مربوطه به دیتا شیت مراجعه کنید.

به اشتراک گذاری این ارسال


لینک به ارسال

[h=2]شروع کار با arm و keil قسمت پنجم(RTC)[/h]RTC:

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

ywtl2std39bsyrryco_thumb.jpg

کلاک RTC در فرکانس استاندارد 32.7KHz کار می کند. به منظور فراهم کردن این فرکانس PCLK به مقسم کلاک مرجع متصل است. این مقسم می تواند با دقت فراوان هر فرکانسی از PCLK را برای تولید فرکانس 32.7KHz استفاده کند.

he9kal7qkxgtgdao6a71.jpg

برای اطمینان از اینکه کلاک RTC بتواند با دقت از مقادیر مختلف PCLK بدست آید مقسم این واحد پیچیده تر از مقسم تایمر همه منظوره عمل می کند. این مقسم به وسیله دو رجیستر به نامهای PREINT و PREFRAC برنامه ریزی می شود . همانطور که از نام آنها مشخص است این رجیسترها مقدار صحیح و اعشار مقدار مقسم را نگه می دارد. معادله استفاده شده برای محاسبه مقادیر لازم برای این رجیستر به صورت زیر می باشد.

[left]PREINT=(int)(PCLK/32768)-1.
[/left]
  
[left]PREFRAC=PCLK-((PREINT+1)*32768).
[/left]

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

 

[left]PREINT=(int)(30,000,000/32768)-1=914.
[/left]
  
[left]PREFRAC=30,000,000-((914+1)*32768)=17280.
[/left]

 

حال این مقادیر می تواند به صورت مستقیم در داخل رجیسترهای مقسم RTC قرار بگیرد و بعد از آن RTC آماده کارکردن می باشد. در انتها باید کلاک را در رجیستر کنترل کلاک فعال کرد تا شمارنده های زمان به کار افتد. واحد RTC دارای هشت رجیستر شمارنده زمان است که هر کدام از آنها شامل یک کمیت زمانی مستقل خواهد بود که می توان به طور مستقل در هر زمان خوانده شوند.به علاوه یک دسته از رجیستر های پیوسته وجود دارند که همان کمیت های زمانی را در یک رجیستر سه کلمه ای نگه می دارد که به کاربر اجازه می دهد همه اطلاعات زمانی را در طی سه عملیات بخواند. همچنین RTC می تواند آلارمهایی را به صورت وقفه در زمان های قابل برنامه ریزی تولید کند. دو مکانیزم برای تولید وقفه وجود دارد.در حالت اول شما می توانید RTC را برای تولید وقفه هنگامیکه هر یک از رجیستر های شمارنده زمان افزایش می یابد تنظیم کنید بطوریکه به عنوان مثال شما می توانید یک وقفه را هر یک ثانیه هنگامیکه شمارنده ثانیه به روز می شود تولید کنید یا یکبار در سال هنگامیکه شمارنده سال افزایش می یابد. رجیستر شمارنده افزایش وقفه CIIR این امکان را به شما می دهد که یک وقفه افزایشی را برای هر یک از این 8 رجیستر فعال کنید. حالت دوم برای تولید وقفه به وسیله رجیستر های آلارم می باشد.هر بار که رجیستر شمارنده یک تطابق با رجیستر آلارم داشته باشد اگر رجیستر انطباق آلارم ماسک نشده باشد و با رجیستر شمارنده زمان مطابقت یابد یک وقفه تولید می شود. اگر همه رجیستر های آلارم با رجیسترهای شمارنده زمان تطابق یابد یک وقفه تولید خواهد شد که در این صورت می توان یک وقفه بین زمان حال تا سال 2099 با دقت یک ثانیه تولید کرد. رجیستر پوشش آلارم تعیین می کند که کدام رجیستر آلارم در هنگام مقایسه فعال شود. هر دو رویداد آلارم و افزایش می توانند یک وقفه RTC تولید کنند و ضروری است که بین آنها تمایز قائل شوید. رجیستر محل وقفه ILR دارای دو پرچم می باشد که می توان برای مشخص کردن علت وقفه RTC مورد بازبینی قرار گیرد.همچنین بیاد داشته باشید که این پرچم ها باید برای لغو کردن وقفه پاک شوند. یک نمونه برنامه RTC که ساعت را تنظیم و از هر دونوع وقفه استفاده می کند در زیر آمده است.

[left]#include <LPC21xx.H>[/left]
  
[left]void clock(void);[/left]
  
[left]void RTC_isr(void)__irq;[/left]
  
[left]unsigned counter = 0;[/left]
  
[left] [/left]
  
[left]int main(void)[/left]
  
[left]{[/left]
  
[left]IODIR1                                  = 0x00FF0000;                                      // set LED ports to output[/left]
  
[left]IOCLR1                                  = 0x00FF0000;[/left]
  
[left]PREINT                                  = 0x00000392;                                    //Set RTC prescaler for 12.000Mhz Xtal[/left]
  
[left]PREFRAC                                = 0x00004380;[/left]
  
[left]CIIR                                       = 0x00000001;                                    //Enable seconds counter interrupt[/left]
  
[left]SEC                                       = 0x00000000;[/left]
  
[left]ALSEC                                    = 0x00000003;                                    //Set alarm register for 3 seconds[/left]
  
[left]AMR                                        = 0x000000FE;                                   //Enable seconds Alarm[/left]
  
[left]CCR                                        = 0x00000001;                                    //Start the RTC[/left]
  
[left] [/left]
  
[left]VICVectAddr13                 = (unsigned)RTC_isr;                                     //Set the timer ISR vector address[/left]
  
[left]VICVectCntl13   = 0x0000002D;                                                           //Set channel[/left]
  
[left]VICIntEnable      = 0x00002000;                                                          //Enable the interrupt[/left]
  
[left]while(1)[/left]
  
[left]{[/left]
  
[left]counter++;[/left]
  
[left]}[/left]
  
[left]}[/left]
  
[left] [/left]
  
[left]void RTC_isr(void)              __irq[/left]
  
[left]{[/left]
  
[left]unsigned led;[/left]
  
[left]if(ILR&0x00000001)                                                                         //Test for RTC counter interrupt[/left]
  
[left]{[/left]
  
[left]led                          =  IOPIN1;                                                       //read the  current state of the IO pins[/left]
  
[left]IOSET1                   = 0x00010000;                                               //Set the idle LED[/left]
  
[left]ILR                          = 0x00000001;                                              //Clear the interrupt register[/left]
  
[left]}[/left]
  
[left]if(ILR & 0x00000002)[/left]
  
[left]{[/left]
  
[left]IOSET1                    = 0x00100000;                                             //Set LED 0.7[/left]
  
[left]ILR                          = 0x00000002;[/left]
  
[left]}[/left]
  
[left]VICVectAddr             = 0x00000000;                                           //Dummy write to signal end of interrupt[/left]
  
[left]}
[/left]

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

ci58alnfpal0zbz377d_thumb.jpg

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

8lv874zusr7clq7t8il_thumb.jpg

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

34hy4ibnjbar9cb77u7_thumb.jpg

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

wpba9b58gdw0qakz4sxl_thumb.jpg

به اشتراک گذاری این ارسال


لینک به ارسال

قسمت ششم(WatchDog)

[h=1]سگ نگهبان[/h]همانند بسیاری از میکروکنترلرهای دیگر خانواده LPC2xxx نیز یک سیستم سگ نگهبان برای فراهم کردن یک روش بازیابی کنترل برنامه هایی که قفل یا متوقف شده اند دارد.

786e2a6r08ugn0ludd70_thumb.jpg

این واحد جانبی دارای چهار رجیستر می باشد که در شکل بالا ملاحضه می کنید.مدت زمان شمارش سگ نگهبان به وسیله نوشتن مقدار موردنظر در رجیستر WDTCR مشخص می شود.این مدت زمان به وسیله فزمول زیر محاسبه می شود.

Wdperiod=pclk*WDTC*4.

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

fllsps6ll1l2zottn65.jpg

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

 

به اشتراک گذاری این ارسال


لینک به ارسال

قسمت ششم(UART)

 

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

5vmf7clyydosijc5hehk_thumb.jpg

مقدار دهی اولیه واحد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 برای تنظیم فرمت انتقال کاراکترها تنظیم می شود.

ep1ytr4lk2arnj62hqj4_thumb.jpg

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

[left]Divisor  =  Pclk/16   x  BAUD
[/left]

که با کلاک 30 مگاهرتز داریم:

[left]Divisor   =   30,000,000/16  x   9600   =  (approx)   194  or   0Xc2
[/left]

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

yokipbinjxm2ltjzv9tf_thumb.jpg

یکبار که واحد 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 های ارسال و دریافت بررسی می کنند.

lapvnkcpr2qbuum70l3_thumb.jpg

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

jw7jr6ltixdepv8md8wb_thumb.jpg

وقفه دریافت می تواند طوری تنظیم شود که بعد از دریافت 1،4،8 یا 14 کاراکتر تریگر شود.بنایراین اگر وقفه طوری تنظیم شود که هنگامیکه 8 کاراکتر در بافر دریافت هست و 34 کاراکتر ارسال شده است بنابراین چهار وقفه تولید خواهد شد و دو کاراکتر در FIFO باقی خواهد ماند.این کارکترهای باقی مانده سبب بروز وقفه

(character time out indication”(CTI" می شود.وقفه CTI هنگامیکه یک یا چند کاراکتر در FIFO باقی مانده باشد و هیچ فعالیتی برای3.5 تا 4.5 برابر زمان دریافت یک کاراکتر انجام نشود اتفاق می افتد.

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

2ek27g8frlq9lkujfj8_thumb.jpg

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

voflvw4af6kapfami9_thumb.jpg

به اشتراک گذاری این ارسال


لینک به ارسال

[h=2]قسمت هشتم(I2C) [/h] از فیلیپس به عنوان مخترع اصلی باس اساندارد i2c عجیب نیست که سری LPC2000 را با یک واسط I2C کامل مجهز کرده باشد.واسط I2C می تواند در هر دو مد MASTER و SLAVE تا سرعت 400K بیت بر ثانیه کار کند همچنین در حالت مستر می تواند به طور خودکار در سیستمهای multi-master حکمیت کند.

gk0jxw2hvvlg5yjdugvx.jpg

یک سیستم I2C معمولی که در بالا نشان داده شده که در LPC2000 به دو پورت خارجی گسترش دهنده متصل شده است.مانن سایر واحد های جانبی خطوط کلاک(SCL) و داده (SDA) باید از حالت GPIO به پین های I2C توسط بلوک اتصال دهنده تبدیل شوند.

ax63b8vfb0agson0om.jpg

واسط جانبی I2C از هفت رجیستر تشکیل شده است.رجیستر کنترل دارای دو رجیستر مجزا می باشد که برای ست و پاک کردن بیتهای رجیستر کنترل استفاده می شود(I2CONSET,I2CONCLR).نرخ سرعت همچنین توسط دو رجیستر(I2SCLH,I2SCLL) تعیین می شود.رجیستر وضعیت کدهای کنترل که در رابطه با حالات مختلف باس می باشد را برمی گرداند.رجیستر داده نیز برای ارسال داده استفاده می شود.همچنین در حالت در یافت نیز داده ها در این رجیستر قرار خواهند گرفت.در نهایت هنگامیکه LPC2000 به عنوان اسلیو پیکربندی می شود ادرس شبکه آن به وسیله مقدار دهی رجیستر I2ADR تعیین می شود.برای مقدار دهی اولیه I2C ما نیاز به اجرای کدهای زیر داریم.

[left]VICVectCntl1 = 0x00000029;                                                  //select a priority slot for a given interrupt[/left]
 
[left] [/left]


[left]VICVectAddr1 = (unsigned)I2CISR;                       //pass the address of the IRQ into the VIC slot[/left]
 
[left] [/left]


[left]VICIntEnable = 0x00000200;                                   //enable interrupt[/left]
 
[left] [/left]


[left] [/left]
 
[left] [/left]


[left]PINSEL0               = 0x50;                                               //Switch GPIO to I2C pins[/left]
 
[left] [/left]


[left] [/left]
 
[left] [/left]


[left]I2SCLH = 0x08;                                //Set bit rate 14.7456Mhz/VPBDIV+SCLH+SCLL = 14.7456/4+8+8 = 57.6Khz[/left]
 
[left] [/left]


[left]I2SCLL                   = 0x08;
[/left]

 

I2C باید طوری برنامه ریزی شود که به هر اتفاقی روی باس واکنش نشان دهد.به همین خاطر این واحد جانبی وابستگی زیادی به وقفه دارد نتیجتا اولین چیزی که باید انجام شود تنظیم VIC برای پاسخ دهی به وقفه I2C می باشد.سپس بلوک انتخاب پین خروجی باید برای انتقال خطوط داده و ساعت I2C به پینهای خروجی تنظیم شود.سرانجام ما باید نرخ سرعت انتقال داده را با تنظیم رجیستر های I2SCLH و I2S CLL تنظیم کنیم. در هردو این رجیستر ها فقط 6 بیت اول برای نگه داشتن مقادیر زمان بندی استفاده می شود.رابطهخ مورداستفاده برای تنظیم نرخ انتقاد داده به صورت زیر است:

Bit Rate = Pclk/(I2SCLH+I2SCLL).

در مثال بالا PLL فعال نیست و کریستال خارجی 14.745 MHz است بنابراین نرخ ارسال I2C برابر است با: Bit Rate = 14.745/(8 + 8)=937500

بعد از این تنظیمات LPC2000 می تواند با قطعات دیگرروی باس ارتباط برقرار کند.برای نوشتن و خواندن داده به عنوان مستر روی باس یا دریافت و پاسخ به در خواست از یک باس مستر،محتوای رجیستر کنترل I2C در شکل زیر نشان داده شده است.به یاد داشته باشید که این رجیستر به وسیله رجیستر CONCLR و CONSET کنترل می شود.

lwyowb5i9segckxi2bx.jpg

در ابتدا نگاهی به حالت مستر می اندازیم برای ورود به این حالت ابتدا I2C باید فعال و بیت تصدیق باید صفر شود.این کار از انجام تصدیق اشتباه واحد I2C و وارد شدن آن به مد اسلیو جلوگیری می کند.

در حالت مستر قطعه LPC2000 مسئول آغاز ارتباط می باشد در طی انتقاال روی باس I2C تعدادی اتفاق ممکن است روی باس اتفاق بیافتد.

4cxxxu5ugqg9qj0dufu6.jpg

مستر باید ابتدا یک سیگنال شروع را ارسال کند.برای این منظور خط کلاک I2C بالا می رود و خط داده پایین می آید.آدرس اسلیو که مستر قصد ارتباط با آن را دارد روی باس قرار می گیرد و بعد از آن یک بیت که نشان دهنده در خواست خواندن یا نوشتن است ارسال می گردد و اگر اسلیو این رویه را به درستی دریافت کند با یک بیت تصدیق پاسخ می دهد.سپس می تواند به صورت توالی از بایتها و تصدیق ارسال گردد تا زمانیکه مستر انتقال را به وسیله یک بیت STOP قطع نمایید.

واحد I2C در سری LPC2000 واقعا یک موتور I2C کامل است.این موتور تمام رویدادهای اتفاق افتاده روی باس را کنترل می کند ولی نسبت به آن آگاهی ندارد.این بدان معناست که CPU ارم 7 باس I2C را برای هر انتقال به صورت Micro-Manage مدیریت می کند .خوشبختانه انجام این کار بسیار ساده می باشد و به مرکزیت وقفه I2C می باشد.هنگامیکه I2C در حالت مستر مقدار دهی اولیه شد ما می توانیم انتقال داده را به صورت زیر انجام دهیم.

j7ltvam8m5c17cogak35.jpg

ادرس اسلیو و داده که باید ارسال شود به صورت متغیر های سراسری تعریف می شوند تا بتوان به وسیله روتین وقفه I2C فراخوانی شوند.آدرس 7 بیتی می باشد و بیت LSB در حالت نوشتن 1 و در حالت خواندن 0 می باشد.روتین سپس پرچم های کنترل I2C را پاک می کند و I2C را فعال و شرایط شروع را ایجاد می کند هنگامیکه شرایط شروع روی باس قرار داده شده یک وقفه تولید می شود و یک کد که از رجیستر وضعیت I2C خوانده می شود.

nqq03ewcsx6r9r9sgojm.jpg

اگر شرایط شروع بدرستی ایجاد شده باشد مقدار این کد 0X08 خواهد بود.سپس باید ادرس اسلیو و بیت R/W را در داخل رجیستر داده I2C نوشته شود.وقتی علامت تصدیق دریافت شد وقفه دیگری تولید می شود و رجیستر وضعیت دارای مقدار 0X18 خواهد بود اگر انتقال به درستی انجام شده باشد.اکنون که اسلیو بدرستی ادرس دهی شده است و آماده دریافت داده می باشد می توان یک رشته از بایتها را به داخل رجیستر داده I2C نوشت .هنگامیکه این کار انجام شد داده ارسال و علامت تصدیق دریافت می شود یک وقفه تولید و مقدار رجیستر وضعیت 0X28 خواهد بود و اگر انتقال ناموفق باشد NACK دریافت و مقدار رجیستر داده 0X20 خواهد بود و داده مورد نظر باید مجدد ارسال گردد. بنابراین به ازای هربایت ارسال یک وقفه روی خواهد داد و کد وضعیت باید چک شود و بایت بعدی می تواند ارسال شود.هنگامیکه کلیه بایتها ارسال شد با ایجاد شرایط توقف به وسیله نوشتن در رجیستر کنترل I2C انتقال متوقف می شود.وقفه های I2C یک ماشین حالت واقعی می باشد که با امتحان کردن کد رجیستر وضعیت در هر وقفه عملیات لازم را انجام می دهد بنابراین به راحتی و با استفاده از یک دستور SWITCH مانند زیر می توان براحتی این الگوریتم را پیاده سازی کرد.

7er638pfye8u48x6ezxn.jpg

ین مثال یک تک بایت را ارسال می کند اما براحتی با تنظیم مجدد آن می توان چندین بایت را ارسال کرد. مورد دیگر اضافه کردن دستوراتی برای درخواست داده در حالت مستر می باشد.

crn4rujkfmtkzmv40dxl.jpg

در این مورد شرایط همانند قبل ایجاد می شود اما این بار ادرس نوشته شده با بیت R/W صفر روی باس قرار خواهد گرفت.هنگامبکه بعد از ارسال آدرس اسلیو تصدیق دریافت شد بعد از آن اولین بایت داده از اسیلو دریافت می شود و مستر احتیاج به انجام کاری ندارد.بنابراین دردستورات CASE ما می توانیم بیت ACK را ست کنیم تا بمحض انتقال بایت یک حالت ACK ایجاد شود.هربایت که انتقال می بابد داده را می توان از رجیستر I2CDAT خواند هنگامیکه همه بایتها خوانده شد شرایط توقف ایجاد و انتقال پایان می یابد.

 

همان تابع I2CTransferByte می تواند برای شروع خواندن داده استفاده شود و دستورات اضافی CASE که باید در روتین وقفه قرار گیرد به صورت زیر است.

lx4oflghvhfxztban5as.jpg

به اشتراک گذاری این ارسال


لینک به ارسال

قسمت نهم(SPI)

همانند واسط I2C واسط SPI نیز یک هسته واسط جانبی ساده که می تواند داده را روی باس SPI بنویسد یا بخواند می باشد اما به اندازه کافی برای مدیریت باس هوشمند نمی باشد. این واحد به وسیله کاربر مقدار دهی اولیه می شود و انتقال توسط باس را مدیریت می کند

ofyhzp1kycv23g8168.jpg

واحد SPI چهار پین خارجی دارد:یک پین کلاک خارجی،پین انتخاب اسلیو و دو پین داده ورودی مستر/خروجی اسلیو و خروجی مستر/ورودی اسلیو.پین کلاک سریال یک منبع کلاک تا فرکانس 400Kbit/s را هنگامیکه در حالت مستر می باشدارسال و هنگامیکه در حالت اسلیو می باشد دریافت می کند.باس SPI یک ارتباط داده سریال کامل برایانتقال پرسرعت داده و برعکس I2C دارای الگوی ادرس دهی در داخل انتقال سریال نمی باشد. قطعه خارجی به وسیله پین انتخاب اسلیو که یک پین مجزا می باشد انتخاب می شود.معمولا اگر LPC2000 در حالت مستر عمل کند می تواند از یک پین GPIO به عنوان انتخاب کننده اسلیو استفاده کند.هنگامیکه واحد SPI در مد اسلیو قرار دارد پین ورودی انتخاب اسلیو مخصوص به خود رادارد که باید دارای منطق صفر باشد تا اجازه دهد یک واحد SPI در حالت مستر با آن ارتباط برقرار کند.دو پین انتقال دادهبسته به اینکه در حالت مستر یا اسلیو قرار دارند متصل می شوند. شکل زیر یک تنظیم عمومی برای ارتباط یک EEPROM را نشان می دهد.

js4prjdyvsidmzp7zceq.jpg

واحد SPI دارای پنج رجیستر می باشد.رجیستر شمارنده کلاک که نرخ سرعت را تعیین می کند Pclk به سادگی به وسیله رجیستر موجود در شمارنده کلاک تقسیم می شود.برای بدست آوردن نرخ بیت SPI این رجیستر باید دارای حداقل مقدار 8 باشد.رجیستر کنترل برای تنظیم عملیات باس SPI استفاده می شود.به خاطر طبیعت ساده انتقال داده SPI و رنج گسترده واحدهای جانبی خارجی SPI ،کلاک SPI و خطود داده می توانند در چندین حالت مختلف تنظیم شوند.ابتدا قطبیت و فاز کلاک باید تعیین شوند قطبیت می تواند فعال در حالت بالا یا پایین باشد.همانطور که در شکل زیر نشان داده شده و فاز کلاک می تواند به صورت تنظیم در وسط یا لبه باشد.

2n0w2kvf4tl8oydnfyai.jpg

 

سرانجام جهت ارسال داده می توان به صورت انتقال بیت پرارزش در ابتدا یا انتقال بیت کم ارزش در ابتدا عمل کرد.

gonzuxreabx7hi7ssj6z.jpg

هر یک از این تنظیمات بیت مخصوص به خود را در رجیستر کنترل دارد و شما باید این بیتها را برای انطباق با وسیله ای که شما سعی در ارتباط با آن از طریق SPI دارید تنظیم کنید.هنگامیکه نرخ سرعت مقدار دهی شد و رجیستر کنترل نیز تنظیم شد ارتباط آغاز می شود.برای ارتباط با حافظه نشان داده شده بالا ابتدا باید پین GPIO را برای فعال کردن حافظه برای ارتباط ست کرد.سپس با نوشتن در رجیستر داده SPI یک بایت داده ارسال خواهد شد و با خواندن از رجیستر داده های رسیده از واحد جانبی خارجی جمع آوری می شود.فرمت اصلی استفاده شده در انتقال بستگی به قطعه SPI که شما قصد ارتباط با آن دارید را دارد.

 

 

 

 

 

 

 

 

به اشتراک گذاری این ارسال


لینک به ارسال

مبدل A/D موجود روی بعضی انواع LPC2000 یک مبدل 10 بیتی از نوع S.A و با زمان تبدیل 2.44 us یا 410Ksps می باشد.مبدل A/D دارای 4 یا 8 ورودی مولتی پلکس شده بسته به نوع قطعه می باشد.واسط برنامه ریزی برای مبدل A/D در شکل زیر نشان داده شده است.

z04lfz1gixm8kzleq10.jpg

رجیستر کنترل A/D تنظیمات مبدل و نحوه شروع تبدیل را تنظیم می کند.قدم اول در تنظیمات مبدل تنظیم کلاک A/D می باشد.همانند سایر واحد های جانبی دیگر کلاک A/D از تقسیم Pclk بر مقدار مقسم بدست می آید.مقدار Pclk باید بر مقداری تقسیم شود که حاصل برابر 4.5MHz باشد. این حداکثر مقدار ممکن است و اگر Pclk نتواند با تقسیم بر مقدار مقسم با این عدد برابر شود نزدیکترین مقدار کمتر از 4.5MHz که می تواند بدست آید انتخاب می شود.

p4uvy7imbiu0mugoasn5.jpg

بر مقدار ذخیره شده در رجیستر CLKDIV به اضافه یک تقسیم می شود بنابراین معادله محاسبه کلاک A/D به صورت زیر است: CLKDIV = (PCLK/adclk) - 1

با وجود قابلیت توقف کلاک مبدل A/D در رجیستر powerdown ظ واحد جانبی A/D این قابلیت را دارد که به طور کامل متوقف و خاموش شود. این رویه مصرف توان و نویز تولید شده به وسیله A/D را از بین می برد.در هنگام ریست A/D در مد خاموش می باشد و به محظ تعیین نرخ کلاک باید فعال شود.این کار به وسیله بیت PDN در رجیستر ADCR کنترل می شود.مقدار یک در این بیت مبدل را فعال می کند.برخلاف واحدهای دیگر مبدل A/D می تواند از پین خارجی هنگامیکه به عنوان GPIO تعریف شده باشد اندازه گیری کند.اگرچه با استفاده از بلوک انتخاب پین برای تبدیل پین خارجی به پین اختصاصی مبدل A/D دقت نهایی تبدیل افزایش خواهد یافت. قبل از انجام یک تبدیل تفکیک(رزولوشن)نتیجه به وسیله برنامه ریزی میدان CLKS تعیین میشود.A/D حداکثر دارای رزولوشن 10 بیت می باشد کهمی توان در هر رزولوشنی تا حد 3 بیت تنظیم شود.رزولوشن تبدیل برابر است با تعداد سیکل ساعت در هر تبدیل منهای یک.بنا براین برای یک تبدیل 10 بیتی A/D به 11 سیکل ADCLK و4 سیکل کلاک برای یک تبدیل 3 بیتی نیاز دارد.هنگامیکه شما رزولوشن را تنظیم می کنید یک تبدیل تولید می شود.A/D دارای دو مد تبدیل می باشد سخت افزاری و نرم افزاری.در مد سخت افزاری شما می توانید که تعدادی از کانالها را انتخاب و سپس A/D شروع به کار کند.در این مد یک تبدیل برای هر کانال انجام می شود تا اینکه تبدیل متوقف شود.در پایان نتیجه در داخل رجیستر داده A/D قرار می گیرد.

sydfp9js39uvzphalm8x.jpg

در پایان یک تبدیل بیت DONE ست می شود و ممکن است یک وقفه نیز تولید شود.نتیجه تبدیل در فیلد V/Vdda به عنوان نرخ ولتاژ انالوگ روی کانال تقسیم بر ولتاژ منبع تغذیه آنالوگ تنظیم می شود.نعداد کانالهای تبدیل های انجام شده نیز در کنار نتیجه ذخیره می شود.این مقدار در میدان CHN ذخیره می شود.سرانجام اگر نتیجه یک تبدیل قبل از نتیجه بعدی خوانده نشود منجر به نوشتن مجدد به وسیله نتیجه جدید و ست شدن بیت Overun می شود.مثال زیر روش استفاده از مبد A/D را در حالت سخت افزاری نشان می دهد.

6e2h4la6fycgoqfu9vc.jpg

A/D دارای مد دوم تبدیل به صورت نرم افزاری نیز می باشد.در این مد یک کانال برای شروع انتخاب می شود و با استفاده از بیت SEL تبدیل به وسیله نوشتن 0X01 در میدان START تحت کنترل نرم افزار شروع می شود. این کار باعث می شود که A/D یک تک تبدیل را انجام و نتیجه در رجیستر ADDR همانند حالت سخت افزاری ذخیره شود. انتها تبدیل به وسیله یک وقفه یا صفر شدن بیت DONE در رجیستر ADDR مشخص می شود.در مد نرم افزاری این امکان وجود دارد که تبدیل با یک انتطباق در تایمر صفر یا تایمر یک یا هنگامیکه یک لبه انتخاب شده روی P0.16 یا P0.22 دیده شود که می تواند بالا رونده یا پایین رونده باشد و با استفاده از بیت EDGE در رجیستر ADCR قابل کنترل است شروع شود.

cm13cms0r2983vzvhe1.jpg

ساده ترین راه استفاده از مبدل A/D در زیر نشان داده شده است.

hkw7yoilhc6tj4slv4i2.jpg

به اشتراک گذاری این ارسال


لینک به ارسال

سلام - خیلی مطلب خوبی بود - میتونی توضیح بدی چطور باید اسیلاتور داخلی که 4 مگ هست رو متوقف و اسلاتور خازجی که main oscillator نام داره برای میکرو فعال کرد. کلا یه مقدار در باره این منابع کلاک و تنظیماتشون میشه توضیح بدید... ممنون

به اشتراک گذاری این ارسال


لینک به ارسال
در در 25 آبان 1395 در 00:09، hiddenman گفته است :

سلام - خیلی مطلب خوبی بود - میتونی توضیح بدی چطور باید اسیلاتور داخلی که 4 مگ هست رو متوقف و اسلاتور خازجی که main oscillator نام داره برای میکرو فعال کرد. کلا یه مقدار در باره این منابع کلاک و تنظیماتشون میشه توضیح بدید... ممنون

برای میکروهای سری ST به راحتی میتوانید با نرم افزار STM32cubemx اینکار را انجام بدید برای میکروهای سری LPC هم میتوانید از ARMwizard استفاده کنید

به اشتراک گذاری این ارسال


لینک به ارسال

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • جدید...