рефераты рефераты
Главная страница > Дипломная работа: Разработка музыкального звонка с двумя режимами работы: автономным и от сети  
Дипломная работа: Разработка музыкального звонка с двумя режимами работы: автономным и от сети
Главная страница
Банковское дело
Безопасность жизнедеятельности
Биология
Биржевое дело
Ботаника и сельское хоз-во
Бухгалтерский учет и аудит
География экономическая география
Геодезия
Геология
Госслужба
Гражданский процесс
Гражданское право
Иностранные языки лингвистика
Искусство
Историческая личность
История
История государства и права
История отечественного государства и права
История политичиских учений
История техники
История экономических учений
Биографии
Биология и химия
Издательское дело и полиграфия
Исторические личности
Краткое содержание произведений
Новейшая история политология
Остальные рефераты
Промышленность производство
психология педагогика
Коммуникации связь цифровые приборы и радиоэлектроника
Краеведение и этнография
Кулинария и продукты питания
Культура и искусство
Литература
Маркетинг реклама и торговля
Математика
Медицина
Реклама
Физика
Финансы
Химия
Экономическая теория
Юриспруденция
Юридическая наука
Компьютерные науки
Финансовые науки
Управленческие науки
Информатика программирование
Экономика
Архитектура
Банковское дело
Биржевое дело
Бухгалтерский учет и аудит
Валютные отношения
География
Кредитование
Инвестиции
Информатика
Кибернетика
Косметология
Наука и техника
Маркетинг
Культура и искусство
Менеджмент
Металлургия
Налогообложение
Предпринимательство
Радиоэлектроника
Страхование
Строительство
Схемотехника
Таможенная система
Сочинения по литературе и русскому языку
Теория организация
Теплотехника
Туризм
Управление
Форма поиска
Авторизация




 
Статистика
рефераты
Последние новости

Дипломная работа: Разработка музыкального звонка с двумя режимами работы: автономным и от сети

Код тона помещается в регистр YL (строка 91), а адрес начала таблицы — в регистровую пару Z (строки 92, 93). Вызов подпрограммы addw производится в строке 94. В регистровой паре Z подпрограмма возвращает адрес элемента таблицы, где находится нужный нам коэффициент деления. В строках 95, 96 из таблицы извлекается этот коэффициент. А в строках 97,98 он помещается в регистр совпадения таймера. В строках 99,100 включается звук.

В строке 104 вызывается специальная подпрограмма, предназначенная для формирования задержки. Подпрограмма называется wait и формирует задержку с переменной длительностью. Длительность задержки зависит от значения регистра dnota. По окончании задержки звук выключается (строки 102,103).

На этом можно было бы закончить процесс воспроизведения ноты. Однако это еще не все. Для правильного звучания мелодии между двумя соседними нотами необходимо обеспечить хотя бы небольшую паузу. Если такой паузы не будет, ноты будут звучать слитно. Это исказит мелодию, особенно если подряд идет несколько нот с одинаковым тоном. Формирование паузы между нотами происходит в строках 104,105.

Вспомогательная пауза формируется при помощи уже знакомой нам подпрограммы задержки. В строке 104 коду паузы присваивается нулевое значение (выбирается самая минимальная пауза). Затем в строке 105 вызывается подпрограмма wait. После окончания паузы остается только восстановить содержимое всех сохраненных регистров из стека (строки 106—109) и выйти из подпрограммы (строка 110).

2.6.5 Подпрограмма формирования задержки

И последнее, что нам еще осталось рассмотреть, — это подпрограмма формирования задержки. Текст подпрограммы занимает строки 111—135. Как и любая другая подпрограмма, подпрограмма wait в начале сохраняет (строки 111—114), а в конце — восстанавливает (строки 131—134) все используемые регистры.

Рассмотрим, как работает эта подпрограмма. Сначала определяется длительность задержки. Для этого извлекается соответствующий элемент из таблицы tabz. Номер элемента соответствует коду задержки, находящемуся в регистре dnota. Извлечение значения из таблицы производится уже знакомым нам образом. Команды, реализующие вычисление адреса нужного элемента таблицы, находятся в строках 115—118. Затем в строках 119 и 120 производится чтение элемента таблицы. Прочитанный код задержки помещается в регистровую пару Y.

Теперь наша задача: сформировать задержку, пропорциональную содержимому регистровой пары Y. Так как микроконтроллер ATtiny2313 имеет только один шестнадцатиразрядный таймер, который уже занят формированием звука, будем формировать задержку программным путем. Но в данном случае цикл формирования задержки построен немного по-другому.

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

Для хранения этого параметра используется регистровая пара Z. Перед началом цикла задержки в нее записывается ноль. Затем начинается цикл, на каждом проходе которого содержимое регистровой пары Z увеличивается на единицу. После каждого такого увеличения производится сравнение нового значения Z с содержимым регистровой пары Y.

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

Описанная выше процедура задержки занимает строки 121—135. В строках 121, 122 производится запись нулевого значения в регистровую пару Z. Большой цикл задержки занимает строки 123—130. Малый внутренний цикл занимает строки 124—125. Для хранения параметра малого цикла используется регистр loop. В строке 123 в него записывается начальное значение. Строки 124,125 выполняются до тех пор, пока содержимое loop не окажется равным нулю.

В строке 126 содержимое регистровой пары Z увеличивается на единицу. В строках 127—130 производится сравнение содержимого двух регистровых пар Y и Z. Сравнение производится побайтно. Сначала сравниваются младшие байты (строка 127). Если они не равны, оператор условного перехода в строке 128 передает управление на начало цикла.

Если младшие байты равны, сравниваются старшие байты (строка 129). Если старшие байты неодинаковы, оператор brne в строке 130 опять заставляет цикл начинаться с начала. И только когда оба оператора сравнения дадут положительный результат (не вызовут перехода), цикл заканчивается, и подпрограмма формирования задержки переходит к завершающей фазе (к строкам 131—135).

2.6.6 Программа на языке СИ

Возможный вариант программы на языке СИ приведен в листинге 2. В данном случае использована модификация языка поддерживаемая программной средой CodeVision. Описание программы рассчитано на программистов, знакомых с языком СИ.

Теперь рассмотрим подробнее программу с самого начала (Листинг 2, Приложение Б).

2.6.7 Описание программы (листинг 2)

Для формирования задержки мы будем использовать функцию из библиотеки delay.h. Поэтому в строках 1,2 программы, кроме файла описаний, мы присоединяем и эту библиотеку. Затем наминаются описания всех массивов. В строке 3 описывается массив, содержащий величины всех музыкальных длительностей.

Так как для формирования длительности мы будем использовать функцию delay_ms, величина длительностей задана в миллисекундах. Как видно из текста программы, в данном случае мы используем массив типа unsigned int. Переменные этого типа имеют длину два байта, все 16 битов которых используются для хранения информации.

Именно такой тип наиболее подходит для хранения наших коэффициентов. Управляющее слово fleash перед описанием массива гарантирует, что эти данные будут размещены в программной памяти микроконтроллера.

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

Перенос допускается в том месте команды, где между двумя соседними элементами выражения можно поставить пробел. Тип массива, как и в предыдущем случае,— usingnerd int. Содержимое массива tabkd полностью соответствует содержимому таблицы с тем же названием из ассемблерного варианта программы.

В строках 7—38 описываются семь массивов для хранения семи мелодий. Массивы имеют тип unsigned char. Переменные этого типа занимают в памяти один байт, и все восемь битов этого байта используются для хранения информации. Содержимое каждого из этих массивов полностью соответствует содержимому соответствующих таблиц в ассемблерной версии программы.

В строке 39 описывается массив, содержащий адрес начала каждой из семи мелодий. Это не просто массив, а массив ссылок, на что указывает символ звездочки в тексте его описания. Так же, как и ссылочная переменная, каждый элемент массива ссылок предназначен для хранения ссылки. Данный массив тоже хранится в памяти программ, на что указывает управляющее слово flesh в его описании. Элементы этого массива хранят указатели на начало каждого из массивов мелодий, что указано при его инициализации (в фигурных скобках).

Строки 40—72 занимает функция main. Начинается функция с описания переменных (строки 41—45). Две рабочих переменных count и temp, а также переменная для хранения кода тона (tnota) и переменная для хранения кода длительности (dnota) нам уже знакомы. Мы использовали их в предыдущей программе.

Интерес представляет описание переменной notа. Это ссылочная переменная, которая предназначена для хранения указателей на объекты в программной памяти, имеющие тип unsigned char. Она будет использоваться нами для обращения к элементам массивов, хранящим коды нот. Эти массивы, как уже говорилось, расположены в программной памяти. Поэтому в описании переменной имеется слово flash, а перед именем переменной в ее описании стоит символ звездочки. То есть это ссылка на массивы типа unsigned char, расположенные во flesh.

В строках 46—52 расположен блок инициализации. Эта часть программы полностью повторяет аналогичную часть программы из предыдущего примера (см. листинг 2).

Строки 53—72 занимает основной цикл программы. Цикл состоит всего из двух процедур. В начале цикла (строки 54—59) расположена процедура сканирования кнопок. Эта процедура один к одному скопирована из предыдущего примера (см. листинг 2 строки 14—21).

При обнаружении нажатой кнопки управление передается по метке m3 (в новой программе это строка 60). Как вы помните, номер нажатой кнопки при выходе из процедуры сканирования содержится в переменной count.

Строки 60—72 занимает процедура проигрывания мелодии.

Проигрывание начинается с того, что в переменную nota помещается указатель на массив, содержащий нужную нам мелодию (строка 60). А указатель — это элемент массива tabm, с номером, равным коду нажатой кнопки. В строках 61—72 находится цикл, который последовательно считывает мелодию нота за нотой и проигрывает прочитанные ноты. Цикл организован при помощи оператора безусловного перехода (строка 72).

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22

рефераты
Новости