ترفند قطعات الکترونیک میکروکنترلر AVR

افزایش پورت های خروجی میکروکنترلر AVR با استفاده از آیسی ۷۴HC595

نوشته شده توسط علی زاهدی

با توجه به بالا افزایش قیمت میکروکنترلر ها در چند ماه اخیر، استفاده از میکروکنترلر های ARM در برخی از پروژه ها دیگر امکان پذیر نیست. در حال حاضر در برخی از پروژه ها استفاده از میکروکنترلر های AVR صرفه اقتصادی بیشتری دارد. یکی از خانواده های میکروکنترلر های AVR که کارایی بالا و همچنین قیمت کمتری نسبت به میکروکنترلر های دیگر بازار دارند، خانواده ATtiny است. خانواده ATtiny (همچنین TinyAVR نیز شناخته می شود) زیر شاخه‌ای از میکروکنترلرهای ۸ بیتی AVR هستند. این خانواده معمولاً دارای ویژگی های کمتری نسبت به سایر تراشه های سری AVR هستند. ازجمله این ویژگی ها میتوان به پین های ورودی/خروجی کمتر، حافظه کمتر و امکانات جانبی مثل تایمر و پروتکل های ارتباطی کمتر  اولین اعضای این خانواده در سال ۱۹۹۹ توسط Atmel ساخته شد. در این آموزش قصد داریم تا به رفع مشکل کم بود پورت های خروجی در میکروکنترلر های AVR  با استفاده از آیسی ۷۴HC595 بپردازیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


مشکل میکروکنترلرهای ATtiny چیست؟


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

برای مثال پروژه ای را در نظر بگیرین که نیاز دارید تعداد بالایی LED را با استفاده از میکروکنترلر کنترل کنید. برای مثال تعداد LED هارا ۴۸ عدد در نظر بگیرید. از جمله میکروکنترلرهایی که میتواند این تعداد LED را کنترل کند، میتوان به ATmega64 و ATmega128 اشاره نمود که ۵۳ عدد IO دارد. با توجه به این که شما فقط قصد دارید تعداد مشخصی LED را کنترل کنید استفاده از چنین میکروکنترلری با قیمت بالا اصلا منطقی به نظر نمی‌رسد. حالا چطور می توانیم با هزینه ای بسیار کمتری این مشکل را حل کنیم؟ استفاده از شیفت رجیستر یکی از بهترین راه ها برای افزایش پورت های خروجی میکروکنترلر است. شیفت رجیستر ها عموما قیمت کمی دارند و محدودیتی برای افزایش خروجی میکروکنترلر ندارند. با اتصال چند شیفت رجیستر به یک دیگر میتواند هر تعداد خروجی که مد نظرتان است را داشته باشید.

 


شیفت رجیستر


شیفت رجیستر یا ثبات انتقال دهنده، زنجیره ای از فلیپ فلاپ ها است که خروجی فلیپ فلاپ اول به ورودی فیلپ فلاپ بعدی متصل شده و دارای یک کلاک واحد هستند. در نتیجه مدار به وجود خواهد آمد که آرایه ای از بیت های صفر و یک را در خود ذخیره کرده و با دریافت هر پالس ساعت این اطلاعات را به سمت راست یا چپ انتقال (شیفت) می‌دهد.

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

In-Depth: How 74HC595 Shift Register Works & Interface with Arduino

شیفت رجیستر ها از نظر ورودی و خروجی اغلب در دو دسته ورودی سری، خروجی موازی و ورودی موازی خروجی سری تقسیم بندی می‌شود. برای افزایش پورت های خروجی میکروکنترلری که تعداد GPIO های کمی دارد شیفت رجیستر نوع ورودی سری و خروجی مناسب است. برای مثال در ادامه با شیفت رجیستری آشنا می شویم که با استفاده از سه خط در ورودی میتواند ۸ خروجی و حتی خروجی های بیشتری را کنترل کنید. یکی از محبوب ترین شیفت رجیستر های موجود در بازار ایران شیفت رجیستر ۷۴HC595 است. با استفاده از این شیفت رجیستر می‌توانید، با سه خط در ورودی تعداد ۸ خروجی را کنترل کنید. با افزایش تعداد آیسی های ۷۴HC595 با استفاده از همان ۳ خط در ورودی هر تعداد خروجی که مد نظرتان باشد را کنترل کنید.

 


آیسی ۷۴HC595


آیسی ۷۴HC595 یک شیفت رجیستر ۸ بیتی از نوع ورودی سری و خروجی موازی است که همچنین از یک ثبات ذخیره کننده ۸ بیتی نوع D نیز بهره می‌برد. ثبات ذخیره دارای خروجیهای  موازی ۳ حالته است. ولتاژ کاری این شیفت رجیستر بین ۲ تا ۶ ولت است. پیش از این در آموزش راه اندازی آی سی شیفت رجیستر ۷۴HC595 با برد آردوینو Arduino با شبفت رجیستر و نحوه راه اندازی آن در بردهای آردوینو آشنا شده‌ایم.

74HC595

این تراشه به ما این اجازه را می دهد تا با استفاده از ۳ خط بر روی میکروکنترلر هر تعداد خروجی که مد نظرمان باشد را داشته باشیم. هر آیسی ۷۴HC595 میتواند ۸ خروجی در اختیار ما بگذارد. با اتصال چند عدد از این آیسی می‌توانیم تعداد خروجی ها را افزایش دهیم.

 


بررسی پایه‌های آیسی ۷۴HC595


پکیج DIP این شیفت رجیستر دارای ۱۶ پایه است که میتوانید ترتیب پایه های آن را در تصویر زیر مشاهده کنید. پایه های این شیفت رجیستر عبارتند از ؛

  • پایه GND و VCC به ترتیب برای تغذیه استفاده می‌شود. تغذیه پیشنهادی برای اتصال به این آیسی ولتاژ ۵ ولت است.
  • پایه SER(Serial Input) یا DS برای ارسال داده به صورت سریال به داخل شیفت رجیستر است. داده ای که بر روی این پایه قرار میگیرد (صفر یا یک منطقی) با هر پالس ساعت وارد شیفت رجیستر می‌شود.
  • پایه (SRCLK (Shift Register Clock یا SH_CP پایه کلاک شیفت رجیستر است و برای جابه جایی بیت در شیفت رجیستر بایستی لبه بالا رونده پالس مربعی روی این پایه قرار بگیرد. با دریافت هر لبه بالارونده از پالس مربعی داده های موجود در شیفت رجیستر یک بیت شیفت پیدا خواهند کرد.
  • پایه (RCLK (Register Clock/Latch یا ST_CP که پایه فعال ساز است. زمانیکه دیتا در یک منطقی است، محتوای شیفت رجیستر در رجیستر لچ ذخیره شده و همزمان در خروجی نمایش داده می‌شود. زمانی که این پایه لبه بالارونده ای دریافت کند داده هایی که در رجیستر لچ قرار گرفته است را در خروجی نمایش می‌دهد.
  • پایه SRCLR یا همان Shift Register Clear پایه تنظیم شیفت رجیستر است که تمامی پایه ها را صفر می‌کند. این پایه منطقی منفی است و برای ریست شدن ابتدا باید پین SRCLR غیرفعال شود. در صورتیکه ریست در مدار اتفاق نیفتد، این پایه بایستی فعال باشد.
  • پایه OE پایه Output Enable است. زمانی که این پایه در وضعیت HIGH قرار گیرد، خروجی ها از دسترس خارج خواهد شد. برای استفاده از خروجی ها این پایه را به زمین متصل می‌کنیم.
  • پایه QA – QH به ترتیب تصویر پایه های خروجی هستند. که داده هایی که بر روی پایه DS قرار بگیرد پس از ارسال پال ساعت به ترتیب بر روی این خروجی ها قرار خواهد گرفت.
  • پایه ‘QH خروجی سریال است. کاربرد این پایه زمانی است که قصد دارید تعداد بیشتری خروجی از شیفت رجیستر دریافت کنید. داده ای که بر روی این خروجی قرار میگیرد با QG برابر است. زمانی که این خروجی به پایه SER یا همان DS شیفت رجیست بعدی متصل شود (کلاک های هر دو رجیستر به یکدیگر متصل شده باشد) داده ها پس از خروج از شیفت رجیستر اول وارد شیفت رجیستر دوم خواهند شد.

 


آنشایی با نحوه عملکرد آیسی ۷۴HC595


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

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

پس از ورود به قسمت شبیه سازی نرم افزار پروتئوس وارد قسط اضافه کردن قطعات شوید. سپس نام شیفت رجیستر ۷۴HC595 را سرچ کنید. سپس بر روی آن دابل کلیک کنید تا به شماتیک شما اضافه شود.

 

در ادامه نیاز داریم تا با استفاده از قطعه ای در شبیه سازی پالس های منطقی صفر و یک را برای ورودی های آیسی ایجاد کنیم. بنا بر این در قسمت اضافه کردن قطعات به شماتیک این بار عبارت LOGICSTATE را سرچ کرده و با دابل کلیک به شماتیک اضافه می‌کنیم. این قطعه همانطور که گفته شد میتواند صفر و یک منطقی را بر روی ورودی های شیفت رجیستر ایجاد کند.

 

پس از اضافه کردن این قطعات، مدار زیر را در قسمت شبیه سازی پروتئوس ببندید.

 

پس از بستن مدار و Run کردن شبیه سازی پروتئوس نوبت به تست مدار می رسد. در ابتدا تمامی خروجی ها در حالت LOW یا صفر منطقی قرار دارند. برای تست می‌توانید مراحل زیر را طی کنید.

  1.  LOGICSTATE متصل به پایه Ds را بر روی وضعیت HIGH یا ۱ قرار دهید. برای این کار کافیست یک بار روی آن کلیک کنید تا وضعیت آن تغیر پیدا کند.
  2. سپس ۲ بار بر روی LOGICSTATE متصل به پایه SH_CP کلیک کنید. این عمل باعث میشود تا یک پالس مربعی بر روی این پایه ایجاد شود.
  3. دوباره بر روی LOGICSTATE متصل به پایه Ds کلیک کنید، تا  در وضعیت LOW یا صفر منطقی قرار بگیرد.
  4. سپس دوباره ۲ بار بر روی LOGICSTATE متصل به پایه SH_CP کلیک کنید.
  5. حال اگر ۲ بار بر روی LOGICSTATE به پایه ST_CP کلیک کنید. مشاهده می‌کنید. که خروجی Q0 شیفت رجیستر در وضعیت HIGH قرار گرفته است.

با تکرار مراحل ۴ و ۵ می‌توانید، بیت ۱ قرار گرفته در خروجی اول را به خروجی های بعدی انتقال دهید. در صورتی که قصد دارید تعداد بیشتری شیفت رجیستر به یک دیگر متصل کنید از مدار زیر استفاده کنید. همان طور که بالا تر گفته شد داده ها پس از خروجی از شیفت رجیستر اول بیت به بیت وارد شیفت رجیستر دوم خواهند شد. این تریتب تا هر تعداد شیفت رجیستر که مطابق مدار زیر به یکدیگر متصل شوند، ادامه خواهد داشت.

 


اتصالات پروژه


حال که با شیفت رجیستر ۷۴HC595 آشنایی کافی را پیدا کردیم. میتوانیم آن را به میکروکنترلر متصل کنیم و با استفاده از آن تعداد خروجی های میکروکنترلر را افزایش دهیم. در این آموزش ما برای افزایش ۱۶ عدد خروجی به میکروکنترلر از ۲ آیسی ۷۴HC595 استفاده می‌کنم که همانند تصویر زیر به یکدیگر و میکروکنترلر متصل می‌شود.

 

در شماتیک بالا اتصالات به صورت زیر است؛

  • پایه های شماره ۸ هر دو شیفت رجیستر و همچنین پایه شماره ۴ میکروکنترلر به زمین متصل شده است.
  • پایه شماره ۱۰ هر دو  شیفت رجیستر به قطب مثبت تغذیه ۵ ولت وصل شده است.
  • پایه شماره ۱۱ هر دو  شیفت رجیستر به یکدیگر متصل شده و به پایه شماره ۵ میکروکنترلر متصل شده است.
  • پایه شماره ۱۲ هر دو  شیفت رجیستر به یکدیگر متصل شده و به پایه شماره ۷ میکروکنترلر متصل شده است.
  • پایه شماره ۱۳ هر دو  شیفت رجیستر زمین متصل شده است.
  • پایه شماره ۱۴ شیفت رجیستر دوم به پایه شماره ۹ شیفت رجیستر اول متصل شده است.
  • پایه شماره ۱۴ شیفت رجیستر اول به پایه شماره ۶ میکروکنترلر متصل شده است.
  • پایه شماره ۱۶ هر دو شیفت رجیستر و همچنین پایه شماره ۸ میکروکنترلر به قطب مثبت تغذیه ۵ ولت وصل شده است.
  • بر روی هر یک از خروجی های شیفت رجیستر اول و دوم یک LED با مقاومت ۳۳۰ اهم قرار گرفته است.

 


کدنویسی پروژه


برای کدنویسی بر روی میکروکنترلر های AVR از کامپایلر های مختلفی می‌توانید استفاده کنید. در این آموزش ما برای کد نویسی بر روی این میکروکنترلرها کامپایلر کدویژن را انتخاب کردیم. برای شروع کدنویسی در این نرم‌ افزار ابتدا بایستی پروژه جدید داخل این نرم افزار ساخته و میکروکنترلر مورد نظر خود را انتخاب کنید. در صورتی که آشنایی کافی با این نرم افزار را ندارید به آموزش نحوه ی ساخت پروژه جدید و پروگرام کردن میکروکنترلر مراجعه کنید.

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

 

در ادامه بایستی خروجی های میکروکنترلر که پایه های شیفت رجیستر به آن متصل است را در ابتدای تابع main به عنوان خروجی تعریف کنیم.

 

حال می‌توانیم مراحلی که بالا تر گفته شد را ر قالب کدنویسی در زبان C درآورده و داخل کد بنویسیم. ما قصد داریم تا کدی بنویسیم که یک منطقی را در خروجی اول قرار داده و سپس این یک را با تاخیر ۵۰۰ میلی ثانیه شیفت داده تا به خروجی آخر رسیده و از آن خارج شده و دوباره از خروجی اول شروع کند.

 

اگر کد بالا را بر روی میکروکنترلر پروگرام کنید. و شیفت رجیستر ها را مطابق تصوریری که در بخش اتصالات قرار داشت متصل کنید. LED ها به ترتیب روشن خواهند شد. عملکرد کد بالا یه این صورت است که ابتدا پایه های شیفت رجیستر که به PORTB میکروکنترلر متصل است را به عنوان خروجی تعریف کرده و سپس داخل حلقه while(1) ابتدا عدد یک را بر روی پایه Ds شیفت رجیستر قرار داده و در ادامه یک حلقه for با شرط تکرار ۱۶ بار قرار داده شده است. داخل این حلقه ابتدا پایه مربوط به کلاک شیفت رجیستر برابر ۱ قرار گرفته و پایه مربوط به کلاک ثبات ذخیره بر خلاف آن برابر ۱ قرار گرفته است. پس از گذشت ۱۰ میلی ثانیه مقداری که بر روی هر کدام پایه ها قرار گرفته است بلعکس می شود. با انجام این کار یک پالس ۱۰ میلی ثانیه ای با اختلاف ۱۸۰ درجه نسبت به یک دیگر بر روی پایه های نامبرده قرار می‌گیرد. این عملیات باعث می شود عدد یک قرار گرفته وارد شیفت رجیستر شده و در خروجی اول قرار بگیرد.

در ادامه به دلیل این که ما قصد داشتیم همیشه یکی از خروجی ها فعال باشد عدد یک قرار گرفته بر روی پایه Ds را به صفر تغبیر می‌دهیم. در ادامه مراحلی که گفته شد ۱۶ بار تکرار می‌شود. و پس از تمام شدن حلقه for تمامی مراحل از سر گرفته خواهد شد. اما کد بالا کمی گیج کننده است و فهم آن در کد های طولانی بسیار سخت خواهد شد. برای فهم ساده تر این بخش کد بهتر است بخشی که عملیات شیفت را انجام می دهد داخل تابع جداگانه ای قرار بگیرد.

 

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

  1. تابع اول برای قرار دادن وضعیت تمام خروجی ها در حالت LOW است. در این تابع بر روی پایه Ds شیفت رجیستر صفر قرار گرفته و بر روی پایه کلاک شیفت رجیستر ۱۶ پالس ساعت ایجاد می شود تا این عدد صفر بر روی تمام خروجی ها قرار بگیرد.
  2. اما تابع دوم وضعیت خروجی که شماره آن در قسمت ورودی تابع قرار گرفته است را در حالت HIGH  قرار می دهد. این تابع پس از فراخوانی ابتدا تمام خروجی هارا با استفاده از تابع Clear_all_bits برابر صفر قرار داده و سپس یک یک را بر روی پایه Ds قرار داده و یک بار شیفت میدهد. سپس Ds را برابر صفر قرار داده و به تعداد عددی که در ورودی تابع قرار داده شده است آن را شیفت می‌دهد. در آخر خروجی مورد نظر برابر یک خواهد شد. میتوانید از این توابع در کد خود برای کنترل خروجی ها استفاده کنید.
 

کد بالا همان مثال قبلی اما با استفاده از توابع معرفی شده است. اگر به کد بالا نگاهی بیاندازید. متوجه خواهید شد که چقدر کد ساده تر و قابلیت فهم بیشتری نسبت به مثال قبلی دارد. در کد بالا تابع Set_bit که بالا تر به توضیح آن پرداختیم استفاده شده است. این تابع داخل یک حلقه for با تعداد تکرار ۱۶ بار قرار گرفته شده است. که این عمل باعث می شود خروجی ها به تریتب روشن شده و خروجی های قبلی خاموش شود.

توجه داشته باشید که در این آموزش از میکروکنترلر ATtiny 13 استفاده شده است. اما کد های موجود در این آموزش برای تمامی میکروکنترلر های AVR قابل استفاده است.

 


جمع بندی


در این آموزش با ابتدا با میکروکنترلر های ATtiny که از خانواده های ارزان قیمت و با امکانات کمتر میکروکنترلر های AVR هستند آشنا شدیم. اما این میکروکنترلرها عموما دارای پایه های ورودی و خروجی (GPIO) کمی هستند. و این مورد در مدار هایی که نیاز به تعداد خروجی های بیشتری داشته باشند کمی مشکل ساز خواهد بود. در ادامه با راه حل این مشکل آشنا شدیم که یکی از بهترین راه حل ها برای رفع این مشکل استفاده از شیفت رجیستر ها است.

 

شیفت رجیستر ذنجیره ای از فلیپ فلاپ ها به علاوه ثبات ذخیره کننده هستند که دارای یک پالس ساعت مشترکی هستند. این المان میتواند دیتا را به صورت سریال دریافت کرده و به صورت موازی در خروجی تحویل دهد و یا بلعکس عمل کند. آیسی ۷۴HC595 شیفت رجیستری است که ما برای افزایش پورت های خروجی میکروکنترلر انتخاب کرده‌ایم. در ادامه با این آیسی آشنا شده و پایه ها و نحوه عملکرد آن را مورد بررسی قرار دادیم. در ادامه با نحوه تست این آیسی در نرم افزار پروتئوس آشنا شدیم. و در آخر به پروژه اتصال دو شیفت رجیستر به میکروکنترلر AVR و کدنویسی آن پرداخیتیم.

 


لوازم مورد نیاز


لیست قطعات و لوازمی که برای اجرای این آموزش نیاز دارید، در زیر قرار داده شده است.

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۲ دیدگاه