User Tag List

Показано с 1 по 10 из 14

Тема: Безвейтовый контроллер PS/2 клавиатуры на AVR без CPLD для ZX Spectrum и клонов

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    29.11.2006
    Адрес
    Москва
    Сообщений
    100
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    14 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Serg6845 Посмотреть сообщение
    есть один момент - в случае когда для опроса клавиш одновременно падают в 0 больше одного адреса - в такой схеме возникнет конфликт выходных уровней у активных регистров. чтобы этого избежать - нужно либо регисиры с выходами ОК, либо по диоду в разрыв каждого выхода каждого регистра (40 штук).
    Не очень понятно к каким последствиям это ведёт. Если я правильно понимаю, то в этом случае при наличии на одном регистре 1, а на другом 0 на том же разряде, ток просто потечёт через OD вход (или не потечёт, по идее там встроенный диод в самом полевом транзисторе на выходе есть). Я эту схему на макетке собрал и проверил на самопальном клоне, ничего не греется вроде и видимых глюков нет. 596 от 595 отличается только тем, что 595 есть 3 состояние, а по даташиту от TI выходы у них по одной и той же схеме сделаны.


    Цитата Сообщение от andykarpov Посмотреть сообщение
    А как работает джойстик?
    Это на перспективу было, вообще-то, но сел - припаял 5 проводов к джойстику от Dendy и его тоже завёл. Просто вычитываю 8 бит состояния кнопок и подмешиваю их при выводе в регистры, на кнопки 6,7,8,9,0,Enter,L,SPC. Точно так же можно джойстик от Super Nintendo подключить, там внутренний регистр на 16 бит.

    Код:
    void init_gamepad(int pin_data, int pin_latch, int pin_clock)
    {
        pinMode(pin_data, INPUT_PULLUP);
        pinMode(pin_clock, OUTPUT);
        pinMode(pin_latch, OUTPUT);
    
        digitalWrite(pin_clock, HIGH);
    }
    
    int get_gamepad_state(int pin_data, int pin_latch, int pin_clock)
    {
        digitalWrite(pin_latch, HIGH);
        delayMicroseconds(JDELAY);
        digitalWrite(pin_latch, LOW);
    
        int keys_state = 0;
    
        for (int i = 0; i < JSER_COUNT; ++i) {
            delayMicroseconds(JDELAY);
            digitalWrite(pin_clock, LOW);
    
            keys_state <<= 1;
            keys_state |= digitalRead(pin_data);
    
            delayMicroseconds(JDELAY);
            digitalWrite(pin_clock, HIGH);
        }
    
        return keys_state;  
    }
    
    void fill_gamepad_matrix(int jstate)
    {
        
      gamepad_matrix[GP_K_A] = (jstate & 0x80)>0 ? false : true;
      gamepad_matrix[GP_K_B] = (jstate & 0x40)>0 ? false : true;
      gamepad_matrix[GP_K_SEL] = (jstate & 0x20)>0 ? false : true;
      gamepad_matrix[GP_K_START] = (jstate & 0x10)>0 ? false : true;
      gamepad_matrix[GP_K_U] = (jstate & 0x08)>0 ? false : true;
      gamepad_matrix[GP_K_D] = (jstate & 0x04)>0 ? false : true;
      gamepad_matrix[GP_K_L] = (jstate & 0x02)>0 ? false : true;
      gamepad_matrix[GP_K_R] = (jstate & 0x01)>0 ? false : true;
       
    }
    Последний раз редактировалось oistalker; 22.11.2020 в 20:44.
    ZX-Spectrum +2
    ZX-UNO 4.1
    Sizif512
    ZX-Evolution
    Harlequin 128

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

  3. #2

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

    По умолчанию

    Цитата Сообщение от oistalker Посмотреть сообщение
    Не очень понятно к каким последствиям это ведёт. Если я правильно понимаю, то в этом случае при наличии на одном регистре 1, а на другом 0 на том же разряде, ток просто потечёт через OD вход (или не потечёт, по идее там встроенный диод в самом полевом транзисторе на выходе есть).
    в случае с 595 - тот регистр где "кнопка нажата" - будет тянуть в 0, остальные (где "не нажата") - в 1. что в итоге получится на выходе - это как повезет. ну и "неаккуратно как-то"...

    Я эту схему на макетке собрал и проверил на самопальном клоне, ничего не греется вроде и видимых глюков нет. 596 от 595 отличается только тем, что 595 есть 3 состояние, а по даташиту от TI выходы у них по одной и той же схеме сделаны.
    может мы разные даташиты смотрим? я у TI нашел 596 только в варианте 74LS596

    https://www.ti.com/lit/gpn/sn74ls596
    и там совершенно четко видна разница между 595 и 596, на стр. 1 внизу.

    Зверинецъ

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

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

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

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

Похожие темы

  1. Ответов: 41
    Последнее: 21.11.2025, 20:51
  2. Ответов: 281
    Последнее: 12.03.2024, 20:01
  3. Схемы WAIT для различных клонов ZX Spectrum
    от ARTi в разделе Несортированное железо
    Ответов: 0
    Последнее: 28.04.2008, 16:57
  4. безвейтовый контроллер AT-клавы на МК
    от boo_boo в разделе Устройства ввода
    Ответов: 23
    Последнее: 07.03.2007, 13:17

Ваши права

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