Slide
Slide

آشنایی با کیبورد و نمایشگر
نویسنده: مسئول فنی در
۲۷ ارديبهشت ۱۳۹۳
[ آخرین به روزرسانی در ۰۴ تير ۱۳۹۳ ]

قبل از بحث در مورد کیبورد و نمایشگر لازم است، در مورد تکنیک های ارتباط میکروپروسسور با دستگاههای ورودی/خروجی یا همان I/O صحبت کنیم. سرعت میکروپروسسور از دستگاههای I/O بیشتر است. پس باید بین I/O و میکروپروسسور هماهنگی باشد، تا ضمن از دست ندادن داده، وقت زیادی از میکروپروسسور گرفته نشود.

چهار تکنیک ارتباط میکروپروسسور با I/O به شرح زیر است:

1-      روش سرکشی / polling

2-      روش وقفه / Interrupt

3-      روش دسترسی مستقیم به حافظه / Direct Memory Access

4-      ارتباط با I/O های منظم

روش سرکشی : همانطور که از نام ان پیدا است میکروپروسسور با سرزدن از I/O متوجه آماده بودن آن می شود. برای مثال اگر شما با این روش بخواهید با کیبورد ارتباط برقرار کنید، سراغ پورت کیبورد رفته و در صورتی که داده ای نداشت برمی گردید و چنانچه کلیدی زده شده باشد، آنرا می خوانید. در این روش ممکن است ما بارها سراغ کیبورد برویم و کلیدی زده نشده باشد. نکته مهم در این روش فواصل سرکشی از I/O  است. باید ببینیم که I/O هر چه مدتی ممکن است داده ای برای میکروپروسسور داشته باشد. برای مثال اگر میکروپروسسور بخواهد داده های کیبورد را بخواند، باید بداند حداقل فاصله زمانی بین زده شدن دو کلید متوالی چقدر است. از انجا که کلیدها توسط ما زده می شوند، ما بیش از 5 کلید در ثانیه نمی توانیم بزنیم، خودتان امتحان کنید. پس اگر میکروپروسسور هر ثانیه 5 بار به کیبورد سربزند، کافی است. اگر میکروپروسسور هزار بار به کیبورد سربزند، جز هدر رفتن وقت میکروپروسسور کاری نکرده است. پس نباید تعداد سرکشی آنقدر کم باشد، که داده ها را از دست بدهیم و آنقدر زیاد نباشد که وقت میکروپروسسور را هدر دهد.

در روش سرکشی از روی داده و یا سیگنال خروجی I/O متوجه آماده بودن ورودی/خروجی جهت دریافت یا ارسال داده می شویم.

روش وقفه : در این روش هرگاه دستگاه I/O  داده ای برای ارسال به میکروپروسسور داشت و یا دستگاه خروجی آماده دریافت داده جدید از از میکروپروسسور باشد، با فعال کردن یک سیگنال آمادگی خود را اعلام می کند. حال اگر این سیگنال به ورودی وقفه میکروپروسسور داده شود، هرگاه I/O آماده تبادل داده باشد، به میکروپروسسور وقفه داده خواهد شد. حال در برنامه سرویس وقفه تبادل داده انجام می شود. دراین روش همانطور که می بینید میکروپروسسور سراغ I/O نمی رود و از این جهت وقت میکروپروسسور گرفته نمی شود. اما نیاز به سیگنال وقفه توسط I/O و یک ورودی وقفه در میکروپروسسور داریم.

روش دسترسی مستقیم به حافظه ( DMA = Direct Memory Access ) : در اینجا انتقال داده بین I/O و میکروپروسسور به کمک یک بخش دیگر به نام DMA صورت می گیرد و میکروپروسسور خود را درگیر انتقال داده نمی کند. روش DMA بیشتر در مواردی استفاده می شود، که حجم انتقال داده بین I/O و میکروپذوسسور بالاست. برای مثال یک فایل داده اگر بخواهد از هارد دیسک کامپیوتر به حافظه RAM منتقل شود، به روش DMA صورت می گیرد . در روش DMA ، میکروپروسسور آدرس مبدا و تعداد داده ها و آدرس مقصد را به DMA می دهد. DMA داده را از مبدا خوانده و به مقصد منتقل می کند. مبدا و مقصد می تواند دستگاههای ورودی، خروجی و یا حافظه ها باشند.

ارتباط با I/O های منظم : در این روش زمان آماده شدن داده توسط I/O مشخص است و ما اطمینان داریم پس از زمان مشخصی I/O آماده تبادل داده است. میکروپروسسور پس از زمان فوق داده را به I/O داده و یا از آن می گیرد. یکی از دستگاههای I/O که بیشتر با این روش از آن داده گرفته می شود، مبدل آنالوگ به دیجیتال است.

 کیبورد :

برای ارتباط سی پی یو با دنیای خارج از تجهیزات  l/o   استفاده می کنیم. دستگاههای ورودی به میکروپروسسور داده میدهند، این داده ها برای پردازش و محاسبات و یا دادن فرمان به میکروپرسسور می باشند. کی بورد یکی از تجهیزات ورودی است. شما ارسال داده یا فرمان از کیبورد به کامپیوتر را بارها تجربه کرده اید.

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

Key Keyboard contact

شکل زیر یک کی بورد 8 تایی که به صورت خطی بسته شده است را نشان می دهد، در این جا اگر کلیدی زده نشده باشد، در صورتی که پورت میکرو را به صورت ورودی با pullup داخلی تعریف کرده باشیم، همه ورودی ها در حالت 1 خواهند بود. حال اگر شما یکی از کلیدها را بزنید، با اتصال دو کنتاکت کلید بهم، پایه ورودی میکرو به 0 متصل می شود، واضح است با خواندن پورت میکرو کلید زده شده را می توان پیدا کرد.

Linear Keyboard Bounce

برای تشخیص کلید زده شده، باید به چند نکته توجه کرد.

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

Keyboard Bounce

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

در روش سرکشی اگر زمان سرکشی بیش از مدت Bounce  کلید باشد، این مشکل حل می شود.

نکته دوم در برنامه کیبورد، تست رها شدن کلید است. از آنجا که ما نمی دانیم استفاده کننده چه مدتی ممکن است، دستش روی کلید باشد، باید رها شدن کلید توسط برنامه ما بررسی شود. در غیر اینصورت یکبار زده شدن کلید را ممکن است، چند بار در نظر بگیریم.

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

Keyboard flowchart Routine

با چند تغییر جزئی در فلوچارت بالا و اضافه کردن یک فلگ جهت فشرده یا رها بودن کلید، اشکال قبلی حذف و زیربرنامه زیر جهت کیبورد مناسب است.

Keyboard flowchart Routine

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

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

کیبورد ماتریسی : در کیبورد خطی برای دریافت وضعیت هر کلید به یک پین ورودی نیاز داریم. واضح است اگر تعداد کلیدها زیاد باشد، پین های زیادی از پورت های ورودی اشغال می شود، برای کاهش پایه ها از روش ماتریسی به شکل زیر استفاده می شود.

Matrix Keyboard

در این روش کلیدها در محل تلاقی سطرها و ستون ها قرارگرفته اند. در شکل بالا 16 کلید داریم، که یک ماتریس 4*4 تشکیل داده اند. برای پیدا کردن کلید زده شده، هر بار یک سطر را فعال می کنیم. منظور از فعال کردن سطر، فرستادن 0 روی آن است. حال اگر کلیدی از سطری که فعال کرده ایم، زده شده باشد، صفر سطر از طریق کلید به ستون آن کلید منتقل می شود و ما با خواندن پورت ورودی ستون ها، ستون کلید زده شده را بدست می آوریم. توجه دارید اگر هیچ کدام از کلیدهای سطری که فعال کرده ایم زده نشده باشد، تمام ستون ها 1 خواهد بود.

پس برای پیدا کردن محل کلید، سطرها را یکی یکی فعال می کنیم، هرگاه تمام ستون ها 1 بودند، کلیدی از سطر فعال زده نشده است و سراغ سطر بعدی می رویم. به اینکار Scan کیبورد می گویند.

از آنجا که در غالب سرکشی ها از کیبورد کلیدی زده نشده است، بهتر است ابتدا تمام سطرها را فعال کنیم، تا ببینیم، اساساً کلیدی زده شده است یا نه؟ حال اگر کلیدی زده شده بود، سطرها را یکی یکی فعال کنیم تا محل سطر و ستون کلید زده شده را بدست آوریم

نظرات کاربران
aa :    
۲۸ ارديبهشت ۱۳۹۳
۲۸ ارديبهشت ۱۳۹۳
سلام استاد جواب اين سوال چي ميشه؟؟ اگر بخواهیم در صورتیکه کاربر بیش از مدت معینی دستش را روی کلید قرارداد، آن کلید را با میزان معینی (مثلاً 5 بار در ثانیه) قبول کند، چه باید کرد؟ در حالت كلاك داخلي ايا ميشود فركانس هايي غير از 1و2و4و8 ايجاد كنيم؟ تشكر
۲۹ ارديبهشت ۱۳۹۳
مسئول فنی :

برای تکرار کلید، پس از دریافت کد کلید باید در صورتیکه کاربر بیش از زمان معینی دستش را روی کلید قرار داد، به ازای تعداد کلید در ثانیه، کد آن کلید را به برنامه برگردانید. برای مثال اگر خواستید در ثانیه 5 بار کلید تکرار شود، به ازای هر 200 میلی ثانیه کد کلید را به برنامه اصلی برگردانید. در سیستم عامل ویندوز یک تاخیر اولیه (Dealy)  و یک میزان کلید در ثانیه  (Rate)  تعریف می شود.

در مورد سوال دوم : توسط رجیستر  OSCCAL می توانید، فرکانس های نامی بالا  را تغییر دهید، اما تغییر بیش از 10% در نوشتن  EEPROM و Flash ممکن است، اشکال  پیش آورد و توسط سازنده گارانتی نمی شود.



حساس :    
۰۶ خرداد ۱۳۹۳
۰۶ خرداد ۱۳۹۳
با تشکر از مطالب خوبتون لطقا متن روش وقفه رو ادیت کنید یه ایراداتی داره هم گرامری هم تایپی!در ضمن در مورد ارتباط سریال هم اگه ممکنه به طور کامل توضیح بدید.


larni :    
۱۸ خرداد ۱۳۹۶
۱۸ خرداد ۱۳۹۶
با سلام اگر بخوایم به موازات اجرای یک برنامه بدون روش سرکشی، دائم صفحه کلید بررسی بشه و اگر دکمه ی خاصی زده شده بود کاری رو انجام بدیم باید چه کرد؟
۱۸ خرداد ۱۳۹۶
مسئول فنی :

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



نظر بدهید

ایمیل شما پنهان می ماند.