PDA

Просмотр полной версии : Программа для любого трансивера или приёмника



Страницы : [1] 2

Genadi Zawidowski
24.03.2008, 13:43
Продолжения обсуждения темы и новые обновления будут делаться тут:
http://forum.cqham.ru/viewtopic.php?t=1780 3

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

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

Тему завел для того, чтобы доводить совместно программу (коды выложены и никуда деваться не будут), пытаться сделать альтернативные управляющие программы для синтезаторов, авторы которых по тем или иным причинам не могут больше продолжать с ними возиться.

Первоначальная идея по пользовательскому интерфейсу навеяна интерфейсом Yaesu FT-100D, который стоит на столе. Наследство этого - небольшое количество кнопок и совмещение функций некоторых из них.

В каждом диапазоне запоминается последняя частота и режим работы + состояние аттенюатора + набор режимов работы
Нажатие кнопки режима переводят между четырьмя состояниями, которые могут быть из набора usb/lsb, cw/cwr, am/drm/cwz, fm. Отдельная кнопка меняет полосу пропускания для режимов (можно ssb с полосой 6 кГц послушать, например).
При переключении с ssb на cw тон сигнала не меняется (двигаются все гетеродины)
Естественно, осталась и возможность обзора всего диапазона – запоминается частота и режим вне любительских диапазонов (пока сделал – одна ниже 30 МГц и одна выше.
При проходе частоты настройки через диапазон его настройки не портятся.

Сейчас используется просто шесть (теперь семь) кнопок, присоединенных напрямую к порту процессора. Индикатор 1602.

Нынешний проект сделан под процессоры ATMEL ATMega32 или старше.
Никаких особенностей архитектуры процессора не используется (кроме возможности "на ходу" менять назначение выводов порта ввода-вывода, на котором стоит индикатор - для опроса состояния). Естественно, всё это не обязательно и может быть заменено на любой другой алгоритм работы. spi формируется программно. Всё это может облегчить перенос программы на другие архитектуры.

Написано на С без использования ассемблера.

Для компиляции используется бесплатный компилятор WINAVR, запускаемый AVR Studio. Используется 64-х битная арифметика, поддерживаемая WINAVR (http://sourceforge.net/projects/winavr). Вычисления с плавающей точкой не используются.

Обсуждаем улучшения, дополнения. Куски кода или самостоятельные доработки приветствуются. использована идея для быстрого обработчика прерываний валкодера (табличный алгоритм) по обеим фронтам сигналов от валкодера без формирователей отдельный счётных импульсов.

Например, какой алгоритм работы многодиапазонного аппарата с vfo a/b должен быть? Что делать с rit? Июль 2008: сделал split

----
29 марта 2008:
выложена версия, в которой сделан опрос клавиатуры по прерываниям. Найдена ошибка в коде, сгенерированном CodeVisionAVR - неправильно ставился прескалер у таймера T0 (вместо 1024 - с кодом 7 - ставился код 5).
----
5 апреля 2008:
изменилось расположение кнопок (и их алтернативные функции).
По подсказке в форуме добавлен (непроверенный) код для управления AD9832.
----
7 апреля 2008:
Добавлено ожидание готовности про чтении/записи NVRAM. Для возможности использования SPI EEPROM, если нет SPI FRAM (помните про огранияенный ресурс!).
В FRAM соответствующий битик слова состояния всегда установлен в состояние READY. При отсутствующем EEPROM или FRAM будет висеть.
Для отказа от ожидания закомментарить строчку в product.h
----
14 апреля 2008:
Добавлена работа с внутренним EEPROM прцессора (с соответствующим #define) - с обходом запоминания частоты после каждой остановки валкодера. Ресурс по циклам записи мал, но может позволить посмотреть, как оно работает.
Ускоренна работа функций выбора диапазона ГУН и фильтров - переход на 16-битную арифметику с приблизительными расчётами.
----
18 апреля 2008:
В файле encoder.c

#define ENCODER_MULTICLICK 1
Включает работу с валкодером без формирования счётных импульсов.
----
20 апреля 2008:
Устранено несколько мелких багов - при при ускоренной перестройке вниз по частоте - происходил переход через "упор".
Добавленоо сохранение в NVRAM настроек инженерного меню - частоты скатов фильтров, CW Pitch, режим валкодера.
Проверен в работе вариант обработчика валкодера без внешних формирователей счётных импульсов - в связи с этим в tc1.c оставлен шаг перестройки 10 герц для SSB и телеграфа (вместо 50 как раньше).
----
11 мая 2008:
Устранена ошибка в драйверах AD9852/54 - проявлялась при попытке работать со внутренним умножителем (найдено при отладке паралельного проекта - firmware для USB свип-генератора).
----
22 мая 2008:
Добавлена оттестированная коифигурация синтезатора с двума AD9834 и FTW 28 бит (как версия внутри MODEL_64455).
Исправлена описка в обслуживании AD9832.
----
30 мая 2008:
Добавлена программная коррекция частоты опорника (через меню) - для случаем использования дешёвых генераторов без подстройки частоты.
----
02 июня 2008:
Исправлены (подкорректированы) параметры формата при подстройке параметров в инженерном меню. Частоты срезов фильтров теперь хранятся в виде смещения и базы (сделано для экономии ресурсов процессора - смещение 16-ти битное). Это один из шагов для запуска управления синтезаторами транссиверов с преобразованием "вниз".
Да, на момент выклажывания этого обновления проекта количество скачиваний архива исходников - 447.
----
15 июня 2008:
Подготовлена структура программы для работы с VFOA/VFOB
----
02 июля 2008:
Добавлена обработка префиксной клавиши - для расширения функций клавиатуры. Добавлен таймер - ограничитель нахождения в меню и состояния префиксной клавиши. Добавлено отключения УНЧ на 20 мс при переключении режимов и диапазонов. Переключение фильтров ПЧ сделано по префиксной клавише - освободившаяся клавиша будет переключать VFOA/VFPB
----
04 июля 2008:
Добавлена обработка входа PTT - переключение на передачу (с формирование телеграфного сигнала от dds последнего гетеродина.
----
07 июля 2008:
Сделан режим split - и индикация. Переключение делается одной клавишей (нажатие или удержание). Первое нажатие дает возможность перестройки в одном гетеродине, не меняя настройки (и режима работы) с другим. Передача идет всегда на "противоположном" гетеродине.
Нажатия меняют гетеродины местами. Удержанное нажатие - оставляет текущую частоту и режим неизменными, но выключает режим split.
все настройки обеих VFO и сам режим сохраняются при выключении питания (сдох бензоагрегат, например - все настройки восстановились после включения назад).
Отдельно запоминаются (на каждый диапазон и каждый vfo) режим работы и положение аттенюатора.
Добавлена обработка нажатия на тангенту или педаль - с соответствующим программированием гетеродинов.
Добавлен файл buttons.xls с кратким описанием функций клавиш.
----
13 июля 2008:
режим CW (CW/CWR) сделан аналогично тому, как это работает в FT-100: при приёме с включенными широкими фильтрами (у которых признак narrow = 0), частота BFO ставится такая же. как и при приёме SSB (USB/LSB). Частота приёма - смещена относительно нулевых биений на расстояние CW PITCH (обычно - 700 Герц).
При переключении фильтров и/или режимов работы без смены боковой полосы тон принимаемых сигналов не меняется.
----
15 июля 2008:
мелкие доработки - выправлял некрасивые на вид конструкции.
Скачано 499 раз!
----
19 июля 2008:
Исправлена опечатка в имени порта индикатора для версии под ATMEGA32. ПОльзователь форума под ником Explorer начал тестировать!
----
22 июля 2008:
Исправлена ошибка в инициализации таймера при компиляции под ATMEGA32
----
28 июля 2008:
Исправлена ошибка в вычислении частот гетеродинов в режимах DRM и DIGI (было перепутано местами два режима).
----
22 августа 2008:
При вычислении частоты второго гетеродина теперь используется значение частоты опорного генератора с коррекцией, вместо константы. Таким образом я избавился от странной погрешности при коррекции опорного генератора по приёму стандартов частот в эфире на разных диапазонах.
Добавлен define NVRAMEXTCS - для различия вариантов компиляций - при использовании для cs микросхемы NVRAM отдельного вывода процессора. При неопределении этой константы - NVRAM включена на выход дешифратора синтезатора (для версии синтезатора с совмещением на одной плате с еонтроллером).
Добавлены процедуры поддерхдки трёхбайтовой адресации spi nvram eeprom.
----
1 сентября 2008:
Исправлены ошибки, внесённые предидущими доработками. Проверенно "на железе" синтезатора, совмещённого с контроллером.
----
5 сентября 2008:
функция переключения фильтра перенесена на кнопку переключение режимов - после префиксной кнопки F.
планируется ввести явное включение и выключение режима split, сохранив VFO A/VFO B работающими всегда. Удержанное нажатие кнопки переключение VFO будет выполнять функцию VFO A=B (активный VFO копируется в фоновый)
расширена функциональность подпрограммы модификации инженерных настроек - теперь можифицируем не только 16-ти битные параметры, но и 8-битные. Не смотря на увеличение сложности программы, общий объём занимаемой памяти программ и данных уменьшился (ради чего и делалось).
Некоторые текстовые строки перенесены в память программ.
----
9 сентября 2008:
Добавлен автоповтор в драйвер клавиатуры. Автоповтор селективный, сейчас только для двух клавиш переключения диапазонов (они же перебирают пункты меню).
Диапазон 28 МГц разбит на два поддиапазона. Жду предложений по разбивке остальных (21 и 14 МГц).
----
11 сентября 2008:
Добавлен файл architecture.doc - с попыткой объяснения структуры управляющей пограммы.
----
24 сентября 2008:
Исправлен баг в управлении диапазонными фильтрами.
Добавлена регулировка подразумеваемого деления частоты между выходом первого гетеродина и входом смесителя. Добавлена функция регулируемого замедления работы с валкодером - при использовании "многошаговых" валкодеров и режима с "учетверением" их разрешения - это когда без внешнего
формирователя счётных импульсов.
Подготовлен "каркас" для считывания состояния кнопок через АЦП.
----
30 сентября 2008:
Добавлен #define для управлением типом индикатора - WH2002 или WH1602. На широком (WH2002) выводится дополнительно информация о режиме split.
----
04 декабря 2008:
Добавлен режим general coverage - переключение диапазонов шагает по 100 кГц

sgk
24.03.2008, 13:51
Спасибо.
Очень своевременно.
Сергей sgk.

Genadi Zawidowski
24.03.2008, 15:04
"Мучает" вопрос, как сделать:

Сейчас шаг перестройки сделан фиксированным, "зашитым" в программе (на каждый режим работы свой). Как должна работать функция смены шага?
Шаг - это может быть свойство определенного режима работы или на каждый диапазон свой. Но последний вариант потребует выполнения условия - если, перестраиваясь "насквозь" по всему диапазону, мы "въехали" в другой, то при переходе кнопками по иапазонам кроме режима работы и частоты запомнится и новый шаг настройки, который может отличаться от ранее установленного (а вообще-то, в ft-100 сделано именно так - на каждый диапазон свой шаг в каждом режиме работы).

Как совмещать кнопки?
На каждую из них легко вешается две функции - на быстрое и "медленное" (удерживаем пока не сработает) нажатие.

Например, сейчас совмещены функции "LOCK" и грубого шага перестройки (20 кГц). Вместо последней функции делается изменение шага, а грубый шаг будет выполняться "интеллектуальным валкодером".

Еще совмещено включение аттенюатора (нажатие) и переключение режимов АРУ (удержание).
Да, АРУ переключается между "auto", "fasf", "slow" и "off". Auto - в зависимости от режима работы выбираетя или быстрая или медленная.
И это не свойства диапазона, а общая настройка.
Стоит ли так делать? Удобно ли?

EU1ME
24.03.2008, 16:08
Гена, предлагаю вычисление управляющего слова ддс делать так, тогда будет совместимость со всеми м/контроллерами.
Здесь данные для частоты тактирования 432МГц и сразу с учетом деления на 4 (для прямого преобразования)

code unsigned long DDS_MULT[DDS_FREQ_TO_FTW_DIGI TS] = { 39, 7, 6, 8, 2, 1, 5, 7, 0 }; //432MHz F=4x
code unsigned long DDS_DIVISOR[DDS_FREQ_TO_FTW_DIGI TS - 1] = { 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000 };


void ddsSetFreq(unsigned long freq)
{
unsigned char i;
unsigned long ftw;

ftw = freq * DDS_MULT[0];

for (i = 0; i < DDS_FREQ_TO_FTW_DIGI TS - 1; ++i)
ftw += (freq * DDS_MULT[i+1]) / DDS_DIVISOR[i];

ddsSetFTW (ftw);
}

Genadi Zawidowski
24.03.2008, 16:37
Спасибо, буду думать. Я не смог найти ранее присланный Вами алгоритм.

Можно поинтересоваться алгоритмом расчета коэффециентов в массиве DDS_MULT - например, для заполнения его на start-up или автоматизированного расчета утилитой при компиляции?

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

Просто, в алгоритме расчета ftw для схемы синтезатора с делением частоты после dds присутствуют внутренние значения для частот в несколько раз выше dds clock (это такое внутреннее представление) - гнапример, при делении на 21 и тактовой DDS 12.8 МГц, верхняя рабочая частота (около 130 МГц) больше чем число, представимое 32 (или 28) битами в (21 * 10) раз.
Это позволяет при 28 битах FTW получить точность на верхнем крае диапазона (130 МГц) менее одного герца (при тактовой dds 32 МГц).

EU1ME
24.03.2008, 16:56
Чтобы получить эти коэф-ты нужно 2^32 разделить на частоту опорного генератора (в Гц) и раскидать разряды результата по этим множителям. т.е. старший равен целой части результата, а потом поразрядно, для последнего надо смотреть округление.

Например: частота опорного генератора 400МГц, тогда
2^32/400000000=10,7374182 4
тогда множители
10-7-3-7-4-1-8-2-4

Здесь"повезло" и получилось без остатка

Genadi Zawidowski
24.03.2008, 17:02
Попробую... Наверное что-то может получиться хорошее, если вместо десятичной системы (и весов от 10) попробовать 16 использовать.

EU1ME
24.03.2008, 17:04
Ну да, можно ускорить прилично это дело

Genadi Zawidowski
24.03.2008, 17:28
Ну да, можно ускорить прилично это дело

В предложенном алгоритме семь умножений и семь делений 32-битных чисел на одно преобразование... вместо одного деления и одного умножений 64-х битного. Ускорит вряд ли, а улучшить переносимость возможно.

По UI есть мысли?

EU1ME
24.03.2008, 17:49
По UI - сам пока нечто похожее сделал, так как индикатор не позволяет выполнить полноценные меню и подменю. Для графического дисплея тоже думаю оставлять альтернативные функции для кнопок, а само их число (кнопок) сократить до 6. (Сейчас 9).

Genadi Zawidowski
24.03.2008, 18:16
индикатор не позволяет выполнить полноценные меню и подменю.
Так я тоже с 1602 играюсь (к стати, AOR-овские приемники с 2002 работают. Например, 3030).

А список кнопок с функциями какой?
Переключаемые ГПД есть? Сколько кнопок на функцию выделено?
Или rit сделано?

EU1ME
24.03.2008, 18:35
Дисплей TIC8148...
Кнопки- осн / доп функция
RIT
XIT
USB-LSB-CW
ATT-PRE
ATU on-off / tune
Volume-Level + encoder (вжать ручку )
Filter-Proc + encoder (вжать ручку )
BandUp
BandDn

Пока так

Диапазоны реализованы как 9 любительских и 5 обзорных, для каждого бэнда хранится свой набор осн установок.

Genadi Zawidowski
24.03.2008, 18:44
А что делают RIT и XIT ?
Управление АРУ есть?

EU1ME
24.03.2008, 18:50
RIT/XIT пока не реализованы, придерживаюсь их функционала как у RU3GA - RK4FB в Синтезатор прямого синтеза для компактного QRP трансивера
Управление АРУ - нету, есть мысли только привязать к режиму SSB/CW

Sergey_gh
24.03.2008, 19:07
To Genadi Zawidowski

Не делите, не мучайте мегу :)

Попробуйте так.

unsigned long F; // частота в Гц
unsigned long FTW; // 32 бит приращение фазы для загрузки в регистр DDS

// Нужно вычислить например FTW = F * 2^32/400000000
// Преобразуем к виду
// F * 2^32/400000000 = ((F*2^4) * (2^60/400000000))/2^32
// (F*2^4) и (2^60/400000000) влазят в unsigned long !

unsigned long temp_1 = F << 4;
unsigned long temp_2 = 0xABCC7711; // (2^60/400000000) = 2882303761

// usigned int temp_1_lo = *((unsigned int*)(&temp_1)+0); // ?младший int long-а
// usigned int temp_1_hi = *((unsigned int*)(&temp_1)+1); // ?старший (не уверен, вот не знаю endian)
// usigned int temp_2_lo = ...

// Нужно перемножить temp_1 * temp_2 =
// = (2^16 * temp_1_hi + temp_1_lo) * (2^16 * temp_2_hi + temp_2_lo) =
// = 2^32 * temp_1_hi * temp_2_hi + 2^16 * temp_1_hi * temp_2_lo + 2^16 * temp_1_lo * temp_2_hi
// Последним слагаемым можно пренебречь.
// Дальше, думаю, понятно как. Лечь на asm должно хорошо. Просмотрите на всякий случай.

M0TLN
24.03.2008, 19:21
Дисплей TIC8148...


Зачем? 16x2, 20x2 или 20х4 со стандартным 4-бит или 8-бит протоколом и все

EU1ME
24.03.2008, 20:32
Зачем?
Другие не вмещаются 8O

Валерий
24.03.2008, 20:34
В теме я абсолютный "НУЛЬ". Но начато решение актуальной проблемы. Пожелание - конструктивно сделать максимально просто.
Вобщем успехов! И желательно не в диалоге, а побольше подключиться к этому специалистам.
73!73!73!

RU3GA
25.03.2008, 10:36
Ну да, можно ускорить прилично это дело

В предложенном алгоритме семь умножений и семь делений 32-битных чисел на одно преобразование... вместо одного деления и одного умножений 64-х битного. Ускорит вряд ли, а улучшить переносимость возможно.



Геннадий, для вычисления управляющего слова DDS использую
функцию без всяких умножений и делений , и которая по идее совместима с любым контроллером. Очень быстрая и маленькая , прекрасно ложится на асм при компилляции.
Попробуйте --- может понравится :)



unsigned long f_op ;

unsigned long freq_set (unsigned long freq)
{
unsigned char i;
unsigned long result;
result = 0;
i = 32;
do
{
result <<= 1;
freq <<= 1;
if (freq >= f_op)
{
freq -= f_op;
result |= 1;
}
}
while(--i);

return result;
}


Удачи!
RU3GA

M0TLN
25.03.2008, 11:53
Зачем?
Другие не вмещаются 8O

тогда может стоит сделать вывод на LCD подключаемым через MACRO команды, а библиотеку общую?

типа #pragma define LCD16x2

В общем случае надо реализовать функции init, reset, clear, goto, writeChar(a), writeChar(a, x, y), writeLine(s)

а в теле функции пусть через проверку определенных констант выбирается функция конкретно под каждый тип дисплея

А для малых размеров посоветую OLED дисплеи - сам стоял перед проблемой, было мало места, только такой и полез, но, зараза,
все в графике. Зато в цвете и красиво.

или от мобилей Nokia с обменом по последовательному каналу

Genadi Zawidowski
25.03.2008, 12:23
В общем случае надо реализовать функции init, reset, clear, goto, writeChar(a), writeChar(a, x, y), writeLine(s)

Примерно так и будет.

А вот с организацией независимости от платы, которой управляю, сокрее всего будет несколько файлов с разными именами, в которых будут нестатические функции из набора:

void board_init(unsigned char ddsmult);
void prog_pulse_ioreset(v oid);
void prog_pulse_ioupdate( void);
void prog_select_init(voi d);
void prog_vfo(long freq);


void prog_dds1_ftw(const phase_t * value, unsigned char freqpow);
void prog_dds2_ftw(const phase_t * value, unsigned char freqpow);
//void prog_pll1_r(const phase_t * value);
void prog_pll1_n(const phase_t * value);


void board_set_att(unsign ed char v);
void board_set_agc(unsign ed char off, unsigned char code);

void board_set_detector(u nsigned char v);
void board_set_filter(uns igned char v);


void board_bandf_initiali ze();
void board_bandf_setfreq( unsigned long freq);

В проект несколько файлов включаются с разными именами - например
board_ru3ga_v0.c
board_rk4fb_v0.c
board_ua1arn_v0.c

И каждый файл обрамить #ifdef ЧТО-ТО, которое определяется в product.h.

Общий алгоритм расчета ftw и делителей для всех микросхем находится в syntcalcs.c

Sergey_gh
25.03.2008, 12:59
для вычисления управляющего слова DDS использую
функцию без всяких умножений и делений , и которая по идее совместима с любым контроллером.

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

To Genadi Zawidowski

Геннадий, с какой частотой крутится Ваш главный цикл в main() {for( ;; ){...}} ? Почему не используете таймерное прерывание для выстраивания времянки в программе?

Genadi Zawidowski
25.03.2008, 13:56
для вычисления управляющего слова DDS использую
функцию без всяких умножений и делений , и которая по идее совместима с любым контроллером.

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

To Genadi Zawidowski

Геннадий, с какой частотой крутится Ваш главный цикл в main() {for( ;; ){...}} ? Почему не используете таймерное прерывание для выстраивания времянки в программе?

еще раз - у меня преобразование в ftw не только для программирования dds используется, потому требуется хранение чисел с разрядностью ддс + 11 бит как минимум (а то и больше).
Сейчас такой оптимизацией пока заниматься не буду, тем более что переносимую библиотеку арифметики с числами любой разрядности я уже написал (и там как раз "делением в столбик" с порязрядными сдвигами я уже сыт по горло) - и работает это в разы медленнее, чем built-in арифметические функции компилятора. Я мерял. Имеет смысл только, если в компиляторе нет поддержки 64-х бит (или 64-х не хватит - для СВЧ синтезаторов с одногерцовым шагом. Там нужно 96 бит).

С частотой основного цикла... не знаю, что-то около от 10 до 50 циклов в секунду.
Не использую таймерное прерывание - пока ещё не успел изучить, как проинициализировать таймер. А очень хотелось бы использовать.
Не смог разобраться, как получить периодические прерывания(например, 0.1 секунды) при 8 МГц такте. Если подскажете, как это для атмеги 128 (и 32-й) сделать (проинициализировать )? Некоторые таймеры делят выход других таймеров... а мне бы просто процессорный клок до 100 герц поделить... Если на одном таймере не получится (а похоже, что нет - 16 бит!) - то значит 8 МГц / 65536.

А наличие такого прерывания естественно повысит качетво работы клавиатуры и позволит сделать "интеллектуальный валкодер".

Sergey_gh
25.03.2008, 16:31
С частотой основного цикла... не знаю, что-то около от 10 до 50 циклов в секунду.

??? Судя по константам в kbd_scan() значительно выше.



Не смог разобраться, как получить периодические прерывания(например, 0.1 секунды) при 8 МГц такте.

Обычно делаю так. Далее все IMHO.

Если правильно помню, в меге 16 битный таймер может делать почти что угодно. Настройте его на выдачу прерываний на каждый 8000 такт. Получится прерывание с частотой 1 КГц. Далее, в обработчике прерывания, разведите его на 8 фаз. Т.е. в первый заход выполняется фаза 1 во второй фаза 2 ... в 9 заход снова фаза 1. Частота выполнения каждой фазы будет 125 Гц. В первой фазе ваполняйте сканирование клавиатуры, во второй валкодер, в третей обновление индикатора, в четвертой флаги времянки, timeout-ы выхода из меню и т.д. Только следите чтобы фазы были короткими меньше 8000 тактов. Если фаза nолучается длиннее следующую сделайте короткую или не используйте. Можно разбить длинное действие на 2 фазы. Обмен с основным потоком через флаги. Очень удобно запрещать/разрешать выполнение фаз (например запретить фазу обновления LCD до его инициализации). С таким прерыванием не пропустите импульсы валкодера да частоты 8*10^6/N, где N время выполнения самой длиной фазы. Если этого мало можно програмно сделать вложенные прерывания (разрешить от валкодера) в длинных фазах или просто пулить пару раз запрос на прерывание от валкодера и обрабатывать. Таким образом получается примитивная многопоточность программы.

Genadi Zawidowski
25.03.2008, 17:02
Многозадачку сделаю, как только выяснится что задержки срабатываний станут чересчур большими.
В первом сообщении обновил проект - разбил большой файл управления платой на более-менее независимые куски, подготовил к наполнению первый из специфических файлов - board_rd3ay.c - пока только назначение битиков регистров в програмной модели выписал. Если кто свежим взглядом сопоставит со схемой - заранее мерси.
Алгоритм пересчета частоты гетеродина в dds и делитель за VFO пока пустышка.

Sergey_gh
25.03.2008, 17:52
Многозадачку сделаю, как только выяснится что задержки срабатываний станут чересчур большими.

Ну, это может случиться быстрее, чем Вам кажется.

Желания будут расти, особенно если Ваша универсальная программа превзойдет оригиналы. Появится многоуровневое меню, захочется прогрессивный автоповтор на кнопки, "живой" s-meter с АЦП, второй энкодер, сканирование, связь с компьютером и т.д. И если с самого начала не продумать структуру, то потом придется много переписывать. Очень быстро Ваш главный цикл разрастется и станет неуправляемым.

M0TLN
25.03.2008, 19:48
А наличие такого прерывания естественно повысит качетво работы клавиатуры и позволит сделать "интеллектуальный валкодер".

добавлю и свою идею в копилку по валкодеру.

Надо реализовать через меню (дабы хранить флаг типа надо/не надо) чтобы при быстром вращении шаг увеличивался бы с 10Гц (к примеру) до 100Гц или даже 1кГц.

Замедляем вращение - повышаем точность...

в К2 есть отдельная кнопка для изменения шага, в TS570 и FT857 два валкодера (шаг/плавно), а тут можно сразу совместить все это

EU1ME
25.03.2008, 20:53
"Интеллектуальный" валкодер реализуется элементарно если, как было описано выше, есть четкое временное кадрирование. У меня, например, оптический валкодер висит на внутренних компараторах. Соответственно в обработчиках прерываний от них определяется направление и в общую знаковую переменную вписывается количество "тиков" со знаком. В теле же программы 40 раз в секунду эта переменная проверяется и, при необходимости, выполняются действия. После чего переменная обнуляется (сразу после копирования во временную переменную). + Такого подхода в том, что ни один "тик" не потеряется даже если вращать валкодер с бешеной скоростью. А "интеллект" - просто смотрим сколько "тиков" набежало за 1/40 секунды и принимаем решение о изменении шага.

M0TLN
25.03.2008, 21:22
"Интеллектуальный" валкодер реализуется элементарно .....

А что по этому поводу думает ....... сам автор темы?

Genadi Zawidowski
25.03.2008, 23:53
А "интеллект" - просто смотрим сколько "тиков" набежало за 1/40 секунды и принимаем решение о изменении шага.
Почти так, только кое-какие действия пришлось для избежания рывыков предпринять...
timer_getrotatespeed вызывается со знаковым числом - количеством шагов с валкодера и размером шага (например, для SSB - 50 герц).
Возвращается откорректированный шаг.
Всё это просится к объединению с получением числа от валкодера одновременно со значением "скорости" - если решение о скорости не может быть принято, просто пока копим импульсы, возвращая 0.
Использовать или нет accelerate mode, решает вызвавшая процедура.



#define TICKCOUNT_MAX 255
#define TICKCOUNT_DIV 6
static volatile uint8_t tickcount;
static volatile uint8_t tickdiv;
static uint16_t stepcount;


uint32_t timer_getrotatespeed (
int16_t pulses, // signed (may benegative) value of encoder pulses
uint32_t dstep // размер шага в герцах
)
{
static const uint8_t velotable [] =
{
1,
1,
1,
2,
2,
5,
5,
10,
10,
75,
200,
};

/* получить состояние счетчика прерываний */
div_t d;
uint8_t ticks;
cli();
ticks = tickcount;
tickcount = 0;
sei();

if (ticks == 0) // слишком быстро крутим, еще не прошел ни один инкремент
{
stepcount += pulses;
return 0; // бывает не повезло - для исключения рывков
// вернуть 0 до выяснения скорости.
}
d = div(pulses + stepcount, ticks);
stepcount = d.rem; /* будем использовать в следующий раз */
if (d.quot < 0)
d.quot = - d.quot;
if (d.quot < (sizeof velotable / sizeof velotable [0]))
return dstep * velotable [d.quot];
return 100000UL;
}

// Timer 0 overflow interrupt service routine
// 7.813 kHz / 256 = approx 30 Hz
ISR(TIMER0_OVF_vect)
{
if (++ tickdiv >= TICKCOUNT_DIV)
{
tickdiv = 0;
if (tickcount != TICKCOUNT_MAX)
++ tickcount;
}
}

void timer_initialize(voi d)
{
stepcount = 0;
tickcount = TICKCOUNT_MAX;
tickdiv = 0;

...
}

конструктор
26.03.2008, 00:36
Уважаемый Геннадий!

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

Сразу Вам вопрос на засыпку - Вы не пробовали разобраться, как работают импортные аппараты в режиме обзора каналов?
Насколько я знаю, это очень важный момент, и как раз в части контроллера.

Например, когда идет сканирование по каналам надо обеспечить отсутствие щелчков в тракте, переходных процессов синтезатора, разрывов сигнала при коммутации преселектора.

Я, знаю, что в крутых НРД сигнал на выходе в режиме сканирования не рвется ВООБЩЕ! Т.Е. тракт не запирается в моменты перестройки, а плавно регулируется усиление и даже полоса ПЧ (автомат).

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

Возможно этот режимдля Вас и не актуален - но, в дорогой импортной технике он реализован. Это важно при работе с компьютером.

Что Вы думаете об этой функции?

Genadi Zawidowski
26.03.2008, 01:27
Сразу Вам вопрос на засыпку - Вы не пробовали разобраться, как работают импортные аппараты в режиме обзора каналов?

Не пробовал.


Например, когда идет сканирование по каналам надо обеспечить отсутствие щелчков в тракте, переходных процессов синтезатора, разрывов сигнала при коммутации преселектора.

Разве контроллер может исправить щелчки синтезатора?


Возможно этот режимдля Вас и не актуален - но, в дорогой импортной технике он реализован. Это важно при работе с компьютером.

В чём важность при работе с компютером?


Что Вы думаете об этой функции?

Действительно, режим сканировния для меня не актуален и я даже не планировал им заниматься.

И к началу...


Нет ли у Вас желания, совместно разработать требования к контроллеру приемника?

К функциональности программы, как я понял? Честно говоря, не очень. Замечания и алгоритмы работы приму с радостью и интересом.

Genadi Zawidowski
26.03.2008, 01:35
После совмещения стало так:





#define TICKCOUNT_MAX 255
#define TICKCOUNT_DIV 6
static volatile uint8_t tickcount;
static volatile uint8_t tickdiv;



// Timer 0 overflow interrupt service routine
// 7.813 kHz / 256 = approx 30 Hz
ISR(TIMER0_OVF_vect)
{
if (++ tickdiv >= TICKCOUNT_DIV)
{
tickdiv = 0;
if (tickcount != TICKCOUNT_MAX)
++ tickcount;
}
}

#define ROTATE_LORES_DIV 4
#define ROTATE_LORES_DIV2 2

/* обработчики прерывания от валкодера */

/* накопитель прерываний от валкодера - знаковое число */
static uint16_t stepcount;
static volatile int16_t rotate;
// int0 input = pd2
// int1 input = pd3
ISR(INT0_vect)
{
rotate -= 1;
}

ISR(INT1_vect)
{
rotate += 1;
}
void encoder_clear(void)
{
cli();
rotate = 0;
stepcount = 0;
tickcount = TICKCOUNT_MAX;
sei();
}


/* получение накопленного значенийя прерываний от валкодера.
накопитель сбрасывается */
uint16_t
getRotateHiRes(
uint32_t * jumpsize, /* ускоренный шаг в герцах */
uint32_t granulation)/* шаг в герцах */
{
static const uint8_t velotable [] =
{
1, 1, 1, 1, 2, 2, 5, 5, 12, 12, 50, 250,
};

div_t d;
uint8_t ticks;
uint16_t nrotate;
cli();
if (tickcount != 0)
{
ticks = tickcount;
tickcount = 0;
nrotate = rotate;
rotate = 0;
}
else
{
ticks = 1;
nrotate = 0;
}
sei();

d = div(nrotate + stepcount, ticks);
stepcount += d.rem; /* остаток пригодится в следующий раз */

if (d.quot < 0)
d.quot = - d.quot;
if (d.quot < (sizeof velotable / sizeof velotable [0]))
* jumpsize = granulation * velotable [d.quot];
else
* jumpsize = 25000UL;


return nrotate;
}

Sergey_gh
26.03.2008, 18:30
После совмещения стало так

А если так ?




// Timer 0 overflow interrupt service routine
// 7.813 kHz / 256 = approx 30 Hz
ISR(TIMER0_OVF_vect)
{
int_sync = true;

if(rotate != 0)
{
if(abs(rotate)<8) nrotate = rotate; // малая скорость
else nrotate = (abs(rotate)*rotate) << 3; // квадратичная зависимость например

rotate = 0;
valcod_move = true;
}
}
// -----------------------------------------------------------
main()
{

...

for(;;)
{
while(!int_sync); // теперь главный цикл с частотой 8*10^6/1024/256 Гц
int_sync = false;

...

... getRotateHiRes( ...

...

}
}

// -----------------------------------------------------------

uint16_t getRotateHiRes();
{
if(valcod_move) {valcod_move = false; return nrotate; } // даже прерывания можно не запрещать
else return 0;
}

Genadi Zawidowski
26.03.2008, 18:54
int_sync = true;

if(rotate != 0)
{
if(abs(rotate)<8) nrotate += rotate; // малая скорость
else nrotate += (abs(rotate)*rotate) << 3; // квадратичная зависимость например

rotate = 0;
valcod_move = true;

Тогда уж так... (как я выделил - не видно - не присвоение к nrotate, а увеличение). Сложно менять зависимость от скорости. Испоравленную версию на первой странице я выложил, пока с валодером всё понятно (и первые подводные камни вылезли - я про рывки, если использовать неусредненные значения скорости.
На основании небольшого опыта кручения - скорее всего останется две скорости (одиночная и удвоенная) и ОЧЕНЬ большой шаг для скоростей выше определенного предела. С квадратичной зависимостью какой-то неуправляемый аппарат получается. Один из критериев - работа с закрытыми глазами. При квадратичной зависимости - не получается, всй время за за диапазон вылетаю.

Sergey_gh
26.03.2008, 19:10
Тогда уж так... (как я выделил - не видно - не присвоение к nrotate, а увеличение).

Да нет, я предполагаю гарантированный забор nrotate в главном цикле с частотой 30 Гц. И вообще я больше о структуре программы.


С квадратичной зависимостью какой-то неуправляемый аппарат получается.

Тут Вам виднее.

RU3GA
26.03.2008, 21:34
И вообще я больше о структуре программы.


Я вообще тоже об этом :)
Геннадий , IMHO , Вы выстроили такую негибкую структуру , коия противоречит первоначальному названию ветки
Ветка о чем? --- об универсальной программе вроде...
А Вы выстраиваете специфические конструкции , коие потом будут никому не нужны...
Тут два вопроса --- если прикалываетесь сами --- прикалывайтесь дальше --- Вам никто не мешает :)
Если хотите послушать других --- не понятно чего Вам надо ( все равно Вы не слушаете никого :) ) --- толи в алгоритме вопрос , толи в коде ...
Если Вам для программы надо построить управляющее слово для DDS из 65 разрядов --- это Ваши проблемы , только не путайте людей...
Частоту определяет слово из 32 бит (мы берем нормальные DDS, а не извращениия с 48 битными словами и потреблением тока до 1000 ма )
Остальное --- это не частота --- это управляющие биты! Их можно определить (да и должно) --- второй переменной ...
Далее --- я давал подпрограмму для определения частоты DDS .
Если Вы мне покажете подпрограмму работающую быстрее --- я не только сниму шляпу перед Вами , я еще заткнусь навечно и уйду из этого форума ... Тока у Вас это не выйдет ! :) Поскольку моя подпрограмма --- работает на уровне асма адекватно ...
А ваш компиллятор --- тоже к асму привязан :)
И откровенное вранье с ваше стороны , что ваш код быстрее в "разы" , чем мой :) --- не "парьте" людей несведущих:)
PS Тема для меня очень интересная , только я совсем (!) не могу понять автора --- у автора полная "непонятка" не только в алгоритмах программы, но и в алгоритме работы устройства в целом :)
А на таком уровне работать сложно :)
PPS Я так тоже делал года два назад --- когда все уже сам придумал , но хотел послушать мелкие замечания :)
В принципе --- это неплохой ход :), тем более , что Вы планируете все выкладывать "в открытую" :) весь код --- это гораздо более интересней , чем было у меня --- я всегда выкладывал только прошивку :) ...

Геннадий , удачи , Вам !
RU3GA

Sergey_gh
26.03.2008, 22:38
Далее --- я давал подпрограмму для определения частоты DDS .
Если Вы мне покажете подпрограмму работающую быстрее --- я не только сниму шляпу перед Вами

Хотя и не ко мне обращаетесь, но вызов принимаю :) Пишем на asm-е меги, Вы свой алгоритм (со второй страницы), я свой (приводил в конце 1-ой страницы) :)

M0TLN
26.03.2008, 22:59
....IMHO , Вы выстроили такую негибкую структуру , коия противоречит первоначальному названию ветки
Ветка о чем? --- об универсальной программе вроде...
А Вы выстраиваете специфические конструкции , коие потом будут никому не нужны...

Тут как раз все с точностью наоборот.
Из кода на C каждый выберет себе то, что ему нужно установкой управляющих флагов.

Компилятор выберет только то, что нужно.

Это во-первых.

Во-вторых, такая структура кода позволяет просто и изящно добавить код под конкреные нужды. Мне, на пример, нужно управлять 4-я каналами DDS и фазой каждого канала - только глупо ожидать, что кто-то напишем мне все, что надо :)

А вот взять готовые блоки и добавить новый модуль по правилам - очень даже можно.

Потом, если мне не изменяет память, Геннадий собирается все сделать сам и выложить для всеобщего обозрения. Поменяйте его код на свой и возрадуйтесь. Получится быстрее на 10-20 тактов - здорово.

Давайте не ссориться, а предлагать конструктивные идеи.
Всем удачи... :пиво:

Genadi Zawidowski
27.03.2008, 00:56
Частоту определяет слово из 32 бит (мы берем нормальные DDS, а не извращениия с 48 битными словами и потреблением тока до 1000 ма )

Не пугайте! Это могут читать дети! На досуге прочитайте мою ветку про синтезаторы - и узнаете, как я добился того, что это извращеие по имени AD9852 потребляет у меня всего 40 милиампер. И не только за счет того, что отключены ненужеые в синтезаторе функции.


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

прогон на симуляторе avrstudio годится за проверку? Только независимо от результата - не надо уходить и снимать шляпы. Это злосчастное умножение-деление не единственное, что определяет лаги при работе с транссивером. Там и кроме этого много арифметики другой. И прав sergeimo - экономия в двадцать тактов не стоит понятности программы.


PS Тема для меня очень интересная , только я совсем (!) не могу понять автора --- у автора полная "непонятка" не только в алгоритмах программы,

У меня сильная непонятка с режимами расстройки и множественных vfo. Если поделитесь алгоритмом управления кнопками - и согласитесь ответить на несколько вопросов уточняющих - очень поможете. С пониманием алогритмов работы "в целом" проблем нет.


А Вы выстраиваете специфические конструкции , коие потом будут никому не нужны...

А поточнее указать место ненужных никому конструкций можно? По крайней мере, у меня в приемнике работает именно эта программа (и у всех, у кого работают мои синтезаторы).

Укажу один любимый мною кусочек - алогритм совмещения разбиения на любительские диапазоны и сохранения возможности крутить за ними (и запоминание последней частоты и режима работы) - если скажете, как это совмеситить с расстройкой - будет шедевр!


Тут два вопроса --- если прикалываетесь сами --- прикалывайтесь дальше --- Вам никто не мешает
Если хотите послушать других --- не понятно чего Вам надо ( все равно Вы не слушаете никого ) --- толи в алгоритме вопрос , толи в коде ...

Что надо - написано выше. Общие соображения понятны, "дъявол скрываетя в деталях". Можете улучшить мой алгоритм акселерации валкодера? Или описать русским языком алгоритм?

Прикалываюсь? Немного да, Вы правы. Последний мой прикол - синтезатор - по крайней мене одного человека сподвиг на то, чтобы сделать синтезатор лучше моего (я имею в виду man.at.work). Еще создаю наполнение этому сайту и трафик с реекламой от google.


Во-вторых, такая структура кода позволяет просто и изящно добавить код под конкреные нужды. Мне, на пример, нужно управлять 4-я каналами DDS и фазой каждого канала - только глупо ожидать, что кто-то напишем мне все, что надо

А вот взять готовые блоки и добавить новый модуль по правилам - очень даже можно.

Честно говоря, спасибо. Рад что оценили простоту структуры.
некоторая неэффективность и раздутость - как раз плата за простоту модификации под любую архитектуру синтезатора. Но это общий закон программирования - или одно, или другое.

Sergey_gh
27.03.2008, 01:42
Поскольку моя подпрограмма --- работает на уровне асма адекватно ...

Действительно, Ваш алгоритм пожалуй лучший для PIC16 (т.к. нет умножителей). Извините, немного дизнул Ваш файл. Ниже подпрограмма расчета для DDS из него. И компилятор отлично справился. Это picc htsoft?



sub_CODE_3EB: ; CODE XREF: sub_CODE_426+35p
clrf STATUS
clrf byte_DATA_69
clrf byte_DATA_6A
clrf byte_DATA_6B
clrf byte_DATA_6C
movlw 20 ; ' '
movwf byte_DATA_68

loc_CODE_3F2: ; CODE XREF: sub_CODE_3EB+31j
clrc
rlf byte_DATA_69, f
rlf byte_DATA_6A, f
rlf byte_DATA_6B, f
rlf byte_DATA_6C, f
clrc
rlf byte_DATA_64, f
rlf byte_DATA_65, f
rlf byte_DATA_66, f
rlf byte_DATA_67, f
movfw byte_DATA_3E
subwf byte_DATA_67, w
bnz loc_CODE_40A
movfw byte_DATA_3D
subwf byte_DATA_66, w
bnz loc_CODE_40A
movfw byte_DATA_3C
subwf byte_DATA_65, w
bnz loc_CODE_40A
movfw byte_DATA_3B
subwf byte_DATA_64, w

loc_CODE_40A: ; CODE XREF: sub_CODE_3EB+13j
; sub_CODE_3EB+17j ...
bnc loc_CODE_41B
movfw byte_DATA_3B
subwf byte_DATA_64, f
movfw byte_DATA_3C
skpc
incfsz byte_DATA_3C, w
subwf byte_DATA_65, f
movfw byte_DATA_3D
skpc
incfsz byte_DATA_3D, w
subwf byte_DATA_66, f
movfw byte_DATA_3E
skpc
incf byte_DATA_3E, w
subwf byte_DATA_67, f
bsf byte_DATA_69, 0

loc_CODE_41B: ; CODE XREF: sub_CODE_3EB+1Fj
decfsz byte_DATA_68, f
b loc_CODE_3F2
; End of function sub_CODE_3EB

; ──────────────────── ──────────────────── ──────────────────── ───────────────
movfw byte_DATA_69
movwf byte_DATA_70
movfw byte_DATA_6A
movwf byte_DATA_71
movfw byte_DATA_6B
movwf byte_DATA_72
movfw byte_DATA_6C
movwf byte_DATA_73
return

Serg_PRQ
27.03.2008, 09:28
Честно говоря, спасибо. Рад что оценили простоту структуры.
некоторая неэффективность и раздутость - как раз плата за простоту модификации под любую архитектуру синтезатора. Но это общий закон программирования - или одно, или другое.

Геннадий приветствую!
Ветка интересная думаю всем кто применяет МК, и даже не авры как таковые. Я правда еще не ковыряю сишные коды как ты, но сама идея пакета программ будет полезна многим, пусть не сегодня. Ничего нет плохого в альтернативном ПО на другие готовые конструкции синтезаторов (вот у меня лежит собранный от RD3AY, с удовольствием попробую твой софт на нем). Пусть я сам не смогу перекомпилить софт, но думаю тут есть кто сможет. Одним словом идея нужная.

To RU3GA
Александр! Да не кипятись ты, ей богу :)
Действительно не надо никуда никому "уходить". Каждый здесь на форуме что-то может сказать полезное друг другу, в разных направлениях опытнее (может быть даже талантливее, hi!). Для себя личным не вижу ничего зазорного поучиться у другого чему-то, зачем изобретать велосипед?....

Ну это так к слову. Давайте не ссориться и не обсчитывать с укоризной такты в своих кодах. Не в космос платы ведь полетят, а так глядишь и настроение у многих будет способствоать конструктивному творчеству, а не противостоянию :D

Explorer
28.03.2008, 15:27
Всем добрый день!
Собрал на макетной плате контроллер, правда что было ATMega16 пришлось немного урезать программу чтобы влезла. Запаяно 7 кнопок, ОЗУ пока нет, и надо еще валкодер какой нибуть сварганить. Пробовал энкодер(трещетка) с какойто автомагнитолы но там только импульсы или право/лево. Попробую с мышки слепить. А так программа работает не все еще кнопки задействованы, отjбражение на индикаторе 1602 есть. Утомляет только, показалось долго жать кнопку надо в дополнительном режиме, где то 3сек.Но это не существенно, можно укоротить. Главное, программа реальна и можно изучать. Эта тема для меня в лидерах!

Владимир

Genadi Zawidowski
28.03.2008, 16:30
С валкодерами от магнитолы (на 24 позиции) я возился... ничего толком не получилось - правда, я не пробовал перед логикой формирования импульсов прерывания для процессора ставить RC-цепочку с триггером Шмидта. Да, у тех валкодеров что я видел - "земля" была на крайнем выводе.

В первом сообщении обновил исходники - добавился еще один вид компиляции - DCRX. При этом DDS (или синтезатор) настраивается сразу на частоту приема.

Добавлен API для управления приемом верхней/нижней боковой полосы.

/* не нулевой аргумент - прием нижней боковой в приемнике прямого преобразования */
void board_set_lsb(unsign ed char v) /* требуется для приемников прямого преобразования */
{

}
Раскомментарить строчки
//#define BOARD_SUPPORT_DCRX 1 // приемник прямого преобразования с DDS как гетеродин
//#define MODEL_DCRX 1 // преимник прямого преобразования с DDS как первый гетеродин

Соответственно заткнув имеющиеся. Код при этом "ужимается" и начинает влезать в ATMEGA16.
Ещё есть define в файле tc1.h - там обратить внимание на

#define WITHMENU 1 /* функциональность меню может быть отключена - если настраивать нечего */

Комментарим - и ещё немного памяти кода и данных освобождается.

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

Насчет медленной реакции на кнопки - а Вы не забыли прошить фюзы для работы процессора на 8 МГц? Дополнительные данные в файле f1_at32.bat

Sergey_gh
28.03.2008, 20:25
Утомляет только, показалось долго жать кнопку надо в дополнительном режиме, где то 3сек.

Это время, из-за неудачной структуры программы, зависит от:

1. Версии компилятора и включенного режима оптимизации (на размер кода или на скорость).
2. Вращают или нет валкодер при этом.
3. При малейшем изменении в главном цикле, надо снова пересчитать(подобрат ь) константы в keyboard.c

Genadi Zawidowski
28.03.2008, 22:56
1. Версии компилятора и включенного режима оптимизации (на размер кода или на скорость).
Вот тут я надеялся на то, что человек плезет в настройки проекта (ну или в makefile) отдавая отчет себе в том, что делает.
В текущей версии - думаю, вреда пока нет. А опрос клавиатуры по таймеру готовится.
У кого есть готовые заготовки опроса клавиатуры с замыкаемыми резисторами через каналы АЦП?


2. Вращают или нет валкодер при этом.
Сейчас даже может не реагировать на кнопки при вращении.

Sergey_gh
29.03.2008, 00:06
У кого есть готовые заготовки опроса клавиатуры с замыкаемыми резисторами через каналы АЦП?

Вы про это?

www.toshiba-components.com/products/microcontrollers/documents/ApplicationNotes/AppNote24_KeyMatrix_ LED1.pdf

RU3GA
29.03.2008, 03:38
To RU3GA
Александр! Да не кипятись ты, ей богу :)
Действительно не надо никуда никому "уходить". Каждый здесь на форуме что-то может сказать полезное друг другу, в разных направлениях опытнее (может быть даже талантливее, hi!). Для себя личным не вижу ничего зазорного поучиться у другого чему-то, зачем изобретать велосипед?....

Сергей, привет :) Давно не общались :)

Моё "кипячение" :) --- видно вызвано неправильным пониманием темы ветки. Сам я виноват :)
Я думал , что тут мы соберем "в охапку" некие решения на Си и будет все это хорошим подспорьем для всех... Есть куча реализаций базовых (самых главных и самых КРИТИЧНЫХ! ) функций синтеза , ну типа , вычисление управляющего слова частоты , преобразование двоично-десятичного кода в двоичный и наоборот , реализации многоуровнего меню и т.д.
Я в свое время потратил кучу времени на моделирование и оценку разных алгоритмов, применительно именно к синтезу --- просто хотелось, что бы все идущие дальше не теряли времени на такую ерунду :)
Но тут тема иная . Поэтому не хочу влезать своим "свиным рылом" и мешать Геннадию :)

PS Позволю себе только несколько реплик :)
Мне кажется --- надо сначала в программе определить приоритеты!
Приоритеты в программе синтеза :
1. Валкодер --- самый главный! :)
2. САТ --- управление от компа (USART --- без него никак)
3. Экран (индикатор).
4. Клавиатура на передней панели.
Первые два пункта --- на прерываниях обязательно --- причем на разных. Причем --- у валкода --- сажать на прерывания оба канала , поскольку сделать (купить) валкод хотя бы с 250 пульсами на оборот --- проблема (либо дорого , либо не технологично). А так можно применить программное "учетверение" --- у меня работает валкод из мышки на 60 пульсов --- не вижу разницы между моим и простыми "вражьими" трансиверами :) Вернее вижу --- у меня лучше :)
Вторые два пункта --- в порядке очередности , но если "не работают первые два"
Клавиатуру сажать на прерывание --- абсолютно ненужная вещь. Опрос ее по таймеру --- тем более! :)
Если хватает таймеров в контроллере --- можно запускать один из них и применять его к клавиатуре для многофункциональност и клавиш . Если не хватает --- можно обойтись и делать все иначе .
Клавиатура на АЦП --- это вообще, на мой взгляд, полная ерунда --- очень критичная и капризная вещь --- еще только этого не хватало --- в процессорно-цифровой конструкции подбирать резисторы ! :) Сам запаришься , а уж юзеры --- тем более! :) Еще 3-4 кнопки ---допустимо ... Но 10-15 , а то и 20 --- маразм :) Уж если портов не хватает (а их всегда мало :) ) , лучше вместо 15 резисторов поставить один чип маленький дополнительный и программу соответственно сделать --- но хоть подбирать ничего не придется ...
"Интеллектуальный " валкод --- только на таймере с прерыванием (делал и без этого --- тоже работает , но получается гораздо хуже)

Это конечно грубо все описано, тезисно , но суть думаю понятна :)

Удачи!
RU3GA

Genadi Zawidowski
29.03.2008, 10:03
Приветстввую!
За тезисы спасибо. Есть уточнение -


Клавиатура на АЦП --- это вообще, на мой взгляд, полная ерунда --- очень критичная и капризная вещь --- еще только этого не хватало --- в процессорно-цифровой конструкции подбирать резисторы ! Сам запаришься , а уж юзеры --- тем более!

Предполагаю сделать на один вход АЦП до 3-4 клавиш. Количество кнопок стремительно хочест стать больше восьми, а сканирование не хочу применять по соображениям помехоподавления.


"Интеллектуальный " валкод --- только на таймере с прерыванием (делал и без этого --- тоже работает , но получается гораздо хуже)

Сделано.


Я думал , что тут мы соберем "в охапку" некие решения на Си и будет все это хорошим подспорьем для всех...

Есть очень большая необходимость в решениях на С:
1) Реализация RIT/XIT, VFO A/B
2) CAT
3)
реализации многоуровнего меню и т.д.

В каком виде можете поучавствовать?

RU3GA
29.03.2008, 12:31
Геннадий , приветствую!
Я , честно говоря , пока не совсем понимаю в чем участвовать.
У Вас пока нет концепта --- "а что мы должны в итоге получить"...
А без этого --- все теряет смысл. Вам уже тут кто-то писал и я с этим господином полностью согласен --- если не продумаете сначала все в целом --- потом будете постоянно переписывать всю программу , поскольку выяснится , что "не учли ерунду, надо бы подделать пару слов , а весь код "заточен" абсолютно иначе , а еще хуже --- вся схема ! " :)

Вот простой пример --- кнопки на АЦП --- путь тупиковый изначально, при таком решениии --- наращивание кнопок по ходу работы --- станет огромной проблемой --- я же не думаю , что Вы хотите в самом конечном (!) итоге получить синтез с 8-ю кнопками? :)

