با سلام خدمت همه دوستان و همراهان گرامی مایکروالکام. در طراحی سیستم های دارای کنترل پنل برای کنترل یا اعمال تنظیمات دستگاه، استفاده از چندین دکمه (کلید) فشاری، روشی متداول است که طراحی و راه اندازی آن نیز ساده میباشد. در مطلب قبل نحوه انجام اینکار تنها با یک پین با استفاده از ADC میکروکنترلر بررسی شد. در این مطلب نحوه اتصال چند کلید به یک پایه میکروکنترلر و خواندن آن با یک پایه از اینتراپت مورد بررسی قرار خواهد گرفت. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطالب من رو از این لینک مطالعه و بررسی کنید.
اتصال و خواندن چند کلید فقط با یک پایه از میکروکنترلر
در مواردی که تعداد کلید ها زیاد باشد و برای اتصال همه آنها به میکروکنترلر، پین IO در دسترس نباشد، از روش هایی مانند اتصال ماتریسی یا آنالوگ استفاده میشود. نحوه انجام این کار در مطالب قبلی بررسی شده است. اما اگر تعداد پین کافی در اختیار طراح باشد، ساده ترین روش اتصال مستقیم آنها به پین های IO میکروکنترلر میباشد.
در شکل زیر، اتصال چند کلید به پین های میکروکنترلر نمایش داده شده است.
در این روش معمول، هر پین جداگانه توسط پین مربوطه توسط برنامه میکروکنترلر خوانده میشود. اما در مواردی، ساختار برنامه به گونه ای است که امکان اسکن مداوم وضعیت دکمه ها توسط میکروکنترلر وجود ندارد یا بار پردازشی آن را بیش از حد مجاز بالا میبرد.
در این شرایط باید فقط زمانی که یکی از دکمه ها فشرده شدند، اسکن آنها توسط میکروکنترلر انجام شود. برای این کار، دکمه ها باید به پین هایی از میکروکنترلر که مجهز به قابلیت اینتراپت خارجی هستن متصل شوند. در این صورت با فشردن هر دکمه، زیر برنامه اینتراپت در میکروکنترلر اجرا شده و وضعیت آن دکمه بررسی میشود.
چالش
مشکلی که در این روش با آن رو به رو هستیم، محدود بودن تعداد پین های دارای اینتراپت خارجی در میکروکنترلر میباشد. خصوصا در میکروکنترلر های ارزان تر مانند ATMEGA8 فقط دو پین اینتراپت خارجی وجود دارد. بنابراین نمیتوان همه کلید ها را به اینتراپت وصل کرد. در ادامه راه حلی برای این مشکل معرفی خواهد شد.
راه حل
برای حل مشکل کمبود پین های اینتراپت، میتوان روشی به کار برد به گونه ای که فقط یک پین اینتراپت مورد نیاز باشد! در این روش، از اسکن دو مرحله ای استفاده میکنیم. در شکل زیر مدار مورد نیاز این روش نشان داده شده است.
تحلیل
در این روش، پین مشترک دکمه ها به جای اینکه مستقیما به تغذیه متصل شود، به پین اینتراپت میکروکنترلر وصل شده است. اسکن کلید ها در این روش در دو مرحله انجام خواهد گرفت.
مرحله اول: تشخیص فشردن یک کلید توسط اینتراپت
در این مرحله، پین اینتراپت میکروکنترلر را به صورت ورودی تنظیم کرده و اینتراپت خارجی آن را روی لبه بالا رونده فعال میکنیم. همچنین، سایر پین های متصل به دکمه ها را به صورت خروجی تنظیم کرده و مقدار 1 منطقی در آنها قرار میدهیم. در این حالت، در صورتی که هیچ یک از کلید ها فشار داده نشده باشند، پین اینتراپت توسط مقاومت R13 مقدار 0 منطقی خواهد داشت. با فشار دادن یکی از دکمه ها، مقدار 1 به پین اینتراپت وصل شده و اینتراپت میکروکنترلر تحریک خواهد شد.
مرحله دوم: تشخیص دقیق کلید فشار داده شده
با ورود برنامه به زیر برنامه اینتراپت، اینتراپت را غیر فعال کرده و وضعیت ورودی و خروجی پین ها را بر عکس تنظیم میکنیم. یعنی پین اینتراپت به صورت خروجی و سایر پین ها ورودی تنظیم شوند. سپس مقدار 1 منطقی را روی پین مشترک دکمه ها قرار می دهیم. اکنون با بررسی هر کدام از پین های دکمه ها، می توان فشرده شدن هر کدام از آنها را تشخیص داد.
پس از اتمام مراحل اسکن دکمه ها، وضعیت پین ها باید مجددا مطابق مرحله 1 تنظیم شوند تا مدار برای اینتراپت مجدد آماده گردد.
مقاومت های متصل به دکمه ها، برای جلوگیری از شناور شدن پین ها در حالت ورودی در مدار در نظر گرفته شده اند و مدار را در برابر نویز های احتمالی مقاوم میسازد. در ادامه کد کامل این روش برای میکروکنترلر ATMEGA8 به زبان بیسیک آمده است.
برنامه نویسی
در ادامه کد های مربوطه به اتصال و خواندن چند کلید از طریق پایه وقفه خارجی (اینتراپت) قابل دسترس میباشد.
program Button_Read_1_Interrupt dim BTN_1_Pin as sbit at PINB.0 dim BTN_2_Pin as sbit at PINB.1 dim BTN_3_Pin as sbit at PINB.2 dim BTN_4_Pin as sbit at PINB.3 dim BTN_5_Pin as sbit at PINB.4 dim BTN_6_Pin as sbit at PINB.5 dim BTN_COM_IN_Pin as sbit at PIND.2 dim BTN_COM_OUT_Pin as sbit at PORTD.2 sub procedure Ext_IRQ() iv IVT_ADDR_INT0 ics ICS_AUTO DDRB = 0 SREG.SREG_I = 0 DDRD.2 = 1 BTN_COM_OUT_Pin = 1 if BTN_1_Pin = 1 then UART_Write_Text("BTN 1") end if if BTN_2_Pin = 1 then UART_Write_Text("BTN 2") end if if BTN_3_Pin = 1 then UART_Write_Text("BTN 3") end if if BTN_4_Pin = 1 then UART_Write_Text("BTN 4") end if if BTN_5_Pin = 1 then UART_Write_Text("BTN 5") end if if BTN_6_Pin = 1 then UART_Write_Text("BTN 6") end if UART_Write_Text(" Press") UART_Write(13) UART_Write(10) DDRB = 255 SREG.SREG_I = 1 DDRD.2 = 0 GIFR.INTF0 = 1 end sub main: DDRB = 255 DDRD.2 = 0 UART1_Init(9600) MCUCR = %00001111 GICR.INT0 = 1 SREG.SREG_I = 1 PORTB = 255 While 1 nop Wend end.
شبیه سازی
نتیجه شبیه سازی اتصال چند کلید به پایه اینتراپت با استفاده از این روش در شکل زیر آمده است.
جمع بندی
برای اتصال چند دکمه به میکروکنترلر و تشخیص فشرده شدن آنها از طریق اینتراپت خارجی، گاهی با چالش کمبود پین های اینتراپت خارجی نسبت به تعداد کلید ها مواجه میشویم. در این مطلب، روشی معرفی شد که تنها با استفاده از یک پین اینتراپت خارجی تعداد دلخواهی کلید را میتوان برای تشخیص آنی فشرده شدن به میکروکنترلر متصل نمود و سپس خواندن نهایی آنها را توسط سایر پین های معمولی انجام داد.
امیدوارم که این مطلب مورد رضایت شما قرار گرفته باشد. چنانچه در این خصوص سوال، نظر و یا اطلاعات و تجربه ای دارید، آن را از قسمت کامنت ها با ما در میان بگذارید تا در اسرع وقت پاسخ داده شود و از تجربیات و اطلاعات شما هم استفاده شود. همچنین ما را در پیج اینستاگرام مایکروالکام دنبال کنید.
خیلی عالی و حرفه ای دمتون گرم واقعا ❤️❤️ یکی از بهترین سایتهای ایرانی هستید.
سلام؛
از اینکه مطالب مفید بوده براتون خوشحالیم.
با سلام و تشکر بابت مطالعه این مطلب. انشاالله مورد استفاده شما و سایر دوستان قرار بگیرد.
موفق باشید.
خدا قوت
میتونه بسیار کاربردی باشه