Самодельный передатчик (часть 2)

ВитГо

Еще один вопросик по синтаксису СИ (я понимаю что наверное не совсем то место… но других у меня пока нет)

Описал структуру
typedef struct {
unsigned char itemcol; // Количество пунктов меню
unsigned char *items[]; // пункты меню
unsigned char upitemnum; // указатель на вышестоящий пункт меню
}MENU_STRUCT;

Теперь мне нужно ее проинициализировать значениями

__flash const MENU_STRUCT menu_info[3]={
// Cтартовое меню - 0
{ 2, { “MODEL”, “SYSTEM” }, 255 },

// Меню MODEL - 1
{ 5, { “NEW”, “SELECT”, “EDIT”, “COPY”, “DELETE” }, 0 },

// Меню MODEL - EDIT - 2
{ 6, { “TYPE”, “NAME”, “TIMERS”, “CHANNELS”, “UCH”, “FLY_MODES” }, 0 }
};

вроде так ?
но на строчку
{ 5, { “NEW”, “SELECT”, “EDIT”, “COPY”, “DELETE” }, 0 },
codeVisionAVR ругается что мол пропущена }

мозг уже плавиться… как правильно ?

p.s. эх, как же тяжко переходить на СИ с Паскаля и Дельфей 😦

EagleB3

Я не могу себя назвать продвинутым программером, но, КМК, причина в том, что есть в CVAVR (или вообще в ANSI C?) какое-то ограничение на штуку, которая, вроде как, называется динамическим массивом. Если ее в CVAVR и можно задать, то, видимо, не так, как делаешь ты. И как ее можно задать я не знаю.

Для экспериментов я обычно преобразовываю участки к более “растянутому” виду, тогда становится понятно на что именно ругается компилятор. Например:

// Cтартовое меню - 0
    {   2,
        { "MODEL", "SYSTEM" },
        255
    }
    ,
    {   1,
        "AB",
        "CD",
        "EF",
        5}
    ,
    {   6,
        { "TYPE", "NAME", "TIMERS", "CHANNELS", "UCH", "FLY_MODES" },
        0
    }
};

Теперь изменяй количество “пунктов” для второго раздела меню (удаляя сначала строку “EF”, а потом строки “CD” и “EF”) - и все будет очень наглядно.
Ощущение такое, что компилятор определяет количество элементов массива по первой строке, и обижается, если в последующих строках это количество изменяется.

И в самом деле, если в описании типа сказать либо unsigned char *items[6];, либо unsigned char *items[0];, то проканает вот такая инициализация:

__flash const MENU_STRUCT menu_info[3]={
// Cтартовое меню - 0
    {2, { "MODEL", "SYSTEM", "", "", "", ""}, 255 },
    {1, { "AB", "CD", "EF", "", "", ""},        5 },
    {6, { "TYPE", "NAME", "TIMERS", "CHANNELS", "UCH", "FLY_MODES" }, 0 }
};
ВитГо

фиксированную длинну массива знаю… но хотелось по короче… а то у меня есть менюха в которой 28 пунктов… 😃))))

EagleB3

Почитай встроенный хелп - там довольно много и довольно толково.
Еще могу прислать мануал на CVAVR v.2.03.5. Или выложить его и еще несколько толковых мануалов по CVAVR, по Си вообще и по микроконтроллерному Си в частности. Или в сети поищи, например, “CodeVisionAVR пособие для начинающих, Лебедев М.Б.” - практически перевод мануала; причем из 250 страниц автор умудрился сделать 600…

ВитГо

переделал на фиксированное количество элементов… все компилится…

остальное в личку

EagleB3
ВитГо:

у меня есть менюха в которой 28 пунктов… 😃))))

Это жесть! Это обязательно надо разбивать на подпункты, КМК.

ВитГо

Я просто боюсь что разбив сделаю путанным меню…
28 пунктов это конечные точки каждого из органов управления. их 13 плюс еще одна пара нужна…
сейчас поделил на Stick (4 элемента) , Vario (3), Switch(5), Buttons(1)…

