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

Nick_Shl
DD:

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

Шаг 0,5. Получается ножка 0,25 и межноговое пространство 0,25…
А насчёт терпения: я уже натерпелся когда плату делал. Первая получилась с первого раза а от вторая…

DD:

И можно поподробнее как вы отлаживаете и если есть что выложить - выкладываейте. заранее спасибо

Всё очень просто. В 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

Большинство проблемных мест так отлаживал. Потому как в Протеусе вообще ничего сделать не могу - как-то он отладку по исходному коду хреново делает. Или глючит. Например вместо линии при некоторых условиях получалась ерунда. Надоело с ним баловался…

VRV:

По прерываниям spi- по даташиту сосетуют использовать прерывания при высоких значениях предделителя от 64 и выше. Обидно терять циклы для ожидания готовности spi.

Ясно. Просто у меня экран с контроллером KS0108, а там 8 бит данных + доп сигналы. Управлять им приходится полностью программно.

VRV:

На счет железа согласен(пример глюки протеуса при записи еепром), однако мое железо бедет корректироватся в зависимости от реализации программы, а возится с макеткой лень:)

Так может с этого и стоит начать? Стделать ТЗ, развести плату, сделать. Разводить с заделом на будущее - все неиспользуемые ноги на разёмы.
После первой сделаете вторую - без всех недостатков 😃. Именно так было у меня. Вначале сделал одну, увидел недостатки и сделал вторую версию.

EagleB3:

Я взял дисплей с полупропусканием и подсветкой (TIC154+TB1038S)

Вот себе хочу именно такую комбинацию, только с TB1025S(белая).Кстати, сколько стоит такая комбинация в $ ?
Жаль что трёхцветных подсветок на такие TICи нет…

EagleB3
Nick_Shl:

Вот себе хочу именно такую комбинацию, только с 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. Прошивку программатора я брал из другого места, которое сейчас почему-то недоступно. если кому-то потребуется - пишите, пришлю или выложу.

Nick_Shl
EagleB3:

Я брал в “Тритоне”, причем взял и зеленую, и белую - чтобы посмотреть и решить какая лучше. Благо цена на них смешная.
Зеленая имеет приятный салатовый оттенок - ее и решил поставить. Белый мне показался очень холодным, мертвым каким-то.
Все подсветки стоили по $2 +/-30 центов (белая = 63руб, зеленая = 52руб (голубая - столько же). И дисплей 225 руб.

Ещё жёлтая думаю должна быть симпатичной. Жаль, что у них ничего толком про почту не расписано - боюсь в Беларусь могут и не отправить. Да и со способами оплаты ничего не ясно…

EagleB3:

… А можно про бутлоадер популярно в двух словах (или ссылочку)? Никогда такой штукой не пользовался. Что он дает? В чем его прелесть при наличии программатора и разъеме SPI, выведенном наружу в укромном месте? Можно ссылочку на какое-нибудь доходчивое нравоучение?

С ссылкой сложно. Я искал в поиске. Конкретно про выложенный бутлоадер можно найти глянув в заголовок файлов что я выложил и забив в поисковике. Смысл бутлоадера в том, что бы запускатся перед программой и выполнять какие либо действия перед передачей ей управления. Например обновление прошивки. Это у нас она открытая, а если проект коммерческий, то прошивка должна быть защищена от “пионеров”. Её шифруют, а бутлоадер перед записью дешифрует. Бутлоадер записывается в специальную область. Команды записи во флеш работают только из этой области. Для защиты самого лоадера его область можно закрыть на запись, что бы он сам себя не грохнул.
Теперь про прелесть для нас: 128-ая мега шьётся не через SPI, а через UART. И если вы вывели прошивочный разъём, то вывели и UART. Я же его вывел в виде миниджека на боковую строну. А на кабеле ответный разъём - как у наушников. Количество необходимых проводов уменьшается с 5/6-ти до 3-х.

EagleB3:

…Я уже писал здесь где-то, что пользуюсь CVAVR с USB-шным программатором = аналог AVRISP, причем он умеет принимать отладочную информацию по SPI-шинам, тем же, по которым идет внутрисхемное программирование.

Сразу минус: всё программно. У меня же UART работает по прерываниям - меньше вносимые погрешности.

EagleB3:

Одна мелкая неприятность - CVAVR почему-то не любит, когда терминал и программатор на одном COM-порту (а именно так оно в этом случае и получается); при запуске терминала каждый раз выдает предупреждение о возможном конфликте и не реагирует на кнопку Reset в интерфейсе терминала.

Есть такое, но в версии 2 меня как-то не особо напрягает. Главное закрыть терминал перед открыванием программатора и наоборот…

Евгений_Зайцев

У меня другая мысль была по поводу использования UART - сохрянять и восстанавливать настройки передатчика на компьютере. Или передавать на другой передатчик. У меня передатчика два, работают в режиме тренер-ученик. Было бы здорово иметь возможность передавать настройки. Для обмена между передатчиками вообще ничего кроме проводов не надо, а для обмена с компом нужен либо преобразователь уровней, либо радикальнее сразу переходник со специализированной микросхемой для подключения в USB.

Texnik

Можно использовать FDTI232RL USB-UART. Обвески практически никакой.

EagleB3
Евгений_Зайцев:

У меня другая мысль была по поводу использования UART - сохрянять и восстанавливать настройки передатчика на компьютере

Вот потому я на своей плате кодера разъем SPI наружу и вывел. Хочешь - EEPROM (со всеми настройками) слей, хочешь - залей. И как UART работает - по крайней мере в направлении “из кодера наружу” - я выше написал…

DD
Texnik:

Можно использовать FDTI232RL USB-UART. Обвески практически никакой.

вот еще одна микросхема😁 АРМ надо;)

Евгений_Зайцев
DD:

вот еще одна микросхема😁 АРМ надо;)

Я не уверен, что надо ее в передатчик ставить. В свое время купил за 300 рублей интерфейс к телефону Sony-Erricson. Внутри UART-USB преобразователь Profilic PL2003. Хвост к телефону сразу обрезал и сделал трехпиновый разъем - RX, TX, земля. В результате, любое устройство с UART подключается через USB легко и непринужденно.

msv

Между делом созрела очередная версия…
Предполагаю мягко говоря неодназначную реакцию пользователей моей проги, и схему надо менять, и структура eeprom опять поменялось ( конфигурацию со старой версии не восстановить), но что поделать, прогресс не удержишь…😃

  1. Устранена “сиплость” звуков использованием аппаратной генерацией меандра. К сожалению для этого пришлось изменить схему. Бузер теперь следует подключить к PE3, а переключатель SW2_1, который сидел на этой ноге, к PE1. Зато теперь можем насладится кристально чистыми рингтонами… 😃
  2. Возможность изменения всех параметров и навигации по меню крутилкой AddProp. Для включения этого, находясь в режиме редактирования параметра (когда циферка мигает), достаточно сдвинуть пот на 10%. Тк. пот все же не энкодер, параметр устанавливается пропорционально абсолютному углу резистора. Если требуется более точная коррекция значения, всегда можно воспользоваться обычным способом- стрелками вверх/вниз. Находясь в меню, так же можно двигаться по пунктам накручивая этот резистор.
  3. В опциях сделано подменю “Alarms”. Там кроме установки контроля батареи, можно теперь установить порог звуковой сигнализации выход за минимальный порог тока в антене.
  4. Изменена логика обработки сигналов (см диаграмму). Определены два уровня конструктора каналов - логический (индивидуальные настройки для режимов полета) и физический (не зависит от режима). Идея такая- конструируем сначала логический канал, не задумываясь в какую сторону стоят сервы ( это уже “физика”). И на последнем этапе подстраиваемся под механическую реализацию приводов. Убрал реверс до микшера, тк можно (и нужно, если этого требует логика) использовать отрицательные значения микшера. На физическом уровне можно накручивать субтриммеры (точная установка “нуля” сервы), нижнюю и верхнюю границы ее отклонения (EPA) и реверс.
  5. Добавлен контроль CRC EEPROM. При включении, если что не так, будет противный звук с предложением все сбросить по умолчанию.
  6. Устранен случайно найденный серьезный косяк всех предыдущих версиях. Если использовать очень сложные микшеры для какого-нибудь канала (задать ненулевые значения для всех контролов), при уменьшения его ниже некоторого значения, формирование PPM срывалось. Теперь все хорошо…

    narod.ru/disk/15888420000/3310_1_8.rar.html
    Хочу предупредить- версия только что “из под пера”, о найденных косяках старайте сообщать без особого раздражения… 😃
Denn

А AddProp - это который на 8 канал?
Может полную схему выложишь?

msv

AddProp - дополнительный пропорциональный канал, у меня обычный переменный резистр. Окончательной схемы нет, буду благодарен если кто-нибудь её нарисует.
Забыл о главном… 😃
7.Наибольно популярные кривые (линейная, экспанента, логорифм) теперь можно задать единственным параметром. Отрицательное значение соответствует экспоненциальной кривой, положительное-логорифмической, 0- догодайтесь сами…
Возможность накручивать произвольную кривую по точкам осталась.

EagleB3
Denn:

Может полную схему выложишь?

По идее оно выглядит вот так. Архив 256Кб, внутри BMP на 10 метров. Сконвертировать можете сами во что угодно. 😒

msv

Прошу уточнить на схеме: PF0- датчик тока антены, PF1- датчик температуры, PD0- тахометр.

EagleB3

А схемы этих датчиков есть? По уму бы их следовало бы сразу на схему добавить…
Датчик температуры, кажется, LM35? Тогда с ним вопросов нет.
А датчик тока? А тахометр?

…Кстати, я, когда исследовал историю этой ветки, так и не понял в чем прелесть датчика температуры. Это выносной зонд, температуру головки ДВС измерять? Или как?

EagleB3

Ну не могу молчать! Ну распирает меня!!! 😃

Сегодня сделал печатную плату под “Санву VG400”. Получилось ПРОСТО СУПЕР!!!
Кому интересно и кто трафика не боится - вот общий вид снизу (542Кб) и макро вид одного участка (854Кб). Это я не наилучший участок фотал - она по качеству ВСЯ ТАКАЯ! 😃

Еще не сверленая, не луженая и в размер не обрезалась. Протравлена, помыта, канифольным лаком покрыта - от него на дорожках “шагрень” и разводы. На макро снят участок возле ног 17…28. Две пары площадок под 0805 почти по центру - это конденсаторы обвязки кварца. Ширина дорожек 20th (0,508мм).

Делалось с фоторезистом ПНФ-ВЩ.
Крестики - “прицелы” для совмещения слоев верха и низа.

msv:

Прошу уточнить на схеме: PF0- датчик тока антены, PF1- датчик температуры, PD0- тахометр.

Сделано. Текстом. И про буззер безвстроенногенераторный - тоже. Новая ссылка на схему

VRV
vvvv:

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

пару постов назад кидал проект в протеусе с меню на знкодере(колесо+кнопка=от мыши)

EagleB3, по собственному опыту, старайся не делать ререходов под смд, их тогда паять трудно, а так симпатично. После 5 числа ожидаю свою вг400, буду ломать:)

И еще вопрос больше к моделистам, кто активно использует пульты. Какие функции в основном задействованы? Какие лишние? Каких не хватает? Если у кого есть желание и терпение-накидайте примерную структуру ВАШЕГО меню. Если подобный вопрос обсуждался- кинте ссылку.

DD

Видимо нет, просто температуру среды мерять. У меня стоит какойто подобный от микрочипа, этого когда покупал не было. И еще хотел давно спросить: когда датчик калибруешь, показания должны быстро скакать?

msv

Схема формирователя тахометра отсюда:
radiokot.ru/circuit/digital/…/index.shtml
У меня несколько изменена, но и оригинальная думаю будет работать.
Датчик тока антенны можно здесь разглядеть:
rcopen.com/files/000000000000000000000000
(мой ВЧ-модуль).
В датчике температуры особого смысла нет, просто был свободны вход АЦП…
TMP36 - стоит в корпусе передатчика, подальше от всяких “грелок”. Бывает итересно глянуть температуру, особенно зимой…

Какие функции в основном задействованы?

Я не пользуюсь двойными расходами. Вместо этого расходы настраиваю в режимах полета. Но это как-бы стандарная функция и убирать их совсем пока не тороплюсь…

DD
msv:

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

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

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