PDA

Просмотр полной версии : Синтезатор за полчаса



Страницы : [1] 2 3 4 5 6 7 8 9 10 11 12 13

R1AIT
12.03.2015, 02:53
Из китайских шалабушек собрал совсем простой синтезатор за полчаса. Отчет тут (http://handyradio.ru/node/11).

UV7QAE
12.03.2015, 03:19
Вы собрали не синтезатор, а генератор одной частоты. Разница в том что синтезатором можно управлять, а в примере код выдающий фиксированную частоту. Да и смысл такое выкладывать? Соединил проводками, взял готовый код и все.

897
12.03.2015, 04:29
смысл такое выкладывать
Ну почему же? По моему можно найти применение такому генератору. Есть неудобство с изменением частоты, но иногда будет полезным при экспериментах иметь замену отсутствующему кварцу, например. А если бы была возможность переключать несколько частот...

UV7QAE
12.03.2015, 04:48
Я к тому что информация которая выложена гуглится в пару кликов и сам автор не скрывает что взял готовое. Получилось просто так,

берем готовую arduino
берем готовый синтезатор
СОЕДИНЯЕМ 5 проводками
берем готовый код и заливаем его в ардуино
пишем статью как использовать все готовое. Я не спорю с тем что такому не найдется применения, я к тому что все что вклад автора в получившемся - нулевой.

RA4HTN
12.03.2015, 07:11
сделать управление по входам , +1.5 кц вверх, -1.5кгц вниз, -750гц и 0Гц для АМ.
и будет программируемый опорник

RN3GP
12.03.2015, 08:15
Ардуино (микро5v) на Али стоит копейки + плата 9850+индикатор, кто бы нарисовал программу для полноценного синтеза?

EU1ABR
12.03.2015, 08:54
Тут море такого есть, просто чутка пищите, даже с сервисом выйдет не плохимисходники у всех открытые, дописывайте под себя как говориться нехочу

R0TA
12.03.2015, 09:39
пишем статью как использовать все готовое. Я не спорю с тем что такому не найдется применения, я к тому что все что вклад автора в получившемся - нулевой.
Ну сделай ченить сам руками, выложи и напиши статью. С удовольствием почитаем.

serk
12.03.2015, 09:41
Тема про AD9850 уже была.

Палыч
12.03.2015, 09:49
я к тому что все что вклад автора в получившемся - нулевой.
Напрасно Вы так! Не во всех статьях изложены чисто авторские наработки или придумки.
На мой взгляд, эта публикация будет полезна тем, кто впервые берется за подобные устройства. Спектр предлагаемых на рынке ARDUINO блочков и устройств очень широк и зачастую начинающему трудно определиться с выбором. Автор же дает рекомендации на что обратить внимание в свете поставленной задачи, какое использовалось программное обеспечение, пример работы с ним и т.д.
Для делающего или пытающегося сделать первые шаги в этой области весьма полезная информация.

RN3GP
12.03.2015, 10:12
дописывайте под себя
Ага, типа здесь пост написать, а если далек от программирования, можно конечно вспомнить молодость, но времени нет разбираться, а кому-то пять минут "делов".

R2DHG
12.03.2015, 11:03
Я несколько месяцев назад помогал кому то запустить что то более полноценное на нестандартной ардуине (которая не авр), можно вот тут глянуть в конце http://forum.easyelectronic s.ru/viewtopic.php?f=4&t=20247 Верхний код запоминает частоту при выключении, но будет работать только на обычных авр- ардуинах, нижний насколько я помню таки заработал на Due.

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

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

R1AIT
12.03.2015, 11:04
Вы собрали не синтезатор, а генератор одной частоты. Разница в том что синтезатором можно управлять, а в примере код выдающий фиксированную частоту. Да и смысл такое выкладывать? Соединил проводками, взял готовый код и все.Я просто обратил внимание на простое и бюджетное решение проблемы, которая останавливает многих начинающих, да и не только. Это для тех, кому нужен опорник на любую частоту без мороки и не дорого.

R2DHG
12.03.2015, 11:08
Уж больно большой девайс для опорника получается, вот бы такие микрухи синтезаторов "помнили" свои параметры при выключении...

R1AIT
12.03.2015, 11:23
Ценность подобной темы есть - показать простоту использования мк, я и тут и на других форумах наблюдаю некоторую инерцию мышления в этом плане - народ готов довольно сложные девайсы собирать, но только чтобы без мк или с готовой прошивкой, а на самом то деле курса школьной информатики вполне хватит на создание многих любительских поделок на той же ардуине, разбираться там совсем недолго - проверено :-P
Совершенно верно. У меня девятилетний сын с этим успешно справляется. Куча простых примеров поставляется вместе со средой разработки. Если совсеем туго, можно погуглить по фразе "практическая робототехника для младших школьников" и посмотреть видео, проще уже некуда. Правда S4A придется поставить еще.

Добавлено через 5 минут(ы):


Уж больно большой девайс для опорника получается, вот бы такие микрухи синтезаторов "помнили" свои параметры при выключении...
Можно взять Nano или даже Pro mini. В последнем случае понадобится UART адаптер чтобы ее прошить. Или можно для этого использовать ту же UNO с контроллером в панельке. Контроллер для этого вынимается, у плат параллелятся шины питания и данных последовательного порта. Получаем заметно меньшие габариты.


Я не спорю с тем что такому не найдется применения, я к тому что все что вклад автора в получившемся - нулевой.
А я и не претендую. Просто обратил внимание на очень простое решение. Многие даже не знают что гуглить.


сделать управление по входам , +1.5 кц вверх, -1.5кгц вниз, -750гц и 0Гц для АМ.
и будет программируемый опорник Да хоть одну кнопку подключить и можно уже перебирать заранее заготовленные частоты. А можно и несколько.

Добавлено через 7 минут(ы):


Тема про AD9850 уже была.В ней не было столь простого решения.

RA4HTN
12.03.2015, 11:23
Хотелки радиолюбителя, как правило, стандартны: со времен ГПД они не изменились, сложение /вычитание, ввод произвольной ПЧ, расстройка, запоминание по диапаз. + все остальное по желанию разработчика, что сможет охватить. Если разработчик публикует конструкцию в таком ключе, то и вопросов нет.
Для заделки одного-двух VFO изучать язык программирования всем, зачем?

R2DHG
12.03.2015, 11:32
Мне понравилась идея сделать что нибудь с si5351 - она сама мелкая и можно сразу гпд с опорником (еще и подстраивающимся) сваять.


Для заделки одного-двух VFO изучать язык программирования всем, зачем?

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

В темах про простые синтезаторы множество сообщений вида "а добавьте такой то дисплей, а добавьте такую то пч, а сделайте под кварц в NN МГц..." и народ ждет готовую прошивку, хотя именно "простой синтезатор" многие могли бы и сами поковырять. Отталкивает обычно что ? Нужен программатор, нужно ставить среду разработки (немаленькую между прочим и с кучей кнопок), читать ДШ на мк. Ардуинщик от большей части этих проблем избавлен (есть другие, но с ними сталкиваешься не сразу) и "помигать светодиодом" не сложнее, чем html страничку "hello world" в блокноте сделать, прошивка при этом генерится самая настоящая - можно заливать в новый голый мк если хочется, используя ту же ардуину как программатор.

R1AIT
12.03.2015, 11:45
Хотелки радиолюбителя, как правило, стандартны: со времен ГПД они не изменились, сложение /вычитание, ввод произвольной ПЧ, расстройка, запоминание по диапаз. + все остальное по желанию разработчика, что сможет охватить. Если разработчик публикует конструкцию в таком ключе, то и вопросов нет.
Для заделки одного-двух VFO изучать язык программирования всем, зачем?
У каждого свои хотелки. Иногда достаточно заметно меньшего функционала. У меня получилось быстро и не затратно сделать очень простое решение для удовлетворения своих текущих потребностей. Я этим поделился. каждый вправе сам решать, нужно это ему или нет, и если нужно, то зачем. Я там написал, что уже получил индикатор с клавиатурой и валкодер. Можно развивать эту конструкцию самостоятельно, для этого все есть, или ждать новых реализаций. Желание их сделать есть. Как и когда это получится, не знаю.

Добавлено через 6 минут(ы):


А потом захочется шаговиком пошевелить конденсатор переменный в согласующем или управление повороткой какой сделать, температуру на дисплей вывести и пошло поехало...Кстати, конденсатор удобнее сервомашинкой шевелить. Стоит около 100 рублей. В среде разработки есть библиотеки и примеры работы. А мы с сыном собираем такую прикольную штуку: http://www.youtube.com/watch?v=syfzV2MEBCM

R2DHG
12.03.2015, 11:55
У нас вот такой лифт http://www.youtube.com/watch?v=9rN-O_V32q0&feature=youtu.be в нем оригинальный полосатый трос, который является энкодером и датчиком направления движения (вверху под двигателем датчик из трубочки и двух оптопар на отражение), можно использовать и в трансивере если кто любит веревочки со стрелками :)

RA4HTN
12.03.2015, 12:13
А потом захочется шаговиком пошевелить конденсатор переменный в согласующем или управление повороткой какой сделать, температуру на дисплей вывести и пошло поехало...Вы правы, в том что откроется новый мир. Точно так же если изучить английский откроется еще одна страна, французский -третья. Все это весьма похвально. Только вот сомнительно, что все с этим справятся. Курсы арифметики говорите?
Да все, практически, повторяют готовые конструкции, инженеров на форуме по пальцам. Никто не рассчитывает входные, выходные сопротивления, рабочие точки и т.п.
Стремиться к новому - это отличная черта, но не все на многое способны.
Вы все молодцы, развивайте и выкладывайте, доведите только до конца, чтобы можно было положить в раздел готовых образцов.

R2DHG
12.03.2015, 12:25
Такой вариант интересен именно простотой (можно собрать даже не паяя) и возможностью доработки под себя, в плане функционала и как готовое устройство лучше повторять что нибудь другое, сейчас же выбор большой.

Доведение до конца может быть и таким - берется подходящая коробка, проковыривается отверстие для проводов, упихиваем туда провода с платами, плотненько закрываем и никому не показываем этот ужас, снаружи смотрится прилично :-P

RA4HTN
12.03.2015, 12:28
Такой вариант интересен именно простотой (можно собрать даже не паяя) и возможностью доработки под себя, в плане функционала и как готовое устройство лучше повторять что нибудь другое, сейчас же выбор большой.это все хорошо, все нравится, как мы это применим в том виде, как это сейчас?
Как генератор с фиксированной частотой? чем это лучше кварц. генератора?
Ну хотя бы предложите , его как программируемый опорник или как VFO c переключаемыми частотами для карманного CW трансивера.
Я приветствую желание поделится радостью готовой заработавшей конструкции - это нормально, но все же не ясно, во что это выльется. Эта ветка будет превращаться в обучающую по Ардуино? Тоже нормально, только взять и переименовать.
Народ ждет одного -будут это двигать дальше автор или опытные товарищи или поделились (ну немного пожурили других за нежелание заниматься программированием) и закрыли?

R2DHG
12.03.2015, 12:44
Как генератор с фиксированной частотой, но с любой в кв диапазоне и с возможностью ее оперативно поменять. Для проверки/настройки может пригодиться, тут еще важно "за полчаса" (а реально и минут за 5). Ссылку на простой код для реального устройства из этих же компонентов +lcd я выше привел - частота меняется энкодером, шаг перестройки меняется кнопокой, алгоритмы нормальные (ничего не "дребезжит", но без ускорений и т.п.), при отключении частоту помнит, сам этот код ковырял и если кому интересно могу продолжить.

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

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

R2DHG
12.03.2015, 12:51
Сорри за привычку редактировать сообщения по 5 раз :-P Дописал там про более готовый к употреблению код - в качестве простого перестраиваемого генератора с индикацией оно уже годится (сообщение #12), там даже фотка есть.

R1AIT
12.03.2015, 12:52
это все хорошо, все нравится, как мы это применим в том виде, как это сейчас?
Как генератор с фиксированной частотой? чем это лучше кварц. генератора?
Ну хотя бы предложите , его как программируемый опорник или как VFO c переключаемыми частотами для карманного CW трансивера.

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

RA4HTN
12.03.2015, 12:56
Что делать мне я тоже сам решу.что обижаться то? по-моему никто не указывает, предложил несколько вариантов на выбор, начиная от поделились-порадовались -разошлись, до развили вещь в конкретную штуку- закрыли, третий - сделали ветку обучающей.
Ладно, понимания нет! 73!

R1AIT
12.03.2015, 13:12
ну, хоть что-то будет, менять например джамперами, хоть простой, карманный сигнал генератор на любительские бенды.
про опорник я уже написал, можете это сделать, пусть будет большой по размеру, но кому-то это будет неактуально (отпадет искать отсутствующие кварцы или тянуть их "вверх-вниз")
Не все сразу. У меня уже есть такой индикатор: http://ru.aliexpress.com/item/High-Quality-1602-HD44780-Character-LCD-Duemilanove-Robot-Display-Module-Board-Blue-Backlight-Keypad-Shield/32265058812.html?rec ommendVersion=1
такой валкодер: http://ru.aliexpress.com/item/Free-Shipping-Rotary-Encoder-Module-Brick-Sensor-Development-for-arduino-Dropshipping-KY-040/32262356075.html?rec ommendVersion=1
такая клавиатура: http://ru.aliexpress.com/item/-/1979704732.html?reco mmendVersion=1
и даже такой модуль GPS: http://ru.aliexpress.com/item/Hot-Sale-Ublox-GY-NEO6MV2-GPS-Module-Aircraft-Flight-Controller-For-Arduino-APM-2-5-Free/32228359064.html?rec ommendVersion=1
Будет время, буду пробовать. Что получится, поделюсь обязательно.

Добавлено через 5 минут(ы):


что обижаться то? по-моему никто не указывает, предложил несколько вариантов на выбор, начиная от поделились-порадовались -разошлись, до развили вещь в конкретную штуку- закрыли, третий - сделали ветку обучающей.
Ладно, понимания нет! 73!Никаких обид. Просто действую в соответствии с имеющимися у меня ресурсами и возможностями. Если кому полезно, можно пользоваться.

RA4FIX
12.03.2015, 13:19
Почти все изготовители "генераторных" чипов выпускают документацию на чип и среду разработки: так называемую "эваборд" и ПО для компа. Сейчас это чаще всего по USB, а раньше управлялось с LPT. Я так запускал много чипов от Техасоф и NI. Только паяй куски из схемы эвабордЫ, никакого ассемблера. Но это быстро надоедает, для наших функций нужен программер.
На счёт Si5xxx, который так радует Alexander_Warlock-а, это раздатчик клоков. Там внутри свои PLL и какие-то частоты выходят из них красивые, но большинство "средней паршивости". Это как PLL в, например аудио ЦАПе, на звук практически не влияет.
То, что делает ТС, думаю полезно. Для этого и придумали эти "кубики".

ur3ilf
12.03.2015, 13:23
Последнее время синтезаторы стали делать по принципу есть частота на выходе- остальное все по фигу. Почему? А потому что ни кого уже вообще не волнует ни чего кроме частоты на выходе, абсолютно по боку все развязки по питанию, наплевать что куча помех от синтеза и прочее. Ардуины это хорошо, но для применения в трансивере я лично давно забраковал. Потому что надо делать чтоб и развязки не только по питанию были, но и в дизайн нормально вписывалось и не стояла коробка с ручкой на столе. И помехи не излучало приёмнику. С ардуинами на на столе поиграться прикольно. Хотя это может у меня так после синтезаторов на Z80 такая закалка что всё должно быть по уму сделано.

R1AIT
12.03.2015, 13:46
Последнее время синтезаторы стали делать по принципу есть частота на выходе- остальное все по фигу. Почему? А потому что ни кого уже вообще не волнует ни чего кроме частоты на выходе, абсолютно по боку все развязки по питанию, наплевать что куча помех от синтеза и прочее. Ардуины это хорошо, но для применения в трансивере я лично давно забраковал. Потому что надо делать чтоб и развязки не только по питанию были, но и в дизайн нормально вписывалось и не стояла коробка с ручкой на столе. И помехи не излучало приёмнику. С ардуинами на на столе поиграться прикольно. Хотя это может у меня так после синтезаторов на Z80 такая закалка что всё должно быть по уму сделано.Я предложил очень простое, не дорогое и отлично повторяемое решение, с исчерпывающим описанием для его повторения. Скорее всего оно не идеально, и точно не подходит на все случаи жизни. Делайте лучше и делитесь результатами.

R2DHG
12.03.2015, 14:11
На счёт Si5xxx, который так радует Alexander_Warlock-а, это раздатчик клоков. Там внутри свои PLL и какие-то частоты выходят из них красивые, но большинство "средней паршивости". Это как PLL в, например аудио ЦАПе, на звук практически не влияет.

Si570 тоже не специально для синтеза, но получается неплохо. Правда глянул 5351 - похуже выходит, для побаловаться "простым трансивером с ЭМФ" наверное можно.

R1AIT
12.03.2015, 14:36
Si570 тоже не специально для синтеза, но получается неплохо. Правда глянул 5351 - похуже выходит, для побаловаться "простым трансивером с ЭМФ" наверное можно.Купить в небольшом количестве по адекватной цене у меня не получилось.

R2DHG
12.03.2015, 15:45
Угу, дороговато для побаловаться, на али вроде они есть по 200р +500р доставка, на ebay модули есть с доставкой ~1200р. Si570 брал в sdr-kits.net, но с нынешним курсом тоже выходит многовато.

gudzon-m
12.03.2015, 19:20
Здравствуйте! Меня посетила мысль по поводу синтезатора-кубиков.
Создать отдельную тему, где в шапке будут схемы соединения блоков таких как ардуино, блок на DDS AD9850, блок на семисегментниках, блок 2Х16 и подобные, энкодер, блок с релюшками и прочие маленькие блочки.
Затем, различный код с комментариями. Комментарии обязательно, что бы любой радиолюбитель мог поправить что-то под себя.
Получаем конструктор.
Например: Имеем ардуину, DDS, энкодер, 16Х2. Собираем согласно схеме, копируем скетч, раскомментируем необходимые строки, прошиваем, радуемся. Полявилась клавиатура 3Х4 добавляем в схему, добавляем кусок кода или раскомментируем нужное. Захотели вместо 16Х2 светодиодные индикаторы поставить, ничего сложного, меняем дисплей, нужное закомментировать или удалить а нужное добавить.
Вот такой концепт я вижу.
Сам я программировать не умею, точнее мои умения настолько слабы, что их не стоит считать за умения, а вот поправить код смогу, наверное.
Что думаете?

RA4HTN
12.03.2015, 19:36
Светлая мысль, т.к. никто лазить по 100 страницам не будет, только в шапку надо все к каждой прошивке и схему. Обычно как в таких ветках: "вот прошивка", а для какой опоры, какой схемы непонятно

RN3GP
12.03.2015, 19:39
Упросить бы UA3RQN помочь http://www.cqham.ru/forum/showthread.php?25050-Мой-синтезатор-на-Китайском-модуле-AD9850-для-простого-трансивера-с-ЭМФ/page74

RA4FHE
12.03.2015, 19:47
С сайта DJ7OO всё работает с пол пинка, скетчи имеются.

http://www.kh-gps.de/si5351.htm
http://www.kh-gps.de/freak_dds.htm
http://www.kh-gps.de/si570_ardu.htm
http://www.kh-gps.de/dds_ardu.htm

gudzon-m
12.03.2015, 19:49
Светлая мысль, т.к. никто лазить по 100 страницам не будет, только в шапку надо все к каждой прошивке и схему. Обычно как в таких ветках: "вот прошивка", а для какой опоры, какой схемы непонятно

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

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

R2DHG
12.03.2015, 19:54
С сайта DJ7OO всё работает с пол пинка, скетчи имеются.

http://www.kh-gps.de/si5351.htm
http://www.kh-gps.de/freak_dds.htm
http://www.kh-gps.de/si570_ardu.htm
http://www.kh-gps.de/dds_ardu.htm

Вот блин, все уже сделано до нас :-P



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

RA4HTN
12.03.2015, 19:56
все равно это нуждается в переводе, т.к. немецкий не все знают.
Да и такие ресурсы не вечны, сегодня есть-завтра -нет.
Если у кого есть способности адаптировать это на русский лад и выложить в шапку, почему нет, по-мере как сам делает.

R2DHG
12.03.2015, 20:02
Ну там самое ценное понятно и без немецкого - картинки с кодом.

RA4HTN
12.03.2015, 20:04
Ну там самое ценное понятно и без немецкого - картинки с кодом.понятно, но все равно будут вопросы, куда что нажать, как войти в системное меню.
Для si 570 там кстати нет софта, пустая ссылка.

И для DDS версии (синтезатор) нельзя вот так просто подключить самый распространенный и дешевый двухстрочный дисплей 1602, а только через адаптер I2C adapter , это такая фича для ардуино характерна?
китаезы продают такие переходники?

RA4FHE
12.03.2015, 20:34
Для экономии портов можно нацепить через I2C http://www.ebay.com/itm/IIC-I2C-TWI-SP-I-Serial-Interface-Board-Module-Port-For-Arduino-1602LCD-Display-/310565362720

gudzon-m
12.03.2015, 20:44
Надо теперь понять какой функционал нужен для начала.

Основной функционал не сложный:



поддержка дисплея 16Х2
Поддержка ввода ПЧ (причем можно указать прямо в скетче)
Переключение LSB USB CW
Переключение любительских диапазонов
Поддержка переключателя ДПФ


Потом дополнять следующим функционалом:


Поддержка дисплея на MAX7219
Поддержка матричной клавиатуры для прямого ввода частоты и прочих функций
???


Придумать можно много всего, но для начала думаю хватит.

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

UR5EIN
12.03.2015, 21:04
все равно это нуждается в переводе, т.к. немецкий не все знают.
В самом верху страницы, после заголовка открытой вкладки, например:
Simple-DDS mit ARDUINO-Software
(Простые DDS с Arduino программного обеспечения )
есть строка
Automatic translation by GOOGLE:
(Автоматический перевод Google):
появляется окно с выбором языка: Немецкий - .... хоть на монгольский...

R2DHG
12.03.2015, 21:53
И для DDS версии (синтезатор) нельзя вот так просто подключить самый распространенный и дешевый двухстрочный дисплей 1602, а только через адаптер I2C adapter , это такая фича для ардуино характерна?
китаезы продают такие переходники?
Ага, продают и отдельно переходники и LCD с ними (втыкается и припаивается, на этой плате еще регулятор контраста). Я один нацеплял, но там может не совпасть распиновка выхода порта на LCD с тем, что в библиотеке для LCD_I2C. Подключить можно и такой и такой, с I2C просто проводов меньше - удобней.


Подключить и прошить ардуино сможет даже ребенок, а поэтому для начала можно все настройки производить прямо в скетче, для этого и нужны комментарии.
Да, в каком то смысле открытость тут заменяет сервисное меню. К MAX7219 вместе с семисегментными видимо будут подключаться еще какие то светодиоды - индикаторы режимов ?

gudzon-m
12.03.2015, 22:10
К MAX7219 вместе с семисегментными видимо будут подключаться еще какие то светодиоды - индикаторы режимов ?

А почему бы и нет? Хотя я имел в виду вот такой (http://www.ebay.com/itm/MAX7219-CWG-8-Digit-Digital-Tube-Display-Control-Module-Red-for-arduino-/310634882296?pt=LH_D efaultDomain_0&hash=item48534824f8) модуль


Да, в каком то смысле открытость тут заменяет сервисное меню.

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

vadim_d
12.03.2015, 22:16
Захотели вместо 16Х2 светодиодные индикаторы поставить, ничего сложного, меняем дисплей, нужное закомментировать или удалить а нужное добавить
Такой подход достаточно трудоемок: за универсальность приходится платить, каждая модификация для одного кубика потенциально требует тестирования и других конфигураций, плюс изначально необходимо продумать хорошую модульность всей системы. IMHO Ардуино больше подходит как "волшебный пендаль" для тех, кто хочет научиться программировать, но не решается. Возможность быстро увидеть результат своих усилий является хорошим стимулом для новичков

gudzon-m
12.03.2015, 22:32
vadim_d, так для этого и нужен форум, тестировать код для разных конфигураций кубиков. Ну а если не совместимые вещи, например не хватает пинов, ничего не поделаешь.
Кстати по пинам. Я думаю тут нужно хорошенько все продумать. Например жестко зарезервировать ножки под DDS, так как без него никуда и энкодер. С остальными можно играть, в принципе, по грубым прикидкам, выводов для периферии должно хватить, для простых конструкций.

Опять же, расширять сдвиговыми регистрами не сложно, да и плату "мега" никто не отменял.

Некоторый кубики можно придумать и самим, для оптимизации использования выводов...
В общем, простор для фантазии есть. Теперь дело за толковым программистом :super:


IMHO Ардуино больше подходит как "волшебный пендаль"

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

ur3ilf
12.03.2015, 22:56
Никто не запрещает использовать атмегу отдельно от платы. Собрал прошивку, протестировал, мелкосхемку сковырнул из ардуины и запаял в плату
И при разводке столкнётесь что оно не клеится разводка платы так как хотелось бы. Как не крути а придёте к тому что надо делать нормальную плату и под неё писать код. Всегда так и делал. Как можно сделать иначе не понимаю. Модулями игрался и играюсь. Классная вещь для макетирования. Держать бутерброды в трансивере наверное можно, но это на любителя. Хотя с другой стороны понимаю что за ардуинами будущее. Потому что вижу как народ теряет квалификацию и тот же валкод самому сложно сделать. Другим платы сложно сделать. Потому ардуино будет рулить.

UT0UM
12.03.2015, 23:46
такая клавиатура: http://ru.aliexpress.com/item/-/1979704732.html?reco mmendVersion=1.

тоже валяется такая клава, она неудобна тем, что ее нельзя встроить в переднюю панель, потому что разъем торчит
кстати, почем-то у блоков для ардуино это очень часто

Добавлено через 7 минут(ы):


Светлая мысль, т.к. никто лазить по 100 страницам не будет, только в шапку надо все к каждой прошивке и схему. Обычно как в таких ветках: "вот прошивка", а для какой опоры, какой схемы непонятно

ага значит лазить по ста страницам Вам лень, а кому то не лень будет писать код РАБОЧИЙ на все случае жизни, чтобы Вы просто раскомментировали потом нужные для Вас строки...
... нюню

Добавлено через 12 минут(ы):


... но можно разрастись в коде так, что память закончится...

это вряд ли, там доступно 30 кБ, а это очень много
а если взять МЕГУ то там почти 256 кБ и можно на ней поднять веб сервер чтобы управлять синтезатором по сети :)


... Теперь дело за толковым программистом :super:



дело на самом деле не за толковым программистом, а за толковой постановкой задачи

RA4FIX
12.03.2015, 23:58
а кому то не лень будет писать код РАБОЧИЙ на все случае жизни, чтобы Вы просто раскомментировали потом нужные для Вас строки...А кому то не лень писать фриварьный софт и выкладывать его "просто так". А ещё кто то долго делает трансивер или РА и публикует на форуме, без гонораров.
Вдогонку, я только пришел: Si570 имеет внутри кварцевую песчинку на 4ГГц и кучу делителей, а раздатчики клоков тактируются от относительно низкочастотного кварца и чистота спектра там гарантируется для определённых частот, необходимых потребителям (АЦП-ЦАП).

gudzon-m
13.03.2015, 00:05
UT0UM, ну не знаю коллега, мне идея нравится и я расчехлил ардуину + все необходимое, буду мучить и пытаться что-то сделать.

196720

UT0UM
13.03.2015, 00:13
А кому то не лень писать фриварьный софт и выкладывать его "просто так". А ещё кто то долго делает трансивер или РА и публикует на форуме, без гонораров...

дело не в гонорарах, а во времени, которое будет просто потрачено впустую если нет четко поставленной задачи

RA4FIX
13.03.2015, 00:34
Так её и "рожают", идею в смысле:smile:

gudzon-m
13.03.2015, 06:32
Собрал кубики в кучку, завелось. Теперь хочу научить его изменять частоту от вращения энкодера. Посмотрел как сделано у немца, взял библиотеку к энкодеру, подпаялся.

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



//Синтезатор на AD9850

#include <Rotary.h> //подключаем библиотеку энкодера

#define DDS_CLOCK 125000000 //Задаем частоту кварцевого генератора DDS

#define CLOCK 10 //подключение вывода к DDS
#define LOAD 11 //подключение вывода к DDS
#define DATA 12 //подключение вывода к DDS
#define RESET 13 //подключение вывода к DDS

Rotary r = Rotary(2,3); // Подключаем энкодер к контактам 2 и 3

void setup()
{
pinMode (DATA, OUTPUT); //Устанавливаем вывод как цифровой выход
pinMode (CLOCK, OUTPUT); //Устанавливаем вывод как цифровой выход
pinMode (LOAD, OUTPUT); //Устанавливаем вывод как цифровой выход
pinMode (RESET, OUTPUT); //Устанавливаем вывод как цифровой выход
AD9850_init();
AD9850_reset();

SetFrequency(2800000 ); //Задаем с какой частоты стартовать
////////////////////
Serial.begin(9600);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
//////////////////////
}

void loop()
{

}

void SetFrequency(unsigne d long frequency)
{
unsigned long tuning_word = (frequency * pow(2, 32)) / DDS_CLOCK;
digitalWrite (LOAD, LOW);

shiftOut(DATA, CLOCK, LSBFIRST, tuning_word);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 8);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 16);
shiftOut(DATA, CLOCK, LSBFIRST, tuning_word >> 24);
shiftOut(DATA, CLOCK, LSBFIRST, 0x0);
digitalWrite (LOAD, HIGH);
}

void AD9850_init()
{

digitalWrite(RESET, LOW);
digitalWrite(CLOCK, LOW);
digitalWrite(LOAD, LOW);
digitalWrite(DATA, LOW);
}

void AD9850_reset()
{
//reset sequence is:
// CLOCK & LOAD = LOW
// Pulse RESET high for a few uS (use 5 uS here)
// Pulse CLOCK high for a few uS (use 5 uS here)
// Set DATA to ZERO and pulse LOAD for a few uS (use 5 uS here)

// data sheet diagrams show only RESET and CLOCK being used to reset the device, but I see no output unless I also
// toggle the LOAD line here.

digitalWrite(CLOCK, LOW);
digitalWrite(LOAD, LOW);

digitalWrite(RESET, LOW);
delay(5);
digitalWrite(RESET, HIGH); //pulse RESET
delay(5);
digitalWrite(RESET, LOW);
delay(5);

digitalWrite(CLOCK, LOW);
delay(5);
digitalWrite(CLOCK, HIGH); //pulse CLOCK
delay(5);
digitalWrite(CLOCK, LOW);
delay(5);
digitalWrite(DATA, LOW); //make sure DATA pin is LOW

digitalWrite(LOAD, LOW);
delay(5);
digitalWrite(LOAD, HIGH); //pulse LOAD
delay(5);
digitalWrite(LOAD, LOW);
// Chip is RESET now
}


ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result == DIR_NONE) {
// do nothing
}
else if (result == DIR_CW) {
Serial.println("ClockWise");
}
else if (result == DIR_CCW) {
Serial.println("CounterClockWise");
}
}



Объясните пожалуйста.

ex8ai
13.03.2015, 07:26
А что нужно то от простого синтезатора - самого простого - перестройка по частоте и не очень большой шаг её т.е минимальный шаг перестройки - к примеру 10гц -100гц -1кгц -10кгц всё а всякие включения УВЧ - С-метр и др не думаю что для самого простого это нужно .Да если использовать как просто опорник ,тогда конечно достаточно чтоб была на выходе ну пару частот к примеру те же 500кгц и 5мгц или др .:-P Возможно я не прав или просто отстал от жизни и тут самый простой вариант это со всеми прибамбасами что можно только придумать .:-P

DARKSTAR
13.03.2015, 07:53
А я просто впаял модуль AD9850 на плату с ATMega-8.
Самый дешёвый вариант: 7$ модуль синтеза + 2$ АТМега-8 с резонатором:
http://darkstar5.narod.ru/military/DSCF3184.jpg

Валкодер не делал.
Просто четыре канала и кнопка переключения:
http://darkstar5.narod.ru/My_SWT/foto-0034.jpg

Установка частоты каналов - через СОМ-порт:
http://saveyou.ru/forum/attachment.php?attac hmentid=17139&d=1420359966

Общение через любой гипертерминал.
На белом фоне внизу - мои команды.
На чёрном фоне вверху - ответы атмеги.

Подробнее вот тут:
http://saveyou.ru/forum/showthread.php?t=539 9

R2DHG
13.03.2015, 09:53
Теперь нужен код, вот что у меня вышло, а что дальше делать не знаю...

Объясните пожалуйста.
У вас энкодер не меняет частоту, но частота сама выставляется верно ? LCD 16x2 есть ? Попробуйте код из ссылки в сообщении #12, по крайней мере энкодер должен заработать + там шаг перестройки меняется, если у вас 9851 то и он должен заработать, я вроде под него чуть чуть код менял (буквально 0 на 1 где то, в той теме по ссылке есть), а именно 9850 у меня нет попробовать.

(Serial.println внутри прерывания - это жесть даже для ардуинщика).


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

Опять же, расширять сдвиговыми регистрами не сложно, да и плату "мега" никто не отменял.

А если у нас не DDS (ну в смысле si570 какой нибудь) ? Можно довольно много чего повесить на I2C с помощью pcf8574 или сознательно выбирая такие кубики (в некоторых индикаторах перепайкой резисторов можно переключить режим, мне графические OLED нравятся, но мелковаты они), но это усложнит конструкцию и понимание работы скетча.



это вряд ли, там доступно 30 кБ, а это очень много
а если взять МЕГУ то там почти 256 кБ и можно на ней поднять веб сервер чтобы управлять синтезатором по сети :)

30 Кб жутко мало :) Как ардуинщики жили на мега8 или 168 вообще не представляю, пару библиотек прицепил, serial.print'ов наставил и уже приходится на размер поглядывать, экономить что то.


тоже валяется такая клава, она неудобна тем, что ее нельзя встроить в переднюю панель, потому что разъем торчит
кстати, почем-то у блоков для ардуино это очень часто

Кубики кубиками, но паяльник то никто не отменял, можно заменить гребенку на Г образную, припаять с другой стороны или заменить на шлейф с пинами (китайцы продают довольно удобные провода, можно поискать по dupont wire, но с нынешним курсом уже жаба душит).

hamster
13.03.2015, 10:40
буду мучить и пытаться что-то сделать.
Так готовые прошивки есть, чего мучить-то... и с энкодером, и с с-метром...196800

ur5efd
13.03.2015, 11:12
Понимаю,что дело хорошее,но ничего не понял-отстал я ... Все еще живу лампами-транзисторами... А ведь для любителей QRP кварцы типа 7030.14060 и т.д. проблемма!!! Вот где можно применить!!!:super:

R2DHG
13.03.2015, 11:29
Так готовые прошивки есть, чего мучить-то... и с энкодером, и с с-метром...
Прошивка это скучно, нужен ардуинский скетчик чтобы сделать свой собственный синтезатор с блэкджеком и ш... :-P

nutrilon
13.03.2015, 11:44
http://www.ad7c.com/projects/ad9850-dds-vfo/

R2DHG
13.03.2015, 12:09
Такой мы уже знаем, но
- только один тип дисплея
- только ad9850
- нет клавы и прямого набора частоты (а оно вообще кому то нужно ? я на своем трансивере частоту набирал с кнопок раз 5 наверное)
- нет переключения диапазонов (а вот это полезная штука, еще желательно чтобы запоминал частоту на каждом)
- на кнопке переключения шага нет антидребезга и это жутко неудобно
- нет переключалок usb/lsb и прочих режимов
- нет управления дпф (вот что лучше - занять 4 пина или убрать это в 595й регистр или другой расширитель портов, куда засунуть и usb/lsb/cw ?)

Владимир_К
13.03.2015, 12:45
А ведь для любителей QRP кварцы типа 7030.14060 и т.д. проблема!!! Вот где можно применить!!!:super:
Для такого девайса достаточно LM7001 плюс AT90S1200? или более современную ATtyny2313. Это будет около 30 грн. (ну может чуть дороже, или наоборот, дешевле (надо глянуть прайсы в интернет-магазинах). Ну еще кварц на 7200, остальное наверное в столе найдется. Если надо, программку (прошивку) сварганю. За основу берем синтезатор Темерева Радио №6, за 2006 год. А если выбросить все ненужные функции типа индикатора, валкодера и пр. то скорее всего можно контроллер применить и попроще типа ATtyny13A (всего восемь ножек.:-|)

R1AIT
13.03.2015, 13:40
Для такого девайса достаточно LM7001 плюс AT90S1200? или более современную ATtyny2313. Это будет около 30 грн. (ну может чуть дороже, или наоборот, дешевле (надо глянуть прайсы в интернет-магазинах). Ну еще кварц на 7200, остальное наверное в столе найдется. Если надо, программку (прошивку) сварганю. За основу берем синтезатор Темерева Радио №6, за 2006 год. А если выбросить все ненужные функции типа индикатора, валкодера и пр. то скорее всего можно контроллер применить и попроще типа ATtyny13A (всего восемь ножек.:-|)Можно все, что угодно. Мой вариант точно не единственно возможный. Просто я уже положил абсолютно все, что необходимо чтобы собрать, включить и оно работало. Добавлю функций и удобств, положу еще. Сделайте так же, чего зря кнопки давить?

gudzon-m
13.03.2015, 14:06
http://www.ad7c.com/projects/ad9850-dds-vfo/

Странно, заливаю скетч, выдает кучу ошибок:



Arduino: 1.6.1 (Windows 7), Плата"Arduino Uno"

AD9850_LCD_ROTARY_WM ENUS_IF.ino:17:8: error: redefinition of 'Rotary r'

AD9850_LCD_ROTARY_WM ENUS.ino:12:8: error: 'Rotary r' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:18:18: error: redefinition of 'LiquidCrystal lcd'

AD9850_LCD_ROTARY_WM ENUS.ino:13:15: error: 'LiquidCrystal lcd' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:19:14: error: redefinition of 'int_fast32_t rx'

AD9850_LCD_ROTARY_WM ENUS.ino:14:14: error: 'int_fast32_t rx' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:20:14: error: redefinition of 'int_fast32_t rx2'

AD9850_LCD_ROTARY_WM ENUS.ino:15:14: error: 'int_fast32_t rx2' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:21:14: error: redefinition of 'int_fast32_t increment'

AD9850_LCD_ROTARY_WM ENUS.ino:16:14: error: 'int_fast32_t increment' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:23:5: error: redefinition of 'int buttonstate'

AD9850_LCD_ROTARY_WM ENUS.ino:17:5: error: 'int buttonstate' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:26:8: error: redefinition of 'String hertz'

AD9850_LCD_ROTARY_WM ENUS.ino:18:8: error: 'String hertz' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:27:6: error: redefinition of 'int hertzPosition'

AD9850_LCD_ROTARY_WM ENUS.ino:19:6: error: 'int hertzPosition' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:6: error: redefinition of 'byte ones'

AD9850_LCD_ROTARY_WM ENUS.ino:20:6: error: 'byte ones' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:11: error: redefinition of 'byte tens'

AD9850_LCD_ROTARY_WM ENUS.ino:20:12: error: 'byte tens' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:16: error: redefinition of 'byte hundreds'

AD9850_LCD_ROTARY_WM ENUS.ino:20:18: error: 'byte hundreds' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:25: error: redefinition of 'byte thousands'

AD9850_LCD_ROTARY_WM ENUS.ino:20:28: error: 'byte thousands' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:35: error: redefinition of 'byte tenthousands'

AD9850_LCD_ROTARY_WM ENUS.ino:20:39: error: 'byte tenthousands' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:48: error: redefinition of 'byte hundredthousands'

AD9850_LCD_ROTARY_WM ENUS.ino:20:53: error: 'byte hundredthousands' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:28:65: error: redefinition of 'byte millions'

AD9850_LCD_ROTARY_WM ENUS.ino:20:71: error: 'byte millions' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:29:8: error: redefinition of 'String freq'

AD9850_LCD_ROTARY_WM ENUS.ino:21:8: error: 'String freq' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:30:14: error: redefinition of 'int_fast32_t timepassed'

AD9850_LCD_ROTARY_WM ENUS.ino:22:14: error: 'int_fast32_t timepassed' previously declared here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:31:5: error: redefinition of 'int memstatus'

AD9850_LCD_ROTARY_WM ENUS.ino:23:5: error: 'int memstatus' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino:34:5: error: redefinition of 'int ForceFreq'

AD9850_LCD_ROTARY_WM ENUS.ino:29:5: error: 'int ForceFreq' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void setup()':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:38:6: error: redefinition of 'void setup()'

AD9850_LCD_ROTARY_WM ENUS.ino:34:6: error: 'void setup()' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void loop()':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:64:6: error: redefinition of 'void loop()'

AD9850_LCD_ROTARY_WM ENUS.ino:58:6: error: 'void loop()' previously defined here

In file included from C:\arduino-1.6.1\hardware\ardui no\avr\cores\arduino/Arduino.h:30:0,

from C:\Users\Hudson\Docu ments\Arduino\librar ies\Rotary/Rotary.h:8,

from AD9850_LCD_ROTARY_WM ENUS.ino:3:

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void __vector_5()':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:108:5: error: redefinition of 'void __vector_5()'

AD9850_LCD_ROTARY_WM ENUS.ino:79:5: error: 'void __vector_5()' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void sendFrequency(double )':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:119:6: error: redefinition of 'void sendFrequency(double )'

AD9850_LCD_ROTARY_WM ENUS.ino:100:6: error: 'void sendFrequency(double )' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void tfr_byte(byte)':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:129:6: error: redefinition of 'void tfr_byte(byte)'

AD9850_LCD_ROTARY_WM ENUS.ino:109:6: error: 'void tfr_byte(byte)' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void setincrement()':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:137:6: error: redefinition of 'void setincrement()'

AD9850_LCD_ROTARY_WM ENUS.ino:117:6: error: 'void setincrement()' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void showFreq()':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:155:6: error: redefinition of 'void showFreq()'

AD9850_LCD_ROTARY_WM ENUS.ino:175:6: error: 'void showFreq()' previously defined here

AD9850_LCD_ROTARY_WM ENUS_IF.ino: In function 'void storeMEM()':

AD9850_LCD_ROTARY_WM ENUS_IF.ino:181:6: error: redefinition of 'void storeMEM()'

AD9850_LCD_ROTARY_WM ENUS.ino:205:6: error: 'void storeMEM()' previously defined here

Ошибка компиляции.

Это сообщение будет содержать больше информации чем
"Отображать вывод во время компиляции"
включено в Файл > Настройки




вот скетч


/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
*/

// Include the library code
#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>

//Setup some items
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
int_fast32_t rx=7150000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 10; // starting VFO update increment in HZ.
int_fast32_t iffreq = 4192000; // Intermedite Frequency - Amount to subtract (-) from base frequency. ******************** ******************** ****
int buttonstate = 0;
int buttonstate2 = 0;
int GoIF = 1;
String hertz = "10 Hz";
int hertzPosition = 5;
byte ones,tens,hundreds,t housands,tenthousand s,hundredthousands,m illions ; //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.


int ForceFreq = 1; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



void setup() {
pinMode(A0,INPUT); // Connect to a button that goes to GND on push
pinMode(A5,INPUT); // IF sense ******************** ******************** ******
digitalWrite(A0,HIGH );
digitalWrite(A5,HIGH );
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);

// Load the stored frequency
if (ForceFreq == 0) {
freq = String(EEPROM.read(0 ))+String(EEPROM.rea d(1))+String(EEPROM. read(2))+String(EEPR OM.read(3))+String(E EPROM.read(4))+Strin g(EEPROM.read(5))+St ring(EEPROM.read(6)) ;
rx = freq.toInt();
}
}

void loop() {
// Update the display and frequency if the new Freq NEQ the old Freq
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}

// Rotate through the rate of tuning as you hold down the button
buttonstate = digitalRead(A0);
if(buttonstate == LOW) {
setincrement();
};

// Check for PIN low to drive IF offset Freq
buttonstate = digitalRead(A5);
if (buttonstate != buttonstate2){
if(buttonstate == LOW) {
lcd.setCursor(15,1);
lcd.print(".");
GoIF = 0;
buttonstate2 = buttonstate;
sendFrequency(rx);
}
else{
lcd.setCursor(15,1);
lcd.print(" ");
GoIF = 1;
buttonstate2 = buttonstate;
sendFrequency(rx);
};
};

// Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}

}


// Interrupt routine to catch the rotary encoder
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increm ent;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
}
}

// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
if (GoIF == 1){frequency=frequen cy-iffreq;}; //If pin = low, subtract the IF frequency.
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}

void setincrement(){
if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);
delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
millions = int(rx/1000000);
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" ");
if (millions > 9){lcd.setCursor(1,0 );}
else{lcd.setCursor(2 ,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredtho usands);
lcd.print(tenthousan ds);
lcd.print(thousands) ;
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz ");
timepassed = millis();
memstatus = 0; // Trigger memory write
};

void storeMEM(){
//Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
EEPROM.write(0,milli ons);
EEPROM.write(1,hundr edthousands);
EEPROM.write(2,tenth ousands);
EEPROM.write(3,thous ands);
EEPROM.write(4,hundr eds);
EEPROM.write(5,tens) ;
EEPROM.write(6,ones) ;
memstatus = 1; // Let program know memory has been written
};

R2DHG
13.03.2015, 14:23
В свежепоставленной IDE 1_6_1 оно без ошибок компилится, можно в отдельную папку ее заинсталлить по новой.

UV7QAE
13.03.2015, 14:41
Там ведь еще библиотеки подключается, их не забыли ?

#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>

gudzon-m
13.03.2015, 15:03
Заработало, но не понял в чем дело... видимо какой-то глюк
Спасибо

R2DHG
13.03.2015, 15:15
rotary нужно докинуть, остальные должны быть

gudzon-m
13.03.2015, 16:01
Протестировал эту (http://www.ad7c.com/projects/ad9850-dds-vfo/) конструкцию по всякому, работает стабильно, но выловлен глюк.
Дабы не вводить в заблуждение, скажу сразу, справа это дисплей частотомера, который измеряет частоту на выходе синтезатора.
Когда переключаешь шаг перестройки, например с 500 герц на 1 килогерц на дисплее остается артефакт от предыдущей записи.
По фотографиям думаю все понятно будет:

196848 196851 196852

196853 196854 196855

Я так понимаю после переключения шага нужно очищать строку?

R2DHG
13.03.2015, 16:08
Да, найдите в функции setincrement код

lcd.print(" ");

и поставьте пробелов побольше

lcd.print(" <много пробелов> ");

gudzon-m
13.03.2015, 16:14
Получилось, теперь нет артефактов. Думаю можно теперь описать данную прошивку и от нее отталкиваться для написания универсальной.
Как считаете?

R2DHG
13.03.2015, 16:29
Я думаю над ней надо изрядно поработать напильником чтобы стала похожа на универсальную.

gudzon-m
13.03.2015, 17:07
Это понятное дело, но начинать будем понемногу.
Сейчас хочу перевести комментарии и понять что где и как. Потом нужно ввести переключалку диапазонов и убрать лишние шаги перестройки. Я считаю что достаточно трех шагов, это:



10 герц
100 герц (должен включаться по умолчанию, хотя наверное правильней сделать запоминалку шага)
1 килогерц


По поводу переключения диапазонов, так как цифровые пины у нас закончились на дисплее, синтезаторе и валкодере, имею мысль сделать кнопки на аналоговые входы при помощи резистивного делителя. То есть на один вход посадить, например, пять кнопок через резисторы 100Ом 200Ом 500Ом 1Ком 2КОМ. Номиналы примерные, так как нужно подбирать экспериментально, для четкого распознавания уровня.
Еще нужно подумать как освободить один цифровой выход, для подключения регистра для ДПФ.
Как считаете?

R2DHG
13.03.2015, 17:22
Жесть какая, если пины уже кончились точно надо расширяться либо при помощи 595/165 регистров сдвига по SPI либо подобными pcf8574 по I2C, первые больше распространены (165 для кнопок, 595 для ДПФ и прочего, а pcf8574 универсальная)

Я откомментарю попозже тот код если надо.

gudzon-m
13.03.2015, 17:38
Расширяться не хотелось бы, лишние блочки городить, вот я и предложил как обойтись малой кровью.
Комментарии кода нужны обязательно. Вот начал понемногу переводить:


/*
Main code by Richard Visokey AD7C - www.ad7c.com (http://www.ad7c.com)
Revision 2.0 - November 6th, 2013
*/

// Include the library code
//Инициализация библиотек
#include <LiquidCrystal.h> //библиотека 1602
#include <rotary.h> //библиотека энкодера
#include <EEPROM.h> //библиотека EEPROM

//Setup some items
//Подключаем модуль синтезатора
#define W_CLK 10 // Pin 10 - connect to AD9850 module word load clock pin (CLK)
// Выыод 10 - подкоючаем к выводу W_CLK модуля синтезатора (таймер)
#define FQ_UD 11 // Pin 11 - connect to freq update pin (FQ)
// Выыод 11 - подкоючаем к выводу FQ_UD модуля синтезатора (обновление частоты)
#define DATA 12 // Pin 12 - connect to serial data load pin (DATA)
// Выыод 12 - подкоючаем к выводу DATA модуля синтезатора (загрузка данных)
#define RESET 13 // Pin 13 - connect to reset pin (RST)
// Выыод 13 - подкоючаем к выводу RESET модуля синтезатора (сброс)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
//Подключаем энкодер к 2 и 3 ножкам
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
//Подключаем 1602 дисплей к соответствующим пинам, указываем номера портовв порядке RS, E, DB4, DB5, DB6, DB7
int_fast32_t rx=7150000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
//Запуск синтезатора с этой частоты, единожды, для дальнейшего обращения используем переменную ForceFreq ниже
int_fast32_t rx2=1; // variable to hold the updated frequency
// Переменная для хранения новой частоты
int_fast32_t increment = 10; // starting VFO update increment in HZ.
// Установка шага на один щелчек энкодера при запуске
int_fast32_t iffreq = 4192000; // Intermedite Frequency - Amount to subtract (-) from base frequency. ******************** ******************** ****
// Здесь необходимо выставить частоту ПЧ в герцах
int buttonstate = 0;
int buttonstate2 = 0;
int GoIF = 1;
String hertz = "10 Hz";
int hertzPosition = 5;
byte ones,tens,hundreds,t housands,tenthousand s,hundredthousands,m illions ; //Placeholders
String freq; // string to hold the frequency
//Строка для хранения частоты
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.


int ForceFreq = 1; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



void setup() {
pinMode(A0,INPUT); // Connect to a button that goes to GND on push
pinMode(A5,INPUT); // IF sense ******************** ******************** ******
digitalWrite(A0,HIGH );
digitalWrite(A5,HIGH );
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);

// Load the stored frequency
if (ForceFreq == 0) {
freq = String(EEPROM.read(0 ))+String(EEPROM.rea d(1))+String(EEPROM. read(2))+String(EEPR OM.read(3))+String(E EPROM.read(4))+Strin g(EEPROM.read(5))+St ring(EEPROM.read(6)) ;
rx = freq.toInt();
}
}

void loop() {
// Update the display and frequency if the new Freq NEQ the old Freq
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}

// Rotate through the rate of tuning as you hold down the button
buttonstate = digitalRead(A0);
if(buttonstate == LOW) {
setincrement();
};

// Check for PIN low to drive IF offset Freq
buttonstate = digitalRead(A5);
if (buttonstate != buttonstate2){
if(buttonstate == LOW) {
lcd.setCursor(15,1);
lcd.print(".");
GoIF = 0;
buttonstate2 = buttonstate;
sendFrequency(rx);
}
else{
lcd.setCursor(15,1);
lcd.print(" ");
GoIF = 1;
buttonstate2 = buttonstate;
sendFrequency(rx);
};
};

// Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}

}


// Interrupt routine to catch the rotary encoder
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increm ent;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
}
}

// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
if (GoIF == 1){frequency=frequen cy-iffreq;}; //If pin = low, subtract the IF frequency.
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}

void setincrement(){
if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);
delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
millions = int(rx/1000000);
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" ");
if (millions > 9){lcd.setCursor(1,0 );}
else{lcd.setCursor(2 ,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredtho usands);
lcd.print(tenthousan ds);
lcd.print(thousands) ;
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz ");
timepassed = millis();
memstatus = 0; // Trigger memory write
};

void storeMEM(){
//Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
EEPROM.write(0,milli ons);
EEPROM.write(1,hundr edthousands);
EEPROM.write(2,tenth ousands);
EEPROM.write(3,thous ands);
EEPROM.write(4,hundr eds);
EEPROM.write(5,tens) ;
EEPROM.write(6,ones) ;
memstatus = 1; // Let program know memory has been written
};

R2DHG
13.03.2015, 17:44
Все равно ведь для ДПФ регистр подключать, а где один там и второй :-P

gudzon-m
13.03.2015, 17:51
А нельзя ли аналоговый вывод сделать цифровым? Например подтягивать его то к + питания то к массе?

ew2ah
13.03.2015, 18:04
А скиньте ссылку на схемку на нане, 9850 и с максом. Все компоненты есть но адрес затерялся,
пожалуйста!!!

Espresso
13.03.2015, 18:06
Номиналы примерные, так как нужно подбирать экспериментально, для четкого распознавания уровня.
Все уже придумано UR3LMZ&Co
196862

Boxer
13.03.2015, 18:07
Смысла нет, что то делать т.к. есть куча разных версий от разных авторов. Собирай только не ленись.

Владимир_К
13.03.2015, 18:07
Сделайте так же, чего зря кнопки давить?
Это же очень сложно, куды нам...

Espresso
13.03.2015, 18:10
Я считаю что достаточно трех шагов, это:
Аналогично, по опыту трансиверов SW лучшее количество шагов - 0. Т.е. динамически изменять шаг, отталкиваясь от скорости/ускорения вращения валкодера.
Ну и две кнопки UP&DOWN для переключения диапазонов. А частоту в каждом из диапазонов запоминать.

UT0UM
13.03.2015, 18:31
..., например, пять кнопок через резисторы 100Ом 200Ом 500Ом 1Ком 2КОМ. Номиналы примерные, так как нужно подбирать экспериментально, для четкого распознавания уровня...

все уже подобрано
оттуда же можно взять кусок кода, который обрабатывает эти кнопки и выдает номер нажатой

https://radioartisan.files.w ordpress.com/2011/03/k3ng-keyer-schematic-2012052101.png


А нельзя ли аналоговый вывод сделать цифровым? Например подтягивать его то к + питания то к массе?

можно

Вам бы вот это прочитать для начала http://arduino.ru/Reference
программить станет заметно проще

R2DHG
13.03.2015, 18:51
Смысла нет что то делать.
Можно точку прям тут поставить :-P Во многих случаях вообще купить готовое дешевле т.к. время - деньги. Мне кажется, если взять всех собирающих что то подобное и устроить опрос, то выяснится, что и трансивер этот многим не так чтобы нужен - уже есть готовый, а то и не один (кто то и в эфире не собирается работать особо). Это просто... паяльный зуд, а повторять 1 в 1 готовую конструкцию скучновато.

R1AIT
13.03.2015, 19:27
Можно точку прям тут поставить :-P Во многих случаях вообще купить готовое дешевле т.к. время - деньги. Мне кажется, если взять всех собирающих что то подобное и устроить опрос, то выяснится, что и трансивер этот многим не так чтобы нужен - уже есть готовый, а то и не один (кто то и в эфире не собирается работать особо). Это просто... паяльный зуд, а повторять 1 в 1 готовую конструкцию скучновато.
На трансиверах свет клином не сошелся. Много чего, в чем может быть потребность, готового может не оказаться. Да и с трансиверами тоже не все идеально. Особенно если он не только дома на столе используется. Да и чего только люди не придумают. Вот, например: http://www.knology.net/~gmarcus/

gudzon-m
13.03.2015, 22:25
Перевел сколько мог:


/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
*/

// Include the library code
//Инициализация библиотек
#include <LiquidCrystal.h> //библиотека 1602
#include <rotary.h> //библиотека энкодера
#include <EEPROM.h> //библиотека EEPROM

//Setup some items
//Настройка некоторых элементов
//Подключаем модуль синтезатора
#define W_CLK 10 // Pin 10 - connect to AD9850 module word load clock pin (CLK)
// Выыод 10 - подкоючаем к выводу W_CLK модуля синтезатора (таймер)
#define FQ_UD 11 // Pin 11 - connect to freq update pin (FQ)
// Выыод 11 - подкоючаем к выводу FQ_UD модуля синтезатора (обновление частоты)
#define DATA 12 // Pin 12 - connect to serial data load pin (DATA)
// Выыод 12 - подкоючаем к выводу DATA модуля синтезатора (загрузка данных)
#define RESET 13 // Pin 13 - connect to reset pin (RST)
// Выыод 13 - подкоючаем к выводу RESET модуля синтезатора (сброс)


#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
//Подключаем энкодер к 2 и 3 ножкам
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
//Подключаем 1602 дисплей к соответствующим пинам, указываем номера портовв порядке RS, E, DB4, DB5, DB6, DB7
int_fast32_t rx=7100000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
//Запуск синтезатора с этой частоты, единожды, для дальнейшего обращения используем переменную ForceFreq ниже
int_fast32_t rx2=1; // variable to hold the updated frequency
// Переменная для хранения новой частоты
int_fast32_t increment = 100; // starting VFO update increment in HZ.
// Установка шага на один щелчек энкодера при запуске
int_fast32_t iffreq = 1000000; // Intermedite Frequency - Amount to subtract (-) from base frequency. ******************** ******************** ****
// Здесь необходимо выставить частоту ПЧ в герцах
int buttonstate = 0;
int buttonstate2 = 0;
int GoIF = 1;
String hertz = "100 Hz";
int hertzPosition = 5;
byte ones,tens,hundreds,t housands,tenthousand s,hundredthousands,m illions ; //Placeholders
//Заполнители?
String freq; // string to hold the frequency
//Строка для хранения частоты
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
// Провести инициализацию ардуино в милисекундах после запуска
int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.
// Смотрим, в памяти значение старое или новое. 0 - Старое 1 -Новое


int ForceFreq = 1; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!
// Если установить 0 то при включении программа возьмет из памяти EEPROM последнее значение частоты, если 1 то стартует с частоты указанной 30 строке.
// Внимание, при первой прошивке и запуске значение в EEPROM нет, поэтому нужно выствить 1 прошить ардуино. Затем, если нужна память на последнюю частоту, выставить 0 в скетче и прошить ардуино снова.

