Сообщение от
SaintTurnip
CSKB может отрубать МК от SRAM - чего мультиплексору тухнуть.
Дело в том, что адрес КА0-КА7 поступает из корвета ВСЕГДА, а не по спаду CSKB. Этот сигнал неотключаемый, это просто инверсия младших адресных линий процессора. Таким образом, на время взаимодействия МК с контроллером нужно отключить эти сигналы от адресного входа SRAM и вместо них подключить порт контроллера, а по окончании записи данных вернуть все обратно. Отсюда и мультиплексор.
В SRAM в любом случае писать не все 256 адресов клавиатуры, а diff к последнему записанному состоянию.
Ну один, ну может два байта. Чего там успевать-то.
Боюсь, что ты тут тоже не прав. Попробую пояснить свою мысль.
Клавиатура - это, по сути, битовая матрица 8*16, то есть всего 128 бит. При этом, в случае нажатия нескольких кнопок на одной адресной горизонтали, например ctrl+shift - оба на КА7, выходной ноль появляется одновременно на нескольких выходах данных, в данном случае на 1KD5 и 1KD7 (разумеется, в момент сканирования линии КА7).
А вот SRAM - это совсем другое дело. Это, конечно, тоже матрица битовых ячеек памяти, но вот между горизонталями матрицы и адресными входами стоит дешифратор. Таким образом, 8 адресным входам соответствует 256 горизонталей матрицы. В этой ситуации при нажатии кнопки, например, CTRL, придется понять бит D5 во всех ячейках SRAM, у которых адрес A7=0 (сканирование клавиатуры идет нулями). А при отпускании кнопки - все эти биты опустить обратно. А это - 128 операций записи. Кроме того, всякие комбинации типа ctrl+shift юзер нажимает и отпускает обычно практически одновременно, поэтому получаем еще 128 операций. Итого 256. Согласись, что это уже весьма прилично по времени получается. За это время драйвер клавиатуры корвета полезет опрашивать клавиатуру, а SRAM занята текущей операцией записи слова из контроллера. Ведь, как я и говорил ранее, корвет и контроллер работают совершенно асинхронно. И что в этой ситуации делать? Прерывать запись нельзя, раз она уже начата, а драйвер клавиатуры ждать не будет. Он просто прочитает то, что сейчас выставлено на шине данных SRAM, а там выставлен текущий записываемый байт. Результат непредсказуем.
Конечно, на первый взгляд можно было бы прописывать не все 128 слов с А7=0, а только одно слово, с адресом 01111111. Поскольку драйвер клавиатуры, по идее, должен опрашивать адресные линии по одной. На практике оказалось, что есть программы, которые проверяют факт наличия нажатой кнопки, выставив адрес 00000000. То есть за одну операцию ввода можно узнать, нажата ли хотя бы одна кнопка на всей клавиатуре. Так, например, сделано в биосах некоторых версий микродоса. Не удивлюсь, если найдутся программы, особенно игрушки, опрашивающие клавиатуру произвольными сочетаниями адресных линий. Поэтому, я считаю, что матрицу клавиатуры надо реализовать полноценно. Но даже если этого не делать, то асинхронность опероса клавиатуры и записи данных обязательно рано или поздно приведут к конфликту.
Код:
Плюсы МК - можно USB клаву подцепить, и все равно будет довольно дешево (ну, без учета сложности PCB)
usb-клаву можно и к fpga зацепить - этих usb ip-core уже довольно много существует. А насчет цены - ну, наверное, подешевле будет. Правда, 16-битную SRAM в не-BGA корпусе еще найти надо, и она тоже денег будет стоить. Хотя, наверное, и подешевле FPGA. Но экономия будет рублей 500 максимум.
forth32, есть корвет 8010 скучающий. Ты же из Питера?
Да, я из питера. Если есть лишний корвет - пошли в личку договариваться, мне полноценный корвет не помешал бы.