خانه > آموزش > اتصال LED به LPC1768

اتصال LED به LPC1768

در این مطلب می ­خواهیم یک LED که به یکی از پایه ­های LPC1768  (برای مثال پایه 29 از پورت1) متصل شده است را به صورت متناوب روشن و خاموش نماییم. این مثال را به چند روش برنامه ­نویسی کرده تا در خلال آن با کارکردهای رجیسترهای مختلف و نحوه دسترسی به آن­ها آشنا شویم.

اگر با رجیسترهای GPIO آشنایی ندارید بخوانید: کار با رجیسترهای ورودی خروجی همه منظوره(GPIO) در LPC1768


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

connecting LED to LPC1768

اما قبل از هر چیز لازم است تا با مفهوم دستکاری بیتی در زبان C آشنا شویم.

دستکاری بیتی در زبانC

گاهی در برنامه نویسی به زبان C لازم است که یک یا چند بیت از یک رجیستر را- بدون تغییر سایر بیت­ها – صفر یا یک  نماییم. به این کار دستکاری بیتی یک رجیستر می­ گویند. دستکاری بیتی خود به دو نوع است: 1- یک کردن بیت­های خاصی از یک رجیستر 2- صفر کردن بیت­های خاصی از یک رجیستر

1- یک کردن بیت­های خاصی از یک رجیستر

برای مثال در همین برنامه لازم است که پایه 29 از پورت 1 را به عنوان خروجی تعریف نماییم:

دستور فوق همه 32 پایه از پورت 1 را به عنوان خروجی تعریف می­کند. اما اگر نخواهیم همه پایه­های را خروجی تعریف کنیم چه کاری باید انجام دهیم؟ روش دیگر دستور زیر است:

اما بازهم این مشکل وجود دارد که بقیه پایه­ های به صورت ورودی پیکربندی می­ شوند. اما روش اصولی و درست این است که فقط پایه 29 را به عنوان خروجی تعریف کرده و بقیه بیت­ها را دستکاری نکنیم. دستور زیر این کار را انجام ­می­ دهد:

در دستور فوق رجیستر FIODIR را با مقدار “0x20000000” یای (OR) بیتی می­کنیم و نتیجه را در همان رجیستر قرار می­دهیم. نتیجه این می­شود که بیت­هایی که با صفر OR می­ شوند تغییری نمی­ کنند اما بیت­هایی که با 1 OR می ­شوند 1 می­ شوند. در شکل زیر مقدار رجیستر FIODIR قبل و بعد از این دستور نمایش داده شده است:

bit manipulation

مقدار نتیجه در نهایت در داخل رجیستر FIODIR قرار می­گیرد. مقادیر x می­توانند 0 یا 1 باشد. اما چیزی که مشخص است این است که به جز بیت 29 بقیه بیت­ ها ثابت می­ مانند.

عبارت فوق را می­توان در زبان C به صورت معادل و ساده ­تر زیر هم نوشت:

که همان عبارت قبلی به صورت فشرده می­ باشد.

در برنامه­ نویسی برای میکروکنترلر برای دستکاری یک یا چند بیت از یک رجیستر از منطق فوق استفاده می­ کنند. اما سبک نوشتن کمی متفاوت(و قابل فهم ­تر) می­ باشد. به مثال زیر توجه کنید.

مثال: با یک دستور بیت­های 0، 2، 14 و 21 از رجیستر FIODIR  پورت 1 را یک منطقی کنید(بیت­ های دیگر بدون تغییر بمانند).

روش اول: مانند قبل ابتدا به صورت باینری بیت­های رجیستر را بدست می ­آوریم:

register in binary

LPC1768 یک میکروکنترلر 32 بیتی است و تعداد بیت­های رجیسترهای آن 32 تاست. بنابراین نوشتن مقادیر رجیسترها به صورت باینری مرسوم نیست. معمولا مقادیر را به صورت هگزادسیمال می­ نویسند. بنابراین مقدار فوق را به هگزادسیمال تبدیل می­ کنیم: 0x00204005

سپس این مقدار را با FIODIR یای منطقی می­کنیم:

روش دوم: بدیهی است که پیدا کردن تعدادی بیت در 32 بیت و تبدیل یک مقدار 32 بیتی باینری به هگز کار وقت­ گیری است. مضافا به این که مثلا اگر در برنامه ­ای به مقدار 0x00204005  برخورد کنیم کار ساده­ ای(حداقل با یک نگاه!) نیست که بفهمیم کدام بیت­ها 1 شده­ اند. اما با استفاده از عملگر منطقی شیفت می­ توان این مسئله را راحت ­تر حل کرد.

اپراتور شیفت به راست “<<” یک عدد باینری را به تعداد دلخواه به راست و  اپراتور شیفت به چپ “>>” یک عدد باینری را به تعداد دلخواه به چپ انتقال می­دهد. مثلا  عبارت 5>>2 یعنی 2 باینری (10) را 5 واحد به چپ شیفت بدهیم که می­شود:1000000 .  همچنین عبارت 3<<24 یعنی 24 باینری(11000) را سه واحد به راست شیفت دهیم که می­شود:11 . باید دقت نمود که در هنگام شیفت به چپ یا راست از طرف مقابل صفر وارد می­ شود. حال اگر عدد 1 را به تعداد مشخص شیفت به چپ بدهیم چه اتفاقی می­افتد. برای مثال 2>>1 می­شود 100 یا 14>>1 می­ شود 100000000000000 .  حال به استفاده از عملگر OR و شیفت به چپ میتوان عبارت 0x00204005 را به صورت زیر نوشت:

بنابراین حل مثال به صورت زیر خواهد بود:

شاید در نوشتار روش دوم طولانی ­تر به نظر برسد اما باید توجه کرد که دیگر نیاز به به دست آوردن باینری و تبدیل به هگزادسیمال نمی­ باشد و همچنین با یک نگاه به این خط از برنامه می ­توان فهمید که کدام یک از بیت ها یک شده­ اند.

2- صفر کردن بیت­هایی خاص از یک رجیستر

برای مثال فرض کنید می­ خواهیم بیت 29 از رجیستر FIOPIN پورت 1 را بدون اینکه محتویات سایر بیت­ ها تغییر کنند صفر کنیم. برای این کار از عملگر ~(نقیض) و &(AND) استفاده می­کنیم عبارت زیر این کار را انجام می­دهد:

1<<29 یک عدد باینری 32 بیتی است که همه بیت­های آن به جز بیت 29ام صفر است. بنابراین با استفاده از عملگر نقیض، (29>>1)~ یک عدد 32 بیتی است که همه بیت­ های آن به جز بیت 29 یک هستند. حال وقتی رجیستر FIOPIN را با آن AND می­کنیم طبیعی است که همه بیت­ها که با یک AND می­شوند تغییری نمی ­کنند به جز بیت 29 که با صفر AND شده و صفر می­شود. حال برای مثال اگر بخواهیم بیت­های 3 و 10 و 24 را صفر کنیم به صورت زیر عمل می­ کنیم:

خوب تا اینجا با مفهوم دستکاری بیتی آشنا شدیم. حال با استفاده از این مفهوم مثال خاموش و روشن کردن LED را به سه روش حل می کنیم.
روش اول:

در این روش با استفاده از رجیستر FIOSET پایه مورد نظر را یک منطقی کرده و با استفاده از رجیستر FIOCLR آن را صفر منطقی می کنیم.
روش دوم: در این روش با استفاده از رجیستر FIOPIN پایه مورد نظر را هم یک و هم صفر منطقی می نماییم.

روش سوم: این روش را صرفا برای آشنایی با کارکرد رجیستر FIOMASK به کار می بریم. به این صورت که تمام بیت های این رجیستر به جز بیت 29 را صفر کرده تا فقط نوشتن بر روی این بیت در رجیستر FIOPIN تاثیرگذار باشد. سپس بر روی تمام بیت های رجیستر FIOPIN متناوبا صفر و یک می نویسیم.

۴ دیدگاه

  1. در هایی از علم را برآیمان گشودی.
    پروردگار در هایی از علم را برایتان بگشاید.

  2. سلام به همه مهندسین
    سوالی که داشتم اینه که تا چندتا led رو میتونه ساپورت کنه؟
    و سوال دومم رو ببخشید که شاید احمقانه بنظر برسه ولی اینه که اگه بخواهیم رنگ led رو عوض کنیم چکار باید کرد؟!!!

    • با سلام.
      با استفاده از روش هایی میشه تعداد LED ها رو زیاد کرد. مثل استفاده از دیمالتی پلکسر و یا شیفت رجیستر و غیره.
      برای تغییر رنگ هم باید از LED های RGB استفاده کنید و با تکنیک PWM رنگ اونها رو عوض کنید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *