Важная информация

User Tag List

Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 41

Тема: Контроллер для подключения PS/2 клавиатуры

  1. #1
    Activist
    Регистрация
    20.12.2016
    Адрес
    г. Москва
    Сообщений
    385
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    21 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Контроллер для подключения PS/2 клавиатуры

    Соберу здесь всю выжимку по данному девайсу.
    Огромная благодарность Xrust за разработку контроллера.
    Схема, герберы и прочая информация по универсальному контроллеру - здесь.
    Купить платы или готовые устройства можно здесь.
    По-умолчанию матрица для прошивки аутентичной клавиатуры (ЙЦУКЕН-JCUKEN), но можно переключать по F12 на QWERTY, также учитывается, чтобы можно было относительно несложно обжать шлейф:

    Матрица

    127,127,127,39, 43, 47, 45, 127,127,127,
    127,127,41, 50,88,127,127,28,30,127,
    20,74, 124, 127,127,127,44, 12, 98, 104,
    122, 18,127,40, 2, 32, 36, 118, 120, 127,
    127,48,68, 108, 100, 72, 116, 127,127,38,
    76, 42, 46, 66, 114, 127,127,127,14, 64,
    96, 112, 94, 127,127,106,70, 8, 4, 126,
    92, 127,127,86, 80 ,102, 34,10, 84,127,
    127,127,6,127,78, 90, 127,127,127,16,
    62, 0, 127,82,127,127,127,127,127,127,
    127,127,52,127,127,109, 127,103, 97, 127,
    127,127,111, 70, 107, 101, 99, 79, 24,127,
    58,127,105, 127, 127,77, 127,127
    [свернуть]

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

    Прошивка

    #include <PS2KeyRaw.h>
    #define AX0 4
    #define AX1 5
    #define AX2 6
    #define AX3 7
    #define AY0 8
    #define AY1 9
    #define AY2 10
    #define RSTMT 14
    #define CSMT 15
    #define DATMT 16
    #define STBMT 17
    #define DATAPIN 2
    #define IRQPIN 3

    volatile boolean d = HIGH;
    uint8_t table[128] = {
    127,127,127,39, 43, 47, 45, 127,127,127,
    127,127,41, 50,88,127,127,28,30,127,
    20,74, 124, 127,127,127,44, 12, 98, 104,
    122, 18,127,40, 2, 32, 36, 118, 120, 127,
    127,48,68, 108, 100, 72, 116, 127,127,38,
    76, 42, 46, 66, 114, 127,127,127,14, 64,
    96, 112, 94, 127,127,106,70, 8, 4, 126,
    92, 127,127,86, 80 ,102, 34,10, 84,127,
    127,127,6,127,78, 90, 127,127,127,16,
    62, 0, 127,82,127,127,127,127,127,127,
    127,127,52,127,127,109, 127,103, 97, 127,
    127,127,111, 70, 107, 101, 99, 79, 24,127,
    58,127,105, 127, 127,77, 127,127};

    uint8_t t_qwerty[128] = {
    127,127,127,39, 43, 47, 45, 127,127,127,
    127,127,41, 50,88,127,127,28,30,127,
    20,44, 124, 127,127,127,10, 40, 108, 32,
    122, 18,127,104, 14, 102, 100, 118, 120, 127,
    127,48,34, 98, 38, 42, 116, 127,127,66,
    106, 78, 96, 12, 114, 127,127,127,68, 74,
    36, 112, 94, 127,127,106,72, 76, 64, 126,
    92, 127,127,86, 80 ,70, 34,46, 84,127,
    127,127,6,127,78, 90, 127,127,127,16,
    62, 0, 127,82,127,127,127,127,127,127,
    127,127,52,127,127,109, 127,103, 97, 127,
    127,127,111, 70, 107, 101, 99, 79, 24,127,
    58,127,105, 127, 127,77, 127,127};

    volatile boolean qwerty = false;
    volatile boolean sw = true;

    PS2KeyRaw keyboard;
    void setup() {
    //Инициализация портов
    pinMode(19, OUTPUT);
    pinMode(AX0, OUTPUT); //AX0
    pinMode(AX1, OUTPUT); //AX1
    pinMode(AX2, OUTPUT); //AX2
    pinMode(AX3, OUTPUT); //AX3
    pinMode(AY0, OUTPUT); //AY0
    pinMode(AY1, OUTPUT); //AY1
    pinMode(AY2, OUTPUT); //AY2
    pinMode(RSTMT, OUTPUT); //RES
    pinMode(CSMT, OUTPUT); //CS
    pinMode(DATMT, OUTPUT); //DAT
    pinMode(STBMT, OUTPUT); //STB
    //Инициализация клавиатуры
    keyboard.begin( DATAPIN, IRQPIN );
    //Инициализация MT8816
    SetAddr(0);
    digitalWrite(RSTMT, LOW);
    digitalWrite(CSMT, LOW);
    digitalWrite(DATMT, LOW);
    digitalWrite(STBMT, LOW); //инициализация
    digitalWrite(CSMT, HIGH); //выбор чипа
    digitalWrite(RSTMT, HIGH);
    digitalWrite(RSTMT, LOW); //сброс
    digitalWrite(CSMT, LOW);
    }
    void SetAddr(uint8_t addr) {
    digitalWrite(AX0,bitRead(addr,0));
    digitalWrite(AX1,bitRead(addr,1));
    digitalWrite(AX2,bitRead(addr,2));
    digitalWrite(AX3,bitRead(addr,3));
    digitalWrite(AY0,bitRead(addr,4));
    digitalWrite(AY1,bitRead(addr,5));
    digitalWrite(AY2,bitRead(addr,6));
    }
    void SetKey(boolean data){
    digitalWrite(CSMT, HIGH); //выбор чипа
    digitalWrite(STBMT, HIGH); //строб on
    digitalWrite(DATMT, data); //данные
    digitalWrite(STBMT, LOW); //строб off
    digitalWrite(CSMT, LOW);
    }
    void loop()
    {
    if( keyboard.available() ){
    int c = keyboard.read(); //чтение кода
    switch (c) {
    case 0x7E: //если считался код 0x7E
    digitalWrite(CSMT, HIGH); //выбор чипа
    digitalWrite(RSTMT, HIGH);
    digitalWrite(RSTMT, LOW); //сброс
    digitalWrite(CSMT, LOW);
    break;
    case 0x07: //если считался F12
    if (sw) {
    qwerty = !qwerty; //меняем раскладку
    sw = !sw; //ждем нажатия другой клавиши
    }
    break;
    case 0xE0: //если считался префикс 0xE0
    break;
    case 0xF0: //если считался префикс 0xF0 (отпускание клавиши)
    d = LOW;
    break;
    default:
    if (qwerty) SetAddr(t_qwerty[c]);
    else SetAddr(table[c]);
    SetKey(d);
    d = HIGH;
    sw = true;
    }
    }
    }
    [свернуть]

    Комментарии к прошивке


    F12 - переключение раскладок JCUKEN-QWERTY
    ScrollLock - перезагрузка контроллера (мой вариант при первом включении бывает что "залипает")
    F11 - Стоп
    WIN - Фикс
    Alt - Алф
    Не влезли клавиши - Ю, Сел.
    Затруднился куда засунуть - ИЗ, ВЗ, СТРН.
    Прошивка QWERTY хуже проработана - дублируются кнопки V H B
    Для тех, кто собирается дорабатывать, сопоставление пинов разъему корвета:
    1KD0 - X14
    2KD0 - X15
    1KD1 - X12
    2KD1 - X13
    1KD2 - X10
    2KD2 - X11
    1KD3 - X8
    2KD3 - X9
    1KD4 - X6
    2KD4 - X7
    1KD5 - X4
    2KD5 - X5
    1KD6 - X2
    2KD6 - X3
    1KD7 - X0
    2KD7 - X1

    KA0 - Y6
    KA4 - Y7
    KA1 - Y4
    KA5 - Y5
    KA2 - Y2
    KA6 - Y3
    KA3 - Y0
    KA7 - Y1
    [свернуть]


    В прошивке выше переопределены пины для простого обжима шлейфа к разъему корвета:


    Ниже исторический первый пост в теме.

    Коллеги, привет!

    Достался мне тут корпус в неплохом состоянии от Квант-8 и я собираюсь восстановить его начинку. Для этого почти все есть:
    Плата от обычного корвета (только нужно либо перепаять выход FDD на стандартный ПКшный, либо сделать кабель)
    Флопы
    БП купил вот такой - есть опасения правда, что 60W не хватит, но если что, закажу большей мощности
    Перегородки собираюсь сделать из метала как в родном, или на 3Д принтере - еще не решил...

    Самый большой затык пока что в клавиатуре, коих насколько я понял в природе еще меньше, чем этих самых квантов. Поэтому хочу начать делать контроллер PS/2. Так как собственного мозга пока не хватает, обращаюсь к коллективному разуму))

    Первичный сбор информации говорит о следующем:
    1. Клавиатура у корвета - обычная матрица замыкателей 8 бит адресов, 16 бит данных (2х8, мультиплексоры читают по очереди, в зависимости от А8)
    2. Хочется использовать тот разъем, что на плате корвета, и не тянуть дополнительно А8 или еще что-то. Максимум питание, но контроллер можно запитать и отдельно. В кванте на сколько я понял так и реализовано - клавиатура подключена к стандартному разъему на плате корвета, где просто дополнительно выведено питание.
    3. Шина данных перед мультиплексором подтянута на +5В, ША инверсирована (т.е. считывание идет по бегающему 0)

    Перелопатил все подобные наработки в этой области для других ретро-ПК, пришел к следующим выводам:
    1. За основу лучше всего брать наработки CARO для ориона или ямахи (больше всего комментариев и логики в коде)
    2. В качестве контроллера собираюсь использовать ATmega644 в DIP40 - и портов хватает (три полноценных порта - как раз 24 контакта для матрицы 8х16) и реализованы прерывания по изменению уровня на любом бите порта

    Пока что не укладывается в голове:
    1. Как лучше поступить: вставить в схему контроллера инверторы? или не утяжелять схему и писать прошивку с учетом инверсии? читал где-то на форумах, что есть риск положить +5 на землю программно...
    2. Не нашел (или плохо искал) ничего подобного в других ПК - обычно ША больше 8 бит, а ШД - не более 8. Таким образом непонятно, как выстроить код, типа:
    D0 EQU 000H
    D1 EQU 001H
    D2 EQU 002H
    D3 EQU 003H
    D4 EQU 004H
    D5 EQU 005H
    D6 EQU 006H
    D7 EQU 007H <-- вот здесь математика оборвалась, младший байт закончился (((( а у нас еще 8 бит ШД есть...
    ;
    A0 EQU 000H
    A1 EQU 008H
    A2 EQU 010H
    A3 EQU 018H
    A4 EQU 020H
    A5 EQU 028H
    A6 EQU 030H
    A7 EQU 038H
    ;
    Ctrl EQU 080H ; Ctrl Bit7=1
    Shift EQU 040H ; Shift Bit6=1
    AltTb EQU 0C0H ;
    ;
    Kl_SL EQU A0+D0 ; Home
    Kl_CTP EQU A0+D1 ; Insert
    Kl_AP2 EQU A0+D2 ; ESCAPE
    Kl_F1 EQU A0+D3
    Kl_F2 EQU A0+D4 и т.д.
    3. Видимо необходимо переписывать прошивку, чтобы в ответ на скан-код выдавался 16-битный ответ? и программно уже разбивать старший и младший байты по двум портам?
    4. Правильно ли я понимаю, что таблица сопоставлений Скан-коды - ответы в ШД по прерываниям необходимо хранить в памяти AVR?

    В общем жду пожеланий, предложений, комментариев...
    Последний раз редактировалось surinm; 27.06.2021 в 09:01.

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

    Xrust (27.06.2021)

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

  4. #2
    Member
    Регистрация
    01.02.2018
    Адрес
    г. Железногорск
    Сообщений
    131
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А зачем столько ног? Бегло читал описание на Корвет (может не так читал и не то понял) выставляется 1 на ША клавиатуры и смотрятся 1 на ШД 8*2. Если подключать ps/2 клавиатуру то можно же просто использовать два порта ( не, можно и с одним извратится) считывать скан код сравнивать по таблице и давать 1 на нужную ногу. Не?

  5. #3
    Moderator Аватар для Serebriakov
    Регистрация
    06.04.2013
    Адрес
    г. Могилев, Беларусь
    Сообщений
    253
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    109
    Спасибо Благодарностей получено 
    57
    Поблагодарили
    26 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Помнится FORTH32 уже делал подобный переходник на Atmega32-16, но ее скорости не хватало для нормальной обработки.

    У Кванта клавиатура отличается от клавиатуры Корвета. Но если от Кванта берется только корпус, а плата родная Корветовская, то все ок.
    Последний раз редактировалось Serebriakov; 21.06.2018 в 00:46.

  6. #4
    Member
    Регистрация
    01.02.2018
    Адрес
    г. Железногорск
    Сообщений
    131
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну у кванта 4*8 матрица. Там проще, наверное :-)
    Последний раз редактировалось iwa955; 21.06.2018 в 08:04.

  7. #5
    Moderator Аватар для Serebriakov
    Регистрация
    06.04.2013
    Адрес
    г. Могилев, Беларусь
    Сообщений
    253
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    109
    Спасибо Благодарностей получено 
    57
    Поблагодарили
    26 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Написал FORTH32 на почту, вот ответ:
    Цитата Сообщение от forth32
    О, как давно это было-то...

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

    С точки зрения конструкции все это означает, что переходник подключается не только к порту клавиатуры, но и к системному порту на материнской плате, причем сигнал RDY надо разорвать (удалить стоящую на этом порту перемычку). Это тоже совсем неэстетично. Ущербный получился переходник, хотя, как я понял, в соседних темах делали клаву для ZX без всяких извращений с подтормаживанием процессора. Как это делали я особо не разбирался, а потом в силу жизненных обстоятельств на год забросил корвет и все связанные с ним разработки. Теперь вот все собираюсь к этому вернуться, доделать наконец тот же extrom-адаптер, но без ESL, в одно рыло, заниматься этим как-то уже не так интересно.

    Вообщем, исходник прошивки переходника я могу поискать в архиве, если интересно. И схему могу нарисовать.Но на нынешнем этапе появились недорогие ARM-контроллеры, те же stm32 например, их быстродействие в несколько раз выше атмеги, и они полностью 32-битные. По идее, такого контроллера должно за глаза хватить для обработки запросов к порту клавиатуры в реальном времени, без всяких тактов ожидания. Но лучше все же сделать разработку переходника на какой-нибдуь FPGA. Я вот подумываю об Altera Cyclone IV, их на алиэкспрессе как грязи и стоят не сильно дороже той же атмеги. Уж этого должно за глаза хватить - это же будет не программная, а аппаратная обработка, на основе встроенной в чип двухпортовой памяти.

  8. #6
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Serebriakov Посмотреть сообщение
    Написал FORTH32 на почту, вот ответ:
    По этому поводу - даже на СТМ32 полностью безвейтовый контроллер не сделать, уже проверено.
    Если МК будет в бесконечном цикле ТОЛЬКО ждать опроса на шине, то самое оптимальное время реакции - около 400нс на частоте 168МГц. Это получено в результате тестов в реальном железе с реальным кодом (получение входной матрицы, формирование выходной матрицы). А нам же надо ещё и саму клавиатуру опрашивать ещё...

    PS: У себя я уже 100% буду делать адаптер с FPGA - это самый оптимальный вариант. А FORTH32 по поводу FPGA можете написать, что не надо смотреть на циклоны - в данных случаях нужен чип, поддерживающий 5-и вольтовые сигналы. А это только MAX3000 и MAX7000. Первый можно настроить как OpenDrain с подтяжкой к +5, а вторые изначально 5-и вольтовые есть.
    Последний раз редактировалось andreil; 22.06.2018 в 14:49.
    "Байт-48"

  9. #7
    Activist Аватар для Trol73
    Регистрация
    07.05.2015
    Адрес
    г. Ульяновск
    Сообщений
    351
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    50
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    26 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andreil Посмотреть сообщение
    Если МК будет в бесконечном цикле ТОЛЬКО ждать опроса на шине, то самое оптимальное время реакции - около 400нс на частоте 168МГц.
    А тут прерывания не получится использовать, чтобы не ждать в бесконечном цикле?

  10. #8
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Trol73 Посмотреть сообщение
    А тут прерывания не получится использовать, чтобы не ждать в бесконечном цикле?
    Нет.
    Замерял - получилось 375нс до начала обработчика прерывания. То есть получаем около 500нс с обработкой (или чуть больше, особо не проверял). Проверено на обработчике, который работает по битовой маске (при сканировании "бегающий ноль") - он занял около 250нс.

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

    Так что если до 700нс оптимально - тогда да, можно и на СТМ32. И то, только на старших моделях, где тактовая выше 150МГц - приведённые тайминги проверялись на STM32F407VGT с частотой 168МГц.
    "Байт-48"

  11. #9
    Activist
    Регистрация
    17.04.2011
    Адрес
    Санкт-Петербург
    Сообщений
    324
    Спасибо Благодарностей отдано 
    32
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Насколько я помню, MAX3000 - это максимум 256 макроячеек в самой старшей модели, а встроенного блока статической памяти вообще нет. Боюсь что не влезет - тут надо матрицу 8*16 в памяти держать, то есть 128 бит.
    Я лично собрался делаль на циклоне 4. Проблема 5V в принципе обходится. Выходы адреса, идущие на клавиатуру - это ЛН2 с открытым коллектором, их можно подключать напрямую, включив в чипе внутреннюю подтяжку. Входы данных подтянуты к 5V внешним набором резисторов, который можно просто убрать с платы. Ну и, для гарантии, поключить к каждому выходу 3.3v стабилитрон на землю. Хотя это и не обязательно.

    Зато в самом убогом циклоне4 (EP4CE6) имеется 6000 макроячеек и 128кбит статической памяти. Хвтати за глаза на все, в том числе и таблицу перекодировки клавиш. Преимуцество такого решения - подключаться надо только к порту клавиатуры. В системную шину, в том числе и CSKB, лезть не надо.

    А так я несколько лет назад и правда сделал переходник на PS/2, если кому интересно, могу исходник выложить сюда. Но он требует подключения в разрыв сигнала RDY и тормозит процессор на каждом опросе клавиатуры.

  12. #10
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от forth32 Посмотреть сообщение
    Насколько я помню, MAX3000 - это максимум 256 макроячеек в самой старшей модели, а встроенного блока статической памяти вообще нет. Боюсь что не влезет - тут надо матрицу 8*16 в памяти держать, то есть 128 бит.
    Я лично собрался делаль на циклоне 4. Проблема 5V в принципе обходится. Выходы адреса, идущие на клавиатуру - это ЛН2 с открытым коллектором, их можно подключать напрямую, включив в чипе внутреннюю подтяжку. Входы данных подтянуты к 5V внешним набором резисторов, который можно просто убрать с платы. Ну и, для гарантии, поключить к каждому выходу 3.3v стабилитрон на землю. Хотя это и не обязательно.

    Зато в самом убогом циклоне4 (EP4CE6) имеется 6000 макроячеек и 128кбит статической памяти. Хвтати за глаза на все, в том числе и таблицу перекодировки клавиш. Преимуцество такого решения - подключаться надо только к порту клавиатуры. В системную шину, в том числе и CSKB, лезть не надо.

    А так я несколько лет назад и правда сделал переходник на PS/2, если кому интересно, могу исходник выложить сюда. Но он требует подключения в разрыв сигнала RDY и тормозит процессор на каждом опросе клавиатуры.
    На всю матрицу хватит "за глаза". У меня в 128 ячеек уместилась матрица, и ещё пара портов. Плюс это всё общается с СТМкой
    Матрица у нас в виде 16 байт, то есть получаем 144 ячейки на хранение состояния. Это если реализовывать "в лоб".

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

    По поводу циклона - тут будут траблы с питанием (там всё достаточно сложно может быть в некоторых случаях), да ещё и с онфигПЗУ надо быть в курсе многих дел
    "Байт-48"

Страница 1 из 5 12345 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Ответов: 34
    Последнее: 24.11.2022, 16:05
  2. Ответов: 146
    Последнее: 31.05.2020, 19:00
  3. Ответов: 28
    Последнее: 06.06.2018, 15:28
  4. Контроллер клавиатуры для Скорпиона
    от Nikolaj Amosov (500:812/02.26) в разделе Scorpion
    Ответов: 1
    Последнее: 15.11.2005, 23:05

Ваши права

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