Свое OSD и проблемы графического video overlay

emax

Из за жестких таймингов надо писать не асме, хотя бы формирование одной строки. Си делает много лишнего уходя в прерывание. Не всегда используют SPI можно и регистр крутить и выводить его.

xmailer
emax:

Из за жестких таймингов надо писать не асме, хотя бы формирование одной строки. Си делает много лишнего уходя в прерывание. Не всегда используют SPI можно и регистр крутить и выводить его.

провел эксперемент:

  1. Вывожу в прерывании INT0 (начало новой строки) через SPI следующим образом при размере графики 80x80, т.е. массив screen[10][80]
#define WAIT while(!(SPSR & (1<<SPIF)))
//
for (uint8_t i = 0; i < GRAPHICS_WIDTH; ++i) {
            SPDR = screen[i][currentline];
            WAIT;
        }

80x80 результат
32x32 результат

  1. Все тоже что и в первом эксперименте, не не пользуюсь макрос WAIT, т.е. просто кидаю в регистр SPDR байт и NOP-ами делаю задержки. Какие NOP-ы и где подсмотрел в cl-osd.
for (uint8_t i = 0; i < GRAPHICS_WIDTH; ++i) {
            DELAY_9_NOP();
            SPDR = screen[i][currentline];
            DELAY_9_NOP();
            DELAY_1_NOP();
}
DELAY_10_NOP        ();
DELAY_7_NOP            ();
SPDR = 0x00;

получаю допустимый 80x80 результат
---------- резюме -------------
1 эксперимент своего рода tcp (гарантия проталкивания SPDR), 2 эксперимент второй udp (без гарантии проталкивания SPDR), т.е. гарантия проталкивания SPDR приводит к “конским” задержкам.

Вопрос по теме несколько сужается: как рассчитываются данные NOP-ы? каждый NOP - это NoOPeration один такт, в моем случае 1/16Мгц=62.5us. Длина строки 64us. Таким образом перед внесением в регистр SPDR байта заставляем сделать 9 NOP-ов, т.е. 62.5*9=562.5us и столько же после - почему? Как рассчитать какие NOP-ы использовать? И где их делать - сколько до внесения в SPDR, сколько после, сколько после всей строки?

oleg70
xmailer:

SPI интерфейс - это единственное решение?

Нет не единственное, но самое выгодное, т.к. это фактически аппаратный сдвиговый регистр.
(сдвигает биты байта памяти на одну ногу по сигналу тактирования, а это как раз то что нужно…)

xmailer:

алгоритм скорее всего один

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

xmailer:

Конечная цель понять алгоритмику рисования

Для меги8 вся алгоритмика сводится к выводу по строчному синхроимпульсу (int0 у Вас) расчетного количества байт в строку,
похоже у Вас уже это работает, в чём тогда вопрос (?)…
У stm32 всё одновременно и сложней и проще, там DMA есть, но куча других нюансов, требующих отдельного разговора…

xmailer

Большое спасибо за ответы!!!

oleg70:

Для меги8 вся алгоритмика сводится к выводу по строчному синхроимпульсу (int0 у Вас) расчетного количества байт в строку, похоже у Вас уже это работает, в чём тогда вопрос (?)…

Вы не могли бы пояснить по NOP-ам в конце моего поста не совсем понял как правильно их считать (то что у меня работает я подсмотрел в cl-osd) и как грамотно использовать, чтобы четко попадать во время.

oleg70:

У stm32 всё одновременно и сложней и проще, там DMA есть, но куча других нюансов, требующих отдельного разговора…

Скажите в stm32 Вы рисуете задержками или каким-то образом используете SPI? Здесь на форуме видел схему Вашего OSD и изучал конфигурацию stm-а, конечно большого опята нет, у Вас там TIM1,TIM2,TIM9 и SPI1 используется по схеме и судя по точным задержкам таймеров они Вам нужны для отрисовки строк. Интересуюсь чисто алгоритмически.

SPI при таком использовании очень удобен, закинул байт и забыл, но в как быть с обводкой черным (или градацией черного) белого цвета. Меняя направление порта черного цвета (в моем случае DDB0) можно сделать все нулевые биты данным цветом, т.е. получается черный фон, вопрос как сделать именно окаймление черным. На данном форуме читал, что для этого на stm-ах используют SPI1,SPI2 и получается выводят два слоя черный и белый?

На STM32 Вы контролируете вывод каждого пиксела?

oleg70
xmailer:

как правильно их считать

Считать - дело неблагодарное, проще подогнать экспериментально, смысл простой:
после строчного прерывания необходимо сделать некоторую задержку NOPами до вывода первого байта (левый отступ) и затем в цикле “кидать” в SPDR необходимое количество байт (в зависимости от горизонтального разрешения)… Ну и далее аналогично следующую строку и т.д. до окончания кадра. всё…

xmailer:

Вы рисуете задержками или каким-то образом используете SPI?

Тот же SPI, но только через DMA, и с внешним тактированием от таймера.

xmailer:

но в как быть с обводкой черным (или градацией черного) белого цвета.

У меня работает синхронно два SPI, т.е. один выводит белый цвет другой чёрный, естественно оперативки надо в два раза больше, ну и символы соответственно хранятся в двухцветном виде…

xmailer:

судя по точным задержкам таймеров они Вам нужны для отрисовки строк. Интересуюсь чисто алгоритмически.

Здесь задача такая: максимально избавиться от программного переключения между строками и между полукадрами, (при разрешении выше чем 320х240 уже необходимо контролировать и полукадры у видеосигнала) поэтому куча таймеров и т.д., всё фактически выводится аппаратно… Был у меня вариант (рабочий) где вообще вся отрисовка картинки была аппаратной, т.е. ядро контроллера вообще не участвовало в работе, но там маленькая обвязочка из одной микрухи всёж понадобилась…
Естественно всё это возможно только на “продвинутых” камнях с мощной аппаратной периферией, типа stm…

xmailer:

вопрос как сделать именно окаймление черным.

на Меге8 реально никак, можно только сделать белый символ на черном фоне (целое знакоместо)

xmailer

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

oleg70
xmailer:

или градацией черного

Да кстати, градации серого делаются (даже на Меге) по другому принципу, уже не через SPI, а параллельным выводом байта в порт ввода/вывода, тогда отдельные ноги порта (биты) при помощи внешнего резистивного делителя смешиваются, и получается нечто вроде ЦАП и полученное напряжение уже рисует пиксель… Сам я такой изврат не пробовал, но пробовал использовать аппаратный ЦАП stm, получается круто, только вот за пикселями “тянется хвост” из-за высокоомного выхода самого порта, короче побаловался и забил…

RW9UAO

посмотрите как у hydra или как его там сделано на stm32f4, кроме дма spi еще пара резисторов на подтяжку уровней белого и черного.
видел в cleanflight вроде.