void setup() {
pinMode(A0,INPUT); // Connect to a button that goes to GND on push
// Подключаем к кнопку которая при нажатии замыкает вывод А0 на общий провод
pinMode(A5,INPUT); // Подключаем к кнопку которая при нажатии замыкает вывод А5 на общий провод
digitalWrite(A0,HIGH ); //Подтягиваем вывод A0 к плюсу питания
digitalWrite(A5,HIGH ); //Подтягиваем вывод A5 к плюсу питания
lcd.begin(16, 2); //Указываем сколько у нас символов и строк на дисплее.
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(FQ_UD, OUTPUT); //Выставляем вывод как цифровой выход
pinMode(W_CLK, OUTPUT); //Выставляем вывод как цифровой выход
pinMode(DATA, OUTPUT); //Выставляем вывод как цифровой выход
pinMode(RESET, OUTPUT); //Выставляем вывод как цифровой выход
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
// Этот импульс необходим для последовательной шины, Datasheet страница 12.
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);

// Load the stored frequency
if (ForceFreq == 0) {
freq = String(EEPROM.read(0 ))+String(EEPROM.rea d(1))+String(EEPROM. read(2))+String(EEPR OM.read(3))+String(E EPROM.read(4))+Strin g(EEPROM.read(5))+St ring(EEPROM.read(6)) ;
rx = freq.toInt();
}
}

void loop() {
// Update the display and frequency if the new Freq NEQ the old Freq
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}

// Rotate through the rate of tuning as you hold down the button
buttonstate = digitalRead(A0);
if(buttonstate == LOW) {
setincrement();
};

// Check for PIN low to drive IF offset Freq
buttonstate = digitalRead(A5);
if (buttonstate != buttonstate2){
if(buttonstate == LOW) {
lcd.setCursor(15,1);
lcd.print(".");
GoIF = 0;
buttonstate2 = buttonstate;
sendFrequency(rx);
}
else{
lcd.setCursor(15,1);
lcd.print(" ");
GoIF = 1;
buttonstate2 = buttonstate;
sendFrequency(rx);
};
};

// Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}

}


// Interrupt routine to catch the rotary encoder
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increm ent;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
}
}

// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
if (GoIF == 1){frequency=frequen cy-iffreq;}; //If pin = low, subtract the IF frequency.
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}

void setincrement(){
if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);
delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
millions = int(rx/1000000);
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" ");
if (millions > 9){lcd.setCursor(1,0 );}
else{lcd.setCursor(2 ,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredtho usands);
lcd.print(tenthousan ds);
lcd.print(thousands) ;
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz ");
timepassed = millis();
memstatus = 0; // Trigger memory write
};

void storeMEM(){
//Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
EEPROM.write(0,milli ons);
EEPROM.write(1,hundr edthousands);
EEPROM.write(2,tenth ousands);
EEPROM.write(3,thous ands);
EEPROM.write(4,hundr eds);
EEPROM.write(5,tens) ;
EEPROM.write(6,ones) ;
memstatus = 1; // Let program know memory has been written
};


Прошу проверить мои догадки и по возможности помочь
Спасибо.

R2DHG
13.03.2015, 23:17
нормально :-P вот продолжение


void loop() {
// Обновляем частоту на дисплее и частоту синтезатора если она (частота) изменилась
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}

// Циклически меняем шаг перестройки при нажатии и удержании кнопки
buttonstate = digitalRead(A0);
if(buttonstate == LOW) {
setincrement();
};

// Проверяем уровень на выводе А5, если низкий - включаем отступ на ПЧ
// на дисплее остается частота приема, синтезатор получает "Частота приема - Частота ПЧ"
// (тут напутано вроде или я глючу ? вроде как наоборот низкий уровень - нет вычета ПЧ)
buttonstate = digitalRead(A5);
if (buttonstate != buttonstate2){
if(buttonstate == LOW) {
lcd.setCursor(15,1);
lcd.print(".");
GoIF = 0;
buttonstate2 = buttonstate;
sendFrequency(rx);
}
else{
lcd.setCursor(15,1);
lcd.print(" ");
GoIF = 1;
buttonstate2 = buttonstate;
sendFrequency(rx);
};
};

// Записываем частоту в постоянную память если она не изменнялась поседние 2 секунды
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}

}


// Процедура прерывания по событию изменение состояния энкодера
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increm ent;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // Верхний предел частоты
if (rx <=1000000){rx=rx2;}; // Нижний предел частоты
}
}

// вычисление частоты из даташита, стр. 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
if (GoIF == 1){frequency=frequen cy-iffreq;}; // Если на выводе А5 низкий уровень - вычитаем ПЧ
int32_t freq = frequency * 4294967295/125000000; // Для тактовой 125 МГц на AD9850. Можно слегка поиграться значением для более точной настройки.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Завершающий байт последовательности, 0 для AD9850 (1 для AD9851 если не путаю)
pulseHigh(FQ_UD); // Готово! Дергаем ножкой мк
}

// Передача байта по биту за раз в режиме "сначала младший" (LSB) на AD9850 через последовательую шину (DATA)
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); // после отправки каждого бита отправляем одиночный импульс высокого уровня на CLK
}
}

void setincrement(){
if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(hertzP osition,1);
lcd.print(hertz);
delay(250); // С помощью этой задержки можно менять скорость изменения шага при нажатой кнопке
};

void showFreq(){
millions = int(rx/1000000);
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" ");
if (millions > 9){lcd.setCursor(1,0 );}
else{lcd.setCursor(2 ,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredtho usands);
lcd.print(tenthousan ds);
lcd.print(thousands) ;
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz ");
timepassed = millis();
memstatus = 0; // Сигнализируем об изменении частоты и потенциальной необходимости ее записи в постоянную память
};

void storeMEM(){
//Записываем частоту в постоянную память (EEPROM) поразрядно (это коряво, но работает)
EEPROM.write(0,milli ons);
EEPROM.write(1,hundr edthousands);
EEPROM.write(2,tenth ousands);
EEPROM.write(3,thous ands);
EEPROM.write(4,hundr eds);
EEPROM.write(5,tens) ;
EEPROM.write(6,ones) ;
memstatus = 1; // Сигнализируем программе, что последние изменения частоты записаны в постоянную память (EEPROM)
};

gudzon-m
14.03.2015, 02:29
Спасибо, стало понятнее, потихоньку разбираюсь с кодом. Нашел все строки которые отвечают за переключение шага энкодера, написал комментарии и закомментировал эти строки. При необходимости по комментариям можно понять какие строки нужно раскомментить. На освободившееся место можно вывести S-meter, но не сейчас.
Теперь хочу ввести переключение диапазонов, для начала одной кнопкой, например на ноге A2
Подскажите пожалуйста, как это сделать?

Добавлено через 39 минут(ы):

Вот то, что пока получилось



/*
Main code by Richard Visokey AD7C - www.ad7c.com (http://www.ad7c.com)
Revision 2.0 - November 6th, 2013
*/
//Если необходима функция выбора шага энкодера на щелчек, Смотрим строки 57, 89 и 110
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
//Резерв для описания
// Include the library code
//Инициализация библиотек
#include <LiquidCrystal.h> //библиотека 1602
#include <rotary.h> //библиотека энкодера
#include <EEPROM.h> //библиотека EEPROM

//Setup some items
//Настройка некоторых элементов
//Подключаем модуль синтезатора
#define W_CLK 10 // Pin 10 - connect to AD9850 module word load clock pin (CLK)
// Выыод 10 - подкоючаем к выводу W_CLK модуля синтезатора (таймер)
#define FQ_UD 11 // Pin 11 - connect to freq update pin (FQ)
// Выыод 11 - подкоючаем к выводу FQ_UD модуля синтезатора (обновление частоты)
#define DATA 12 // Pin 12 - connect to serial data load pin (DATA)
// Выыод 12 - подкоючаем к выводу DATA модуля синтезатора (загрузка данных)
#define RESET 13 // Pin 13 - connect to reset pin (RST)
// Выыод 13 - подкоючаем к выводу RESET модуля синтезатора (сброс)


#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
//Подключаем энкодер к 2 и 3 ножкам
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
//Подключаем 1602 дисплей к соответствующим пинам, указываем номера портовв порядке RS, E, DB4, DB5, DB6, DB7
int_fast32_t rx=10000000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
//Запуск синтезатора с этой частоты, единожды, для дальнейшего обращения используем переменную ForceFreq ниже
int_fast32_t rx2=1; // variable to hold the updated frequency
// Переменная для хранения новой частоты
int_fast32_t increment = 100; // starting VFO update increment in HZ.
// Установка шага на один щелчек энкодера при запуске.
int_fast32_t iffreq = 1000000; // Intermedite Frequency - Amount to subtract (-) from base frequency. ******************** ******************** ****
// Здесь необходимо выставить частоту ПЧ в герцах
int buttonstate = 0;
int buttonstate2 = 0;
int GoIF = 1;
//String hertz = "100 Hz"; //Нужно для установки шага энкодера, при необходимости раскомментировать.
int hertzPosition = 5;
byte ones,tens,hundreds,t housands,tenthousand s,hundredthousands,m illions ; //Placeholders
//Заполнители?
String freq; // string to hold the frequency
//Строка для хранения частоты
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
// Провести инициализацию ардуино в милисекундах после запуска
int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.
// Смотрим, в памяти значение старое или новое. 0 - Старое 1 -Новое


int ForceFreq = 0; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!
// Если установить 0 то при включении программа возьмет из памяти EEPROM последнее значение частоты, если 1 то стартует с частоты указанной 30 строке.
// Внимание, при первой прошивке и запуске значение в EEPROM нет, поэтому нужно выствить 1 прошить ардуино. Затем, если нужна память на последнюю частоту, выставить 0 в скетче и прошить ардуино снова.