Далее --- "Реализация RIT/XIT, VFO A/B" --- я не совсем понимаю в чем проблема --- это простая смена переменных в функции определения частоты при двух событиях (либо нажатие кнопки , либо переход на передачу)

Далее --- САТ --- тут проблема только в одном --- нет универсального кода инициализации для USART любого контроллера --- они все специфичны. Сам же алгоритм --- по-моему весьма "прозрачен" --- принимаем символы в буфер по прерыванию (тут даже валкод может подождать --- он тоже по прерыванию , но одновременно вертеть валкод и менять частоту на компе никто не будет ), когда выдалось время , свободное от валкода (он приоритетен) --- рассматриваем команды и выполняем их. У меня есть простенькие рабочие реализации (не полные системы команд --- полные содержат до 200 команд --- кому это надо? :) ) для двух протоколов --- ICOM и KENWOOD --- особого преимущества нет ни у одного --- что-то у одного удобнее , что-то у другого. В своем синтезе остановился на протоколе ICOM , хотя для версии SDR и совместной работы с PowerSDR --- подставил модуль протокола KENWOOD (ограничение "комповой" программы :) )

Вобщем , я не совсем понимаю суть проекта. Обмен опытом , дружеские подсказки в "узких местах" для коллег --- это да.
А вот что бы некое готовое устройство совместно --- пока не вижу его, к сожалению.

Это конечно мое личное мнение, как-то не хочется "становиться на пути прогресса" :)

Удачи всем в проектировании!
RU3GA

Genadi Zawidowski
29.03.2008, 13:12
Вопрос про код инициализацию уарт надуман.
У вас есть код реализации ICOM или KENWOOD, написанный на C, которым Вы можете поделиться? Я встрою это в имеющийся скелет - или Вы возмите файл с первой страници да и встройте. Как совместная работа над проектом для всеобщего пользования устроит?


Далее --- "Реализация RIT/XIT, VFO A/B" --- я не совсем понимаю в чем проблема --- это простая смена переменных в функции определения частоты при двух событиях (либо нажатие кнопки , либо переход на передачу)

Это НЕ простая смена частоты. Если Вы так сделали - я так не хочу.
Интересуют чертовы детали - если смена частоты - как менять режим? Если при смене частоты приема - перешли в другой диапазон - настройки этого диапазона менять в соответствии с теми настройками, что вызваны включением RIT или сохранять только при переключении диапазона? При включенном RIT переключаем диапазон. Наши действия по сохранению, или переход запрещен?



Вот простой пример --- кнопки на АЦП --- путь тупиковый изначально, при таком решениии --- наращивание кнопок по ходу работы --- станет огромной проблемой --- я же не думаю , что Вы хотите в самом конечном (!) итоге получить синтез с 8-ю кнопками?

нет, я хочу получить синтез с 16-ю кнопками (максимум), используя четыре канала АЦП - по четыре кнопки на каждом проводе.

Концепция - есть часть программы, работающая с оператором (и с компютером по протоколу CAT), вызывающая набор функций -
1) установка частоты
2) установка типа фильтра
3) установка типа детектора
4) установка режима АРУ
5) ...

Эти функции специфичны к каждой системе. Их я, как демонстрацию, для своего синтезатора включил в выложенный проект. Так же, как и скелетный файл для синтезатора прямого синтеза в ТПП.

Есть функции специфчные для контроллера -
1) получение инкремента от валкодера
2) получение кнопки с клавиатуры
3) выдача информации на текстовый дисплей
4) получить байт с ком-порта (грубо говоря, уточнения про прерывания не сильно меняют структуру)
5) выдать байт на ком-порт
СПИСОК НЕ ПОЛНЫЙ.

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

И неинтерфейсная часть, определяющай поведение аппарата - это реакция на кнопки диапазонов, расстройки, режим передачи и вхождение в меню (например, войдя в меню - можно ли перейти на передачу или переключить аттенюатор?), CAT.

основные проблемы как раз перечисленны в последнем абзаце.

RU3GA
29.03.2008, 13:52
Вопрос про код инициализацию уарт надуман.
У вас есть код реализации ICOM или KENWOOD, написанный на C, которым Вы можете поделиться? Я встрою это в имеющийся скелет - или Вы возмите файл с первой страници да и встройте. Как совместная работа над проектом для всеобщего пользования устроит?


Геннадий , при всем уважении к Вам --- я не вижу проекта --- такая ерунда как Вы задумали --- работает у меня уже полтора года :)



Это НЕ простая смена частоты. Если Вы так сделали - я так не хочу.
Интересуют чертовы детали - если смена частоты - как менять режим? Если при смене частоты приема - перешли в другой диапазон - настройки этого диапазона менять в соответствии с теми настройками, что вызваны включением RIT или сохранять только при переключении диапазона? При включенном RIT переключаем диапазон. Наши действия по сохранению, или переход запрещен?


Ясен перец , что не так все просто --- нужны некие понятия о том как работать и как работают другие аппараты :) Вы руководитель проекта или нет? Если Вы таких вещей не понимаете в плане самых общих алгоритмов --- я Вам ничем помочь не смогу , простите , Геннадий :)


Вот простой пример --- кнопки на АЦП --- путь тупиковый изначально, при таком решениии --- наращивание кнопок по ходу работы --- станет огромной проблемой --- я же не думаю , что Вы хотите в самом конечном (!) итоге получить синтез с 8-ю кнопками?



нет, я хочу получить синтез с 16-ю кнопками (максимум), используя четыре канала АЦП - по четыре кнопки на каждом проводе.


Мда --- а если вдруг потребуется 17-ая кнопка --- весь Ваш проект полетит нафиг получается ????? :)



Концепция - есть часть программы, работающая с оператором (и с компютером по протоколу CAT), вызывающая набор функций -
1) установка частоты
2) установка типа фильтра
3) установка типа детектора
4) установка режима АРУ
5) ...


Это вся концепция? .... мда....

Не , Геннадий , я пока не готов даже морально поддерживать то , что Вы тут проектом называете ... :)

Удачи всем!
RU3GA

Genadi Zawidowski
29.03.2008, 14:03
Мда --- а если вдруг потребуется 17-ая кнопка --- весь Ваш проект полетит нафиг получается ?????
Как Вы понимаете, это не серьезное ограничение. Но каков был вопрос ко мне - таков и ответ Вам.


Геннадий , при всем уважении к Вам --- я не вижу проекта --- такая ерунда как Вы задумали --- работает у меня уже полтора года

Видите ли... Она работает у Вас, на Вашем железе. Мне надо, чтобы ерунда работала и на моём железе (как минимум), а при приложении напильника - и на любом другом, хоть на единственной DDS в Пилигриме или на дистанционном управлении катрана (или, как сейчас - на Р-143). Имея исходники другим не придется проходить весь подготовительный путь.


Ясен перец , что не так все просто --- нужны некие понятия о том как работать и как работают другие аппараты Вы руководитель проекта или нет? Если Вы таких вещей не понимаете в плане самых общих алгоритмов --- я Вам ничем помочь не смогу , простите , Геннадий

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


Это вся концепция? .... мда....

Не , Геннадий , я пока не готов морально поддерживать то , что Вы тут проектом называете ...

Ясно, куда уж мне до Вас... Так, мелочь по подъездам... Значит, реализацией CAT в такой проект вы не осчастливите... Интересно, есть более глобальная концепция от radist08 - а в ней бы Вы решились учавствовать?

RU3GA
29.03.2008, 14:07
Видите ли... Она работает у Вас, на Вашем железе. Мне надо, чтобы ерунда работала и на моём железе

О! Вот это понятно ! :)
Теперь понятен весь Ваш замысел над "проектом"! :)

PS Возможно, что Геннадий делает чего-то новое , но я , в силу своей ограниченности, не могу этого понять ... Тут есть еще куча посетителей --- они оценят ...

Удачи всем ! :)
RU3GA

Genadi Zawidowski
29.03.2008, 14:11
Видите ли... Она работает у Вас, на Вашем железе. Мне надо, чтобы ерунда работала и на моём железе

О! Вот это понятно ! :)
Теперь понятен весь Ваш замысел над "проектом"! :)
Удачи Вам !
RU3GA

Удивителен издевательский тон - при том, что исходники предусматривают настройку на любой синтезатор ("выборочное цитирование" - советую добавить в цитату еще пару моих строчек).


Она работает у Вас, на Вашем железе. Мне надо, чтобы ерунда работала и на моём железе (как минимум), а при приложении напильника - и на любом другом, хоть на единственной DDS в Пилигриме или на дистанционном управлении катрана (или, как сейчас - на Р-143). Имея исходники другим не придется проходить весь подготовительный путь.

RU3GA
29.03.2008, 14:23
Ну да --- цитировал специально не все --- но фразы Ваши :) Лана , каюсь --- был не прав --- "неполное цитирование , хуже вранья" :)


Геннадий , Вы , пожалуйста , не обижайтесь ! Выходные , отдых , надо иногда и расслабиться :) Я вот три баночки Туборг взял --- рекомендую --- неплохое пиво :)

Не обижайтесь!
Я Вас , Геннадий , очень уважаю , и здесь , на форуме , Вы один из немногих , коему я могу сказать фразу Кипллинга --- "мы с тобой одной крови" :)

А все что я написал --- это то что я думал по ходу беседы ...
Возможно иногда высказывался не совсем корректно , извините, пожалуйста!

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

А коллегам нужно конкретное устройство!
А вот тут --- уже начнутся проблемы! Вам расказать какие? :)
Это будет монолог на два часа беседы , а если за клавиатурой --- на полмесяца ... :)


PS Планирую на лето приезд в Питер семьей к другу --- возможно будет лично пообщаться с Вами хотя бы пару часов в какой-нибудь кафешке?

Удачи!
RU3GA

Genadi Zawidowski
29.03.2008, 14:54
PS Планирую на лето приезд в Питер семьей к другу --- возможно будет лично пообщаться?
Даже без предварительного согласования... телефоны и адреса доступны. Хотя бы накануне позвоните.


В Ваших исходниках могут разобраться только те люди , коим Ваши исходники нафиг не нужны!!! Неужели Вы этого не понимаете???
Понимаю. Но с этим я ничего не смогу сделать.


Ладно , Геннадий , Вы , пожалуйста , не обижайтесь ! Выходные , отдых , надо иногда и расслабиться Я вот три баночки Туборг взял --- рекомендую --- неплохое пиво
Свой первый ответ (в смысле - ответ на Первое Ваше письмо в этой теме) Вам я не стал отправоять - разумно оценив, настоящий чешский Козел сделал меня неадекватным и чересчур язвительным.

:D

RU3GA
29.03.2008, 15:04
Свой первый ответ (в смысле - ответ на Первое Ваше письмо в этой теме) Вам я не стал отправоять - разумно оценив, настоящий чешский Козел сделал меня неадекватным и чересчур язвительным.
:D

Ну мы друг друга поняли :)

PS Кстати, на Пиллигриме --- мой синтез работает (специально сделаны биты управления ) --- просто я там с Олегом немного поссорился --- он меня попросил сделать простую вещь , а у меня на столе в то время был совсем другой макет --- отнюдь не синетеза (ну плохой я человек --- гадкий! --- я виноват :) ) --- вобщем послал я его ... блин ... --- и он, посмотрев на меня в таком ракурсе , не стал рекомендовать мой синтез для его трансивера :) ---- а так работает все легко!!! Просто юзеры Пиллигрима даже не знают об этом :)
Ну это проблемы юзеров и Олега --- я сделал все что мог --- я сделал такие биты конфигурации , коих я пока не видел ни в одном синтезе --- можно настроить на ТПП легко :)
На Р-143 --- не знаю --- что-то подзабыл такие станции :)
Но это без ФАПЧ :) Чисто DDS...
Однако у меня заняло всего одно программное слово , что бы подключить мой синтез к ГУН UT2FW :) --- на это есть тоже просто один байт конфигурации при прошивке. Ни разу не получал ответа от юзера , коий это сделал , но возможность этого есть :)

Конечно, при прямом использовании (без ФАПЧ) --- 9851 --- не сильно хороший чип :) AD9954 --- будет ловчее , ну а кто его сможет распаять?
Мне поправить прогу с 9851 на 9954 --- полдня --- а толку ? :) Кто сделает? :) Я сам не могу никак сподобиться :) --- хотя их куча в наличии , фирма АналогДевайс к счастью рассылает все это добро бесплатно :) Друзьям (без знания английского ) раздаю 98-ую серию(ну куда мне 10 штук DDS 9851 ? ) --- 99 серию пока держу --- мож технологию найду паять все это дело на кухне :)

PPS Лана, видно наговорил лишнего --- ну вы же знаете о трех банках Туборга ---- мож простите ? :)

Удачи!!!
RU3GA

Serg
29.03.2008, 16:52
По поводу шагов перестройки для разных видов, я думаю, можно сделать несколько (2-3) определенных значений для SSB, для CW и для AM/FM. Будет достаточно. Для этого напрашивается отдельная кнопка, которая по кругу будет гонять эти 2-3 значения, для каждого из режимов отдельно.

По АРУ - наверно хороша идея с запоминанием ее скорости для каждого вида (ssb,cw,am). Хотя для SSB нужно учесть возможность изменения (можно не оперативного), допустим, оператор собрался в тесте поработать, взял настроил быстрое АРУ, а завтра с картофелеводами на круглом столе общаться будет - уже нужно медленную АРУ включить ;)


По расстройке - шикарно все-таки иметь отдельную ручку для нее! И обязательно двойное отображение частоты, например, основная частота 14.200.000 , радом горит RIT и значение отстройки (например , -0.100 , а так же и отстроенная частота, т.е. в данном случае - 14.199.900...


Ну, и конечно же САТ система, иначе зачем весть этот микропроцессорный огород?! Я склоняюсь к протоколу Kenwood, вроде бы там более универсально всё сделано для разных моделей аппаратов, значит будет меньше проблем с различными (готовыми) пользовательскими программами.

RU3GA
29.03.2008, 16:56
Я склоняюсь к протоколу Kenwood, вроде бы там более универсально всё сделано для разных моделей аппаратов, значит будет меньше проблем с различными (готовыми) пользовательскими программами.

Ну вот яркий пример!!! :)
А почему Вы склоняетесь к KENWOOD-у ?
Что Вас привело именно к этому протоколу?

Serg
29.03.2008, 17:24
Что Вас привело именно к этому протоколу?

Ответьте на прямой вопрос

Отвечаю:

1.Первый трансивер с САТ, который мне удалось поуправлять был этой марки.

2.Протокол простой как пень, дал в СОМ порт даже из простого терминала , хоть клавиатурой команду FA; трансивер высветил FA0014200000 прямо в понятном виде, все остальные команды так же понятны и являются просто текстовыми сокращениями операций. Дал FA0014150000; - он установил в VFO-A частоту 14.150.000 ...

3.У Aйкома и Есу всё в HEX-e и для каждой модели свое управляющее слово. Вы наверно замечали, что в программах для Kenwood-а - просто Kenwood выбираешь и все, а у остальных все модели нужно перечислить...

4. Даже Yeasu в топовом FT-2000 уже отсказалась от своего протокола, а взяла Kenwood-подобный, кстати совсем недавно заметил это, ковыряя ini-файлы в OmniRig-e :D

RU3GA
30.03.2008, 02:04
Ответ понятен , спасибо большое!

Ваш подход --- типичный --- юзерский , в хорошем смысле этого слова! :) Собственно для этого мы здесь и беседуем :)
Мне вот Илья RW3FY тоже говорит про то , что "я на кенвуде смогу на простом гипертерминале послать команду и получить ответ" :)
Я всегда спрашиваю --- а нафига?
Вот Вы дали команду KENWOOD-у --- FA0014150000; и он установил частоту --- прикольно конечно , а дальше чего? Нафига Вы давали такую команду? :) Прикалывались просто? :)

Программеру пофиг в чем давать команду --- хоть в асски , хоть хексе --- ему по-барабану :)

У протокола ICOM есть залеты крутые , которые не позволяют его гибко использовать и я их знаю --- но! --- "никто не совершенен"! :) кенвуд тоже не лучше --- у него залетов не меньше :) взять хотя бы его команду IF; , коия уже давно навевает ужас на всех программеров контроллеров и при этом очень радует программеров компов :)

Теперь пару слов о том , почему в кенвуде --- просто выбираешь , а в айкоме --- надо модель назвать :)
Ну неужели Вы думаете , что в айкоме сидят такие *****ы-программеры и у них протоколы управления IC-775 отличаются от протокола управления IC-756 ? :)
Просто айком решил в каждой команде писать путь назначения ... И при этом в качестве пути назначения --- выбрана модель трансивера :)
Типа Вы сможете управлять с одного компа --- 10-ю разными трансиверами ICOM --- кенвуд отдыхает --- в его протоколе такого не предусмотрено :) Т.е. в каждой команде айкома есть код модели трансивера :)
Что бы было понятно абсолютно всем --- пример --- в кенвуде Вы дали команду FA; --- и трансивер тут же отвечает на какой частоте он настроен --- и заведомо подразумевается , что он один единственный! ...
В айкоме --- нужно "спросить именно" тот трансивер , коий Вам хочется ! Т.е заведомо подразумевается , что трансиверов у Вас несколько :)
То что вопрос именно к модели , а не к номеру --- это залет программеров , на мой взгляд , но сама идея --- неплохая :)
Надо это или нет --- покажет время :) А пока все зависит от программера лога --- внесет он твой трансивер ICOM в список --- будешь работать , не внесет --- будешь "отдыхать"... Но протокол при этом отнюдь не меняется !!! :)
Просто программеру лень внести номер твоего трансивера в базу программы , а без этого --- работать не будет!!! --- комп дает команду твоему трансиверу , он команду видит , но понимает , что команда не к нему относится --- и игнорирует ее :)
О как ! :)

PS Блин , хоть открывай курсы ликбеза по базовым вещам в радиолюбительском синтезаторе :)

Удачи!
Ru3GA

Sergey_gh
30.03.2008, 02:39
To RU3GA

Александр, подскажите пожалуйста. Использую asm вставки в PICC так:


unsigned char my_var;

int MyFunc(int x)
{

#asm
movlw 10
movwf _my_var

...
#endasm

...
}


Или подсматриваю передачу параметров по прототипу ф-ции и пишу полностью ее на asm-е. Но в любом случае приходится объявлять my_var глобально. Как сделать, чтобы переменные получились автоматическими и попали под flow control компилятора?

Пробовал как-то так(подсмотрел в выходном asm-е). Вроде работает, но не нарваться бы на что-нибудь. Или я чего-то не понимаю?



int MyFunc(int x)
{
unsigned char my_var;

#asm
movlw 10
movwf MyFunc$my_var

...
#endasm

...
}

RU3GA
30.03.2008, 03:07
С утра погляжу повнимательнее ...
Но вообще --- асмовые вставки в контроллерах --- это плохой тон :)
Не нужны они вообще!!! Тем более с глобальными переменными... Последствия --- малопредсказуемы ...

Sergey_gh
30.03.2008, 03:57
Но вообще --- асмовые вставки в контроллерах --- это плохой тон

Да, согласен. Но у меня ядро PIC16 самодельное, в плис. Вроде отладил. Сейчас хочу подружить его с PICC.
Система команд совместима, но добавил "вкусности". Умножитель, автосохранение и восстановление W и STATUS в прерываниях, доступ к W как к регистру и еще кое-чего (навеяно контроллерами HOLTEK и SCENIX). PICC про это не знает :)

Еще вопрос. Раскладка памяти у меня немного отличается(только RAM, SFR на месте). Достаточно ли отредактировать похожий контроллер под себя в файле picc.ini и соотв. хидер?

Serg
30.03.2008, 11:43
Мне вот Илья RW3FY тоже говорит про то , что "я на кенвуде смогу на простом гипертерминале послать команду и получить ответ"

Я всегда спрашиваю --- а нафига?

А чтобы было!


Программеру пофиг в чем давать команду --- хоть в асски , хоть хексе --- ему по-барабану

Профессионалу - пофигу, а навичку или любителю типа меня - нет.

Нужно было как-то сделать программы чтобы трансиверы по насписанию меняли частоты, для кенвуда я сделал ее за 5 минут прочитав описание в манулае, а с Есу так и не понял как его делать,
там указано в обычных цифрах побитых по 2 штуки через проблел, а потом указано, что нужно перевести в хекс! А как, всю фразу сразу или тоже по две циферки, потом заливать подряд или тоже с пробелами? Вот вам и вопрос, как "продвинутому программеру" !!!


Типа Вы сможете управлять с одного компа --- 10-ю разными трансиверами ICOM

Я прекрасно знаю это. Только сколько практических реализаций этого?


То что вопрос именно к модели , а не к номеру --- это залет программеров , на мой взгляд , но сама идея --- неплохая

Надо это или нет --- покажет время

За все время я видел только один случай - программа SATPC32, в которой можно подцепить например IC706 и IС7000 на одну CI-V шину и работать через спутники с учетом доплера. А ведь айком уже более 15 лет выпускает радио с САТ и почти никто не воспользовался этим, значит время уже показало :)

А по поводу залетов - программисты люди ленивые часто, зачем мы будем ждать когда он поправит, давайте изначально заложим более универсальный протокол, imho.



Вас не раздражает куча смайликов? Я пока читал пост глаза малось приустали...

Илья RW3FY
31.03.2008, 00:04
Мне вот Илья RW3FY тоже говорит про то , что "я на кенвуде смогу на простом гипертерминале послать команду и получить ответ" :)
Я всегда спрашиваю --- а нафига?
Вот Вы дали команду KENWOOD-у --- FA0014150000; и он установил частоту --- прикольно конечно , а дальше чего? Нафига Вы давали такую команду? :) Прикалывались просто? :)

Ты просто забыл, чего я тебе на этот вопрос отвечал :) . А отвечал я тебе, что засылая подобным образом команды, проще всего протестировать исправность железа. Вне зависимости от того, что за комп в наличии, какие логи на нём установлены и какие глюки у этих логов. Воткнул шнурок, позасылал команды и убедился:
а) всё фурючит --- радуемся жизни и можем двигаться дальше, то бишь заниматься инсталляцией лога и борьбой с его собственными глюками.
б) всё не фурючит --- ищем дефекты железа (неправильно запаянные шнурки, обрывы проводов, битые порты)
в) фурючит, но нестабильно --- боремся с глюками порта

Кстати, у своего кенвуда я протокол обмена (который, надо сказать, нигде в документации не приводится, а на mods.dk появился благодаря мне :) ), когда он был мне нужен, определял методом тыка --- просто подавал команды с клавиатуры и смотрел на его ответную реакцию. А началось оно с того, что ни один имевшийся в наличии лог не хотел по-нормальному с ним по САТ работать.

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

RU3GA
31.03.2008, 12:48
Профессионалу - пофигу, а навичку или любителю типа меня - нет.
Нужно было как-то сделать программы чтобы трансиверы по насписанию меняли частоты, для кенвуда я сделал ее за 5 минут прочитав описание в манулае, а с Есу так и не понял как его делать,
там указано в обычных цифрах побитых по 2 штуки через проблел, а потом указано, что нужно перевести в хекс! А как, всю фразу сразу или тоже по две циферки, потом заливать подряд или тоже с пробелами? Вот вам и вопрос, как "продвинутому программеру" !!!



Я протокол Есу не знаю, так что тут ничего сказать не могу --- как-то исторически сложилось , что разбирался только с Айкомом и Кенвудом. Особого явного преимущества какого либо из них --- не увидел --- и там и там есть свои плюсы и минусы. Разве что Айкомовский лучше и подробнее описан.
По большому счету , раз Геннадий пытается делать универсальную программу --- скорее всего логичней иметь модули для обоих протоколов, а то и для всех трех.

RU3GA
31.03.2008, 12:57
Мне вот Илья RW3FY тоже говорит про то , что "я на кенвуде смогу на простом гипертерминале послать команду и получить ответ" :)
Я всегда спрашиваю --- а нафига?
Вот Вы дали команду KENWOOD-у --- FA0014150000; и он установил частоту --- прикольно конечно , а дальше чего? Нафига Вы давали такую команду? :) Прикалывались просто? :)

Ты просто забыл, чего я тебе на этот вопрос отвечал :) . А отвечал я тебе, что засылая подобным образом команды, проще всего протестировать исправность железа. Вне зависимости от того, что за комп в наличии, какие логи на нём установлены и какие глюки у этих логов. Воткнул шнурок, позасылал команды и убедился:
а) всё фурючит --- радуемся жизни и можем двигаться дальше, то бишь заниматься инсталляцией лога и борьбой с его собственными глюками.
б) всё не фурючит --- ищем дефекты железа (неправильно запаянные шнурки, обрывы проводов, битые порты)
в) фурючит, но нестабильно --- боремся с глюками порта




Да я помню , что ты мне отвечал , только не убедительно это для окончательного выбора какого-либо протокола.
Даже на стадии отладки программы не обойтись без какой-нибудь спец-программулины для слежения за СОМ-портом --- иначе все равно как слепой будешь сидеть. А почти все эти программулины умеют отсылать как в хэексе , так и в аски-кодах --- так что вобщем без разницы.

Илья RW3FY
31.03.2008, 14:11
Да я помню , что ты мне отвечал , только не убедительно это для окончательного выбора какого-либо протокола.
Даже на стадии отладки программы не обойтись без какой-нибудь спец-программулины для слежения за СОМ-портом --- иначе все равно как слепой будешь сидеть. А почти все эти программулины умеют отсылать как в хэексе , так и в аски-кодах --- так что вобщем без разницы.
Дык тут ещё и то, что в асках ничего в голове пересчитывать не нужно --- всё необходимое уже есть не клаве. Всё в буквенно-десятичном виде, и не нужно себе голову морочить никаким шестнадцатиричным исчислением, да и прог дополнительных не нужно. Т.е. то, что и нужно чиста юзеру --- воткнул в абсолютно любой комп и особо не заморачивая себе мОзги понажимал кнопочки, всё проверил. А то, о чём ты говоришь со слежением за портом и отладкой --- это уж извини, но не юзерская задача, а дело разработчиков --- т.е. и сама задача рангом выше, и требования к квалификации исполнителя. Понятно, что тебе как программеру сугубо пофигу, аски или сразу хексы. А вот мне как тупому юзеру --- не пофигу, т.к. на чисто юзерском уровне с асками удобнее :) .

RU3GA
31.03.2008, 14:18
Дык тут ещё и то, что в асках ничего в голове пересчитывать не нужно --- всё необходимое уже есть не клаве. Всё в буквенно-десятичном виде, и не нужно себе голову морочить никаким шестнадцатиричным исчислением, да и прог дополнительных не нужно. Т.е. то, что и нужно чиста юзеру --- воткнул в абсолютно любой комп и особо не заморачивая себе мОзги понажимал кнопочки, всё проверил. А то, о чём ты говоришь со слежением за портом и отладкой --- это уж извини, но не юзерская задача, а дело разработчиков --- т.е. и сама задача рангом выше, и требования к квалификации исполнителя. Понятно, что тебе как программеру сугубо пофигу, аски или сразу хексы. А вот мне как тупому юзеру --- не пофигу, т.к. на чисто юзерском уровне с асками удобнее :) .

Дык я как-то вообще считал , что юзер и знать-то не должен какая там кодировка --- шнурок воткнул , программу-лог запустил и проверяй работает или нет ... А зачем ему давать отдельные спец команды контроллеру в любой кодировке --- мне как-то не совсем ясно --- как ты сам выражаешься "не юзерская это задача" :)
Если же писать программу-лог --- то там по-моему без разницы в чем посылать символы.
С точки зрения программы для контроллера --- проще в хексе --- не надо тратить ресурсы на преобразование в аски и обратно. С точки зрения программы-лога --- наверное действительно проще аски --- те компоненты для работы с сом-портами, которые я пробовал --- "заточены" именно под аски. Но мне кажется это отнюдь не повод выбирать именно этот протокол, поскольку на компе гораздо удобнее делать все преобразования --- по крайней мере о быстродействии особо задумываться не надо.
Вобщем --- выбор за разработчиком :)

Илья RW3FY
31.03.2008, 14:33
Дык я как-то вообще считал , что юзер и знать-то не должен какая там кодировка --- шнурок воткнул , программу-лог запустил и проверяй работает или нет ... А зачем ему давать отдельные спец команды контроллеру в любой кодировке --- мне как-то не совсем ясно.
Если же писать программу-лог --- то там по-моему без разницы в чем посылать символы.

Ну я ж тебе пример приводил --- нужно это бывает для проверки. Ну приехал я вот, допустим, на некую контест-позицию, а там ещё и конь не валялся :)--- и начинаю железяки стыковать. Как пойдёт нужный мне лог на чужом компе и с неизвестно каким железом при первом включении? Да хрен его знает, у каждого лога свои тонкости, и валить все геморрои в одну кучу --- хрен разгребёшь --- чтоб всё сделать быстро и как надо, нужно одну сложную задачу всегда дробитьна мелкие и простые составные части. Вот первым делом и надо не заморачиваясь на особенностях работы лога с конкретным железом проверить по максимуму и шнурки, и железяки. Самое простое --- позасылать команды с гипертерминала и посмотреть, как они проходят. А если, например, нестабильная работа САТ? Помнишь, я тебе глюк с подвисанием САТ описывал? Хрен бы я вообще отловил, в чём дело, если б не имел возможность с клавиатуры команды гонять. Набил, зарядил позасылать автоматом, но с регулируемыми интервалами --- так и выявил, что если не давать аппарату подумать, а слать команды слишком часто, САТ у того ТРХ-а виснет. И что есть проги, где этот момент прописан корректно (например, WL), а есть, где криво (TR, MM). А не будь возможности такие проверки делать --- так бы и не знал, в чём причина сбоев и подвисаний --- нигде в документации или хэлпах о подобных вещах вообще не говорится.

RU3GA
31.03.2008, 14:42
Ну я ж тебе пример приводил --- нужно это бывает для проверки. Ну приехал я вот, допустим, на некую контест-позицию, а там ещё и конь не валялся :)--- и начинаю железяки стыковать. Как пойдёт нужный мне лог на чужом компе и с неизвестно каким железом при первом включении? Да хрен его знает, у каждого лога свои тонкости, и валить все геморрои в одну кучу --- хрен разгребёшь --- чтоб всё сделать быстро и как надо, нужно одну сложную задачу всегда дробитьна мелкие и простые составные части. Вот первым делом и надо не заморачиваясь на особенностях работы лога с конкретным железом проверить по максимуму и шнурки, и железяки. Самое простое --- позасылать команды с гипертерминала и посмотреть, как они проходят. А если, например, нестабильная работа САТ? Помнишь, я тебе глюк с подвисанием САТ описывал? Хрен бы я вообще отловил, в чём дело, если б не имел возможность с клавиатуры команды гонять. Набил, зарядил позасылать автоматом, но с регулируемыми интервалами --- так и выявил, что если не давать аппарату подумать, а слать команды слишком часто, САТ у того ТРХ-а виснет. И что есть проги, где этот момент прописан корректно (например, WL), а есть, где криво (TR, MM). А не будь возможности такие проверки делать --- так бы и не знал, в чём причина сбоев и подвисаний --- нигде в документации или хэлпах о подобных вещах вообще не говорится.

Все равно ты меня не убедил , поскольку толку от того , что ты отловил глюк --- никакого. Отловить-то ты его отловил, но просто сменил лог на другой и все. А это можно было сделать и без всяких "отлавливаний".
С точки зрения быстродействия --- лучше на хэксе. А это , по-моему , уже более-менее конкретный довод, поскольку ситуации , которые ты описываешь --- редкие , а быстродействие САТ --- нужно будет каждый день.

Илья RW3FY
31.03.2008, 14:52
Все равно ты меня не убедил , поскольку толку от того , что ты отловил глюк --- никакого. Отловить-то ты его отловил, но просто сменил лог на другой и все. А это можно было сделать и без всяких "отлавливаний".
С точки зрения быстродействия --- лучше на хэксе. А это , по-моему , уже более-менее конкретный довод, поскольку ситуации , которые ты описываешь --- редкие , а быстродействие САТ --- нужно будет каждый день.
Быстродействие --- аргумент :) . Но я уверен, что уж кто-кто, а ты точно сумеешь хоть в хексах, хоть в асках обеспечить скорость 57600 :)--- а выше всё равно не нужно --- ни один лог выше не поддерживает :) , да и даже для полноценного дистанционного управления 19200 уже достаточно :) . А вообще --- у нас с тобой должен быть отработан вариант и с кенвудовским протоколом, и с айкомовским.

P.S. От серии АД985* не спеши избавляться :) --- в нашем проекте это будет основной тип ДДС, коий будет стоять аж в четырёх местах :) --- более навёрнутая ДДС-ка просто-напросто не нужна, важнее её паябельность в домашних условиях.

RU3GA
31.03.2008, 15:00
Быстродействие --- аргумент :) . Но я уверен, что уж кто-кто, а ты точно сумеешь хоть в хексах, хоть в асках обеспечить скорость 57600 :)--- а выше всё равно не нужно --- ни один лог выше не поддерживает :) , да и даже для полноценного дистанционного управления 19200 уже достаточно :) . А вообще --- у нас с тобой должен быть отработан вариант и с кенвудовским протоколом, и с айкомовским.


57600 --- это скорость передачи данных, тут можно обеспечить и в 10 раз больше , а я тебе говорю про скорость дальнейшей обработки команды.

Genadi Zawidowski
31.03.2008, 15:19
раз Геннадий пытается делать универсальную программу --- скорее всего логичней иметь модули для обоих протоколов, а то и для всех трех.

Для себя я сделал вывод, что если я сделаю поддержку протокола CAT "как у Кенвуда", то 90% имеющихся программ логов пойдёт без дополнительных пинков?

M0TLN
31.03.2008, 15:22
А вообще --- у нас с тобой должен быть отработан вариант и с кенвудовским протоколом, и с айкомовским.


.

RU3GA и RW3FY


А вот возьмите и выдайте 2 файла реализации протоколов Kenwood и
одного из ICOM - каждый будет компилировать как ему удобно.
Для ICOM можно даже предусмотреть задание типа модели для гибкости.

И будет вам огромные респект и уважуха...

Serg
31.03.2008, 17:43
По большому счету , раз Геннадий пытается делать универсальную программу --- скорее всего логичней иметь модули для обоих протоколов, а то и для всех трех.

Вот тут я абсолютно согласен!

M0TLN
31.03.2008, 19:08
По большому счету , раз Геннадий пытается делать универсальную программу --- скорее всего логичней иметь модули для обоих протоколов, а то и для всех трех.

Вот тут я абсолютно согласен!

Тогда надо подумать и про регулировку мощности с шагом 1W и управлением антенным тюнером, которых тоже совсем не один и всяк со своим протоколом. Кто возьмется? Или попросим автора?

RU3GA
31.03.2008, 21:00
А вообще --- у нас с тобой должен быть отработан вариант и с кенвудовским протоколом, и с айкомовским.


.

RU3GA и RW3FY


А вот возьмите и выдайте 2 файла реализации протоколов Kenwood и
одного из ICOM - каждый будет компилировать как ему удобно.
Для ICOM можно даже предусмотреть задание типа модели для гибкости.

И будет вам огромные респект и уважуха...

Вы явно опоздали с предложением :)
Это у нас давно работает --- уже полтора года как :)
А "респект" и "уважуха" --- это одно и тоже --- думайте , чего говорите :)
Файлы реализации --- достаточно специализированы и не подходят под конструкцию Геннадия --- поскольку делались абсолютно в другом проекте и абсолютно с другой парадигмой.

Просто завелась в очередной раз тема --- ну и вышел простой разговорчик типа спора. Может и бесполезный , а я думаю , что полезный --- вполне возможно, что Геннадий чего-то из темы не знал --- теперь знает. Геннадий --- мы с Ильей Вас сильно раздражаем своим разговором на наши общие с Вами темы?
Вроде даже оффтопика ни разу не было...

Удачи!
Ru3GA

RU3GA
31.03.2008, 21:19
раз Геннадий пытается делать универсальную программу --- скорее всего логичней иметь модули для обоих протоколов, а то и для всех трех.

Для себя я сделал вывод, что если я сделаю поддержку протокола CAT "как у Кенвуда", то 90% имеющихся программ логов пойдёт без дополнительных пинков?

Вывод не верный!
Если сделаете поддержку Айкома -- будет тоже самое, но не 90% , а 60% --- что в кенвуде , что в айкоме.
Когда в серьез возьметесь за протокол обмена с компом --- можно будет поговорить, я правда сам уже многое подзабыл , прошло больше года --- там тонкостей куча --- и все из-за того , что логи тоже отнюдь не совершенны, а протоколы плохо описаны (в основном кенвудовский --- айком описан очень тщательно и по полной программе)... И "воле не воле" --- надо под них подстраиваться, если хотите иметь нормальный синтез, взаимодействующий с компом...
Честно говоря, мне не удалось написать код САТ для синтеза , коий работал бы со всеми программами-логами, хотя я занимался всем этим месяцев шесть как минимум --- ну естественно как любитель , в свободное время.
С основными программами основные функции работают... Но со всеми и все функции --- не вышло ...
Ну я не показатель --- возможно кто-то напишет лучше... Только вот RW3FY рассказывал про залеты не на самопальном синтезе , а на вполне продающейся модели трансивера ...
А это уже говорит о том , что программеры логов --- тоже часто ошибаются ... И воротить синтез под программу --- не совсем верно! Нужно делать синтез под протокол.
Кенвудовский , как Илья совершенно верно заметил --- почти не описан --- жалкие три страницы в описанях трансиверов типа TS-870 --- не в счет.
Айкомовский ---- наоборот --- описан очень подробно и свободно выложен в инет.
Вот я только про Есовский пока ничего не знаю , к своему стыду ... Надо будет заняться на досуге ...

В завершение пару примеров разницы протоколов...
В кенвуде --- все команды имеют разное количество символов --- это очень неудобно для обработки --- сами поймете когда столкнетесь с реальным кодом
В Айкоме ---- все ровно и четко --- быстродействие можно наладить просто легко :)
За то в Айкоме --- лишние символы модели трансивера --- просто иногда утомляют --- иногда просто злость берет --- нафиг я передаю откровенно лишние знаки и занимаю время контроллера бесполезными символами? :)
В кенвуде --- команда IF; --- это такая куча ненужной инфо "в ответ" , но почти 50% программеров логов --- ее используют , причем , не просто её , а её сразу за командой по перестройке частоты! :) --- там целая куча знаков , а многие программеры логов эту команду используют для перестройки по шагам (10 Гц) :) --- только представьте какие тормоза будут у пульса перестройки , если на каждый пульс --- комп отправляет запрос на 10 параметров , а трансивер ему отвечает на все эти запросы (а ведь надо было всего лишь на 10 Гц вверх уйти) :)
При чем --- это единственная команда , по которой я могу понять на передаче трансивер или нет --- обалдеешь просто !
В айкоме все не так , но тоже не классно ...
За то в кенвуде есть вожможность программировать свои команды (программа N6TR) --- в айкоме многие команды просто невозможно запрограммировать , поскольку хекс код предполагает в некоторых комбинациях "русские" буквы при программировании , а этого естественно американская прога понять не может --- в итоге на айкомовском протоколе N6TR менее гибкая чем на кенвудовском ...

Лана , вобщем --- разработчик сам разберется , когда столкнется с конткретной ситуацией , что половина логов работают в САТ , а половина --- нет --- и сам примет решение ...
Вон RD3AY вообще не парится с САТ --- написал кое чего , что кое-как работает и все --- ему это не надо , а лезть в глубину и напрягаться над каждой прогой-логом --- нафига ? :)
За то его синтез повторили пол страны радиолюбителей и он действительно классный и легко повторяемый!
Мож иногда не надо лезть в глубь? :)

Удачи всем!
RU3GA

Sergey_gh
01.04.2008, 00:27
To RU3GA

Александр, не посмотрели по моим вопросам?

Продолжаю с интересом изучать Ваш файл. (а заодно PICC, интеллектуальный валкодер и Ваш стиль :) ). Шокирован неоптимальностью Вашего алгоритма BCD преобразования :) Вы заняли им более 300 слов памяти программ !!! Это 1/6 от того что есть в 16f628a ! Так не делают (через последовательное вычитание ..1000,100,10..), хотя это лучше чем деление с остатком как у Геннадия. Посмотрите, может пригодится. Вызов corr_w можно сделать "inline" для ускорения.



// Преобразование к десятичному представлению.

