User Tag List

Страница 25 из 174 ПерваяПервая ... 212223242526272829 ... ПоследняяПоследняя
Показано с 241 по 250 из 1740

Тема: Реверс-инжиниринг УКНЦ (1515ХМ1&2, 1801ВП1, 1801ВМ2)

  1. #241

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию Исправленное описание контроллера клавиатуры

    Благодаря тестам Alex_K, нашел ошибку в полярности сигнала тактирования клавиатуры, и переписал описание.

    Исправленная схема

    Описание контроллера клавиатуры (исправленное)


    Тактовая частота контроллера клавиатуры CLK_KBD = 1/24 CLC. CLC = 6.25МГц (0.16мкс). Таким образом, период CLK_KBD = 3.84мкс. Из CLK_KBD формируется рабочая тактовая частота CLK_KBD1_16 = 1/16 CLK_KBD (период 61.44мкс), а так же вспомогательные фазы CLK_KBD_0B и CLK_KBD_0D.

    Счетчик CTR_KBD_Y, управляющий сканированием столбцов Y, тактируется CLK_KBD1_16, и считает циклически от 0 до 0x0F.
    Счетчик CTR_KBD_X, управляющий бегущим нулем на X, тактируется CLK_KBD1_16 * 16 (983.04мкс), считает циклически от 0 до 0x0F, причем, счет 0..0x7 - фаза нажатия клавиш, счет 0x08 - фаза отжатия клавиш, 0x09..0x0F - холостая фаза.

    Таким образом, один полный цикл опроса клавиатуры занимает 15728.64мкс (15.728мс), что равно почти целому кадру развертки.

    На каждый счет CTR_KBD_X, приходится полный цикл сканирования столбцов Y (1..15, 0-й столбец отсутствует).

    Код нажатой клавиши в регистре KBD_DATA формируется из текущего состояния обеих счетчиков. Старший полубайт - это счетчик CTR_KBD_X, младший полубайт - это счетчик CTR_KBD_Y.

    Остановка тактовой частоты CLK_KBD происходит по событию KEY_READY, которое, в свою очередь, формируется по заднему фронту события KEY_MISMATCH, которое формируется всякий раз при нажатии или отжатии клавиши.
    По чтению регистра данных клавиатуры KBD_DATA, снимается событие KEY_READY, и тактовая частота запускается заново.

    Бегущий ноль на линии X промодулирован частотой CLK_KBD1_16. Т.е. активен во время низкого уровня CLK_KBD1_16.
    В этой же тактовой фазе активен сигнал на выходе дешифратора DC_CTR_Y, который управляет сканированием линий Y.


    Основные модули контроллера:

    Y_MEMORY_A, Y_MEMORY_B и Y_MEMORY_C - регистры, запоминающие столбцы Y, в которых нажата хотя бы одна клавиша.
    Y_MEMORY_A - отражает текущее состояние столбцов, т.к. целиком очищается перед фазой сканирования, а устанавливается во время фазы сканирования.
    Y_MEMORY_B - отражает суммарное предыдущее и текущее состояние столбцов с нажатыми клавишами. Регистр не очищается после предыдущего цикла, а устанавливается аналогично Y_MEMORY_A во время фазы сканирования. Очистка Y_MEMORY_B происходит копированием содержимого Y_MEMORY_A во второй фазе цикла.
    Y_MEMORY_C - хранит предыдущую копию Y_MEMORY_B, и обновляется в тактовом цикле CLK_KBD_0D. На основе разницы Y_MEMORY_B и Y_MEMORY_C формируется событие нажатия/отжатия клавиши KEY_MISMATCH.


    Главный цикл опроса клавиатуры состоит из трех фаз - фазы определения нажатия клавиши, фазы определения отжатия клавиши, и холостой фазы.
    В свою очередь, один период CLK_KBD1_16 можно разделить на 16 тактовых циклов 0..15.


    Первая фаза - определение нажатия клавиш (счетчик CTR_KBD_X = 0x00..0x07):

    Такт 0..7:

    Ничего не происходит.

    Такт 8..15:

    На линии X, адресуемой счетчиком CTR_KBD_X, появляется активный ноль.
    На линиях Y, электрически связанных (вследствие нажатия клавиш) с активной линией X, появляются активные нули.

    Такт 11:

    Схемой COL_Y_COMP сигнал на выходе дешифратора сравнивается с входами порта Y. В случае наличия на соответствующeй линии нуля (нажата клавиша на пересечении ряда X, и столбца Y), в регистрах Y_MEMORY_A и Y_MEMORY_B устанавливается бит соответствующий столбцу Y. Если обновленное содержимое Y_MEMORY_B отличается от значения, зафиксированного в предыдущем цикле в Y_MEMORY_C, то возникает событие KEY_MISMATCH.

    Такт 13:

    В этом такте текущее значение Y_MEMORY_B переписывается в регистр последнего значения Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код нажатой клавиши. После чтения кода клавиши, тактирование CLK_KBD возобновляется.

    Такт 15:

    В конце этого такта (говоря иначе, в начале такта 0) снимается сигнал с линий X, вследствие чего пропадает сигнал и на линиях Y. Также отключается дешифратор DC_CTR_Y, управляющий компаратором COL_Y_COMP.



    Вторая фаза - определение отжатия клавиш (счетчик CTR_KBD_X = 0x08):

    Такт 0..7:

    Ничего не происходит.

    Такт 8..15:

    На линии X0, появляется активный ноль.
    На линиях Y, электрически связанных (вследствие нажатия клавиш) с линией X0, появляются активные нули,
    что является побочным эффектом, ввиду того, что схема сравнения COL_Y_COMP отключена.

    Такт 11:

    В этом такте в регистре Y_MEMORY_B сбрасывается текущий бит, если сброшен такой же бит в регистре Y_MEMORY_A.
    Таким образом, если Y_MEMORY_B все еще помнит клавишу, нажатую в предыдущем цикле, а в текущем цикле она была отпущена (отсутствует в Y_MEMORY_A), возникает событие KEY_MISMATCH.

    Такт 13:

    В этом такте сбрасывается бит в регистре Y_MEMORY_A, соответствующий линии Y. Т.е. фактически происходит очистка Y_MEMORY_A перед следующим циклом.
    Также переписывается Y_MEMORY_B в Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код отжатой клавиши. После чтения кода отжатия клавиши, тактирование CLK_KBD возобновляется.


    Третья фаза - холостая (счетчик CTR_KBD_X = 0x09..0x0F):

    Такт 0..7:

    Ничего не происходит.

    Такт 8..15:

    В этом такте так же появляется ноль на линиях X, однако это никак не используется.


    Влияние EP на опрос клавиатуры:

    EP блокирует установку нажатой клавиши в регистрах Y_MEMORY_A и Y_MEMORY_B в первой фазе цикла опроса.

    Помимо этого, EP запрещает бегущий ноль на линиях X.

    Также, EP разрешает вывод регистра KBD_BUS на линии Y. Кроме содержимого KBD_BUS (линии Y3..Y15), на линию Y2 выводится тактовая частота контроллера клавиатуры CLK_KBD, а на линию Y1 - сигнал чтения регистра KBD_BUS.


    Условно недокументированные особенности, возможности и ошибки:

    1. Поскольку код нажатия клавиши формируется в момент фактического нажатия, когда счетчики Y и X указывают на конкретную клавишу, в регистре KBD_DATA формируется полный код нажатой клавиши.
    Однако, код отжатия клавиши формируется уже после фактического отжатия клавиши, когда счетчик Y указывает на актуальный столбец, а счетчик X указывает на ряд 0. Поэтому в регистре KBD_DATA формируется неполный код отжатия клавиши, по которому можно определить лишь столбец Y, в котором отпущены все клавиши, но не ряд X.

    2. Из регистра KBD_BUS (177704) можно считывать состояние порта Y в реальном времени.

    3. Из регистра KBD_DATA (177702) можно считывать текущее состояние счетчиков CTR_KBD_X и CTR_KBD_Y. Причем, учитывая, что чтение счетчиков никак не синхронизировано с тактовой частотой контроллера клавиатуры, не исключена возможность чтения счетчиков в промежуточной фазе счета, когда одна часть счетчика уже установлена, а другая нет. Для того, чтобы понять, возможно ли такое попадание в середину фазы счета, надо изучать всю схемотехнику УКНЦ в целом.

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

    5. Возможно написание собственного опроса клавиатуры, т.к. программно доступны счетчики X, Y, и состояние порта Y. На практике же такой опрос будет очень медленным, из-за того, что полный цикл сканирования клавиатуры равен почти 16мс, что сопоставимо с размером одного кадра развертки (20мс).

    6. Все биты счетчиков CTR_KBD_X и CTR_KBD_Y сбрасываются по INIT, за исключением бита 0 счетчика CTR_KBD_X, который сбрасывается по DLCO.

    7. Следует заметить, что схема опроса клавиатуры имеет немалую логическую избыточность, и на втором этапе реверса оптимизирована.
    [свернуть]
    Последний раз редактировалось Titus; 24.11.2019 в 16:38.

    Этот пользователь поблагодарил Titus за это полезное сообщение:

    Alex_K(24.11.2019)

  2. #241
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #242

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Как по стандарту положено запрашивать векторные прерывания VIRQ, и как идет ответ по цепочке IAKI и IAKO?

  4. #243

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию 1515ХМ2-003 - столбец 1 из 14

    Малоинформативно, но все же:

    1515ХМ2-003 - столбец 1 из 14

    Из интересненького:

    1. Встретился загадочный элемент 2И-НЕ. Сперва показалось, что это висящий в воздухе вход. Потом заметил, что он посажен на плюс.
    Выходит, что разработчики не применяли библиотечного элемента 'инвертор' (как в ХМ2-001), а использовали части других элементов. В первом ряду мне встретились в этой роли 2И-НЕ, и НЕ-НЕ со средним отводом.

    2. Библиотечные элементы триггеров используются иначе. В случаях, когда в триггере не нужен вход S или R, используются не урезанные элементы без данных входов, занимающие меньше места, а полноценные, у которых данные входы просто посажены на землю. Возможно, это сделано в силу того, что места в данном кристалле больше, чем достаточно, и не было смысла особо экономить на размере элемента.

    3. Столбцов в ХМ2-003 меньше, чем в ХМ2-001 (14 против 19). И заполнение столбцов не всегда до самого низа.

    4. На фотографии кристалла отчетливо видны зоны с N-проводимостью (красноватые) и P-проводимостью (зеленоватые). Никакого практического смысла это в данном случае не имеет, т.к. логически понятно, где какие зоны. Однако, на фотографии ХМ2-001 эти зоны по цвету не различались абсолютно.
    Последний раз редактировалось Titus; 25.11.2019 в 13:01.

    Эти 2 пользователя(ей) поблагодарили Titus за это полезное сообщение:

    Alex_K(25.11.2019), nzeemin(25.11.2019)

  5. #244

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    т.к. логически понятно, где какие зоны. Однако, на фотографии ХМ2-001 эти зоны по цвету не различались абсолютно.
    Потому что это планарная технология - шара, реверсится по одной-двум фото. Вот с ТТЛ/ТТЛШ так уже не получится, там зоны легирования в глубине, не видно ничего.

  6. #245

    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,250
    Спасибо Благодарностей отдано 
    360
    Спасибо Благодарностей получено 
    638
    Поблагодарили
    414 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Как по стандарту положено запрашивать векторные прерывания VIRQ, и как идет ответ по цепочке IAKI и IAKO?
    Не совсем понятен вопрос про стандарт. Но если устройству необходимо обслужить прерывание, то оно на вывод VIRQ сажает активный низкий уровень. Т.к. это выход с открытым коллектором, то со всех устройств они сходятся в одну точку на вход процессора VIRQ. Если вопрос в том, в каком случае выставлять VIRQ, то обычно если устанавливаются оба бита - разрешения прерывания и готовности. Если какой-то из этих битов становится нулевым, то запрос на прерывание снимается. Также снимается запрос на прерывание после передачи вектора, несмотря на то, что биты разрешения прерывания и готовности ещё установлены. Для этого обычно служит триггер блокировки VIRQ, в 1515ХМ2-001 это M5, M8 и K4, которые устанавливаются при передаче вектора по сигналу RPLY. Сбрасываются блокираторы в случае сброса бита готовности, хотя могут быть варианты, когда сбрасываются сбросом не только готовности, но и сбросом разрешения прерывания (логическое И битов готовности и разрешения прерывания), что более верно.
    А вот сигнал IAKI/IAKO идет последовательно по цепочке приоритета. То устройство, которое ближе к процессору, то более приоритетно. Своя цепочка приоритетов существует и внутри устройства, если оно передает несколько векторов. Соответственно, то устройство, которое требует прерывания, и которое получило сигнал IAKI, прекращает его трансляцию на выход IAKO. После удовлетворения прерывания трансляция возобновляется. В 1515ХМ2-001 запрет трансляции IAKI делается элементами M3, M6, L1. По приоритету - самое приоритетное прерывание по внешнему событию, затем по обнулению таймера, ну и самое неприоритетное - клавиатура. А через N4, L8, L2 идет не только формирование и вектора и сигнала ответа RPLY, но через них же устанавливается и блокиратор VIRQ.

    Этот пользователь поблагодарил Alex_K за это полезное сообщение:

    Titus(25.11.2019)

  7. #246

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Потому что это планарная технология - шара, реверсится по одной-двум фото. Вот с ТТЛ/ТТЛШ так уже не получится, там зоны легирования в глубине, не видно ничего.
    Я не понял) ХМ2-001 и ХМ2-003 - одинаковые технологии, а на фотках у одного видны зоны P и N, а у другого не видны.

    - - - Добавлено - - -

    Цитата Сообщение от Alex_K Посмотреть сообщение
    Соответственно, то устройство, которое требует прерывания, и которое получило сигнал IAKI, прекращает его трансляцию на выход IAKO.
    Меня именно этот механизм и интересовал) Кто выдает IAKI изначально, как оно идет, и когда должно закончится и кем.

    Это мне было нужно, чтобы правильно описать прерывания ХМ2-001 )))

  8. #247

    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,250
    Спасибо Благодарностей отдано 
    360
    Спасибо Благодарностей получено 
    638
    Поблагодарили
    414 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Меня именно этот механизм и интересовал) Кто выдает IAKI изначально, как оно идет, и когда должно закончится и кем.
    Изначально его выдает процессор во время цикла запроса вектора прерывания, только там он называется IAKO. Когда я выкладывал собственные исследования по процессору 1801ВМ2, где его описал, там же есть и описания всяких циклов шины.

    Этот пользователь поблагодарил Alex_K за это полезное сообщение:

    Titus(25.11.2019)

  9. #248

    Регистрация
    02.03.2015
    Адрес
    г. Караганда, Казахстан
    Сообщений
    2,321
    Спасибо Благодарностей отдано 
    35
    Спасибо Благодарностей получено 
    225
    Поблагодарили
    177 сообщений
    Mentioned
    17 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Читайте книги, они рулез! В частности, тот самый документ 3.858.382 "Центральный процессор М2. ТО и инструкция по эксплуатации". Там все это расписано в подробностях и с времянками. Времянки на стр. 38, текстовое описание на стр 37-40, описание схемы для этого дела на стр. 213-215, стр. 214 - сама схема. В своё время (где-то 83-84) мне этих материалов вполне хватило для сочинения большого количества разных плат, все работали без вопросов. В той же книге есть подробные описания всех циклов шины и куча других материалов.

    Цитата Сообщение от Alex_K Посмотреть сообщение
    Когда я выкладывал собственные исследования по процессору 1801ВМ2, где его описал, там же есть и описания всяких циклов шины.
    Фундаментальный труд. Только бОльшая часть этих материалов есть в том самом документе. И они (материалы) ни разу не противоречат документу. (В скобках замечу, что, если бы оно противоречило, это бы значило, что 1801-й микропроцессор сделан неправильно. Чего, естественно, нет.) А меньшая относится специфически к 1801ВМ2, вроде начального пуска в Halt-Mode.
    Последний раз редактировалось AFZ; 25.11.2019 в 17:53.
    Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)

  10. #249

    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,250
    Спасибо Благодарностей отдано 
    360
    Спасибо Благодарностей получено 
    638
    Поблагодарили
    414 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AFZ Посмотреть сообщение
    Только бОльшая часть этих материалов есть в том самом документе. И они (материалы) ни разу не противоречат документу.
    Естественно не противоречат. В качестве первоисточника для описания функционирования шины и описания системы команд использовалась книга И.В. Захарова "Техническое обслуживание и эксплуатация микроЭВМ "Электроника-60М". А уж всякие тонкости реализации команд - это уже всякие тесты, в том числе и в HALT-режиме, благо пультовый отладчик у УКНЦ очень удобный и позволяет запустить программу как в USER, так и в HALT.

    Этот пользователь поблагодарил Alex_K за это полезное сообщение:

    hobot(25.11.2019)

  11. #250

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию 1515ХМ2-003 - столбец 2 из 14

    Новый столбец - 2 из 14.

    Из интересненького:

    1. Часть триггеров тактируется отрицательным фронтом, а часть положительным. В ХМ2-001 такого разброса не было. Да и вообще, явно разные люди делали.

    2. Попался двунаправленный мультиплексор, но после ХМ2-001 - это уже не новость.

    3. Методика управления тактированием триггеров другая, чем в ХМ2-001, что тоже говорит об ином разработчике.

    4. Встретился триггер, у которого вход D посажен на землю прям внутри блока.

    Вопрос к @Alex_K - что означают выводы ХМ2-003?

    - - - Добавлено - - -

    Итак, суммарное итоговое описание:

    Подробное описание особенностей работы таймера:


    Тактовая частота таймера CLK_TMR задается двумя битами регистра состояния таймера TMR_STATE[1..2]. В зависимости от их состояния, частота тактирования таймера может быть выбрана: CLК1_3, CLK1_6, CLK1_12 и CLK1_24. Что соответствует периодам: 0.48мкс, 0.96мкс, 1.92мкс и 3.84мкс. Из частоты тактирования таймера выделяется основная частота CLK_TMR1_4, и несколько вспомогательных фаз этой частоты. Частота CLK_TMR1_4 равна CLK_TMR / 4, поэтому периоды счета таймера будут: 1.92мкс, 3.84мкс, 7.68мкс и 15.36мкс соответственно. Учитывая, что скважность CLK1_3 равна 66.6%, итоговая ширина фазовых импульсов при данной тактовой частоте таймера будет отличаться от CLK1_6, CLK1_12 и CLK1_24, скважность которых равна 50%.

    Один период CLK_TMR1_4 можно условно разделить на 8 тактов (0..7).

    Такт 0:

    Если разрешена загрузка буферного регистра в счетчик (в режиме остановки таймера, либо по событиям TMR_ZERO_EVENT или EXT_EVENT), то в этом такте происходит копирование буферного регистра LATCH_TMR_BUF в счетчик CTR_TMR_CUR.
    Так же, если в предыдущем такте был активен сигнал TMR_BUF_WRITE (запись в буферный регистр), то происходит одновременная загрузка буферного регистра новым значением, и загрузка этого же значения в счетчик.
    Если же сигнал TMR_BUF_WRITE стал активен в этом такте, то его действие откладывается до следующего такта, равно как и ответ RPLY.

    Такт 1..7:

    Возможна свободная загрузка в буферный регистр LATCH_TMR_BUF по TMR_BUF_WRITE.

    Такт 2..3:

    Никаких действий не совершается.

    Такт 4:

    Если таймер в режиме счета, то по переднему фронту такта происходит вычитание единицы из содержимого счетчика.

    Такт 5:

    Если регистр текущего значения LATCH_TMR_CUR до этого такта не находился в режиме чтения по TMR_CUR_READ, а так же регистр текущего значения не был заморожен по TMR_CUR_FREEZE, то в этом такте содержимое счетчика CTR_TMR_CUR переписывается в регистр текущего значения LATCH_TMR_CUR.
    Если сигнал TMR_CUR_READ стал активен в этом такте, то его действие откладывается до следующего такта, равно, как и ответ RPLY.

    Такт 0..4, 6..7:

    Возможно свободное чтение регистра текущего значения LATCH_TMR_CUR по TMR_CUR_READ.

    Такт 6:

    Никаких действий не совершается.

    Такт 7:

    Если счетчик запущен и в этом такте равен нулю, а так же SYS_CON[13] = 0, то по переднему фронту такта формируется событие TMR_ZERO_EVENT. Если же SYS_CON[13] = 1, то выставляется сигнал IRQ (который в УКНЦ не используется). Снимается IRQ однократной установкой SYS_CON[13] = 0.
    Также в этом такте формируется событие EXT_EVENT, если с предыдущего такта было изменение уровня на входе EXT.

    По окончанию событий TMR_ZERO_EVENT или TMR_ZERO_EVENT (по заднему фронту такта 7) формируются события TMR_ZERO_READY и EXT_READY, соответственно. При наличии хотя бы одного из них, формируется событие TMR_CUR_FREEZE, замораживающее регистр текущего значения таймера. Сбрасываются события TMR_ZERO_READY и EXT_READY по чтению регистра текущего значения таймера.
    Если произошло событие TMR_ZERO_EVENT, и при этом уже установлен TMR_ZERO_READY (т.е. не был прочитан замороженный регистр текущего значения таймера), то выставляется бит TMR_STATE[3] (TMR_OVER), который сбрасывается по чтению регистра состояния таймера TMR_STATE.


    Особенности работы таймера и ошибки:

    1. При записи значения в буферный регистр LATCH_TMR_BUF в режиме остановленного счета, с вероятностью 1/8 цикл записи может быть продлен до одиного такта таймера. Что соответствует 0.32мкс, 0.48мкс, 0.96мкс и 1.92мкс, или же 2, 3, 6 и 12 такта ПП, соответственно.

    2. При чтении регистра текущего значения LATCH_TMR_CUR, с вероятностью 1/8 цикл записи может быть так же продлен, как и в пункте 1, в независимости от того, идет счет или нет.

    3. При остановленном таймере, цикл продвижения значения от записи в буферный регистр LATCH_TMR_BUF до регистра текущего значения LATCH_TMR_CUR следующий. После записи значения в буферный регистр LATCH_TMR_BUF, продвижение его в счетчик CTR_TMR_CUR может задержаться на время до 8 тактов таймера. Дальнейшее продвижение числа в регистр текущего значения LATCH_TMR_CUR задержится еще на 5 тактов таймера. Если же в момент продвижения числа в LATCH_TMR_CUR, была попытка читать регистр текущего значения, то продвижение числа задержится еще на 8 тактов. И так может происходить до бесконечности, если перед тактом копирования числа в LATCH_TMR_CUR, было произведено чтение регистра текущего значения.

    4. Весьма подозрителен тот факт, что при записи в буферный регистр LATCH_TMR_BUF, сигнал записи REG_BUF_LOAD может быть продлен на 1 такт таймера, относительно окончания сигнала TMR_BUF_WRITE. Таким образом, сигнал TMR_BUF_WRITE может пропасть, ввиду окончания записи процессором данных на шину, т.к. по записи в LATCH_TMR_BUF устанавливается RPLY, а в регистр LATCH_TMR_BUF все еще будет записываться состояние шины. И чем больше период тактирования таймера, тем вероятность данной ошибки выше. Максимальная задержка записи может быть 12 тактов ПП.


    Рекомендации по работе с таймером:

    1. При остановленном таймере записывать новое значение в буферный регистр при минимальном периоде тактирования таймера (2мс).

    2. Не насиловать регистр текущего значения постоянными чтениями, особенно при большом периоде тактирования таймера, чтобы дать содержимому счетчика переписаться в регистр текущего значения.
    [свернуть]

    Описание контроллера клавиатуры


    Тактовая частота контроллера клавиатуры CLK_KBD = 1/24 CLC. CLC = 6.25МГц (0.16мкс). Таким образом, период CLK_KBD = 3.84мкс. Из CLK_KBD формируется рабочая тактовая частота CLK_KBD1_16 = 1/16 CLK_KBD (период 61.44мкс), а так же вспомогательные фазы CLK_KBD_0B и CLK_KBD_0D.

    Счетчик CTR_KBD_Y, управляющий сканированием столбцов Y, тактируется CLK_KBD1_16, и считает циклически от 0 до 0x0F.
    Счетчик CTR_KBD_X, управляющий бегущим нулем на X, тактируется CLK_KBD1_16 * 16 (983.04мкс), считает циклически от 0 до 0x0F, причем, счет 0..0x7 - фаза нажатия клавиш, счет 0x08 - фаза отжатия клавиш, 0x09..0x0F - холостая фаза.

    Таким образом, один полный цикл опроса клавиатуры занимает 15728.64мкс (15.728мс), что равно почти целому кадру развертки.

    На каждый счет CTR_KBD_X, приходится полный цикл сканирования столбцов Y (1..15, 0-й столбец отсутствует).

    Код нажатой клавиши в регистре KBD_DATA формируется из текущего состояния обеих счетчиков. Старший полубайт - это счетчик CTR_KBD_X, младший полубайт - это счетчик CTR_KBD_Y.

    Остановка тактовой частоты CLK_KBD происходит по событию KEY_READY, которое, в свою очередь, формируется по заднему фронту события KEY_MISMATCH, которое формируется всякий раз при нажатии или отжатии клавиши.
    По чтению регистра данных клавиатуры KBD_DATA, снимается событие KEY_READY, и тактовая частота запускается заново.

    Бегущий ноль на линии X промодулирован частотой CLK_KBD1_16. Т.е. активен во время низкого уровня CLK_KBD1_16.
    В этой же тактовой фазе активен сигнал на выходе дешифратора DC_CTR_Y, который управляет сканированием линий Y.


    Основные модули контроллера:

    Y_MEMORY_A, Y_MEMORY_B и Y_MEMORY_C - регистры, запоминающие столбцы Y, в которых нажата хотя бы одна клавиша.
    Y_MEMORY_A - отражает текущее состояние столбцов, т.к. целиком очищается перед фазой сканирования, а устанавливается во время фазы сканирования.
    Y_MEMORY_B - отражает суммарное предыдущее и текущее состояние столбцов с нажатыми клавишами. Регистр не очищается после предыдущего цикла, а устанавливается аналогично Y_MEMORY_A во время фазы сканирования. Очистка Y_MEMORY_B происходит копированием содержимого Y_MEMORY_A во второй фазе цикла.
    Y_MEMORY_C - хранит предыдущую копию Y_MEMORY_B, и обновляется в тактовом цикле CLK_KBD_0D. На основе разницы Y_MEMORY_B и Y_MEMORY_C формируется событие нажатия/отжатия клавиши KEY_MISMATCH.


    Главный цикл опроса клавиатуры состоит из трех фаз - фазы определения нажатия клавиши, фазы определения отжатия клавиши, и холостой фазы.
    В свою очередь, один период CLK_KBD1_16 можно разделить на 16 тактовых циклов 0..15.


    Первая фаза - определение нажатия клавиш (счетчик CTR_KBD_X = 0x00..0x07):

    Такт 0..7:

    Ничего не происходит.

    Такт 8..15:

    На линии X, адресуемой счетчиком CTR_KBD_X, появляется активный ноль.
    На линиях Y, электрически связанных (вследствие нажатия клавиш) с активной линией X, появляются активные нули.

    Такт 11:

    Схемой COL_Y_COMP сигнал на выходе дешифратора сравнивается с входами порта Y. В случае наличия на соответствующeй линии нуля (нажата клавиша на пересечении ряда X, и столбца Y), в регистрах Y_MEMORY_A и Y_MEMORY_B устанавливается бит соответствующий столбцу Y. Если обновленное содержимое Y_MEMORY_B отличается от значения, зафиксированного в предыдущем цикле в Y_MEMORY_C, то возникает событие KEY_MISMATCH.

    Такт 13:

    В этом такте текущее значение Y_MEMORY_B переписывается в регистр последнего значения Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код нажатой клавиши. После чтения кода клавиши, тактирование CLK_KBD возобновляется.

    Такт 15:

    В конце этого такта (говоря иначе, в начале такта 0) снимается сигнал с линий X, вследствие чего пропадает сигнал и на линиях Y. Также отключается дешифратор DC_CTR_Y, управляющий компаратором COL_Y_COMP.



    Вторая фаза - определение отжатия клавиш (счетчик CTR_KBD_X = 0x08):

    Такт 0..7:

    Ничего не происходит.

    Такт 8..15:

    На линии X0, появляется активный ноль.
    На линиях Y, электрически связанных (вследствие нажатия клавиш) с линией X0, появляются активные нули,
    что является побочным эффектом, ввиду того, что схема сравнения COL_Y_COMP отключена.

    Такт 11:

    В этом такте в регистре Y_MEMORY_B сбрасывается текущий бит, если сброшен такой же бит в регистре Y_MEMORY_A.
    Таким образом, если Y_MEMORY_B все еще помнит клавишу, нажатую в предыдущем цикле, а в текущем цикле она была отпущена (отсутствует в Y_MEMORY_A), возникает событие KEY_MISMATCH.

    Такт 13:

    В этом такте сбрасывается бит в регистре Y_MEMORY_A, соответствующий линии Y. Т.е. фактически происходит очистка Y_MEMORY_A перед следующим циклом.
    Также переписывается Y_MEMORY_B в Y_MEMORY_C, вследствие чего отключается событие KEY_MISMATCH, если оно было активно. По снятию события KEY_MISMATCH активизируется событие KEY_READY, останавливающее тактирование CLK_KBD, предлагая программе считать из регистра KEY_DATA код отжатой клавиши. После чтения кода отжатия клавиши, тактирование CLK_KBD возобновляется.


    Третья фаза - холостая (счетчик CTR_KBD_X = 0x09..0x0F):

    Такт 0..7:

    Ничего не происходит.

    Такт 8..15:

    В этом такте так же появляется ноль на линиях X, однако это никак не используется.


    Влияние EP на опрос клавиатуры:

    EP блокирует установку нажатой клавиши в регистрах Y_MEMORY_A и Y_MEMORY_B в первой фазе цикла опроса.

    Помимо этого, EP запрещает бегущий ноль на линиях X.

    Также, EP разрешает вывод регистра KBD_BUS на линии Y. Кроме содержимого KBD_BUS (линии Y3..Y15), на линию Y2 выводится тактовая частота контроллера клавиатуры CLK_KBD, а на линию Y1 - сигнал чтения регистра KBD_BUS.


    Условно недокументированные особенности, возможности и ошибки:

    1. Поскольку код нажатия клавиши формируется в момент фактического нажатия, когда счетчики Y и X указывают на конкретную клавишу, в регистре KBD_DATA формируется полный код нажатой клавиши.
    Однако, код отжатия клавиши формируется уже после фактического отжатия клавиши, когда счетчик Y указывает на актуальный столбец, а счетчик X указывает на ряд 0. Поэтому в регистре KBD_DATA формируется неполный код отжатия клавиши, по которому можно определить лишь столбец Y, в котором отпущены все клавиши, но не ряд X.

    2. Из регистра KBD_BUS (177704) можно считывать состояние порта Y в реальном времени.

    3. Из регистра KBD_DATA (177702) можно считывать текущее состояние счетчиков CTR_KBD_X и CTR_KBD_Y. Причем, учитывая, что чтение счетчиков никак не синхронизировано с тактовой частотой контроллера клавиатуры, не исключена возможность чтения счетчиков в промежуточной фазе счета, когда одна часть счетчика уже установлена, а другая нет. Для того, чтобы понять, возможно ли такое попадание в середину фазы счета, надо изучать всю схемотехнику УКНЦ в целом.

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

    5. Возможно написание собственного опроса клавиатуры, т.к. программно доступны счетчики X, Y, и состояние порта Y. На практике же такой опрос будет очень медленным, из-за того, что полный цикл сканирования клавиатуры равен почти 16мс, что сопоставимо с размером одного кадра развертки (20мс).

    6. Все биты счетчиков CTR_KBD_X и CTR_KBD_Y сбрасываются по INIT, за исключением бита 0 счетчика CTR_KBD_X, который сбрасывается по DLCO.

    7. Следует заметить, что схема опроса клавиатуры имеет немалую логическую избыточность, и на втором этапе реверса оптимизирована.
    [свернуть]

    Описание контроллера прерываний


    Векторное прерывание VIRQ может формироваться тремя источниками:

    1. Прерывание по перепаду сигнала на входе магнитофона EXT (событие EXT_READY, бит разрешения EXT_IRQ_EN)
    2. Прерывание по обнулению таймера (событие TMR_ZERO_READY, бит разрешения TMR_ZERO_IRQ_EN)
    3. Прерывание по изменению состояния клавиатуры (событие KEY_READY, бит разрешения KBD_IRQ_EN)

    Принцип формирования вектора для всех трех источников одинаков.

    1. По активному сигналу DIN фиксируется запрос прерывания источником.
    2. По активным сигналам DIN и IAKI, на шину выдается вектор прерывания. При этом так же снимается запрос прерывания от источника.

    Адреса векторов в порядке убывания приоритета:

    1. EXT_READY - вектор 310
    2. TMR_ZERO_READY - вектор 304
    3. KEY_READY - вектор 300
    [свернуть]


    Блин. Приклеилось к предыдущему посту. Придется подождать, пока кто-то напишет свой пост, и перепостить.

    Эти 2 пользователя(ей) поблагодарили Titus за это полезное сообщение:

    Alex_K(25.11.2019), nzeemin(25.11.2019)

Страница 25 из 174 ПерваяПервая ... 212223242526272829 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 32
    Последнее: 18.12.2024, 18:19
  2. Реверс-инжиниринг игры Boovie
    от Oleg N. Cher в разделе Программирование
    Ответов: 41
    Последнее: 09.01.2022, 23:07
  3. Реверс инжиниринг печатной платы
    от Filin в разделе Несортированное железо
    Ответов: 36
    Последнее: 11.03.2018, 22:46
  4. Куплю 1515ХМ1-6006, 1515ХМ1−6008
    от moxjemi в разделе Барахолка (архив)
    Ответов: 3
    Последнее: 10.01.2012, 17:23
  5. 1801ВМ2 А и Б
    от dk_spb в разделе ДВК, УКНЦ
    Ответов: 2
    Последнее: 03.05.2010, 11:51

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •