Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

000001В довершение статьи про генерацию звука с помощью AVR микроконтроллера, появилась новая версия прошивки. Прошивка стала намного больше и сложнее.

Однако, процесс написания своих мелодий более понятный, доступна 1 и 2 октава целиком, длительности нот и пауз регулируются, можно изменять темп мелодий.

Возьмем пример всем известной мелодии Nokia tune

nokia

Открываем проект, в нем будет 3 файла, нам нужен songs.c. В нем уже есть несколько мелодий, одна из них та самая мелодия нокии. Выглядит она так:

int nokia[]={120.000,P,N8,E2,N8,D2,N8, F1d,N4,G1d,N4,C2d,N8,H1,N8,D1,N4,E1,N4,H1,N8,A1,N8,
C1d,N4,E1,N4,A1,N4,End};

Расшифровать ее просто:

Первый элемент массива это темп — количество ударов в минуту, здесь темп равен 120 ударов.

Второй элемент P — это пауза, все мелодии должны начинаться с паузы.

Третий элемент — N8 это длительность паузы, N4 — четвертная, N8- восьмая, N16 — шестнадцатая.

Четвертый элемент — первая нота, ми второй октавы.

Обозначения для нот: C-до, D-ре, E-ми, F-фа, G-соль, A-ля, H-си. Цифра после ноты — октава, если после ноты стоит d значит диез (бемолей нет). Пример E2 — ми второй октавы, F1d — фа диез первой октавы.

Пятый элемент — длительность ноты, по аналогии с паузой. Т.е. сочетание E2,N8 означает восьмая ми второй октавы.

Остальные элементы по аналогии, сначала нота, потом ее длительность.

Последний элемент массива всегда End.

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

int *playlist[]= {mortal,
nokia,
miniPolka,
bumer,
mario,
tanki
};

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

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

Update:

Для перевода нот в массив находите нужные ноты, соотносите их названиям нот на рисунке. Заносите в массив. После H1 ноты повторяются, т.е. С2, D2(октавой выше) т.п. Если перед нотой попадается решеточка (диез) значит нота звучит на пол тона выше, #C1 запишется как C1d.

 7-2-2

18 комментариев: Урок 7.2 Генерация звука при помощи AVR микроконтроллера. Продолжение

  • Здравствуйте! Спасибо Вам за уроки, очень интересно по вашим урокам делать первые шаги. Хочу сделать часы с будильником и на мелодию будильника поставить марио, как в ваших уроках.
    Но вот появились у меня сомнения. Прерывание какого таймера главнее, первого или второго? И не будет ли команда #asm(«cli») отключать оба прерывания. Я хочу сделать так чтобы прерывание таймера для часов было главнее чем прерывание таймера для генерации звука и чтобы команда #asm(«cli») из генерации звука не вмешивалась в программку для работы часов. Как бы это все грамотно сделать с прерываниями таймера?

  • команда #asm(«cli») будет отключать оба прерывания, какое из них главнее можно посмотреть в даташите. Чтобы они не мешали друг другу можно поставить микросхему часов ds1307, либо ставить 2 мк

  • Все понял. Спасибо!

  • void play()
    {
    OCR1AH = (char)(Bit>>8); //записываем текущую ноту в OCR1A
    OCR1AL = (char)Bit;
    Уважаемый админ, поясните пожалуйста процесс записи в таймер и к чему в скобках указано char?

  • Первый вопрос снят, а вот вопрос с (char) остался.

  • char это 8 бит, число Bit 16битное, для того чтобы отбросить старший байт используется приведение типов, посмотрите пример здесь http://avr-start.ru/?p=904

  • «Открываем проект, в нем будет 3 файла» — что то я не вижу ссылки на скачивание!!!

  • Находишь в тексте строку: «Скачать файл протеуса и прошивку можно тут». Под словом ТУТ спрятан архив 😉 .


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

    Используйте макрос PROGMEM (запись переменных во flash) и CONST. Читать данные по адресу &DATA.

  • Александр, статья мохнатого года, конечно правильнее хранить во флеше, кстати в CAVR достаточно при объявлении задать const.

  • Подскажите пожалуйста, вы кажется приводили сайт с нотами или чем то еще в пример… был вроде такой комментарий, но я что-то не нашел… 🙄

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

  • 😀 вполне возможно что меня глюкануло) было давно) Простите за наглость, а вы убрали файл с прошивкой в этой статье?) 🙄 либо у меня браузер не отображает, хотя в других уроках прошивка есть)

  • 😆 увидел спасибо)

  • Подскажите пожалуйста. Допустим мне понравилась мелодия, открыл значит нотный стан на неё) а она состоит из 2 нотных станов объединенных скобочкой, это как бы значит два голоса? А на микроконтроллере мы играем как бы один, так?)

  • да, если нужна полифония, то тут уже надо заморочиться.

  • 😡 все ломаю голову над музыкальной грамотой)Вообще музыканты говорят что длительность нот не связана с темпом. у вас как я понял (playlist[trackN][0]/60.000); мы как бы делим темп( первый элемент массива ) на 60.000. Правильно?

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика