Радиолоцман Электроника en
расширенный поиск +
  

20-11-2010

DDS генератор на микроконтроллере ATmega16. Часть 2. Программное обеспечение для микроконтроллера

В первой части мы рассмотрели схемотехническое решение и конструкцию DDS генератора на микроконтроллере ATmega16.

Программное обеспечение для микроконтроллера. Основные моменты

Как упоминалось в первой части статьи, алгоритм работы DDS генератора, автором которого является Jesper Hansen, был немного переработан и адаптирован под компилятор WinAVR. Рассмотрим эти отличительные моменты.

Основной момент – это введение дополнительного кода на ассемблере, который позволил остановить генерацию при нажатии кнопки Start/Stop. В функции проверяется состояние бита CPHA в регистре SPCR, который устанавливается в обработчике внешнего прерывания (кнопка Start/Stop подключена к выводу внешнего прерывания INT0). В итоге алгоритм займет 10 тактов процессора, вместо 9.

void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)
{
asm volatile( “eor r18, r18 ;r18<-0″ “ ” “eor r19, r19 ;r19<-0″ “ ” “1:” “ ” “add r18, %0 ;1 cycle” “ ” “adc r19, %1 ;1 cycle” “ ” “adc %A3, %2 ;1 cycle” “ ” “lpm ;3 cycles” “ ” “out %4, __tmp_reg__ ;1 cycle” “ ” “sbis %5, 2 ;1 cycle if no skip” “ ” “rjmp 1b ;2 cycles. Total 10 cycles” “ ” : :”r” (ad0),”r” (ad1),”r” (ad2),”e” (signal),”I” (_SFR_IO_ADDR(PORTA)), “I” (_SFR_IO_ADDR(SPCR)) :”r18″, “r19″ );}

Следующий момент – таблица значений сигналов для прямого синтеза. Данная таблица определена в Flash-памяти по адресу с началом 0xXX00. Поэтому необходимо в make-файле определить эту секцию с целью правильного распределения памяти:

#Define sections where to store signal tables
LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
LDFLAGS += -Wl,-section-start=.MySection6=0x3F00

Библиотека управления ЖК дисплеем – AVR-GCC 4 bit and 8 bit LCD.

Все режимы работы и настройки отображаются на дисплее. Управление осуществляется с помощью пяти кнопок. Кнопки Up (вверх) и Down (вниз) используются для перемещения между пунктами меню, кнопки Left (влево) и Right (вправо) используются для изменения значения частоты. Кнопка Start/Stop – запускает/останавливает генерацию.

Вид меню генератора сигналов

DDS генератор на Atmega16: вид меню на ЖК дисплее

Стоит заметить, что имеется отдельный пункт меню, в котором изменяется шаг перестройки частоты (Freq Step). Данная опция позволяет менять значение частоты для всех сигналов в широком диапазоне с минимальным количеством нажатий кнопок и переходов по меню.

При генерации шума настройки частоты не требуется – используется простая функция генерации случайного числа, результат которой непрерывно поступает на выход DDS.

Значение частоты высокочастотного сигнала можно выбрать 1 МГц, 2 МГц, 4 МГц и 8 МГц.

Результаты

Работа генератора была проверена с помощью осциллографа и частотомера. На изображениях ниже – вид формы сигнала и основные параметры на осциллографе.

DDS генератор на Atmega16: Синусоидальный сигнал
Синусоидальный сигнал
DDS генератор на Atmega16: сигнал прямоугольной формы
Сигнал прямоуголной формы
DDS генератор на Atmega16: сигнал треугольной формы
Сигнал треугольной формы
DDS генератор на Atmega16: сигнал пилообразной формы
Сигнал пилообразной формы
DDS генератор на Atmega16:  шум
Шум
DDS генератор на Atmega16: высокочастотный сигнал 1 МГц
Высокочастоный сигнал 1 МГц

Загрузки

Текст исходного кода и hex-файл – скачать

scienceprog.com

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: AVR DDS signal generator V2.0 Part 2. Firmware

Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Ребята, кто генерировал ЭКГ-сигнал?
  • A Почему на AVR ? куда приятней это на PIC .
  • Здравствуйте! Тема жива еще? Собрал вторую версию генератора, работает только дисплей, кнопки и высокочастотный выход, на выходе с ЦАП только уровень 5в, самого сигнала нет.. Использовал Atmel studio 6, для прошивки стенд Stk 500, есть предположение что с фьюзами что то не так.. И в атмеле они выставляются как то по другому, с параметрами..
  • Я, к сожалению 6 студию не использую, поэтому подсказать установки Fuse-битов в ней не смогу. Выложите скрин, посмотрим... И еще один момент, а зачем вы использовали среду Atmel Studio 6. В качестве программатора или вы вносили изменения в исходный код и компилировали его? Ведь к статье есть готовый hex-файл для прошивки.
  • Сегодня зашил hex, который шел в статье, заработал генератор, все генерируется.. но все таки, стало интересно, почему не работает мой проект, сгенерированный в атмел студио? посмотрел hex файлы дисассемблером, в моем hex файле последний адрес 0x3076, а в вашем 0x2A56, и размер соответственно меньше. Что странно, код то одинаковый, думаю различие в make файлах, может я что то не добавил туда? про адреса секции(mysection), как и говорилось, добавил код. И еще, когда зашиваю свой hex, ругается на память мол выхожу за границы flash.. Может знаете почему так? Если нужны скрины, могу выложить.
  • Я не могу точно сказать в чем дело, ибо не видел в глаза 6 студию... Может быть дело в настройках оптимизации, может в make-файле не тот кристалл определен... может версия компилятора более свежая... Компилируется ведь в 6 студии без ошибок... Видимо все же придется мне ставить Atmel Studio 6, а то смотрю все больше и больше проектов в ней...
  • Vadzz, мир не стоит на месте) на официальном сайте атмела уже более раннюю версию нельзя скачать.. хочешь не хочешь, рано или поздно придется ставить новый софт.. По теме, так и не разобрался в чем дело( а что именно с оптимизацией не так может быть? вечером выложу свой make-фаил..
  • Конечно, я все это понимаю. Но вот видите, что происходит со старыми проектами в новой студии. Будет свободное время, поставлю ее и тоже начну разбираться с исходником на примере этого DDS генератора. Я думаю, если вы что-то узнаете, то поделитесь инфой...
  • Make-фаилы. Что заметил, в astudio6 нет такого: :LDFLAGS += -Wl,-Map=DDS_ver2.map LDFLAGS += -Wl,-section-start=.MySection1=0x3A00 LDFLAGS += -Wl,-section-start=.MySection2=0x3B00 LDFLAGS += -Wl,-section-start=.MySection3=0x3C00 LDFLAGS += -Wl,-section-start=.MySection4=0x3D00 LDFLAGS += -Wl,-section-start=.MySection5=0x3E00 LDFLAGS += -Wl,-section-start=.MySection6=0x3F00 Добавил их через toolchain, в сегмент Flash, но к сожалению, та же картина( И еще при компиляции выскакивает такое: Warning 1 #warning "F_CPU not defined for <util/delay.h>" [-Wcpp] c:\program files\atmel\atmel toolchain\avr8 gcc\native\3.4.2.1002\avr8-gnu-toolchain\bin\../lib/gcc/avr/4.7.2/../../../../avr/include/util/delay.h 90 3 DDS avr
  • С make-файлами вроде все ОК. Предупреждение Warning выскакивает из-за того, что в исходнике или в настройках проекта в студии не установлен параметр F_CPU - тактовая частота МК, значение которого используется при расчете функций задержек (delay.h). Попробуйте в исходнике вставить строчку: #define F_CPU 16000000UL. Или указать тактовую частоту МК в настройках проекта в студии.
  • C warning ом разобрался, спасибо. Но ошибка осталась, вот скрин. После того как зашиваю hex, игнорируя эту ошибку, дисплей работает, кнопки тоже, а вот сигнала нет..
  • Блин я запутался... 1. Вы собираете вторую версию генератора (а обсуждение ведется для первой версии), правильно? 2. Где вы брали исходник и make-файл, из статьи http://www.rlocman.ru/shem/schematics.html?di=70216 или брали мой готовый вариант, который я скомпилировал в связи с изменениями и выложил http://www.rlocman.ru/forum/showpost...0&postcount=31 3. В 6 студии можно выбрать для компиляции внешний make-файл? Смотрите, в make-файле прописываются адреса областей Flash-памяти, где хранятся таблицы данных для генерирования сигналов, возможно эти адреса игнорируются студией при компиляции (или она не понимает этого указания) и тогда возможно появление такой ошибки, я так думаю... Если будет время, сегодня усановлю 6 студию и буду разбираться... Добавлено 5.02.2014 8:49 Нет, к сожалению, я не буду устанавливать 6 студию. Вот почитал о ней на форумах и встретил множество так сказать отрицательных отзывов. Извините :(.
  • Распутываю:) 1. Вторая версия генератора, обсуждение тоже и прошивка соответственно. 2. Брал ваш готовый вариант. 3. Не уверен точно, сегодня попробую, но вроде как можно. Я скидывал make-фаилы в предыдущих сообщениях, и что интересно, в вашем есть адреса областей flash памяти, а в моем - нет. Добавлял адреса областей flash в свой make-фаил вручную, но при компиляции студия затирает их.. Решил так эту проблему (скриншот прилагается). А что такого плохого в 6 студии?
  • А теперь при таком указании областей Flash, что студия говорит при программировании МК? Опять выходим за область доступной памяти? Что плохого в 6 студии http://kazus.ru/forums/showthread.php?t=94871
  • Да, к сожалению опять не помещаемся в память... Даже и не знаю что делать уже( Подозреваю что дело в настройках атмела.. вот только что и как настраивать не разобрался еще.. А вы на 4 студии работаете?
  • Да, у меня студия 4.16. Может обновлю потом до 4.19, если найду. Я во многих случаях пользуюсь JTAG-ом (JTAG ICE) и это одна из основных причин, почему не хочу 6 версию (она не поддерживает этот JTAG). Да и не разрабатываю я супер-мега проекты на микроконтроллерах, так для себя в основном...
  • Доброго Всем дня!! Что то тема заглохла?? А вот у меня есть вопрос-ктонибуть делал прошивку под однострочник с контроллером HD44780??? Что то жалко расходовать 2-х строчник. Тем более что вся выводимая инфа помещается на одной строке(1*16).
Полный вариант обсуждения »
Рекомендуемые публикации по теме:
Форум  »
Обсуждение: DDS генератор на микроконтроллере ATmega16. Часть 1. Схемотехническое решение
Схемы  »
DDS генератор на микроконтроллере ATmega16. Часть 1. Схемотехническое решение
Форум  »
Обсуждение: DDS генератор на микроконтроллере ATmega16. Второй вариант конструкции
Схемы  »
DDS генератор на микроконтроллере ATmega16. Второй вариант конструкции
Схемы  »
Версия DDS генератора на микросхеме AD9833 и микроконтроллере AT90USB162

При перепечатке материалов с сайта прямая ссылка на РадиоЛоцман обязательна.

Приглашаем авторов статей и переводов к публикации материалов на страницах сайта.

Срезы ↓
Датчики влажности и температуры ДВТ-03
Цена: от 3 168 руб.
Доставка: Россия и страны СНГ
DIY настольный 3D принтер
Цена: 163 $ (9500 руб.)
Промо-акция, последняя скидка
Очки с подсветкой и сменными окулярами
Цена: от 8 $ (477 руб.)
Бесплатная доставка: Весь мир
радиолоцман вконтакте радиолоцман одноклассники радиолоцман facebook радиолоцман twitter радиолоцман google плюс