روش خلاقانه برای افزایش پورت میکروکنترلر تنها با یک بیت
ممکن است برای شما هم پیش آمده باشد که به دلیل محدودیت پایههای میکروکنترلر مجبور شده باشید که میکروکنترلر را عوض کنید و از میکروکنترلری با تعداد پایههای بیشتر استفاده کنید. برای افزایش تعداد پورتهای میکروکنترلر، راههای زیادی وجود دارد؛ یکی از این راهها استفاده از لچ(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 را فقط با استفاده از یک خط داده وصل کرد.
سورس کد
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #define Shift_DDR DDRD #define Shift_PORT PORTD #define Shift_Pin (1<<2) void Shift_Init(void) { Shift_DDR |= Shift_Pin; Shift_PORT |= Shift_Pin; } void Shift_WriteZero(void) { Shift_PORT &= ~Shift_Pin; _delay_us(15); Shift_PORT |= Shift_Pin; _delay_us(30); } void Shift_WriteOne(void) { Shift_PORT &= ~Shift_Pin; _delay_us(1); Shift_PORT |= Shift_Pin; _delay_us(15); } void Shift_Load(void) { Shift_PORT &= ~Shift_Pin; _delay_us(200); Shift_PORT |= Shift_Pin; _delay_us(300); } void Shift_WriteByte(char Byte) { for(int i=0;i<8;i++) { if(Byte&0x80) Shift_WriteOne(); else Shift_WriteZero(); Byte<<=1; } Shift_Load(); } |
تابع Shift_WriteByte یک بایت از طریق یک خط داده منتقل خواهد کرد. دقت داشته باشید قبل از فراخوانی آن حتما یک بار تابع Shift_Init را جهت پیکربندی پورت فراخوانی کرده باشید. مطابق کد زیر:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int main(void) { Shift_Init(); uint8_t Data = 1; while(1) { Shift_WriteByte(Data); Data<<=1; if(Data == 0x00) Data = 1; _delay_ms(100); } } |
خروجی برنامه :
سلام ممنون از اطلاعاتتون . یه سوال داشتم اینجا این روش مثلا برای یک فرستادن دیتا روشن :1us خاموش و 15 میکرو ثانیه روشن میفرستید و در میکرو من بهترین زمان اجرایی 130us هست . من میتونیم با تاخییر بیشتر و تغییر مقادیر خازن ومقاومت با این سرعت این کار رو انجام بدم ؟ فرکانس کاری میکرو من 16 mhz ولی بعلت حجم بالای برنامه بهترین سرعتم 130 میکرو ثانیه هستش
سلام شیفت رجیستر ۱۲ بیت ارزون چی هست ممنون
تا حالا ۱۲ بیت ندیدم !
ولی ۱۶ هست یا میتونید دو تا ۸ رو سری کنید.
سلام خدمت دوستان
یه نکته بسیار مهم در استفاده از این تکنیک:
زمانی که سیستم روشن میشود و قبل از اینکه میکرو خروجی ها رو تنظیم کند، امکان داره یه مقدار رندوم در خروجی ها ظاهر بشود! که در برخی کاربردها خطرناک هست.
با استفاده از پین OE خروجیها رو کنترل کنید.
سلام میشه خروجی ها رو برای راه اندازی اپتو کوپلر استفاده کرد ؟
سلام بله امکان پذیر هست
با سلام و عرض ادب
برای متصل کردن lcd باید از سه پین از میکرو استفاده بشه؟
و اینکه استفاده از کد بالا برای lcd کافیه؟
سلام خیلی بستگی به نوع نمایشگر شما خواهد داشت این مساله
اگر فرض کنیم شما قراره از نمایشگر کارکتری استفاده کنید برد هایی هستند که از طریق i2c میتونن این کار رو انجام بدن که نیاز به دو پایه دارن
البته از این مدار هم میتونید استفاده کنید که تنها به یک پایه دیتا نیاز دارید
ببخشید چطور میشه 750تا سنسور نوری که کارشون تشخیص قطع و وصل هست را راه اندازی کرد البته با avr
احتمالا بهترین راه شیفت رجیستر هست یا مثلا استفاده از CPLD
سلام عرض ادب
مهندس ممنون از مقالات مفیدتون
میخواستم بدونم اگه بخوایم 74HC595 رو با STM32 راه اندازی کنیم میشه اینکار رو با SPI با مد ONLY TRANSMITTER انجام داد؟
سلام
برای راه اندازی این لچ شما صرفا ارسال اطلاعات دارید و میتونید با همون مد هم راهش بندازید
با سلام
ممنون از آموزش های شما
ببخشید خروجی ها از چه نوعی هستند؟ دیجیتال ، آنالوگ ، PWM ؟
سپاس از توجه شما
ارادت
سلام دیجیتال هستند
سلام.برای اتصال چند تا 74595 به این روش چطور میشه کار کرد.سرعت زیاد برامون مهم نیست.لطفا جواب بدید.
بله شدنش میشه ولی پیشنهاد نمیکنم از این روش استفاده کنید مخصوصا توی محصول چون به شدت خطا پذیره
اگر میخواید از یک رشته سیم برای انتقال دیتا استفاده کنید بهترین راه استفاده از پروتکل 1wire هست
بعد برای وصل کردن چند تا 595 به هم هم میشه به همین شکل عمل کرد؟یعنی خروجی سریال اولین 595 رو به ورودی کلاک بعدی بدیم و همین مدار RC رو اونجا هم به همین شکل پیاده کنیم.؟درست گفتم.؟
بله میشه – ولی همونطور که قبلا هم پیشنهاد دادم بهتره از 1wire استفاده کنید چون اعتبار سنجی دیتا توش وجود داره و قابل اطمینان هست
سلام.مطلب خوبی بود.فقط از برنامه یه جاهایی رو نفهمیدم.میشه یک توضیحی درباره برنامه بدید.که
Shift_DDR DDRD
Shift_PORT PORTD
define Shift_Pin
چی هستن و برنامه چطور کار میکنه.
من زیاد از آردینو سر درنمیارم.کلیت مطلبو گرفتم.
سلام برنامه با آردوینو نوشته نشده صرفا از سخت افزار آردوینو استفاده شده
برنامه به زبان سی هست 🙂
اینا هم ثوابتی هستن که پورت مورد استفاده رو باهاشون تعریف میکنم مثلا دیتا از کدوم پورت و کدام پایه خارج بشه
عالی
سلام آقای مهندس
بفرمایید برای راه اندازی lcd های کارکتری 192×64 و یا lcd های رنگی 2.4 اینچی هم میشه از این آی سی ها استفاده کرد؟
اگر بله بهترین ماژول و یا آی سی را معرفی بفرمایید.
با تشکر
سلام آقا حمید
باید بگم بله میشه ولی باید اینم اضافه کنم که کسی این کار رو انجام نمیده چون سرعت انتقال داده خیلی پایینه و برای رفرش کردن تصویر اصلا کار منطقی ای نیست .
سلام علیکم بزرگوار
قبول. اما برای اینکه تعداد پینهای اشغالی روی آردینو را به حداقل برسانیم راه کار چیه؟
نمایشگرهای کاراکتری که 16 پین دارند یک مبدل i2c دارن. اما برای گرافیکی ها که 20 پین دارند این ماژول در بازار نیست.
میدونم آی سی MCP23017 و MCP23s17 برای اینکار است.
http://thecaferobot.com/store/i2c-interface-16-channel-io-expansion-module
راه کار پیشنهای شما چیست؟
خیلی ممنون
سلام
خوب برای این کار راه های مختلفی وجود داره
اول استفاده از lcd هایی که رابط سریال رو پشتیبانی میکنند مثل ST7567 که یه کنترلر lcd گرافیکی هست هم زمان هم پرالل و هم سریال رو پشتیبانی میکنه و توی بازار ایران هم موجود هست.
راه دوم استفاده از همین مدل آیسی هایی که خودتون مثال زدید
راه سوم استفاده از شیفت رجیستر مثل 74595 که دیتای سریال بدید و موازی بگیرد – البته مثل مدار این پست استفاده نکنید و پایه های اچ و دیتا رو مستقیم به میکرو وصل کنید اینطور تا فرکانس ۲۰ مگاهرتز به راحتی میتونید بالا برید.
و راه های دیگه از این دست
و علیکم سلام
یعنی اگه فرکانس را بالا ببریم دیگه مشکل سرعت انتقال داده نخواهیم داشت؟
دوم درصورت استفاده از 74595 کتابخوانه معمول برای نمایشگر های مختلف قابل استفاده هست؟ و یا باید کتابخوانه بنویسیم؟
انشاء الله عاقبت بخیر شوید.
احتمالا با افزایش سرعت مشکل حل میشه
از هموننه کتابخانه میتونید استفاده کنید ولی باید لایه انتقال داده رو باز نویسی کنید بدون شک.
کد ها مال چه ide هستند
اردوینو؟؟
شما برای کامپایل کد میتونید از اتمل استودیو استفاده کنید.
ممنون مطلب جالبی بود
سلام مطلب خوبی بود ولی برای این کار تویه کتاب میکروکنترلرهای 8051 دکتر مزیدی یک تراشه از اینتل به نام 8255 معرفی شده است. حتی میشه چندتا از این ها رو به سیستم میکرو وصل کرد و برای راحتی کار سرویس وقفه هم دارد که کار کنترل رو خیلی راحت می کنه
بله درست می فرمایید ؛ البته خیلی راه های دیگه هم هست ؛ اما دقت کنید این راه تنها نیاز به یک پایه داره ! در صورتی که برای باقیه راه ها چنین چیزی نیست
ممنون از مطالب ارزشمندتون
آی سی 74hc595 یه مشکل داره و اونم میزان کم جریان دهی هر پین(6ma) و کل جریانی که میشه از آی سی کشید(35ma) هست.
لطفا اگر مقدور هست یه آی سی شیفت رجیستر با توان بالاتر برای درایو کردن led معرفی کنید.
با تشکر
سلام و درود – بله کاملا درسته ، البته همونطور که اطلاع دارید آیسی 595 آیسی مناسبی برای درایو LED نیست چون محدود کننده جریان روی خروجی ها نداره پس به همین دلیل ممکنه یا خودش یا LED آسیب ببینه !
برای همین توصیه میکنم برای این کار از آیسی DM135 یا امثال اون استفاده کنید ، این دست آیسی ها دقیقا برای راه اندازی LED در تابلو های LED ساخته شده اند. اگر بخوام قابلیت هاشون رو بگم
اول این که خروجی 16 بیتی
دوم کنترل جریان برای هر خروجی (قابل تنظیم به صورت گروهی)
سوم تشخیص سوختگی LED و گزارش به هاست
توی پنلی که با استفاده از این آیسی ساخته شد ، بعد از گذشت 6 سال هیچ LED سوخته ای مشاهده نشده.
ممنون از پاسختون
این شرکت آی سی 32 بیتی نداره.
اگر مقدور هست 32 بیتی معرفی کنید.
من خودم این آی سی رو پیدا کردم که با 3.3v هم کار میکنه.
R8A66162SP
ممنون
خواهش میکنم
والا ؛ 32 بیت تعداد زیادی هست و فکر میکنم موقع سیم کشی به مشکل بر بخورید مگر این که بخواید RGB کار کنید که هر پیکسل 3 بیت رو مشغول کنه !
خوبه آیسی که پیدا کردید ولی جریانش قابل تنظیم نیست و البته گزارش پیکسل های سوخته رو هم ظاهرا نداره
سلام من تو کاتالوگ ندیدم که 6ma برای هر پایه باشه چیزی که من میبینم اینه:
Iout DC Output Current, per Pin ±35 mA
سلام اصطلاح یا تعریف گسترش طول کلمه یا گسترش طول ادرس رو خیلی شنیدم ولی هرچی سرچ کردم نفهمیدم میتونید کمک کنید مرسی .
ببخشید سوالتون رو متوجه نمیشم ، امکان داره توضیح بیشتری بدید ؟!
در ادامه توضیحات درس میکروکنترلر ها همیشه حرفی از گسترش طول کلمه و گسترش طول ادرس میزنن حالا این راجب میکروکنترلر هست یا چیز دیگه ایی که از اجزای تشکیل دهندش نمیدونم ?
ببخشید دوست عزیز ولی متوجه منظورتون نمیشم ! اگه میشه تکه ای از مقاله که این اصطلاحات درش استفاده شده رو معرفی کنید.
spread address length va
word length
منظورش اینهاست
امم – خوب این کلمات خیلی معنی میتونه داشته باشه !
پاراگرافی چیزی که متوجه منظورشون بشم وجود نداره آیا ؟
متشکرم
سلام لطفا منبع این مطب را بیان کنید
سلام
منبع
بسیار مطلب کاربردی بود سپاس
متشکرم دوست عزیز
خیلی جالب بود
خواهش میکنم دوست عزیز
سلام
مطلب جالبی بود.
خواهش میکنم