Автор Тема: Грязный железный хак [прототип] слабонервным - не нервничать  (Прочитано 7694 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
а узел управления на чем-то надо делать

ещё три бакса

+ монтажные платы или на чем-то надо это собрать.

итог по цене будет близок, но останется аутентичность и не будет колхоза и приколов в виде
при инициализации успевает произвольно нажать старт несколько раз

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
ещё три бакса
Забыли про пульт, сколь там баксов?
И так 2 бакса, а вернее копейки + 3 бакса, а копейки это сколько?, на верное то же пару баксов.
Так глядишь и догоним до готового

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Так глядишь и догоним до готового

ну по функционалу до такого готового точно не дотянем  :lol:
ссылка ведёт на эмуль с беспроводным джоем, это совсем не то

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
Ну хорошо, посмотрим тогда в сторону ESP-12E,
1 - позволяет ли она соединяться с такой же ESP-12E?
2 - позволяет ли она соединяться с двумя ESP-12E?

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
да хоть с десятью

Оффлайн xpk2k

  • Пользователь
  • Сообщений: 52
    • Просмотр профиля
xpk2k, исходный код выложи, и какой компилятор, не можешь с spi разобраться, поможем.
Абсолютно правДа, 2 бакса, еще и джойстик такой нужно приобрести.
Вы все правы, спора нет.
Надо расширять бюджет!
Инструкции как компилить https://retro.moe/unijoysticle2/ расписывать не буду.
У кого получится скомпилить - нужно заменить в исходниках 4 файла.
Первая попытка засунуть spi не удалась.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
Первая попытка засунуть spi не удалась.
А что так? Что делали, что изменяли?

Оффлайн xpk2k

  • Пользователь
  • Сообщений: 52
    • Просмотр профиля
Сначала кодил.
Потом ещё кодил.
И ещё покодил spi.
А потом понял что все не работает и надо сначала начинать.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
Покажите что меняли на что меняли, как подключали?
Компилятор какой?

Оффлайн xpk2k

  • Пользователь
  • Сообщений: 52
    • Просмотр профиля
К чему эти праздные вопросы.
Лучше пишите скорее реализацию spi.
Компилятор:
~/esp$ ./xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc --version
xtensa-esp32-elf-gcc (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
Оооо Linux. Ну если только на виртуалку поставить.

Ладно. Х с ним.
У меня проводной джойстик на STM32F030F4P6 3,3В, используется аппаратный spi.

Вот код самого spi, может чем поможет
Напрямую не подключал SPI к плате Dendy, через преобразователь уровня 5*3,3.
Перепробовал почти все варианты, и на резисторах и на диодах, во всех нарушалась осциллограмма сигналов со стороны 5В.
Только подошел стандартный преобразователь 5*3,3В, это который на полевых транзисторах.

Оффлайн xpk2k

  • Пользователь
  • Сообщений: 52
    • Просмотр профиля
код под спойлером оценил.
после отправки байта spi прерывание кладет в свой регистр последнее считанное с контроллера значение...
как бы это намек на то, что пока будет идти новый пинок от master-spi устройства на чтение... последнее считанное с контроллера значение уже устареет и борцы за минимальный лаг будут этим недовольны.
в регистр spi на отправку байта этот самый байт нужно вписывать сразу по прерыванию от считывания контроллера. пусть в 100500 раз чаще чем тот байт будет заюзан и отправлен по пинку от master-spi устрйоства. он будет забыт, забит, перезаписан великое число раз, но такова жертва в борьбе за лаг, минимальный лаг.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
борцы за минимальный лаг будут этим недовольны
Частота опроса джойстика - 50Гц.  20 милли секунд.


Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
PAL, я осциллографом смотрел, все измерения как бы соответствует этой темы
Даже картинку свою рисовал

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Это PAL или NTSC ?

как правило джойстик опрашивается в кадровом прерывании, то есть для PAL 50 считываний в секунду, а для NTSC 60
у PS1 к примеру, вообще не рекомендуется делать опрос чаще

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
в регистр spi на отправку байта этот самый байт нужно вписывать сразу по прерыванию от считывания контроллера. пусть в 100500 раз чаще чем тот байт будет заюзан и отправлен по пинку от master-spi устрйоства. он будет забыт, забит, перезаписан великое число раз, но такова жертва в борьбе за лаг, минимальный лаг.
В данном случае есть два варианта:
1 как у меня сделано.
2 загрузить байт в spi и ждать пока мастер его не заберет, а это 20мс. Возможно за 20мс вы уже три раза кнопку нажмете. (он будет забыт, забит, перезаписан великое число раз,)
В противном случае конфликт возникает, мастер еще не забрал весь пакет 8 бит, только 4 бита забрать успел, а вы в регистр spi продолжаете пихать байты.

Теперь возьмите обычный джойстик, там вроде 4021 стоит, сдвиговый регистр, те же самые 20мс, не так ли?

И если быть точным, то не 20мс а ~10мс, мастер за 20мс запрашивает 2 пакета.

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
xpk2k, А кто тебе мешает измерять частоту следования этих INTов (таймеров предостаточно, можно даже каптуру использовать для этого) и на основе этой информации сделать ещё один таймер, который будет срабатывать за, например, 1мс до предполагаемого следующего INTа, и внутри прерывания которого ты опросишь джой, а уже через 1мс сразу же отдашь новое значение? В принципе, опрашивать можно во второй половине этого цикла INTов и ни один ярый борец за инпут лаг не сможет его распознать, если ты ему про это не расскажешь. Они же как аудиофилы, все сплошь верующие.

PS В принципе, даже измерять не надо. Если взять NTSC с его 16мс и сразу настроить этот таймер на сработку через 14мс, то джой будет опрашиваться на NTSC системе за -2мс а на PAL системе -6мс. Естественно, что запускать таймер надо в коде INTа.
PPS Если быть корректным, то SPI.DAT надо прогружать на прерывании от STB. Причём прямым доступом в регистр, чтобы успеть, ведь там ещё есть задержка на вход в прерывание. Не у верен, что у обсуждающих тут есть подобный скилл.
« Последнее редактирование: 30 Ноябрь 2019, 06:15:18 от HardWareMan »

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
то SPI.DAT надо прогружать на прерывании от STB
Нет, STB прижал линию и clk сразу выставляется (там 2мкс всего), и казус на линии SPI получается, отладчик это показывает. Пробовал pll разгонять, на успевает он байт загрузить.

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Нет
Да, по логике работы джойстика именно STB должен быть сигналом к загрузке актуальных данных в сдвиг. А то, что:
на успевает он байт загрузить.
то это проблема не шерифа, верно? Среднестатистический опрос джойстика начинается вот так:
LDA #$01
STA $4016
ASL
STA $4016
LDA $4016
Отсчёт времени возьмём от первого STA, который по факту повлияет на STB:
#1 - 8D 16 40 STA $4016 / 4 цикла шины (3 байта опкода + запись), активация STB произойдёт на 4 цикле
#2 - 1E             ASL          / 2 цикла шины (1 байт опкода + исполнение)
#3 - 8D 16 40 STA $4016 / 4 цикла шины (3 байта опкода + запись), деактивация STB произойдёт на 4 цикле
#4 - AD 00 16 LDA $4016 / 4 цикла шины (3 байта опкода + чтение), данные считаются на 4 цикле
Таким образом, между активацией STB и фактическим чтением данных проходит 2+4+3=9 циклов шины (алгоритм может не содержать ASL, может содержать там LDA # тогда будет 4+3=7 циклов, содержать STA $4016 обязан, ибо это режим регистра в джойстике). Цикл шины у PAL машины 26МГц/16, у Денди 26МГц/15, у NTSC 21/12. Т.е. 615нс, 576нс и 571нс соответственно. Посчитаем по самому короткому ради совместимости: 9 * 571 = 5139 нс или 5,1мкс (7 * 571 = 3997нс или 3,99мкс). Так о каких ты там 2мкс вёл речь? Может у тебя гранатылогик не той системы?

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
STB прижал линию, все SPI занят, нельзя туда грузить.
Вот картинку нарисовал
и того у меня 5мкс на загрузку нового байта, к примеру на ATmega168 при 16МГц (первоначальный вариант был собран) уходит ~1мкс.
Код
если убрать две последние строки можно еще быстрее загрузить.
Пока SPI передает байт (примерно 0,2мс), я опрашиваю кнопки (на  ATmega168 при 16МГц уходит на один опрос всех кнопок 4мкс).

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
STB прижал линию, все SPI занят, нельзя туда грузить.
Кто сказал? Тебе надо успеть загрузить данные в SPI регистр до фактического чтения процессором, всего делов. Если ты подключил STB как nSS SPI, то тогда действительно нельзя, но это не наш метод. Я не знаю как там у этой богомерзкой ESP, но у православных STшек этот вход nSS можно настроить на управление программно. Т.е., пришло прерывание по фронту STB, мы загружаем регистр данных SPI и активируем nSS. А на прерывании TC (Transmission Complete) или RX мы просто деактивируем nSS. И да, главное в железо прогрузить, подтвердить прерывание можно после (обычно его делают в начале). Видимо плохо ты читаешь буквари на чипсы. Или вообще не читаешь.
PS Такого функционала у AVR нет и там это проблема, хоть и решаемая.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
Т.е., пришло прерывание по фронту STB, мы загружаем регистр данных SPI и активируем nSS.
Лишняя команда
Цитата
активируем nSS
Что мой вариант = что ваш вариант + лишняя команда = одно и тоже.

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
Лишняя команда
= не нужно соблюдать рамки длительности STB.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
И где я соблюдаю рамки длительности STB?void SPI1_IRQHandler(void) { // прерывание по окончанию передачи байта
SPI_SendData8(SPI1,last_read_controller_bytes); // в прерывании загрузка байта в регистр SPI
}

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7422
    • Просмотр профиля
s_s, я должен тебе твой же код разъяснять? Однако. Почитай хоть историю общения для приличия. Хотя не надо, это будет уже оффтопом.

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
s_s, я должен тебе твой же код разъяснять?
но не у всех же у нас есть
Цитата: HardWareMan
подобный скилл
Если вам не составит большого труда пожалуйста разъясните мне?

Оффлайн xpk2k

  • Пользователь
  • Сообщений: 52
    • Просмотр профиля
... пожалуйста разъясните мне?
Разъясняю
Вторая попытка заюзать SPI driver выпучила тот факт, что я напрочь не понял, как он работает.
Либо я путаю провода, либо одно из двух. Ссуть всей истории в том, что пин данных будто бы внезапно почему-то постоянно под напряжением.
А что так? Что делали, что изменяли?
Выяснять было совсем непонятно как, но это пришлось выяснять!
Значит приставка на мой колхоз смотрела с высока и признаков сотрудничества проявлять не спешила. Наколхозил у запотных империализдов другой прототип, который какбы опрашивать способен джойстик. Приколхозил джойстик. Джойстик жмак - другой прототип - пик. Вывод: наличествует сотрудничество.
Колхоз№1 + другой колхоз = постоянный писк будтобы я сумел нажать все кнопки сразу.
И безусловно это очевидное достижение в вопросе сотрудничества. Вывод: напряжение пина данных вышло из под контроля.
Почему? Вывод: ХЗ.
Ваши разъяснения в студию!

Оффлайн s_s

  • Пользователь
  • Сообщений: 41
    • Просмотр профиля
Так трудно гадать.
Вы весь проект со всеми файлами в архив и сюда.
У вас отладчик доступен?

Оффлайн xpk2k

  • Пользователь
  • Сообщений: 52
    • Просмотр профиля
Так трудно гадать.
Вы весь проект со всеми файлами в архив и сюда.
У вас отладчик доступен?
Смысла весь код с файлами выкладывать нет. Подправил слегка этот пример spi_slave для для того, чтобы ESP32 начала вести себя как джойстик, и по очереди строку символов по байту заправить в SPI3
код spi_slave:

код spi_host (подправленный проект ArduinoGameController):