Как стать автором
Поиск
Написать публикацию
Обновить

ESP32 тоже отчасти немножко ПЛИС? Делаем динамическую индикацию на матрице светодиодов за 0 тактов процессора

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров17K
Всего голосов 104: ↑104 и ↓0+139
Комментарии33

Комментарии 33

ЗакрепленныеЗакреплённые комментарии

Судя по даташиту - это похоже на матрицу с HUB75 интерфейсом (панели с простыми драйверами). Отсюда согласно последней странице даташита (не понимая иероглифы) можно догадаться, что HC595 с выходной защелкой по фронту используется только для селектора строк, а для выводимой информации используются TB62706, где выходная информация запоминается по уровню. Поэтому "странное" поведение тут latch - на самом деле нормальное. Для устранения мерцания без остановки clock на время latch тут бы потребовало использовать сигнал разрешения выхода TB62706 и сам latch совмещать с поледним битом данных.

Кстати для блокировки CLOCK на время LATCH можно еще было обойтись одним внешним транзисторным каскадом по схеме OK или ОЭ где вместо питания использовать LATCH.

Я не понял, через что формируется изображение самой бегущей строки? Откуда берется начертание шрифта, иконка погоды, как они выводятся на экранный буфер (как раскладываются на экране - как высчитываются координаты)?

Это уже слишком обширная тема для статьи, благо, буфер с раскладкой пикселей по вертикали можно тысячей и одним способом соорудить — от конверсии статичной картинки и до рендера каким-нибудь способом.

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

Начинается костыльный велосипед где-то тут, и потом уходит сюда.

ESP32 тоже отчасти немножко ПЛИС?

Название статьи - просто жуть. Каким местом esp плис??? КАКИМ??
То, что если использовать аппаратный SPI с DMA можно очень быстро работать, а интерфейсы на ногодрыгах - жесть смерть и ардуинщичество - ну да. Я могу еще добавить, что, вроде бы, в esp есть аппаратный chip select (кинуть его на latch, да по диаграммам они не одинаковы, но 74hc595 защелкивается по фронту, так что работать будет), можно вообще не приходя в сознание управлять 74hc595 залупив DMA в кольцевой режим.

Ну типа можно обрабатывать сигналы ПЛИСом, а можно на микроконтроллере. Можно же? Можно.

А так да, так же звучит странно, как если сказать: гитара тоже отчасти немножко помидор, или пиджак тоже немножко велосипед.

Так в статье первая половина текста практически о том и есть, что с аппаратным CS на защёлку работало, но уплывали тайминги, а с кольцевым DMA — аппаратный CS всегда активен, ибо транзакция никогда не завершается.

На ногодрыгах, кстати, там вся параллельная шина во всех драйверах других дисплеев сделана, ибо в базовой есп32 нету parlio/dedicated io — и вполне себе справляется, так что тут тоже как повезёт %)

Каким местом esp плис??? КАКИМ??

Ну как, до настоящей-то ему конечно как крабом до Китая. Но тем не менее — логическую функцию программно в железе реализовать получилось? Получилось. Прикоммутировать это железо потом к ногам контроллера? Тоже вполне себе. А то, что функция на один вентиль по сути — это уже нюансы, тем более, что MCPWM'а там аж два и у каждого аж по три входа и два выхода — если захотеть, можно и покруче завернуть.

Так что перефразируя @GospodinKolhoznikиз коммента ниже: за помидор гитара вряд ли проканает, а вот за скрипку, если уж совсем прижало — может быть. У всех слушателей, правда, уши вытекут за первые четыре такта (как от синтезатора на шине данных I2S из прошлой статьи), но на безрыбье, как известно, и рыбу раком...

это просто последовательно соединённые CT-триггеры:

это последовательно соединенные D-триггеры.

Поправил, спасибо!

Отличный проект!

Чем обусловлен выбор используемых матриц? Почему бы не использовать для подобного проекта матрицы на адресных светодиодах?

Очевидно, ценой. Но разве есть матрицы адресных светодиодов с таким мелким шагом?

Матрицы с али из 2812 идут с шагом 10 мм. Самые плотные ленты бывают по 144 модуля на метр, но из них аккуратную матрицу не склеить, потому что ширина ленты больше, чем расстояние между модулями.

