Activity
молодец!!! Приятно видеть завершенные и оформленные проекты. Видно к чему стремится.
Экран хорош, а мне придется нокию 7110 юзать:(
Спасибо, почитаю. Жаль, что коментарии не видно, белеберда какая-то.
в блокноте открой-скорее всего с кодировкой трабл
а вооще сам проект для разбора не самый удачный(хотя если разберешся-останеться ток жки подцепить)
скажу пару слов:
даже если с таймером разберетесь и он правилоьно определит длительность каналов- показания всеравно будут прыгать, т.к в пачке идет 6-8 импульсов, соответствующих каждому каналу. Т.о. примерный алгоритм следующий:
1- найти синхроимпульс, длительность которого больше 2.5 мс(у отдельных передатчиков на канал может идти больше 2 мс)
2-начать измерение длительности импулсов, до седующего синхро. данные измерения писать в массив,
3- вывести значения длительности для выбранного канала.
Сама програма расчета(не считая сервиса вывода на жки) займет от силы 10-20 строк и уместится в обработчике прерывания.
Для отладки попробуйте симуляцию в протеусе(отлов ошибок, да и жки тоже отладить можно:))
А почему компилятор CVAVR (v.2.03.4) впадает в истерику от вроде бы безобидной команды
if (!(PING.0)) {};? Меняю букву “G” на “D” и тогда все нормально компилируется. 😵У меня линия “Enter” из разъема на PG0 заведена. И вот такой неожиданный облом…
порт G не полнный и на него не реализована структура PING.0…PING.7 см ниже
обращайся к нему стандартными функциями
It is important to note that bit selector access to I/O registers located in internal RAM above address 5Fh (like PORTF for the ATmega128 for example) will not work, because the CBI, SBI, SBIC and SBIS instructions can’t be used for SRAM access.
а понял лишнее… уже все у всех получилось:)
Понятно! Да, у шрифта font_norm описание символа = 9 байт, и в нем да, 0-й элемент сильно похож на ширину.
Но я включил у себя шрифт “font8x8”, а у него описание символа занимает почему-то всего 8 байт. И нулевой элемент на ширину совсем не похож.
И фиг с ним! Не больно-то оно и нужно, это центрирование…
k=strlenf(нечто из флеша)*8;
где к =ширина в точках
Не прибавится. Проверено - что Фокус выкладывал, что вы… Программистов тут мало. А ещё меньше тех, кому это надо. А теперь псмотрите в свой код, в код Фокуса, в код VRV - сможет в нём разобраться человек не знающий Си, но желающий его выучить, что-бы что-нибудь подправить? Сомневаюсь.
Посмотрите на мой код - что по меню, что для приёмника - форматирование везде одинаковое, откомментирована почти каждая сторока - думаете это мне надо? Я и сам могу разобраться в своём коде. Это нужно для новичков, которые ничего не умеют, но очень хотят. Иначе их желание очень быстро закончится…
Человеку, желающему выучит с не стоит пытатся это сделать на примере данного проекта- слишком много кода и особенностей(для этого есть сайт 123авр).
Скажу по себе- спустя месяц даже свой комментированный проект требует времени чтобы вспомнить что к чему.
Хотя коментарии- в определенной степени показатель культуры програмирования😁
Свой проект выкладывал для желающих и умеющих программировать, но не доконца разобравшихся в предидущих версиях:( ( особенности постами выше)
ЗЫ: а кто работал с AT90PWM3B, а еще лучше в связке с IRAMS??? есть такие?
Я сейчас пытаюсь пристроить к кодеру дисплей TIC154. За основу взял исходники от MSV.
Такое ощущение, что функция displ_head из модуля displ.c работает как-то криво. Вывод строки начинается слишком близко к середине - видимо, некорректное значение возвращает функция LCD_get_char_len из модуля LCD_3320.c.
А знаний не хватает. Не понимаю, как определяется ширина символа через font_norm[ch-32][0].
Расскажите, плиз…
точно не помню, но в двух словах: тот шрифт что используется имеет разную ширину символов в точках. Ширина указана в 0 злементе массива шрифта. Для вычисления длинны слова в точках берем кол-во символов умноженное на соотв значение длинны каждой буквы шрифта.
сорри не ту ссылку дал, вот правильная prjmod.rar
Так а что Вы хотите? Выложите свою версию с исходниками, и заинтересованных прибавится… Свое мнение о нецелесообразности коллективного развития столь несложножной поделки, уже неоднократно высказывал. Прийдется подстраиваться к чужим идеям, структурам, интерфейсам, стилю итп. А это требует серьезного менеджмента и займет больше времени, чем все еще раз под себя переписать.
Вот когда перейдем на ARM, начнем писать операционку для него, ну и дальше интерпретатор жавы, мр3-кодер, блюпуп с тачхрином приворачивать, тогда да… в одиночку сложновато справится будет… 😃
Собственно с исходниками проблем нет.
narod.ru/disk/16006018000/prj.rar.html
В архиве сам проектик в кодевижене ии модель в протеусе- ррм-ппэмит, энкодер работает итд.
Реализовано большинство базовых функций.Если найдутся заинтересованые- постараюсь обяснить что-почему, но вроде все должно быть ясно. Проект особо не документировался:(, многие куски вставлены контрол-с, но большинство кода было переработано.
Вобщем надеюсь на заинтересованность(будет интересна и критика с исправленым кодом 😃).
Самое главное в этом деле - форматирование и документирование. Иначе и дальше не разберётесь. Забывается всё очень быстро…
Ну и обязательно применение системы контроля версий - я использую TortoiseSVN и Araxis Mergre для сравнения файлов. Если есть желание могу небольшой ликбез по использованию устроить…
Если данная ветка позволяет-было бы интересно ознакомится.
Вот, вот она лажа с этими АВР! Плохая архитектура для нашего применения - у неё различная память по разному адресуется, а это значит что нельзя в функцию передавать указатель как на данные во флеше, так и на данные в ОЗУ. В конкретном примере нет возможности создания динамичных заголовков меню. Например, я хотел сделать формирование заголовка как “CH %d Mixer” и обломался. А сделать всё из ОЗУ нельзя - его и так мало… Так что действительно
Ну пожалуй от мк и не стоит требовать возможностей АРМ и х86 архитектур- задачи у них разные. А по сему обектное програмирование реализуется в мк в урезанном виде. Долго пытался найти компромис в данном вопросе- итог- нечто среднее между первыми версиями данного проекта и меню Николая. Наверное повторюсь, но всеже- главной задачей данного проекта (иначе проще купить готовую апу) считаю возможность изменения функциональность (добавить/убрать функции) в зависимости от предпочтений пользователя. Поэтому движок меню должен иметь минимальные возможности по отображению/перемещению по пунктам меню. Сама структура меню должна быть понятна на этапе инициализации
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},
{ "Swich", 4, 4, &ShowSwichDisp},
..........................................................................
пункты должны удалятся/добавлятся не требуя изменения кода программы за исключением кода, отвечающего за отображение соответствующего пункта.
Т.е. желающему модифицировать прошивку под себя допустим добавлением тахометра нужно будет вставить соотв. пункт в структуру меню и накиидать функцию отображения и изменения параметра. К сожалению реально в программном развитии пректа заинтересоваными оказались лиш 3 человека:)
А может ли кто-нибудь прояснить: в чем состоит смысл каскада, собранного на VT2 и кусочке 4066 с выводами “10, 11, 12”?
… Допер! Кажется. Я так понимаю, это предохранитель от обрыва шнурка. Если “PPM in” перестает приходить на базу VT2, то, независимо от положения SA13 (“Тренер-Ученик”) на кодер пойдет “свой” PPM, а не внешний.
Так?
А есть ли смысл делать каскад для подключения 2 пульта, если данная опция вряд ли когда будет использована?
Собираюсь выложить проект в Протеусе (плата под Санву 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);
}
}
Похоже довыпендривался с чехардой версий до первой помидорины на форуме…
Ну когда то ж надо начинать… 😃
Сейчас хочу написать движок для менюшек, по заветам Nick_Shl.
С тем, что сейчас наворочено, может разобраться только автор (да и то с трудом…).
Жутко не хватает прелестей ++, инкапсуляция, перегрузка функций, наследование и проч. радостей объект.ориентированного программирования. Ну ничего справимся. Вот только по срокам ничего обещать не могу…
Основная причина, по которой начал переписывать выложенное, невозможность разобратся с меню в исходниках + хотелось убрать/добавить свои функции.
Сейчас в очередной раз переписал движок меню(отличается от прев. поста). Основная концепция- свободное добавление/удаление/перемещение пунктов и подпунктов, с сохранением понятной структуры. Процедура отрисовки самого меню стандартная, а конечные пункты, при выборе которых изменяются параметры вынесены в отдельные процедуры, которые входят в описание меню в качестве адресов. Также перенес генерацию звука, обработку энкодера и обновление буфера на прерывания(можно усложнять математику, т.к. освобождается время мк).
Глючит. И 7.6SP0 глючит. Он нормально (вроде как) сохраняет/читает с адресов дальше 0x00ff, но не ватчит. Даже через волатил не ватчит.
Неожиданно нашлось решение, точнее даже не решение:) а просто оно заработало.
Выдрал мегу со старого проекта- в еепром пишется и трассируется до конца. Сылка narod.ru/disk/15823597000/encoder.rar.html , единственное , что было замечено при переносе мк на новый лист волшебство пропадает и снова глюк до 255 ячейки. Т.е. проверять прошивку нужно на этом листе. Если у кото разберется в чем проблема- сообщите, будет интересно узнать в каком месте искривлены руки:)
наконец энкодер вместо кнопок
а нельзя ли сделать как то так что бы все управлялось с одного колеса как в футабе ?
пару постов назад кидал проект в протеусе с меню на знкодере(колесо+кнопка=от мыши)
EagleB3, по собственному опыту, старайся не делать ререходов под смд, их тогда паять трудно, а так симпатично. После 5 числа ожидаю свою вг400, буду ломать:)
И еще вопрос больше к моделистам, кто активно использует пульты. Какие функции в основном задействованы? Какие лишние? Каких не хватает? Если у кого есть желание и терпение-накидайте примерную структуру ВАШЕГО меню. Если подобный вопрос обсуждался- кинте ссылку.
Интересно, потому что смысла сказанного я не понимаю 😃. Сами пункты у меня тоже статические и хранятся в памяти программы. Динамическая только структура описатель меню и то только для того, что бы реализовать простое задание значений по умолчанию(шрифты и т.д.).
У меня наоборот - обновление экрана без прерываний. На главном экране 10 раз в секунду - таймер с сотыми секунды 😎. Обновление всего экрана занимает приблизительно 16 мс - тестировал на железе. Генерация импульсов идёт в прерывании. Все остальные задачи сидят на другом таймере. Для них предусмотрена разрешение прерываний что бы генерация импульсов шла без проблем и не реентерабельность, что бы не подвесить пульт.
Про симуляцию: Нафиг! У меня с ней были постоянные проблемы. Отлаживатся на железе нужно. Я использовал STK500 совместимый бутлоадер(могу выложить) + вывод отладочной информации в UART. Для связи использовал USB шнурок от старого телефона с конвертером USB-UART внутри.
Дело в том что я меню реализовал как статическую таблицу переходов, где хранятся не адреса а номера функций отрисовки экрана(структуры не всегда корректно отображаются в протеусе):
void InitDisp(void);
void ShowDisp(void);
void ShowMainDisp(void );
void ShowStdMenuDisp(void );
void ShowSelectModelDisp (void );
void ShowCopyModelDisp (void );
.......................................................................
#define MainDisp 0
#define MainMenuDisp 1
#define ModelMenuDisp 2
#define SelectModelDisp 3
#define SaveModelDisp 4
#define ModelNameDisp 5
#define SetTransDisp 6
#define ControlsMenuDisp 7
#define MixerDisp 8
#define CurveDisp 9
..............................................................................
flash unsigned char *MenuTxt[] =
{
"MENU\0",
"MAIN\0",
"Model\0",
"Select\0",
"Save\0",
"Name\0",
"Trns.\0",
"Controls\0",
"Mixers\0",
"Curve\0",
.....................................................
flash unsigned char MenuTable[MenuMaxItems][MenuMaxStruct] =
{
//-----------NameMenuDisp-----------|---- ExitDisp-----------|-ExitItem---|--Items--|-IsEndDisp --|----------------- ItemsDisp=MenuMaxDeep-10-------------------------------|
{ MainDisp, _NONE_ , 0, 0 , 1, _NONE_,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ MainMenuDisp, MainDisp, 0, 4, 0, ModelMenuDisp,ControlsMenuDisp,OptionMenuDisp, SaveMenuDisp,_NONE_ },
{ ModelMenuDisp, MainMenuDisp, 0, 4, 0, SelectModelDisp,SaveModelDisp, ModelNameDisp,SetTransDisp ,_NONE_},
{ SelectModelDisp, ModelMenuDisp, 0, MAX_MODELS, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ SaveModelDisp, ModelMenuDisp, 1, MAX_MODELS, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ ModelNameDisp, ModelMenuDisp, 2, MAX_MODELS_NAME+1, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ SetTransDisp, ModelMenuDisp, 3, 0, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ ControlsMenuDisp, MainMenuDisp, 1, 4, 0, MixerDisp,CurveDisp,ChanelDisp, AdvanceCtrDisp ,_NONE_},
{ MixerDisp, ControlsMenuDisp, 0, MaxControlsNames+1, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ CurveDisp, ControlsMenuDisp, 1, CURVE_NODES+1, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ ChanelDisp , ControlsMenuDisp, 2, 4, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ AdvanceCtrDisp, ControlsMenuDisp, 3, 4, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ OptionMenuDisp, MainMenuDisp, 2, 3, 0, TimerMenuDisp,BatareyDisp,MonitorDisp ,_NONE_ ,_NONE_},
{ TimerMenuDisp, OptionMenuDisp, 0, 0, 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ BatareyDisp, OptionMenuDisp, 1, 0 , 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ MonitorDisp, OptionMenuDisp, 2, 0 , 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ SaveMenuDisp, MainMenuDisp, 3, 3 , 0, SaveAllDisp,CopyModDisp ,CopyCtrDisp ,_NONE_ ,_NONE_},
{ SaveAllDisp , SaveMenuDisp, 0, 1 , 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ CopyModDisp, SaveMenuDisp, 1, 1 , 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_},
{ CopyCtrDisp, SaveMenuDisp, 2, 3 , 1, _NONE_ ,_NONE_ ,_NONE_ ,_NONE_ ,_NONE_}
};//end menutable
собственно само переключение :
JoyMenuSelect(); \\ реакция на енкодер
switch(CurDispState.CurDisp)
{
case MainDisp : ShowMainDisp();
break;
case MainMenuDisp: ShowStdMenuDisp();
break;
case ModelMenuDisp: ShowStdMenuDisp();
break;
case SelectModelDisp : ShowSelectModelDisp();
break;
case SaveModelDisp: ShowSaveModelDisp();
break;
case ModelNameDisp: ShowModelNameDisp();
break;
case ControlsMenuDisp: ShowStdMenuDisp();
break;
........................................................................
По прерываниям spi- по даташиту сосетуют использовать прерывания при высоких значениях предделителя от 64 и выше. Обидно терять циклы для ожидания готовности spi.
На счет железа согласен(пример глюки протеуса при записи еепром), однако мое железо бедет корректироватся в зависимости от реализации программы, а возится с макеткой лень:)
Кстати случайно наткнулся на такой проектик www.smartpropoplus.com/dnn/Home/…/Default.aspx
Правда насколько я понял используется декдирование с помощю аудиокарты.
narod.ru/disk/15823597000/encoder.rar.html наброски меню для енкодера.Проект в протеусе 7.6.
На сегодня последняя фраза и спать:)
Качать не стал, но глянул видео - интересная штука с больними возможностями.
Но повторюсь- для чб дисплея с макс разрешением 100Х100 сие счасте не обязательно. Тем более что хорошая библиотека меню написана Николлаем. Могу кинуть свою(попроще).
Я ток за арм, тем более сам хотел с ним поработать, да руки не доходят. Но лично у меня ни аппаратных ни програмных инструментов под него нет.
На будущее вижу его ток как основу OSD для полетов по камере, но помойму его также реализовали на меге:)
Кстати набросал перегрузку буфера через прерывания- освободилось еще немного времени проца:)
Да кстати если есть прямая ссылка на сей страшный протокол pcm- кинте, интересно глянуть с чем не сможет справится уарт(а на чем идут последние санвы кстати тоже любопытно?)
Ecли вы не предполагаете декодирование видео, то АВР вполне достаточен для задач ру. Простая прикидка - пачка сигнала ппм=20мс. При частоте 12 мгц =12/50=600 000 машинных циклов для обновления данных о каналах. При этом само обновление - по прерыванию простой записю в регистр из массива вычисленных значений. Если не использовать операций деления(заменять сдвигом) и не вычислять значений неизменных каналов, то вся математика займет пару десятку процентов. Касаемо затрат по обновлению дисплея- тоже копейки если не рисовать элипсы и смнусоиды:) При этом само обновление в главном экране 1 раз в сек(для таймера), а в остальных меню по факту изменений(или также 1 раз за сек).
Касаемо PCM - насколько я понимаю в данном случае вместо таймера задействуется модуль uart для передачи данных о состоянии каналов, однако стандарт передачи для каждого производителя отличается.
Как я гоаворил прошивка не новая, просто не смог разобратся в выложенных:) и вставлял из них куски а кое что дописывал, т.к хотел изменить способ ввода и сделать легко изменяемое меню. До структуры меню Николая конечно далеко, но вроде в своем пока не запутался:).
Для меня данный проект интересен не конечной реализацией(хотя и она интерена:)), а самим процессом, дабы не утерять а иногда и приумножить:) знания мк и с. Я думаю если ктото заинтересуется изучением АРМ, то перенести данный проект на другую платформу не составит труда, т.к даже графика написана на с. В этом плане микрочип к примеру склоняется больше к ассеблеру(из свободных проектов и AN).
Использование 16 и более разрядных мк повысит точность при том же быстродействии, но нужна ли она?
При ходе стика в 60 градусов и высоте 2 -3 см вы имеете порядка 3 см линейного перемещения. Даже операции с 8 разрядами при полной шкале отцифровки дадут разрешение 0,15 мм. Кстати именно для этого хочу ставить нормировщики на оу.( руки пока не дошли до аппаратной реализации)
ps: кстати как кинуть атач с моделю? принимает только графику.
pps: да и запись данных в лсд их памяти тоже по прерыванию(без ожидания флага внутри программы), а это примерно по 60 циклов на каждое обращение к spi (вот сегодня этим как раз и займусь:))
Все тотже EBay. Причем именно его немецкая версия(ebay.de). Очень много лотов выставляется Graupner. Зайдите-посмотрите цены:P(правда в 10 евро нужно попасть на удачный лот (вг-устаревшая модель)). Единственная трудность с оплатой - немцы не жалуют пайпал, а предпочитают перевод:)(около 300грн для одной транзакции:)). Поэтому нужно отбирать еще и по способу оплаты.(или заводить друга в Германии:)). Кстати на английском(co.uk) тоже попадаются неплохие варианты - но там нужно уговаривать для отправки в страны СНГ.😃 Кстати тамже (.com)заказывал два дисплея нокиа 7110 по ~3 доллара.
ЗЫ:А для кого летать первостепенно и есть хотябы 100 убитых енотов - то на хоббисити есть 9 каналка за 70 + (20-30 модуль)$.
Люди добрые, помогите… Уж очень хочется нормально отлаживаться в протеусе (7.5 SP3), а он, зараза, не хочет адресовать больше 256 байт епрома. Уж и бинарник размером 4К ему подкладывал и ручками пытался MODDATA править, один фиг страшие разряды адреса игнорирует… Это конкретный косяк модели или как-то лечится??
Похожая проблема и у меня. Модели представлені массивом структур в еепром. Так вот при симуляции структура пишется всегда по нулевому адресу. Тож думал косяк в программе, но в студио еепром заполняется без ошибок. И еще- в протеусе файл служит для начальной инициализации еепром. При последующей симуляции данные еепром сохраняются во вспомогательном файле симуляции. Могут быть сброшены через меню дебаг.
ЗЫ: хотел отправить архив с моделю в протеусе но стоит ограничение на тип файлов(только графика)\справку читал:)\
Николай, спасибо за ответ по меню. Интересна была прежде всего реализация динамического легко маштабируемого меню. Т.к ответ пришел чуть позже:) успел набросать свою версию. Прежде всего не стал использовать структуры с указателями, а использовал статическую таблицу переходов(на мой взгляд получилоссь достаточно наглядно) которая дает представление об иерархии всего меню.
Если будет интересно- скину куски.
А основная идея управления пульта- отказ от кнопок и использование энкодера.
В качестве такового используется колесо мыши:).
Пока отлаживаю в протеусе- жду VG400 за 10 евро:)
По поводу проверки еепром в сообщения выше- реализовал проверку срс при загрузке соотв модели(в структуру модели при записи пишется вычисленное значение).
Также планируется использование програмного отключения передатчика, что позволит однократно читать модель при включении, внесенные изменения держать в рам и записывать еепром при выключении или через меню.
В общем идей масса- посмотрим как реализуется в железе.
( отдельное спс родоначальникам данной ветки, т. к. многие вещи были использованы методом контрол+с) 😃