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

Texnik

Алексей, меня интересует подключение tic к кодеру. По распиновке (data) подключение аналогичное приведенной схеме?

Nick_Shl

Продолжаем. Внутри получилось так:

Чуть под углом:

Вид на батарейный отсек:

И с батарейкой:

Батарейку пришлось заказывать с ebay, поглядывая на размеры…

Переходим к управлению и программной части. Вид на главное меню:

Для навигации доступно 6 кнопок. Кроме стандартных ещё две дополнительные.

Ввод имени:

Все шесть кнопок используются в полной мере. Гораздо удобнее чем в оригинале.

Сохранение модели:

Отвечаем на вопрос воспользовавшись Ok и Cancel.

Диалог выбора откуда и куда:

Изменение значений:

Как видно, значения меню выводятся напротив названий. В диалоге изменения числовых значений используя “Влево” и “Вправо” значение можно изменять 10-ками.

Изменение кривой:

Опять, же 6 кнопок гораздо удобнее.

Диаглог выбора строковых значений:

Надо бы ещё добавить полосу скроллинга сбоку.

Что касается исходников, то решил, что буду буду придерживаться такой точки зрения:

Aleksey_Gorelikov:

Не вижу смысла ее публиковать, да и не хочу.

Прошивку пришлось переписать заново. То что она представляла вначале - вообще ужас. Тут говорят, что Фокус сбежал что бы поддержкой не работать, но в действительности прошивка написана так, что в ней программисту разобраться сложно, а о начинающих и говорить не приходится!
Форматирование отсутствует как класс, жуткий хард кодинг - попробуйте хотя бы поменять кварц. Но Фокусу это всё простительно - он всего лишь был школьником, опыта не было никакого, сделал как смог…
Но что ещё более интересно, так это то, что за всё это время никто кардинально ничего не изменил!
В прошивке MSV хоть и есть изменения к лучшему, но всё равно это ужас - форматирования нет, комментариев нет, кругом всё тот же хард кодинг.
И вот сижу я и думаю… Ну выложу я прошивку и что? Если никому до этого это было не нужно, то что изменится? Технической поддержкой я тоже работать не хочу.
Если кому интересно программных средств использую CodeVisionAVR v2, Araxis Merge(для сравнения изменений в файлах) и TortoiseSVN(управление версиями, хранит историю изменений, позволяет получить любую версию).

Aleksey_Gorelikov
Texnik:

Алексей, меня интересует подключение tic к кодеру. По распиновке (data) подключение аналогичное приведенной схеме?

То, что я выкладывал - это 10 минутная переделка библиотеки фокуса, делал только для того, чтобы “пощупать руками”. Собсвтенно - пощупал. Если использовать эту библиотеку - в ней и2с програмный - можно подключить к любым двум ногам произвольного порта.
Смотри:
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=5
.equ __scl_bit=4
Вот и вся схема. 😃 Ну к дисплею надо конденцатор подключить, землю, питание, вывод ресет на +5, sda и scl к питанию подтянуть и на этом все.

Aleksey_Gorelikov
Nick_Shl:

Тут говорят, что Фокус сбежал что бы поддержкой не работать, но в действительности прошивка написана так, что в ней программисту разобраться сложно, а о начинающих и говорить не приходится!
Форматирование отсутствует как класс, жуткий хард кодинг - попробуйте хотя бы поменять кварц. Но Фокусу это всё простительно - он всего лишь был школьником, опыта не было никакого, сделал как смог…
Но что ещё более интересно, так это то, что за всё это время никто кардинально ничего не изменил!

Ну Фокус и не сбежал вовсе… Общаться с ним вполне реально, а вот со временем у него труба, похоже. А по коду - парень учится, на первую версию на меге16 - вобще без слез не взглянешь, на второй - уже терпимие, третья - лучше. Не на много конечно, но прогресс есть. Может она когда в свет и выйдет. Разобраться - вполне реально, и школьнику и программисту. Еслиб писал действительно программист, после удаления коментариев и форматирования разобраться бы еще сложнее было. (а многие специально коменты и форматирование удаляют, благо многие редакторы такую функцию имеют 😃 )
Насчет координальных изменений - зачем они, для чего публиковать? Основные функции кодер и так выполняет, дополнительные “удобства” - я и в твоих фотках не увидел, как и не увидел ( а может оно есть?) - экраны “неправильного включения” (т.е. предупреждения о включение передатчика с газом в мах, даблрейтами и т.д. - по вкусу), или контроля целостности епром (как в ДХ-7, нелюбимый всеми “Backup error” 😃, а ведь епром не вечен,хоть об этом и можно спорить. Передатчик может быть выключен в момент сохранения (в том же спектруме есть аппаратная защита от этого, но это не мешает епрому слететь). В прошивке МСВ лучше реализована работа с епром в плане экономии циклов перезаписи. - тоже прогресс налицо.
Сей проект лично я рассматриваю как любительскую поделку, приятно, что тот же Фокус и МСВ решились публиковать исходники, но… В любом случае самодельный кодер - на свой страх и риск. Кто желает заняться этим хобби (кодеростроение 😃 ) - просто обязан как минимум разобраться полностью в софте, переписать все, что не нравится, дописать все, что необходимо лично ему и т.д, перед тем как поднимать в небо “аппарат”.
Несомненно плюс проекта в том, что кто-то сядет - начнет разбираться, втянется, обретет еще одну профессию, наконец. Проект Фокуса\МСВ - это только _ПРИМЕР_ того, что можно сделать своими руками то, что хочешь, а не эталон передатчика… Целей догнать и переплюнуть бренды никто не ставил, и не ставит, экономить деньги - тоже не получится, экономить на китае можно (турниджи тот же).
Но зачем ругать то тех же авторов??? Пишут как могут, как хотят, для себя
Точно так же как и я, и ты. Уверен, и в наших проектах найдется что улучшить. Я люблю смотреть чужие исходники ради самообразования (и плоихие, и хорошие. Бошка у всех по разному работает, порой интересные алгоритмы попадаются.), при этом стараюсь не коментировать что все хреново! Железка работает, автора устраивает и замечательно! Посоветовать что-то можно, но… Это я к чему - ты своим постом у того же МСВ отбил желание свой код показывать.😉 А показывать он его и так не собирался, просто народ насчет дисплеев ныть стал, а после хексов - стал ныть еще больше, что мол ручки не на месте, печатка другая и т.д. А я его предупреждал… 😁 И от этого наверно никто не пострадал, но осадочек останется.
Зря ты так.

Nick_Shl
Aleksey_Gorelikov:

Ну Фокус и не сбежал вовсе… Общаться с ним вполне реально, а вот со временем у него труба, похоже.

Про время это он так думает 😃. Я себя вспоминаю - всегда казалось, что мало времени. Но чуть позже понимал, как много у меня его было…
А про “сбежал” имел ввиду это:

Aleksey_Gorelikov:

Я не исключаю, что и Женя тут больше не появляется, ввиду того, что надоело постоянно суппортом работать.

Aleksey_Gorelikov:

Еслиб писал действительно программист, после удаления коментариев и форматирования разобраться бы еще сложнее было.

Не согласен.Использование дефайнов, enum’ов для описания здорово облегчает понимание.

Aleksey_Gorelikov:

Насчет координальных изменений - зачем они, для чего публиковать? Основные функции кодер и так выполняет, дополнительные “удобства” - я и в твоих фотках не увидел, как и не увидел ( а может оно есть?) - экраны “неправильного включения” (т.е. предупреждения о включение передатчика с газом в мах, даблрейтами и т.д. - по вкусу)

Это первая версия. Задача была уйти от “неправильной” идеологии хардкодинга и меню с “кооперативной многозадачностью”. Тем более мой вкус только формируется. Есть верт ESky который в моих руках не летает и недавно построил самолетик - он даже летал, но тяги маловато…

Aleksey_Gorelikov:

или контроля целостности епром (как в ДХ-7, нелюбимый всеми “Backup error” 😃, а ведь епром не вечен,хоть об этом и можно спорить. Передатчик может быть выключен в момент сохранения (в том же спектруме есть аппаратная защита от этого, но это не мешает епрому слететь).

Всё картинками не покажешь. CRC EEPROM была одной из первых в очереди задач, после переписки кода. Вот:

// *****************************************************************************
// ***   Мусорная переменная - нулевая ячейка подвержена самопорче   ***********
// *****************************************************************************
static eeprom unsigned char EEPROM_TRASH @(0x0000);

// *****************************************************************************
// ***   Переменная для хранения CRC, размещена в конце EEPROM   ***************
// *****************************************************************************
static eeprom unsigned short EEPROM_CRC @(0x1000 - sizeof(unsigned short));

// *****************************************************************************
// ***   Подсчет CRC EEPROM и его записть   ************************************
// *****************************************************************************
static inline void Recalc_EEPROM_CRC(void)
{
    // Считаем новый EEPROM CRC и записываем его в EEPROM
    EEPROM_CRC = Crc16_eeprom((unsigned char eeprom *)1, 0x1000 - sizeof(unsigned short));
}

// *****************************************************************************
// ***   Проверка корректности CRC EEPROM   ************************************
// *****************************************************************************
inline unsigned char Is_EEPROM_CRC_Correct(void)
{
    // Считаем EEPROM CRC и сравниваем с записанным
    // Если совпадает - возвращаем ИСТИНУ
    if(EEPROM_CRC == Crc16_eeprom((unsigned char eeprom *)1, 0x1000 - sizeof(unsigned short))) return(TRUE);
    // Иначе - ЛОЖ
    else return(FALSE);
}
Aleksey_Gorelikov:

Несомненно плюс проекта в том, что кто-то сядет - начнет разбираться, втянется, обретет еще одну профессию, наконец. Проект Фокуса\МСВ - это только _ПРИМЕР_ того, что можно сделать своими руками то, что хочешь, а не эталон передатчика… Целей догнать и переплюнуть бренды никто не ставил, и не ставит, экономить деньги - тоже не получится, экономить на китае можно (турниджи тот же).

Экономить - действительно цель мнимая. А вот “догнать и перегнать” - та цель к которой стоит стремится. А ещё цель реализовать любую понадобившуюся фичу которой нет у брендов. Если бы Linux был бы только _ПРИМЕР_'ом? Linux очень хороший пример чего можно достич, если задатся целью.

Aleksey_Gorelikov:

Но зачем ругать то тех же авторов???

Во-первых я ругал код, а не авторов.

Aleksey_Gorelikov:

Но зачем ругать то тех же авторов??? Пишут как могут, как хотят, для себя
Точно так же как и я, и ты.

Я писал не совсем для себя. Я писал для всех. У меня каждая строчка откомментирована, потому как писалось для “чайников”… Но ведь это никому не надо, верно? Кто что либо сделал для проекта? Можно пересчитать этих людей по пальцам одной руки… И это за 3 года!
А ещё не хочу, что бы написанный код со временем в помойку превратился…

Aleksey_Gorelikov:

Это я к чему - ты своим постом у того же МСВ отбил желание свой код показывать.😉 А показывать он его и так не собирался, просто народ насчет дисплеев ныть стал, а после хексов - стал ныть еще больше, что мол ручки не на месте, печатка другая и т.д. А я его предупреждал… 😁 И от этого наверно никто не пострадал, но осадочек останется.
Зря ты так.

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

Если же интересны детали, то работа моей переработки полностью повторяет таковую у фокуса. Цель сразу всё переработать не было. Была цель реализовать читабельный и модульный код. Эта цель достигнута.
Как я уже писал идеология “кооперативной многозадачности” для меню и не модульность его самого меня не устраивала полностью. Поэтому я решил сделать “вытесняющюю” всё в кавычках, потому ка не совсем то, сто написано. У меня три уровня.
Первый, самый приоритетный - только формирование импульсов и математика. Это должно работать всегда.
Второй - драйвер клавиатуры, подсчет таймера, проигрывание мелодии в фоновом режиме, сохранение триммеров, если они были изменены. Всё это вызыватся из отдельного прерывания, при этом разрешаются прерывания и поддерживается не реентерабельность.
Самый низкий - главный экран и меню. Меню реализовано на движке и описывается структурами:

// *****************************************************************************
// ***   Описание пункта меню   ************************************************
// *****************************************************************************
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;

Заполняем и вызываем функцию MenuCycle(MenuPad * Menu);
Ладно, на сегодня всё… пойду спать.

Denn

Господа!
Что-то вы как-то агрессивно выражаетесь!
Как я понимаю, целью проекта является создание работающей схемы с возможностью её лёгкого повторения. Причём понятно, что предпочтения и приоритеты у каждого свои, как и способности, и навыки. Поэтому предлагаю :
давайте считать, что всё здесь сделанное является

  1. общим и бесплатным ( пока не оговорено другое )
  2. сделанным по своим возможностям и желаниям
  3. сделанным не со зла
  4. и т.д.

Лично я приветствую любую информацию, которая поможет хоть кому-нибудь сделать кодер или передатчик! Причём чем более грамотным и упорядоченным будет код и сам процесс - в выигрыше будут все.
Поэтому предлагаю: кто делает доработки и модификации - не жалейте пожалуйста времени и сил на опубликование своих творений, причём очень желательно с подробными комментариями ( так как может пригодиться и в других проектах ).
Будьте добрее!
Спасибо всем!

Aleksey_Gorelikov

Я могу что-то посоветовать, пальцем ткнуть в место в коде, если прозвучит конкретный вопрос как работает что-то, как поправить/добавить то-то. Но делать для кого-то что-то - это извините. Свой код не дам и чужих переделывать не буду, а то вдруг ошибусь… Потом совесть замучает за попадавшие чужие модели.
Так что давайте сами!!!

АлександрСамара

tu MSV
скачал вашу последнюю прошивку для 3310, схема с печаткой соответствует посту 1386 (на 54 ногу приходит регулировка напряжения), а проблема с 20,4 вольта на индикаторе имеется:
Может бросить перемычку на какую нить другу ногу, к которой вы привязали этот порт или есть прошивка на это?
С уважением)))

Aleksey_Gorelikov
АлександрСамара:

Может бросить перемычку на какую нить другу ногу, к которой вы привязали этот порт или есть прошивка на это?
С уважением)))

Открываем файл def.h

Находим строку:

#define Batt 6

Цифра 6 - номер канала АЦП. Открываем даташит на проц. 54 нога - АDC7, соответственно, меняем в деф.н циферку 6 на 7, компилируем проект, прошиваем, радуемся. 😃

АлександрСамара
Aleksey_Gorelikov:

Открываем файл def.h

Находим строку:

#define Batt 6

Цифра 6 - номер канала АЦП. Открываем даташит на проц. 54 нога - АDC7, соответственно, меняем в деф.н циферку 6 на 7, компилируем проект, прошиваем, радуемся. 😃

Я бы Вам сказал огромное спасибо, если скомпилили бы😁
Но что бы мне это сделать, надо с чего то еще начать, типа язык “С” поучить, освоить прогу, которая это делает (найти ее), ну с даташитом на проц разберусь…
Может с помощью даташита просто ногу перебросить, пока не освоил програмирование?)))
Думаю стоит начать это изучать, но летать на новом девайсе хочется уже завтра:(

Aleksey_Gorelikov

Ну перекиньте проводок на ноге… А просто откомпилировать - ничего сложного. Устанавливаете на компе кодевижен, нажимаете в нем файлс=>опен проджект, и в соседней менюшке проджект=> ,буилд алл. Затем тулс=> чип программарс=> программ чип. 😃 Ну это так, на будущее… 😃

З.Ы. перекидывая проводок - уточните в своем деф.н какая всетаки нога за батарейку отвечает. Вдруг я не в том архиве цифру 6 посмотрел… Если 6 - то это 55 нога будет…

АлександрСамара

Ну подкинули мне на завтра задачку, буду пробовать)))
К выходным хочу на новом полетать)))
Кодевижен брать я так понял с 123AVR?

Nick_Shl
Denn:

Как я понимаю, целью проекта является создание работающей схемы с возможностью её лёгкого повторения.

Вотцели у вех получается разные…

Denn:

Лично я приветствую любую информацию, которая поможет хоть кому-нибудь сделать кодер или передатчик! Причём чем более грамотным и упорядоченным будет код и сам процесс - в выигрыше будут все.

Нужен будет совет - обращайтесь. Что касается процесса - я ещё год назад предлагал по коллективизации процесса с установкой сервера контроля версий…

Aleksey_Gorelikov:

Но делать для кого-то что-то - это извините. Свой код не дам и чужих переделывать не буду, а то вдруг ошибусь…
Так что давайте сами!!!

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

Aleksey_Gorelikov
Nick_Shl:

пример когда люди что-то захотели и сделали. Вместе.

Сейчас народ винду заново пишет. 😃 Не хотите присоединиться?

З.Ы. Сори за офтоп.

ubd

Но не могу ни как определиться по какой схеме собирать передатчик на 40 Мгц.

Ну там на этом сайте схема ВЧ-блока есть, вот и делай его.

msv

2АлександрСамара
Не торопитесь компилить (хотя освоить это в принципе, не помешает). В выкладываемой версии канал контроля батареи = 7 и соответстует схеме.
Калибровку батареи делать надо в последнюю очередь, после калибровки джойстиков (согласно моей инструкции во вложении). Но если просто надо проверить, то намекаю, посмотрите какое напряжение у Вас установлено на AREF? И сравните его с PF7.
//------------
“Наезд” Nick_Shl вполне понятен и уж точно не обиден. Считаю серьезной заслугой Фокуса, что будучи еще школьником, он потянул такой проект, и пожалуй первый перешел от с слов к делу, во всяком случае открыто.
Лично я взялся за этот проект по причинам (в порядке уменьшения приоритета):

  1. Соскучились руки по паяльнику.
  2. Захотелось вспомнить, что не так уж давно был программером.
  3. Поиметь аппу с неограниченным ничем, кроме моих фантазий, функционалом.
    То что это оказалось полезным еще кому-то, приятная добавка в виде морального удолетворения…
    И уж точно на скорую руку слепленная прога не претендует на образец для обучения и выложена не для этого.
    Контроль CRC EEPROM конечно был в планах, но сразу не до того было, а потом как-то забылось за ненадобностью (наверное пока в поле с кривой конфигурации не окажусь… 😃)
    А вот аналогии с Linux не вижу. Уровень сложности всего проекта - “конструкция выходного дня”. И быть привязанным к чужой архитектуре, стилю итп. нет смысла.
    Достаточно обмена идеями.
Denn

Спасибо, MSV!

У меня к Вам есть предложение: не сможете ли Вы изменить код программы следующим образом:
ввести переменную , отвечающую за сдвиг изображения на дисплее на определённое количество пикселей. Тогда для дисплея 3310 она = 0, а для 3410 - половине разности разрешений дисплеев по горизонтали. Тогда на 3410 будет выводится пусть немного уменьшенное изображение, но по центру.

Nick_Shl
Aleksey_Gorelikov:

Сейчас народ винду заново пишет. 😃 Не хотите присоединиться?

Одну и так уже написал. Вывод сообщений - вызываем MsgBox(). Редактирование имени - EditStrDlg(). Есть ещё EditNumDlg(), FromToBox(), SelectBox(). Работу всех функций видно на фото.

Denn:

У меня к Вам есть предложение: не сможете ли Вы изменить код программы следующим образом

Для таких вещей define’ами надо пользоваться. Пару раз всплывала тема про переворот экрана. Зная, что такое может повторится, нужно было сделать так:
в def.c добавить:

// Если задан - экран рисуется перевёрнутым  - для установки экрана вверх тормашками.
#define GFX_REVERSED

А в графической библиотеке написать так:

void gfx_PutPixel(unsigned char x, unsigned char y, unsigned char color)
{
    unsigned char i;
    unsigned char j;

    if(x >=  WidthS) return; // Если X выходит за экран - выходим
    if(y >= HeightS) return; // Если Y выходит за экран - выходим

    color &= 0x01;   // Color must have one last bit

#ifdef GFX_REVERSED
    x = WidthS  - 1 - x; // Reverse X
    y = HeightS - 1 - y; // Reverse Y
#endif

    i = y >> 3;          // y/8;
    j = y & 0b00000111;  // y%8;

    LCD_Buf[i][x] = (LCD_Buf[i][x] & (~(1 << j))) | (color << j);
}

WidthS и HeightS - тоже define’ы задающие размеры экрана. Если опиратся на них, то большую часть пользовательского интерфейса можно было написать с автоподгонкой.
У меня без автоподгонки только калибровка и редактирование кривой.

Aleksey_Gorelikov
Nick_Shl:

Одну и так уже написал.

Ну так вот идею коммунистического линукса продвигаете, а коммунистический ХР поддержать не хотите. А между прочим, альфы-версии уже сносно работают.

Nick_Shl
Aleksey_Gorelikov:

Ну так вот идею коммунистического линукса продвигаете, а коммунистический ХР поддержать не хотите. А между прочим, альфы-версии уже сносно работают.

Я двигаю идею работы вместе по образу и подобию. И с линуксом особо не знаком. Но рюшечки в Ubuntu произвели незгладимое впечатление… чего можно добится работая командой.
Кстати ссылочку на ваш “коммунистический ХР” стоило бы привести раз уж про него заговорили.