Специальные цены   новые товары
Закрытая тема
Страница 5 из 70 ПерваяПервая ... 3 4 5 6 7 15 ... ПоследняяПоследняя
Показано с 161 по 200 из 2785

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

Тема раздела Самодельная электроника, компьютерные программы в категории Общие вопросы; У меня при выключении портился EEPROM на первых порах, пока не включил boden. Причем портились случайные группы ячеек, вовсе не ...

  1. #161
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    58
    Сообщений
    2,376
    У меня при выключении портился EEPROM на первых порах, пока не включил boden. Причем портились случайные группы ячеек, вовсе не первые... И даже не в моменты записи... С тех пор как включил boden ни одного сбоя не замечал. Поэтому так и не дошли руки написать контроль целостности eeprom. Хотя конечно это надо бы на всякий сделать, работы минут на 10...
    Лично у меня сложилось впечатление, что проблема нулевой ячейки- это качующий из форума в форум миф.. Ну может и была когда проблемная партия мег с этим глюком, но ни одного официального документа на эту тему не попадалось... В моей версии нулевая ячейка eeprom- первый символ в названии первой модели. У кого нибудь она портилась?

  2.  
  3. #162
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    Цитата Сообщение от msv Посмотреть сообщение
    Лично у меня сложилось впечатление, что проблема нулевой ячейки- это качующий из форума в форум миф.. Ну может и была когда проблемная партия мег с этим глюком, но ни одного официального документа на эту тему не попадалось...
    Да, вполне может быть, что это предание...

    Цитата Сообщение от msv Посмотреть сообщение
    С тех пор как включил boden ни одного сбоя не замечал.
    BOD-рулез. А уж встроенный-то грех не использовать.

  4. #163

    Регистрация
    07.05.2007
    Адрес
    Израиль, Хайфа
    Возраст
    40
    Сообщений
    1,204
    Записей в дневнике
    7
    Цитата Сообщение от msv Посмотреть сообщение
    В моей версии нулевая ячейка eeprom- первый символ в названии первой модели. У кого нибудь она портилась?
    Да, у меня портилась. Но это случилось только при очень частом вкл/выкл передатчика (контакт по питанию фиговый был) Но там и не такое могло испортиться ;-)

  5. #164
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    Ааааа....

    Тогда с очевидностию вытекает следующий вопрос: портилась при этом ТОЛЬКО первая ячейка? Или и другие тоже?

  6.  
  7. #165

    Регистрация
    07.05.2007
    Адрес
    Израиль, Хайфа
    Возраст
    40
    Сообщений
    1,204
    Записей в дневнике
    7
    Ну, как говориться, вопрос конечно интересный. Но ответа не знаю. То что первая буква в названии первой модели изменилась - это точно. Забито было "Manon", а стало "первуюбуквунепомнюanon". Помню, удивился. Ничего другого я не заметил, и на всякий случай все же обнулил еепром.

  8. #166

    Регистрация
    15.05.2005
    Адрес
    Санкт-Петербург
    Возраст
    52
    Сообщений
    167
    Цитата Сообщение от msv Посмотреть сообщение
    Лично у меня сложилось впечатление, что проблема нулевой ячейки- это качующий из форума в форум миф.. Ну может и была когда проблемная партия мег с этим глюком, но ни одного официального документа на эту тему не попадалось...
    Давным-давно у Атмела был такой AT90S2313, и для него:

    AT90S2313 Rev. B/C Errata Sheet ( описание известных проблем ):
    ...
    3. Reset During EEPROM Write
    If reset is activated during EEPROM write, the result is not what should be expected. The EEPROM write cycle completes as normal, but the address registers reset to 0. The result is that both the address written and address 0 in the EEPROM can be corrupted.

    Problem Fix/Workaround
    Avoid using address 0 for storage, unless you can guarantee that you will not get a reset during EEPROM write.

    По-русски: если EEPROM пишется и пришел сброс, то регистр адреса EEPROM будет сброшен в 0, и часть процесса записи ( до сброса ) будет в нужную ячейку, а часть ( после сброса ) - в 0-ю, в итоге обеим может поплохеть. И предлагается не хранить в 0-й ячейке ничего важного.

    Но у этого процессора при сбросе обнулялся регистр адреса EEPROM, а потом для всех более новых ( включая меги ) это обнуление убрали. Хотя, например, при включении питания в этом регистре м.б. и 0 будет ( фирма не гарантирует, но все-таки... ), а если включение нечеткое ( плохой контакт и т.п. ) - процессор может взглючить и инициировать запись в EEPROM, и как раз в 0-ю ячейку.
    Поэтому я на всякий случай после каждого чтения EEPROM ( и после записи, разумеется, дождавшись ее конца ) обнуляю регистр адреса. Понятно, это всего лишь уменьшает вероятность, но все-таки лишняя подпорка, которая м.б. когда-нибудь и удержит падающий забор ( или самолет ).

    Хотя непонятно, почему они на период записи вообще аппаратно не блокируют запись в регистры EEPROM - наверняка это не сложно.

  9. #167
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    58
    Сообщений
    2,376
    ОК, спасибо! Теперь понятно откуда ноги растут.
    Все же надеюсь, что BOD справится со своей задачей и не даст МК творить что попало...

  10.  
  11. #168
    Забанен
    Регистрация
    01.12.2008
    Адрес
    Киев
    Возраст
    32
    Сообщений
    95
    Цитата Сообщение от Aleksey_Gorelikov Посмотреть сообщение
    Вадим, тебе имеет резон срисовать схему тренер\ученик с твоей аппы. Там достаточно интересно все реализовано. Передатчик включается при подсоединении шнура, Выключатель питания продублирован ключем и аппа отключается не тогда, когда ты тумблером щелкнул, а когда проц закончит запись в епром и в "спячку" ляжет.

    К томуж и детали у тебя все есть. Ничего покупать не придется.
    2 Aleksey_Gorelikov, подскажите где посмотреть по какой схеме и как подключаетса выключатель питания, на дополнительном ключе!
    ПС: ресую печатку под себя и хочу сразу добавить туда схему выключения!
    Спасибо!

    Цитата Сообщение от msv Посмотреть сообщение
    У меня при выключении портился EEPROM на первых порах, пока не включил boden. Причем портились случайные группы ячеек, вовсе не первые... И даже не в моменты записи... С тех пор как включил boden ни одного сбоя не замечал. Поэтому так и не дошли руки написать контроль целостности eeprom. Хотя конечно это надо бы на всякий сделать, работы минут на 10...
    Ех, неумею я писать коды!
    Поетому буду ждать и надеятса на Вас!
    Спасибо!

  12. #169

    Регистрация
    15.05.2005
    Адрес
    Санкт-Петербург
    Возраст
    52
    Сообщений
    167
    Цитата Сообщение от msv Посмотреть сообщение
    Все же надеюсь, что BOD справится со своей задачей и не даст МК творить что попало...
    Полусамодельная зарядка для аккумуляторов на ATmega32, коммерческая прошивка ( автор - Vadim Kushnir, aka Vad64 ), сделано прилично, так что, видимо, и все фьюзы записаны как надо. Недавно менял в ней индикатор, а у него габариты чуть больше, при завинчивании продавило изоляцию и входное питание замкнуло на землю ( с дребезгом, т.е. несколько раз ). В итоге - зарядка попросила перекалибровку, т.е., видимо, слетела EEPROM. После перекалибровки работает.
    Хотя эксперимент не совсем чистый - я еще когда ее собирал, видимо, коротнул один из выводов порта куда-то, ему слегка поплохело, и м.б. не только ему, а еще чему-нибудь внутри процессора ( хотя вроде все работало ).
    Да и, теоретически, при бросках питания может перекосоглючить что-то в самом аппаратном блоке, который запись EEPROM отрабатывает, и куда сигнал сброса по идее не подключен, т.к. запись в EEPROM продолжается и во время сброса.
    Так что не знаю...

    М.б. процессор от остального питания диодом отделять и емкость на X000 мкф вешать, чтобы не было резких бросков при любых включениях-выключениях ( в т.ч. при плохом контакте аккумуляторов и т.п. ), BOD срабатывал бы в комфортных условиях, и после его срабатывания - заряда емкости хватало бы еще и на окончание м.б. начатой записи в EEPROM. Ну и после сброса - в программе паузу ( 10 мс ? ) делать и потом еще проверять окончание записи в EEPROM до какой-либо работы с ее регистрами.

  13. #170
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    ...Я своим киндерам сделал "бюджетатор" для контроля времени работы за компьютером. Дивайс определяет пользователя по таблетке Touch Memory (DS1990); пока таблетка в считывателе и если баланс положительный - разрешает включить блок питания компьютера и списывает время в балансе. Питается оно от дежурки компьютера, часики (DS1307) на бекапе CR2032.
    Так вот, чтобы мое жулье не пыталось пороть остаток бюджета варварскими методами (выдергивая вилку компьютера из розетки) я внешний БОД (4,7В) повесил за входным фильтром, и отсюда же питается ЖКИ и прочая индикация. После этой точки идет шоттка, за ней - кондюк на 3000 мкф. И питается с этого кондюка один только контроллер. Внутренний БОД (4,2В) висит на питании контроллера. Сигнал с внешнего БОДа запускает внешнее прерывание. По этому прерыванию экстренно сохраняется EEPROM и запускается процедура выключения.

    Пока не слетало...

  14. #171

    Регистрация
    15.03.2003
    Адрес
    Самара
    Возраст
    46
    Сообщений
    5,610
    Зачем EEPROM при наличии 1307 и CR2032 ?

  15. #172
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    А где же на каждого бюджетируемого члена семьи хранить размер ежедневного бюджета, остаток бюджета "на сегодня", штраф (за "аварийное" отключение компьютера), да и само понятие "сегодня"?

    Можно было бы в таблетке, но у нашего домофона таблетки склеротичные (DS1990).

  16. #173
    v61
    v61 вне форума

    Регистрация
    05.04.2008
    Адрес
    Omsk
    Возраст
    59
    Сообщений
    114
    Чего-то тема в сторону домофонов поехала...

    У кого-нибудь есть опыт питания кодера от 3.3 Вольт?
    С модулем радиоканала на 2.4 ГГц вроде логично питать все усройство от 1S

  17. #174

    Регистрация
    15.03.2003
    Адрес
    Самара
    Возраст
    46
    Сообщений
    5,610
    DS1307 имеет 56 байт ОЗУ, питаемого от батарейки, не говоря уже о встроенном календаре.

  18. #175
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    ... А Mega8535 имеет 512 байт EEPROM. Что же его, ножовкой отпиливать, раз DS1307 в схеме есть?

    К тому же мои террористы уже дважды на дивайс покушались: первый раз с перемычками, второй раз - с кусачками. Насмотрелись боевиков, понимаешь.

    А если ты про количество циклов перезаписи, так 100.000 раз мне более чем достаточно. Страниц 5..10 назад на эту тему уже один холивар вели; КМК, второй не нужен.

    Цитата Сообщение от v61 Посмотреть сообщение
    У кого-нибудь есть опыт питания кодера от 3.3 Вольт?
    С модулем радиоканала на 2.4 ГГц вроде логично питать все устройство от 1S
    Если делать по уму, то надо:
    - либо перепихивать его на низковольтный контроллер, работающий на 12МГЦ;
    - либо ставить преобразователь StepUp, раскачивать 1S до 5V и питать им штатную Atmega128;
    - либо брать 2S/3S и ставить преобразователь StepDown;
    - либо брать ATMega 128L и надеяться, что при питании 3,3В она вытянет 12МГц (но вот это уже не по уму, КМК!).

    Себестоимость решения с преобразователями - от 50 рублей (1 канал на MC34063) до... ну, скажем, 400 рублей (два канала на LM2674).

    Лично я предпочитаю вариант №3. Доводы:
    - В любом поле аккумуляторы 2S и 3S найдутся. 1S - не факт;
    - Можно питаться хоть от борта грузовика (24В);
    - "Тренер-Ученик". Интерфейс у апп где-то что-то в районе 8..10 вольт. Ты уверен, что "Ученик" поймет 3,3В?
    - Имея 9 вольт (с аккумулятора) и 5 вольт (со стабилизатора), ты можешь добавлять в аппу практически что угодно. Имея 4,3В..3,3В - КМК, существенно меньше.
    Последний раз редактировалось EagleB3; 04.12.2009 в 22:57.

  19. #176

    Регистрация
    15.02.2003
    Адрес
    Минск, Беларусь
    Возраст
    47
    Сообщений
    1,205
    Записей в дневнике
    31
    Отстал немного :-). К посту 2160. Не самый лучший вариант, не по инженерному. Эпоксидка, не самый лучший клей для "китайской" пластмассы, слишком хрупкий. С "заду" кнопки лучше было бы приклеить упор, или надфилем проточить углубление под корпус кнопки а потом вклеить на циакрин.

  20. #177
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    Я думал и про первое, и про второе.
    И решил пока не делать.

    Кнопка триммера - не самое ответственное место; даже если она и отвалится, то большой беды случиться не должно. А сделать с проточками или упором можно и в процессе ремонта.

    С другой стороны:
    1) Кнопка довольно плоская, собственно толкатель у кнопки - узкий. Заглубить кнопку - и он будет контактировать с приводом уже не всей толщиной, а половиной.
    2) Фото было сделано после того, как эпоксидка нанесена в один слой. После его затвердевания (где-то через час-полтора после нанесения) было капнуто дополнительно сзаду и с боков, так что своеобразный упор сделан. Отлит из эпоксидки. Надеюсь, что этого хватит. Разница в плечах рычага незначительная, разница в усилиях на пальце и на кнопках небольшие. Причем палец трет накатку на триммере "на сдвиг".

  21. #178
    DD!
    DD! вне форума

    Регистрация
    11.11.2008
    Адрес
    Рязань
    Возраст
    37
    Сообщений
    117
    а я упоры делал вертикальные из куска спицы, мертво получается, просто сверлил дырочки в основе чуть меньше диаметра спицы, там до куда должна доходить подвижная часть и вставлял в них, в натяг, маленкие кусочки тонкой вязальной спицы, а потом приклеевал кнопки, так чтобы на них не было как бы лишнего усилия

  22. #179

    Регистрация
    20.03.2007
    Адрес
    Minneapolis, MN, US
    Возраст
    38
    Сообщений
    344
    Цитата Сообщение от EagleB3 Посмотреть сообщение
    Можно (и полезно, и нужно) контролировать содержимое EEPROM подсчитывая код CRC. Как этого можно сделать написал Nick_Shl там же.
    Могу написать ещё раз . Сначала скачиваем файл с функциями расчёта CRC. Затем добавляем следующий кусок кода туда, где происходит модификация EEPROM:
    Код:
    // *****************************************************************************
    // ***   Мусорная переменная - нулевая ячейка подвержена самопорче   ***********
    // *****************************************************************************
    static eeprom unsigned char EEPROM_TRASH @(0x0000);
    
    // *****************************************************************************
    // ***   Переменная для хранения CRC, размещена в конце EEPROM   ***************
    // *****************************************************************************
    static eeprom unsigned short EEPROM_CRC @(0x1000 - sizeof(unsigned short));
    
    // *****************************************************************************
    // ***   Определения для удобства   ********************************************
    // *****************************************************************************
    // Адрес начала области EEPROM по которой будет считатся CRC
    // Равен нулевому адресу EEPROM(0) + размер мусорной переменной
    #define EEPROM_CRC_START ((unsigned char eeprom *)(0x0000 + sizeof(EEPROM_TRASH)))
    // Размер области EEPROM по которой будет считатся CRC
    // Равен размеру EEPROM - размер мусорной переменной - размер переменной с CRC
    #define EEPROM_CRC_SIZE (0x1000 - sizeof(EEPROM_TRASH) - sizeof(EEPROM_CRC))
    
    // *****************************************************************************
    // ***   Подсчет CRC EEPROM и его записть   ************************************
    // *****************************************************************************
    static inline void Recalc_EEPROM_CRC(void)
    {
        // Считаем новый EEPROM CRC и записываем его в EEPROM
        EEPROM_CRC = Crc16_eeprom(EEPROM_CRC_START, EEPROM_CRC_SIZE);
    }
    
    // *****************************************************************************
    // ***   Подсчет CRC EEPROM   **************************************************
    // *****************************************************************************
    inline unsigned short Get_EEPROM_CRC(void)
    {
        // Считаем EEPROM CRC
        return(Crc16_eeprom(EEPROM_CRC_START, EEPROM_CRC_SIZE));
    }
    
    // *****************************************************************************
    // ***   Проверка корректности CRC EEPROM   ************************************
    // *****************************************************************************
    inline unsigned char Is_EEPROM_CRC_Correct(void)
    {
        // Считаем EEPROM CRC и сравниваем с записанным
        // Если совпадает - возвращаем ИСТИНУ
        if(EEPROM_CRC == Crc16_eeprom(EEPROM_CRC_START, EEPROM_CRC_SIZE)) return(TRUE);
        // Иначе - ЛОЖ
        else return(FALSE);
    }
    После каждой записи в EEPROM нужно вызывать функцию Recalc_EEPROM_CRC(). Поэтому часто записи лучше не делать . Это относится к триммерам.
    При запуске делаем что-нибудь вроде этого:
    Код:
        if(Is_EEPROM_CRC_Correct() == FALSE)
        {
            // Выводим запрос подтверждения сброса
            MsgBoxF("EEPROM CRC ERROR\nReset to factory\ndefaults ?", &Font_6x8, "ERROR", NULL);
    
            // Ждем отпускания кнопок, если были нажаты
            while(HB_ENTER || HB_BACK);
            // Ждем нажатия кнопок
            while(!HB_ENTER && !HB_BACK);
            // Eсли нажали ВВОД - сбрасываем
            if(HB_ENTER) TX_Reset();
        }
    Цитата Сообщение от EagleB3 Посмотреть сообщение
    либо брать ATMega 128L и надеяться, что при питании 3,3В она вытянет 12МГц (но вот это уже не по уму, КМК!).
    По уму было бы запустить не на 12, а на 8 МГц. Вот только во всех версиях что я видел это сложновато . На этот счёт я тоже уже высказывался. Сначала делаем определения:
    Код:
    // *****************************************************************************
    // ***   Общие определения   ***************************************************
    // *****************************************************************************
    #define AVR_Clock_Freq 16000000              // Частота работы МК
    #define Main_Timer_Clock  (AVR_Clock_Freq/8) // Частота работы таймера
    А затем в математике используем так:
    Код:
        // Длительность импульса:
        //          значение канала(+-0,5 мс) + центральное положение(1,5 мс)
        output[CH] = output[CH]               + (int)(Main_Timer_Clock/666.666);
        // приведение к int нужно для оптимизации: вычисленное на этапе компиляции число использовать как int
        // забавно получилось: 1,5 мс это как раз 1/666,6(6) секунды...
    
        // Если получившийся импульс меньше 0,9 мс (1/1111 сек) - ограничиваем
        if(output[CH] < Main_Timer_Clock/1111) output[CH] = Main_Timer_Clock/1111;
    
        // Если получившийся импульс больше 2,1 мс (1/476 сек) - ограничиваем
        if(output[CH] > Main_Timer_Clock/476) output[CH] = Main_Timer_Clock/476;
    В случае изменения частоты работы достаточно изменить одно определение. В случае изменения делителя таймера - другое . Боятся за падение производительности не стоит - компилятор все константные выражения вычисляет в момент компиляции.

    Цитата Сообщение от v61 Посмотреть сообщение
    С модулем радиоканала на 2.4 ГГц вроде логично питать все усройство от 1S
    А модуль какой? Если для "апгрейда" 35/72 МГц, то он рассчитан на большое напряжение и у него внутри стоит линейный стабилизатор. Если вы ему дадите 3.3 В - думаю он вообще не запустится...

  23. #180

    Регистрация
    20.03.2007
    Адрес
    Minneapolis, MN, US
    Возраст
    38
    Сообщений
    344
    Продолжаем. В личку поступил вопрос:
    Цитата Сообщение от VRV
    Если есть возможность, поделитесь плз куском по созданию иерархического меню(или ссылками).
    Отвечаю.
    Заголовок "движка"(не весь, только то, что относится к главной функции меню):
    Код:
    /*******************************************************************************
    *  UI_Engine.h
    *
    *  Радиоуправление: Движок пользовательского интерфейса, заголовок
    *
    *       Copyright (c) 2009 Nick Shl
    *           All rights reserved.
    *
    *
    *  Изменения:
    *
    *  Mar 25, 2009  Nick_Shl  Первоначальная версия
    *
    */// ***************************************************************************
    
    // *****************************************************************************
    // ***   Описание пункта меню   ************************************************
    // *****************************************************************************
    typedef flash struct typeMenuButton
    {
        flash char *   str;            // Название пункта меню
        void (*fun) (char AddParam);   // Функция вызываемая при нажатии ВВОД
        char * (*GetStr) (char * Buf, char AddParam); // Функция вывода дополнительной информации
        char AddParam;                 // Дополнительный параметр, передаваемый в функции
    } MenuButton;
    
    // *****************************************************************************
    // ***   Описание меню   *******************************************************
    // *****************************************************************************
    typedef struct typeMenuPad
    {
        flash char *    CaptionStr; // Название меню, выводимое в заголовке
        FontProfile *  CaptionFont; // Указатель на профайл шрифта заголовка
        FontProfile *     MenuFont; // Указатель на профайл шрифта пунктов меню
        flash MenuButton * Buttons; // Указатель на массив описания пунктов
        char            ButtonsNum; // Количество пунктов меню
        char            CurrentPos; // Выбранный пункт
        void      (*Before) (void); // Функция вызываемая перед отображением меню
        void      (*After)  (void); // Функция вызываемая перед отображением меню
    } MenuPad;
    
    // *****************************************************************************
    // ***   Главный цикл меню   ***************************************************
    // *****************************************************************************
    void MenuCycle(MenuPad * Menu);
    А это сама главная функция движка меню:
    Код:
    /*******************************************************************************
    *  UI_Engine.c
    *
    *  Радиоуправление: Движок пользовательского интерфейса
    *
    *       Copyright (c) 2009 Nick Shl
    *           All rights reserved.
    *
    *
    *  Изменения:
    *
    *  Mar 25, 2009  Nick_Shl  Первоначальная версия
    *
    */// ***************************************************************************
    #include "UI_Engine.h"
    
    // *****************************************************************************
    // ***   Главный цикл меню   ***************************************************
    // *****************************************************************************
    void MenuCycle(MenuPad * Menu)
    {
        int i;
        unsigned char Color;
        unsigned char MenuHeaderH = 0;
        unsigned char StartPos = 0;
        unsigned char MenuCount = 0;
        unsigned char Kbd = 0;
        unsigned char ScrollHeight = 0;
        unsigned char ScrollBarHeight = 0;
        unsigned char ScrollBarWidth = 0;
        unsigned char ScrollBarStart = 0;
        unsigned char strLen;
        unsigned char bufLen;
        FontProfile * CaptionFont = Menu->CaptionFont;
        FontProfile * MenuFont = Menu->MenuFont;
    
    #ifdef DEBUG
        printf("MenuCycle();\r");
        delay_ms(1);
    #endif
    
        // Проверки
        if(Menu == NULL) return;          // Если не передали основную структуру - выходим
        if(Menu->Buttons == NULL) return; // Если не передали структуру кнопок - выходим
        if(Menu->ButtonsNum == 0) return; // Если количество пунктов меню равно 0 - выходим
        if(CaptionFont == NULL) CaptionFont = &Font_8x12; // Если не передали шрифт заголовка - устанавливаем по умолчанию
        if(MenuFont == NULL) MenuFont = &Font_6x8;        // Если не передали шрифт пунктов - устанавливаем по умолчанию
    
        MenuHeaderH = Font_8x8.H + CaptionFont->H;
    
        // Подсчет количества пунктов меню, помещающихся на экране
        MenuCount = (HeightS - MenuHeaderH - 3) / MenuFont->H;
        // Если на экране помещается больше чем есть в меню - ограничиваем
        if(MenuCount > Menu->ButtonsNum) MenuCount = Menu->ButtonsNum;
    
        // Высота полосы прокрутки: высота экрана - высота заголовка меню
        ScrollHeight = HeightS - (MenuHeaderH + 2 + 2);
    
        // Высота индикатора полосы прокрутки:
        // (количество отображаемых пунктов меню * количество доступных точек) / количество пунктов меню
        ScrollBarHeight = ((unsigned int)MenuCount * ScrollHeight) / Menu->ButtonsNum;
        // Если размер индикатора больше половины полосы прокрутки - приравниваем к половине
        if(ScrollBarHeight > ScrollHeight/2)
        {
             ScrollBarHeight = ScrollHeight/2;
        }
    
        // Ширина индикатора полосы прокрутки:
        ScrollBarWidth = 4;//MenuFont->W - 2;
    
        do{
            // Очищаем экран
            gfx_ClearBuf();
    
            // Отрисовываем заголовок меню
            gfx_SetXY(0, Font_8x8.H);
            gfx_PutFlashStr(Menu->CaptionStr, 0xFF, CaptionFont);
            gfx_DashLine(0, MenuHeaderH, WidthS, MenuHeaderH);
    
            // Если вызывающему нужно что либо выполнить какие-либо действия - вызываем
            if(Menu->Before != NULL) Menu->Before();
    
            do
            {
                // Очищаем место под заголовок с номером модели, иконкой и режимом
                gfx_FillRect(0, 0, WidthS - 1, Font_8x8.H, 0x00);
    
                gfx_SetXY(0, 0);
                // Номер модели
                sprintf(tmpBuf, "%d", Settings.ModelNum + 1);
                gfx_PutStr(tmpBuf, 0xFF, &Font_8x8);
                // Сдвигаем позицию рисования на 4 точки
                gfx_ChangeXY(3, 0);
                // Значек верта
                if(CurModel.type == TYPE_HELI)
                {
                    gfx_Char(125, 0xFF, &Font_8x8);
                    gfx_Char(126, 0xFF, &Font_8x8);
                }
                // Значек самолета
                if(CurModel.type == TYPE_PLANE)
                {
                    gfx_Char(127, 0xFF, &Font_8x8);
                    gfx_Char(128, 0xFF, &Font_8x8);
                }
                // Сдвигаем позицию рисования на 4 точки
                gfx_ChangeXY(3, 0);
                // Название режима
                gfx_PutStr(CurModel.Mode[FLY_MODE].name, 0xFF, &Font_6x8);
    
                // Стартовая позиция индикатора полосы прокрутки:
                // высота заголовка меню + (текущяя позицию в меню * количество доступных точек для индикатора) / количество пунктов меню
                ScrollBarStart = MenuHeaderH + 2 + 1 + (Menu->CurrentPos * (unsigned int)(ScrollHeight - ScrollBarHeight)) / (Menu->ButtonsNum - 1);
                // Если выбран последний пункт меню устанавливаем индикатор в самый низ,
                // т.к. при подсчете может потерятся точность и появится дырка
                if(Menu->CurrentPos == Menu->ButtonsNum - 1)
                {
                    ScrollBarStart = ScrollHeight - ScrollBarHeight + MenuHeaderH + 2 + 1;
                }
    
                // Очищаем место под полосу прокрутки
                gfx_FillRect(0, MenuHeaderH + 2, ScrollBarWidth - 1, HeightS - 1, 0x00);
                // Отрисовываем полосу прокрутки
                gfx_Rectangle(0, MenuHeaderH + 2, ScrollBarWidth - 1, HeightS - 1, 0xFF);
                // Отрисовываем индикатор полосы прокрутки
                gfx_FillRect(0, ScrollBarStart, ScrollBarWidth - 1, ScrollBarStart + ScrollBarHeight, 0xFF);
    
                // Отрисовываем пункты меню
                for(i = StartPos; i < StartPos + MenuCount; i++)
                {
                    // Количество символов в строке меню
                    strLen = (WidthS - (ScrollBarWidth + 2)) / MenuFont->W;
    
                    // Заполняем временный буфер пробелами
                    memset(tmpStr, ' ', sizeof(tmpStr));
    
                    // Если установлена функция возврата доп. информации
                    if(Menu->Buttons[i].GetStr != NULL)
                    {
                        // Получаем доп. информацию в буфер
                        Menu->Buttons[i].GetStr(tmpBuf, Menu->Buttons[i].AddParam);
                        // Считаем её размер
                        bufLen = strlen(tmpBuf);
                        // Если её размер больше количества символов в строке меню - ограничиваем
                        if(bufLen > strLen) bufLen = strLen;
                        // Копируем доп. информацию в строку меню, с выравниванием по правому краю
                        strcpy(tmpStr + (strLen - bufLen), tmpBuf);
                    }
    
                    // Копируем название пункта меню из флеша в временный буфер
                    strcpyf(tmpStr, Menu->Buttons[i].str);
                    // Если длинна названия меньше длинны строки помещающейся на экране - ставим пробел склеивая строчки
                    if(strlen(tmpStr) < strLen) tmpStr[strlen(tmpStr)] = ' ';
                    // Обрезаем строку на границе экрана(защита на случай превышения названием количества символов в строке меню)
                    tmpStr[strLen] = '\0';
    
                    // Устанавливаем место рисования
                    gfx_SetXY(ScrollBarWidth + 2, MenuFont->H * (i - StartPos) + MenuHeaderH + 2);
                    // Задаем цвет - нужно для выбранного пункта
                    if(Menu->CurrentPos == i) Color = 0x00;
                    else                      Color = 0xFF;
                    // Рисуем строчку
                    gfx_PutStr(tmpStr, Color, MenuFont);
                }
                // Обновляем экран
                gfx_Refresh();
    
                // Ждем отпускания кнопок
                WaitEmptyButtons(0);
                // Ждем нажатия кнопок
                Kbd = WaitButtonPress(0);
    
                // Изменяем позицию курсора, если нажато ВВЕРХ или ВНИЗ
                if((Kbd & B_UP)   && (Menu->CurrentPos > 0))                    Menu->CurrentPos--;
                if((Kbd & B_DOWN) && (Menu->CurrentPos < Menu->ButtonsNum - 1)) Menu->CurrentPos++;
    
                // Если курсор вышел за границы экрана - сдигаем меню на один пункт
                if(Menu->CurrentPos < StartPos)                 StartPos--;
                if(Menu->CurrentPos > StartPos + MenuCount - 1) StartPos++;
            }
            while(!(Kbd & (B_BACK | B_ENTER)));
    
            // Если вызывающему нужно что либо выполнить какие-либо действия - вызываем
            if(Menu->After != NULL) Menu->After();
    
            // Если нажали ВВОД и у выбранного пункта установлен обработчик
            if((Kbd & B_ENTER) && (Menu->Buttons[Menu->CurrentPos].fun != NULL))
            {
                // Ждем отпускания кнопок
                WaitEmptyButtons(0);
                // И вызываем обработчик
                Menu->Buttons[Menu->CurrentPos].fun(Menu->Buttons[Menu->CurrentPos].AddParam);
            }
        }
        while(!(Kbd & B_BACK));
    
        // Ждем отпускания кнопок
        WaitEmptyButtons(0);
    }
    А теперь пример использования. Главное меню:
    Код:
    // *****************************************************************************
    // ***   Главное Меню   ********************************************************
    // *****************************************************************************
    
    // ***   Пункты меню   *********************************************************
    flash MenuButton TestMenuButtons[] =
    {{"Model",    ModelMenu,    NULL},
     {"Controls", ControlsMenu, NULL},
     {"Channels", ChannelsMenu, NULL},
     {"Timer",    TimerMenu,    NULL},
     {"Options",  OptionsMenu,  NULL},
     {"IO Test",  IO_Test_AP,   NULL},
     {"Demo",     Demo_AP,      NULL}};
    
    // ***   Функция меню   ********************************************************
    void MainMenu(void)
    {
        // Формируем структуру меню
        MenuPad Pad = {"Main Menu", &Font_8x12, &Font_6x8, TestMenuButtons, NumberOf(TestMenuButtons), 0, NULL, NULL};
        // Вызываем обработчик меню
        MenuCycle(&Pad);
    }
    Это просто. А теперь пример поинтереснее: реализация на этом движке микшера. Используется дополнительный параметр из структуры:
    Код:
    // *****************************************************************************
    // ***   Меню каналов(микшера)   ***********************************************
    // *****************************************************************************
    
    // ***  Текущий настраиваемый канал   ******************************************
    static char MixerCurrentChannel;
    
    // ***  Изменение настройки микшера   ******************************************
    void MixerChangeSetting(char AddParam)
    {
        // Вызываем окно изменения значения
        EditNumDlg(&CurModel.Mode[FLY_MODE].Chanels[MixerCurrentChannel][AddParam], PTR_CHAR, -100, 100, 4, "Mixer");
    }
    
    // ***   Получение строки настройки микшера   **********************************
    char * MixerGetStr(char * Buf, char AddParam)
    {
        // Формируем в буфере текущее значение
        sprintf(Buf, "%d", CurModel.Mode[FLY_MODE].Chanels[MixerCurrentChannel][AddParam]);
        // Возвращаем указатель на переданный буфер
        return(Buf);
    }
    
    // ***   Список пунктов настройки микшера для канала   *************************
    flash MenuButton MixerMenuButtons[] =
    {{"Ailerons",  MixerChangeSetting, MixerGetStr, CTRL_AIL},
     {"Elevator",  MixerChangeSetting, MixerGetStr, CTRL_ELE},
     {"Throttle",  MixerChangeSetting, MixerGetStr, CTRL_THR},
     {"Rudder",    MixerChangeSetting, MixerGetStr, CTRL_RUD},
     {"SW 1",      MixerChangeSetting, MixerGetStr, CTRL_SW1},
     {"SW 2",      MixerChangeSetting, MixerGetStr, CTRL_SW2},
     {"SW 3",      MixerChangeSetting, MixerGetStr, CTRL_SW3},
     {"Aux 1",     MixerChangeSetting, MixerGetStr, CTRL_AUX1},
     {"Virtual 1", MixerChangeSetting, MixerGetStr, CTRL_V1},
     {"Virtual 2", MixerChangeSetting, MixerGetStr, CTRL_V2},
     {"Trim",      MixerChangeSetting, MixerGetStr, CTRL_TRIM}};
    
    // ***   Меню настройки микшера для канала   ***********************************
    void ChannelsMixerMenu(char AddParam)
    {
        // Формируем структуру меню
        MenuPad Pad = {"Mixer", &Font_8x12, &Font_6x8, MixerMenuButtons, NumberOf(MixerMenuButtons), 0, NULL, NULL};
        // Запоминаем номер текущего управляющего элемента
        MixerCurrentChannel = AddParam;
        // Вызываем обработчик меню
        MenuCycle(&Pad);
    }
    
    // ***   Список каналов для настройки микшера   ********************************
    flash MenuButton ChannelsMenuButtons[] =
    {{"CH 1", ChannelsMixerMenu, NULL, 0},
     {"CH 2", ChannelsMixerMenu, NULL, 1},
     {"CH 3", ChannelsMixerMenu, NULL, 2},
     {"CH 4", ChannelsMixerMenu, NULL, 3},
     {"CH 5", ChannelsMixerMenu, NULL, 4},
     {"CH 6", ChannelsMixerMenu, NULL, 5},
     {"CH 7", ChannelsMixerMenu, NULL, 6},
     {"CH 8", ChannelsMixerMenu, NULL, 7}};
    
    // ***   Меню выбора каналов для настройки микшера   ***************************
    void ChannelsMenu(char AddParam)
    {
        // Формируем структуру меню
        MenuPad Pad = {"Channels", &Font_8x12, &Font_6x8, ChannelsMenuButtons, NumberOf(ChannelsMenuButtons), 0, NULL, NULL};
        // Если количество каналов модели меньше чем максимальное количество - устанавливаем их,
        // что бы не отображать отсутствующие у модели каналы
        if(Pad.ButtonsNum > CurModel.num_ch) Pad.ButtonsNum = CurModel.num_ch;
        // Вызываем обработчик меню
        MenuCycle(&Pad);
    }
    Где-то так...
    Вопросы, обсуждения реализации и конструктивная критика приветствуется.
    Хотя на данный момент я передатчиком не занимаюсь и не использую(потому что не летаю). Считаю, что он достиг своего предела - во-первых исковеркан внешне, во-вторых нет апгейдабельности - сменных модулей. Прикрутить конечно, можно но вот зачем? Мне бы хотелось сделать новый передатчик на основе Hitec Optic 6, использовать экран TIC, плату по возможности подогнать под существующую, что бы проводку не менять... Только вот донора нет...

  24. #181

    Регистрация
    04.10.2004
    Адрес
    Балашиха
    Возраст
    42
    Сообщений
    2,892
    Николай, посмотри в сторону ДХ5. 40 баксов за корпус с модулем и антеной - весьма неполохо. Места в нем достаточно (у дх6 корпус практически такой же), сносные джойстики и готовые кнопки триммеров.

    Цитата Сообщение от Networx Посмотреть сообщение
    2 Aleksey_Gorelikov, подскажите где посмотреть по какой схеме и как подключаетса выключатель питания, на дополнительном ключе!
    Обсуждали тут, наверное еще год-2 года назад, вместе с Женей (fokus)
    Последний раз редактировалось Aleksey_Gorelikov; 06.12.2009 в 01:19.

  25. #182
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    Или, как здесь уже советовалось, пристально посмотреть на Тургнигу-"тушку". Единственный вопрос, который нуждается в прояснении - что там за дисплей. Думаю, что ребята из той ветки не откажутся ответить...

    Я разъемчиками закупился для кодера (взял из серии MW/MU, ключеванные с защелками, шаг 2мм, и высота маленькая). Так примерно $15 одни разъемы встали. (Хобби, блин... "Охота пуще неволи"...)Там же вся тушка $70.

    P.S. Но ить пока что получается так, что душа поет. Сегодня пачку булавок купил - крепления дисплея делать. Позже фото выложу.

    P.P.S. +$3 за пачку булавок...

  26. #183

    Регистрация
    04.10.2004
    Адрес
    Балашиха
    Возраст
    42
    Сообщений
    2,892
    Про дисплейчик надо не в той ветке искать, а где-то тут, в самодельной аппе (там паралельная шина на дисплее, лень искать тип контроллера). Месяц-2 назад назад выяснили, что за дисплей в ней стоит (была тут отдельная ветка типа "что за дисплей в турниджи"). Лень смотреть. Только проц там мега64. Надо будет в корне графику перерабатывать. С тем подходом как у фокуса\мсв - экранный буфер много ОЗУ съедает.

  27. #184

    Регистрация
    07.01.2008
    Адрес
    Крым
    Возраст
    57
    Сообщений
    874
    Записей в дневнике
    7
    Цитата Сообщение от EagleB3 Посмотреть сообщение
    Кто хочет помоделировать в протеусе - велкам.
    Джойстики расставил по привычной мне "Моде 2". От увиденного при калибровке окосел...
    Не менял: если кто-то так сделал - значит это кому-нибудь нужно?

    Все как живое - пищщалкой пищщит, по менюшкам ходит, свитчи видит, потенциометры при калибровке - тоже. Калибровку не проходит - прошуршал джойстиками, дополнительным каналом, кнопаю "вправо" - получаю "not correct".
    Наверное что-то в методологии у меня не так.

    И PPM не PPMит (вернее, синхроимпульс идет, но управления не видно). Из-за косой калибровки?

    P.S. Ах, да! Вот еще что... Почему-то сразу после изготовления проекта модель дисплея не запустилась - экран оставался мертвым. Потребовалось отдельно запустить распаковать и запустить модель из поста #2119, после чего все волшебным образом заработало. Впрочем, с протеусом и не такое бывает...
    Калибровка работает нормально. Необходимо на второй странице в схеме Proteus привести каналы в соответствии с реальной схемой. Или править программу в соответствии с Вашей схемой.

    PS У себя исправил.

  28. #185
    VRV
    VRV вне форума

    Регистрация
    25.09.2009
    Адрес
    Sevastopol
    Возраст
    41
    Сообщений
    75
    Николай, спасибо за ответ по меню. Интересна была прежде всего реализация динамического легко маштабируемого меню. Т.к ответ пришел чуть позже успел набросать свою версию. Прежде всего не стал использовать структуры с указателями, а использовал статическую таблицу переходов(на мой взгляд получилоссь достаточно наглядно) которая дает представление об иерархии всего меню.
    Если будет интересно- скину куски.
    А основная идея управления пульта- отказ от кнопок и использование энкодера.
    В качестве такового используется колесо мыши.
    Пока отлаживаю в протеусе- жду VG400 за 10 евро
    По поводу проверки еепром в сообщения выше- реализовал проверку срс при загрузке соотв модели(в структуру модели при записи пишется вычисленное значение).
    Также планируется использование програмного отключения передатчика, что позволит однократно читать модель при включении, внесенные изменения держать в рам и записывать еепром при выключении или через меню.
    В общем идей масса- посмотрим как реализуется в железе.
    ( отдельное спс родоначальникам данной ветки, т. к. многие вещи были использованы методом контрол+с)

  29. #186
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    58
    Сообщений
    2,376
    А основная идея управления пульта- отказ от кнопок и использование энкодера.
    Энкодер- это здорово! Сделал возможность менять параметры резистором доп. аналогового канала. Очень удобно кажется. Чуть позже выложу обновление, где в тч. контроль CRC EPROM сделан, ну и еще кое-что, по мелочи..

  30. #187
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    58
    Сообщений
    2,376
    Люди добрые, помогите.... Уж очень хочется нормально отлаживаться в протеусе (7.5 SP3), а он, зараза, не хочет адресовать больше 256 байт епрома. Уж и бинарник размером 4К ему подкладывал и ручками пытался MODDATA править, один фиг страшие разряды адреса игнорирует.... Это конкретный косяк модели или как-то лечится??

  31. #188
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    Цитата Сообщение от msv Посмотреть сообщение
    Энкодер-это здорово! Сделал возможность менять параметры резистором доп. аналогового канала. Очень удобно кажется.
    Это бы весьма кстати... А то у меня никак кнопки меню в конструктив не вписываются так, чтобы нравилось. Пока на плате спроектировал контактные площадки для установки платы кнопок меню "бутербродом", ну и разъем менюшный тоже оставил (потому как еще есть мысль поставить джойстик от мобильника).

    А вот так у меня дисплей встал в корпус. Стекло (из "нулевой" коробочки от CD просто вложено; сверху к нему две пружинки из булавок прижимают плату с дисплеем TIC154). Так что даже если по дисплею что-то пнет (с умеренной силой и не очень резко) дисплей целым (надеюсь...) останется.
    На плате оставлены места для впайки в цепь питания подсветки корпуса 0805, 1206 и SMB в параллель - яркость регулировать. Что-нибудь точно подберется. И еще на плате есть местечко, так что можно двухуровневую по яркости подсветку замастрячить, типа "день-вечер".
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: Mount.png‎
Просмотров: 279
Размер:	100.7 Кб
ID:	303346  
    Последний раз редактировалось EagleB3; 09.12.2009 в 10:43.

  32. #189
    VRV
    VRV вне форума

    Регистрация
    25.09.2009
    Адрес
    Sevastopol
    Возраст
    41
    Сообщений
    75
    Цитата Сообщение от msv Посмотреть сообщение
    Люди добрые, помогите.... Уж очень хочется нормально отлаживаться в протеусе (7.5 SP3), а он, зараза, не хочет адресовать больше 256 байт епрома. Уж и бинарник размером 4К ему подкладывал и ручками пытался MODDATA править, один фиг страшие разряды адреса игнорирует.... Это конкретный косяк модели или как-то лечится??
    Похожая проблема и у меня. Модели представлені массивом структур в еепром. Так вот при симуляции структура пишется всегда по нулевому адресу. Тож думал косяк в программе, но в студио еепром заполняется без ошибок. И еще- в протеусе файл служит для начальной инициализации еепром. При последующей симуляции данные еепром сохраняются во вспомогательном файле симуляции. Могут быть сброшены через меню дебаг.

    ЗЫ: хотел отправить архив с моделю в протеусе но стоит ограничение на тип файлов(только графика)\справку читал\
    Последний раз редактировалось VRV; 09.12.2009 в 13:08.

  33. #190
    msv
    msv вне форума

    Регистрация
    05.03.2008
    Адрес
    Новокузнецк
    Возраст
    58
    Сообщений
    2,376
    Хочу уточнить, изменение параметров резистором доп. ан. каналом- не будет полноценная замена кнопок "вверх-вниз". Просто при изменении параметра от-100 до +100 это гораздо удобнее сделать одним движением пота. И Хотя почти всё (ключ. слово - "почти") можно сделать без этих кнопок, но отазываться совсем от них наверное не стоит..
    Ох.. погорячился я минутами на реализацию проверки CRC EEPROM... Уже второй вечер пытаюсь понять, почему после "больший" изменений, CRC получается правильной только на второй раз...
    А вот код для проверки eeprom в протеусе:
    #define SIZEOF_EEPROM 4*1024
    void testeeprom(void)
    {
    unsigned int i;
    eeprom unsigned char *p;
    p=0;
    for(i=0; i<SIZEOF_EEPROM; i++, p++)
    {
    *p=0xaa;
    }
    }
    После этой функции помотреть дамп eeprom в протеусе....

  34. #191
    DD!
    DD! вне форума

    Регистрация
    11.11.2008
    Адрес
    Рязань
    Возраст
    37
    Сообщений
    117
    VRV, а не подскажете где VG400 за 10 евро продают

  35. #192
    VRV
    VRV вне форума

    Регистрация
    25.09.2009
    Адрес
    Sevastopol
    Возраст
    41
    Сообщений
    75
    Все тотже EBay. Причем именно его немецкая версия(ebay.de). Очень много лотов выставляется Graupner. Зайдите-посмотрите цены(правда в 10 евро нужно попасть на удачный лот (вг-устаревшая модель)). Единственная трудность с оплатой - немцы не жалуют пайпал, а предпочитают перевод(около 300грн для одной транзакции). Поэтому нужно отбирать еще и по способу оплаты.(или заводить друга в Германии). Кстати на английском(co.uk) тоже попадаются неплохие варианты - но там нужно уговаривать для отправки в страны СНГ. Кстати тамже (.com)заказывал два дисплея нокиа 7110 по ~3 доллара.

    ЗЫ:А для кого летать первостепенно и есть хотябы 100 убитых енотов - то на хоббисити есть 9 каналка за 70 + (20-30 модуль)$.

  36. #193
    DD!
    DD! вне форума

    Регистрация
    11.11.2008
    Адрес
    Рязань
    Возраст
    37
    Сообщений
    117
    Цитата Сообщение от VRV Посмотреть сообщение
    ЗЫ:А для кого летать первостепенно и есть хотябы 100 убитых енотов - то на хоббисити есть 9 каналка за 70 + (20-30 модуль)$.
    Это то понятно, просто хочется найти дешевую аппу именно под переделку, чтобы конструктив, так сказать полностью устраивал. Надо чтобы места в ней было много, напрмер большинство апп которые идут без дисплея какие то урезанные по вертикали. Хотелось чтобы джои нормальные были, а то я переделывал валькеру, джои там авно полное. Хотелось чтобы триммеры было просто переделывать, я вот на свою валькеру достал джои от футабы, теперь опять проблемы с триммерами.
    Еще я так понял вы пишете новую прошивку, у меня есть пару предложений:
    1. Может использовать АРМ
    2. Может можно попробовать использовать микрочиповскую графическую библиотеку, она с открытыми кодами, правда под 16битные процы, но я код просмотрел, вроде переделывается легко, зато там по умолчанию поддерживаются многие дисплеи и еще много полезной фигни

    PS: я к чему про АРМ то, я тут не так давно ковырялся в санвовском ПСМ, и вообще в ПСМ, так вот мне кажется что АВР тут маловато будет, хотя как писать. Иногда напишешь что нибудь которое по времени не должно работать, а оно работает, а иногда наоборот

  37. #194
    VRV
    VRV вне форума

    Регистрация
    25.09.2009
    Адрес
    Sevastopol
    Возраст
    41
    Сообщений
    75
    Ecли вы не предполагаете декодирование видео, то АВР вполне достаточен для задач ру. Простая прикидка - пачка сигнала ппм=20мс. При частоте 12 мгц =12/50=600 000 машинных циклов для обновления данных о каналах. При этом само обновление - по прерыванию простой записю в регистр из массива вычисленных значений. Если не использовать операций деления(заменять сдвигом) и не вычислять значений неизменных каналов, то вся математика займет пару десятку процентов. Касаемо затрат по обновлению дисплея- тоже копейки если не рисовать элипсы и смнусоиды При этом само обновление в главном экране 1 раз в сек(для таймера), а в остальных меню по факту изменений(или также 1 раз за сек).
    Касаемо PCM - насколько я понимаю в данном случае вместо таймера задействуется модуль uart для передачи данных о состоянии каналов, однако стандарт передачи для каждого производителя отличается.
    Как я гоаворил прошивка не новая, просто не смог разобратся в выложенных и вставлял из них куски а кое что дописывал, т.к хотел изменить способ ввода и сделать легко изменяемое меню. До структуры меню Николая конечно далеко, но вроде в своем пока не запутался.
    Для меня данный проект интересен не конечной реализацией(хотя и она интерена), а самим процессом, дабы не утерять а иногда и приумножить знания мк и с. Я думаю если ктото заинтересуется изучением АРМ, то перенести данный проект на другую платформу не составит труда, т.к даже графика написана на с. В этом плане микрочип к примеру склоняется больше к ассеблеру(из свободных проектов и AN).
    Использование 16 и более разрядных мк повысит точность при том же быстродействии, но нужна ли она?
    При ходе стика в 60 градусов и высоте 2 -3 см вы имеете порядка 3 см линейного перемещения. Даже операции с 8 разрядами при полной шкале отцифровки дадут разрешение 0,15 мм. Кстати именно для этого хочу ставить нормировщики на оу.( руки пока не дошли до аппаратной реализации)

    ps: кстати как кинуть атач с моделю? принимает только графику.
    pps: да и запись данных в лсд их памяти тоже по прерыванию(без ожидания флага внутри программы), а это примерно по 60 циклов на каждое обращение к spi (вот сегодня этим как раз и займусь)
    Последний раз редактировалось VRV; 09.12.2009 в 21:49.

  38. #195
    DD!
    DD! вне форума

    Регистрация
    11.11.2008
    Адрес
    Рязань
    Возраст
    37
    Сообщений
    117
    я про графическую библиотеку от микрочипа (на си, с открытым кодом) в которой прорисованы все элементы управлнения и отображения, а так же определено их поведение. Библиотека достаточно итересная поддерживает много устройств вывода и ввода (даже тачскрин). Минус это то что она изначально предназначена для контроллеров от 16бит и выше, но это сделано как я понял искуственно. Мне кажется что есть смыс использовать подобную библиотеку с какой нибудь ос. Просто текущие прошивки так реализованы что изменять их сложно.(например у msv задержка канала, помоему связана с ппм, тоесть просто так изменить протокол сложно). Больше подобных библиотек я не нашел. А ведь по большому счету задача кодера как раз это взаимодействие с пользователем. По поводу АРМ: я считаю что его стоит применить, так сказать на будущее, тем более что цена не особо дороже, а плюшек много получается не только от железа, так еще и от софта.
    ПСМ, по крайней мере санвовский генерировать уартом точно не получится.
    Но это все моё ИМХО, советовать то все умеют, и я тоже

  39. #196
    VRV
    VRV вне форума

    Регистрация
    25.09.2009
    Адрес
    Sevastopol
    Возраст
    41
    Сообщений
    75
    На сегодня последняя фраза и спать
    Качать не стал, но глянул видео - интересная штука с больними возможностями.
    Но повторюсь- для чб дисплея с макс разрешением 100Х100 сие счасте не обязательно. Тем более что хорошая библиотека меню написана Николлаем. Могу кинуть свою(попроще).
    Я ток за арм, тем более сам хотел с ним поработать, да руки не доходят. Но лично у меня ни аппаратных ни програмных инструментов под него нет.
    На будущее вижу его ток как основу OSD для полетов по камере, но помойму его также реализовали на меге
    Кстати набросал перегрузку буфера через прерывания- освободилось еще немного времени проца
    Да кстати если есть прямая ссылка на сей страшный протокол pcm- кинте, интересно глянуть с чем не сможет справится уарт(а на чем идут последние санвы кстати тоже любопытно?)

  40. #197
    Учит правила
    Регистрация
    15.05.2009
    Адрес
    Москва
    Возраст
    54
    Сообщений
    1,672
    Цитата Сообщение от VRV Посмотреть сообщение
    кстати как кинуть атач с моделю?
    Сюда - никак. Файл надо заложить в какое-нибудь файлохранилище (что-то типа http://depositfiles.com) или слепить сайтик (например, на narod.ru; чисто номинальный - но дадут место под хранение/раздачу файлов) и положить файл туда, а здесь выложить ссылку на файл.

  41. #198
    VRV
    VRV вне форума

    Регистрация
    25.09.2009
    Адрес
    Sevastopol
    Возраст
    41
    Сообщений
    75
    http://narod.ru/disk/15823597000/encoder.rar.html наброски меню для енкодера.Проект в протеусе 7.6.

  42. #199

    Регистрация
    20.03.2007
    Адрес
    Minneapolis, MN, US
    Возраст
    38
    Сообщений
    344
    Цитата Сообщение от Aleksey_Gorelikov Посмотреть сообщение
    Николай, посмотри в сторону ДХ5. 40 баксов за корпус с модулем и антеной - весьма неполохо.
    Смотрел - нет экрана, а это много слесарщины. Не хочу. Да и не сменные модули тоже не гуд - вдруг когда захочется ещё что-нибуль и на тему радиоканала замутить - по крайней мере с электроникой у меня дела идут лучше, чем моделями .

    Цитата Сообщение от EagleB3 Посмотреть сообщение
    Или, как здесь уже советовалось, пристально посмотреть на Тургнигу-"тушку". ... Там же вся тушка $70.
    Тоже интересный вариант. Но ещё за доставку почти 30$. Итого 100$. Сейчас у меня такой возможности нет. И ломать работающую вещь будет жалко, а дохлую - нет.

    А вообще это был такой тонкий намёк . Если кто может презентовать/продать за символическую сумму дохлый Optic 6 был бы очень признателен...

    Цитата Сообщение от Aleksey_Gorelikov Посмотреть сообщение
    С тем подходом как у фокуса\мсв - экранный буфер много ОЗУ съедает.
    Экранный буфер получается 128x64 точек = 8192 бит. Итого 1 kB. Меньше никак. Только если вообще без буфера, но тогда возможно мерцание экрана при отрисовках.

    Цитата Сообщение от VRV Посмотреть сообщение
    Николай, спасибо за ответ по меню. Интересна была прежде всего реализация динамического легко маштабируемого меню. Т.к ответ пришел чуть позже успел набросать свою версию.
    Просто поздно заметил .

    Цитата Сообщение от VRV Посмотреть сообщение
    Прежде всего не стал использовать структуры с указателями, а использовал статическую таблицу переходов(на мой взгляд получилоссь достаточно наглядно) которая дает представление об иерархии всего меню.
    Если будет интересно- скину куски.
    Интересно, потому что смысла сказанного я не понимаю . Сами пункты у меня тоже статические и хранятся в памяти программы. Динамическая только структура описатель меню и то только для того, что бы реализовать простое задание значений по умолчанию(шрифты и т.д.).

    Цитата Сообщение от VRV Посмотреть сообщение
    А основная идея управления пульта- отказ от кнопок и использование энкодера.
    На счёт этого не знаю. Думаю кнопок + ручек более чем достаточно для управления. А энкодерам место для управления триммерами. Я раньше такую мысль высказывал, а потом оказалось что это не моё ноу-хау - у старших моделей футаб именно так и сделано . Вот только реализовать в железе 4-ре энкодера для управления триммерами не тривиальная задачка...

    Цитата Сообщение от DD! Посмотреть сообщение
    1. Может использовать АРМ
    Можно. LPC не плохие. Вот только шаг у них поменьше - боюсь ЛУТ-ом тяжело будет сделать. Нужно либо осваивать фоторезист - это сложно, да и плёночный мне достать сложно, либо заказывать на стороне - а это дорого.

    Цитата Сообщение от VRV Посмотреть сообщение
    До структуры меню Николая конечно далеко, но вроде в своем пока не запутался.
    Хоть кто-то оценил. Приятно однако .

    Цитата Сообщение от VRV Посмотреть сообщение
    Использование 16 и более разрядных мк повысит точность при том же быстродействии, но нужна ли она?
    При ходе стика в 60 градусов и высоте 2 -3 см вы имеете порядка 3 см линейного перемещения. Даже операции с 8 разрядами при полной шкале отцифровки дадут разрешение 0,15 мм. Кстати именно для этого хочу ставить нормировщики на оу.( руки пока не дошли до аппаратной реализации)
    Не тоит забывать про нормализацию кривые и микшеры. Тут может потеряться точность...

    Цитата Сообщение от VRV Посмотреть сообщение
    Кстати набросал перегрузку буфера через прерывания- освободилось еще немного времени проца
    У меня наоборот - обновление экрана без прерываний. На главном экране 10 раз в секунду - таймер с сотыми секунды . Обновление всего экрана занимает приблизительно 16 мс - тестировал на железе. Генерация импульсов идёт в прерывании. Все остальные задачи сидят на другом таймере. Для них предусмотрена разрешение прерываний что бы генерация импульсов шла без проблем и не реентерабельность, что бы не подвесить пульт.

    Про симуляцию: Нафиг! У меня с ней были постоянные проблемы. Отлаживатся на железе нужно. Я использовал STK500 совместимый бутлоадер(могу выложить) + вывод отладочной информации в UART. Для связи использовал USB шнурок от старого телефона с конвертером USB-UART внутри.

  43. #200
    DD!
    DD! вне форума

    Регистрация
    11.11.2008
    Адрес
    Рязань
    Возраст
    37
    Сообщений
    117
    VRV
    Вот и у меня тоже руки не как не дойдут с АРМ заняться
    Прямой ссылки на ПСМ нет, я смотрел в исходниках рсджой и смарт пропо плюс,
    усарт не справится потому что у него жестко задана структура передачи старт бит данные стоп бит, а вот например в санва ПСМ2 на канал передается 20бит, а за ними еще столько же для второго и тд. Если надо могу выложить свои эксперименты с ПСМ, я санва ПСМ2 съэмулировал на аврке, на этом дело и закончилось, я почему то решил что на данный день ПСМ не актуальна и заказал себе корону, вот жду когда приедет

    Nick_Shl
    Не подскажете какой самый большой шаг у ЛПС, по ЛУТ получает делать платы для FT232R, а у нее шаг 0,65, да и мне кажется что с помощью ЛУТ можно делать платы еще с меньшим шагом, главное терпение.
    И можно поподробнее как вы отлаживаете и если есть что выложить - выкладываейте. заранее спасибо

Закрытая тема

Похожие темы

  1. РЕВО (REVO) - вопросы и ответы (часть 2)
    от Airliner-rc в разделе Авто Off-Road
    Ответов: 5912
    Последнее сообщение: 24.06.2020, 16:42
  2. Belt-CP (часть 2)
    от WarHawk в разделе Вертолеты других производителей
    Ответов: 1097
    Последнее сообщение: 28.08.2012, 21:35
  3. Продам Передатчик Hitec 2.4GHz Optic 6, Rx Optima 7
    от PigTail в разделе Барахолка. Аппаратура
    Ответов: 19
    Последнее сообщение: 01.12.2010, 18:19
  4. Помогите починить передатчик BEV 2.4G 500mW
    от Vladimir_N в разделе Полеты по камере, телеметрия
    Ответов: 13
    Последнее сообщение: 25.07.2010, 22:59
  5. Куплю Передатчик ET-4 2.4Ghz для LAMA V4
    от ILS в разделе Барахолка. Аппаратура
    Ответов: 0
    Последнее сообщение: 24.07.2010, 16:49

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения