Свежие обсуждения
Консультации

Измерение скорости нажатия клавиши

1 3

Собственно сабж. При нажатии на клавишу сначала замыкается один контакт затем другой. Нужно как то посчитать время... все это на АВРе. Пробую - нихрена не получается, сильно зависит от количества нажатых одновременно клавиш )

 

BCluster:
нихрена не получается
А в чём проблема? И почему надо всю клавиатуру подключать?
Одну клавишу подключили, и замеряйте. Организуйте програмный счётчик, побольше разрядности.
Первый контакт замкнулся, пошёл счёт. Второй замкнулся, прекратился. Значения вывести на какой-нибудь индикатор.
Ну, ещё надо служебную кнопочку сделать, что б счётчик сбрасывать. А можно и при отпускании клавиши сбрасывать.

 

Gregory: И почему надо всю клавиатуру подключать?
предлагаете отдельный процессор на каждую клавишу?
---
поскольку речь о клавишах, а не о кнопках - это музыкальный инструмент?
я так понял он не может распаралелить вычисления, чтоб обработка разных клавиш не мешала друг другу

 

AnSi:
отдельный процессор на каждую клавишу?
Это я, видимо, неправильно вопрос понял.
Просто, если для эксперимента, выяснить время между замыканиями, для дальнейших расчётов в программе, тогда - одно.
А если это - уже о программе, тогда, естественно, всю клавиатуру. Здесь надо "отрабатывать" все ветви программы. И, желательно, на Асме.

 

для "ориентировки" можно на осцилографе посмотреть, или к звуковой карте подключить
без ориентировочных величин и "шага" отсчёта посоветовать сложно

 

Может надо сделать массив памяти с записью текущего состояния свободно вращающегося таймера для каждой кнопки? Только для ненажатых будет "0", а для нажатых всегда больше 0, т.е. если попадете на 0, пишите 1. Тогда при повторном нажатии контроллер сравнит текущее сост таймера и сохраненное и вычислит время пролета клавиши. Вроде быстро должно работать. Только таймер нужен длинный, так что и ячейки памяти будут двойные. При количестве кнопок 128 в 256 байт уже не уложимся, нужны еще ячейки под стек. Контроллер будет нужен другой. У вас какой?

 

А зачем два байта? У ненажатой кнопки значение счётчика =0. При замкнутом первом контакте и разомкнутом втором значение счетчика увеличиватся на единицу при каждом сигнале от таймера. Если замкнуты оба контакта, значение счётчика не изменяется, если оба контакта разомкнуты - счётчик обнуляется. Только здесь надо оценить хватит ли времени на опрос и запись сотояния всех клавишь за один период таймера от длительности которого зависит точность определения времени.

 

SAK: А зачем два байта? У ненажатой кнопки значение счётчика =0. При замкнутом первом контакте и разомкнутом втором значение счетчика увеличиватся на единицу при каждом сигнале от таймера. Если замкнуты оба контакта, значение счётчика не изменяется, если оба контакта разомкнуты - счётчик обнуляется. Только здесь надо оценить хватит ли времени на опрос и запись сотояния всех клавишь за один период таймера от длительности которого зависит точность определения времени.

ребята, все почти так и сделано.
есть таймер, который постоянно инкрементируется. при нажатии на клавишу (1контакт) происходит запись значения в ячейку массива, соответствующую данной клавише. при замыкании 2 контакта считается разница тиков таймера.
но блин, при одинаковой скорости нажатия, почти всегда получается одинаковое значение, что хорошо, но иногда вылазит астрономически большое. Тут и вопрос, откуда оно берется.
Попозже постараюсь код выложить, просто сейчас он в таком виде, что показывать людям стыдно

Контроллер большое достаточно, ATMega16

 

BCluster, вот я поэтому и говорил, что сперва надо выяснить реальное время. Поскольку построение программы во многом от него зависит. Ведь, если оно составляет пол секунды, так можно и без таймера обойтись.

P.S.: А не проще ли было всё-таки просто приделать МИДИ-выход?

 

BCluster: считается разница тиков таймера
BCluster: но иногда вылазит астрономически большое

а разницу считаешь правильно? - учитываешь что таймер при переполнении сбрасывается?
т.е. если начальная цифра F0 , а конечная FF , то разница =F
а если конечная например 02 - после переполнения счётчика - сколько получается в вашей программе?
----
как ваша программа себя поведёт при "дребезге" контактов?
при НЕ замыкании первого или второго контакта(окисление) ?
если из-за окисления сначала замкнётся второй контакт, а затем первый ?