Одночасно натискаючи однакові клавіші рядків


9

Я проектую клавіатуру в VHDL. Все працює добре, коли натискається лише одна клавіша. Я сканую кожний стовпець для натискання клавіші в машині стану, і коли не натискається жодна клавіша, це умова, що pin4pin6pin7pin2 = "0000"я переходжу до наступного стану для сканування наступного стовпця. Таким чином, я встановлюю стовпчики pin3pin1pin5послідовно на "001", "010"і "100".

Під час сканування pin3pin1pin5як "001"і pin4pin6pin7pin2як "0100"тоді просто натискається "9". Я оголошую в VHDL pin4pin6pin7pin2як вхідний і pin3pin1pin5вихідний порти. Коли я одночасно натискаю 6 і 9 pin6і pin7є high. Перша натиснута клавіша читається, друга ігнорується. Коли я натискаю 3 і 7 одночасно, перша натискається за кілька мс перед перемогою, і перша клавіша читається, друга клавіша ігнорується, pin2і pin4є high.

Ось хитра частина. Коли я натискаю 4 і 6 одночасно, я очікую, що pin7це буде, highале це стає lowі pin4pin6pin7pin2 = "0000", що я не розумію, як і чому. Оскільки "0000"виявляється як не натиснута клавіша, державна машина переходить із стану в стан. Утримуючи 4 і 6, якщо один натискає і залишає 4 кілька разів, його виявляють як 6 натискають кілька разів, що є великою помилкою . Буду радий, якщо ви можете допомогти мені налагодити це!

Те ж саме відбувається і з "1" і "2", те ж саме з "7" і "8" лише для клавіш в одному рядку. Оскільки це поточний проект, я не можу розмістити свій код VHDL в Інтернеті :( Буду радий, якщо ви можете дати мені поради щодо подолання цього!

введіть тут опис зображення

Нижче я не завантажую свій код на плату, не працює код. Підключившись Pin5до землі, одним натисканням на 1,2,4,5,7,8, *, 0 не вмикається Pin3світлодіод, але якщо я натискаю 6, а потім 4 одночасно Pin3світлодіод увімкнено, і Pin7світлодіод все ще вмикається , але коли мій код працює, цього не відбувається. Можливо, я пов’язав щось не так, і на щастя Pin7, я не знаю ...

введіть тут опис зображення

Нижче наведено схеми плати клавіатури:

Схематика


Як ви гарантуєте, що одночасне натискання 4 і 6 не має коротких штифтів 3 і 5?
fru1tbat

@ fru1tbat Ви можете розробити короткий трішки більше? Не завантажуючи свій код, коли на платі нічого не ввімкнено, я підключаю pin5 до землі, потім індикатор pin5 горить, потім натискаю кнопку "6" pin7 світлодіод увімкнено пізніше, на цей раз натискаю одночасно "4" і "6" pin3 Світлодіодний індикатор увімкнено, а індикатор pin7 все ще вмикається.
Анаркіє

@То ти маєш на увазі, що я повинен використовувати підтягування для рядків і підтягування для стовпців? Я не можу змінити схему. Також не дуже зрозуміли з вашого коментаря :(
Anarkie

Щоб бути більш повною, я надам відповідь. Було б корисно, якщо ви могли б надати схематичне зображення резисторів, світлодіодів, драйверів стовпців та будь-яких інверторів чи транзисторів, які можуть бути в ланцюзі. Чи 4 рядки та 3 стовпці підключені безпосередньо до CPLD або FPGA?
Тут

@Tut Клавіатура не підключена безпосередньо до FPGA, є ще одна плата між ними, для підключення різних плат до FPGA, і я додав схеми.
Анаркіє

Відповіді:


4

Коротка відповідь:

Інвертуйте свою логіку. Наведіть рядки вибору стовпців з логікою відкритого стоку (або відкритого колектора), коли вибраний стовпчик знижений, а невибрані стовпці плавають. Якщо ви подивитесь на рядок, натискання клавіші буде виявлено символом "0". Не натиснуті клавіші будуть виявлені символом "1".

Тепер деталі:

Як зазначає EEIngenuity, коли ви натискаєте 2 кнопки в одному рядку, це призводить до короткого замикання між відповідними стовпцями. Ця проблема (та інші проблеми, пов’язані з декількома натисканнями клавіш), як правило, долається в матриці клавіатури , додаючи діод послідовно з кожним вимикачем.

Оскільки додавання діодів не є варіантом для вас, вам потрібно буде плавати виходами вашого неактивного вибору стовпців, щоб уникнути спроб привести їх до протилежної полярності, як вибрали ваш активний стовпець. Це робиться за допомогою логіки відкритого стоку. Якщо вибрані стовпці прив’язані безпосередньо до CPLD або FPGA, ви повинні мати змогу виконати це у своєму коді VHDL.

На фото у вашому запитанні видно, що у вас є резистор, що підтягується, на кожному стовпчику та кожному рядку. Підтяжки на стовпчиках непотрібні, але нічого не зашкодять. Підтягування на кожному ряду забезпечить високий стан, якщо не буде виведено низький драйвер відкритого стоку на стовпчику (через закритий перемикач).

Я повинен був зробити деякі припущення щодо вашої схеми, оскільки ви не надали повну схему або свій код VHDL. Ти кажеш

коли не натискається жодна клавіша, що є умовою pin4pin6pin7pin2 = "0000"

але на наданому вами фотографії показано підтягуючі резистори. Це означає, що у вас вже є десь інверсія логіки, можливо, у вашому коді VHDL або (що менш вірогідно) інверторах між рядками та логічним пристроєм (CPLD або FPGA).

Редагувати:

Згідно з вашим коментарем, ви використовуєте негативну логіку у своїх описах: "0000" вказує, що всі чотири штифта є високими тощо. При цьому, якщо припустити, що вибрані стовпці та сигнали рядків переходять безпосередньо від роз'єму 2 на схемі до FPGA, просто виконайте мої вказівки вище, використовуючи логіку відкритого зливу для вибору стовпців у FPGA.

Я не VHDL експерт, але це я знайшов у Xilinx :

Введіть буфер відкритого зливу за допомогою наступного коду:

VHDL:

dout <= 'Z', коли din = '1' else '0';

Також на вашій схемі зауважте, що всі світлодіоди показані провідними назад. Аноди йдуть до обмежуючих струмів резисторів, а катоди - до сигнальних ліній. Світлодіоди загоряються, коли сигнальні лінії знижуються.


Я збираюся просканувати схеми, встановивши драйвер сканера
Anarkie,

Ви маєте рацію щодо того pin4pin6pin7pin2 = "0000", що насправді немає жодного натискання клавіш 1111. У моєму запитанні 1 має бути 0, 0 має бути 1, я спробував трохи
перекрити

Я додав схеми.
Анаркіє

велике спасибі за ваші пояснення, після прочитання вашої відповіді я маю кілька ідей, але спершу, що ви маєте на увазі під "стовпцями пливуть", "потрібно плавати виходами", поплавком ви маєте на увазі: 110, 101, 011? Це я вже роблю, насправді в моєму коді, коли натискається клавіша, усі інші клавіші слід ігнорувати, я просто не розумію, як світлодіод вимикається і pin7 стає високим (1), поки код працює. У будь-якому випадку, якщо я зрозумів, що це правильно, ваше рішення пропонує під час сканування pin5, вихідних портів "110", я повинен мати out <= 'pin3' when din='1' else '0';
Anarkie

1
Подивіться на надане я посилання: open-drain (або open-collector) . Активний стовпець вибирається, рухаючи 0В на цьому рядку стовпця. Неактивні стовпчики НЕ повинні вестись із 3.3V на цій лінії, а повинні бути плаваючими (переведеними у стан високого опору), що ефективно відключає ці лінії від ланцюга. Якщо ви спробуєте привести їх до 3,3 В, коротке замикання, створене одночасно натисканням двох кнопок в одному рядку, спричинить суперечку між одним, хто намагається заїхати низько, та іншими, які намагаються підняти високу.
Тут

2

Оскільки ви використовуєте VHDL і у вас є асинхронний ввід, я пишу цю відповідь, щоб переконатися, що ви вжили запобіжних заходів. Я не впевнений, чи це ваше питання, але це дуже добре могло б бути.

Дивіться запитання, яке я задав деякий час тому: VHDL: отримання модуля випадковим чином виходить з ладу під час підрахунку біт

Тепер ви кажете, що:

Оскільки "0000" виявлено як не натиснута клавіша, державна машина переходить із стану в стан. Утримуючи 4 і 6, якщо один натискає і залишає 4 кілька разів, його виявляють як 6 натискають кілька разів, що є великою помилкою.

Що дещо схоже на те, з чим я стикався. У мене виникло питання, де мій державний апарат пропускатиме штати, що здавалося неможливим.

Якщо ви прочитаєте відповіді на зв'язане вище питання, побачите, що рекомендується додати в рядок введення синхронізатор перед тим, як він буде поданий у ваш стан машини. Зазвичай це робиться за допомогою двох D фліп-флопів серії:

введіть тут опис зображення

Не синхронізація введення кнопки з вашим HW спричиняє дуже химерні проблеми, які виникли у мого проекту N64. Додавання цього маленького HW було майже як магія.

Тому спочатку перевірте, чи синхронізація ваших даних.


Реалізувати синхронізатор на відповідь не здається складною, але коли я читаю процес, я розумію, що async_inце затримується з 3 циклами годин, але його значення і все те саме?
Анаркі

Велика різниця полягає в тому, що ваш сигнал буде перетворений з асинхронного в синхронний. Що трапляється в HW іноді з асинхронними сигналами (як ваші кнопки), це те, що біти знаходяться в «метастабільності», це викликає дуже дивні помилки в HW. Використовуючи фліп-флоп D, переконайтесь, що метастабільність у вашій конструкції не спостерігається. Я також скептично ставився до ефективності цього, але це вирішило моє питання ідеально.
Нік Вільямс

Я спробував це, варто було спробувати, але не допомогло :(
Anarkie

1

Це цікаве питання! Причина, коли ви натискаєте клавішу4 і клавішу6, низька на pin7, - це через pin3 та pin5.

Щоб пояснити далі, pin3 та pin5 ніколи не будуть високими - один з них завжди буде шлях до землі (відповідно до вашого дизайну). Таким чином, натискаючи клавіші 4 та клавішу 6, ви створюєте шлях до землі для pin7.

Дивіться зображення:

Контакт 7 бачить шлях до землі.  У вас коротке замикання.


Я додав картинку до свого запитання, і pin7 виглядає високо ще при натисканні обох клавіш.
Анаркіе

ОП пояснив, що ні в один момент не піднімає штифт 3, 1 або 5 ВИСОКИ. Він послідовно виконує послідовності стовпців: "001", "010" і "100. Шпильки 3 і 5 ніколи не є ВИСОКИМИ одночасно для початку.
Нік Вільямс,

1
В цьому справа @EEIngenuity намагається зробити - між шпильками 3 і 5 є очевидний шлях, який ніколи не буде мати однакового значення ", таким чином, натискаючи клавішу 4 і клавішу 6, ви створюєте шлях до землі для pin7. "
fru1tbat

1
@Anarkie На зображенні Pin3 не підключений до GND або VDD. Це плаваючий вузол. Це не створює сценарій короткого замикання, який у вас є в початковій пробі. Спробуйте підключити штифт 3 до VDD і Pin5 до GND і повторіть цей тест.
Мірон V

1
@EEIngenuity Ви абсолютно праві !!! Так, так, коли я підключаю pin3 до VDD, pin7 стає низьким !!! Тож будь ласка, допоможіть мені, як я можу подолати цю проблему і змусити її працювати :( я використовую VHDL, а також інший колега, який знаходиться в одному проекті в іншій команді, не стикається з цією проблемою, тому я якось вирішив її, але я не Не знаю, як, та сама клавіатура, та сама дошка!
Anarkie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.