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

DD
msv:

Схема формирователя тахометра отсюда:
radiokot.ru/circuit/digital/…/index.shtml

там на схеме перепутаны все ножки операционника, сначала долго думал почему не работает

PS: msv, не ответете на счет показаний датчика температуры при калибровке?

msv

Конечно ничего скакать не должно. Гляньте осцилографом, что идет с датчика на вход ацп. Датчик нужно обязательно шунтировать емкостью по питанию в непосредственной близости, и выход мне тоже пришлось шунтировать, иначе с него шел возбуд…

VRV
EagleB3:

Глючит. И 7.6SP0 глючит. Он нормально (вроде как) сохраняет/читает с адресов дальше 0x00ff, но не ватчит. Даже через волатил не ватчит.

Неожиданно нашлось решение, точнее даже не решение:) а просто оно заработало.
Выдрал мегу со старого проекта- в еепром пишется и трассируется до конца. Сылка narod.ru/disk/15823597000/encoder.rar.html , единственное , что было замечено при переносе мк на новый лист волшебство пропадает и снова глюк до 255 ячейки. Т.е. проверять прошивку нужно на этом листе. Если у кото разберется в чем проблема- сообщите, будет интересно узнать в каком месте искривлены руки:)

msv

Похоже довыпендривался с чехардой версий до первой помидорины на форуме…
Ну когда то ж надо начинать… 😃
Сейчас хочу написать движок для менюшек, по заветам Nick_Shl.
С тем, что сейчас наворочено, может разобраться только автор (да и то с трудом…).
Жутко не хватает прелестей ++, инкапсуляция, перегрузка функций, наследование и проч. радостей объект.ориентированного программирования. Ну ничего справимся. Вот только по срокам ничего обещать не могу…

VRV
msv:

Похоже довыпендривался с чехардой версий до первой помидорины на форуме…
Ну когда то ж надо начинать… 😃
Сейчас хочу написать движок для менюшек, по заветам Nick_Shl.
С тем, что сейчас наворочено, может разобраться только автор (да и то с трудом…).
Жутко не хватает прелестей ++, инкапсуляция, перегрузка функций, наследование и проч. радостей объект.ориентированного программирования. Ну ничего справимся. Вот только по срокам ничего обещать не могу…

Основная причина, по которой начал переписывать выложенное, невозможность разобратся с меню в исходниках + хотелось убрать/добавить свои функции.
Сейчас в очередной раз переписал движок меню(отличается от прев. поста). Основная концепция- свободное добавление/удаление/перемещение пунктов и подпунктов, с сохранением понятной структуры. Процедура отрисовки самого меню стандартная, а конечные пункты, при выборе которых изменяются параметры вынесены в отдельные процедуры, которые входят в описание меню в качестве адресов. Также перенес генерацию звука, обработку энкодера и обновление буфера на прерывания(можно усложнять математику, т.к. освобождается время мк).

Networx

2 msv, скажите пожалуйста, печатка останетса прежней, поменяетса только прошивка?
А то я начал работу над платой кодера и не хочетса ее потом выкидывать!
Спасибо, буду следить за розвитием проекта и ждать новой прошивки!

msv

Пока в очередной версии предполагается только внутренний редизайн, правда весьма серьезный. Схема, функциональность да и внешний вид не изменится.

EagleB3

Я лично развел плату под последние изменения msv (с переносом звука).
И сделал так, чтобы ни одна ныне пустая нога процессора не осталась без дорожки с контактной площадкой - потом будет можно легко проводишку припаять, если занадобится.

Собираюсь выложить проект в Протеусе (плата под Санву VG400 + TIC154; может, кому сгодится типа референса), но сначала хочу свою железяку запустить. Вдруг косяки всплывут… 😉

VRV
EagleB3:

Собираюсь выложить проект в Протеусе (плата под Санву VG400 + TIC154; может, кому сгодится типа референса), но сначала хочу свою железяку запустить. Вдруг косяки всплывут… 😉

Біло бі неплохо, тк тоже под санву расчитіваю.

Пока в очередной версии предполагается только внутренний редизайн, правда весьма серьезный. Схема, функциональность да и внешний вид не изменится.

msv, накидал свою версию меню, посмотри, может сделаешь на ней. Преимущества постом выше.

Предваврительно обявленные функции отрисовки. При этом само меню рисует функция ShowStdMenuDisp(void ) , а остальные- экраны ввода параметров.


 void ShowMainDisp(void );
  void ShowStdMenuDisp(void );
  void ShowSelectModelDisp (void );
  void ShowSaveModelDisp (void );
  void ShowCopyModelDisp (void );
  void ShowModelNameDisp (void );
  void ShowMixerDisp (void );
  void ShowCurveDisp (void );
  void ShowSetingTimerDisp (void );
  void ShowBatareyDisp (void );
  void ShowSoundDisp (void );
  void ShowDRExpDisp( void );
  void ShowChReversDisp ( void );
  void ShowCHLimitDisp( void );
  void ShowMonitorDisp ( void );
  void ShowSaveAllDisp ( void );
  void ShowCopyModDisp  ( void );
  void ShowCopyCtrDisp ( void );


Сама структура меню- все ясно и понятно(перемещение строк внутри таблицы влечет изменение меню на экране-удобно переносить и добавлять пункты)



flash MENU_STRUCT MenuTable[MenuMaxItems]=
{
//-|---NameMenuDisp---|------|level|--|----Param-|-------|---------FUNC----------
{"SCR",                       0,        0,                   &ShowMainDisp},
{   "Main",                   1,        0,                   &ShowStdMenuDisp},
{     "Model",                2,        0,                   &ShowStdMenuDisp},
{       "Select",             3,    MAX_MODELS,              &ShowSelectModelDisp},
{       "Save",               3,    MAX_MODELS,              &ShowSaveModelDisp},
{       "Name",               3,    MAX_MODELS_NAME+1,       &ShowModelNameDisp},
{       "Mode",               3,        0,                   &ShowStdMenuDisp},//&&
{     "Settings",             2,        0,                   &ShowStdMenuDisp},
{       "Controls",           3,        0,                   &ShowStdMenuDisp},
{          "Curve",           4,    CURVE_NODES+1,           &ShowCurveDisp },
{          "DR&Exp",          4,        3,                   &ShowDRExpDisp},
{       "Chanels",            3,        0,                   &ShowStdMenuDisp},
{          "Mixers",          4,   MAX_OUT_CHANS+1,          &ShowMixerDisp},
{          "CH limit",        4,        4,                   &ShowCHLimitDisp},
{          "CH revers",       4,    MAX_OUT_CHANS,           &ShowChReversDisp},
{     "Options",              2,        0,                   &ShowStdMenuDisp},
{       "Timer",              3,        0,                   &ShowSetingTimerDisp},
{       "Sound",              3,        1,                   &ShowSoundDisp},
{       "Batarey",            3,        3,                   &ShowBatareyDisp},
{       "Monitor",            3,        0,                   &ShowMonitorDisp},
{     "Save&Copy",            2,        0,                   &ShowStdMenuDisp},
{        "Save All",          3,        1,                   &ShowSaveAllDisp},
{        "Copy MDL",          3,        1,                   &ShowCopyModDisp},
{        "Copy CH",           3,        3,                   &ShowCopyCtrDisp}


};//end menutable


Ну и процедуры перемещения по меню




void CalcMenu(void)
{
unsigned char i,k;
k=0;
CurDispState.SubItems=0;
 for (i=CurDispState.CurDisp+1;i<MenuMaxItems;i++)
 {
   if (MenuTable[i].MenuLvl==MenuTable[CurDispState.CurDisp].MenuLvl) {break;}
   if (MenuTable[i].MenuLvl==MenuTable[CurDispState.CurDisp].MenuLvl+1)
   {CurDispState.SubItemArr[k]=i;k++;}
 }
 CurDispState.SubItems=k;
}

void EnterMenu(void)
{



if (CurDispState.CurDisp)
{
CurDispState.CurDisp=CurDispState.SubItemArr[CurDispState.SelectPos];
CalcMenu();
}
else
{
CurDispState.CurDisp=1;
CalcMenu();
}
CurDispState.SelectPos=0;
CurDispState.CurVal=0;
CurDispState.CurVal2=0;
CurDispState.IsSelected=0;
CurDispState.AddVal=0;
}

void ExitMenu(void)
{
unsigned char l,i;


if (MenuTable[CurDispState.CurDisp].MenuLvl>1) //??

 {
    l=CurDispState.CurDisp;
    for (i=CurDispState.CurDisp;i>0; i--)
    {
        if (MenuTable[i].MenuLvl==MenuTable[CurDispState.CurDisp].MenuLvl-1) {CurDispState.CurDisp=i;break;}
    }

    CalcMenu();

    for (i=0;i<CurDispState.SubItems; i++)
     {
     if (l==CurDispState.SubItemArr[i]) {break;}
    }
     CurDispState.SelectPos=i;
 }
 else
 {
  CurDispState.CurDisp=0;   //go main scr
 }


}


void DrawFunc(FuncPtr Function)
{
//	if ((void*)Function == NULL)
//	  return;

	((FuncPtr)Function)();
}


 void ShowDisp (void)
{





 if (IsKeyChange()||CurDispState.NeedUpdate)
 {  JoyMenuSelect();
 CurDispState.NeedUpdate=0;
 DrawFunc (MenuTable[CurDispState.CurDisp].Func);
 }



}



EagleB3

А может ли кто-нибудь прояснить: в чем состоит смысл каскада, собранного на VT2 и кусочке 4066 с выводами “10, 11, 12”?

… Допер! Кажется. Я так понимаю, это предохранитель от обрыва шнурка. Если “PPM in” перестает приходить на базу VT2, то, независимо от положения SA13 (“Тренер-Ученик”) на кодер пойдет “свой” PPM, а не внешний.

Так?

VRV
EagleB3:

А может ли кто-нибудь прояснить: в чем состоит смысл каскада, собранного на VT2 и кусочке 4066 с выводами “10, 11, 12”?

… Допер! Кажется. Я так понимаю, это предохранитель от обрыва шнурка. Если “PPM in” перестает приходить на базу VT2, то, независимо от положения SA13 (“Тренер-Ученик”) на кодер пойдет “свой” PPM, а не внешний.

Так?

А есть ли смысл делать каскад для подключения 2 пульта, если данная опция вряд ли когда будет использована?

ubd

Так?

Да.

А есть ли смысл делать каскад для подключения 2 пульта, если данная опция вряд ли когда будет использована?

Если ты не собираешься когото обучать полётам и не собираешься передатчик к симулятору подключать, то не нужна. Тренерский разъём, этот как бы неотемлемая часть любой более менее нормальной аппаратуры.

Aviator73
msv:

Между делом созрела очередная версия…

Сергей, подскажите, почему не проходит калибровка пропорциональных ручек?
Кручу ручки и крутилку 8-го канала - все ок. Ставлю по центру - точки выделяются квадратиками, как я понимаю, что центр ОК, нажимаю кнопку “Вправо” и после калибровки термометра выдает ошибку калибровки?

Плюс заметил, что в мониторе триммеры воздействуют на свои каналы, а в главном меню при отображении положения триммров каналы 3 (Trottle) и 2 (Elevator) попутаны местами. Думаю, что это из-за того, что у меня МОDE1?

И еще - огромное СПАСИБО за разработку!

ADima

Не Сергей но отвечу.
необходимо правильно выставить напряжение на ARef процентов на 10-20 больше чем на ручке и если надо подобрать сопротивления в пропорциональном канале

meKOil

Доброе время суток, Уважаемые!
Пока собирался взяться за изгатовление передатчика, пока преобретал всё нужное. Упустил из виду данную тему. Как понимаю много изменилось и в схеме, и в прошивке.
Не могли бы выложить одним архивом рабочую схему и прошивку с исходником?
Наворотов типа тахометра, термометра и т.п. не требуется…

meKOil

спасибо.
вопросик: SA14,15,16 - ?
R17 - 22 Ом
R10 - 470 Om
А то вдруг опечатка в схеме.
Кто нибудь подскажет как определить выводы в модуле “корона” 2,4?
И если мне не нужен разьем тренер-ученик, то можно не использовать U3A, U3B(4066) и все сопутсптувющие элементы?

EagleB3
VRV:

А есть ли смысл делать каскад для подключения 2 пульта, если данная опция вряд ли когда будет использована?

Имею двух сынов и жену (которая на полеты со мной выезжает чаще, чем сыновья). Необходимость подключать к этому пульту ученика не так уж и нереальна. 😉

Тем более, что второй пульт имеется.

Сегодня полдня убил на то, чтобы увидеть Мегу128 программатором (по интерфейсу SPI, через разъем XT3). Чуть не рехнулся, пока не понял, что для этого надо ногу №1 (!PEN) посадить на землю.

Nick_Shl:

В CodeVisionAVR есть всё что надо: программатор и терминал. Для прошивки нужно прошить бутлоадер с поддержкой STK500 протокола.

Прошить бутлоадер необходимо для дальнейшего “самопрограммирования”? Или он необходим даже при работе через CVAVR?

…Не из-за его ли отсутствия я имел такой секс с ногой PEN?

Блин, как хорошо на “маленьких” Мегах!..

meKOil:

вопросик: SA14,15,16 - ?

В настоящее время не используются ни в одной прошивке, насколько мне известно.

meKOil

R17 - 22 Ом
R10 - 470 Om

Да.

meKOil

И если мне не нужен разьем тренер-ученик, то можно не использовать U3A, U3B(4066) и все сопутстувющие элементы?

Даже больше - сигнал PPM для радиомодуля брать с коллектора VT4. Иными словами, от всего этого PPM-интерфейсного куска остаются только R11, R12, R13, С14, VT1 и VT2. Можно оставить С13 (и его необходимость, и его вредность для меня не очевидны).
Можешь, например, развести на плате все компоненты, но ненужные элементы не ставить. Площадки под ноги 3 и 4 микросхемы 4066 перемкнуть. Возникнет надобность - снимешь перемычку и смонтируешь сэкономленное.

И даже еще интереснее - даже транзисторы VT1 + VT2 могут оказаться не нужными. Зависит от схемотехники радиомодуля.

Aleksey_Gorelikov
ADima:

Не Сергей но отвечу.
необходимо правильно выставить напряжение на ARef процентов на 10-20 больше чем на ручке и если надо подобрать сопротивления в пропорциональном канале

Для подавляющего большинства передатчиков - в стиках резестивное покрытие имеется только в секторе хода ручек. Выставление AREF не имеет смысла, как и установка подстроечного резистора. Исключения составляют старинные пульты типа “Супранар”. Во всех остальных оптимальная регулировка должна получаться в положении подстроечника “замкнуто”.

msv

msv, накидал свою версию меню, посмотри, может сделаешь на ней.

У меня получилось наверное менее изящно.

enum TYPE_MENU_ITEM{ TMI_FREE, TMI_SUBMENU, TMI_ENUM, TMI_U_CHAR, TMI_S_CHAR, TMI_INT };
enum TYPE_DRAW_MSG{ TDM_CAPTION, TDM_ITEM_CAPTION, TDM_ITEM_PARAM, TDM_SCROLL_LINE };
#define MAX_LIST_LINES 4
#define MAX_MENU_ITEMS 11
#define MAX_DEPTH_MENU 5
//---------------------------------------
typedef struct {
flash char *Caption; // Заголовок
u_char Type; // Тип. см. TYPE_MENU_ITEM
s_int MinValue; // Мин. значение
s_int MaxValue; // Мах. значение
s_int Step; // Шаг/направления изменения
u_char OffPar; // Сдвиг параметра по X (0-default)
flash char ** EnumCapts; // Заголовки для TMI_ENUM
flash void *SubMenu; // Подменю для TMI_SUBMENU
}ITEM_DEF;
//---------------------------------------
typedef struct {
flash char *Caption; // Заголовок
flash ITEM_DEF * Items; // Пункты меню
// Аналог конструктора (или=0)
void (* MenuInit)(u_char sel, u_char top, u_char parent_item_ind);
// Процедура отрисовки (или=0)
// type тип сообщения см.TYPE_DRAW_MSG,
// возвращаем 1- разрешить дефолтовый обработчик, 0- запретить
u_char (* OnDraw)(u_char type, u_char y, u_char item_ind );
// Обработчик событий клавы. (или=0)
// флаги нажатых кнопок в глоб. переменной mnu_keys
// там же соот флаги сбросить, для блокировки стандартной обработки.
void (* OnKeys)(void);
} MENU_DEF;
//---------------------------------------
MENU_DEF flash * ME_CurMenu; // текущее меню
u_char ME_SelItem; // Выбранный элемент
u_char ME_TopItem; // Верхний элемент
void *ME_PV[MAX_MENU_ITEMS]; // Указатели на переменные параметров
bit ME_FEdit; // Флаг редактирования
// Поддержка иерархии меню
typedef struct {
flash MENU_DEF *menu;
u_char SelItem;
u_char TopItem;
}MENU_STACK;
MENU_STACK ME_Stack[MAX_DEPTH_MENU];
u_char ME_Stack_Pos;
// Флаги нажатых клавиш
u_char mnu_keys;