Есть прогресс, правда не все хорошо.
Думал, что вывод "СТОП" и зависание это одна проблема, но оказалось, что причина одна, а вот решения разные. "СТОП" появляется при первом считывании из регистра данный клавиатуры, а зависание - при втором.
При разработке пользуюсь докой "Однокристальный микропроцессор К1801ВМ1. Техническое описание. Версия 1.1 (January 26, 2019)" от [email protected] взятой где-то здесь. Так вот. По доке, проц при чтении выставляет активный "уровень на линии nDIN, далее микропроцессор переходит в состояние ожидания данных и сигнала подтверждения nRPLY", запускается специальный таймер и "Если сигнал подтверждения nRPLY не будет получен в течение 56..64 тактов CLC, то цикл обмена прерывается и возникает программное исключение по вектору 0000048 (или 1600028 - зависит от состояния битов PSW10 и PSW11)." Однако на практике оказалось другое - если Мега8 не успевает вовремя выставить nRPLY (не пойму по какой причине, но nDIN бывает разной длины: при нормальной работе - где-то 2-3мкс, при сбоях - 1.5мкс), то проц не сразу ждет, а "передергивает" nDIN (что делает - не знаю) и только после этого уходит в ожидание на 64 такта. Т.к. Мега определяет, что nDIN уже не активный - снимает nRPLY, а он получается коротким (по доке - должен быть не менее двух тактов проца) и уже игнорирует следующий активный nDIN с ожиданием в 64 такта. Проц, естественно уже не получает nRPLY и уходит в обработку исключений, т.е. в инициализацию контроллера клавиатуры с выводом надписи "СТОП". Немного оптимизировал код и поставил задержку в 1мкс - проблема со "СТОП" ушла.
Осталось зависание. Причина та же, но вот проц не уходит в ожидание, а зависает. В принципе от него тоже избавился оптимизацией кода (все-таки переход на Мегу8 сказывается - надо байт делить между портами), но вылезла другая "бяка" - коды клавишь "O", "G" и "C" не правильно выводятся, т.е. вместо "О" выдает "/", вместо "G" - " ' ", вместо "C" - "#", правда иногда - все ОК. Анализ кодов показал, что портится бит 6 и только в кодах, где в младшем полубайте подряд идут 4, 3 и 2 единицы, т.е. 0x6F -> 0x2F, 0x67 -> 0x27, 0x63 -> 0x23. С остальными кодами вроде все хорошо. Вот как сейчас
Код:
ADL_WR=DATA_REG;
//ADH_WR |= AD6;
ADH_WR=DATA_REG_H;
но если разрэмить вторую строчку (хотя в кодах клавишь этот бит и так установлен), то коды выдает правильные, но появляется периодически зависание когда короткий nDIN.
Ну и последний вопрос. Где-то туплю. Есть код
Код:
if (sc==0x11)
{
if (ext)
{
ext=0;
lat = 2; //R_ALT=LAT
kk++;
}
else lat=4; //L_ALT=RUS
}
Этот кусок по идее переключает РУС-ЛАТ. По левому Alt (код 0x11, т.е. sc=0x11, ext=0) должен включиться режим РУС, по правому Alt (код 0xE0 0x11, т.е. sc=0x11, ext=1) - ЛАТ. По умолчанию режим ЛАТ, т.е ext=0 и lat=2. По идее при нажатии лев. Alt должен переключиться режим на РУС. Но в этот режим переключается только при втором нажатии на лев. Alt (всегда). Режим ЛАТ переключается сразу по нажатию прав. Alt.
Обновил исходники
https://drive.google.com/file/d/1q8r...ew?usp=sharing
- - - Добавлено - - -
Разобрался с кодами клавиш - поменял строчки местами, т.е.
Код:
ADH_WR=DATA_REG_H;
ADL_WR=DATA_REG;
и все стало нормально работать - переходные процессы??? ))))))
- - - Добавлено - - -
С РУС-ЛАТ тоже разобрался.