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

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

Оффлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3557
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #180 : 13 Апрель 2019, 10:04:05 »
Александр, обнаружил в вашей программе для микроконтроллера-синтезатора две грубейшие ошибки. Одна связана со статусом, вторая с прерываниями.
Если не трудно, приведите фрагмент текста, содержащий ошибки , и объясните , пожалуйста, в чем они состоят.
« Последнее редактирование: 13 Апрель 2019, 10:08:15 от rn3aus »

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #181 : 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

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

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

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

Оффлайн GM

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

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

Оффлайн rn3aus

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

Оффлайн GM

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

Оффлайн rn3aus

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

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #187 : 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

  • Ветеран
  • *****
  • Сообщений: 3557
    • Просмотр профиля
Re: DDS синтезатор передатчика
« Ответ #188 : 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 синтезатор передатчика
« Ответ #189 : 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

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

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

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

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

Оффлайн GM

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

Оффлайн rn3aus

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

Оффлайн GM

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

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

Оффлайн rn3aus

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