| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Сканиране на матрична клавиатура http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13559 |
Страница 1 от 1 |
| Автор: | DanielDimov [ Сря Фев 04, 2015 1:30 pm ] |
| Заглавие: | Сканиране на матрична клавиатура |
Как го правите? С каква честота сканирате? Правите ли някакво сумиране/усредняване на статусите за всеки клавиш или не? Поддържате ли множество едновременно натиснати клавиши или не? |
|
| Автор: | stoyanoff [ Сря Фев 04, 2015 3:14 pm ] | ||||||||||||||||||
| Заглавие: | Re: Сканиране на матрична клавиатура | ||||||||||||||||||
Ето пример:
Както и кода:
Примерът е взет директно от книжка. НЕ СЪМ ГО ТЕСТВАЛ! Иначе всичко зависи от конкретното приложение. Сканиране на под 100 -200ms би трябвало да е ОК! Успех! |
|||||||||||||||||||
| Автор: | miro_atc [ Сря Фев 04, 2015 5:39 pm ] | |||||||||
| Заглавие: | Re: Сканиране на матрична клавиатура | |||||||||
По възможност клавиатурата се сканира често, но не постоянно. За целта изходите на матрицата трябва да са вързани към входове на проца дето имат прекъсвания. При натискане на клавиш се появява някакво прекъсване след което започва сканирането през равен интервал. Сканирането продължава докато се отпусне и последния натиснат клавиш. След това спираш и чакаш пак прекъсване. Честотата на сканиране най-добре да ти е параметър, защото зависи и типа на клавиатурата, дали е гума и на какво и как контактува. В тоя ред на мисли при едно сканиране обикновено се "развърта" матрицата за да видиш кой точно бутон е натиснат. Но това също е добре да става през някакво минимално време, особено ако има филитриращи или паразитни капацитети. Не е задължително да е слийп, може и кода да е разместен леко, колкото да не четеш входовете веднага след като си изкарал нещо на изходите... Естествено трябва да се разпознават няколко клавиша, стига да не са на един и същ ред (или колона в зависимост кое въртиш). Няма причина да не се разпознават (по-трудно е). Относно осредняването... не съм сигурен какво имаш предвид, но ако е дебонсването най-лесно е ако изберещ едната посока за приоритетна. Примерно натискането. Ако един клавиш не е бил натиснат още при първото натискане го приемаш за натиснат. Но го маркираш като отпуснат само след определен интервал. |
||||||||||
| Автор: | DanielDimov [ Сря Фев 04, 2015 8:25 pm ] |
| Заглавие: | Re: Сканиране на матрична клавиатура |
Ако клавиатурата е без диоди (както са повечето) може със сигурност да се хванат максимум два едновременно натиснати бутона независимо от комбинацията. При повече от два - понякога ще се детектират, но понякога ще излизат грешно като 4 и т.н. Както и да е - това с повече от два бутона не е използваемо на практика. Това с чакането за прекъсване е добро като идея! За усредняването си мислех следното - може при сканирането понякога за натиснат бутон входа да излиза 1 или 0. За това за всеки бутон да се усреднява броя детектирания като 1 и ако средно е над някаква прагова стойност - се счита че е натиснат. Въпроса ми е има ли смисъл да се прилага такава техника или не? |
|
| Автор: | miro_atc [ Сря Фев 04, 2015 10:44 pm ] |
| Заглавие: | Re: Сканиране на матрична клавиатура |
Не максимум, а минимум два клавиша, щото ако са два натиснати (независимо кои) винаги може да ги отчетеш правилно. За повече важи правилото, че ако един клавиш е натиснат то на същия ред може да има други (колкото искаш) натиснати, но при условие че на същата колона няма нито един. И обратно ако ма същата колона има натиснати, то не може да има на съшия ред. Иначе казано ако имаш клавиатура 4*4 то отчиташ минимум 2 и максимум 4 (но не кои да са 4). За усредняването, да в общия случай трябва да имаш такова. Освен ако не си сигурен, че бутоните са наистина качествени На английски се казва debounce и вече как ще го направиш зависи от конструкцията на бутоните и от поведението, което искаш да постигнеш. Просто някои бутони трептят при допир повече, други при отпускане. Сигурно има и такива дето си трептят и при двете. От друга страна ти може да искаш по-бързо детектване на натискане или на отпускането. Простото усредняване ще действа еднакво бавно и в двете посоки. Всъщност и с усредняване може да го направиш асиметрично, ако не сравняваш с 50%. Примерно ако имаш 2 или повече натискания от общо 5 стойности и приемеш че това е достатъчно за натиснат, то натискането ще се детектва по-бързо. Разбира се, трябва да си сигурен че ти не си по-бърз, отколкото траят трептенията |
|
| Автор: | 4040 [ Сря Фев 04, 2015 10:51 pm ] |
| Заглавие: | Re: Сканиране на матрична клавиатура |
Два бутона едновременно е тъпо - как ще им реагираш? Не че е невъзможно , но по-добре избягвай такива фатки (заради спокойствието на юзера и сексуалното здраве на родата). Просто реагираш на първия възприет бутон и толкоз. Все пак тези клавиатури не са за машинописки (според мен са си просто бутони, пък били те и матрични). За четенето - проверяваш през 20ms и запомняш бутона. Ако следващия път е същия - действаш. Хубаво е да имаш и софт.таймер за натиснатост - така няма да "репетираш" инцидентно, а по график. Ако не спиш за пестене на ток може и без прекъсване на пиновете. Прекъсването може да си го направиш и с таймер - и без това обикновено са налага да се обслужват и други неща - дисплей, ацп-та и др. Удобно е да считаш, че ненатиснат нито един бутон също е = на натиснат бутон (например с код 0), но с по-специално обслужване. |
|
| Автор: | Cekins [ Сря Фев 04, 2015 11:16 pm ] |
| Заглавие: | Re: Сканиране на матрична клавиатура |
Чак пък и с прекъсване - мисля, че няма нужда. То си и зависи от това дето чете клавиатурата, но ако е някакъв контролер, който не прави кой знае колко много неща, във времето когато нищо не прави може да сканира. Когато прави нещо по-важно така или иначе няма да я сканира. Все си мисля че няколко милисиекунди закъснение въобше няма да се усетят. Що да е тъпо два бутона. Примерно имам случай в който 3 бутона трябва да реагират по друг начин натиснати в коминация с друг бутон - примерно както са fn бутоните на лаптопите. |
|
| Автор: | miro_atc [ Чет Фев 05, 2015 10:18 am ] | |||||||||
| Заглавие: | Re: Сканиране на матрична клавиатура | |||||||||
Може... не е желателно да се изпускат клавиши, но пак е по-добре отколкото горния пример с while() {} до откат Питащият не е посочил конкретна архитектура, което предполага че вероятно няма ограничения в хардуера. Щото ако трябва да се натъпче в някакъв слаб 8-бит контролер прекъсванията и всякакви екстри са проблем. Но по принцип една клавиатура предполага и някаква индикация и нещо с малко повече функции. Съответно си трябва малко по-съвременен проц. Дали ще е ПИК32 или АРМ не е важно, просто нещо от тоя клас и тогава вече няма никакъв проблем с прекъсвания. Особено ако софта е добре организиран нито ще заеме повече флаш нито повече процесорно време. Всъщност точно обратното целта е да няма процесорно размотаване. Не че едно сканиране прави кой знае какво натоварване, обаче то това не прави, онова не прави, а накрая се оказва че проца е натоварен с глупости. Така че тия неща се пишат веднъж и се пишат като хората, т,е, да не товари, да не харчи... Нищо че в първите версии едва ли е фатално. Просто после винаги става по-сложно. Клиента ще каже абе тая клавиатура е ОК, ама неудобна, я сложи поддръжка за външна. И там са едни полирания, защото usb HID няма прекъсвания. И още няколко неща като му сложиш и почва абе тая батерия що кляка бързо... |
||||||||||
| Автор: | DanielDimov [ Чет Фев 05, 2015 12:34 pm ] |
| Заглавие: | Re: Сканиране на матрична клавиатура |
Конкретния чип е LPC812. Debounce ще направя за да е всичко точно. За едновременно натиснатите бутони май не се изразих много добре... Исках да кажа, че когато няма диоди - само един натиснат клавиш се хваща 100% гарантирано, два едновременно също се хващат 100% гарантирано независимо от комбинацията им, но вече 3 или повече - може и да се хванат, но може и да се детектират грешно. Така максимума за коректна работа е два. Това, разбира се, е напълно достатъчно |
|
| Автор: | 4040 [ Чет Фев 05, 2015 1:15 pm ] |
| Заглавие: | Re: Сканиране на матрична клавиатура |
...........<=тук изтрих за да не се заблудят и други. Между KeyPad и KeyBoard има някои тънки разлики - твоя случай за какво е, колко бутона имаш? Принципът е един и същ, но при обработката на резултата подходите може да са различни. |
|
| Автор: | miro_atc [ Чет Фев 05, 2015 1:27 pm ] | |||||||||
| Заглавие: | Re: Сканиране на матрична клавиатура | |||||||||
Не бъди толкова сигурен Стандартния HID репорт (BOOT протокол) е един байт с битове за ALT-ве и SHIFT-ве и после до 6 клавиша. Всичко над това е въпрос на желание на съответния производител... Това за компютърни клавиатури, а ако говориш по принцип за какви да е матрични, то фактът че е матрица означава, че няма как да отчетеш безпогрешно всички натиснати клавиши. По-горе съм описал правилото... |
||||||||||
| Автор: | 4040 [ Чет Фев 05, 2015 3:24 pm ] | ||||||||||||||||||
| Заглавие: | Re: Сканиране на матрична клавиатура | ||||||||||||||||||
Прав си, грешката е моя. Но така или иначе да се ползват клавишни комбинации не е желателно (даже и само с два бутона). А който ще си прави пиано, да си слага пълен мултиплекс. Debounce най-лесно и икономично става чрез полиране през точен период, определен от таймер база. Прекъсването от пиновете може да се ползва само за събуждане, но след това пак си се запуска таймера (става и с уачдога). |
|||||||||||||||||||
| Автор: | NikB [ Вто Фев 10, 2015 5:43 pm ] | |||||||||||
| Заглавие: | Re: Сканиране на матрична клавиатура | |||||||||||
Ами аз си чета клавиатурата в прекъсването на някой от таймерите. Ако трябва, софтуерно го деля за да стане в интервала от 1 до към 15-20 мс (четенетоп на цялата клавиатура отнема 30-40 цикъла). В зависимост от тоя период си задавам константини, за да може да се обработват защити (примерно - от притрепване). Поддържам време за първо натискане и скорост на повторение, при задържан бутон.
|
||||||||||||
| Автор: | Реконструктор [ Съб Фев 14, 2015 11:06 am ] | ||
| Заглавие: | Re: Сканиране на матрична клавиатура | ||
Давам и моето решение за atMega16, за клавиатура 4х4.
|
|||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|