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

User Tag List

Страница 7 из 9 ПерваяПервая ... 3456789 ПоследняяПоследняя
Показано с 61 по 70 из 88

Тема: Как переделать практически любую клавиатуру в PS/2

  1. #61

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CLR Посмотреть сообщение
    Я на днях собрал тестовый стенд для беспаечной проверки и настройки контроллера ps2avr, буду проверять свою раскладку и идеи по оптимизации.
    Заодно и проверю, как оно будет работать на AVR-ZX и на KarabasPro.
    Во, хорошая идея. Надо мне будет тоже маркированные pbs-ки припаять, чтоб "клавиши" замыкать было удобнее.

    По вчерашним экспериментам у меня выводы такие:
    1. Идея сделать все на двух больших кирпичах с разбегу не прокатывает. В Speccy2010 реализация ps/2 грамотная, но это так не везде. В большинстве случаев протокол ps/2 реализован обрезанным и между этими реализациями будут нестыковки. Может и удастся найти более-менее работающий вариант клавиатурного контроллера на атмеге, но он и для обычного спека работает на пределе быстродействия, а для турбо уже опять все будет мимо.
    2. В целом идея использовать ps/2 как промежуточный протокол является компромиссом и с очень большой натяжкой, т.к. он предусматривает передачу "событий", то есть цепочек байт вида "клавиша нажата" и "клавиша отпущена". Это диффы к текущему состоянию клавиатуры, если хоть один из них будет каким-то образом потерян, то контроллер не будет адекватно отражать состояние клавиш. Косяк передачи по интерфейсу маловеротен, тут больше играет роль неуспевание его обработки и переписывание следующим байтом. Мне это напоминает MIDI-интерфейс и зависание звучания инструментов, если в передаче или обработке его событий есть потери.
    3. Красивым вариантом обхода всего этого безобразия является использование некоторой схемы с регистром на все имеющиеся клавиши, которая "отражает" их спеку при опросе клавиатуры, и при этом состояние этого регистра постоянно рефрешится опросом актуальной матрицы. Есть такие решения для PS/2 у andykarpov
    https://github.com/andykarpov/ps2_cpld_kbd
    и leonid-z
    https://github.com/leonid-z/zxkeyboard
    В обоих случаях атмега получает клавишные события по интерфейсу ps/2, обновляет в своем массиве состояние нужных клавиш и постоянно ПОЛНОСТЬЮ передает его по SPI той самой схеме, которая реализована в CPLD. Это всего 6 байт (40 бит клавиши спека и еще один байт может передавать состояния специальных кнопок навроде ресета, мэджика, турбо и т п).
    Только в нашем случае нет необходимости вообще как-то привязываться к PS/2, достаточно этой же атмегой опрашивать некую клавишную матрицу, по некоей таблице соответствия генерить массив состояний клавиш спека и передавать его в регистр CPLD.
    Посмотрим, насколько мне хватит тямы что-то из этого сделать.

    Две последних CPLD-реализации под завязку используют CPLD, первая - EPM7128, вторая - EPM3064. И судя по всему вдвое больше LE требуется более грамотной реализации SPI slave, а т к во втором случае она слишком лаконична и проста, то где-то должна быть подстава )
    Собственно, у меня все равно сейчас для игрушек есть только EPM7064, поэтому начну со второго варианта. И с опроса атмегой какой-нибудь простой матрицы клавиш типа 4х4 для отладочной передачи по SPI. Потом можно будет на эту же атмегу поключить большую матрицу.
    To be continued...

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

  3. #62

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valerium Посмотреть сообщение
    Две последних CPLD-реализации под завязку используют CPLD, первая - EPM7128, вторая - EPM3064. И судя по всему вдвое больше LE требуется более грамотной реализации SPI slave, а т к во втором случае она слишком лаконична и проста, то где-то должна быть подстава )
    Собственно, у меня все равно сейчас для игрушек есть только EPM7064, поэтому начну со второго варианта. И с опроса атмегой какой-нибудь простой матрицы клавиш типа 4х4 для отладочной передачи по SPI. Потом можно будет на эту же атмегу поключить большую матрицу.
    To be continued...
    Всех с наступившим НГ ! Кто как празднует, а мне после елки и шампанского довелось поковырять обе вышеприведенные разработки.
    Схема leonid-z у меня работать не захотела ни в каком виде. Не сумел я никакие отладочные наборы данных прокачать по этому упрощенному SPI на epm7064, да и отлаживать там что-либо трудно - CPLD забита под завязку и даже одного триггера под отладочную защелку не выкроить (
    Поэтому бросил я ту идею, добыл epm7128 и пересобрал под нее практически без изменений CPLD-версию andykarpov, хоть и напрягало меня, что под какой-то промежуточный клавиатурный регистр тратится CPLD, в которую можно засунуть практически всю логику спека. Запустил все это с ардуинкой на atmega328p и на ps/2-клавиатуре все заработало прям с разбегу.
    Потом с некоторыми мелкими изменениями контроллер поменял на atmega32 с его четырьмя 8-разрядными портами (из которых в дальнейшем без SPI и rx/tx остается 26 ног - вполне достаточно для многих клавиатурных матриц). Код пересобрал в том же arduno IDE с модулями для atmega32 - клавиатура PS/2 тоже заработала без проблем, однако есть неприятность - исходная Atmega328p с включенным фьюзом CKOUT дает получить наружу тактовые импульсы своего генератора, которыми тактируется CPLD-часть. А вот Atmega32 такого не имеет и для CPLD пришлось сделать отдельный генератор.
    Вопрос к знающим: какие-то еще из богатых ногами атмег умеют раздавать свой генератор наружу ?

    Сегодня прошерстил код атмеги (приятно, читабельно - респект andykarpov !), обработку прерывания от PS/2 и обработку принятых кодов заменил на сканирование матрицы - для примера взял ненужную спековскую клавиатуру (5х8) и прицепил на порты C и D атмеги32. Ее клавиши сканятся и мапятся в регистр CPLD вполне успешно, спек с ней работает вполне адекватно, так что если еще "добавим ножек", то уже можно любую клавиатуру до 26 пин включительно читать и перемапливать на спековскую. Алгоритм опроса незнакомой матрицы пока не реализован, но вроде в железяку вписываемся без проблем и должно получиться.
    Нажмите на изображение для увеличения. 

Название:	IMG_20210103_050222.jpg 
Просмотров:	154 
Размер:	78.2 Кб 
ID:	74377

    Для дальнейших экспериментов нашел клавиатуру от Asus X200 на 24 пина, с ней далее и буду экспериментировать.
    Нажмите на изображение для увеличения. 

Название:	IMG_20210103_051536.jpg 
Просмотров:	141 
Размер:	59.7 Кб 
ID:	74376
    Последний раз редактировалось valerium; 03.01.2021 в 12:18.

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

    andykarpov(07.01.2021), CLR(03.01.2021), Eltaron(03.01.2021)

  4. #63

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ...продолжение.

    Цитата из билайновской рекламы про робота - "ой, а разговоров-то было !".
    Все оказалось в разы проще. Дольше всего пришлось МГТФ зачищать.
    Нижу привожу гайд по борьбе в клавиатурной матрицей для домохозяек и других аналогичных мне неучей.

    Итак, клавиатура от Asus X200, макетка с atmega32 и кварцем, arduino IDE с модулями MightyCore для поддержки atmega32.
    С атмеги32 подключены только SPI (PB4-PB7) на CPLD и UART (PD0, PD1) для дебага через USB-UART. Остальные портовые ноги PD2-PD7, PC0-PC7, PA0-PA7, PB0-PB3 свободны для подключения к разъему клавиатурной матрицы.
    Нажмите на изображение для увеличения. 

Название:	IMG_20210104_024957.jpg 
Просмотров:	114 
Размер:	41.5 Кб 
ID:	74385
    Для дебага/обратной связи с МК нужен USB-TTL-UART навроде такого, но у меня его нет, а садиться и ехать за ним куда-то не позволяет новогоднее состояние настроение. Поэтому вместо него используется ардуинка с залепленным дулом на землю ресетом.
    Нажмите на изображение для увеличения. 

Название:	IMG_20210104_004712.jpg 
Просмотров:	101 
Размер:	32.4 Кб 
ID:	74382

    Модуль для atmega32 (и других контроллеров, не нативных для плат Ардуино) удобен тем, что мы можем удобно ссылаться на удобно описанные ноги портов соответствующего контролера, а также задав в настройках IDE частоту кварца не заботиться о правильности частоты UART для нужной скорости.
    Пакет модулей берется по ссылке https://mcudude.github.io/MightyCore...ore_index.json
    Как его добавить в IDE и сделать доступным из менеджера плат, есть картинки тут.

    Код, написанный при помощи топора - сразу же после hello world:
    Код:
    //описание алиасов для пинов
    #define PINS_MAX 26
    
    #define PIN0 PIN_PD2
    #define PIN1 PIN_PD3
    #define PIN2 PIN_PD4
    #define PIN3 PIN_PD5
    #define PIN4 PIN_PD6
    #define PIN5 PIN_PD7
    #define PIN6 PIN_PC0
    #define PIN7 PIN_PC1
    #define PIN8 PIN_PC2
    #define PIN9 PIN_PC3
    #define PIN10 PIN_PC4
    #define PIN11 PIN_PC5
    #define PIN12 PIN_PC6
    #define PIN13 PIN_PC7
    #define PIN14 PIN_PA7
    #define PIN15 PIN_PA6
    #define PIN16 PIN_PA5
    #define PIN17 PIN_PA4
    #define PIN18 PIN_PA3
    #define PIN19 PIN_PA2
    #define PIN20 PIN_PA1
    #define PIN21 PIN_PA0
    #define PIN22 PIN_PB0
    #define PIN23 PIN_PB1
    #define PIN24 PIN_PB2
    #define PIN25 PIN_PB3
    
    //массив номеров пинов для перебора клавиатуры
    const uint8_t pins[PINS_MAX] = 
    {
      PIN0, PIN1, PIN2, PIN3, PIN4, PIN5, PIN6, PIN7, PIN8, PIN9, 
      PIN10, PIN11, PIN12, PIN13, PIN14, PIN15, PIN16, PIN17, PIN18, PIN19, 
      PIN20, PIN21, PIN22, PIN23, PIN24, PIN25
    };
    
    
    // initial setup
    void setup()
    {
    //все клавиатурные ноги ставим в режим входа с пуллапом
      for (uint8_t i=0; i<PINS_MAX; i++) pinMode (pins[i], INPUT_PULLUP);
    
    //и инициализируем вывод по UART для получения данных о клавишах в "мониторе порта"
      Serial.begin(115200);
      Serial.flush();
      Serial.println(F("Unikeyboard matrix explorer v1.0"));
    }
    
    // main loop
    void loop()
    {
      uint8_t colcount, rowcount;
    
    //перебираем все потенциальные столбцы
      for (colcount=0; colcount<PINS_MAX; colcount++)
       {
         //при опросе очередного столбца переключаем все линии "как бы строк" в режим входа, чтоб не получить конфликт уровней на выходах
         for (rowcount=0; rowcount<PINS_MAX; rowcount++) pinMode (pins[rowcount], INPUT_PULLUP);
         
         //один пин потенциального столбца включаем в режим выхода, даем уровень 0
         pinMode (pins[colcount], OUTPUT);
         digitalWrite (pins[colcount], LOW);
    
         //перебираем все пины строки, пропуская пин столбца
         for (rowcount=0; rowcount<PINS_MAX; rowcount++)
                  // если на входе строки находим 0 (нажата клавиша на пересечении текущих COL/ROW) - выводим ее в консоль 
                  // в виде двух индексов пинов (меньший+1, больший+1). Плюс единица, т к индексы нумеруются с 0, а контакты на разъеме с 1.
                  if ( (rowcount != colcount) and !digitalRead(pins[rowcount]) )
                      {
                      Serial.println ("Pressed key ("+String((colcount<rowcount?colcount:rowcount)+1)+", "+String((colcount<rowcount?rowcount:colcount)+1)+")");
                      delay (300);
                      }
       }
    }
    Этот скетч компиляем, экспортируем и заливаем в атмегу любым удобным способом (avrdude, khazama, и т п), фьюзы у меня на нем LOW=0x0e, HIGH=0xD7, EXT=0xFD, но из них важен по сути только внешний источник CKSEL=1110, а задержки включения SUT и генераторный CKOPT не принципиальны (впрочем, внутренний генератор тоже можно использовать, не забыв в настройке IDE это указать, чтоб частота UART пересчиталась).
    Подключаем клавиатуру к атмеге, подключаем USB-UART к компу и запускаем IDE в режиме монитора порта (или любой другой терминал на соответствующем компорте), давим по порядку клавиши, видим вывод следующего характера:
    Нажмите на изображение для увеличения. 

Название:	изображение_2021-01-04_034529.jpg 
Просмотров:	100 
Размер:	20.6 Кб 
ID:	74381

    Я записал соответствующие сочетания линий для каждой клавиши прямо на самой клавиатуре:
    Нажмите на изображение для увеличения. 

Название:	IMG_20210104_024402.jpg 
Просмотров:	118 
Размер:	61.6 Кб 
ID:	74384

    Дальше, если верить легенде о 8 столбцах в любой клавиатуре, то надо выделить эти самые 8 столбцовых линий.
    Рекомендуют это делать по линиям modifier keys, в моем случае они такие:
    LCTRL 4 12
    RCTRL 4 6
    LALT 2 7
    RALT 2 9
    LSHIFT 5 11
    RSHIFT 5 8
    GUI(WIN) 3 13
    Fn 1 6
    MENU 1 9

    В парах "близнецовых" клавиш видим непересекающиеся линии 6,7,8,9,11,12. И у GUI есть линия 13. Это в сумме 7 линий.
    Дальше лотерея - надо восьмую линию подобрать как-то наугад, долго глядя в клавиатуру. Я просто предположил, что эта клава имеет столбцовые линии в одной подряд идущей группе, и в ряду 6,7,8,9,11,12,13 пропущена линия 10. Если это не так - далее при построении таблицы вылезет какой-то несходняк и эту итерацию надо будет повторить.
    Итак имеем столбцовые линии 6,7,8,9,10,11,12,13. Остальные строковые.
    Строим таблицу:
    Нажмите на изображение для увеличения. 

Название:	AsusX200_keymatrix.jpg 
Просмотров:	119 
Размер:	25.2 Кб 
ID:	74383
    Цветом выделены мастхэв-клавиши для спектрума, ненужные строки можно исключить целиком (в целом это означает, что если у клавиатуры больше 26 линий, то не используя некоторые можно ее заюзать с той же атмегой, где их <=26).

    Тайна клавиатуры раскрыта.
    Если есть идеи, как автоматизировать поиск столбцовых линий - кидайте идеи, я не смог придумать.

    Мапить эту клавиатуру в регистр клавиш в CPLD буду немного позже. Но тоже скоро.

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

    ALS(07.01.2021), CLR(04.01.2021), zebest(04.01.2021)

  5. #64

    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,811
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    386
    Спасибо Благодарностей получено 
    339
    Поблагодарили
    244 сообщений
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valerium Посмотреть сообщение
    для домохозяек и других аналогичных мне неучей.
    ...и это всё о нём (с)
    Я так понимаю для стандартной ардуино уно пинов не хватит ? А если в два захода? чисто для сканированийя)))
    а для Arduino Mega 2560 ? там вроде как 54 IO. А то есть погибшая при пожаре мини слим усб клава, я бы позаглядывал, что там в унутри.
    Profi v3.2 -=- Speccy2010,r2

  6. #65

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    Я так понимаю для стандартной ардуино уно пинов не хватит ? А если в два захода? чисто для сканированийя)))
    а для Arduino Mega 2560 ? там вроде как 54 IO. А то есть погибшая при пожаре мини слим усб клава, я бы позаглядывал, что там в унутри.
    В несколько заходов можно попробовать, но их будет не два, а больше. Просто потому, что могут оказаться клавиши _между_ теми линиями, которые друг друга исключили в первом и втором заходах, надо будет их еще сколько-то раз вычислять. Может получиться, что и за 10 таких заходов еще останутся "белые пятна".
    На мега 2560 - запросто, раз ног хватает и если она уже есть. Надо только разобраться, как именно там именуются ноги соответствующих портов и довнести их в массив пинов. Я позавчера удивлялся, что для atmega32 параллельно существуют разные распиновки arduino, sanguino и bobuino (разная нумерация одних и тех же ног), когда искал, как их указывать в скетче.

    Немного поразмыслив, могу предложить такой вариант: в несколько заходов постараться вычислить клавиши-модификаторы (опросом или даже просто тестером протыкивая гребенку разъема), найти 8 линий столбцов (или додумать ненайденную линию), после чего подключать все столбцовые линии и часть строчных, опрашивать часть клавы, затем менять строчные линии и опрашивать остальные клавиши - так мы сможем разделить все на два непересекающихся набора.

    Но это получится только если для той клавиатуры справедливо правило 8 столбцовых линий (не знаю, каков процент исключений существует)
    Последний раз редактировалось valerium; 04.01.2021 в 11:00.

  7. #66

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Допиливаю рабочую прошивку атмеги, смапил основную часть клавиш, работают цифры-буквы, шифты, курсор, капслок - без косяков и без пропусков клавиши-модификатора.
    Вроде бы и все хорошо. Но не удается повторить ту логику, которая была сделана изначально у andykarpov для работы с двойственными клавишами PC, которые меняют назначение в зависимости от состояния шифта - например =/+ или ;/: - просто потому, что это не PS/2 и нажатие шифта для "второго значения" еще можно поймать, но нет события на отпускание клавиши для возврата к "первому значению".
    Добавлять глючности в работу простого и приделывать всякие флаги промежуточных состояний я не хочу, поэтому на них вынесу одиночные функции и этого на данный момент хватит.
    Кейпада на клавиатуре Asus X200 нет и в шаблон я его добавлять пока не буду, т к проверить толком не на чем.

    Еще исходное CPLD-решение имеет 4 регистра для передачи спецфункций (reset, magic, turbo и некий special), их тоже планирую включить, есть ли стандарт на их расположение на PCшной клавиатуре ? Или каждый лепит, как ему нравится ?
    Еще по поводу стандарта - не могу привыкнуть к раскладкам, где оба шифта работают как CS, а оба CTRL как SS; мне кажется логичнее сделать все левые модификаторы заменой CS, а все правые - заменой SS. Ну на ALT еще куда ни шло поставить CS+SS.
    Что по этому поводу говорится в правилах хорошего тона ?

  8. #67

    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,811
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    386
    Спасибо Благодарностей получено 
    339
    Поблагодарили
    244 сообщений
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valerium Посмотреть сообщение
    подключать все столбцовые линии и часть строчных, опрашивать часть клавы, затем менять строчные линии и опрашивать остальные клавиши - так мы сможем разделить все на два непересекающихся набора.
    ну я как то так и предполагал для ардуинки с малым количеством пинов. Для жирной ардуинки это не существенно.
    Ну и раз про жирную ардуинку, типа 2560.
    А что, например нельзя сразу сделать, на входе 25 линий с клавы, на выходе 8+5 линий на ZX ? Без CPLD
    Profi v3.2 -=- Speccy2010,r2

  9. #68

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так уже было много раз сделано и всегда был достигнут предел быстродействия у такого контроллера, чаше всего он на 20-25 мгц avr-ки успевал обрабатывать клавиатурный опрос спека со стандартными 3,5мгц, а в турбо-режимах это не работало или частично, или вообще.
    Именно поэтому CPLD красиво решает эту проблему буферным регистром, который спек опрашивает независимо от жизни МК.

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

  10. #69

    Регистрация
    30.12.2018
    Адрес
    г. Москва
    Сообщений
    1,375
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    384
    Поблагодарили
    346 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valerium Посмотреть сообщение
    добыл epm7128 и пересобрал под нее практически без изменений CPLD-версию andykarpov, хоть и напрягало меня, что под какой-то промежуточный клавиатурный регистр тратится CPLD, в которую можно засунуть практически всю логику спека.
    это у спека все просто и прозрачно, всего 40 триггеров и немного логики. вот когда я для специалиста такое делал - вот там да...
    p.s. впрочем там я даже без контроллера обошелся - хотя этот грязный хак не на всех клавах работает.

    Цитата Сообщение от valerium Посмотреть сообщение

    Запустил все это с ардуинкой на atmega328p и на ps/2-клавиатуре все заработало прям с разбегу. Потом с некоторыми мелкими изменениями контроллер поменял на atmega32 с его четырьмя 8-разрядными портами (из которых в дальнейшем без SPI и rx/tx остается 26 ног - вполне достаточно для многих клавиатурных матриц). Код пересобрал в том же arduno IDE с модулями для atmega32 - клавиатура PS/2 тоже заработала без проблем, однако есть неприятность - исходная Atmega328p с включенным фьюзом CKOUT дает получить наружу тактовые импульсы своего генератора, которыми тактируется CPLD-часть. А вот Atmega32 такого не имеет и для CPLD пришлось сделать отдельный генератор.
    Вопрос к знающим: какие-то еще из богатых ногами атмег умеют раздавать свой генератор наружу ?
    встречный вопрос - а зачем? если все равно пересобирать CPLD - там без этого клока можно легко обойтись. если не копипастить навернутый полный SPI слейв, от которого нужен банальный сдвиговый регистр - то в качестве клока вполне пойдет сигнал AVR_SS.

    Зверинецъ

    Специалист (был когда-то "совсем стандарт") - 1988-2023
    Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
    Ленинград2 + CF карта
    Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
    БК0010-01 стоковый
    [свернуть]

  11. #70

    Регистрация
    03.05.2020
    Адрес
    г. Челябинск
    Сообщений
    796
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    260
    Спасибо Благодарностей получено 
    274
    Поблагодарили
    145 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Serg6845 Посмотреть сообщение
    это у спека все просто и прозрачно, всего 40 триггеров и немного логики. вот когда я для специалиста такое делал - вот там да...
    p.s. впрочем там я даже без контроллера обошелся - хотя этот грязный хак не на всех клавах работает.
    Там вроде матрица больше и разбросана по разным портам ВВ55... Или она опрашивается как-то иначе ?
    А можно этот вариант без контроллера посмотреть ? Не, я не специалист в "Специалистах", просто сама идея интересна.

    встречный вопрос - а зачем? если все равно пересобирать CPLD - там без этого клока можно легко обойтись. если не копипастить навернутый полный SPI слейв, от которого нужен банальный сдвиговый регистр - то в качестве клока вполне пойдет сигнал AVR_SS.
    Да ответ простой - не смог я этого ) Пока не умею. Я ведь ненастоящий сварщик.
    Скопипастить сложный пример было проще, чтобы хоть с чего-то начать.

    Как я понимаю, это примерно вот так должно выглядеть на vhdl, если ориентироваться на CPLD-решение Андрея Карпова (вся клава+спецкнопки - 6 слов по 16-бит, режим MSBFIRST, в старшем байте "адрес" кейстатусов в CPLD-регистре, в младшем байте сами кейстатусы):
    Код:
    entity SPI_slave is
        Port ( SCK  : in  STD_LOGIC;
               DATA : in  STD_LOGIC;
               SS   : in  STD_LOGIC); 
    end SPI_slave;
    
    architecture Behavioral of SPI_slave is
        signal spi_do : STD_LOGIC_VECTOR (15 downto 0);
        signal kb_data : std_logic_vector(39 downto 0) := (others => '0'); -- 40 keys
    
       -- additional signals
        signal reset   : std_logic := '0';
        signal turbo   : std_logic := '0';
        signal magick  : std_logic := '0';
        signal special : std_logic := '0';
    
    begin
    
        process (SCK)
        begin
            if (SCK'event and SCK = '1') then
                if (SS = '0') then
                    spi_do <= spi_do (14 downto 0) & DATA;
                end if;
            end if;
        end process;
    
        process (SS)
        begin
            if (SS'event and SS = '1') then
    			case spi_do(15 downto 8) is 
    				when X"01" => kb_data(7 downto 0) <= spi_do (7 downto 0);
    				when X"02" => kb_data(15 downto 8) <= spi_do (7 downto 0);
    				when X"03" => kb_data(23 downto 16) <= spi_do (7 downto 0);
    				when X"04" => kb_data(31 downto 24) <= spi_do (7 downto 0);
    				when X"05" => kb_data(39 downto 32) <= spi_do (7 downto 0);	
    				when X"06" => reset <= spi_do(0); turbo <= spi_do(1); magick <= spi_do(2); special <= spi_do(3);
    				when others => null;
    			end case;	
            end if;
        end process;
    
    end Behavioral;
    Опять же - для собственного развлечения я это сделаю, но будет ли в этом какая-то практическая выгода, неизвестно, т.к. ПЛИСка и 7128, и 3128, и более мелкие *064 стоят одних и тех же 150-200 руб на каждом китайском углу. И цена решения будет одна, хоть 40 триггеров задействовано в CPLD, хоть 100+. Только если генератор сэкономить...


    UPD: Собственно, доработал CLPD, убрал жирного SPI slave, убрал генератор.
    77 of 128 macrocells. Сильно много не оторвать, в 64 точно не упихать.
    CPLD_kbd_v2.zip

    Serg6845, спасибо за науку )
    Последний раз редактировалось valerium; 07.01.2021 в 02:17. Причина: additional signals declaration added to code example

Страница 7 из 9 ПерваяПервая ... 3456789 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Переделать клавиатуру AT >> XT
    от artice в разделе Устройства ввода
    Ответов: 28
    Последнее: 02.07.2024, 17:15
  2. Ответов: 7
    Последнее: 02.06.2018, 20:56
  3. Как можно восстановить клавиатуру?
    от IMPguitar в разделе Устройства ввода
    Ответов: 1
    Последнее: 31.01.2017, 19:17
  4. как переделать CAS в WAV
    от marsNRG в разделе Atari
    Ответов: 9
    Последнее: 09.01.2016, 18:45

Ваши права

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