1

Тема: ЯЗС - клавиатура

Всем привет.
Начал анализировать схему штатной клавиатуры ЯЗС, размещённую здесь: http://agatcomp.ru/agat/Hardware/SoundNCL/jzskey.shtml
Предполагаю, что на схеме неправильно обозначено направление диодов, включённых последовательно с контактами клавиш.
Когда все клавиши отпущены, входы X0-X7 мультиплексора D5 подтянуты к GND и на них "0". Стало быть, и на выходе Y - тоже "0". Допустим, на входах D5 и D2 установлены нули, при этом на выходе 0 D2 должна быть "1", на остальных - "0". При этом нажимаем крайнюю левую клавишу. На катод диода подаётся "1", но, так как диод заперт обратным напряжением, то на вход X0 мультиплексора D5 ничего не подаётся, он остаётся подтянут к GND. Таким образом, на выход Y тоже ничего не идёт. Т.е. при нажатии клавиши ничего не меняется, клавиатура просто не работает. А вот если диод перевернуть, то с выхода 0 дешифратора D2 уровень "1" через диод пойдёт на вход X0 мультиплексора D5 и появится на выходе Y.

avivanov76, у меня большая просьба. Если есть возможность, снять логическим анализатором сигналы на разъёме клавиатуры, подключенной к ЯЗС при работающей программе, опрашивающей клавиатуру. Интересуют состояния и времянки сигналов при нажатии и отпускании клавиш, начиная с самой первой (все не нужно, достаточно первые 3-5). И при одновременном нажатии нескольких (достаточно трёх) клавиш, подряд и через одну.

2

Re: ЯЗС - клавиатура

Подтверждаю, диоды включены анодами к дешифратору, катодами к клавишам. На схеме нарисовано неправильно. Кстати, поскольку в трех октавах 36 клавиш, а выходов дешифраторов 16, то общих групп в клавиатуре не 2, а 3. Соответственно, у мультиплексора D5 используются 3 входа (X0, X1, X2).

Анализатора у меня нет, только двухканальный осциллограф, но по идее этого должно хватить. Там весь обмен управляется линиями ВЗД и IRQ.

3 Отредактировано garnizon (17-03-2021 10:28)

Re: ЯЗС - клавиатура

avivanov76 пишет:

поскольку в трех октавах 36 клавиш, а выходов дешифраторов 16, то общих групп в клавиатуре не 2, а 3. Соответственно, у мультиплексора D5 используются 3 входа (X0, X1, X2).

Точно, а еще я там накосячил с количеством подводов к клавишам от каждого входа мультиплексора. Надо 16 а я 12 как в октаве :) Все исправлю.

4

Re: ЯЗС - клавиатура

http://agatcomp.ru/agat/Hardware/SoundNCL/jzskey.shtml

5 Отредактировано AlexBel (27-04-2021 21:08)

Re: ЯЗС - клавиатура

Ещё немного посмотрел схему клавиатуры. Если правильно понял, упрощённый принцип действия такой: При низком уровне входного сигнала DReq (запрос данных) на выход данных выставляется текущий номер клавиши, установленный бит 7 указывает на то, что клавиша нажата. При этом на выходе IRQ выставляется высокий уровень. В компьютере срабатывает прерывание и программа обслуживания прерывания считывает номер клавиши и её состояние (в общем, байт данных) и передаёт в основную программу (MUSAGED или другую). До конца принцип работы ещё не понял, нужно копать дальше.
Пока что под вопросом:
1. Статическая память - буфер, в котором запоминается состояние клавиш и передаётся вместе с их номером?
2. Не ошибся ли с активными уровнями DReq и IRQ?
3. Какая длительность активного уровня IRQ?
4. При запросе данных выдаётся состояние текущей клавиши и производится инкремент её номера?
Если кто-то разбирался в схеме, возможно, даст ответ на эти вопросы.

6 Отредактировано avivanov76 (05-05-2021 00:40)

Re: ЯЗС - клавиатура

Клавиатуру пришлось подвергнуть мелкому ремонту - внутри отвалились 3 проводка: болталась земля от разъема наушников, отвалился провод от общей шины и отвалился разряд D0. Чтобы последний припаять пришлось разобрать всю клавиатуру полностью, а потом медленно и печально все 36 контактов от обеих плат просовывать в направляющие, а потом в рычаги клавиш.

Пока я проверил клавиатуру автономно (только питание на нее подал), но мне этого хватило, чтобы понять, как она работает. Кстати, неплохо бы номера элементов подписать на схеме.

====

Клавиатура работает следующим образом. На элементах D9.2 и D9.3 собран тактовый генератор с частотой примерно 33 кГц. Импульсы с него поступают на формирователь фаз D7.1. Тактирование может быть в любой момент остановлено при подаче логической "1" на вывод 1 D9.1.

На триггере D7.2 сделан делитель на 2. Импульсы с частотой 8,3 кГц с него поступают на схему сканирования клавиатуры на счетчиках D1.1, D1.2, дешифраторах D2, D3 и мультиплексоре D5.

Для музыкальной клавиатуры необходимо точно фиксировать не только момент нажатия клавиш, но и их отпускания. В связи с этим нужно хранить состояние каждой клавиши в момент предыдущего опроса. Для этого используется ОЗУ D6.

Сканер клавиатуры имеет два цикла работы:
1) сравнение текущего состояния клавиши с ранее сохраненным в D6;
2) запись текущего состояния клавиши в D6.

Первый цикл выполняется при низком уровне на выводе 3 D1.1. Состояние текущей сканируемой клавиши запоминается в триггере D8.1, одновременно из ячейки ОЗУ D6 с номером текущей клавиши считывается ранее записанное состояние, после чего элементом D4.2 выполняется сравнение текущего и ранее записанного состояний. После этого результат сравнения запоминается в триггере D8.2. Если состояние клавиши изменилось, в триггер записывается логическая "1". Это приводит к остановке тактирования схемы и подаче высокого уровня на выход IRQ.

Схема остается в этом состоянии до тех пор, пока на вход !DREQ не будет подан низкий уровень. В это время номер клавиши и ее состояние могут быть считаны на выходах D0-D7. Разряды номера клавиши выдаются на выходы D0-D6 в инвертированном виде. Состояние клавиши выдается на выход D7 ("1" - нажата, "0" - отпущена).

Подача низкого уровня на вход !DREQ приводит к сбросу триггера D8.2, переводу сигнала IRQ в низкий уровень и возобновлению опроса клавиатуры. Данные на выходах D0-D7 при этом сохраняются еще примерно 120 мкс.

Второй цикл выполняется при высоком уровне на выводе 3 D1.1. Этот уровень поступает на вход разрешения записи D6. При этом в ячейку ОЗУ D6 с номером текущей клавиши записывается ее состояние, зафиксированное в первом цикле в триггере D8.1. Во время второго цикла элемент D9.4 блокирует запись в триггер D8.1.

После завершения двух циклов происходит переход к следующей клавише. Сканер клавиатуры поддерживает до 128 клавиш в матрице. Период сканирования составляет примерно 31 мс. Наличие этого интервала между записью предыдущего состояния клавиатуры и проверкой текущего обеспечивает защиту от дребезга контактов.

7 Отредактировано AlexBel (30-04-2021 18:08)

Re: ЯЗС - клавиатура

Большое спасибо за подробное описание работы схемы! И большая просьба, если можно, сделать образы дисков с программами, работающими с ЯЗС и её штатной клавиатурой. Как я понял, таких программ, как минимум, две: Gnomes и Musaged. К сожалению, имеющийся у меня архив музыкального софта потерян. Я читал тему на форуме по разбору музыкального софта, взял оттуда "Гномов", но, возможно, есть более свежая информация и более актуальные версии программ, которые ещё не успели попасть на форум и сайт? Из непроверенных узлов собранной реплики ЯЗС остался клавиатурный порт, хотелось бы проверить и его тоже. Конечно, можно просто написать программу, которая это делает, но, на мой взгляд, лучше проверять со штатным софтом.

8

Re: ЯЗС - клавиатура

ЯЗС установлена в слот 1. Через Бейсик читаю порт клавиатуры:

10 A = PEEK($C090)
20 PRINT A

При отключённом разъёме клавиатуры считывается значение 63 (0x3F). Пробовал принудительно устанавливать на входе 0x00, 0x80, 0x81. Во всех трёх случаях считывается 31 (0x1F) вместо 0xFF, 0x7F, 0x7E.  Предполагаю проблему в схеме (ещё не проверял), и хочу попросить попробовать считать состояние порта при отключённой клавиатуре и при нажатых клавишах 0 и 1.

9 Отредактировано avivanov76 (02-05-2021 00:52)

Re: ЯЗС - клавиатура

Думаю, здесь ошибка в описании.
Порт клавиатуры должен читаться при A2=1, а флаги прерываний при A2=0. Надо попробовать PEEK($C094).

В программах, использующих клавиатуру, чтение выглядит так:

M
        LDA    DATA_C090
        AND    #$20
        BEQ    M
        LDA    DATA_C094

10

Re: ЯЗС - клавиатура

avivanov76 пишет:

Думаю, здесь ошибка в описании.

Да, очепятка... ;)

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

11 Отредактировано AlexBel (02-05-2021 11:55)

Re: ЯЗС - клавиатура

avivanov76 пишет:

Думаю, здесь ошибка в описании.
Порт клавиатуры должен читаться при A2=1, а флаги прерываний при A2=0. Надо попробовать PEEK($C094).

В программах, использующих клавиатуру, чтение выглядит так:

M
        LDA    DATA_C090
        AND    #$20
        BEQ    M
        LDA    DATA_C094

На основе этого примера сделал так:

LOOP:  LDA $C090
       AND #$20
       BEQ LOOP
       LDA $C094
       JSR $18EC ; Печать в хексе из A
       LDA #$0D
       JSR $18C9 ; Перевод строки
       JMP LOOP
       RTS

При нажатии первой клавиши выводится 0x80, при отпускании 0x00. Для второй клавиши, соответственно, 0x81 и 0x01. И так далее. Делаю вывод, что порт клавиатуры работает правильно. С программой "Семь гномов" проверить не удалось. Программа MUSAGED (во всяком случае, та версия, что я нашёл у себя) не работает. При запуске она загружается (в процессе загрузки появляется символ звёздочки), потом раздаётся звуковой сигнал и вываливаюсь обратно в командную строку. Запуск MIDIGED происходит похоже, но после звукового сигнала появляется нотный стан, т.е. запускается программа нормально. В общем, тот MUSAGED, что у меня, не работает. При его запуске на "девятке" в слоты установлена только ЯЗС (слот 1) и контроллер дисковода (слот 5).

12 Отредактировано AlexBel (03-05-2021 09:47)

Re: ЯЗС - клавиатура

Для проверки внешнего порта ЯЗС и для имитации работы её штатной клавиатуры было изготовлено вот такое устройство:

Spoiler

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=928&download=1

На плате гнёзда RCA для двух линейных выходов (подключаются левый и правый стереоканалы), стандартный вход для MIDI-интерфейса с оптронной развязкой, разъём для подключения к ЯЗС, микроконтроллер, принимающий MIDI-сообщения о нажатии и отпускании клавиш и передающий эту информацию во внешний порт ЯЗС. Кнопки сброса и управления, светодиоды - для отладки и для возможных дополнительных функций.
Для теста была использована небольшая программа из предыдущего сообщения, полученная информация говорит о работоспособности внешнего порта ЯЗС.
Проверить работу штатного софта ЯЗС с клавиатурой не могу, так как для этого у меня нет ни одной работоспособной программы.

