Самодельный передатчик (часть 2)
Почитай встроенный хелп - там довольно много и довольно толково.
Еще могу прислать мануал на CVAVR v.2.03.5. Или выложить его и еще несколько толковых мануалов по CVAVR, по Си вообще и по микроконтроллерному Си в частности. Или в сети поищи, например, “CodeVisionAVR пособие для начинающих, Лебедев М.Б.” - практически перевод мануала; причем из 250 страниц автор умудрился сделать 600…
переделал на фиксированное количество элементов… все компилится…
остальное в личку
у меня есть менюха в которой 28 пунктов… 😃))))
Это жесть! Это обязательно надо разбивать на подпункты, КМК.
Я просто боюсь что разбив сделаю путанным меню…
28 пунктов это конечные точки каждого из органов управления. их 13 плюс еще одна пара нужна…
сейчас поделил на Stick (4 элемента) , Vario (3), Switch(5), Buttons(1)…
ВитГо, можно вручную выделять память с помощью getmem, и потом с помощью указателей обращаться к элементам массива в этой памяти
ВитГо, можно вручную выделять память с помощью getmem, и потом с помощью указателей обращаться к элементам массива в этой памяти
Да, наверное это единственный выход…
Но для меню я его применять не буду, так как экономия на нулевых стрингах прибавит в коде - скорее всего плюс минус тоже самое и выйдет…
свой вопрос закрываю…
Всем помогающим большое спасибо !!! приятно осознавать что твоему кипящему мозгу помогают ! 😃
Jest lji vozmozhnostj pereklju4itj Dual Rate s odnjim viklu4ateljem na 1,2,4 kanal , kak eto sdelano v Futaba 7C?
Конечно. Но только на hardware уровне. То есть программно этот режим в имеющеся прошивке на тумблер не повесить (разве что в виде микшеров каких-нить) А на постоянно сделать можно - вместо трех тумблеров поставить один и запараллелить соответствующие входы микроконтроллера
Выходы (точнее входы) можно и програмно запаралелить… Хотябы в def.h одну и ту-же ногу указать.
Совершенно согласен!
И, более того, если есть хотя бы минимальные навыки программирования (да или просто желание разобраться с программой - на уровне определения ног никаких сложностей вообще нет!), то, IMHO, это и надо делать программно.
Отдавать три ноги контроллера под то, что можно отлично делать одной ногой - расточительство!
Кстати, как вариант, при желании/необходимости: один из неиспользуемых переключателей (SA14…SA16) можно отдать под команду “Все двойные”. И рулить двойными расходами либо по отдельности существующими переключателями, либо всеми сразу.
Для этого (в тч. групповое переключение расходов одним щелчком) существуют режимы полета.
Молодцы, ребята!!! Благодарю всем за огромную проделанную работу!
Сделал еще вариант Евгения, “повернул” экран, летал на нем. Потом купил Спектрум, потому как надежность работы на 35МГц никакая…
А вот понадобился передатчик на 8каналов, достал с пыльной полки, перепрошил версией 1.7, повернув экран и приспособив к моей раскладке тумблеров. Печатка та же, разве только заменить пищик на безгенераторный, но таки спрошу. Подскажите хотя бы в каком файле можно отменить индикацию потребляемого тока и тока в антенне? Хочу поставить модуль Корона, ток антенны и вообще нет смысла мерять.
А кто нить замерял насколько много времени занимает по пиксельное рисование экрана ? особенно инверсных надписей да и надписей вообще ?
пишу для ТЮФ (Турниги\Юрки\ФлайСкай) - там экранная память организована таким образом что вывод символов с координатами Y кратными 8 - будет заключаться в копировании из знакогенератора 5-6-7 байт… правда знакогенератор должен по другому символы описывать… но я уже и шрифт нашел положенный набок 😃 (от мк161)
стоит переписывать процедуру вывода символа - или эти высвобожденные ресурсы все равно погоды не сделают ?
2 msv, чисто идея по поводу отображения индикаторов:
Чтобы управлять отображением и при этом не менять структуру меню и не вводить лишних переменных в EEPROM, можно, наверное, сделать так: если порог сигнализатора тока антенны поставлен в “0”, то убирать с экрана пиктограмму, индикатор и цифровое значение для антенны. Можно и прочие “антенные” места (обращение к ADC канала, обсчет) обходить по этому условию. А может быть за одно и вообще всю работу с LMX2306 обходить.
ВитГо, думаю, что погоды не сделают. Кроме того, даже если вывод станет дольше, на PPM это не скажется, а на глаз заметно не будет, думаю.
ОК, тогда наверное пока париться не буду…
А кто нить замерял насколько много времени занимает по пиксельное рисование экрана ? особенно инверсных надписей да и надписей вообще ?
пишу для ТЮФ (Турниги\Юрки\ФлайСкай) - там экранная память организована таким образом что вывод символов с координатами Y кратными 8 - будет заключаться в копировании из знакогенератора 5-6-7 байт… правда знакогенератор должен по другому символы описывать… но я уже и шрифт нашел положенный набок 😃 (от мк161)
стоит переписывать процедуру вывода символа - или эти высвобожденные ресурсы все равно погоды не сделают ?
В 3310 она организована точно также. Выводить символы копированием байтов имеет смысл при чисто текстовом индикаторе, это упрощает код. При графическом режиме работы индикатора выводить шрифт лучше попиксельно, тогда делается функция PutChar(x,y,char) и символы рисуются в любом месте индикатора, да и делать вывод шрифтом разного размера проще.
еще один вопросик про синтаксис СИ
есть структура например такая
typedef struct {
unsigned char MODEL_TYPE; // тип модели
int EPR; // например крайняя правая точка канала
} MODEL;
можно ли создать массив указателей на эти параметры ?
что то типа
int *valpoint[2] = { &(int) MODEL.MODEL_TYPE, &MODEL.EPR }
что и где чем является я буду программно отслеживать… нужно чтобы массив адресов на параметры мог указывать на разные типы данных…
пока получаю ошибку компилятора что например MODEL_TYPE имеет тип unsigned char, а не например int…
или мне нужно как то по другому структуру модели определять?
даже наверное не int *varpoint а просто какой то тип pointer… что нить такое в си есть ?
Есть, называется void*, но тогда Вам придётся всегда помнить, на что оно указывает…
Например:
int A;
char B;
void* p = (void*)&A;
void* q = (void*)&B;
int a = *(int *)p;
char b = *(char *)p;
Здесь (int*)p – преобразование p к типу “указатель на int”, а *(int*)p уже даёт тот самый int.
Наконец появилось свободное время! Проверил работу кодёра в том месте, где было подозрение на ошибку - всё работает нормально!
Сергей, спасибо ещё раз!