void setup() {
pinMode(A5,INPUT); // Подключаем к кнопку которая при нажатии замыкает вывод А5 на общий провод
digitalWrite(A5,HIGH ); //Подтягиваем вывод A5 к плюсу питания
lcd.begin(16, 2); //Указываем сколько у нас символов и строк на дисплее.
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(FQ_UD, OUTPUT); //Выставляем вывод как цифровой выход
pinMode(W_CLK, OUTPUT); //Выставляем вывод как цифровой выход
pinMode(DATA, OUTPUT); //Выставляем вывод как цифровой выход
pinMode(RESET, OUTPUT); //Выставляем вывод как цифровой выход
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
// Этот импульс необходим для последовательной шины, Datasheet страница 12.
lcd.setCursor(hertzP osition,1);
//lcd.print(hertz); //Начало настроек для выбора кнопки переключения шага энкодера----------------
//pinMode(A0,INPUT); // Connect to a button that goes to GND on push |
// Подключаем к кнопку которая при нажатии замыкает вывод А0 на общий провод |
//digitalWrite(A0,HIGH ); //Подтягиваем вывод A0 к плюсу питания |
//-------------------Окончание настроек для выбора кнопки переключения шага энкодера-----------------
// Load the stored frequency
//Загружаем сохраненную частоту
if (ForceFreq == 0) {
freq = String(EEPROM.read(0 ))+String(EEPROM.rea d(1))+String(EEPROM. read(2))+String(EEPR OM.read(3))+String(E EPROM.read(4))+Strin g(EEPROM.read(5))+St ring(EEPROM.read(6)) ;
rx = freq.toInt();
}
}


void loop() {
// Обновляем частоту на дисплее и частоту синтезатора если она (частота) изменилась
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}
//---------------------------------------------Начало участка кода для управления шагом щелчка энкодером.

// Циклически меняем шаг перестройки при нажатии и удержании кнопки, при необходимости раскомментировать
//buttonstate = digitalRead(A0);
//if(buttonstate == LOW) {
//setincrement();
//};

//void setincrement(){ //Здесь закомментированы шаги переключения энкодера, необходимое раскомментировать
//if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
//else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
//else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
//else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
//else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
//else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
//else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
//else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
//else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
//else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
//lcd.setCursor(0,1);
//lcd.print(" ");
//lcd.setCursor(hertzP osition,1);
//lcd.print(hertz);
//delay(250); // С помощью этой задержки можно менять скорость изменения шага при нажатой кнопке
//};
//---------------------------------------------Окончание участка кода для управления шагом щелчка энкодером.



// Проверяем уровень на выводе А5, если низкий - включаем отступ на ПЧ
// на дисплее остается частота приема, синтезатор получает "Частота приема - Частота ПЧ"
// (тут напутано вроде или я глючу ? вроде как наоборот низкий уровень - нет вычета ПЧ)
buttonstate = digitalRead(A5);
if (buttonstate != buttonstate2){
if(buttonstate == LOW) {
lcd.setCursor(15,1);
lcd.print(".");
GoIF = 0;
buttonstate2 = buttonstate;
sendFrequency(rx);
}
else{
lcd.setCursor(15,1);
lcd.print(" ");
GoIF = 1;
buttonstate2 = buttonstate;
sendFrequency(rx);
};
};

// Записываем частоту в постоянную память если она не изменнялась поседние 2 секунды
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}

}


// Процедура прерывания по событию изменение состояния энкодера
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increm ent;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // Верхний предел частоты
if (rx <=1000000){rx=rx2;}; // Нижний предел частоты
}
}

// вычисление частоты из даташита, стр. 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
if (GoIF == 1){frequency=frequen cy-iffreq;}; // Если на выводе А5 низкий уровень - вычитаем ПЧ
int32_t freq = frequency * 4294967295/125000000; // Для тактовой 125 МГц на AD9850. Можно слегка поиграться значением для более точной настройки.
for (int b=0; b<4; b++, freq>>=8) {
tfr_byte(freq & 0xFF);
}
tfr_byte(0x000); // Завершающий байт последовательности, 0 для AD9850 (1 для AD9851 если не путаю)
pulseHigh(FQ_UD); // Готово! Дергаем ножкой мк
}

// Передача байта по биту за раз в режиме "сначала младший" (LSB) на AD9850 через последовательую шину (DATA)
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); // после отправки каждого бита отправляем одиночный импульс высокого уровня на CLK
}
}

void showFreq(){ //Вывод частоты в верхнюю строку
millions = int(rx/1000000); //Показать колличество мегагерц на верхнюю строку
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" "); //Пустой символ перед частотой для выравнивания надписи в верхней строке
if (millions > 9){lcd.setCursor(1,0 );}
else{lcd.setCursor(2 ,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredtho usands);
lcd.print(tenthousan ds);
lcd.print(thousands) ;
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz "); //Вывод на дисплей Mhz после частоты в первой строке
timepassed = millis();
memstatus = 0; // Сигнализируем об изменении частоты и потенциальной необходимости ее записи в постоянную память
};

void storeMEM(){
//Записываем частоту в постоянную память (EEPROM) поразрядно (это коряво, но работает)
EEPROM.write(0,milli ons);
EEPROM.write(1,hundr edthousands);
EEPROM.write(2,tenth ousands);
EEPROM.write(3,thous ands);
EEPROM.write(4,hundr eds);
EEPROM.write(5,tens) ;
EEPROM.write(6,ones) ;
memstatus = 1; // Сигнализируем программе, что последние изменения частоты записаны в постоянную память (EEPROM)
};

R2DHG
16.03.2015, 04:23
Продолжим

Для экономии ножек сделал кнопки вот по такой схеме, вроде нормально работают (забыл еще нарисовать конденсатор 0.03 - 0.1, висящий на A0). Почему именно такие номиналы не скажу - потыкал что под рукой было :-P Можно другие натыкать, в скетче включить вывод значения АЦП на LCD (там есть, только комментарии снять) и поправить табличку значений для кнопок в #define

http://i.imgur.com/lfuxUdr.jpg

Добавлен S-метр, исправлены какие то баги. Соответствие уровня на входе АЦП реальным значениям S настраивается через #define.
Кнопка "кейпада" пока используется одна (нижняя по схеме) для переключния шага перестройки, после переключения новый шаг высвечивается 1.5 секунды (меняется в #define), затем перекрывается S-метром.
A0 - "кейпад" по вышеприведенной схеме
A1 - управление вычетом ПЧ (по умолчанию нога притянута к + и вычета нет, если нужен - посадить на 0)
A2 - вход S-метра
Код под AD9851, для AD9850 нужно поменять пару строк в sendFrequency() - закомментарить для AD9851 и убрать комментарий "//" с соседних для AD9850 (потом через #define сделаю)

Длина сообщений ограничена и скетч уже не лезет, можно взять тут:

https://cloud.mail.ru/public/ae6626b38f21/LCD_AD9851_Encoder.i no

UT0UM
16.03.2015, 04:54
...
Для экономии ножек сделал кнопки вот по такой схеме, вроде нормально работают (забыл еще нарисовать конденсатор 0.03 - 0.1, висящий на A0). Почему именно такие номиналы не скажу - потыкал что под рукой было...

нижний резистор лишний
а R7 лучше взять побольше, чтобы когда кнопки не нажаты ток был меньше

hamster
16.03.2015, 07:22
А скиньте ссылку на схемку на нане, 9850 и с максом. Все компоненты есть но адрес затерялся,
пожалуйста!!!
https://drive.google.com/folderview?id=0B2F3d fN081F9V2MwMXhXcndQa 2s&usp=sharing
Жрёт много электричества, до полуампера...

Jose
16.03.2015, 07:40
http://www.cqham.ru/forum/showthread.php?27670-%CD%E5%F1%EA%EE%EB%F C%EA%EE-%EF%F0%EE%E5%EA%F2%E E%E2-%ED%E0-Arduino

R2DHG
16.03.2015, 10:01
нижний резистор лишний
а R7 лучше взять побольше, чтобы когда кнопки не нажаты ток был меньше
да, точно

Думаю посадить регистры для управления ДПФ на те же ноги, что и DDS. A4/A5 останутся, например, для управления si570 и еще чем нибудь по I2C (можно и сюда ДПФ, но I2C расширители портов - это скорее экзотика судя по другим проектам, а обычные 595е регистры наверное есть у всех). Куда бы вывести USB/LSB/CW/... - ужать в нижней строке S-метр как нибудь ? (Выглядит сейчас примерно так: _#########_9+20_)

Ног не хватает... включение/отключение +/- ПЧ внешним сигналом сильно нужно ?

RA4HTN
16.03.2015, 11:01
+/- ПЧ внешним сигналом сильно нужноэто очень хорошая функция для CW, даже намного нужнее, чем s-metr, т.к. позволяет упроcтить формирование CW. C-метр легко собрать на отдельном блоке или стрелочном мА
по расширению кроме переключения ДПФ синтезатору ничего особо не нужно, не нужен и прямой ввод частоты с кнопок - если есть переключение по бендам.
еще нужно освободить место для введение RIT, расстройки, без него тоже не очень:( Наличие функции расстройки увеличит гибкость и ценность конструкции.
Переключение LSB, USB, СW, АМ тоже нужно, чтобы корректно отображать частоту в зависимости от режима. LSB, USB частота по подавленной несущей.
В хорошем синтезаторе еще должен быть выбор:использовать стандартную раскладку на нижних бендах ГПД =f+ПЧ, на верхних f-ПЧ или свою заданную.
Если будете дальше после DDS развивать проект для si570, то надо предусмотреть отображение выходной частоты с делением на 2, на 4, на 8, т.к. некоторые чипы способны работать до 1 ГГц и радиолюбитель получит возможность поделить выходной сигнал синтезатора для уменьшения фазового шума.

R2DHG
16.03.2015, 14:04
Жуткий индикатор этот. Большой, дешевый, но места то особо и нет. Я вот его купил когда - поигрался чуть чуть и сразу заказал пару графических. Буду думать как впихнуть невпихуемое в 2 строки (если S-метр убрать то конечно можно).
Деления наверное в любом случае пригодятся, может кто то что то прямого преобразования соберет. В данном проекте это тоже можно в код засунуть и где нибудь #define с описанием.

RA4HTN
16.03.2015, 14:40
Зато он распространенный и дешевый, все нужное там можно уместить, если конечно отбросить все графические плюшки. S-метр полноценный в этом малом месте все одно не получится сделать, чтобы было 5, 6,7,8,9 +10,+20, если только не бегающей строкой, а просто цифру выводить - вот так может...
просто два-четыре знака фиксированных справа на нижней строке S5,S6, S9, S+20
есть там сегменты для такой реализации?