Автор Тема: DDS синтезатор передатчика  (Прочитано 186886 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #180 : 13 Апрель 2019, 19:37:40 »
Основная программа делает какие-то действия, формирует флаги операций C,Z,N,... (Carry, Zero, Negative и т.д.), собранные в статус-регистре SREG. Подпрограммы прерываний  тоже могут менять флаги операций, эти изменения могут нарушить работу основной программы, иногда существенно. Поэтому при входе во все ваши прерывания нужно сохранять SREG, например так:

push  r14
in       r14,SREG

Ну и при выходе из подпрограммы прерывания - обратный процесс:

out    SREG,r14
pop   r14
reti

Посмотрел ваши прерывания повнимательнее - tim0_ovf не меняет флаги, так что в ней сохранять-восстанавливать флаги не надо.
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #181 : 13 Апрель 2019, 21:02:59 »
Спасибо, GM! Ценное замечание, теперь буду знать.

Вероятно, отсутствие сохранения SREG не влияло на нормальную работу синтезатора по той причине, что основная программа, ее главный цикл, очень простой и ничего кроме выдачи очередного отсчета в порт не делает. Вход в прерывание возможен только в течение одной команды главного цикла - rjmp LOOP1 (возврат в начало цикла), когда отсчет сформирован и уже выдан. В худшем случае, видимо, может пострадать только один отсчет.

Тем не менее, когда соберусь выпустить новую версию прошивки, обработчики прерываний будут скорректированы.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #182 : 13 Апрель 2019, 21:41:14 »
А что случится, если в какой-то вашей подпрограмме, скажем в RX_COMPLETE_INT, где-нибудь поставить команду (инструкцию) SEI?

Вход в прерывание возможен только в течение одной команды главного цикла
Не одной команды, а двух: rjmp И cli. [поправил: cli, конечно, а не sei]
« Последнее редактирование: 14 Апрель 2019, 14:08:00 от GM »
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #183 : 13 Апрель 2019, 23:26:12 »
А что случится, если в какой-то вашей подпрограмме, скажем в RX_COMPLETE_INT, где-нибудь поставить команду (инструкцию) SEI?
А зачем бы ее там ставить? Разрешать прерывания в обработчике прерывания?

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #184 : 13 Апрель 2019, 23:59:12 »
Ну, вы же поставили, неявно впрочем...
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #185 : 14 Апрель 2019, 00:16:18 »
Если у Вас есть и другие замечания к тексту программы и хотели бы еще что-то посоветовать - пожалуйста, сделайте это, лучше сразу по всем пунктам.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #186 : 14 Апрель 2019, 00:59:29 »
Александр, дорогой уважаемый! Ну, такой я, критикан доморощенный. Мне дай волю, я всех закритикую, начиная с себя :-).

Замечаний много, но я себя сдерживаю, а то вы будете меня бояться пуще огня :-). Поэтому я понемножку, чтобы сильно вас не расстраивать.

Инструкция RETI среди прочего, как то, восстановление адреса основной программы из стека и инкремент стека, ещё устанавливает бит I=1, т.е., в некотором роде эквивалентна инструкции SEI (тоже устанавливает бит I=1 SREG). Ну вот, и в подпрограмме RX_COMPLETE_INT у вас есть вызов rcall  TIM0_COMPB, который заканчивается RETI (т.е., в данном случае SEI), разрешая таким образом все глобальные прерывания. Я всю вашу программу не анализировал, но этого примера достаточно, чтобы так не делать.

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

А ещё у вас прерывается генерация синуса на время 4 мс, 12 мс, мощный передатчик начинает работать в "рваном" ритме, регтайм так сказать, вам уже кто-то говорил, что передатчик верещит, и это не есть гуд.

[А вообще, призываю вас испытать мою программу для синтезатора. Там не нужен ВЕСЬ ваш список команд (кроме маяка и еепрома), достаточно передачи одного пакета из 4-х байт. При приеме пакета генерация синуса не прерывается, пакет исполняется через 2 мкс после получения последнего байта, не надо высчитывать такты проца. Частота выборок 2 Мвыб/с, т.о., цифровой шум снижен примерно на 3 дБ, "зеркалка" отъехала на 2000-137=1863 кГц. По приему пакета всегда высылается квитанция. Ладно, это всё лирика.]
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #187 : 14 Апрель 2019, 14:28:36 »
Несколько комментариев. Позволю себе немного позащищать изделие :-)
(Нас читают те любители, которые ищут вариант сделать себе синтезатор и выйти в эфир. Не хотелось бы в них посеять сомнение в том, что наш синтезатор нормально работает. Он нормально работает, и им много лет пользуюсь и я, и другие любители. Его можно улучшить,  что будет сделано в следующей версии.)

[Все не так страшно как кажется, я думаю Вы согласитесь со мной. Если ошибаюсь - поправьте.
1) Вызов TIM0_COMPB, о котором идет речь, нужен для перевода синтезатора в режим AutoBeacon, чтобы он начал это делать немедленно по получению команды G от компьютера. Больше компьютер до завершения работы маяка никаких команд слать не будет, поэтому в данном случае вполне допустимо разрешить прерывание чуть-чуть раньше, так как никаким вложенным прерываниям возникнуть неоткуда - СОМ-порт пуст, таймер сброшен, кнопку жать незачем.
2) Прерывание RX_COMPLETE_INT возникает, как я понимаю, по приходу первого байта. МК смотрит, какая это команда и если она из нескольких байт, то дожидается прихода всех остальных. В это время прерывания запрещены. Так что синхронизация не теряется. Если же приходит неожиданный байт, он, как нераспознанный, просто вызовет ответ контроллера и будет проигнорирован.
Да и откуда взяться лишним байтам? Если только какие-то мощные наводки на кабель. Но в этой ситуации никакой синтезатор, ни мой, ни Ваш нормально работать не будет - у Вас частота начнет сама собой выбираться неизвестно какая.
3) Паузы сигнала во время обработки команд есть. Этот недостаток давно известен и в основном успешно преодолен введением быстрых однобайтных команд без квитанции. При этом "гибнет" 6 отсчетов сигнала на одну команду. Этот недостаток надеюсь изжить в следующей версии, кое-какие мысли есть.
Впрочем, это тоже лирика.]

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

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

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

« Последнее редактирование: 14 Апрель 2019, 15:10:52 от rn3aus »

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #188 : 14 Апрель 2019, 16:29:24 »
Прерывание RX_COMPLETE_INT возникает, как я понимаю, по приходу первого байта
Ну, я же вам нарисовал один из возможных сценариев. Оно и потом возникает при приеме каждого следующего байта (так называемы pending), и откладывается на некоторое время, когда прерывания будут разрешены, ну а когда подошла инструкция RETI, оно, это прерывание, тут как тут.

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

Если это получится, можно было бы подправить и мою программу управления DDS_ctrl и иметь все богатство разнообразных режимов на Вашем качественном DDS.
1) Да, установка частоты реализована. Код частоты любой от 0х00000000 до 0x7FFFFFFF. Возможно стоит ограничить диапазон кодов в диапазоне частот 135-138 кГц или что-то около того. Как бы допзащита от ошибочно переданных байт.

2) Включение/Отключение передатчика. Если имеется в виду сигнал 0/1 на какой-то ноге МК, то это легко осуществить. В принципе можно выдавать до 8 сигналов, если ног проца хватит :-).

3) Сделать можно, но надо ли? За одну секунду любая когерентность нарушится, даже если синтезатор выдаёт абсолютное значение частоты, то присутствуют погрешности первого гетеродина приёмника, а то и второго, генератора звуковой карты, так что когерентность становится проблематичной. Вообще, я думал, что в цифре у вас имеется квадратурный приёмник и подстройка частоты осуществляется каждый раз при приеме новой посылки. Хотя нет, у вас просто БПФ на весь ДВ диапазон.

4) Инверсия фазы. Имеется в виду установка фазы сигнала относительно предыдущего значения? Мы с вами как-то касались этого вопроса, так что такая установка фазы реализована, просто не хотел пугать народ всякими наворотами. Фаза устанавливается с дискретом 360/65536=0.005493 град, естественно, без прерывания генерации синуса. Надеюсь, этого достаточно?

Да, уже говорил, повторюсь. Наличие фильтра НЧ или ПП на выходе синтезатора крайне желательно. Я сейчас подключил ДДС на основе  AD9851 к микроконтроллеру, сижу, играюсь. Плату ДДС купил по интернету, ну и в качестве МК взял плату ардуино-уно, а энкодер - от какой-то бытовой техники. Не айс, зато ничего не надо делать, в смысле паять, пиши себе программу. А, нет, паять пришлось 12 проводков - от ардуины к синтезатору и 4 провода к энкодеру. Ну так вот, фильтр на плате синтезатора не гуд, частота до 55 МГц ещё ничего, а потом начинается джиттер, уровень сигнала резко падает. Хотя должен признать, опорник 30 МГц хорош, выбег частоты 5-6 Гц, а потом стоит, как у волка на морозе..хвост.
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #189 : 14 Апрель 2019, 16:43:29 »
2) Включение/Отключение передатчика. Если имеется в виду сигнал 0/1 на какой-то ноге МК, то это легко осуществить.
Это сигнал 0-1 на ноге PD6.
(Я исхожу из того, чтобы МК с новой прошивкой просто вставить в панельку имеющегося готового синтезатора)

3) Сделать можно, но надо ли? За одну секунду любая когерентность нарушится, даже если синтезатор выдаёт абсолютное значение частоты, т
Нужно. Все эти погрешности на приеме у приличных людей близки к нулю. Важно для приема OPERA/opds. Там желательна когерентность всех посылок, передаваемых на одной частоте. Некогерентный сигнал тоже принимается, но с проигрышем в помехоустойчивости.

