OSD на ATmega1281
если текст или векторная графика зачем ей забивать память? на обратном ходе строчного импульса налету считать строку и помещать ее в массив в рам, а на обратном ходе кадрового импульса считать векторы и подготавливать текст по позициям
ну если кроме как считать графику больше делать нечего то согласен, а иначе не будет других задач…
тем более что строчный импульс это всего 8 мкс на все, включая прерывания… это в лучшем случае 64 команды - особо не рассчитаешь ничего
кадровый тоже не настолько велик чтобы успеть чтото расчитать из графики…
а у нас тут еще кучу периферии нужно обслужить…
так что никакой графики на лету не получиться 😦 это я уже считал…
с spi может быть засада что если ждать освобождения то это значит когда 8 бит выведены будет задержка на 1 такт минимум и это отразится на картинке
к сожалению моя макетка другим занята, поэтому я не занимался реализацией и оптимизацией алгоритма, но уверен что можно сделать “гладкий вывод” без какой либо задержки (посчитать такты команд наконец!)…
еще раз повторюсь получив очень большое разрешение, можно добиться того чтобы картинка была очень гладкой… времени на это предостаточно! получили ведь 16 тактов запаса при отправке байта ! вопрос только как их использовать… быстродействие в 2 такта на бит - тоже очень не кислый результат…
в текущей реализации 3 такта на один бит изображения и никаких запасов или возможностей к улучшению… 😦
Эх… если бы на SPI был аппаратный буфер хоть 1 регистр… жизнь была бы проста и неинтересна…
А тут… если такты считать и синхронно после передачи последнего бита (такт в такт!) записывать в сдвиговый регистр SPI след. байт… Может и есть шанс… Но ни о каком опросе флагов и тем более прерывании речи быть не может…
Эх… если бы на SPI был аппаратный буфер хоть 1 регистр… жизнь была бы проста и неинтересна…
А тут… если такты считать и синхронно после передачи последнего бита (такт в такт!) записывать в сдвиговый регистр SPI след. байт… Может и есть шанс… Но ни о каком опросе флагов и тем более прерывании речи быть не может…
а зачем считать? сделать код подготовки загрузки следующего байта 16 тактовым SPI тактированный от половины частоты всякий раз будет опустошаться за 16 тактов, банальный индийский код, без циклов и проверок,
все остальные ништяки с вычисленями пока нет отрисовки экрана (из 320 линий видимыми вроде считаются 288 + ССИОХ + КСИОХ столь недооцениваемые **Витго** во время которых можно даже разрешать прерывания ) правда в этом случае тени придется отрисовывать аппаратно по нарастанию и спаду единицы в ноль
а зачем считать?
Имел в виду считать программеру при написании кода… 😃
Увеличение разрешения по горизонтали это конечно хорошо, но писксели станут прямоугольными…
Ну и отрисовка в видео буфер для качественной графики тоже дело “времяемкое”. А еще там (в межкадровый промежуток) мне приходится читать/парсить GPS, разбирать PPM, обсчитывать всю логику АП… Конечно, если получится реально более качественная картинка, можно под все остальные задачи и второй проц подключить… Пока бум ждать практический результат Виталия…
ок, отпишусь что получилось…
Конечно, если получится реально более качественная картинка, можно под все остальные задачи и второй проц подключить
IMHO, чем ставить второй, лучше просто взять более подходящий проц.
IMHO, чем ставить второй, лучше просто взять более подходящий проц.
более подходящий это для авр наверное уже на хмега перейти
а зачем считать? сделать код подготовки загрузки следующего байта 16 тактовым SPI тактированный от половины частоты всякий раз будет опустошаться за 16 тактов, банальный индийский код, без циклов и проверок,
SPI, вот хоть ты тресни, ВСЕГДА оставляет один пустой бит, причем, СВОИХ тактов, а не клока. Проверено нопами.
Есть альтернатива в виде отдельной микрухи-сдвигового регистра на 8 бит, тактировать от прескалера таймера, но это как бы железо дополнительное.
более подходящий это для авр наверное уже на хмега перейти
В мире есть не только меги и авры. Я на 24 пике вообще с видео не парюсь , там 16 битный SPI с восьми уровневым FIFO, раз в пол строки прервался(для 256 точек) чтобы закинуть в буфер 8 слов и дальше пошел, а еще LPC выпустило кучу мелких, недорогих армов , ни как руки не дойдут на них попробовать.
SPI, вот хоть ты тресни, ВСЕГДА оставляет один пустой бит
Вот голова дырявая, ведь знал это… Даже проект какой-то изучал в выводом текста по SPI и там были дырки между знакоместами.
Есть альтернатива в виде отдельной микрухи-сдвигового регистра на 8 бит
Первый вариант в бумаге был именно такой… Потом решил проще сделать на UART в SPI режиме,- не получилось… Ну и успокоился тем, что 4 такта на пиксель мне вполне хватает, получается вполне сбалансированный по времени выполнения код для всех моих хотелок…
кстати в smalltim mini вывод тоже сделан сдвигом вручную (не так как я написал выше)…странно… я думал там сильная проработка вывода сделана…
SPI занят обменом данными с АП.
Увеличение разрешения по горизонтали это конечно хорошо, но писксели станут прямоугольными…
Если уж получится, на отдельном проце увеличить разрешение по горизонтали ,пусть даже и с зазорами между знаками,то удвоить вертикальное это как раз не проблема.
Тока не мелковато ли все получится, или все это затевается ради графики?
тут скорее более явной будет вторая проблема - быстродействие при работе с экраном - увеличение разрешения просто так не проходит 😃
Установил свою LRS на нарождающееся крылышко. Заметил, что элевоны как-то не слишком плавно ходят и задерка ощутима (просто на сервах казалось все отлично…). Стал считать…
- От момента управляющего воздействия до начала передачи пакета PPM в кодере задержка от 0 до 20мс (период PPM).
- Передача PPM - 20ms.
- После окончания PPM пакета от кодера в передатчике, проверки его валидности, передатчик начинает его гнать в ближайшем RF-фрейме через 0…30ms (период передачи пакетов).
- Передача пакета по радио ~26ms.
- После получения пакета в приемнике, он гонит полученные данные по UART в OSD на скорости 19200. Время ~6ms.
- OSD выдает полученные значения PWM-импульсом на серву в ближайшем цикле (синхронизировано с КСИ). Время 0…20ms (период КСИ).
В итоге от начала управляющего воздействия до выдачи импульса серве в сквозном тракте проходит от 52 до 122ms. 😦
Это, конечно, весьма заметно… ( и средняя задержка и ее неравномерность)
Неравномерность можно сгладить фильтром, хотя это приведет к большей средней задержки.
Вот такая забавная арифметика…
зря осд и пилот живут в одном чипе, экономия порядка 300руб - кило колбасы
и код сложнее написать учесть задержки
и случайные баги в осд могут сказаться на действиях автопилота, т.е отражается на надежности
в принципе когда много плат - это тоже не очень удобно, одноплатный - крупноват
а вот модульную конструкцию еслиб сделать как в компе материнка и дочерние в нее в любой слот
Вот такая забавная арифметика…
А из каких соображений такое большое время на изменение номера фрейма?
(период передачи пакетов)? так во всех блютузах и вайфаях по номеру фрейма определяется кто занимает канал а после передача идет до конца пакета.
зря осд и пилот живут в одном чипе
Этот момент комментировал неоднократно… Есть плюсы, есть минусы для каждого подхода, имхо оба имеют право на существование…
А из каких соображений такое большое время на изменение номера фрейма?
(период передачи пакетов)?
Пауза между пакетами 30мс(период)-26мс(время передачи) <4мс. Можно попробовать его уменьшить, но принципиально это ничего не изменит. Проблема в асинхронности получения данных с кодера и момента старта передачи. Если обновленные данные с кодера пришли непосредственно перед стартом передачи, эта задержка близка к 0. Если сразу после старта передачи, (RFM уже передает данные из своего FIFO) будут переданы только в следующем фрейме через время близкое к периоду- 30мс.
В принципе эта проблема думаю присутствует не только в моей системе…😉
Проблема в асинхронности получения данных с кодера и момента старта передачи
Наверно больше в том что время передачи больше либо сравнимо с периодом РРМ, нет готовности к передаче следующего пакета и соответственно прогнозируемой задержки на период РРМ. Если нет возможности увеличить скорость передачи то значит надо искать пути уменьшения количества передаваемых данных.
Не помню сейчас что на схеме передатчика но если там декодирование РРМ то лучше перейти на UART чтобы сократить время между опросом положения стиков и получением данных передатчиком.
На лету полезные данные можно на треть ужать по томуже принципу что и цветоразностные сигналы в телевидении.
Сам издеваюсь на ТR24P столкнулся с тем что у меня пока мозгов не хватает добиться синхронности хода часов при большом количестве прерываний но это пройдет.
Даже если время передачи будет меньше, сделав передачу по готовности данных от кодера, не уверен что получится сделать надежную ППРЧ. Радикальное решение- все сделать с минимальными промежуточными звеньями, те кодер управляет сразу RFM, и АП непосредственно связан с RFM. Но в этом случае усложняется реализация универсальности модулей, получается слишком “вещь в себе”… Ну и начинать мне бы пришлось с “чистого листа” (во всяком случае по железу, софт то просто упростится). Пока надеюсь, что эта проблема для моих задач этих подвигов не стоит, мне же не пилотажкой на соревновании управлять…
Даже если время передачи будет меньше, сделав передачу по готовности данных от кодера, не уверен что получится сделать надежную ППРЧ.
Про надежность ничего немогу сказать, просто думаю будет меньше неопределенности какие длительности будут поступать на серву: предыдущее значение потому что новые значения еще не получены или обновленные.
Радикальное решение- все сделать с минимальными промежуточными звеньями, те кодер управляет сразу RFM, и АП непосредственно связан с RFM.
Думаю здесь будет больше проблем чем выигрыша.
Вот такая забавная арифметика…
Когда с шедевром будет возможность ознакомиться?😃