Вверх ↑
Этот топик читают: Гость
Ответов: 899
Рейтинг: 43
#1: 2008-07-30 23:51:20 ЛС | профиль | цитата
Покажите пример схемы для опроса клавиатуры подключенной к LPT и выдающей код клавиши при ее нажатии и отпускании.

[size=-2]------ Добавлено в 23:51
Вот наваял приблизительно схему(в самой клавиатуре дешифратор и диодная матрица с кнопками)
code_2261.txt

Пока клавиатуры нету, проверить не на чем, поправьте если что не так
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 1code_2261.txt [1.5KB] [214]
Ответов: 8926
Рейтинг: 823
#2: 2008-07-31 00:51:36 ЛС | профиль | цитата
unalex, в LTP без дополнительных устройств есть 8 выходов (ножки2-9 разъёма) и 5 входов (ножки 15, 13, 12, 10, 11 разряды байта 3,4,5,6,7, причём 3 и 7 инверсные, а в трёх младших разрядах 011 - стоит сумма 6)- можно сразу подсоединить 40 шт клавиш (одновременно можно нажать 5 клавиш в разных рядах), если поставить дешифратор на выходе (8--256), то можно обработать 256х5=1280 шт клавиш.
Не замкнутые на корпус входы дают на выходе 1, поэтому никуда не подсоединённый порт читается 126 (128-8+6), завтра найду кабель (у меня есть с припаянными светодиодами) и проверю точно какая должна быть математика для обработки. code_9610.txt
карма: 19

0
файлы: 1code_9610.txt [851B] [247]
Ответов: 899
Рейтинг: 43
#3: 2008-07-31 01:40:50 ЛС | профиль | цитата
Леонид, спасибо за ответ, пытаюсь переварить информацию

В устройстве 61 клавиша(музыкальный инструмент)Необходима возможность одновременного нажатия нескольких клавиш, т.е я так понял, нужен динамический опрос клавиатуры

Получается в течении каждого цикла опроса я должен сохранить в массиве данные о состоянии всех клавиш, а в последующих циклах сравнивать состояние клавиш с предыдущими циклами, и в случае изменения состояния выводить номер клавиши? Или я неправильно понял принцип?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 8926
Рейтинг: 823
#4: 2008-07-31 12:04:05 ЛС | профиль | цитата
unalex, с этого надо было начинать. Без небольшого количества пайки здесь не обойтись - надо сделать развёртку 6-бит -- 64 выходнных линий (максимум 5 корпусов микросхем, если серия 155: К155ИД3 - 4 шт, К155ЛА3 - 1 шт ).
На кажой из этих линий поочерёдно появляется 0 и если клавиша нажата - этот 0 будет и на входе LTP, хоть все сразу нажимай
------------ Дoбавленo:

Вот:

Add(MainForm,14187007,28,98)
{
Left=20
Top=105
link(onCreate,11537040:doStart,[])
}
Add(LPT,13784985,231,119)
{
link(onStatus,12832022:doCompare,[])
}
Add(Thread,11537040,91,112)
{
Delay=1
link(onExec,8415713:doNext,[])
}
Add(Counter,8415713,140,112)
{
Max=60
link(onNext,3654578:doEvent1,[])
}
Add(Hub,3654578,182,112)
{
OutCount=4
link(onEvent1,650757:doCompare,[(222,118)(222,83)])
link(onEvent2,13784985:doData,[])
link(onEvent3,13784985:doCheck,[])
link(onEvent4,9118943:doCompare,[(222,139)(222,181)])
}
Add(If_else,650757,231,77)
{
Op2=Integer(0)
link(onTrue,15904317:doClear,[(362,83)(362,132)])
}
Add(If_else,9118943,231,175)
{
Op2=Integer(60)
link(onTrue,11839337:doEnum,[])
}
Add(StrList,15904317,371,119)
{
}
Add(If_else,12832022,273,119)
{
Op2=Integer(126)
link(onTrue,5995372:doWork1,[])
link(onFalse,5995372:doWork2,[])
}
Add(ArrayEnum,11839337,385,175)
{
link(Array,15904317:Array,[])
}
Add(ChanelToIndex,5995372,322,119)
{
link(onIndex,15904317:doAdd,[])
}
Add(InfoTip,15597934,427,98)
{
Info=#105:Здесь хранится и выдаётся по окончании цикла опроса массив состояния 61 клавиш: 0 - не нажата, 1 - нажата|
Width=106
Height=109
}

карма: 19

0
Ответов: 16884
Рейтинг: 1239
#5: 2008-07-31 12:17:23 ЛС | профиль | цитата
Леонид писал(а):
Без небольшого количества пайки здесь не обойтись
Ну а схема шифратора где?
Анекдот писал(а):

- Паять умеешь?
- Нет.
- Хреново...
- Хреново умею!

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#6: 2008-07-31 12:53:36 ЛС | профиль | цитата
Леонид писал(а):
на входе LTP

До каких пор вы все будете писать LTP. Настоящее название порта -- LPT, несерьезно, как-то...

------------ Дoбавленo:


Кстати, есть такая хитрая dll'ка -- inpout32.dll, которая позволяет управлять LPT-портом через стандартный драйвер NT, и которой совершенно не нужен драйвер HiAsm'a
------------ Дoбавленo:

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

http://www.pcports.ru/
карма: 22

1
Голосовали:Andrey
Ответов: 8926
Рейтинг: 823
#7: 2008-07-31 13:30:49 ЛС | профиль | цитата
nesco, во, никогда внимания не обращал, но LTP для русского языка выговаривается легче и привычнее, чем LPT, спасибо за уточнение.
С inpout32.dll скорость опроса порта на порядок выше на VB, (кстати на их сайте я увидел ссылку, похожую на хранитель экрана со сменяющимися картинками, перешёл в надежде скачать и попал на порнуху, да ещё там трояна мне подсунули, еле избавился).
Tad, если unalex-у нужно, нарисую и схему, даже спаять смогу, не смогу только по электронной почте отправить
карма: 19

0
Ответов: 9906
Рейтинг: 351
#8: 2008-07-31 13:53:39 ЛС | профиль | цитата
nesco писал(а):
Кстати, есть такая хитрая dll'ка -- inpout32.dll, которая позволяет управлять LPT-портом через стандартный драйвер NT, и которой совершенно не нужен драйвер HiAsm'a

Большенький уже вроде, а веришь всему, что написано на заборе



hwinterface.sys - это по твоему что


карма: 9

0
Ответов: 5227
Рейтинг: 587
#9: 2008-07-31 13:56:02 ЛС | профиль | цитата
Ну и что Вы тут динамите ? Леонид у меня 953-954 милисекунды весь цикл, крутая клава получится ;)

Как то я делал тест драйв LPT даже ветку где то заводил "Насколько шустрый LPT?" с дровами HiAsm, так вот на запись больше 1 милисекунды выдавить из него неудалось, доказательством того были осцилограмы снятые с LPT, если интервал вывода в порт меньше 500 микросекунд то импульса могло вообще небыть (пропуск)

code_9615.txt
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_9615.txt [1.6KB] [313]
Разработчик
Ответов: 26151
Рейтинг: 2127
#10: 2008-07-31 13:57:27 ЛС | профиль | цитата
Galkov писал(а):
а веришь всему, что написано на заборе

Ну, я в подробности не вдавался. Случайно нарвался на этот сайт.

И согласно твоему уточнению -- точно, заборное чтиво. А как красиво написано:

www.pcports.ru писал(а):
Если же она имеет дело с NT, то обращения к ней она конвертирует в запросы к стандартному драйверу ОС, через который и идет обмен информацией с портом


карма: 22

0
Ответов: 5227
Рейтинг: 587
#11: 2008-07-31 14:08:03 ЛС | профиль | цитата
Благодаря giveio.sys успешно отработают и такие ассемблерные письмена:

_asm
{
mov dx, 378h
mov al, 1
out dx, al
}


недаром его многие используют


карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 8926
Рейтинг: 823
#12: 2008-07-31 15:54:49 ЛС | профиль | цитата
andrestudio, а вот так измерить: code_9617.txt
------------ Дoбавленo:

вот так точнее:

Add(MainForm,14187007,28,35)
{
Left=20
Top=105
link(onCreate,11537040:doStart,[])
}
Add(LPT,13784985,217,56)
{
link(onStatus,12832022:doCompare,[])
}
Add(Thread,11537040,77,49)
{
Delay=0
link(onExec,8415713:doNext,[])
}
Add(Counter,8415713,126,49)
{
Max=60
link(onNext,3654578:doEvent1,[])
}
Add(Hub,3654578,168,49)
{
OutCount=4
link(onEvent1,650757:doCompare,[(208,55)(208,20)])
link(onEvent2,13784985:doData,[])
link(onEvent3,13784985:doCheck,[])
link(onEvent4,9118943:doCompare,[(208,76)(208,118)])
}
Add(If_else,650757,217,14)
{
Op2=Integer(0)
link(onTrue,15904317:doClear,[(348,20)(348,69)])
}
Add(If_else,9118943,217,112)
{
Op2=Integer(60)
link(onTrue,11839337:doEnum,[])
}
Add(StrList,15904317,357,56)
{
}
Add(If_else,12832022,259,56)
{
Op2=Integer(126)
link(onTrue,5995372:doWork1,[])
link(onFalse,5995372:doWork2,[])
}
Add(ArrayEnum,11839337,371,112)
{
link(onItem,13273243:doValue,[])
link(onEndEnum,3060915:doNext,[(426,125)(426,174)])
link(Array,15904317:Array,[])
}
Add(ChanelToIndex,5995372,308,56)
{
link(onIndex,15904317:doAdd,[])
}
Add(InfoTip,15597934,497,28)
{
Info=#105:Здесь хранится и выдаётся по окончании цикла опроса массив состояния 61 клавиш: 0 - не нажата, 1 - нажата|
Width=106
Height=109
}
Add(Label,8334067,497,217)
{
Left=130
Top=45
}
Add(Memory,13273243,434,112)
{
}
Add(Hub,898194,371,175)
{
link(onEvent1,12565322:doStrCat,[(419,181)(419,223)])
link(onEvent2,3060915:doReset,[])
}
Add(Timer,13660940,322,175)
{
link(onTimer,898194:doEvent1,[])
}
Add(Counter,3060915,434,168)
{
Max=9999999
}
Add(StrCat,12565322,434,217)
{
Str2=" циклов в секунду"
link(onStrCat,8334067:doText,[])
link(Str1,3060915:Count,[])
}

, правда надо учитывать, что могут быть перерывы в опросе на 10-20 миллисекунд - Windows всё-таки
карма: 19

0
файлы: 1code_9617.txt [1.5KB] [242]
Ответов: 9906
Рейтинг: 351
#13: 2008-07-31 15:55:00 ЛС | профиль | цитата
andrestudio, не парь народу мозги с 954-мя милисекундами

Вот корректная схема проверки: code_9618.txt

Которая у меня рассказывает, что на три обмена с портом уходит около 18 микросекунд
Отключи одну из линий в порту и посмотри разницу - именно это называется корректным экспериментом (могу даже сказать, что этому тоже учиться надо)
Да, 6 микросекунд на обмен -- относительно медленно. Спецификация ISA позволяет достигать 0.8 микросекунд на цикл шины ((правда я не видел людей, которые достигали этих высот))
Но это вовсе не то, о чем ты рассказываешь


Про пропуски сигналов, и экспериментальные результаты
Так они у меня тоже есть. И по-надежнее, чем визуальное наблюдение по осциллографу
У меня просто изделие сутками работает на производстве. И никто никаких защит в софте не ставил на "неправильность" обмена информацией

Просто мне известно, что у винды есть противная привычка - думать что там сидит действительный принтер
И, получивши какие-то сигналы с порта, отличные от default-ных, она САМА начинает туда лепить что-то по своему недалекому разумению
Слава богу, есть ситуации, когда ей это надоедает, и она прекращает умничать

У меня на разъеме один из входов (в моем железе это -ERR) намертво припаян на ноль (чтобы винда сразу же начала свой процесс "изучения принтера").
И в проге стоит защита против ее запуска в первые 5 минут просле перезагрузки компа.

Вот тебе и весь сказ


карма: 9

0
файлы: 1code_9618.txt [1KB] [298]
Ответов: 8926
Рейтинг: 823
#14: 2008-07-31 16:04:41 ЛС | профиль | цитата
Galkov, с Вашего разрешения я занесу
Galkov писал(а):
Просто мне известно, что у винды есть противная привычка - думать что там сидит действительный принтер
И, получивши какие-то сигналы с порта, отличные от default-ных, она САМА начинает туда лепить что-то по своему недалекому разумению
Слава богу, есть ситуации, когда ей это надоедает, и она прекращает умничать

У меня на разъеме один из входов (в моем железе это -ERR) намертво припаян на ноль (чтобы винда сразу же начала свой процесс "изучения принтера").
И в проге стоит защита против ее запуска в первые 5 минут просле перезагрузки компа.
в свою справку по LPT.
карма: 19

0
Ответов: 9906
Рейтинг: 351
#15: 2008-07-31 16:11:41 ЛС | профиль | цитата
Леонид, мы же с тобой это проговаривали несколько лет назад
В нашем возрасте - ну буквально вчера


карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)