// входные данные b3..b0
// BCD результат t3..t0

#asm
clrf _t3
clrf _t2
clrf _t1
clrf _t0
movlw 0x20
movwf _i
goto start_2_bcd
loop:
movf _t0,w
call corr_w
movwf _t0
movf _t1,w
call corr_w
movwf _t1
movf _t2,w
call corr_w
movwf _t2
movf _t3,w
call corr_w
movwf _t3
start_2_bcd:
rlf _b0
rlf _b1
rlf _b2
rlf _b3
rlf _t0
rlf _t1
rlf _t2
rlf _t3
decfsz _i,f
goto loop
goto end_2bcd

// Десятичная коррекция
corr_w:
movwf _j
movlw 0x03
addwf _j,f
btfss _j,3
subwf _j,f
movlw 0x30
addwf _j,f
btfss _j,7
subwf _j,f
movf _j,w
return

end_2bcd:

#endasm



Поправил ошибку !

M0TLN
01.04.2008, 01:30
Это у нас давно работает --- уже полтора года как :)


Как мне кажет ся, имнно в эсто м все дело.
Да, работает, но - у Вас.

То есть - не здесь и не у каждого.

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



А "респект" и "уважуха" --- это одно и тоже --- думайте , чего говорите :)


неудачно процитировал Comedy Club - каюсь

M0TLN
01.04.2008, 01:45
[

Вывод не верный!
Если сделаете поддержку Айкома -- будет тоже самое, но не 90% , а 60% --- что в кенвуде , что в айкоме.
.......а протоколы плохо описаны (в основном кенвудовский --- айком описан очень тщательно и по полной программе)...
... Нужно делать синтез под протокол.
Кенвудовский , как Илья совершенно верно заметил --- почти не описан --- жалкие три страницы в описанях трансиверов типа TS-870 --- не в счет.

А что мешает взять более подробно описанный TS570?
http://mods.dk/downloadmanual.php?R efFil=TS-570D_S_G_Manual.zip&radio=

В далеком 98м сам писал управление под 440 для WA9L, команды почти не поменялись и даже 3х страниц хватило для полноценного управления и лога.

ну, кроме чтения S метра - это не получилось :oops:

Genadi Zawidowski
01.04.2008, 14:27
Файлы реализации --- достаточно специализированы и не подходят под конструкцию Геннадия --- поскольку делались абсолютно в другом проекте и абсолютно с другой парадигмой.

Да Вы не беспокойтесь, разберусь, и не в таком болоте плавали... 25 лет программистского стажа кое-какой опыт по разбирательству с чужими программами добавили.

RU3GA пугает сложнстями и парадигмами... в самом деле, мне-то лично лучше ручку у транссивера покрутить (тем более, что рядом с работающим ноутбуком или приём невозможен, сразу говорю - антенна на крыше, кабель с кольцами а ноут от батарей питается).

Genadi Zawidowski
01.04.2008, 14:58
[

Вывод не верный!
Если сделаете поддержку Айкома -- будет тоже самое, но не 90% , а 60% --- что в кенвуде , что в айкоме.
.......а протоколы плохо описаны (в основном кенвудовский --- айком описан очень тщательно и по полной программе)...
... Нужно делать синтез под протокол.
Кенвудовский , как Илья совершенно верно заметил --- почти не описан --- жалкие три страницы в описанях трансиверов типа TS-870 --- не в счет.

А что мешает взять более подробно описанный TS570?
http://mods.dk/downloadmanual.php?R efFil=TS-570D_S_G_Manual.zip&radio=

В далеком 98м сам писал управление под 440 для WA9L, команды почти не поменялись и даже 3х страниц хватило для полноценного управления и лога.

ну, кроме чтения S метра - это не получилось :oops:

Роскошное описание. С форматом всё понятно. Если там никаких подводных камней типа временной недопустимости некоторых команд в зависимости от режима - или временных ограничений чересчур жёстких вполне можно как описание протокола попробовать использовать.


Айкомовский ---- наоборот --- описан очень подробно и свободно выложен в инет.
Если будет время - не ткнёте меня носом в описание?

RU3GA
01.04.2008, 18:26
Шокирован неоптимальностью Вашего алгоритма BCD преобразования :) Вы заняли им более 300 слов памяти программ !!! Это 1/6 от того что есть в 16f628a ! Так не делают (через последовательное вычитание ..1000,100,10..), хотя это лучше чем деление с остатком как у Геннадия. Посмотрите, может пригодится. Вызов corr_w можно сделать "inline" для ускорения.


Хех --- никто не совершенен :)
Но три года назад ничего более быстродействующего у меня не вышло :)
Тот алгоритм , коий Вы привели --- я конечно потом нашел --- а самому придумать его по-моему просто невозможно ...
Кстати , не помню точно --- но, по-моему, он гораздо медленнее, хотя по размеру --- гораздо меньше. Но не уверен --- времени прошло немало --- забыл подробности.

В любом случае --- лезть в старую работающую программу --- уже смысла не было.

Если буду писать что-то новое --- конечно многое будет иначе.

Удачи!
RU3GA

RU3GA
01.04.2008, 18:31
Если будет время - не ткнёте меня носом в описание?

У меня сохранено в виде html-странички. Попробовал пойти на первоисточник --- почему-то не работает. Попробуйте поискать по поисковым словам "ICOM CI-V".
Если не найдете --- вышлю то что сам когда-то сохранял у себя на компе.

Удачи!
RU3GA

Genadi Zawidowski
01.04.2008, 19:27
Похоже, первоисточником был http://www.plicht.de/ekki/civ/index.html ? Там ничего не нашёл... прошу выложить.

vadim_d
01.04.2008, 20:19
Посмотрите, может пригодится. Вызов corr_w можно сделать "inline" для ускорения.
Сергей, собственно только так на PIC и делается. Кажется я брал за основу алгоритм из LC-метра VK3BHR (Phil Rice, у него на ассемблере), мое чудо тут http://sourceforge.net/projects/ant-anl/

Sergey_gh
01.04.2008, 20:27
Тот алгоритм , коий Вы привели --- я конечно потом нашел --- а самому придумать его по-моему просто невозможно ...

Если бы Вы писали под msc-51 на asm-е и задумались на кой нужна комманда DA A, то все сразу бы стало ясно :)

Sergey_gh
01.04.2008, 20:55
Сергей, собственно только так на PIC и делается. Кажется я брал за основу алгоритм из LC-метра VK3BHR (Phil Rice, у него на ассемблере), мое чудо тут http://sourceforge.net/projects/ant-anl/

Посмотрел, вижу void u24_bcd32(void). Только не доверяю компилятору. За ним тут следить надо. А то он насочиняет -- медленно получится.

vadim_d
01.04.2008, 21:23
Посмотрел, вижу void u24_bcd32(void). Только не доверяю компилятору. За ним тут следить надо. А то он насочиняет -- медленно получится.
Сергей, я пользовал бесплатную версию CC5X от B Knudsen Data http://www.bknd.com/cc5x/download.shtml , хотя сейчас попробовал бы опенсорсный SDCC http://sourceforge.net/projects/sdcc (в те годы он под PIC просто не работал). Естественно, в листинг надо глядеть, но CC5X меня ни разу не разочаровал.

RU3GA
01.04.2008, 22:17
Тот алгоритм , коий Вы привели --- я конечно потом нашел --- а самому придумать его по-моему просто невозможно ...

Если бы Вы писали под msc-51 на asm-е и задумались на кой нужна комманда DA A, то все сразу бы стало ясно :)

Вполне может быть ... :)
Но согласитесь --- алгоритм там отнюдь не явный !
Я там потом ковырялся в двоичной математике и т. д. и все равно ---- такой алгоритм САМОМУ придумать нельзя :)
Вы ж тоже его не сами придумали --- увидели и взяли на заметку!

Но только пока Вы не показали реально , что тот алгоритм работает быстрее , чем вычитание . А я хоть убейте --- не помню почему я его отмел в сторону... То ли не смог на Си его нормально воспроизвести , то ли он по быстродействию не устроил --- алгорит же совсем странный ... :)
Ну вот как отрезало --- не помню , хотя алгоритм очень известный , как потом выяснилось ...
По размеру меньше --- это ясно , а вот со скоростью --- я пока сомневаюсь!
Если уж занимаетесь HT PICC --- и "в теме" в данный момент (я сейчас не "в теме" --- явно отстал ) --- очень прошу! --- проверьте скорость исполнения.
Только не асмовую вставку , а код на Си по алгоритму коий Вы привели и противопоставьте ему алгоритм вычитания , коий у меня --- давайте посмотрим разницу во времени исполнения ...
Сергей --- мне действительно интересно это --- и я не собираюсь выяснять кто круче --- пусть я буду лохом --- мне по барабану--- мне важны реальные решения , которые потом можно будет классно применить...

73!
RU3GA

vadim_d
01.04.2008, 23:37
такой алгоритм САМОМУ придумать нельзя :)
Александр, такой алгоритм напрямую вытекает из рассмотрения побитного сдвига (умножения на 2) в BCD формате: пятерка должна дать десятку, то есть 10h=16, а даст всего 0Ah=10, разница в 6 после сдвига или 3 до сдвига, ее надо учитывать для всех тетрад, где 5 и более. Делается в системе команд PIC (весьма кривоватой) прибавлением 3 к тетраде и проверкой бита восьмерки - особого выбора нет. Собственно, самому придумать МОЖНО, но весь open source для того и существует, чтобы не изобретать велосипеды. Посему мой респект Геннадию :super:

Sergey_gh
02.04.2008, 00:59
Если уж занимаетесь HT PICC --- и "в теме" в данный момент (я сейчас не "в теме" --- явно отстал ) --- очень прошу! --- проверьте скорость исполнения.

Вкладываю два файла. Один с asm вставкой. Сделана честно, как написано в доке на компилятор. Выполняется за 1266 циклов. (1266*4 клоков кварца). Другой на чистом C. Выполняется за 1747 циклов и длиннее на 7 команд. Конечно, при написании постарался "угодить" компилятору.

Ваш алгоритм (из дизассемблера) выполняется примерно за (sum(N) + 16)*23 циклов, где sum(N) - сумма всех цифр в десятичном представлении. Т.е. время выполнения примерно от 370 до 2030 циклов.

Serg
02.04.2008, 19:11
А что мешает взять более подробно описанный TS570?

http://mods.dk/downloadmanual.php?R efFil=TS-570D_S_G_Manual.zip&radio=

Ну да, в мануале на TS-2000 тоже все прекрасно описано.

Но повторять все его функции, я думаю, не нужно. Что нам то надо? Чтобы лог знал какие VFO, частоты, вид. И наоборот чтобы мы могли эти же параметры установить в синтезатор, точнее, в данном случае в контроллер трансивера.

Не ручки же мощности и громкости крутить электронным способом :super: :lol:

RU3GA
04.04.2008, 00:39
Александр, такой алгоритм напрямую вытекает из рассмотрения побитного сдвига (умножения на 2) в BCD формате: пятерка должна дать десятку, то есть 10h=16, а даст всего 0Ah=10, разница в 6 после сдвига или 3 до сдвига, ее надо учитывать для всех тетрад, где 5 и более.


Да пробовал я этот алгоритм ... ну медледленнее он у меня получился... В 10 раз меньше по объему , но медленее по скорости ...
Но у меня три года назад был бзик по быстродействию , а по программному месту --- проблем не было :)
Покажите мне , что он быстрее работает чем вычитание :)
И покажите код на Си --- сразу воспользуюсь вашими заготовками ...

PS Я писал по этому алгоритму на HT PICC --- мож руки кривые --- все равно получилось медленней , чем вычитание ...

Удачи!
RU3GA

Sergey_gh
04.04.2008, 01:10
Покажите мне , что он быстрее работает чем вычитание
И покажите код на Си --- сразу воспользуюсь вашими заготовками ...

Вы что, пропустили мой предидущий пост или не верите. Так же по скорости примерно.

Еще улучшил. 1651 цикл на C вместе с вызовом и возвратом из функции. На asm меньше 1000 циклов, если интересно тоже выложу.



// Преобразование к десятичному представлению.
unsigned long hex2bcd(unsigned long hex)
{
union
{
unsigned long result;
unsigned char res[4];
} r;
unsigned char i = 32;

r.result = 0;
do
{
r.res[0] += 0x33;
r.res[1] += 0x33;
r.res[2] += 0x33;
r.res[3] += 0x33;

if(!(r.res[0]&0x08)) r.res[0] -= 0x03;
if(!(r.res[0]&0x80)) r.res[0] -= 0x30;
if(!(r.res[1]&0x08)) r.res[1] -= 0x03;
if(!(r.res[1]&0x80)) r.res[1] -= 0x30;
if(!(r.res[2]&0x08)) r.res[2] -= 0x03;
if(!(r.res[2]&0x80)) r.res[2] -= 0x30;
if(!(r.res[3]&0x08)) r.res[3] -= 0x03;
if(!(r.res[3]&0x80)) r.res[3] -= 0x30;

r.result <<= 1;
if(hex & 0x80000000) r.res[0] |= 1;
hex <<= 1;

} while(--i);

return r.result;
}

RU3GA
04.04.2008, 16:28
Вы что, пропустили мой предидущий пост или не верите. Так же по скорости примерно.


Тфу --- действительно не увидел почему-то Ваш предыдущий пост...
Да --- вырисовывается картинка сэкономить почти 250 слов при той же скорости --- весьма неплохой итог беседы , по крайней мере для меня :) --- VY TNX!

PS Что-то тогда у меня видно "не срослось там" --- у меня получилось медленней на том же алгоритме --- видно как-то написал на Си через задницу :)