STM32, آموزش میکروکنترلر PIC, توصیه شده, کتابخانه برنامه نویسی

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

1shift sisoog

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

ممکن است برای شما هم پیش آمده باشد که به دلیل محدودیت پایه‌های میکروکنترلر مجبور شده باشید که میکروکنترلر را عوض کنید و از میکروکنترلری با تعداد پایه‌های بیشتر استفاده کنید. برای افزایش تعداد پورت‌های میکروکنترلر، راه‌های زیادی وجود دارد؛ یکی از این راه‌ها استفاده از لچ(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 را جهت پیکربندی پورت فراخوانی کرده باشید. مطابق کد زیر:

 

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

 

 


 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

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

  1. Avatar for سینا سینا گفت:

    سلام ممنون از اطلاعاتتون . یه سوال داشتم اینجا این روش مثلا برای یک فرستادن دیتا روشن :1us خاموش و 15 میکرو ثانیه روشن میفرستید و در میکرو من بهترین زمان اجرایی 130us هست . من میتونیم با تاخییر بیشتر و تغییر مقادیر خازن ومقاومت با این سرعت این کار رو انجام بدم ؟ فرکانس کاری میکرو من 16 mhz ولی بعلت حجم بالای برنامه بهترین سرعتم 130 میکرو ثانیه هستش

  2. Avatar for حسین حسین گفت:

    سلام شیفت رجیستر ۱۲ بیت ارزون چی هست ممنون

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      تا حالا ۱۲ بیت ندیدم !
      ولی ۱۶ هست یا میتونید دو تا ۸ رو سری کنید.

  3. Avatar for رض رض گفت:

    سلام خدمت دوستان
    یه نکته بسیار مهم در استفاده از این تکنیک:
    زمانی که سیستم روشن میشود و قبل از اینکه میکرو خروجی ها رو تنظیم کند، امکان داره یه مقدار رندوم در خروجی ها ظاهر بشود! که در برخی کاربردها خطرناک هست.
    با استفاده از پین OE خروجیها رو کنترل کنید.

  4. Avatar for علی علی گفت:

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

    1. Avatar for Sisoog Os Sisoog Os گفت:

      سلام بله امکان پذیر هست

  5. Avatar for narges narges گفت:

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

    1. Avatar for Zeus Zeus گفت:

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

  6. Avatar for رامین رامین گفت:

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

    1. Avatar for Zeus Zeus گفت:

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

  7. Avatar for saeed saeed گفت:

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

    1. Avatar for Sisoog Os Sisoog Os گفت:

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

  8. Avatar for بابک بابک گفت:

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

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

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

    ارادت

    1. Avatar for Sisoog Os Sisoog Os گفت:

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

  9. Avatar for سید محسن سید محسن گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  10. Avatar for سید محسن سید محسن گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  11. Avatar for سید محسن سید محسن گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  12. Avatar for حمید حمید گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      1. Avatar for حمید حمید گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

          1. Avatar for حمید حمید گفت:

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

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  13. Avatar for محمدحسن صادقی محمدحسن صادقی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  14. Avatar for خوش خرام خوش خرام گفت:

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

  15. Avatar for محمدحسین محمدحسین گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  16. Avatar for سعید سعید گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      1. Avatar for سعید سعید گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

    2. Avatar for خوش خرام خوش خرام گفت:

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

  17. Avatar for احمد احمد گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      1. Avatar for احمد احمد گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

      2. Avatar for محمد محمد گفت:

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

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  18. Avatar for ehsanj ehsanj گفت:

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

  19. Avatar for آرین آرین گفت:

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

    1. Avatar for زئوس زئوس گفت:

      متشکرم دوست عزیز

  20. Avatar for حسین حسین گفت:

    خیلی جالب بود

    1. Avatar for زئوس زئوس گفت:

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

  21. Avatar for مهدی زرکوب مهدی زرکوب گفت:

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

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

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