روش خلاقانه برای افزایش پورت میکروکنترلر

روش خلاقانه برای افزایش پورت میکروکنترلر

روش خلاقانه برای افزایش پورت میکروکنترلر
روش خلاقانه برای افزایش پورت میکروکنترلر

روش خلاقانه برای افزایش پورت میکروکنترلر تنها با یک بیت

ممکن است برای شما هم پیش آمده باشد که به دلیل محدودیت پایه‌های میکروکنترلر مجبور شده باشید که میکروکنترلر را عوض کنید و از میکروکنترلری با تعداد پایه‌های بیشتر استفاده کنید. برای افزایش تعداد پورت‌های میکروکنترلر، راه‌های زیادی وجود دارد؛ یکی از این راه‌ها استفاده از لچ(latch)  است. اما لچ‌ها هم خارج از اشکال نیستند. مشکل اساسی آن‌ها پیچیدگی سیم‌کشی‌شان است.

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

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

ساختار شیفت رجیستر

آی‌سی محبوب 74Hc595  یکی از آی‌سی های پراستفاده برای افزایش پورت‌های میکروکنترلر است. این آی‌سی درواقع یک شیفت رجیستر به همراه یک لچ است. با استفاده از آی‌سی 74Hc595  به‌راحتی و با کم‌ترین سیم‌کشی ممکن، شما خواهید توانست پورت‌های میکروکنترلر خود را افزایش دهید.

همان‌طور که در عکس فوق مشاهده می‌کنید برای گسترش پورت از طریق 74Hc595  شما فقط نیاز به 3 پایه از میکروکنترلر دارید، یک پایه جهت کلاک، یک پایه جهت دیتا و پایه آخر هم برای لود کردن داده ارسال‌شده در خروجی. مطابق نمودار زیر:

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

افزایش پورت تنها با یک پایه!

حال فرض کنید بعد از طراحی، تنها یک پایه از میکروکنترلر آزاد مانده و قصد دارید یک LCD یا Seven Segment  به مدار خود اضافه کنید. ظاهراً تنها راه موجود تعویض میکروکنترلر است! اما آیا واقعاً راهی است که با استفاده از یک پایه، یک LCD را راه‌اندازی کنیم؟

 

در جواب باید بگویم: بله، همیشه راهی هست! این بار راه‌حل پیچیده نیست و خیلی ساده خواهد بود، برای این کار ما از همان آیسی 74HC595  کمک خواهیم گرفت؛ ولی به شیوه‌ای که بتوانیم با استفاده از یک خط داده، سه سیگنال کنترلی را ایجاد نماییم.

اصول کار خیلی ساده است: ما با قرار دادن یک RC در مسیر داده، سعی می‌کنیم که سیگنال DAT نسبت به CLK دارای یک شیفت زمانی باشد. همان‌گونه که در تصویر فوق مشاده می‌کنید برای اعمال صفر بر روی سیگنال DAT باید با توجه به مقادیر RC استفاده‌شده، سیگنال ورودی مدت‌زمان مناسبی صفر باقی بماند. در غیر این صورت مقدار یک ثبت خواهد شد.

ولی هنوز یک مشکل دیگر وجود دارد: تولید سیگنال Latch.  برای ظاهر شدن داده‌های شیفت داده‌شده در خروجی، باید پایه Latch نیز تحریک شود، برای این منظور نیز از همین تکنیک استفاده می‌کنیم؛ با این تفاوت که RC استفاده‌شده باید زمان متفاوتی نسبت به DAT داشته باشد.

برای جلوگیری از رخ دادن خطا، سعی می‌کنیم که زمان‌های RC تا جای ممکن از هم فاصله داشته باشند. به همین منظور، مقاومت Latch را بیست برابر مقاومت DAT انتخاب می‌کنیم و مقدار خازن‌ها را برابر در نظر می‌گیریم.

 

محاسبه مقادیر RC

آیسی 74HC595  قادر است تا فرکانس 20 مگاهرتز کلاک را تحمل کند. اما محدودیت ما به لحاظ وجود فیلتر پایین گذر (RC) موجود در مدار است. بنابراین سعی می‌کنیم که مقادیر انتخاب‌شده به نحوی باشند که مدار برای طیف وسیعی از میکروکنترلرها قابل‌استفاده باشد. مقدار خازن را ثابت و مساوی 2.2 نانوفارد، ورودی DAT مقاومت را مساوی 1.5 کیلو و ورودی  Latch را بافاصله 20 برابر و مقدار 33 کیلواهم در نظر می‌گیریم.

 


با مقادیر فوق در بدترین حالت، ارسال هر بایت داده 545 میکروثانیه طول خواهد کشید که برای ایجاد نرخ تقریباً 2 کیلوهرتز از داده مناسب خواهد بود.

بدین ترتیب به‌راحتی می‌توان Seven Segment یا LCD یا LED را فقط با استفاده از یک خط داده وصل کرد.

سورس کد

 

تابع Shift_WriteByte یک بایت از طریق یک خط داده منتقل خواهد کرد. دقت داشته باشید قبل از فراخوانی آن حتما یک بار تابع Shift_Init را جهت پیکربندی پورت فراخوانی کرده باشید. مطابق کد زیر:

 

خروجی برنامه :

 

 


 

حمایت از Zeus ‌

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

Zeus ‌
Zeus ‌

زئوس هستم ساکن المپ

دیدگاه ها

45 دیدگاه

  • narges
    ۱۰ آبان ۱۴۰۰

    با سلام و عرض ادب
    برای متصل کردن lcd باید از سه پین از میکرو استفاده بشه؟
    و اینکه استفاده از کد بالا برای lcd کافیه؟

    • Zeus ‌
      Zeus
      ۱۴ آبان ۱۴۰۰

      سلام خیلی بستگی به نوع نمایشگر شما خواهد داشت این مساله
      اگر فرض کنیم شما قراره از نمایشگر کارکتری استفاده کنید برد هایی هستند که از طریق i2c میتونن این کار رو انجام بدن که نیاز به دو پایه دارن
      البته از این مدار هم میتونید استفاده کنید که تنها به یک پایه دیتا نیاز دارید

  • رامین
    ۲۰ مهر ۱۴۰۰

    ببخشید چطور میشه 750تا سنسور نوری که کارشون تشخیص قطع و وصل هست را راه اندازی کرد البته با avr

    • Zeus ‌
      Zeus
      ۲۴ مهر ۱۴۰۰

      احتمالا بهترین راه شیفت رجیستر هست یا مثلا استفاده از CPLD

  • saeed
    ۷ مهر ۱۴۰۰

    سلام عرض ادب
    مهندس ممنون از مقالات مفیدتون
    میخواستم بدونم اگه بخوایم 74HC595 رو با STM32 راه اندازی کنیم میشه اینکار رو با SPI با مد ONLY TRANSMITTER انجام داد؟

    • Sisoog Os
      Sisoog Os
      ۸ مهر ۱۴۰۰

      سلام
      برای راه اندازی این لچ شما صرفا ارسال اطلاعات دارید و میتونید با همون مد هم راهش بندازید

  • بابک
    ۲۰ شهریور ۱۴۰۰

    با سلام
    ممنون از آموزش های شما

    ببخشید خروجی ها از چه نوعی هستند؟ دیجیتال ، آنالوگ ، PWM ؟

    سپاس از توجه شما

    ارادت

    • Sisoog Os
      Sisoog Os
      ۲۰ شهریور ۱۴۰۰

      سلام دیجیتال هستند

  • سید محسن
    ۱۶ شهریور ۱۳۹۹

    سلام.برای اتصال چند تا 74595 به این روش چطور میشه کار کرد.سرعت زیاد برامون مهم نیست.لطفا جواب بدید.

    • Zeus ‌
      زئوس Zeus
      ۱۸ شهریور ۱۳۹۹

      بله شدنش میشه ولی پیشنهاد نمیکنم از این روش استفاده کنید مخصوصا توی محصول چون به شدت خطا پذیره
      اگر میخواید از یک رشته سیم برای انتقال دیتا استفاده کنید بهترین راه استفاده از پروتکل 1wire هست

  • سید محسن
    ۱۴ شهریور ۱۳۹۹

    بعد برای وصل کردن چند تا 595 به هم هم میشه به همین شکل عمل کرد؟یعنی خروجی سریال اولین 595 رو به ورودی کلاک بعدی بدیم و همین مدار RC رو اونجا هم به همین شکل پیاده کنیم.؟درست گفتم.؟

    • Zeus ‌
      زئوس Zeus
      ۱۸ شهریور ۱۳۹۹

      بله میشه – ولی همونطور که قبلا هم پیشنهاد دادم بهتره از 1wire استفاده کنید چون اعتبار سنجی دیتا توش وجود داره و قابل اطمینان هست

  • سید محسن
    ۱۴ شهریور ۱۳۹۹

    سلام.مطلب خوبی بود.فقط از برنامه یه جاهایی رو نفهمیدم.میشه یک توضیحی درباره برنامه بدید.که
    Shift_DDR DDRD
    Shift_PORT PORTD
    define Shift_Pin
    چی هستن و برنامه چطور کار میکنه.
    من زیاد از آردینو سر درنمیارم.کلیت مطلبو گرفتم.

    • Zeus ‌
      زئوس Zeus
      ۱۸ شهریور ۱۳۹۹

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

  • oni
    ۱۶ خرداد ۱۳۹۹

    عالی

  • حمید
    ۲۸ فروردین ۱۳۹۹

    سلام آقای مهندس
    بفرمایید برای راه اندازی lcd های کارکتری 192×64 و یا lcd های رنگی 2.4 اینچی هم میشه از این آی سی ها استفاده کرد؟
    اگر بله بهترین ماژول و یا آی سی را معرفی بفرمایید.
    با تشکر

    • Zeus ‌
      زئوس Zeus
      ۳۰ فروردین ۱۳۹۹

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

      • حمید
        ۳۰ فروردین ۱۳۹۹

        سلام علیکم بزرگوار
        قبول. اما برای اینکه تعداد پینهای اشغالی روی آردینو را به حداقل برسانیم راه کار چیه؟
        نمایشگرهای کاراکتری که 16 پین دارند یک مبدل i2c دارن. اما برای گرافیکی ها که 20 پین دارند این ماژول در بازار نیست.
        میدونم آی سی MCP23017 و MCP23s17 برای اینکار است.
        http://thecaferobot.com/store/i2c-interface-16-channel-io-expansion-module
        راه کار پیشنهای شما چیست؟
        خیلی ممنون

        • Zeus ‌
          زئوس Zeus
          ۱ اردیبهشت ۱۳۹۹

          سلام
          خوب برای این کار راه های مختلفی وجود داره
          اول استفاده از lcd هایی که رابط سریال رو پشتیبانی میکنند مثل ST7567 که یه کنترلر lcd گرافیکی هست هم زمان هم پرالل و هم سریال رو پشتیبانی میکنه و توی بازار ایران هم موجود هست.
          راه دوم استفاده از همین مدل آیسی هایی که خودتون مثال زدید
          راه سوم استفاده از شیفت رجیستر مثل 74595 که دیتای سریال بدید و موازی بگیرد – البته مثل مدار این پست استفاده نکنید و پایه های اچ و دیتا رو مستقیم به میکرو وصل کنید اینطور تا فرکانس ۲۰ مگاهرتز به راحتی میتونید بالا برید.
          و راه های دیگه از این دست

          • حمید
            ۱ اردیبهشت ۱۳۹۹

            و علیکم سلام
            یعنی اگه فرکانس را بالا ببریم دیگه مشکل سرعت انتقال داده نخواهیم داشت؟
            دوم درصورت استفاده از 74595 کتابخوانه معمول برای نمایشگر های مختلف قابل استفاده هست؟ و یا باید کتابخوانه بنویسیم؟
            انشاء الله عاقبت بخیر شوید.

            0
          • Zeus ‌
            زئوس Zeus
            ۱۳ اردیبهشت ۱۳۹۹

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

            0
  • محمدحسن صادقی
    ۷ فروردین ۱۳۹۹

    کد ها مال چه ide هستند
    اردوینو؟؟

    • Zeus ‌
      زئوس Zeus
      ۹ فروردین ۱۳۹۹

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

  • خوش خرام
    ۱۸ دی ۱۳۹۸

    ممنون مطلب جالبی بود

  • محمدحسین
    ۱۵ اسفند ۱۳۹۷

    سلام مطلب خوبی بود ولی برای این کار تویه کتاب میکروکنترلرهای 8051 دکتر مزیدی یک تراشه از اینتل به نام 8255 معرفی شده است. حتی میشه چندتا از این ها رو به سیستم میکرو وصل کرد و برای راحتی کار سرویس وقفه هم دارد که کار کنترل رو خیلی راحت می کنه

    • Zeus ‌
      زئوس Zeus
      ۲۱ اسفند ۱۳۹۷

      بله درست می فرمایید ؛ البته خیلی راه های دیگه هم هست ؛ اما دقت کنید این راه تنها نیاز به یک پایه داره ! در صورتی که برای باقیه راه ها چنین چیزی نیست

  • سعید
    ۱۳ آبان ۱۳۹۷

    ممنون از مطالب ارزشمندتون
    آی سی 74hc595 یه مشکل داره و اونم میزان کم جریان دهی هر پین(6ma) و کل جریانی که میشه از آی سی کشید(35ma) هست.
    لطفا اگر مقدور هست یه آی سی شیفت رجیستر با توان بالاتر برای درایو کردن led معرفی کنید.
    با تشکر

    • Zeus ‌
      زئوس Zeus
      ۱۳ آبان ۱۳۹۷

      سلام و درود – بله کاملا درسته ، البته همونطور که اطلاع دارید آیسی 595 آیسی مناسبی برای درایو LED نیست چون محدود کننده جریان روی خروجی ها نداره پس به همین دلیل ممکنه یا خودش یا LED آسیب ببینه !
      برای همین توصیه میکنم برای این کار از آیسی DM135 یا امثال اون استفاده کنید ، این دست آیسی ها دقیقا برای راه اندازی LED در تابلو های LED ساخته شده اند. اگر بخوام قابلیت هاشون رو بگم
      اول این که خروجی 16 بیتی
      دوم کنترل جریان برای هر خروجی (قابل تنظیم به صورت گروهی)
      سوم تشخیص سوختگی LED و گزارش به هاست
      توی پنلی که با استفاده از این آیسی ساخته شد ، بعد از گذشت 6 سال هیچ LED سوخته ای مشاهده نشده.

      • سعید
        ۱۸ آبان ۱۳۹۷

        ممنون از پاسختون
        این شرکت آی سی 32 بیتی نداره.
        اگر مقدور هست 32 بیتی معرفی کنید.
        من خودم این آی سی رو پیدا کردم که با 3.3v هم کار میکنه.
        R8A66162SP
        ممنون

        • Zeus ‌
          زئوس Zeus
          ۱۹ آبان ۱۳۹۷

          خواهش میکنم
          والا ؛ 32 بیت تعداد زیادی هست و فکر میکنم موقع سیم کشی به مشکل بر بخورید مگر این که بخواید RGB کار کنید که هر پیکسل 3 بیت رو مشغول کنه !
          خوبه آیسی که پیدا کردید ولی جریانش قابل تنظیم نیست و البته گزارش پیکسل های سوخته رو هم ظاهرا نداره

    • خوش خرام
      ۱۸ دی ۱۳۹۸

      سلام من تو کاتالوگ ندیدم که 6ma برای هر پایه باشه چیزی که من میبینم اینه:
      Iout DC Output Current, per Pin ±35 mA

  • احمد
    ۲۳ مهر ۱۳۹۷

    سلام اصطلاح یا تعریف گسترش طول کلمه یا گسترش طول ادرس رو خیلی شنیدم ولی هرچی سرچ کردم نفهمیدم میتونید کمک کنید مرسی .

    • Zeus ‌
      زئوس Zeus
      ۲۳ مهر ۱۳۹۷

      ببخشید سوالتون رو متوجه نمیشم ، امکان داره توضیح بیشتری بدید ؟!

      • احمد
        ۲۳ مهر ۱۳۹۷

        در ادامه توضیحات درس میکروکنترلر ها همیشه حرفی از گسترش طول کلمه و گسترش طول ادرس میزنن حالا این راجب میکروکنترلر هست یا چیز دیگه ایی که از اجزای تشکیل دهندش نمیدونم ?

        • Zeus ‌
          زئوس Zeus
          ۲۷ مهر ۱۳۹۷

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

      • محمد
        ۲۳ مهر ۱۳۹۷

        spread address length va
        word length
        منظورش اینهاست

        • Zeus ‌
          زئوس Zeus
          ۲۷ مهر ۱۳۹۷

          امم – خوب این کلمات خیلی معنی میتونه داشته باشه !
          پاراگرافی چیزی که متوجه منظورشون بشم وجود نداره آیا ؟
          متشکرم

  • ehsanj
    ۳ مهر ۱۳۹۷

    سلام لطفا منبع این مطب را بیان کنید

  • آرین
    ۱۲ خرداد ۱۳۹۶

    بسیار مطلب کاربردی بود سپاس

  • حسین
    ۱۱ خرداد ۱۳۹۶

    خیلی جالب بود

    • Zeus ‌
      زئوس
      ۱۱ خرداد ۱۳۹۶

      خواهش می‌کنم دوست عزیز

  • مهدی زرکوب
    ۱۲ اردیبهشت ۱۳۹۶

    سلام
    مطلب جالبی بود.

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 10 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

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

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک