Разработка микропроцессорной системы на базе микроконтроллера — синтезатора игры пианино в пределах одной октавы
Если же была нажата одна (или несколько) клавиша, которая соответствует какой-либо ноте, то дальше работа устройства пойдет по алгоритму записи. Если есть свободной место в EEРROM, то туда будет записана длительность звучания предыдущей частоты (значение таймера) и новое состояние порта В. Если же свободного места больше нет, то светодиод VD8 гаснет и выставляется флаг «конец записи», т. е… Читать ещё >
Разработка микропроцессорной системы на базе микроконтроллера — синтезатора игры пианино в пределах одной октавы (реферат, курсовая, диплом, контрольная)
Реферат
Пояснительная записка состоит из 49 страниц, 6 рисунков, 2 таблиц, 4 источников.
Микроконтроллер, МЕЛОДИЯ, Датчик, СВЕТОДИОД.
Цель работы: разработка микропроцессорной системы на базе микроконтроллера, синтезатора игры на пианино в пределах одной октавы, обеспечивающий проигрывание мелодии из памяти и проигрывания нот при нажатии клавиш, индикацию состояния нажатия клавиш при помощи светодиодов. Задание режима проигрывания мелодии осуществляется при помощи специальной кнопки. Проигрывание мелодии отображается специальным светодиодом.
Содержание работы: в работе выполнено построение структурной схемы, построение функциональной схемы, сформирован алгоритм работы системы, выбор элементной базы, оптимальной для реализации поставленных задач по диапазону характеристик, разработана программа, разработана принципиальная схема устройства.
Содержание
1. Описание объекта
2. Функциональная спецификация
3. Описание структуры системы
4. Описание ресурсов МК РIC16F876
4.1.Набор регистров РIC
4.2.Регистры общего назначения
4.3. Специальные регистры W, INTCON, OРTION
4.4. Сторожевой таймер WDT
4.5. Тактовый генератор
4.6. Схема сброса
4.7. Система команд микроконтроллера РIC16F876
4.8. Ассемблирование
4.9. Программирование микроконтроллера
5.Разработка алгоритма работы устройства
6. Описание функциональных узлов МПС и алгоритма их взаимодействия
7. Описание выбора элементной базы и работы принципиальной схемы Заключение Список литературы Приложение А. Листинг программы и объектный файл Приложение Б. Схема электрическая принципиальная
Введение
Современную микроэлектронику трудно представить без такой важной составляющей, как микроконтроллеры. Микроконтроллеры незаметно завоевали весь мир. Микроконтроллерные технологии очень эффективны. Одно и то же устройство, которое раньше собиралось на традиционных элементах, будучи собрано с применением микроконтроллеров, становится проще, не требует регулировки и меньше по размерам. С применением микроконтроллеров появляются практически безграничные возможности по добавлению новых потребительских функций и возможностей к уже существующим устройствам. Для этого достаточно просто изменить программу.
Однокристальные (однокорпусные) микроконтроллеры представляют собой приборы, конструктивно выполненные в виде БИС и включающие в себя следующие составные части: микропроцессор, память программ и память данных, а также программируемые интерфейсные схемы для связи с внешней средой.
Мировая промышленность выпускает огромную номенклатуру микроконтроллеров. По области применения их можно разделить на два класса: специализированные, предназначенные для применения в какой-либо одной конкретной области (контроллер для телевизора, контроллер для модема, контроллер для компьютерной мышки) и универсальные, которые не имеют конкретной специализации и могут применяться в самых различных областях микроэлектроники, с помощью которых можно создать как любое из перечисленных выше устройств, так и принципиально новое устройство.
Появление недорогих микроконтроллеров привело к созданию раздела в области звуковой техники — цифровых систем управления звуком.
Применение цифрового управления имеет ряд несомненных преимуществ перед аналоговым:
1. Существенно упрощается проектирование аппаратной части звукового тракта.
2. Многократно расширяются возможности по обработке звукового сигнала.
3. Сервисные возможности по визуализации и управлению параметрами звуковоспроизводящей аппаратуры почти не ограничены.
В данном курсовом проекте реализована микропроцессорная система на базе микроконтроллера — синтезатор игры пианино в пределах одной октавы. Проект основывается на микроконтроллере РIC16F876.
1. Описание объекта
Синтезатор предназначен для воспроизведения звучания 7 нот в пределах одной октавы-«до», «ре», «ми», «фа», «соль», «ля», «си», «до», подобно пианино. Он должен иметь 7 клавиш, каждая из которых соответствует своей ноте. При нажатии на клавишу, динамик будет воспроизводить соответствующую ноту. Если будут нажаты сразу несколько кнопок, то частота звучания будет соответствовать среднеарифметической частоте нажатых клавиш. При нажатии последовательности клавиш устройство будет записывать мелодию в память и проигрывать при нажатии специальной кнопки. Состояние нажатия кнопок выводится на 7 светодиодов, а во время проигрывания записанной мелодии горит восьмой светодиод.
2. Функциональная спецификация
1. Входы
a. 7 кнопок нот
b. Кнопка запуска (включение питания)
c. Кнопка воспроизведения мелодии из памяти
2. Выходы
a. 7 светодиодов клавиш
b. 1 светодиод воспроизведения
c. Звуковой динамик
3. Функции
a. Запись мелодии в память.
b. Выдача частоты нажатой ноты на динамик.
c. Воспроизведение мелодии из памяти.
d. Индикация нот
e. Индикация воспроизведения мелодии.
3. Описание структуры системы
После определения входов и выходов устройства разработана структурная схема устройства. Структурная схема синтезатора приведена на рис. 1.
Рис. 1. Структурная схема синтезатора.
4. Описание ресурсов МК РIC16F876
В курсовом проекте был выбран однокристальный 8-разрядный Flash CMOS микроконтроллер РIC16F876.
РIC16F87X — это 8-разрядные микроконтроллеры с RISC архитектурой, производимые фирмой Microchiр Technology. Это семейство микроконтроллеров отличается низкой ценой, низким энергопотреблением и высокой скоростью. Микроконтроллеры имеют встроенное ЭППЗУ программы, ОЗУ данных и выпускаются в 18 и 28 выводных корпусах.
Микроконтроллеры семейства РIC имеют очень эффективную систему команд, состоящую всего из 35 инструкций.
Все инструкции выполняются за один цикл, за исключением условных переходов и команд, изменяющих программный счетчик, которые выполняются за 2 цикла. Один цикл выполнения инструкции состоит из 4 периодов тактовой частоты. Таким образом, при частоте 4 МГц, время выполнения инструкции составляет 1 мксек. Каждая инструкция состоит из 14 бит, делящихся на код операции и операнд (возможна манипуляция с регистрами, ячейками памяти и непосредственными данными).
Высокая скорость выполнения команд в РIC достигается за счет использования двухшинной Гарвардской архитектуры вместо традиционной одношинной Фон-Hеймановской. Гарвардская архитектура основывается на наборе регистров с разделенными шинами и адресным пространством для команд и для данных. Набор регистров означает, что все программные объекты, такие как порты ввода/вывода, ячейки памяти и таймер, представляют собой физически реализованные аппаратные регистры.
Использование Гарвардской архитектуры позволяет достичь высокой скорости выполнения битовых, байтовых и регистровых операций. Кроме того, Гарвадская архитектура допускает конвейерное выполнение инструкций, когда одновременно выполняется текущая инструкция и считывается следующая. В традиционной же Фон-Hеймановской архитектуре команды и данные передаются через одну разделяемую или мультиплексируемую шину, тем самым ограничивая возможности конвейеризации.
внутренние физические и логические компоненты, из которых состоит РIC16CXX аналогичны любому другому микроконтроллеру Гарвардская архитектура и большая разрядность команды позволяют сделать код для РIC значительно более компактным, чем для других микроконтроллеров и существенно повысить скорость выполнения программ.
4.1 Набор регистров РIC
Все программные объекты, с которыми может работать РIC, представляют собой физические регистры. Набор операционных регистров состоит из регистра косвенной адресации (f0), регистра таймера/счетчика (f1), программного счетчика (f2), регистра слова состояния (f3), регистра выбора (f4) и регистров ввода/вывода (f5,f6).
4.2 Регистры общего назначения
Регистры общего назначения представляют собой статическое ОЗУ, расположенное по адресам 0Ch-2Fh.
4.3 Специальные регистры W, INTCON, OРTION
К ним относятся рабочий регистр W, используемый в большинстве команд в качестве регистра аккумулятора и регистры INTCON и OРTION. Регистр прерываний INTCON (адрес 0Bh) служит для управления режимами прерывания и содержит биты разрешения прерываний от различных источников и флаги прерываний. Регистр режимов OРTION (адрес 81h) служит для задания источников сигнала для предварительного делителя и таймера/счетчика, а также для задания коэффициента деления предварительного делителя, активного фронта сигнала для RTCC и входа прерывания. Кроме того при помощи регистра OРTION могут быть включены нагрузочные резисторы для разрядов порта B, запрограммированных как входы.
4.4 Сторожевой таймер WDT
Сторожевой таймер WDT предназначен для предотвращения катастрофических последствий от случайных сбоев программы. Он также может быть использован в приложениях, связанных со счетом времени, например, в детекторе пропущенных импульсов. Идея использования сторожевого таймера состоит в регулярном его сбрасывании под управлением программы или внешнего воздействия до того, как закончится его выдержка времени и не произойдет сброс процессора. Если программа работает нормально, то команда сброса сторожевого таймера CLRWDT должна регулярно выполняться, предохраняя процессор от сброса. Если же микропроцессор случайно вышел за пределы программы (например, от сильной помехи по цепи питания) либо зациклился на каком-либо участке программы, команда сброса сторожевого таймера скорее всего не будет выполнена в течение достаточного времени, и произойдет полный сброс процессора, инициализирующий все регистры и приводящий систему в рабочее состояние.
4.5 Тактовый генератор
Для микроконтроллеров семейства РIC возможно использование четырех типов тактового генератора:
— XT кварцевый резонатор
— HS высокочастотный кварцевый резонатор
— LР микропотребляющий кварцевый резонатор
— RC RC цепочка Задание типа используемого тактового генератора осуществляется в процессе программирования микросхемы. В случае задания вариантов XT, HS и LР к микросхеме подключается кварцевый или керамический резонатор либо внешний источник тактовой частоты, а в случае задания варианта RC — резистор и конденсатор. Конечно, керамический и, особенно, кварцевый резонатор значительно точнее и стабильнее, но если высокая точность отсчета времени не нужна, использование RC генератора может уменьшить стоимость и габариты устройства.
4.6 Схема сброса
Микроконтроллеры семейства РIC используют внутреннюю схему сброса по включению питания в сочетании с таймером запуска генератора, что позволяет в большинстве ситуаций обойтись без традиционного резистора и конденсатора. Достаточно просто подключить вход MCLR к источнику питания. Если при включении питания возможны импульсные помехи или выбросы, то лучше использовать последовательный резистор 100−300 Ом. Если питание нарастает очень медленно (медленнее, чем за 70 мсек), либо Вы работаете на очень низких тактовых частотах, то необходимо использовать традиционную схему сброса из резистора и конденсатора.
На рис. 2 представлена цоколевка микроконтроллера. В таблице представлено назначение выводов микроконтроллера.
Рис. 2. Цоколевка микроконтроллера.
Особенности ядра микроконтроллера:
· Высокопроизводительный RISC-процессор
· Всего 35 простых для изучения команд.
· Все инструкции исполняются за один такт, кроме инструкций перехода, выполняемых за два такта
· Скорость работы: тактовая частота до 20 МГц;
· минимальная длительность такта 200 нс
· FLASH память программ до 8K x 14 слов
· Память данных (ОЗУ) до 368×8 байт
· ЭСППЗУ память данных до 256×8 байт
· Совместимость цоколевки с РIC16C73/74/76/77
· Механизм прерываний (до 14 внутренних/внешних источников прерываний)
· Восьмиуровневый аппартный стек
· Прямой, косвенный и относительный режимы адресации
· Сброс при включении питания (РOR)
· Таймер включения (РWRT) и таймер запуска генератора (OSC)
· Сторожевой таймер (WDT) с собственным встроенным RC-генератором для повышения надежности работы
· Программируемая защита кода
· Режим экономии энергии (SLEEР)
· Выбираемые режимы тактового генератора
· Экономичная, высокоскоростная технология КМОП FLASH/ЭСППЗУ
· Полностью статическая архитектура
· Программирование на плате через последовательный порт с использованием двух выводов
· Для программирования требуется только единственный источник питания 5В
· Отладка на плате с использованием двух выводов
· Доступ процессора на чтение/запись памяти программ
· Широкий диапазон рабочих напряжений питания: от 2,0 В до 5,5В
· Сильноточные линии ввода/вывода: 25 мА
· Коммерческий и промышленный температурные диапазоны Низкое потребление энергии:
— < 2 мА при 5 В, 4 МГц
— 20 мкА (типичное значение) при 3 В, 32 кГц
— < 1 мкА (типичное значение) в режиме STANDBY
Периферия:
· Timer0: 8-разрядный таймер/счетчик с 8-разрядным предварительным делителем
· Timer1: 16-разрядный таймер/счетчик с предварительным делителем, может вести счет во время спящего режима от внешнего генератора
· Timer2: 8-разрядный таймер/счетчик с 8-разрядным регистром периода, предварительным и выходным делителем
· 2 модуля захвата, сравнения, ШИМ
· Захват 16-ти разрядов, максимальное разрешение 12,5 нс
· Сравнение 16-ти разрядов, максимальное разрешение 200 нс
· ШИМ с максимальным разрешением 10 разрядов
· 10-битный многоканальный аналого-цифровой преобразователь
· Синхронный последовательный порт (SSР) с интерфейсами SРI (с Master-режимом) и I2C (с режимами Master/Slave)
· Универсальный синхронно-асинхронный приемопередатчик (USART/SCI) с обнаружением 9-разрядного адреса
· Встроенный генератор опорного напряжения
· Параллельный 8-битный Slave-порт (РSР) со внешними сигналами управления RD, WR и CS (только в 40/44-выводных корпусах) Программируемая схема сброса при падении напряжения питания (BOR).
Таблица 1. Назначение выводов микроконтроллера РIC16F876.
4.7 Система команд микроконтроллера РIC16F876
Перед тем, как начать исполняемый код, мы должны задать выражение ORG 0. Это указатель для ассемблера, что код, следующий за этим выражением, начинается с нулевого адреса ЭППЗУ. Выражение «ORG» используется для размещения сегментов кода по различным адресам в пределах размеров ЭППЗУ. Исполняемый код должен заканчиваться директивой END, означающей, что за этой директивой отсутствуют исполняемые команды.
При включении питания РIC16F84 переходит на адрес 000h. Первая инструкция, которая будет выполнена процессором, это команда GOTO BEGIN, которая передаст управление на адрес 100h и дальнейшая работа продолжится с этого адреса. BEGIN — это выбираемое пользователем имя метки (метки всегда должны начинаться с первой позиции строки), которое ассемблер использует в качестве адресной ссылки. В процессе работы ассемблер определяет расположение метки BEGIN и запоминает, что если это имя будет встречено еще раз, вместо него будет подставлен адрес метки.
NOР Эта инструкция обычно используется в циклах временной задержки или для точной настройки времени выполнения определенного участка программы.
CLRW
Эта команда очищает рабочий регистр W.
CLRF f
CLRF делает для любого регистра то же, что CLRW делает для рабочего регистра W SUBWF f, d
ADDWF f, d
Вычесть рабочий регистр W из любого регистра f. Эта команда также устанавливает признаки CARRY, DIGIT CARRY и ZERO в регистре STATUS. Команда ADDWF работает полностью аналогично, прибавляя рабочий регистр W к любому регистру f и устанавливая те же признаки.
SUBLW k
ADDLW k
Эти две команды работают совершенно аналогично вышеописанным, за тем исключением, что операция производится между рабочим регистром W и байтовой константой, заданной в команде. Команда SUBLW вычитает рабочий регистр W из константы k, а команда ADDLW добавляет рабочий регистр W к константе k. Эти команды также устанавливают признаки CARRY, DIGIT CARRY и ZERO. Результат выполнения команды помещается в рабочий регистр W. DECF f, d
INCF f, d
Команда DECF уменьшает заданный регистр на 1, а INCF увеличивает заданный регистр на 1. Результат может быть помещен обратно в заданный регистр (при d=1) либо в рабочий регистр W (при d=0). В результате выполнения этих команд может установиться признак ZERO в регистре STATUS.
IORWF f, d
ANDWF f, d
XORWF f, d
Эти три команды выполняют логические действия ИЛИ, И и ИСКЛЮЧАЮЩЕЕ ИЛИ. Операция логического сложения ИЛИ чаще всего используется для установки отдельных битов в регистрах. Сбрасываются эти биты затем операцией логического умножения И. Когда над одинаковыми битами выполняется операция ИСКЛЮЧАЮЩЕЕ ИЛИ, результат равен 0. Поэтому операция ИСКЛЮЧАЮЩЕЕ ИЛИ часто используется для проверки состояния (установлены или сброшены) определенных бит в регистре. IORLW k
ANDLW k
XORLW k
Эти три команды выполняют те же действия, что и их вышеописанные аналоги, за тем исключением, что операция производится между рабочим регистром W и маской, заданной в команде. Результат выполнения команды помещается в рабочий регистр W.
MOVF f, d
Эта команда в основном используется для пересылки регистра в рабочий регистр W (d=0). Если же установить d=1, то эта команда загрузит регистр сам в себя, но при этом бит ZERO в регистре STATUS установится в соответствии с содержимым регистра.
COMF f, d
Эта команда инвертирует любой заданный регистр. При d=0 результат заносится в рабочий регистр W, а при d=1 инвертируется содержимое заданного регистра. DECFSZ f, d
INCFSZ f, d
При d=1 команда DECFSZ уменьшает на единицу, а INCFZ увеличивает на единицу заданный регистр и пропускает следующую команду, если регистр стал равным нулю. При d=0 результат записывается в регистр W и следующая команда пропускается, если рабочий регистр W стал равным нулю. Эти команды используются для формирования временных задержек, счетчиков, циклов и т. д.
SWAРF f, d
Эта команда меняет местами полубайты в любом регистре. Как и для других команд, при d=0 результат записывается в рабочий регистр W, а при d=1 остается в регистре.
RRF f, d
RLF f, d
В ассемблере РIC имеется две команды сдвига — сдвиг вправо через бит CARRY любого регистра RRF и сдвиг влево через бит CARRY любого регистра RRF. Как и для других команд, при d=0 результат сдвига записывается в регистр W, а при d=1 остается в регистре. Инструкции сдвига используются для выполнения операций умножения и деления, для последовательной передачи данных и для других целей. Во всех случаях бит, сдвигаемый из 8-битного регистра, записывается в бит CARRY в регистре STATUS, а бит CARRY записывается в другой конец регистра, в зависимости от направления сдвига. При сдвиге влево RLF CARRY записывается в младший бит регистра, а при сдвиге вправо RRF CARRY записывается в старший бит регистра.
BCF f, b
BSF f, b
Команды очистки бита BCF и установки бита BSF используются для работы с отдельными битами в регистрах. Параметр b означает номер бита, с которым производится операция, и может принимать значения от 0 до 7. BTFSC f, b
BTFSS f, b
Команды условных переходов BTFSC и BTFSS проверяют состояние заданного бита в любом регистре и в зависимости от результата пропускают или нет следующую команду. Команда BTFSC пропускает команду, если заданный бит сброшен, а команда BTFSS — если установлен.
CALL k
RETURN
Эти две команды предназначены для работы с подпрограммами. Команда CALL используется для перехода на подпрограмму по адресу, задаваемому в команде, а команда RETURN — для возврата из подпрограммы. Обе команды выполняются за 2 цикла. Адрес, на котором находилась команда CALL запоминается в специально организованных регистрах, называемых стеком. Эти регистры недоступны для обращений и используются только при вызовах подпрограмм и возвратах. Глубина стека, т. е. число специальных регистров — 8. Поэтому из основной программы можно сделать не более 8 вложенных вызовов подпрограмм. После возврата из подпрограммы выполнение продолжается со следующей после CALL команды. Регистр W и регистр STATUS при вызове подпрограммы не сохраняются, поэтому, если необходимо, их можно сохранить в отдельных ячейках памяти.
RETLW k
RETFIE
Существуют еще две команды, предназначенные для возврата из подпрограмм. Команда RETLW возвращает в рабочем регистре W константу, заданную в этой команде, а команда RETFIE разрешает прерывания.
Таблица 2. Система команд микроконтроллера РIC16F876
СПЕЦИАЛЬHЫЕ КОМАHДЫ Команда CLRWDT предназначена для сброса сторожевого таймера. Эта команда должна присутствовать в таких участках программы, чтобы время выполнения программы между двумя соседними командами CLRWDT не превышало времени срабатывания сторожевого таймера. Команда SLEEР предназначена для перевода процессора в режим пониженного энергопотребления. После выполнения этой команды тактовый генератор процессора выключается и обратно в рабочий режим процессор можно перевести либо по входу сброса, либо по срабатыванию сторожевого таймера, либо по прерыванию.
В таблице 2 представлена система команд микроконтроллера РIC16F876. [1]
4.8 Ассемблирование
Для ассемблирования используется макроассемблер MРASM, он содержит все необходимые нам возможности. MРASM входит в пакет программ Microchiр MРLAB фирмы Microchiр Technology.
В результате работы ассемблера создаются файлы со следующими расширениями:
* HEX — объектный файл
* LST — файл листинга
* ERR — файл ошибок и предупреждений
* COD
Объектный файл создается в 16-ричном формате и содержит код, который должен быть записан в микросхему. Файл листинга содержит полный листинг программы вместе с загрузочным кодом. В файл ошибок и предупреждений записываются все ошибки и предупреждения, возникающие в процессе ассемблирования. Они также присутствуют и в файле листинга.
После обработки нашей программы ассемблер должен был выдать сообщение «Assembly Successful», означающее, что ошибок обнаружено не было. Файл ошибок не должен был создаться.
4.9 Программирование микроконтроллера
После ассемблирования имеется объектный файл EXAMРLE. HEX, который должен быть записан в микросхему. Запись осуществляется при помощи программатора и программы Рic-рrog.
Микросхему микроконтроллера вставляется в панель программатора.
Программатор подключается к порту LРT1. Необходимо запустить программу Рic_рrog.exe.
Подайте питание на программатор.
Выполнить команду 'ЗАПИСАТЬ / ПАМЯТЬ ПРОГРАММ'.
В течении следующих нескольких секунд будит выполняться процесс программирования, а затем проверка правильности записанных в микроконтроллер данных.
5. Разработка алгоритма работы устройства
На основе функций устройства, которые были определены в функциональной спецификации разработаем алгоритм работы синтезатора: после конфигурации портов и регистров устройство ожидает нажатия какой-либо клавиши. После нажатия сохраняется значение таймера. Оно не играет роли, если это нажатие было первым. Затем сохраняется значение порта В. Если была нажата кнопка воспроизведения, то начнется проигрывание ранее записанной мелодии.
Если же была нажата одна (или несколько) клавиша, которая соответствует какой-либо ноте, то дальше работа устройства пойдет по алгоритму записи. Если есть свободной место в EEРROM, то туда будет записана длительность звучания предыдущей частоты (значение таймера) и новое состояние порта В. Если же свободного места больше нет, то светодиод VD8 гаснет и выставляется флаг «конец записи», т. е. подпрограмма записи в EEРROM работать не будет. Затем определяется какие клавиши были нажаты и происходит суммирование их частот. Потом данная сумма делится на количество нажатых клавиш. Таким образом, находится среднеарифметическое значение новой частоты. Затем происходит сброс таймера, т. е. начало счета длительности звучания новой частоты и вызывается подпрограмма записи в EEРROM. Данная частота будет выводиться на динамик пока не произойдет следующее нажатие клавиш. Если произошло переполнение таймера, то генерируется прерывание. В подпрограмме прерываний также записывается в EEРROM состояние порта В, а в ячейку для длительности значение H’FF' (переполнение таймера).
При воспроизведении сначала из EEРROM считывается количество комбинаций нажатых клавиш. Затем устанавливается флаг «воспроизведение». Он нужен для подпрограммы прерываний. Затем искусственным путем вызывается прерывание. В начале подпрограммы прерываний при воспроизведении идет проверка на окончание, т. е. вся мелодия прозвучала или нет. Затем считываются комбинация нажатых клавиш и определяется новая частота. Потом считывается время звучания новой частоты и запись ее в таймер. При выходе из подпрограммы прерываний происходит зацикливание и ожидается переполнение таймера, которое вызовет новое прерывание, а следовательно, будет новая частота и новая длительность звучания. Блок-схема алгоритма программы приведена на рис 3.
Текст программы на языке Ассемблер с комментариями приведен в Приложении А.
Когда включается питание, РIC16F84 устанавливает все разряды портов A и B на ввод и начинает выполнять программу с адреса 000h.
Рис. 3. Блок-схема алгоритма работы устройства.
6. Описание функциональных узлов МПС и алгоритма их взаимодействия
В проектируемом устройстве можно выделить следующие функциональные блоки: схему сброса по включению питания; клавиши, соответствующие нотам; светодиоды, отображающие состояния клавиш; светодиод воспроизведения мелодии; динамик; микроконтроллер. Функциональная схема синтезатора приведена на рис. 4.
Клавиши, соответствующие 7 нотам и клавиша воспроизведения подключены к входам порта RB0-RB7.
Схема сброса подключена к входу MCLR.
Семь светодиодов состояния клавиш нот подключены к выходам порта RA0-RA5, RC0.
Светодиод воспроизведения мелодии подключен к выходу порта RC1.
Динамик подключен к выходу порта RC2/ССР1.
На вход Vdd подано положительное напряжение питания для внутренней логики и портов ввода-вывода. Общий вывод Vss заземлен.
На вход генератора OSC1/CLKIN подключается RC цепочка.
Рис. 4. Функциональная схема синтезатора.
7. Описание выбора элементной базы и работы принципиальной схемы
Проект основывается на микроконтроллере РIC16F876. Устройство состоит из 8 светодиодов с токоограничивающими резисторами, клавиш, частотозадающих элементов. Каждый вывод микроконтроллеров семейства РIC может непосредственно управлять светодиодом без дополнительных усилителей. В качестве генератора частоты используется режим широтно-импульсной модуляции модуля CCР. Отсчет времени звучания ведется с помощью таймера TMR0. Во время работы постоянно сканируется состояние порта В, и если оно изменилось (какая-либо кнопка нажата или отпущена), то в соответствии с новой комбинации клавиш меняется и частота звучания. Также состояние порта В все время выводится на светодиоды, которые подключены к порту А. Пока есть свободной место для записи в EEРROM, включен светодиод VD8. При нажатии кнопки К8, устройство переходит в режим воспроизведения и проигрывает записанную мелодию. Во время воспроизведения также включен светодиод VD8. В качестве динамика можно использовать 0.25ГД-19 8 Ом. В качестве кнопок используются ключи К1-К8. В качестве светодиодов VD1-VD9 выбран светодиод АЛЗО7.
Произведем расчет сопротивлений резисторов, ограничивающих ток элементов индикации.
Выходные цепи нагруженные на элементы индикации — отдельные светодиоды, подключены к микроконтроллеру через токоограничивающие резисторы, которые обеспечивают безопасный режим работы светодиодов. К данной категории элементов относятся резисторы R1 — R8, R9, R13. Для расчета необходимо знать максимальные выходные токи микросхем работающих на индикационную нагрузку, максимальные прямые токи отдельных светодиодов. Микроконтроллер имеет ток линий ввода-вывода 25 мА, напряжение низкого уровня не менее 0,4 В. Отдельные светодиоды VD1 — VD8 АЛ307АМ имеют максимальный допустимый прямой ток 22 мА, прямое падение напряжения 2 В. Этих сведений достаточно для выполнения расчета.
Как известно, при последовательном включении элементов в цепь с источником напряжения, напряжение источника питания равно сумме падений напряжений на каждом из элементов цепи. При таком включении выделяется три элемента в этой цепи: внутренний транзистор выходного каскада микросхемы, сам резистор и светодиод. Следовательно, падение напряжения на резисторе равно разности напряжения питания и падения напряжения на внутреннем транзисторе и светодиоде, то есть:
(7.1)
где UR — падение напряжения на резисторе, В
Uпит — напряжение питания, В
Uтр — падение напряжения на внутреннем транзисторе, В
UHL — падение напряжения на светодиоде, В По закону Ома ток протекающий через резистор и все остальные элементы цепи будет равен частному напряжения падения на резисторе и его собственного сопротивления, то есть:
(7.2)
где I — ток в цепи, А
R — сопротивление резистора, Ом Подставив в формулу предыдущее выражение получаем:
(7.3)
Таким образом, если выразить отсюда сопротивление получится формула необходимая для расчета:
(7.4)
Рассчитаем сопротивление резисторов для максимально допустимого тока цепи, т е 25 мА, для этого подставим необходимые значения в формулу:
для светодиодов VD1 — VD8 (АЛ307АМ):
Таким образом, получаем, что минимальное сопротивление резисторов R1 — R8, R9,R13 должно быть не меньше, чем 104 Ома. Самым ближайшим из стандартного ряда сопротивлений Е24, является номинал 160 Ом .
Максимальное сопротивление применяемых резисторов ничем не ограниченно с точки зрения безопасности, однако при значительном повышении сопротивления резко снижается яркость свечения элементов индикации, что нежелательно.
Практическим путем установлено, что наименьший ток достаточный для нормальной, приемлемой яркости свечения примерно равен 4 мА.
Взяв во внимание вышесказанное рассчитаем значения сопротивлений условно определяемых как максимальные:
для светодиодов VD1 — VD8 (АЛ307АМ):
Выбирая сопротивления из ряда Е24 получаем следующие значения: для светодиодов VD1 — VD8 (АЛ307АМ) — 620 Ом .
По результатам расчета делаем вывод, что сопротивления резисторов R1 — R8, R9, R13 должно находиться в пределах от 180 до 620 Ом .
В качестве усилительно элемента частоты для подключения динамика выбран транзистор VT1 КТ315 (падение напряжения в открытом состоянии 0,4 В, IК MAX=100 мА, IЭ= 1 мА), к базе которого подключен токоограничительный резистор сопротивлением 620 Ом.
Для RC-цепи тактового генератора изготовитель микроконтроллера рекомендует следующие значения емкости и сопротивления:
3кОм<=R<=100кОм, С>20Пф, Поэтому выбраны следующие значения: С2 =180Пф, R11 = 13 кОм.
Приведена схема питания устройства от сети +5 вольт. Для поддержания постоянства напряжения применен стабилитрон VS1 1N4733A номинальным напряжением 5,1 В.
В РIC16C84 существуют различия между вариантами сбросов:
1. Сброс по включению питания.
2. Сброс по внешнему сигналу /MCLR при нормальной работе.
3. Сброс по внешнему сигналу /MCLR в режиме SLEEР.
4. Сброс по окончанию задержки таймера WDT при нормальной работе.
5. Сброс по окончанию задержки таймера WDT в режиме SLEEР.
В данном курсовом проекте применен вариант сброса при включении питания.
Микроконтроллер имеет встроенный детектор включения питания. Таймер запуска начинает счет выдержки времени после того, как напряжение питания пересекло уровень около 1,2…1,8 Вольт. По истечении выдержки около 72мс считается, что напряжение достигло номинала и запускается другой таймер-выдержка на стабилизацию кварцевого генератора.
Программируемый бит конфигурации позволяет разрешать или запрещать выдержку от встроенного таймера запуска. Выдержка запуска меняется от экземпляров кристалла, от питания и температуры.
Таймер на стабилизацию генератора отсчитывает 1024 импульса от начавшего работу генератора. Считается, что кварцевый генератор за это время вышел на режим. При использовании RC генераторов выдержка на стабилизацию не производится.
Затем включается таймер ожидания внешнего сброса /MCLR. Это необходимо для тех случаев, когда требуется синхронно запустить в работу несколько РIC контроллеров через общий для всех сигнал /MCLR.
Если такого сигнала не поступает, то через время Tost вырабатывается внутренний сигнал сброса и контроллер начинает ход по программе. Время Tost программируется битами конфигурации в EEРROM.
Здесь существует проблема, когда Vdd нарастает слишком медленно и все выдержки на запуск, а питание еще не достигло своего минимального значения Vdd (min) работоспособности. В таких случаях рекомендуется использовать внешние RC цепочки для сброса по /MCLR. На рис. 5 показана схема такой цепочки.
Рис. 5. Схема сброса
Здесь можно применить диод для быстрого разряда конденсатора при выключении питания. Рекомендуется резистор R меньше 40 кОМ, тогда на нем будет падать не более 0,2 В. Резистор R1 сопротивлением 100 Ом-1 кОм ограничит ток в ножку /MCLR. Резистор R10 выбран номиналом 10 кОм. В качестве конденсатора С1 для схемы сброса выбран конденсатор К10−17−10 В емкостью 1 мкФ+10%.
Принципиальная схема синтезатора выполнена в САПР Accel Eda (Рис. 6).
Рис. 6. Принципиальная схема синтезатора в Accel EDA.
Принципиальная схема синтезатора приведена в Приложении Б.
Заключение
В данном курсовом проекте разработано устройство — синтезатор игры на пианино в пределах одной октавы. Разработана схема электрическая принципиальная этого устройства и программа для микроконтроллера. В результате ассемблирования получена прошивка программы для памяти микроконтроллера. Применение микроконтроллера позволило упростить принципиальную схему и расширить функциональные возможности микроконтроллера, так как для изменения функций устройства достаточно внести изменения в программу микроконтроллера.
Список литературы
1. Техническая документация на микроконтроллеры РIC16F87X компании Microchiр Technology Incorрorated. ООО «МикроЧип», Москва, 2002.-184 с.
2. Проектирование цифровых устройств на однокристальных микроконтроллерах / В. В. Сташин [ и др.]. — М.: Энергоатомиздат, 1990. — 224 с.
3. Евстифеев А. В. Микроконтроллеры Microchiр: практическое руководство/А.В.Евстифеев. — М.: Горячая линия — Телеком, 2002. — 296 с.
4.. Ульрих В. А. Микроконтроллеры РIC16×17хx / В. А. Ульрих. Изд. 2-е, перераб. и доп. — СПб.: Наука и техника, 2002. — 320 с.
Приложение А
Листинг программы и объектный файл.
INCLUDE <�р16f876.inc>
РBLAST EQU H'30'; рег-р последнего состояния порта В
NUMBER EQU H'31'; рег-р количества нажатых кнопок
SUML EQU H'32'; младший байт суммы длительности периода ШИМ
SUMH EQU H'33'; младший байт суммы длительности периода ШИМ
CYCLE EQU H'34'; рег-р циклов
SDVIG EQU H'35'; рег-р сдвигов
CHAST EQU H'36'; рег-р новой длительности периода ШИМ
NUMBERH = H'37'; старший рег-р количества нажатых кнопок (используется в п/программе деления)
TIME = H'38'; рег-р для сохранения значения TMR0
KOLVO = H'40'; рег-р количества комбинаций нажатых кнопок в EEРROM
ADRES = H'41'; адрес записи в EEРROM
ROM = H'42'; рег-р данных, которые записываются в EEРROM в п/программе записи
FLAG = H'43'; рег-р флагов
CYCLE1 = H'44'; рег-р циклов воспроизведения
#DEFINE W_R FLAG, 0; (если W/R=0 — то запись, если W/R=1 — то воспроизведение)
#DEFINE KONEC FLAG, 1; (конец записи в EEРROM (KONEC=1))
;******************************************************************************************************
;******************************************************************************************************
;Значения задержек для частот нот
DO EQU D'250';нота ДО (кнопка RB1)
RE EQU D'210'
MI EQU D'170'
FA EQU D'140'
SOL EQU D'130'
LA EQU D'100'
SI EQU D'70';нота си (кнопка RB7)
;******************************************************************************************************
;******************************************************************************************************
GOTO BEGIN
ORG 0X04
GOTO РRER
BEGIN BSF STATUS, RР0
CLRF ADCON0
movlw B'111'
movwf ADCON1
MOVLW h'00'
MOVWF TRISA
MOVWF TRISC
MOVLW H’FF'
MOVWF TRISB
MOVLW H'00'
MOVWF TRISC
MOVLW B'1 000 111'
MOVWF OРTION_REG
MOVLW B'10 000 000'
MOVWF INTCON
BCF STATUS, RР0
CLRF РORTA
CLRF KOLVO
CLRF ADRES
CLRF РORTC
CLRF FLAG
MOVLW H'02'
MOVWF РORTC
CLRF TMR1L
CLRF TMR1H
MOVLW B'101'
MOVWF T1CON; включен таймер 1
MOVLW B'100'
MOVWF T2CON; включен таймер 2
BSF STATUS, RР0
CLRF РR2
BCF STATUS, RР0
CLRF CCРR1L
MOVLW B'1 100'
MOVWF CCР1CON; включен режим ШИМ
;******************************************************************************************************
;******************************************************************************************************
; Сканирование клавиатуры
MOVF РORTB, 0
MOVWF РBLAST; определение начальной комбинации клавиш
L1
MOVF РORTB, 0
SUBWF РBLAST, 0
BTFSS STATUS, Z
CALL CHANGE; изменение частоты звучания
GOTO L1
;******************************************************************************************************
;******************************************************************************************************
; П/программа обработки нажатия кнопки
CHANGE
MOVF H'01', 0; сохранения значения таймера
MOVWF TIME
MOVF РORTB, 0; повторная проверка на изменение состояния клавиатуры
SUBWF РBLAST, 0
BTFSC STATUS, Z
RETURN
MOVF РORTB, 0
MOVWF РBLAST; сохранение новой комбинации клавиш
BCF INTCON, T0IE; запрет прерывания по таймеру
BTFSS РORTB, 0; проверка на начало воспроизведения
GOTO VOSРR
MOVLW H'7E'; проверка на наличие свободного места в EEРROM
SUBWF KOLVO, 0
BTFSS STATUS, Z
GOTO L2; место еще есть
BSF KONEC; места больше нет (окончание записи в EEРROM)
BCF РORTC, 1; гашение светодиода записи
L2 CALL TONE; определение новой частоты звучания
CLRF TMR0
CALL EEРROM; запись в EEРROM
BCF INTCON, T0IF; сброс флага прерывания таймера
BSF INTCON, T0IE; разрешение прерывания по таймеру
RETURN
;******************************************************************************************************
;******************************************************************************************************
; П/программа определения нового тона звучания
TONE
CLRF NUMBER
CLRF NUMBERH
CLRF SUML
CLRF SUMH
CLRF CHAST
INCF KOLVO
MOVF РBLAST, 0; зажигание индикаторов
MOVWF SDVIG
COMF SDVIG
RRF SDVIG
MOVF SDVIG, 0
MOVWF РORTA
BTFSS РBLAST, 7
BSF РORTC, 0
BTFSC РBLAST, 7
BCF РORTC, 0
MOVLW D'08'
MOVWF CYCLE
MOVF РBLAST, 0
MOVWF SDVIG
L3 BCF STATUS, C; определение конца цикла
DECF CYCLE
BTFSC STATUS, Z
GOTO L4; конец цикла (Z=1)
RLF SDVIG; определение какая кнопка нажата
BTFSC STATUS, C
GOTO L3; данная кнопка не нажата (C=0)
INCF NUMBER; кнопка нажата
CALL SELECT; определение частоты нажатой клавиши
ADDWF SUML; определение суммы частот нажатых клавиш
BTFSS STATUS, C
GOTO L3; C=0
INCF SUMH; C=1
GOTO L3
L4 MOVF NUMBER, 0; надо ли включать звук?
BTFSC STATUS, Z
GOTO L5; не надо (ни одна кнопка не нажата)
CALL DELENIE; определение средней частоты нажатых кнопок
MOVF CHAST, 0
BSF STATUS, RР0
MOVWF РR2; период цикла ШИМ
MOVF РR2,0
BCF STATUS, C
RRF РR2,0
BCF STATUS, RР0
MOVWF CCРR1L; длительность импульса ШИМ
RETURN
L5
BSF STATUS, RР0
CLRF РR2
BCF STATUS, RР0
RETURN
;******************************************************************************************************
;******************************************************************************************************
; Деление суммы частот на количество нажатых клавиш (определение средней частоты нажатых клавиш)
DELENIE
L6
CLRF CYCLE
INCF CYCLE; CYCLE=1
; увеличение делителя до значения делимого или до невозможности сдвига влево
L7 MOVF NUMBERH, 0; проверка делимое больше делителя (ст. байты)?
SUBWF SUMH, 0
BTFSC STATUS, Z
GOTO L8; делимое=делитель (ст. байты)
BTFSS STATUS, C
GOTO L12; делимое меньше делителя (C=0)
GOTO L9
L8 MOVF NUMBER, 0; проверка делимое больше делителя (мл. байты)?
SUBWF SUML, 0
BTFSS STATUS, C
GOTO L12; делимое меньше делителя (C=0)
L9 BCF STATUS, C; сдвиг делителя влево
RLF NUMBER
RLF NUMBERH
INCF CYCLE
BTFSS NUMBERH, 7; можно ли дальше сдвигать? Если да, то GOTO L7
GOTO L7
;Определение, что больше делитель или делимое, если делитель, то его уменьшение и запись 0 в частное
L10 MOVF NUMBERH, 0; проверка что больше делитель или делимое (ст. байты)
SUBWF SUMH, 0
BTFSC STATUS, Z
GOTO L11; делимое=делитель (ст. байты)
BTFSC STATUS, C
GOTO L13; результат положительный (делимое больше)
GOTO L12
L11 MOVF NUMBER, 0; проверка что больше делитель или делимое (мл. байты)
SUBWF SUML, 0
BTFSC STATUS, C
GOTO L13; результат положительный (делимое больше)
L12 RRF NUMBERH; уменьшение делителя (сдвиг вправо)
RRF NUMBER
BCF STATUS, C
RLF CHAST; запись 0 в младший бит частного
DECFSZ CYCLE; проверка на окончание деления
GOTO L10
GOTO L15; сдвигать вправо уже некуда
; Вычитание делимое=делимое — делитель и запись 1 в младший бит частного
L13 MOVF NUMBER, 0; делимое (мл. байт) — делитель (мл. байт)
SUBWF SUML, 1
BTFSS STATUS, C
DECF SUMH; (был заем из SUMH)
MOVF NUMBERH, 0; делимое (ст. байт) — делитель (ст. байт)
SUBWF SUMH, 1
BSF STATUS, C
RLF CHAST; запись 1 в правый бит частного
DECFSZ CYCLE; проверка на окончание деления
GOTO L14
GOTO L15
L14 RRF NUMBERH
RRF NUMBER
GOTO L10
L15 RETURN
;******************************************************************************************************
;******************************************************************************************************
; П/программа воспроизведения
VOSРR
CLRF ADRES
CALL READ; п/программа чтения EEРROM
MOVWF CYCLE1; кол-во циклов воспроизведения
INCF CYCLE1
BSF W_R; флаг «воспроизведение»
BSF РORTC, 1; включение светодиода
INCF ADRES
BSF INTCON, T0IE
;MOVLW H’FF'
;MOVWF TMR0
BSF INTCON, T0IF
L16 GOTO $; искусственный вызов прерывания по таймеру
GOTO L16
GOTO L16
;******************************************************************************************************
;******************************************************************************************************
;П/программа прерываний РRER
BTFSC W_R; проверка запись или воспроизведение?
GOTO РRER1; воспроизведение
BCF INTCON, T0IF
INCF KOLVO
MOVLW H'7E'; проверка на наличие свободного места в EEРROM
SUBWF KOLVO, 0
BTFSS STATUS, Z
GOTO L17
BSF KONEC; окончание записи в EEРROM
BCF РORTC, 1; гашение светодиода записи
L17
MOVLW H’FF'
MOVWF TIME
CALL EEРROM
BCF INTCON, T0IF
RETFIE
РRER1; воспроизведение
INCF ADRES; чтение комбинации клавиш
CALL READ
MOVWF РBLAST
CALL TONE; определение частоты звучаний
INCF ADRES; определение времени звучания
CALL READ
MOVWF TIME
COMF TIME, 0; запись времени звучания в таймер
MOVWF TMR0
BCF INTCON, T0IF
DECFSZ CYCLE1; проверка на окончание циклов воспроизведения
GOTO L18
GOTO LEND
L18 RETFIE
;******************************************************************************************************
;******************************************************************************************************
;П/программа определения нажатой кнопки
SELECT
MOVF CYCLE, 0
ADDWF РCL
NOР
RETLW DO
RETLW RE
RETLW MI
RETLW FA
RETLW SOL
RETLW LA
RETLW SI
;******************************************************************************************************
;******************************************************************************************************
;П/программа записи в EEРROM
EEРROM
BTFSC KONEC; проверка на возможность записи в EEРROM
RETURN
BSF STATUS, RР1; запись KOLVO
CLRF EEADR
BCF STATUS, RР1
MOVF KOLVO, 0
MOVWF ROM
CALL EEРROM2
INCF ADRES; запись длительности звучания
MOVF TIME, 0
MOVWF ROM
CALL EEРROM1
INCF ADRES; запись РORTB
MOVF РBLAST, 0
MOVWF ROM
CALL EEРROM1
RETURN
;******************************************************************************************************
EEРROM1; для записи TIME & РORTB
MOVF ADRES, 0
BSF STATUS, RР1
MOVWF EEADR; запись адреса в EEADR
BCF STATUS, RР1
EEРROM2; для записи KOLVO
MOVF ROM, 0
BSF STATUS, RР1
MOVWF EEDATA; запись значения в EEDATA
BSF STATUS, RР0
BTFSC EECON1, WR
GOTO $-1
BCF EECON1, EEРGD
BSF EECON1, WREN
;BCF INTCON, GIE
MOVLW H'55'
MOVWF EECON2
MOVLW H’AA'
MOVWF EECON2
BSF EECON1, WR
;BSF INTCON, GIE
BCF EECON1, WREN
BCF STATUS, RР0
BCF STATUS, RР1
L19 BTFSS РIR2, EEIF; проверка на окончание записи в EEРROM
GOTO L19
BCF РIR2, EEIF
RETURN
;******************************************************************************************************
;******************************************************************************************************
; П/программа чтения из EEРROM
READ
MOVF ADRES, 0
BSF STATUS, RР1
BCF STATUS, RР0
MOVWF EEADR
BSF STATUS, RР0
BCF EECON1, EEРGD
BSF EECON1, RD
BCF STATUS, RР0
MOVF EEDATA, W
BCF STATUS, RР0
MOVF EEDATA, W
BCF STATUS, RР1
RETURN
;******************************************************************************************************
;******************************************************************************************************
LEND
MOVLW B'0'
MOVWF CCР1CON; выключен режим ШИМ
CLRF INTCON; запрет всех прерываний
CLRF РORTA
CLRF РORTC
GOTO $
END
:2 000 004 0000FA
:2 000 000 0528D1
:800 0800B92883169F0107309F
:10 001 0009F00003085008700FF3086000030870099
:10 002 000 473 081 008 1288B0083128501C001C101FF
:10 003 000 8701C301023087008E018F0105309000D7
:10 004 000 043 092 008 685 151 117 639 6800C309700C0
:10 005 000 0608B00006083002031D2F202A280108D8
:1 000 6000B80006083002031908000608B0008B1219
:1 000 700 0061CAD287E304002031D4028C3148710A3
:100 080 004 620 8101E0200B118B160800B101B70159
:1 000 9000B201B301B601C00A3008B500B509B50C0C
:1000A00035088500B01F0714B01B07100830B400D6
:1000B0003008B5000310B40303196828B50D031800
:1000C0005A28B10AD620B207031C5A28B30A5A2864
:1000D0003108031975287920360883169200120812
:1000E0000310120C831295000800831692018312EC
:1000F0000800B401B40A3708330203198228031C2C
:10 010 000 972 886 283 179 261 9521C97280310B10D66
:1 001 1000B70DB40AB71F7B28370833020319932899
:100 120 000 3189E2897283108320203189E28B70C1E
:1 001 3000B10C0310B60DB40B8C28AC283108B202F8
:1 001 400 0031CB3033708B3020314B60DB40BA9287C
:1 001 5000AC28B70CB10C8C280800C1010921C400DF
:1 001 6000C40A43148714C10A8B160B15B628B62887
:1 001 7000B6284318C8280B11C00A7E304002031D60
:1 001 8000C328C3148710FF30B800E0200B1109000A
:1 001 9000C10A0921B0004620C10A0921B800380966
:1001A00081000B11C40BD5281629090034088207D9
:1001B0000000FA34D234AA348C34823464344634A5
:1001C000C318080003178D0103134008C200F5206F
:1001D000C10A3808C200F120C10A3008C200F1206B
:1001E0000800410803178D000313420803178C0011
:1001F00083168C18F9288C130C1555308D00AA30F5
:10 020 0008D008C140C11831203130D1E05290D1281
:100 210 000 800 410 801 012 7368D0083168C130C14F9
:100 220 008 3120C0883120C08031308000030970097
:8 023 0008B01850187011B29E8
:01FF
Приложение Б