Я имел ввиду, что по быстродействию они не отличаются.
Встроенный генератор у них у всех на 8 МГц.
Вид для печати
На базе разработки caro из данного топика скомплектованы конструкторы для самостоятельной пайки KEYB&SINC-2 для Орион и Радио-86РК (http://zx.pk.ru/showthread.php?t=14757).
Попробую завтра сделать на ATMega8.
У ATMega8 есть 2 ноги (INT0, INT1), изменение напряжения на которых генерирует прерывание. Я подам на ножку INT0 сигнал с 36-ой ноги ВВ55 (это WR). Туда приходит сигнал, когда программа выбирает ряд для сканирования клавиатуры.
P.S. Это проще, чем найти нужный микроконтроллер мне.
Желательно добавить к WR/ сигнал CS/ (ножка 6 ВВ55),Цитата:
Сообщение от vinxru
иначе придется отрабатывать все сигналы записи и в память и во все порты ввода/вывода.
Для этого нужен один элемент ИЛИ, например из КР1533ЛЛ1.
А еще лучше сформировать сигнал записи в порт B PPI (A0=1, A1=0, WR/=0, CS/=0),
поскольку адрес сканирования изменяется именно после записи в этот порт.
Прошивку надо будет адаптировать под этот вариант схемы.Цитата:
Сообщение от vinxru
Тут четыре варианта.
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
Времени потратишь значительно больше, чем по 4-му варианту.Цитата:
Сообщение от vinxru
Здорово, мне пожалуй исправить схему и доработать прошивку за такое время не удастся.Цитата:
Сообщение от vinxru
Попробуй, может у тебя действительно быстрее получится :)
PS. Сигналом /RES на выходе контролллера клавиатуры придется пожертвовать, иначе не хватит ножек у МК.
Еще раз говорю, чистый 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 (РУС-рус-ЛАТ-лат) отображают состояние не светодиодом, а формой курсора.