Самые плотные на али я видел (и проверял) 240 штук на метр. Правда они cob

Тем, что изначально проект был написан для плазменного дисплея 101х16 пикселей, с глубиной 1 бит на пиксель, то бишь монохром. Ну и как уже выше ответили — так плотно адресные диоды напихать сложно.

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

До кучи при астигматизме все эти RGB-диоды издалека распадаются в радужную кляксу, в отличие от монохромных.

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

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

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

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

Для тех, кто особо дискретную логику не застал: 74HC595 — микросхема сдвигового регистра. Статей о принципах его работы можно найти много в интернете, но по сути это просто последовательно соединённые CT-триггеры:

Каждый раз, когда тактовый сигнал переходит в состояние лог. 1, седьмой триггер «забирает» бит, который был в шестом. Шестой забирает оный же у пятого, и так далее. Бит же со входа микросхемы «сохраняется» в нулевом триггере.

Вот эти места нужно уточнить. В даташите на 74HC595 описаны классические D-триггеры, работающие по фронту тактового сигнала. Не по уровню. Это принципиальная разница. Для тактового сигнала важен не сам логический уровень, а переход от логического нуля к логической единице.

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

В общем, устройство микросхемы лучше всегда смотреть в даташите. Доверять сторонним сайтам не стоит

Переношу проект с есп8266 под Ардуино на есп32 под фриртос. Стандартный метод, который на ура работал на 8266, на есп32 показал дёрганье ногами 595й. Подумал, может особенности есп32 или фриртос. Переписал под spi и dma - всё заработало.

Потом пришлось сделать несколько старых плат. Спаял, прошил. То же дёрганье ногами 595й. От есп32 заразилась? Код подкосил, пока переносил? Всё перепроверил, всё нормально. А потом вспоминаю, что впаивал 595е с новой закупки. Нашёл старые, впаял - всё ок.

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

Маркировка на новых и старых 1 к 1, только дата выпуска разная. Так что 595я 595ой рознь получается. В чем прикол - хз. Нет времени и нужды разбираться.

Возможно, что по таймингам в даташите и те и другие в допуски попадают, вот завод их и отгружает

Покуда сигнал защёлки находится в состоянии лог. 0, все биты с выходов триггера напрямую проходят на выход. Стоит же защёлку перевести в лог. 1, и эти биты будут зафиксированы на выходе, даже если состояние триггеров с тех пор поменялось.

Ну нет же, все совсем не так. Биты с выходов триггера ни при каких обстоятельствах не проходят напрямую на выход. Они фиксируются на выходах при переходе клока защелок из 0 в 1, то есть выходные защелки срабатывают по фронту. А при постоянном сигнале (хоть 0 хоть 1) выходы меняться не будут.

Про то же самое выше написал @ClockEnable, однако ж наблюдаемое поведение отличалось. Со стадии макетки и натыкивания картинки перемычками я в статье распинаться не стал, но наблюдаемое поведение было именно таким — если защёлка находится в лог. 0, то картинка едет по мере тактирования, если в лог. 1, то стоит на месте.

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

Таки туплю, на макетке всё нормально было! (Ну восемь утра, как же не тупить в самом-то деле :-) Так что скорее всего просто по таймингам сигналы слишком плотные с есп32 выходят для этих конкретных регистров, вот и получается такая мазня.

Если поведение отличается, то это уже не 595-я микросхема, а что-то другое :) Я работал с 595-ми от разных производителей и всегда их поведение было стандартным.

Я, если честно, так и не понял что вы там навертели с DMA и SPI, и почему эти три линии каким-то образом оказались несинхронными, не смотря на то, что тактируются клоком одного SPI... Я не знаком с ESP32 и не понял всех этих хитрых маневров. Но сдается мне, что вы все же перемудрили с софтом и ошибка именно в нем.

Или там действительно стоят не 595-е.

Блин, говорили мне с утра не читать комментов, в итоге всё перепутал, и пупу и лупу и далее по тексту. Ещё раз и тезисно:

Шаг первый — шлём по SPI и используем аппаратный chip select на защёлку, как выше предлагал @Kudriavyi. Всё работает, но т.к. очередь циклится программно — начинает залипать посреди экрана со временем.

Шаг второй — бесконечный DMA SPI, по прерыванию защёлка, ибо аппаратный CS в бесконечной транзакции никогда не отпускается. Получается мыло, ибо не всегда проц готов обработать прерывание вот прям щас, а SPI молотит себе и молотит. Довольно очевидный итог.

Шаг третий — бесконечный DMA SPI, защёлка как часть шины данных. И вот тут-то хрен его знает почему, но либо защёлка не успевает захлопнуться до того как тактовый сигнал перевернётся — т.е. зазор между фронтом шины данных и фронтом частоты слишком мал; либо вместо 595 там реально какая-то дичь и работает так, как я описал — но в итоге без вот этого логического прикола тоже получается какая-то мазня.

В общем, тут как всегда — в теории, теория и практика неразделимы, а на практике это две большие разницы. Я просто описал драйвер, который сработал на большой частоте для меня, и уже стабильно работает который месяц, разгоняясь при желании и до 100-200FPS — вдруг кому пригодится :-)

Всё работает, но т.к. очередь циклится программно — начинает залипать посреди экрана со временем.

Вот этого я так и не пойму :)

Я бы слал по строкам. Зарядил в ДМА 128 бит первой строки, запустил отправку. В прерывании окончания отправки мигнул стробом выходных защелок и запустил следующую строку. И так до последней строки, а потом опять с первой.

Одна из реализаций в статье именно такой и была, и увы

Залипать посреди экрана начинает из-за того, что не всегда процессор может вовремя отработать прерывание, и оно может сколько-то времени висеть в очереди

Гм, не видел такой реализации в статье. Было две схожих, но не таких:

  1. ДМА гоняется по кругу в автоматическом режиме, сигнал защелки висит на одном из служебных сигналов SPI или DMA.

  2. ДМА гоняется по кругу в автоматическом режиме, сигнал защелки выставляется вручную.

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

Я бы вообще одно ядро оставил на звук и картинку. У нас их если что два :) типа;

  • делаем поток на ядре 1 и стартуем его

  • Создаем таймер 1/60, повторяемый, внутри колбэка разрешаем отрисовку

  • В цикле while ждем флаг отрисовки, забираем со сбросом

  • Вход в критическую секцию

  • Выдуть в дма строку и запустить отправку

  • Дождаться отправки дма, повторить по всем строкам

  • Выйти из критической секции

  • Переход на начало while

Так даже звук можно сюда же сунуть :) у нас 260 мгц мощи.

А там по сути так и сделано, разве что к ядрам не прибито, планировщик сам решает что куда. Ну и звуковой поток срёт пока срётся, отдавая буфер в драйвер и дальше прыгая на taskYIELD, безо всяких таймеров.

Судя по даташиту - это похоже на матрицу с HUB75 интерфейсом (панели с простыми драйверами). Отсюда согласно последней странице даташита (не понимая иероглифы) можно догадаться, что HC595 с выходной защелкой по фронту используется только для селектора строк, а для выводимой информации используются TB62706, где выходная информация запоминается по уровню. Поэтому "странное" поведение тут latch - на самом деле нормальное. Для устранения мерцания без остановки clock на время latch тут бы потребовало использовать сигнал разрешения выхода TB62706 и сам latch совмещать с поледним битом данных.

Кстати для блокировки CLOCK на время LATCH можно еще было обойтись одним внешним транзисторным каскадом по схеме OK или ОЭ где вместо питания использовать LATCH.

По транзистору немного ошибся - там лучше полевик.

А слона-то я и не приметил! Ну наконец-то хоть кто-то разрешил все наши споры "какого хрена" в комментах выше. Это объясняет и то, почему ореолы в глючных вариантах двигались сугубо горизонтально, а не по диагонали.

Впрочем, теперь уже переписывать смысла нет — работает же, а сигнал разрешения выхода так удачно пригодился для ШИМирования яркости :-)

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

Если точнее: к одному выходному и к одному входному сигналам разных перефирийных модулей.

в другие микроконтроллеры, включая новые tiny вводят конфигурируемые логические элементы которые делают их еще более плис

"14 ног на один и-не" давно не нужно, у всех производителей есть семейства tinylogic, у Ti, например. Один логичнский элемент и 5 ног в миниатбрном корпусе.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий