На базе разработки caro из данного топика скомплектованы конструкторы для самостоятельной пайки KEYB&SINC-2 для Орион и Радио-86РК (http://zx.pk.ru/showthread.php?t=14757).
Последний раз редактировалось zx-kit; 03.02.2012 в 17:27.
"L-256"
Попробую завтра сделать на ATMega8.
У ATMega8 есть 2 ноги (INT0, INT1), изменение напряжения на которых генерирует прерывание. Я подам на ножку INT0 сигнал с 36-ой ноги ВВ55 (это WR). Туда приходит сигнал, когда программа выбирает ряд для сканирования клавиатуры.
P.S. Это проще, чем найти нужный микроконтроллер мне.
Последний раз редактировалось vinxru; 18.03.2012 в 23:15.
Желательно добавить к WR/ сигнал CS/ (ножка 6 ВВ55),Сообщение от vinxru
иначе придется отрабатывать все сигналы записи и в память и во все порты ввода/вывода.
Для этого нужен один элемент ИЛИ, например из КР1533ЛЛ1.
А еще лучше сформировать сигнал записи в порт B PPI (A0=1, A1=0, WR/=0, CS/=0),
поскольку адрес сканирования изменяется именно после записи в этот порт.
Прошивку надо будет адаптировать под этот вариант схемы.Сообщение от vinxru
Последний раз редактировалось caro; 19.03.2012 в 10:11.
Тут четыре варианта.
1) Это делаешь ты
2) Ты даешь исходники, и я первый раз в жизни сажусь на AVR ассемблер.
3) Ты не даешь исходники, и я дизассемблирую их. Но это маловероятно
4) Я пишу на си вот такую программу
Итого за 1-2 часа справлюсь.Код:// Рассчитанный заранее ответ на все 256 комбинаций входного регистра unsigned char matrix[256]; // При получении сигнала WR сразу же меняем данные на выходе. interrupt [INT_EXT0] onWrChanged() { PIND = matrix[(unsigned char)PORTB); } // Нажатые клавиши PS/2 клавиатуры const int pressedMax = 8; int pressedCnt = 0; unsigned char pressed[pressedMax]; // Расширенные коды не учитываем. итого 255 возможных сканкодов. // Пиемник PS/2. Выполяется в основном коде, что бы прерывание могло максимально быстро отработать. void ps() { // Контроллируем на входе PS2 CLOCK изменение сигнала. Собираем принятые биты в пакет, // проверяем где начинается пакет и заполняем/очищаем массив pressed[] } unsigned char decodeR[256]; // Таблица соответствия, если горит индикатор РУС. unsigned char decodeE[256]; // Таблица соответствия, если не горит индикатор РУС. void mainLoop() { while(1) { // Выбранная таблица. unsigned char* decode = (PINC&4) ? decodeR : decodeE; // Рассчитываем ответ для 256 комбинаций входного регистра for(int i=0; i<256; i++) { unsigned char d=0; for(int j=0; j<pressedCnt; j++) { char x = decode[pressed[j]]; // В битах 0..2 зашифрован ряд, в 3..5 столбец. if(i & (1<<(x&7)) d |= 1<<((x>>3)&7); ps(); // Обрабатываем PS/2 } matrix[i] = d; // Обновляем выход даже без сигнала WR if(POTRB==i) PINB = d; } // Рассчитываем клавиши СС, УС, РУС и СБРОС unsigned char d=0; for(int j=0; j<pressedCnt; j++) { char x = decode[pressed[j]]; // В битах 6..7 зашифрованы эти кнопки d |= 1<<(x>>6); ps(); // Обрабатываем PS/2 } PINC = d; } } // Еще надо поджечь на клавиатуре светодиод в соответствии RUS/LAT
Последний раз редактировалось vinxru; 19.03.2012 в 11:09.
Да не проблема.Сообщение от vinxru
Времени потратишь значительно больше, чем по 4-му варианту.Сообщение от vinxru
Здорово, мне пожалуй исправить схему и доработать прошивку за такое время не удастся.Сообщение от vinxru
Попробуй, может у тебя действительно быстрее получится
PS. Сигналом /RES на выходе контролллера клавиатуры придется пожертвовать, иначе не хватит ножек у МК.
Последний раз редактировалось caro; 19.03.2012 в 11:32.
Еще раз говорю, чистый WR не рекомендую, а то на каждую операцию записи придется отвечать.Сообщение от vinxru
На выход лучше порт B, данные можно выдать одной командой.Сообщение от vinxru
Вход адреса сканирования лучше с порта D, и с одной из линий порта C.Сообщение от vinxru
Не обязательно, поскольку можно задействовать один из индикаторов клавиатуры, например Scroll Lock.Сообщение от vinxru
Или одной ноги.Сообщение от vinxru
Можно мультиплексировать адреса и данные, тогда всё влезет, да еще останетсяСообщение от vinxru
Но это уже другая схема и прошивка.
Это понятно.
Лучше так сделать. Но это не сильно критично. Сканирование клавиатуры производится минимум двумя командами процессора 8080. Запись адреса, чтение данных. Это достаточно большой промежуток времени.
---------- Post added at 11:23 ---------- Previous post was at 11:22 ----------
Мне вот интересно, если я поставлю сдвиговый регистр на сигналы СС, УС, РУС, СБРОС. То заметит ли компьютер момент загрузки новых значений в регистр? Выходные сигналы можно затормозить конденсаторами.
---------- Post added at 11:26 ---------- Previous post was at 11:23 ----------
Я в вашей схеме не заметил входа сигнала РУС/ЛАТ. И в прошивке не заметил разницы между раскладками РУС/ЛАТ.
А сделать хочется. Это очень хорошая идея, менять прошивки в зависимости от светодиода.
Это неважная идея. Орионовский клавиатурный светодиод (атавизм от РК) вообще не надо эмулировать в виду того, что он включается программно, и при этом крайне слабо поддержан в драйверах, отличных от дефолтового (весьма примитивного) драйвера экрана от Монитора F800.
К примеру, в CP/M многие драйвера с поддержкой не двух регистров как у КОИ7 (РУС-ЛАТ), а четырех регистров как у АЛЬТ или КОИ8 (РУС-рус-ЛАТ-лат) отображают состояние не светодиодом, а формой курсора.
Последний раз редактировалось Error404; 19.03.2012 в 12:31.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)