DD

ВитГо, можно вручную выделять память с помощью getmem, и потом с помощью указателей обращаться к элементам массива в этой памяти

ВитГо
DD:

ВитГо, можно вручную выделять память с помощью getmem, и потом с помощью указателей обращаться к элементам массива в этой памяти

Да, наверное это единственный выход…
Но для меню я его применять не буду, так как экономия на нулевых стрингах прибавит в коде - скорее всего плюс минус тоже самое и выйдет…

свой вопрос закрываю…

Всем помогающим большое спасибо !!! приятно осознавать что твоему кипящему мозгу помогают ! 😃

Modris

Jest lji vozmozhnostj pereklju4itj Dual Rate s odnjim viklu4ateljem na 1,2,4 kanal , kak eto sdelano v Futaba 7C?

dollop

Конечно. Но только на hardware уровне. То есть программно этот режим в имеющеся прошивке на тумблер не повесить (разве что в виде микшеров каких-нить) А на постоянно сделать можно - вместо трех тумблеров поставить один и запараллелить соответствующие входы микроконтроллера

Aleksey_Gorelikov

Выходы (точнее входы) можно и програмно запаралелить… Хотябы в def.h одну и ту-же ногу указать.

EagleB3

Совершенно согласен!
И, более того, если есть хотя бы минимальные навыки программирования (да или просто желание разобраться с программой - на уровне определения ног никаких сложностей вообще нет!), то, IMHO, это и надо делать программно.

Отдавать три ноги контроллера под то, что можно отлично делать одной ногой - расточительство!

Кстати, как вариант, при желании/необходимости: один из неиспользуемых переключателей (SA14…SA16) можно отдать под команду “Все двойные”. И рулить двойными расходами либо по отдельности существующими переключателями, либо всеми сразу.

msv

Для этого (в тч. групповое переключение расходов одним щелчком) существуют режимы полета.

valera_o

Молодцы, ребята!!! Благодарю всем за огромную проделанную работу!
Сделал еще вариант Евгения, “повернул” экран, летал на нем. Потом купил Спектрум, потому как надежность работы на 35МГц никакая…
А вот понадобился передатчик на 8каналов, достал с пыльной полки, перепрошил версией 1.7, повернув экран и приспособив к моей раскладке тумблеров. Печатка та же, разве только заменить пищик на безгенераторный, но таки спрошу. Подскажите хотя бы в каком файле можно отменить индикацию потребляемого тока и тока в антенне? Хочу поставить модуль Корона, ток антенны и вообще нет смысла мерять.

ВитГо

А кто нить замерял насколько много времени занимает по пиксельное рисование экрана ? особенно инверсных надписей да и надписей вообще ?

пишу для ТЮФ (Турниги\Юрки\ФлайСкай) - там экранная память организована таким образом что вывод символов с координатами Y кратными 8 - будет заключаться в копировании из знакогенератора 5-6-7 байт… правда знакогенератор должен по другому символы описывать… но я уже и шрифт нашел положенный набок 😃 (от мк161)

стоит переписывать процедуру вывода символа - или эти высвобожденные ресурсы все равно погоды не сделают ?

EagleB3

2 msv, чисто идея по поводу отображения индикаторов:

Чтобы управлять отображением и при этом не менять структуру меню и не вводить лишних переменных в EEPROM, можно, наверное, сделать так: если порог сигнализатора тока антенны поставлен в “0”, то убирать с экрана пиктограмму, индикатор и цифровое значение для антенны. Можно и прочие “антенные” места (обращение к ADC канала, обсчет) обходить по этому условию. А может быть за одно и вообще всю работу с LMX2306 обходить.

ushmax

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

max-umc
ВитГо:

А кто нить замерял насколько много времени занимает по пиксельное рисование экрана ? особенно инверсных надписей да и надписей вообще ?

пишу для ТЮФ (Турниги\Юрки\ФлайСкай) - там экранная память организована таким образом что вывод символов с координатами 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…

или мне нужно как то по другому структуру модели определять?