4) Инверсия фазы. Имеется в виду установка фазы сигнала относительно предыдущего значения?
Да, ОФТ. Точность достаточна, конечно.

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

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #190 : 14 Апрель 2019, 17:19:51 »
А можно просто отключить передатчик? У меня синтезатор всё время работает, так что когерентность будет получена автоматически?
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #191 : 14 Апрель 2019, 17:25:44 »
А можно просто отключить передатчик? У меня синтезатор всё время работает, так что когерентность будет получена автоматически?
Не совсем хорошо будет - там должны реле срабатывать, подающие питание на выходной каскад. И так будет грохать каждые несколько секунд.
Нельзя ли, допустим, сохраняя работу синтезатора, дополнить алгоритм условно говоря умножением отсчета на единицу, когда тон включен, и на 0, когда тон выключен? Или как-то еще.
(У меня, Вы видели, для этой цели две таблицы - одна с синусом, другая с нулями. Фаза приращается все время, для манипуляции тона переключаются таблицы, откуда берутся отсчеты)

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #192 : 14 Апрель 2019, 17:50:14 »
Можно и с нулевой таблицей сделать, но как-то некошерно...

А нельзя подключить ногу PD2, она свободная, к базе транзистора VT1 (схема DDS-137beacon_CW.JPG из DDS-ctr_v13.0.0.0.zip)?
Когда Upd2=0, транзистор будет капитально заперт.
Зачем нам бумеранг? У нас грабли есть!

Онлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3723
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #193 : 14 Апрель 2019, 18:05:46 »
Можно было бы, да по просьбе UT7GH на нее был выведен сигнал Band Switch. Когда частота больше 200 кГц я (МК) туда 1 формирую. Это чтобы желающие могли этим сигналом переключать выходной фильтр с 137 кгц на 470 кГц.
Самая последняя схема и все прочее в файле http://rn3aus.narod.ru/dds_tx/DDS_Ctrl_Help_Rus.pdf,
 в конце.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #194 : 14 Апрель 2019, 23:55:55 »
Вот код программы, скомилированный под 20 МГц тактовой частоты.

Получите и распишитесь :-).


ПРОТОКОЛ УПРАВЛЕНИЯ СИНТЕЗАТОРОМ

Программа написана для МК ATtiny2313, синхронизируемого кварцем 20 МГц. Программа затрачивает 10 тактов на одну выборку, т.е. частота выборок fS=2000 кГц. Используется 32-битный аккумулятор линейной фазы.

Программа управляется по последовательному каналу уарт, скорость 115200 бод, формат данных 8N1.

В протоколе передачи используются пакеты двух типов. Первый тип используется для управления частотой, второй тип – для изменения фазы, сохранения когерентности сигнала и управления усилителем мощности. Оба пакета состоят из 4 байт. Нумерация байт слева направо, т.е. 1,2,3,4. Старший байт (№ 1) передаётся первым. Нумерация бит в байте справа налево, т.е. 7,6,..,0. 7-й бит первого байта является битом модификации. В качестве признака работоспособности программа возвращает по уарту принятый пакет, как квитанцию.
Передача любого пакета заканчивается тайм-аутом 100 мкс.

1. Для установки частоты передается пакет, содержащий приращение фазы (так называемый код частоты). Признаком передачи первого пакета является наличие 0 в бите модификации. Допускаются любые значения от 0х00000000 до 0х7FFFFFFF. Переход к заданной частоте осуществляется примерно через 2 мкс после приёма последнего байта пакета.

2. Признаком передачи второго типа пакета является наличие 1 в бите модификации. Биты 6, 5 и 4 используются для указания информации контроллеру об изменении фазы, тона и PTT соответственно. Все биты независимы и могут передаваться в одном пакете.

2.1. Для передачи относительной фазы 6-й бит старшего байта устанавливается в 1. Код фазы передаётся во втором и третьем байтах. Второй байт является старшим байтом фазы. Дискретность фазы определяется единицей младшего бита 360/65536 = 0,0054932 градуса. Последний 4-й байт не несёт никакой информации и передается исключительно для получения равной длины обоих типов пакетов.

2.2. Для выключения тона (но сохранения когерентности синтезируемого сигнала) необходимо сбросить 5-й бит старшего байта. Для включения – соответственно установить его в 1.

2.3. Для включения передатчика (PD6 микроконтроллера) необходимо установить 4-й бит старшего байта. Для выключения – соответственно сбросить его в 0.

3. Программа микроконтроллера принимает пакеты и выполняет соответствующие действия, не прерывая генерации сигнала заданной частоты. После подачи питания программа вырабатывает синусоидальный сигнал частотой 137,5 кГц. Передатчик выключен.

Добавил ещё код под 12,8 МГц кварц.
Продублировал здесь http://136.su/index.php?action=post;msg=23549;topic=374.0.
« Последнее редактирование: 15 Апрель 2019, 17:49:33 от GM »
Зачем нам бумеранг? У нас грабли есть!