OSD на ATmega1281

msv

Такой команды в атмегах нет. Собственно за один такт все равно не получится, надо подгружать данные в порт, проверять условия… Но здесь уважаемый abalex предложил гениальный код вывода строки всего по 3 такта на пиксель.

ВитГо
msv:

К сожалению передающий регистр SPI в атмегах не буферирован и выводить им графику не получится. Приходится программно двигать. Ближе к началу темы есть исходный код вывода строки.

что значит не буферизирован ?

я тут считал как то…

настраиваем частоту spi например на 1/2 такта (при тактировании в 16 мгц это будет 8 мгц - это 8 точек на 1мкс!!)
и далее:
-подготовили байт для выдачи
loop:
-ожидаем освобождения регистра данных spi
-отправляем байт для вывода в SPI SPDR (после этого spi сам будет сдвигать байт выдавая его на MOSI, и после передачи последнего бита выдаст флаг освобождения - по нему можно либо прерывание либо просто ожидание делать в цикле вывода)
-проверим все ли байты строки передали, если да то выходим
-пока передается байт по spi готовим следующий байт, у нас на это около 10 тактов (уже 2 потратили на проверку всю ли строку передали, еще 2 нужно будет на переход, и еще 2 на проверку освобождения SPI)
-переход на loop

таким образом технически разрешение по горизонтали которое можно достичь достигает около 52 мкс*8=416 точек, ИМХО, это очень даже неплохо для телевизора, пусть по 50 точек слева и справа оставим на бордер, останется 300 точек по горизонтали, столько же по вертикали - ИМХО хорошее поле для вывода!

в данном алгоритме мы на вывод пискела тратим 2 такта 16 мгц… + самое главное пока пикселы байта выводятся - мы не теряем время, и готовим следующий байт для вывода ! то есть накладных расходов между байтами вообще небудет !! ИМХО это важно поскольку позволит при достаточно серьездном разрешении получить отсутствие эффекта увеличения интервала каждые 8 точек… я не помню можно ли тактировать SPI от тактовой частоты… тогда вывод будет еще более мелкий… причем мы все равно будем успевать !

я планировал использовать внешнюю память, тем более что мне тут дали наводку на atmega162 - если к ней подключить внешнюю RAM то на все поле телевизора можно хоть картинку выводить ! (иначе не хватает внутренней памяти меги для хранения)

p.s. кстати в smalltim mini вывод тоже сделан сдвигом вручную (не так как я написал выше)…странно… я думал там сильная проработка вывода сделана…

p.p.s. посмотрел стр163 даташита на мегу162 - делитель spi не менее 2… так что разрешение что я описал максимально

alexeykozin
ВитГо:

я планировал использовать внешнюю память, тем более что мне тут дали наводку на atmega162 - если к ней подключить внешнюю RAM то на все поле телевизора можно хоть картинку выводить ! (иначе не хватает внутренней памяти меги для хранения)

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

с spi может быть засада что если ждать освобождения то это значит когда 8 бит выведены будет задержка на 1 такт минимум и это отразится на картинке

ВитГо
alexeykozin:

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

ну если кроме как считать графику больше делать нечего то согласен, а иначе не будет других задач…
тем более что строчный импульс это всего 8 мкс на все, включая прерывания… это в лучшем случае 64 команды - особо не рассчитаешь ничего
кадровый тоже не настолько велик чтобы успеть чтото расчитать из графики…
а у нас тут еще кучу периферии нужно обслужить…
так что никакой графики на лету не получиться 😦 это я уже считал…

alexeykozin:

с spi может быть засада что если ждать освобождения то это значит когда 8 бит выведены будет задержка на 1 такт минимум и это отразится на картинке

к сожалению моя макетка другим занята, поэтому я не занимался реализацией и оптимизацией алгоритма, но уверен что можно сделать “гладкий вывод” без какой либо задержки (посчитать такты команд наконец!)…
еще раз повторюсь получив очень большое разрешение, можно добиться того чтобы картинка была очень гладкой… времени на это предостаточно! получили ведь 16 тактов запаса при отправке байта ! вопрос только как их использовать… быстродействие в 2 такта на бит - тоже очень не кислый результат…
в текущей реализации 3 такта на один бит изображения и никаких запасов или возможностей к улучшению… 😦

msv

Эх… если бы на SPI был аппаратный буфер хоть 1 регистр… жизнь была бы проста и неинтересна…
А тут… если такты считать и синхронно после передачи последнего бита (такт в такт!) записывать в сдвиговый регистр SPI след. байт… Может и есть шанс… Но ни о каком опросе флагов и тем более прерывании речи быть не может…

alexeykozin
msv:

Эх… если бы на SPI был аппаратный буфер хоть 1 регистр… жизнь была бы проста и неинтересна…
А тут… если такты считать и синхронно после передачи последнего бита (такт в такт!) записывать в сдвиговый регистр SPI след. байт… Может и есть шанс… Но ни о каком опросе флагов и тем более прерывании речи быть не может…

а зачем считать? сделать код подготовки загрузки следующего байта 16 тактовым SPI тактированный от половины частоты всякий раз будет опустошаться за 16 тактов, банальный индийский код, без циклов и проверок,
все остальные ништяки с вычисленями пока нет отрисовки экрана (из 320 линий видимыми вроде считаются 288 + ССИОХ + КСИОХ столь недооцениваемые **Витго** во время которых можно даже разрешать прерывания ) правда в этом случае тени придется отрисовывать аппаратно по нарастанию и спаду единицы в ноль

msv
alexeykozin:

а зачем считать?

Имел в виду считать программеру при написании кода… 😃
Увеличение разрешения по горизонтали это конечно хорошо, но писксели станут прямоугольными…
Ну и отрисовка в видео буфер для качественной графики тоже дело “времяемкое”. А еще там (в межкадровый промежуток) мне приходится читать/парсить GPS, разбирать PPM, обсчитывать всю логику АП… Конечно, если получится реально более качественная картинка, можно под все остальные задачи и второй проц подключить… Пока бум ждать практический результат Виталия…

Игорь_Лытнев
msv:

Конечно, если получится реально более качественная картинка, можно под все остальные задачи и второй проц подключить

IMHO, чем ставить второй, лучше просто взять более подходящий проц.

ВитГо
Игорь_Лытнев:

IMHO, чем ставить второй, лучше просто взять более подходящий проц.

более подходящий это для авр наверное уже на хмега перейти

Syberian
alexeykozin:

а зачем считать? сделать код подготовки загрузки следующего байта 16 тактовым SPI тактированный от половины частоты всякий раз будет опустошаться за 16 тактов, банальный индийский код, без циклов и проверок,

SPI, вот хоть ты тресни, ВСЕГДА оставляет один пустой бит, причем, СВОИХ тактов, а не клока. Проверено нопами.
Есть альтернатива в виде отдельной микрухи-сдвигового регистра на 8 бит, тактировать от прескалера таймера, но это как бы железо дополнительное.

Игорь_Лытнев
ВитГо:

более подходящий это для авр наверное уже на хмега перейти

В мире есть не только меги и авры. Я на 24 пике вообще с видео не парюсь , там 16 битный SPI с восьми уровневым FIFO, раз в пол строки прервался(для 256 точек) чтобы закинуть в буфер 8 слов и дальше пошел, а еще LPC выпустило кучу мелких, недорогих армов , ни как руки не дойдут на них попробовать.

msv
Syberian:

SPI, вот хоть ты тресни, ВСЕГДА оставляет один пустой бит

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

Syberian:

Есть альтернатива в виде отдельной микрухи-сдвигового регистра на 8 бит

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

smalltim
ВитГо:

кстати в smalltim mini вывод тоже сделан сдвигом вручную (не так как я написал выше)…странно… я думал там сильная проработка вывода сделана…

SPI занят обменом данными с АП.

korall
msv:

Увеличение разрешения по горизонтали это конечно хорошо, но писксели станут прямоугольными…

Если уж получится, на отдельном проце увеличить разрешение по горизонтали ,пусть даже и с зазорами между знаками,то удвоить вертикальное это как раз не проблема.
Тока не мелковато ли все получится, или все это затевается ради графики?

ВитГо

тут скорее более явной будет вторая проблема - быстродействие при работе с экраном - увеличение разрешения просто так не проходит 😃

msv

Установил свою LRS на нарождающееся крылышко. Заметил, что элевоны как-то не слишком плавно ходят и задерка ощутима (просто на сервах казалось все отлично…). Стал считать…

  1. От момента управляющего воздействия до начала передачи пакета PPM в кодере задержка от 0 до 20мс (период PPM).
  2. Передача PPM - 20ms.
  3. После окончания PPM пакета от кодера в передатчике, проверки его валидности, передатчик начинает его гнать в ближайшем RF-фрейме через 0…30ms (период передачи пакетов).
  4. Передача пакета по радио ~26ms.
  5. После получения пакета в приемнике, он гонит полученные данные по UART в OSD на скорости 19200. Время ~6ms.
  6. OSD выдает полученные значения PWM-импульсом на серву в ближайшем цикле (синхронизировано с КСИ). Время 0…20ms (период КСИ).
    В итоге от начала управляющего воздействия до выдачи импульса серве в сквозном тракте проходит от 52 до 122ms. 😦
    Это, конечно, весьма заметно… ( и средняя задержка и ее неравномерность)
    Неравномерность можно сгладить фильтром, хотя это приведет к большей средней задержки.
    Вот такая забавная арифметика…
alexeykozin

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

ADima
msv:

Вот такая забавная арифметика…

А из каких соображений такое большое время на изменение номера фрейма?
(период передачи пакетов)? так во всех блютузах и вайфаях по номеру фрейма определяется кто занимает канал а после передача идет до конца пакета.

msv
alexeykozin:

зря осд и пилот живут в одном чипе

Этот момент комментировал неоднократно… Есть плюсы, есть минусы для каждого подхода, имхо оба имеют право на существование…

ADima:

А из каких соображений такое большое время на изменение номера фрейма?
(период передачи пакетов)?

Пауза между пакетами 30мс(период)-26мс(время передачи) <4мс. Можно попробовать его уменьшить, но принципиально это ничего не изменит. Проблема в асинхронности получения данных с кодера и момента старта передачи. Если обновленные данные с кодера пришли непосредственно перед стартом передачи, эта задержка близка к 0. Если сразу после старта передачи, (RFM уже передает данные из своего FIFO) будут переданы только в следующем фрейме через время близкое к периоду- 30мс.
В принципе эта проблема думаю присутствует не только в моей системе…😉

ADima
msv:

Проблема в асинхронности получения данных с кодера и момента старта передачи

Наверно больше в том что время передачи больше либо сравнимо с периодом РРМ, нет готовности к передаче следующего пакета и соответственно прогнозируемой задержки на период РРМ. Если нет возможности увеличить скорость передачи то значит надо искать пути уменьшения количества передаваемых данных.
Не помню сейчас что на схеме передатчика но если там декодирование РРМ то лучше перейти на UART чтобы сократить время между опросом положения стиков и получением данных передатчиком.
На лету полезные данные можно на треть ужать по томуже принципу что и цветоразностные сигналы в телевидении.
Сам издеваюсь на ТR24P столкнулся с тем что у меня пока мозгов не хватает добиться синхронности хода часов при большом количестве прерываний но это пройдет.

msv

Даже если время передачи будет меньше, сделав передачу по готовности данных от кодера, не уверен что получится сделать надежную ППРЧ. Радикальное решение- все сделать с минимальными промежуточными звеньями, те кодер управляет сразу RFM, и АП непосредственно связан с RFM. Но в этом случае усложняется реализация универсальности модулей, получается слишком “вещь в себе”… Ну и начинать мне бы пришлось с “чистого листа” (во всяком случае по железу, софт то просто упростится). Пока надеюсь, что эта проблема для моих задач этих подвигов не стоит, мне же не пилотажкой на соревновании управлять…

ADima
msv:

Даже если время передачи будет меньше, сделав передачу по готовности данных от кодера, не уверен что получится сделать надежную ППРЧ.

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

msv:

Радикальное решение- все сделать с минимальными промежуточными звеньями, те кодер управляет сразу RFM, и АП непосредственно связан с RFM.

Думаю здесь будет больше проблем чем выигрыша.

Vlado

Вот такая забавная арифметика…

Когда с шедевром будет возможность ознакомиться?😃

8 days later
korall

И сного о разрешении, а что если взять и разогнать проц и производительность повысится и пикселей больше влезет, провел небольшой эксперимент с 48 мегой (думаю это не принципиально, семейство то одно и ядра у них одинаковые ,других мег просто нет в наличии у меня сейчас), она прекрасно гонится внешним генератором до 40 мГц, а возможно и больше, использовал допилиный код смалтима. И вот результат разрешение в 4 раза больше.