Post's attachments

Attachment icon IMG_20210503_074051.JPG 629.77 kb, 315 downloads since 2021-05-03 

13

Re: ЯЗС - клавиатура

При помощи программы "Сложный контрапункт", выложенной на сайте, я, наконец, смог нормально проверить работу ЯЗС. Программа вводит ноты с музыкальной клавиатуры и воспроизводит их через ЯЗС. Как Игорь и написал в теме про музыкальный софт, таинственный "CA51" оказался ЯЗС5.1. Так что собранная плата работает полностью.

14 Отредактировано LeoN (05-05-2021 09:50)

Re: ЯЗС - клавиатура

avivanov76 пишет:

Должно быть наоборот:

Чтение:
•Все регистры с битом адреса A2 = 0: побитно: ...
•Все регистры с битом адреса A2 = 1: внешний параллельный порт. Также эта операция сбрасывает флаг запроса прерываний от внешнего устройства. Такое сочетание косвенно указывает на то, что внешнее IRQ выставлялось тем же устройством, которое передавало данные через параллельный порт.

Да, верно.

avivanov76 пишет:

•Все регистры с битом адреса A2 = 0: побитно:D7 = 0 - было прерывание от таймера/счётчика, D6 = 0 - было внешнее прерывание, D5 - текущее состояние входа внешнего прерывания. Остальные биты не используются и равны единице.

А здесь неверно - должно быть не нулем, а единицей в соответствующем разряде данных! avivanov76, ну посмотри по схеме сколки...

И по схеме ("D8:1-1,2 и D8:2-4,5 (информационные и управляющие входа, похоже, что перепутаны) - явный косяк, вероятно поменять местами 1 на 2 и 4 на 5") до сих пор косяк не исправили...

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

15

Re: ЯЗС - клавиатура

LeoN пишет:

А здесь неверно - должно быть не нулем, а единицей в соответствующем разряде данных

Да, так и есть. Я что-то не ожидал тут ошибки и не проверил. Должно быть:

Чтение:
•Все регистры с битом адреса A2 = 0: побитно: D7 = 1 - было прерывание от таймера/счётчика, D6 = 1 - было внешнее прерывание, D5 - текущее состояние входа внешнего прерывания. Остальные биты не используются и равны единице.

Если смотреть совсем строго, то могут быть варианты, когда вообще неизвестно что из этих разрядов прочтется. Если прерывание было, то выходы ЛП8 закрыты. И уровень будет определяться напряжением, до которого успеет зарядиться емкость монтажа через подтягивающие резисторы. То есть, если недавно на шине был "0", то до "1" емкость может и не успеть зарядиться.

LeoN пишет:

И по схеме ("D8:1-1,2 и D8:2-4,5 (информационные и управляющие входа, похоже, что перепутаны) - явный косяк, вероятно поменять местами 1 на 2 и 4 на 5")

Ну, это косяк разработчиков. Я, кстати, перепрозванивал плату - все так, как на схеме. Мне тоже это место жутко не нравится. Например, если все прерывания разрешены, но ни одного запроса не поступило, то на внутреннюю шину светят "1". И если попытаться читать внешний порт, то эти единицы будут смешиваться с выходами АП3. Но я не знаю, кто должен принять решение - исправляем мы железячные косяки или сохраняем все как есть.

Кстати, на эту тему еще надо проанализировать софт, пользующийся прерываниями. Не исключено, что на этот косяк что-то уже завязано в коде. MUSAGED, "Семь гномов" и "Сложный контрапункт" я уже смотрел и там, на первый взгляд, ничего такого нет, но есть еще MECCANO.

16

Re: ЯЗС - клавиатура

avivanov76 пишет:

Ну, это косяк разработчиков.

Ох!"№;%:?*ть... Чесслово!

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).