Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - GM

Страницы: [1] 2 3 ... 11
1
Код под 12.8 разместил чуть выше. И немного подправил константы.

2
По просьбе Александра RN3AUS переработал программу синтезатора (http://136.su/index.php/topic,117.195.html). Протокол обмена немного изменился, но старый протокол можно по-прежнему использовать для управления частотой синтезатора.

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

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

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

3
Вот код программы, скомилированный под 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.

4
Можно и с нулевой таблицей сделать, но как-то некошерно...

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

5
А можно просто отключить передатчик? У меня синтезатор всё время работает, так что когерентность будет получена автоматически?

6
Прерывание 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 Гц, а потом стоит, как у волка на морозе..хвост.

7
Александр, дорогой уважаемый! Ну, такой я, критикан доморощенный. Мне дай волю, я всех закритикую, начиная с себя :-).

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

Инструкция 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 кГц. По приему пакета всегда высылается квитанция. Ладно, это всё лирика.]

8
Ну, вы же поставили, неявно впрочем...

9
А что случится, если в какой-то вашей подпрограмме, скажем в RX_COMPLETE_INT, где-нибудь поставить команду (инструкцию) SEI?

Вход в прерывание возможен только в течение одной команды главного цикла
Не одной команды, а двух: rjmp И cli. [поправил: cli, конечно, а не sei]

10
Основная программа делает какие-то действия, формирует флаги операций C,Z,N,... (Carry, Zero, Negative и т.д.), собранные в статус-регистре SREG. Подпрограммы прерываний  тоже могут менять флаги операций, эти изменения могут нарушить работу основной программы, иногда существенно. Поэтому при входе во все ваши прерывания нужно сохранять SREG, например так:

push  r14
in       r14,SREG

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

out    SREG,r14
pop   r14
reti

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

11
Александр, обнаружил в вашей программе для микроконтроллера-синтезатора две грубейшие ошибки. Одна связана со статусом, вторая с прерываниями. Пишу кратко с мелкой таблетки - трудно попасть пальцем в букву:-).

12
Случайно наткнулся на книгу Тима Скоренко "Изобретено в России. История русской изобретательской мысли от Петра I до Николая II". Так вот, там есть и про суд 1943 года, где Маркони проиграл свой приоритет в изобретении радио.

13
Torn.Fu.d2 - пехотная УКВ радиостанция. Диапазон 33.8-38 МГц. У нас такие были?

14
Свободное общение / АК-47?
« : 02 Март 2019, 20:52:24 »
Что-то не пойму, что за автомат прислонён к колесу?

15
Форма немецких парашютистов? Кто знает?

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