Самодельный передатчик (часть 2)
narod.ru/disk/15823597000/encoder.rar.html наброски меню для енкодера.Проект в протеусе 7.6.
Николай, посмотри в сторону ДХ5. 40 баксов за корпус с модулем и антеной - весьма неполохо.
Смотрел - нет экрана, а это много слесарщины. Не хочу. Да и не сменные модули тоже не гуд - вдруг когда захочется ещё что-нибуль и на тему радиоканала замутить - по крайней мере с электроникой у меня дела идут лучше, чем моделями 😃.
Или, как здесь уже советовалось, пристально посмотреть на Тургнигу-“тушку”. … Там же вся тушка $70.
Тоже интересный вариант. Но ещё за доставку почти 30$. Итого 100$. Сейчас у меня такой возможности нет. И ломать работающую вещь будет жалко, а дохлую - нет.
А вообще это был такой тонкий намёк 😃. Если кто может презентовать/продать за символическую сумму дохлый Optic 6 был бы очень признателен…
С тем подходом как у фокуса\мсв - экранный буфер много ОЗУ съедает.
Экранный буфер получается 128x64 точек = 8192 бит. Итого 1 kB. Меньше никак. Только если вообще без буфера, но тогда возможно мерцание экрана при отрисовках.
Николай, спасибо за ответ по меню. Интересна была прежде всего реализация динамического легко маштабируемого меню. Т.к ответ пришел чуть позже:) успел набросать свою версию.
Просто поздно заметил 😃.
Прежде всего не стал использовать структуры с указателями, а использовал статическую таблицу переходов(на мой взгляд получилоссь достаточно наглядно) которая дает представление об иерархии всего меню.
Если будет интересно- скину куски.
Интересно, потому что смысла сказанного я не понимаю 😃. Сами пункты у меня тоже статические и хранятся в памяти программы. Динамическая только структура описатель меню и то только для того, что бы реализовать простое задание значений по умолчанию(шрифты и т.д.).
А основная идея управления пульта- отказ от кнопок и использование энкодера.
На счёт этого не знаю. Думаю кнопок + ручек более чем достаточно для управления. А энкодерам место для управления триммерами. Я раньше такую мысль высказывал, а потом оказалось что это не моё ноу-хау - у старших моделей футаб именно так и сделано 😃. Вот только реализовать в железе 4-ре энкодера для управления триммерами не тривиальная задачка…
- Может использовать АРМ
Можно. LPC не плохие. Вот только шаг у них поменьше - боюсь ЛУТ-ом тяжело будет сделать. Нужно либо осваивать фоторезист - это сложно, да и плёночный мне достать сложно, либо заказывать на стороне - а это дорого.
До структуры меню Николая конечно далеко, но вроде в своем пока не запутался:).
Хоть кто-то оценил. Приятно однако 😁.
Использование 16 и более разрядных мк повысит точность при том же быстродействии, но нужна ли она?
При ходе стика в 60 градусов и высоте 2 -3 см вы имеете порядка 3 см линейного перемещения. Даже операции с 8 разрядами при полной шкале отцифровки дадут разрешение 0,15 мм. Кстати именно для этого хочу ставить нормировщики на оу.( руки пока не дошли до аппаратной реализации)
Не тоит забывать про нормализацию кривые и микшеры. Тут может потеряться точность…
Кстати набросал перегрузку буфера через прерывания- освободилось еще немного времени проца:)
У меня наоборот - обновление экрана без прерываний. На главном экране 10 раз в секунду - таймер с сотыми секунды 😎. Обновление всего экрана занимает приблизительно 16 мс - тестировал на железе. Генерация импульсов идёт в прерывании. Все остальные задачи сидят на другом таймере. Для них предусмотрена разрешение прерываний что бы генерация импульсов шла без проблем и не реентерабельность, что бы не подвесить пульт.
Про симуляцию: Нафиг! У меня с ней были постоянные проблемы. Отлаживатся на железе нужно. Я использовал STK500 совместимый бутлоадер(могу выложить) + вывод отладочной информации в UART. Для связи использовал USB шнурок от старого телефона с конвертером USB-UART внутри.
VRV
Вот и у меня тоже руки не как не дойдут с АРМ заняться😁
Прямой ссылки на ПСМ нет, я смотрел в исходниках рсджой и смарт пропо плюс,
усарт не справится потому что у него жестко задана структура передачи старт бит данные стоп бит, а вот например в санва ПСМ2 на канал передается 20бит, а за ними еще столько же для второго и тд. Если надо могу выложить свои эксперименты с ПСМ, я санва ПСМ2 съэмулировал на аврке, на этом дело и закончилось😁, я почему то решил что на данный день ПСМ не актуальна и заказал себе корону, вот жду когда приедет
Nick_Shl
Не подскажете какой самый большой шаг у ЛПС, по ЛУТ получает делать платы для FT232R, а у нее шаг 0,65, да и мне кажется что с помощью ЛУТ можно делать платы еще с меньшим шагом, главное терпение.
И можно поподробнее как вы отлаживаете и если есть что выложить - выкладываейте. заранее спасибо
Интересно, потому что смысла сказанного я не понимаю 😃. Сами пункты у меня тоже статические и хранятся в памяти программы. Динамическая только структура описатель меню и то только для того, что бы реализовать простое задание значений по умолчанию(шрифты и т.д.).
У меня наоборот - обновление экрана без прерываний. На главном экране 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
Правда насколько я понял используется декдирование с помощю аудиокарты.
Файл надо заложить в какое-нибудь файлохранилище
Например, torrents.ru
Уж очень хочется нормально отлаживаться в протеусе (7.5 SP3), а он, зараза, не хочет адресовать больше 256 байт епрома.
Глючит. И 7.6SP0 глючит. Он нормально (вроде как) сохраняет/читает с адресов дальше 0x00ff, но не ватчит. Даже через волатил не ватчит.
На всякий случай еще задал вопрос здесь.
Смотрел - нет экрана, а это много слесарщины. Не хочу.
Насчет много слесарщины - в VG400 место “под дисплей” очень тонкое. Я взял дисплей с полупропусканием и подсветкой (TIC154+TB1038S), и пришлось стачивать бортики окантовки (чтобы стекло дисплея поднялось “на себя”). Гравером, вручную, выдерживая равную высоту - это еще то скульптуротворчество. 😵 Потом выровнял “холодной сваркой” - собирался резьбовые стойки вклеить, но толщина слоя там получилась никакая. Вот и пришлось пружины мутить. И еще плюс стачивать понижения под головки винтов на нижней крышке. Так что количество слесарщины вполне сравнимо (КМК) с притыканием дисплея во внешней коробочке.
А с дисплеем во внешней коробочке (корпус от старого пейджера?) можно очень красиво и юзефульно выступить! Навесить дисплей на кронштейне, можно даже с изменяемым углом наклона. Я собирался так сделать, если бы стал врезаться в корпус Сигнала (Алексей Гореликов мне подарил). Он весь такой параллелепипедальный с закругленными гранями - внешний дисплей бы на нем получился очень-очень к месту.
Ну да на вкус и цвет, как говорится…
А не подскажете где VG400 за 10 евро продают
Я в Москве оторвал. С рук, б/у. Повезло… 😉
На счёт этого не знаю. Думаю кнопок + ручек более чем достаточно для управления. А энкодерам место для управления триммерами. Я раньше такую мысль высказывал, а потом оказалось что это не моё ноу-хау - у старших моделей футаб именно так и сделано . Вот только реализовать в железе 4-ре энкодера для управления триммерами не тривиальная задачка…
наконец энкодер вместо кнопок
а нельзя ли сделать как то так что бы все управлялось с одного колеса как в футабе ?
Не подскажете какой самый большой шаг у ЛПС, по ЛУТ получает делать платы для FT232R, а у нее шаг 0,65, да и мне кажется что с помощью ЛУТ можно делать платы еще с меньшим шагом, главное терпение.
Шаг 0,5. Получается ножка 0,25 и межноговое пространство 0,25…
А насчёт терпения: я уже натерпелся когда плату делал. Первая получилась с первого раза а от вторая…
И можно поподробнее как вы отлаживаете и если есть что выложить - выкладываейте. заранее спасибо
Всё очень просто. В CodeVisionAVR есть всё что надо: программатор и терминал. Для прошивки нужно прошить бутлоадер с поддержкой STK500 протокола. Бутлоадер можно взять тут. Компилировать нужно WinAVR. Зашивать в область бутлоадера и прошить фузы с загрузкой через бутблок. Перед компиляцией нужно подрпавить F_CPU в makefile и в коде определения для входа:
#ifdef __AVR_ATmega128__
#define BL_DDR DDRD
#define BL_PORT PORTD
#define BL_PIN PIND
#define BL0 PIND5
#define BL1 PIND4
Код немного подправлен, возможна работа только через UART0(можно легко исправить) - он сидит на порту программатора, так что проблем нет.
Далее добавляем код:
// *****************************************************************************
// *** Работа с COM портом - сгенерирована CodeVisionAVR *******************
// *****************************************************************************
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1 << FE)
#define PARITY_ERROR (1 << UPE)
#define DATA_OVERRUN (1 << OVR)
#define DATA_REGISTER_EMPTY (1 << UDRE)
#define RX_COMPLETE (1 << RXC)
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 32
char rx_buffer0[RX_BUFFER_SIZE0];
#if RX_BUFFER_SIZE0 < 256
unsigned char rx_wr_index0, rx_rd_index0, rx_counter0;
#else
unsigned int rx_wr_index0, rx_rd_index0, rx_counter0;
#endif
// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status, data;
status = UCSR0A;
data = UDR0;
if((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)) == 0)
{
rx_buffer0[rx_wr_index0] = data;
if(++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0 = 0;
if(++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0 = 0;
rx_buffer_overflow0 = 1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while(rx_counter0 == 0);
data = rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0 = 0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 32
char tx_buffer0[TX_BUFFER_SIZE0];
#if TX_BUFFER_SIZE0 < 256
unsigned char tx_wr_index0, tx_rd_index0, tx_counter0;
#else
unsigned int tx_wr_index0, tx_rd_index0, tx_counter0;
#endif
// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
if(tx_counter0)
{
--tx_counter0;
UDR0 = tx_buffer0[tx_rd_index0];
if(++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0 = 0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART0 Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while(tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if(tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY) == 0))
{
tx_buffer0[tx_wr_index0] = c;
if(++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0 = 0;
++tx_counter0;
}
else UDR0 = c;
#asm("sei")
}
#pragma used-
#endif
// *****************************************************************************
// *** Конец кода работы с COM портом **************************************
// *****************************************************************************
Он нужен для вывода в UART. Теперь можно выводить отладочную информацию в UART:
#ifdef DEBUG
printf("MODEL_Init(%d);\r", ModelNum);
delay_ms(1);
#endif
Большинство проблемных мест так отлаживал. Потому как в Протеусе вообще ничего сделать не могу - как-то он отладку по исходному коду хреново делает. Или глючит. Например вместо линии при некоторых условиях получалась ерунда. Надоело с ним баловался…
По прерываниям spi- по даташиту сосетуют использовать прерывания при высоких значениях предделителя от 64 и выше. Обидно терять циклы для ожидания готовности spi.
Ясно. Просто у меня экран с контроллером KS0108, а там 8 бит данных + доп сигналы. Управлять им приходится полностью программно.
На счет железа согласен(пример глюки протеуса при записи еепром), однако мое железо бедет корректироватся в зависимости от реализации программы, а возится с макеткой лень:)
Так может с этого и стоит начать? Стделать ТЗ, развести плату, сделать. Разводить с заделом на будущее - все неиспользуемые ноги на разёмы.
После первой сделаете вторую - без всех недостатков 😃. Именно так было у меня. Вначале сделал одну, увидел недостатки и сделал вторую версию.
Я взял дисплей с полупропусканием и подсветкой (TIC154+TB1038S)
Вот себе хочу именно такую комбинацию, только с TB1025S(белая).Кстати, сколько стоит такая комбинация в $ ?
Жаль что трёхцветных подсветок на такие TICи нет…
Вот себе хочу именно такую комбинацию, только с TB1025S(белая).Кстати, сколько стоит такая комбинация в $ ?
Я брал в “Тритоне”, причем взял и зеленую, и белую - чтобы посмотреть и решить какая лучше. Благо цена на них смешная.
Зеленая имеет приятный салатовый оттенок - ее и решил поставить. Белый мне показался очень холодным, мертвым каким-то.
Все подсветки стоили по $2 +/-30 центов (белая = 63руб, зеленая = 52руб (голубая - столько же). И дисплей 225 руб.
… А можно про бутлоадер популярно в двух словах (или ссылочку)? Никогда такой штукой не пользовался. Что он дает? В чем его прелесть при наличии программатора и разъеме SPI, выведенном наружу в укромном месте? Можно ссылочку на какое-нибудь доходчивое нравоучение?
…Я уже писал здесь где-то, что пользуюсь CVAVR с USB-шным программатором = аналог AVRISP, причем он умеет принимать отладочную информацию по SPI-шинам, тем же, по которым идет внутрисхемное программирование. Так что в любую программу добавляются два малюсеньких кусочка (описание линий и альтернативная функция putchar) + вызов инициализации в main. И все - вывод putchar’ом и printf’ом перенаправляются в SPI. UART камня можно при этом вообще не использовать и не инициализировать.
AStudio с этим программатором тоже прекрасно работает. Она проверяет версию фирмвари подключенных к ней программаторов и ругается, если версия слишком старая. так вот в моем программаторе версия фирмвари меняется из того же терминала: double “Enter”, видим запрос и вводим желаемую версию.
Для ATMEGA8535 первый кусочек выглядит так:
#define MOSI PORTB.5
#define MISO PORTB.6
#define SCK PORTB.7
#define MMS_OutNull 0b11100000 //MOSI, MISO, SCK = Out, Null
// Declare your global variables here
void init_debug(void)
{
PORTB=0x00;
DDRB=MMS_OutNull; //MISO, MOSI, SCK = Out, Pullup //0x38
MOSI=1; //сигнал MOSI = используется как SS
delay_us(500);
MOSI=0;
delay_us(500);
}
void putchar( char c)
{
unsigned char n;
for (n=0;n<8;n++)
{
if (c & 1) MISO=1; // сигнал MISO = данные
else MISO=0;
SCK=0; // сигнал SCK = clock
delay_us(30);
SCK=1;
delay_us(30);
c=c>>1;
}
}
Одна мелкая неприятность - CVAVR почему-то не любит, когда терминал и программатор на одном COM-порту (а именно так оно в этом случае и получается); при запуске терминала каждый раз выдает предупреждение о возможном конфликте и не реагирует на кнопку Reset в интерфейсе терминала.
P.S. Прошивку программатора я брал из другого места, которое сейчас почему-то недоступно. если кому-то потребуется - пишите, пришлю или выложу.
Я брал в “Тритоне”, причем взял и зеленую, и белую - чтобы посмотреть и решить какая лучше. Благо цена на них смешная.
Зеленая имеет приятный салатовый оттенок - ее и решил поставить. Белый мне показался очень холодным, мертвым каким-то.
Все подсветки стоили по $2 +/-30 центов (белая = 63руб, зеленая = 52руб (голубая - столько же). И дисплей 225 руб.
Ещё жёлтая думаю должна быть симпатичной. Жаль, что у них ничего толком про почту не расписано - боюсь в Беларусь могут и не отправить. Да и со способами оплаты ничего не ясно…
… А можно про бутлоадер популярно в двух словах (или ссылочку)? Никогда такой штукой не пользовался. Что он дает? В чем его прелесть при наличии программатора и разъеме SPI, выведенном наружу в укромном месте? Можно ссылочку на какое-нибудь доходчивое нравоучение?
С ссылкой сложно. Я искал в поиске. Конкретно про выложенный бутлоадер можно найти глянув в заголовок файлов что я выложил и забив в поисковике. Смысл бутлоадера в том, что бы запускатся перед программой и выполнять какие либо действия перед передачей ей управления. Например обновление прошивки. Это у нас она открытая, а если проект коммерческий, то прошивка должна быть защищена от “пионеров”. Её шифруют, а бутлоадер перед записью дешифрует. Бутлоадер записывается в специальную область. Команды записи во флеш работают только из этой области. Для защиты самого лоадера его область можно закрыть на запись, что бы он сам себя не грохнул.
Теперь про прелесть для нас: 128-ая мега шьётся не через SPI, а через UART. И если вы вывели прошивочный разъём, то вывели и UART. Я же его вывел в виде миниджека на боковую строну. А на кабеле ответный разъём - как у наушников. Количество необходимых проводов уменьшается с 5/6-ти до 3-х.
…Я уже писал здесь где-то, что пользуюсь CVAVR с USB-шным программатором = аналог AVRISP, причем он умеет принимать отладочную информацию по SPI-шинам, тем же, по которым идет внутрисхемное программирование.
Сразу минус: всё программно. У меня же UART работает по прерываниям - меньше вносимые погрешности.
Одна мелкая неприятность - CVAVR почему-то не любит, когда терминал и программатор на одном COM-порту (а именно так оно в этом случае и получается); при запуске терминала каждый раз выдает предупреждение о возможном конфликте и не реагирует на кнопку Reset в интерфейсе терминала.
Есть такое, но в версии 2 меня как-то не особо напрягает. Главное закрыть терминал перед открыванием программатора и наоборот…
EagleB3: про бут лоадер у ди халта хорошо написано easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-…
У меня другая мысль была по поводу использования UART - сохрянять и восстанавливать настройки передатчика на компьютере. Или передавать на другой передатчик. У меня передатчика два, работают в режиме тренер-ученик. Было бы здорово иметь возможность передавать настройки. Для обмена между передатчиками вообще ничего кроме проводов не надо, а для обмена с компом нужен либо преобразователь уровней, либо радикальнее сразу переходник со специализированной микросхемой для подключения в USB.
Можно использовать FDTI232RL USB-UART. Обвески практически никакой.
У меня другая мысль была по поводу использования UART - сохрянять и восстанавливать настройки передатчика на компьютере
Вот потому я на своей плате кодера разъем SPI наружу и вывел. Хочешь - EEPROM (со всеми настройками) слей, хочешь - залей. И как UART работает - по крайней мере в направлении “из кодера наружу” - я выше написал…
Можно использовать FDTI232RL USB-UART. Обвески практически никакой.
вот еще одна микросхема😁 АРМ надо;)
вот еще одна микросхема😁 АРМ надо;)
Я не уверен, что надо ее в передатчик ставить. В свое время купил за 300 рублей интерфейс к телефону Sony-Erricson. Внутри UART-USB преобразователь Profilic PL2003. Хвост к телефону сразу обрезал и сделал трехпиновый разъем - RX, TX, земля. В результате, любое устройство с UART подключается через USB легко и непринужденно.
Между делом созрела очередная версия…
Предполагаю мягко говоря неодназначную реакцию пользователей моей проги, и схему надо менять, и структура eeprom опять поменялось ( конфигурацию со старой версии не восстановить), но что поделать, прогресс не удержишь…😃
- Устранена “сиплость” звуков использованием аппаратной генерацией меандра. К сожалению для этого пришлось изменить схему. Бузер теперь следует подключить к PE3, а переключатель SW2_1, который сидел на этой ноге, к PE1. Зато теперь можем насладится кристально чистыми рингтонами… 😃
- Возможность изменения всех параметров и навигации по меню крутилкой AddProp. Для включения этого, находясь в режиме редактирования параметра (когда циферка мигает), достаточно сдвинуть пот на 10%. Тк. пот все же не энкодер, параметр устанавливается пропорционально абсолютному углу резистора. Если требуется более точная коррекция значения, всегда можно воспользоваться обычным способом- стрелками вверх/вниз. Находясь в меню, так же можно двигаться по пунктам накручивая этот резистор.
- В опциях сделано подменю “Alarms”. Там кроме установки контроля батареи, можно теперь установить порог звуковой сигнализации выход за минимальный порог тока в антене.
- Изменена логика обработки сигналов (см диаграмму). Определены два уровня конструктора каналов - логический (индивидуальные настройки для режимов полета) и физический (не зависит от режима). Идея такая- конструируем сначала логический канал, не задумываясь в какую сторону стоят сервы ( это уже “физика”). И на последнем этапе подстраиваемся под механическую реализацию приводов. Убрал реверс до микшера, тк можно (и нужно, если этого требует логика) использовать отрицательные значения микшера. На физическом уровне можно накручивать субтриммеры (точная установка “нуля” сервы), нижнюю и верхнюю границы ее отклонения (EPA) и реверс.
- Добавлен контроль CRC EEPROM. При включении, если что не так, будет противный звук с предложением все сбросить по умолчанию.
- Устранен случайно найденный серьезный косяк всех предыдущих версиях. Если использовать очень сложные микшеры для какого-нибудь канала (задать ненулевые значения для всех контролов), при уменьшения его ниже некоторого значения, формирование PPM срывалось. Теперь все хорошо…
narod.ru/disk/15888420000/3310_1_8.rar.html
Хочу предупредить- версия только что “из под пера”, о найденных косяках старайте сообщать без особого раздражения… 😃
А AddProp - это который на 8 канал?
Может полную схему выложишь?
AddProp - дополнительный пропорциональный канал, у меня обычный переменный резистр. Окончательной схемы нет, буду благодарен если кто-нибудь её нарисует.
Забыл о главном… 😃
7.Наибольно популярные кривые (линейная, экспанента, логорифм) теперь можно задать единственным параметром. Отрицательное значение соответствует экспоненциальной кривой, положительное-логорифмической, 0- догодайтесь сами…
Возможность накручивать произвольную кривую по точкам осталась.
Может полную схему выложишь?
По идее оно выглядит вот так. Архив 256Кб, внутри BMP на 10 метров. Сконвертировать можете сами во что угодно. 😒
Прошу уточнить на схеме: PF0- датчик тока антены, PF1- датчик температуры, PD0- тахометр.