?нтересное и необходимое направление, которое я считаю нужным осветить — это, конечно же, запись, хранение и воспроизведение звука. Цифровые диктофоны, автоответчики, голосовые меню, устройства оповещения, дверные звонки, игрушки — вот далеко не полный перечень устройств, где необходимо решать проблему записи, хранения и воспроизведения звука. Для решения такого вопроса воспользуемся существующими наработками ATMEL, а именно AVR335. Для тех, кто не дружит с английским имеется перевод на сайте gaw.ru. Скажу вам стоит распечатать этот документ — получится хороший годный учебник в виде брошюры.
Вот такой как у меня:
Вообще, коллеги, у меня масса подобных самодельных брошюр и даже книг. Брошюрами я сшиваю разделы даташитов на АРМ-ы (для АВР имеется книга Евстифеева А.В.), мануалы и аппноуты на некоторые комплектующие. Книгами оформил Ю. Ревича, Д. Трампета и некоторые другие.
В документе AVR335 понятным языком подробно расписаны процессы записи, хранения и воспроизведения звука, при использовании любого микроконтроллера AVR с АЦП, памяти AT45DB161 DataFlash и нескольких внешних компонентов. Это руководство подробно описывает использование: АЦП для записи звука, последовательного интерфейса (SPI) для доступа к внешней памяти DataFlash и широтно-импульсной модуляции (Ш??М) для воспроизведения. В нём также доходчиво определены технические термины по теме.
В AVR335 используется уже устаревший контроллер AT90S8535. Без изменений кода схему можно реализовать на ATmega8535, но у меня имеется прекрасный модуль ATmega128kit, на котором уже установлена память, все кнопки, светодиоды и прочее. Поэтому я переписал исходный код для микроконтроллера ATmega128 в привычном мне WinAVR. Память, установленная на борту кита, — это AT45D321D. Её объём в два раза больше (32 мегабита) чем у использованной в аппноуте, т.е. можно записать не 4 1/4 минут, а 8 с половиной, что вполне достаточно для большинства конструкций. Для преобразования выходного Ш?М-а в звук я собрал фильтр Чебышева, предложенный в аппноуте. В состав этой платы также входит микрофонный усилитель собранный на первом ОУ из четырёх составляющих LM324. Вот её вид со стороны элементов:
А здесь со стороны печати:
Собирался этот фильтр из деталей, которые были под рукой, поэтому наблюдаем и выводные элементы, и смд-шные.
Кроме того, чтобы выводить звук на динамик,а не на наушники, я собрал простейший УНЧ на микросхеме LM386 согласно типовой схеме.
Потом всё это добро слепил в макет:
Динамик и микрофон китайские из подножного корма 🙂 В аппноуте предлагается тактировать микроконтроллер кварцем 8МГц, но на ATmega128kit у меня установлен 14,7456 МГц (для целых скоростей UART-а). Поэтому я включил внутренний RC-генератор на 8 МГц. Конечно это немного повлияло на качество звука, но не столь существенно. Да и целью я определял не законченную конструкцию, а отработку упражнения по записи, хранению и сохранению звука.
?сходный код на Си хорошо прокомментирован — на каждой строке имеется пояснение действий. Коды команд для AT45D321D совершенно одинаковы с предложенным AT45DB161 , поэтому в файле «dataflash.h» не пришлось ничего менять. Знаю, что народ попросит схему макета. Даю 🙂
Схема платы ATmega128kit в соответствующей статье. В архиве выкладываю исходные коды, платы фильтра Чебышева-микрофонного усилителя и УНЧ LM386 в формате SL. ?нтересно, что прошивка занимает меньше 1 килобайта, а значит можно использовать практически любую ATtiny с АЦП на борту и необходимым количеством ног!
? напоследок ещё раз повторюсь — прочитайте внимательно упомянутую мною статью на gaw.ru! Там работа всего устройства, алгоритмы, методы обработки, хранения, воспроизведения расписаны очень понятно! Успехов, коллеги!
Здравствуйте. Пытаюсь реализовать данный проект на atmega8, сделал платку распаял начал переделывать программу, и возник ряд вопросов. Не могу понять зачем в проекте активируется аналоговый компаратор, но не используется? ? так понимаю в процессе записи и стирания вывод флэша RDY/BUSY должен быть в низком состоянии (но у меня он почему то в низком только в процессе стирания). Заранее спасибо.
1. Читаем внимательно комментарии к исходнику:
ACSR |= (1<<ACD);//вЫключаем компаратор
2. При любом действии с флешем указанный вывод анализируется, т.е. используется (а значит изменяется).
По поводу компаратора я не правильно выразился, в функции стирания используем регистр компаратора:
(ACSR |= 0x02; // установка флага, показывающего, что следующим этапом должна быть запись данных )
— это я так понимаю для обозначения что память стерта? А потом в функции записи
(if((ACSR & 0x02)) // если флаг установлен, то новые данные должны быть установлены
{
buffer_counter = 0;
page_counter = 0; // сброс счётчика если должны быть записаны новые данные
ACSR &= 0xFD; // очистка флага сигнала
}) — это проверяем «начать запись заново» или «продолжить» ?
? ещё вопрос по поводу Ш?М, я использовал вывод не OCR1B для него, а OCR1A, это же не принципиально?
Цитата из моей статьи: «… ? напоследок ещё раз повторюсь — прочитайте внимательно упомянутую мною статью на gaw.ru! Там работа всего устройства, алгоритмы, методы обработки, хранения, воспроизведения расписаны очень понятно! …»
Цитата из упомянутой на гав.ру статьи: «…В этом примере приведены два способа применения флага состояния.
Первый способ – использование глобальной переменной (т.е. переменная «wait» используется в подпрограмме «playback»). Второй способ – использование незадействованного бита в регистре. В подпрограмме «стирания», используется бит ACIS1 (регистра управления и состояния аналогового компаратора (ACSR))для отображения того, что следующими этапом должно быть сохранение новых данных. …»
По поводу Ш?М — вывод не принципиален.
Удачи, коллега!