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

User Tag List

Страница 9 из 10 ПерваяПервая ... 5678910 ПоследняяПоследняя
Показано с 81 по 90 из 91

Тема: Адаптер мыши PS/2 в стандарт мыши Марсианка

  1. #81
    Master Аватар для Sandro
    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    590
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    115 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так, много я тут пропускаю. Но всё же: я тут озадачился максимально правильной процедурой опроса мыши. Надо?
    Диагонали есть.
    moused.zip

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

    Цитата Сообщение от electroscat Посмотреть сообщение
    Принимать резет в целом действительно нет надобности,
    Принимать резет НЕОБХОДИМО. Его отсутствие -- это грубейшая ошибка, приводящая к некорректному поведению мыши.

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

    electroscat (03.02.2022)

  3. #82
    Master
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    905
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    205
    Поблагодарили
    153 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от electroscat Посмотреть сообщение
    БК не принимает диагональные комбинации портов, то есть движение мыши по диагонали весьма корявое
    Да, заметил это в видео (неестественное движение курсора под прямыми углами). Я бы назвал это корявым драйвером мыши, технически диагонали возможны.

    Цитата Сообщение от Sandro Посмотреть сообщение
    Принимать резет НЕОБХОДИМО. Его отсутствие -- это грубейшая ошибка
    Ну, если речь о приеме сброса марсианкой - то да. Автор же ваяет что-то из PS/2 плюс Ардуина, там ресет это уже побочка))
    Но вполне допускаю, что именно из-за отсутствия сброса у него и скакал курсор.
    Последний раз редактировалось reddie; 02.02.2022 в 16:05.

  4. #83
    Activist
    Регистрация
    11.11.2014
    Адрес
    г. Москва
    Сообщений
    334
    Спасибо Благодарностей отдано 
    60
    Спасибо Благодарностей получено 
    28
    Поблагодарили
    23 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Ну, если речь о приеме сброса марсианкой - то да. Автор же ваяет что-то из PS/2 плюс Ардуина, там ресет это уже побочка))
    Но вполне допускаю, что именно из-за отсутствия сброса у него и скакал курсор.
    Ресет марсианский если и использовать, то как источник прерывания для Ардуино, по которому опрашивать мышь ps/2, а потом готовить и выставлять данные для порта УП.

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

    Цитата Сообщение от electroscat Посмотреть сообщение
    Переделал скетч к ардуино, в кратце, БК не принимает диагональные комбинации портов, то есть движение мыши по диагонали весьма корявое. Сделал математику, когда есть диагональное направление, оно заменяется чредованием X/Y/X/Y - и получаются очень плавные мкольжения по диагонали ))))
    Где можно посмотреть на эту математику (на код) ?
    Не волнуйтесь, моя бабушка водила трактор и пожарную машину (С)

  5. #84
    Master Аватар для electroscat
    Регистрация
    27.08.2019
    Адрес
    г. Ростов-на-Дону
    Сообщений
    986
    Спасибо Благодарностей отдано 
    435
    Спасибо Благодарностей получено 
    182
    Поблагодарили
    114 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от TheGWBV Посмотреть сообщение
    Где можно посмотреть на эту математику (на код) ?

    Скрытый текст


    /*
    BK-PS2-MARS-Mouse-host by TheGWBV, 29/08/2020, Step 2.
    Free for exUSSR users and all others ;-)
    */


    const int ResetPin = 4; // номер вывода с Reset
    int ResetState = 0; // переменная для чтения состояния Reset


    int MX_B = 0; // переменная для чтения и буферизации перемещения по оси Х
    int MY_B = 0; // переменная для чтения и буферизации перемещения по оси Y
    bool XY = LOW; // переменная, для чередования диагональных перемещений


    #include <ps2.h>
    #include <SoftwareSerial.h>




    // Джойстик-шар мыши Марсианки
    #define marsUP 7
    #define marsR 9
    #define marsDn 8
    #define marsL 10
    // Кнопки мыши Марсианки
    #define marsLB 2
    #define marsRB 11
    /*
    *
    Пины для UART/ТЛГ:
    RX is digital pin 1 (connect to TX of other device)
    TX is digital pin 3 (connect to RX of other device)
    */
    SoftwareSerial TLG_soft_Serial(0, 1); // RX, TX


    /*
    Used an arduino sketch to interface with a ps/2 mouse.
    Also uses serial protocol to talk back to the host
    and report what it finds.
    */


    /*
    Pin 13 is the mouse data pin, pin 15 is the clock pin
    Feel free to use whatever pins are convenient.
    */
    PS2 mouse(6, 5); // 6 - clock, 5 - data






    void setup()
    {
    /*
    Аппаратный UART подключаем к ПЭВМ... с эмулятором БК-шки, и/или прочим софтом для связи по UART
    */
    Serial.begin(38400); while (!Serial); // wait for serial port to connect. Needed for native USB port only
    /* Пины для UART/ТЛГ:
    RX is digital pin 2 (connect to TX of other device)
    TX is digital pin 4 (connect to RX of other device)
    Можно подключать к ТЛГ БК0010 или к псевдо-ТЛГ на БК0011М (для этой модели ТЛГ заводом не предусмотрен!)
    */
    TLG_soft_Serial.begin(38400); // Open software serial communications and wait for port to open


    // initialize digital pin LED_BUILTIN as an output.
    pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH);


    // BK Marsianka output: 2 - marsLB, 3 - marsRB, 7 - marsUP, 9 - marsR, 8 - marsDn, 10 - marsL.
    // Джойстик-шар мыши Марсианки
    pinMode(marsUP, OUTPUT); digitalWrite(marsUP, HIGH); // Вверх
    pinMode(marsR, OUTPUT); digitalWrite(marsR, HIGH); // Вправо
    pinMode(marsDn, OUTPUT); digitalWrite(marsDn, HIGH); // Вниз
    pinMode(marsL, OUTPUT); digitalWrite(marsL, HIGH); // Влево


    // Кнопки мыши Марсианки
    pinMode(marsLB, OUTPUT); digitalWrite(marsLB, HIGH); // Левая кнопка
    pinMode(marsRB, OUTPUT); digitalWrite(marsRB, HIGH); // Правая кнопка


    mouse_init(); // Инициировать мышь PS/2
    }


    /*
    Initialize the mouse. Reset it, and place it into remote
    mode, so we can get the encoder data on demand.
    */
    void mouse_init()
    {
    mouse.write(0xff); // reset
    mouse.read(); // ack byte
    mouse.read(); // blank */
    mouse.read(); // blank */
    mouse.write(0xf0); // remote mode
    mouse.read(); // ack
    delayMicroseconds(50);
    }


    /*
    Обнуляем координатные переменные контроллера.
    */
    void reset_XY()
    {
    //Serial.print("\t+-------+");
    digitalWrite(marsR, HIGH);
    digitalWrite(marsL, HIGH);
    digitalWrite(marsUP, HIGH);
    digitalWrite(marsDn, HIGH);


    //MY_B = 0;
    //MX_B = 0;

    //digitalWrite(marsLB, HIGH);
    //digitalWrite(marsRB, HIGH);


    //Serial.println();
    }




    /*
    считываем данные с мышки и выводим в COM-порт
    */
    void loop()
    {




    char mStat;
    char mX;
    char mY;
    uint16_t reg_177714;


    /* запрашиваем данные от мышки */
    mouse.write(0xeb); // команда на чтение данных
    mouse.read(); // игнорируем ack
    mStat = mouse.read();
    mX = mouse.read();
    mY = mouse.read();




    ResetState = digitalRead(ResetPin);




    /* if (ResetState == LOW)
    {
    reset_XY();
    } */


    // Просмотр битов направлений на предмет наличия диагональных


    if (mX==0&&mY==0)
    {
    reset_XY();
    goto end_loop;
    }

    if (mX > 0&&mY > 0)
    {
    Serial.print("\t+Вправо+Вверх");
    if (XY==LOW)
    {
    mX=1;
    mY=0;
    }
    else
    {
    mX=0;
    mY=1;
    }
    XY=!XY;
    }
    else if (mX > 0&&mY < 0)
    {
    Serial.print("\t+Вправо+Вниз");
    if (XY==LOW)
    {
    mX=1;
    mY=0;
    }
    else
    {
    mX=0;
    mY=-1;
    }
    XY=!XY;
    }
    else if (mX < 0&&mY > 0)
    {
    Serial.print("\t+Влево+Вверх");
    if (XY==LOW)
    {
    mX=-1;
    mY=0;
    }
    else
    {
    mX=0;
    mY=1;
    }
    XY=!XY;
    }
    else if (mX < 0&&mY < 0)
    {
    Serial.print("\t+Влево+Вниз");
    if (XY==LOW)
    {
    mX=-1;
    mY=0;
    }
    else
    {
    mX=0;
    mY=-1;
    }
    XY=!XY;
    }







    // Влево
    if ( mX < 0 ) // -1
    {
    Serial.print("\t+Влево");
    digitalWrite(marsL, LOW);
    //mX=-1;
    }
    else
    {
    Serial.print("\t-");
    digitalWrite(marsL, HIGH);
    }




    // Вправо

    if ( mX > 0 ) // 1
    {
    Serial.print("\t+Вправо");
    digitalWrite(marsR, LOW);
    //mX=1;
    }
    else
    {
    Serial.print("\t-");
    digitalWrite(marsR, HIGH);
    }





    // Вверх
    if ( mY > 0 ) // 1
    {
    Serial.print("\t+Вверх");
    digitalWrite(marsUP, LOW);
    //mY=1;
    }
    else
    {
    Serial.print("\t-");
    digitalWrite(marsUP, HIGH);
    }


    // Вниз
    if ( mY < 0 ) // -1
    {
    Serial.print("\t+Вниз");
    digitalWrite(marsDn, LOW);
    //mY=-1;
    }
    else
    {
    Serial.print("\t-");
    digitalWrite(marsDn, HIGH);
    }

    end_loop:

    if ( mStat & 0x01 )
    {
    Serial.print("\t+ЛевКн");
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(marsLB, LOW);
    }
    else
    {
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.print("\t-");
    digitalWrite(marsLB, HIGH);
    }
    if ( mStat & 0x02 )
    {
    Serial.print("\t+ПравКн");
    digitalWrite(marsRB, LOW);
    }
    else
    {
    Serial.print("\t-");
    digitalWrite(marsRB, HIGH);
    }






    /* выводим данные на аппаратный UART */

    Serial.println();
    Serial.print(mStat, BIN);
    Serial.print("\tX=");
    Serial.print(mX, DEC);
    Serial.print("\tY=");
    Serial.print(mY, DEC);
    Serial.println();

    //delay(50);


    // BK TLG UART run over and over: for USB-Com <-[data]-> BK-TLG-UART
    if ( TLG_soft_Serial.available() ) {
    Serial.write(TLG_soft_Serial.read());
    digitalWrite(LED_BUILTIN, HIGH);
    }
    if ( Serial.available() ) {
    TLG_soft_Serial.write(Serial.read());
    }

    }
    [свернуть]


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

    Как видно из скетча, я ввел резет в ардуино, и даже пытался его обрабатывать, правда для сброса порта, как на оригинале... то есть делал чтобы направления только в 0 стаавились, а в 1 по резету. Пытался его и как прерывание использовать, но очень медренно все работает. В таком виде - все максимально хорошо.
    Да, ноги нерераспределил для собственного удобства.

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

    Собираюсь сегодня грызуна к Агату подключить, уже восстановил вчера плату порта принтера, в простом варианте грызун через него подключается к Агату.

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

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

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

    Цитата Сообщение от Sandro Посмотреть сообщение
    Прошу мне простить мое невежество, а как запустить бинарник на БК? Я его в образ положил, запускаю под СSIDOS и все виснет.. Под что он ?

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

    Под ANDOS заработало )

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

    В целом, в этой программе диагональные обрезания не нужны. с ними есть некоторая дискретность при диагональном перемещении,.

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

    Цитата Сообщение от Sandro Посмотреть сообщение
    Принимать резет НЕОБХОДИМО. Его отсутствие -- это грубейшая ошибка, приводящая к некорректному поведению мыши.
    Я не против, давайте обсудим.
    Резет имел бы смысл если бы он являлся синхроимпульсом для мыши. То есть, если после резета сразу снимаются данные с мыши - это да, это было бы супер ! Если как то по другому, например данные снимаются и после резет - то это другое, в целом бесполезное.

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

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

    Проблема еще и в том, что за годы сущесвования БК и марсианки существует много наверняка способов опроса мыши. Благо ардуино позволяет сделать кучу переклюков и выдавать под разные программы разные типы данных ))) Можно что то универсальное сделать, и под всех подстроиться )))
    Последний раз редактировалось electroscat; 03.02.2022 в 10:21.
    Сейчас в коллекции:
    Вектор 06Ц.01(Минск), Вектор 06Ц.01(Волжский), Вектор 06Ц.02(Кишенев), Агат 7, Агат 9, Электроника 0511 УКНЦ (СЭМЗ), Электроника 0511 УКНЦ (КВАНТ) Х2, Поиск-1.03 (VGA),Электроника БК-0011(10,11M) [3IN1], Корвет ПК8010, Партнер 01.01, Спектр-001, БАЙТ(БПО_СВТ), Волна 48, Ленинград 48, Веста 30, Компакт 256(новодел),
    и ... Pentium 200 mmx, 386SX-16, AMD K6-300 ...

  6. #85
    Master Аватар для Sandro
    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    590
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    115 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  7. #86
    Master
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    905
    Спасибо Благодарностей отдано 
    76
    Спасибо Благодарностей получено 
    205
    Поблагодарили
    153 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от electroscat Посмотреть сообщение
    если после резета сразу снимаются данные с мыши - это да, это было бы супер !
    Увы, конструкция мыши такова, что ресет служит именно ресетом. Приняли данные от мыши, послали сброс - только так.
    Без сигнала сброса все биты направлений взведутся и так и останутся активными. Поэтому драйвер на БК сперва читает порт, потом делает сброс. Но не наоборот.

    Цитата Сообщение от electroscat Посмотреть сообщение
    за годы сущесвования БК и марсианки существует много наверняка способов опроса мыши
    Ну как бы стандарта два: напрямую в порт УП (без прерывания от мыши) и через блок КМ (с прерыванием).

  8. #87
    Master Аватар для electroscat
    Регистрация
    27.08.2019
    Адрес
    г. Ростов-на-Дону
    Сообщений
    986
    Спасибо Благодарностей отдано 
    435
    Спасибо Благодарностей получено 
    182
    Поблагодарили
    114 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У Агата все очень серьезно, есть событие, по которому приходит резет. Работает все так: ПРихдит резет, первое показание если мышь в движении - читается, следующее, вот как раз то мусорное показание - оно служит драйверу для понимания того, что нужно делать следующий резет, то есть, драйвер следит за изменением в порте, на нули после резета он не реагирует, на смену нулей на первое и единственно правильное значение драйвер реагирует как на бит направления, следующее изменение в порту работает как сигнал для выдачи резета, и так далее...
    И вот тут появляются сразу же проблемы у ардуиновской реализации мыши... Мусор то не образуется в порту вторым значением. В итоге, пока мышь бедется медленно, и есть небольшие перерывы в данных с ардуино, или если мышь ведется чуть по диагонали - когда есть вкрапления другой координаты, что то меняется, приходит резет, и в целом все работает. Как только мышь ведется ровно, и какое то время координаты повторяются, курсор останавливается.. Что делать пока не понимаю, пытался посылать через каждое одинаковое значение четыре нуля, но что то это ни к чему не привело. Пока думаю что с этим делать.

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

    Мусье который прицепил марсианку к Агату - он знал толк в извращениях )))
    Сейчас в коллекции:
    Вектор 06Ц.01(Минск), Вектор 06Ц.01(Волжский), Вектор 06Ц.02(Кишенев), Агат 7, Агат 9, Электроника 0511 УКНЦ (СЭМЗ), Электроника 0511 УКНЦ (КВАНТ) Х2, Поиск-1.03 (VGA),Электроника БК-0011(10,11M) [3IN1], Корвет ПК8010, Партнер 01.01, Спектр-001, БАЙТ(БПО_СВТ), Волна 48, Ленинград 48, Веста 30, Компакт 256(новодел),
    и ... Pentium 200 mmx, 386SX-16, AMD K6-300 ...

  9. #88
    Master Аватар для Sandro
    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    590
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    115 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Жуть! На БК всё гораздо проще. Единственная опасность -- это пропустить щелчок энкодера, если программа тормозит. Просто надо применять стратегию -- увидел поднятые биты, учёл, сбросил мышь и всё.

    А вот на чём я бы хотел настоять всё же: мышь -- это не джойстик. Это устройство ввода координатное. То есть, надо мерить не только факт движения, но конкретно, сколько она проехала. Со сбросом, как на БК, марсианский протокол это позволяет. Предлагаемый протокол -- не очень.

  10. #89
    Master Аватар для electroscat
    Регистрация
    27.08.2019
    Адрес
    г. Ростов-на-Дону
    Сообщений
    986
    Спасибо Благодарностей отдано 
    435
    Спасибо Благодарностей получено 
    182
    Поблагодарили
    114 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sandro Посмотреть сообщение
    Предлагаемый протокол -- не очень.
    Я пока ничего не предлагаю, я просто пока не пойму как реализовать на агате марсианку из PS/2...
    Мне понятно почему на Агате так сделано, это процессор частотой 1мгц, 8 битный, там не получится долбить в марсианку запросами. По этому придумали такой способ, использовать "мусорный" бит, изменения в порту после снятия первых значени после сброса.
    Сейчас в коллекции:
    Вектор 06Ц.01(Минск), Вектор 06Ц.01(Волжский), Вектор 06Ц.02(Кишенев), Агат 7, Агат 9, Электроника 0511 УКНЦ (СЭМЗ), Электроника 0511 УКНЦ (КВАНТ) Х2, Поиск-1.03 (VGA),Электроника БК-0011(10,11M) [3IN1], Корвет ПК8010, Партнер 01.01, Спектр-001, БАЙТ(БПО_СВТ), Волна 48, Ленинград 48, Веста 30, Компакт 256(новодел),
    и ... Pentium 200 mmx, 386SX-16, AMD K6-300 ...

  11. #90
    Master Аватар для electroscat
    Регистрация
    27.08.2019
    Адрес
    г. Ростов-на-Дону
    Сообщений
    986
    Спасибо Благодарностей отдано 
    435
    Спасибо Благодарностей получено 
    182
    Поблагодарили
    114 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Чего то более менее намутил для Агата...

    Сразу вылезла проблема.. Устрйство не координатное.. Ибо с PS/2 мыши приходит скорость перемещения в виде числа по координате, а в скетче любое число больше (или меньше) нуля воспринимается как напраление. То есть, нужно само число тоже грузить в какую то переменную, и использовать для ограничения или увеличения количества выдачи в порт данных. С Агатом вообще получается сложно. Генерировать мусор в порт для того чтобы драйвер прислал резет и считал следующюю координату нужно с задержкой, а задержа в свою очередь может быть разной для разной скорости перемещения. Все это преобретает более сложный оттенок, и для меня (я уже давно не пракликовался в программировании) таки сложновато в данный момент. Тем не менее, буду продолжать движение в этом направлении. Если кому то надо последние версии кода для БК и Агата - напишите, я выложу. Буду очень признателен, если кто то с более серьезными знаниями C возьмется за дело, и сделает алгоритм идеальным )))
    Сейчас в коллекции:
    Вектор 06Ц.01(Минск), Вектор 06Ц.01(Волжский), Вектор 06Ц.02(Кишенев), Агат 7, Агат 9, Электроника 0511 УКНЦ (СЭМЗ), Электроника 0511 УКНЦ (КВАНТ) Х2, Поиск-1.03 (VGA),Электроника БК-0011(10,11M) [3IN1], Корвет ПК8010, Партнер 01.01, Спектр-001, БАЙТ(БПО_СВТ), Волна 48, Ленинград 48, Веста 30, Компакт 256(новодел),
    и ... Pentium 200 mmx, 386SX-16, AMD K6-300 ...

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

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

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

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

Похожие темы

  1. Адаптер PS/2 мыши для Commodore
    от tnt23 в разделе Commodore 16/64/128
    Ответов: 60
    Последнее: 08.02.2016, 20:42
  2. Эмуляция мыши на джойстика
    от Граф Куракин в разделе Поиск
    Ответов: 4
    Последнее: 19.10.2013, 14:07
  3. Помогите опознать стандарт COM-мыши.
    от Alex2 в разделе Устройства ввода
    Ответов: 7
    Последнее: 10.07.2010, 22:47
  4. кнопки мыши в BGE 3.05
    от SaaB в разделе Графика
    Ответов: 8
    Последнее: 04.03.2006, 16:53
  5. Подключение кемпстон мыши
    от Aprisobal в разделе Устройства ввода
    Ответов: 14
    Последнее: 10.02.2005, 15:04

Ваши права

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