Pull to refresh
111
0
Вячеслав @nanoslavic

Техноблогер

Send message

Вряд ли это так просто сделать, чтобы нормально смотрелось в маленьком разрешении 400x240 монохромных точек. Тут надо и дизеринг делать, и дорисовывать каждый кадр. К примеру, рисунок экрана я достаточно долго дорисовывал по пикселям, чтобы все элементы смотрелись красивее. Даже цветочки на труселях волка:) А то чисто после уменьшения оригинальной картинки там было очень ужасный вид.

Очень крутой проект! Я относительно недавно тоже делал свою версию этой легендарной игры на STM32, но я не стал уходить в эмуляцию, а просто написал свой вариант алгоритма игры и даже добавил 24-часовой вариант часов и подсчёт до 9999 очков. Причём я использовал монохромный экран 400х240 пикселей, поэтому изображение выглядит очень похоже на старый ЖКИ:)

Свой вариант я показал в видео на Ютуб https://youtu.be/e2UXSahfM6E и вконтакте https://vkvideo.ru/video-146803702_456239124

У меня теперь многие просят добавить туда мультик после набора 1000 очков:) А я рисовать анимации не умею, так бы добавил бы ради прикола:)

Ещё пока я искал инфу, нашёл такой комментарий на одном из форумов: "Режим отладки был, когда не учитывались штрафные очки. Чтобы включить его, нужно замкнуть вывод 20 процессора на минус питания. И делать это после подачи питания, иначе игра не включится." Если вы делали точный эмулятор, то, возможно, у вас этот режим отладки тоже существует:)

Потом я придумал новый вариант игры на современную тему "Илон Маск ловит Старшипы", это был вариант для моего английского канала https://youtu.be/e2QhG2kzE6A

Я отправил заявку 15 января, но её до сих пор так и не рассмотрели. Как-то медленно работают:)

Как я понял, если не включать режим flow control при открытии порта, то RTS/CTS никак не задействованы аппаратным модулем приёма-передачи, поэтому ими можно управлять программно как захочется. Если же flow control активировать при инициализации порта, тогда эти пины автоматически работают на аппаратном уровне или через драйвер системы.

А что дают два свитых провода? Ёмкость и индуктивность, которые снижают частоту? Что-то мне кажется, что такой подход сильно увеличит температурную нестабильность генератора.

Если вы про DateTime.Now.Ticks, то с этими тиками не всё так просто оказалось. В прошлой статье я использовал их для измерения времени выполнения функции, но в комментариях мне объяснили, что эти тики не обновляются в реальном времени. Я проверил экспериментально, на самом деле, они обновляются через миллисекунды.

Ну 38768 это опечатка, подправил.

Насчёт миллисекунд: конечно, в винде они есть, но вот в RTC микроконтроллера их нет, там просто какой-то регистр, выдающий от 0 до 255 в течение секунды. То есть, напрямую записывать их некуда, а заниматься пересчётом не особо охота было. Да и смысл был только в том, чтобы проверить правильность формулы пересчёта, а не добиться идеальной синхронизации.

Спасибо, любопытно. Правда я мало что понял из этого описания, достаточно запутанная схема:) Впрочем, наверняка схема подстройки в STM32 тоже непростая.

Может и с этой микросхемой что-то сделаю, есть она у меня. Но она крупнее микроконтроллера:)

На главной картинке экран от Nokia 1203, а на последней - монохромный экран на 128х64 точки с драйвером ST7567 - их много вариантов бывает. Вообще разрешение 128х64 достаточно популярное, поэтому один и тот же интерфейс можно будет сделать с разными дисплеями. Для настольных часов отличный вариант. В своём видео я рассказывал про один из таких дисплеев https://youtu.be/YvdRZc50BPs

Я делаю всякие поделки на микроконтроллерах и решил сделать часы на STM32. А раз там есть такая фишка, то почему бы её не задействовать? Нет, это не какая-то большая необходимость, а скорее просто интерес и желание немного разобраться с темой, поэкспериментировать. Хотя я до сих пор пользуюсь обычными недорогими настольными часами, которые достаточно сильно бегут вперёд. Возможно, получится их заменить более точными часами своей разработки. В этом плане есть какая-то необходимость, но не прям большая.

Попробовал YandexGPT 4 Pro RC в бесплатном режиме. С числами не особо хорошо работает (правильный ответ: 4 раза). Также код на питоне, который он мне выдал, не запустился.

И там есть показательное видео о том, как кошка выбирает отверстие для прохода https://www.reddit.com/r/catsareliquid/comments/1g68yzk/cat_really_can_just_fit_through_anything_huh/

Да, спасибо, вроде я всё это уже изучил и понял проблему. Свойство Stopwatch.Frequency возвращает true, значит, у меня таймер высокого разрешения. И вышеприведённый код я уже проверил на измерении времени выполнения расчётов в цикле - он показывает микросекунды. Например, код

Stopwatch stopWatch = new Stopwatch();
double f = 0;
stopWatch.Start();
for (int i = 0; i < 10000; i++)
{
f += (double)i / 3;
}
stopWatch.Stop();
label1.Text = ((double)stopWatch.ElapsedTicks / (double)Stopwatch.Frequency).ToString();
label2.Text = f.ToString();

всегда выдаёт примерно 5E-05 . То есть, это 50 мкс. Если менять количество циклов, то время тоже меняется через микросекунды, а не миллисекунды, как с функциями COM-порта. То есть, это реально более точный способ, но именно для задачи в статье ничего особо не изменилось.

Скорее всего намного быстрее, но это же будет не универсальное решение. То есть, такой режим используется только в API драйвера, который у каждой фирмы свой. Тогда программу надо затачивать на конкретную микросхему. В этом плане лучше будет использовать специализированные версии типа CP2104 и CH341, у которых есть дополнительные GPIO. Статья же про стандартный COM порт и его выводы:)

А, вот зачем нужно это свойство порта:)

Да, мне тоже CP2102 не подходят именно из-за корпуса. Одну кое-как припаял, но дальше перешёл на CH340 :) Хотя для устройств такой миниатюрный корпус это скорее преимущество, но не для самодельщиков:)

Да, похоже, вы правы, хотя у меня код:

Int64 start_time1 = DateTime.Now.Ticks;

Int64 start_time2 = DateTime.Now.Ticks;

label1.Text = (start_time2 - start_time1).ToString();

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

Попробовал такой вариант:

Stopwatch stopWatch = new Stopwatch();

stopWatch.Start();

bool b = MyPort.CtsHolding;

stopWatch.Stop();

label1.Text = ((double)stopWatch.ElapsedTicks / (double)Stopwatch.Frequency).ToString();

label2.Text = b.ToString();

Вроде бы это должно показывать время в секундах. Как результат - примерно то же самое: в среднем функция выполняется 2 мс для CP2102. То есть, вы правы насчёт точности DateTime.Now.Ticks , но в итоге результаты те же и со Stopwatch(); Попробовал и другие функции - тоже результат совпадает и так же значения постоянно прыгают с шагом примерно в мс.

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

Идея, конечно, гениальная:) Правда светодиоды CapsLock и NumLock вполне полезны. И ещё они включаются, когда нажимаешь на соответствующие кнопки.

Но можно добавить переключатель, который активирует эту скрытую функцию лампочек на клавиатуре:)

Information

Rating
Does not participate
Location
Россия
Registered
Activity