Как создать универсальный музыкальный звонок на микроконтроллере. Каковы основные характеристики такого устройства. Какие компоненты необходимы для создания звонка с заменяемыми мелодиями. Как реализовать питание от сети и батареек в одном устройстве.
Особенности и преимущества музыкального звонка на микроконтроллере
Музыкальный звонок на микроконтроллере обладает рядом существенных преимуществ по сравнению с обычными звонками:
- Возможность хранения и воспроизведения нескольких мелодий
- Простая замена и добавление новых мелодий без перепрограммирования
- Комбинированное питание от сети и батареек
- Регулировка громкости и темпа воспроизведения
- Световая индикация работы
- Режим энергосбережения
Такое устройство может использоваться не только как дверной звонок, но и в качестве музыкальной шкатулки или игрушки. Гибкие настройки позволяют адаптировать его под различные условия эксплуатации.
Основные технические характеристики звонка
Разработанный музыкальный звонок на микроконтроллере AT89C2051 имеет следующие ключевые параметры:

- Частотный диапазон: 5 октав (от 65,4 Гц до 2093 Гц)
- Темп воспроизведения: от 45 до 240 тактов в минуту
- Поддержка различных типов нот (легато, стаккато, паузы)
- Длительность нот: от целой до 1/32
- Произвольное количество мелодий в памяти микроконтроллера
- Ток потребления в режиме воспроизведения: до 250 мА
- Ток в режиме ожидания: менее 30 мкА
Такие характеристики обеспечивают широкие возможности по настройке звучания и экономичную работу устройства.
Структурная схема музыкального звонка
Основными функциональными блоками звонка являются:
- Микроконтроллер AT89C2051 — управляющий элемент
- Генератор образцовой частоты — задает тактовую частоту
- Программно-управляемый делитель частоты — формирует частоту ноты
- Генератор временных интервалов — задает длительность нот
- Схема запуска и остановки воспроизведения
- Усилитель звука на транзисторе
- Блок питания от сети и батарей
Такая структура позволяет реализовать все необходимые функции звонка при минимальном количестве компонентов.
Схема питания от сети и батарей
Для обеспечения бесперебойной работы звонка реализовано комбинированное питание от сети и батарей. Как это работает?

- При наличии напряжения в сети питание осуществляется через понижающий трансформатор, выпрямитель и стабилизатор
- Коммутация источников выполнена на диодах VD3 и VD4
- Когда есть напряжение сети, диод VD4 заперт и батареи отключены
- При пропадании сетевого напряжения открывается VD4 и подключаются батареи
- Конденсатор C9 сглаживает броски напряжения при переключении
Такая схема обеспечивает автоматическое переключение на резервное питание без прерывания работы звонка.
Программное обеспечение микроконтроллера
Управляющая программа для микроконтроллера AT89C2051 написана на ассемблере и содержит следующие основные блоки:
- Основная программа — инициализация, загрузка нот, контроль воспроизведения
- Подпрограммы обработки прерываний от таймеров
- Таблицы параметров нот, темпа, частот
- Массив данных мелодий
Компактный ассемблерный код позволяет эффективно использовать ограниченную память микроконтроллера. Какие основные функции выполняет программа?
Алгоритм работы программы звонка
Основной алгоритм работы программы музыкального звонка включает следующие шаги:

- Инициализация микроконтроллера при включении питания
- Загрузка параметров первой ноты из памяти
- Настройка таймеров для формирования частоты и длительности ноты
- Воспроизведение ноты
- Проверка на окончание мелодии
- Если мелодия не закончена — переход к следующей ноте
- Если мелодия закончена — переход в режим ожидания
При нажатии кнопки звонка происходит выход из режима ожидания и запуск воспроизведения. Как закодированы параметры нот в памяти микроконтроллера?
Кодирование параметров нот
Каждая нота в памяти микроконтроллера представлена двумя байтами, которые содержат следующую информацию:
- Темп мелодии (4 бита)
- Длительность ноты (4 бита)
- Тип ноты (2 бита)
- Код частоты ноты (6 бит)
Такое компактное кодирование позволяет хранить большое количество нот в ограниченной памяти микроконтроллера. Программа последовательно считывает эти параметры и настраивает таймеры для воспроизведения каждой ноты.
Рекомендации по сборке и настройке звонка
При самостоятельной сборке музыкального звонка следует обратить внимание на несколько ключевых моментов:

- Правильный подбор номиналов элементов схемы
- Качественная пайка соединений
- Экранирование чувствительных цепей
- Настройка громкости и тембра звучания
- Программирование микроконтроллера и отладка программы
Особое внимание нужно уделить схеме питания, чтобы обеспечить корректное переключение между сетью и батареями. При правильной сборке и настройке звонок будет работать надежно и радовать пользователей приятным звучанием.
Музыкальный звонок с заменяемыми мелодиями
Особенность устройства:
Возможность для пользователя самому обновлять мелодии звонка с помощью специальной программы «Редактор мелодий», работающей в среде Windows 9X/NT/2000. Программа позволяет импортировать мелодии из MIDI файлов. Для записи мелодий в звонок не требуется программатор.
Функциональные возможности:
- Звонок может содержать не более 100 мелодий.
- Количество нот в мелодии ограничено лишь размером свободной памяти звонка. Общий размер памяти звонка составляет 255 нот. Каждая новая мелодия уменьшает свободную память звонка на величину, равную количеству нот в мелодии плюс одна нота.
- Замена мелодий без использования программатора.
- Два режима выбора мелодий: последовательный и ручной.
Электрические характеристики:
Напряжение питания | от 3,0 до 5,5 В.![]() |
Ток, потребляемый в режиме покоя | не более 27 мкА. |
Ток, потребляемый в режиме воспроизведения мелодии | не более 250 мА. |
Принципиальная схема звонка:
Схема подключения кнопки звонка:
Печатная плата и схема расположения элементов:
- Схему и печатную плату звонка в формате P-CAD 2000 (ACCEL EDA) можно скачать здесь.
Описание работы звонка:
Звонок построен на базе микроконтроллера PIC12C509. Мелодии звонка хранятся в электрически программируемой микросхеме памяти с I2C шиной типа 24С04. Все сигналы, необходимые для управления работой звонка и чтения/записи мелодий, выведены на один разъем XP1. К этому разъему подключаются либо кнопка звонка, либо кабель для связи с компьютером.
Звонок имеет два режима выбора мелодий: последовательный и ручной. При последовательном режиме мелодии воспроизводятся последовательно одна за другой по кругу. Кнопка «Выбор мелодии» в этом режиме не используется. При ручном режиме воспроизводится постоянно одна и та же мелодия. Эта мелодия выбирается кнопкой «Выбор мелодии». Режим выбора мелодий задается при записи мелодий в звонок.
Редактор мелодий:
Для создания мелодий и записи их в звонок используется программа для персонального компьютера — «Редактор мелодий», работающая в среде Windows 9X/NT/2000. Программа позволяет импортировать мелодии из MIDI файлов.
Подключение звонка к компьютеру:
При необходимости записи новых мелодий звонок подключается с помощью кабеля к LPT-порту компьютера (порт принтера).
Схема кабеля для подключения звонка к компьютеру:
Для записи мелодий в звонок необходимо:
- Выключить питание компьютера и звонка.
- Подключить соединительный кабель одним концом к звонку, а другим концом к LPT порту компьютера.
- Включить питание звонка.
- Включить питание компьютера, загрузить Windows и «Редактор мелодий».
- Записать в звонок мелодии.
- Завершить работу в Windows, выключить компьютер.
- Отсоединить звонок от компьютера.
Управляющая программа микроконтроллера:
Микроконтроллер с «зашитой» управляющей программой можно приобрести у автора. Цена договорная.
Автор Буров Михаил. (email burov (at) kosnet.ru)
Редактор мелодий для музыкального звонка
Редактор мелодий для музыкального звонка — это программа, позволяющая:
- Создавать мелодии.
- Импортировать готовые мелодии из MIDI файлов .
(В том числе и из караоке файлов с расширением kar). - Записывать мелодии в музыкальный звонок.
Программа работает в среде Windows 9X/NT/2000. Для ее работы необходима библиотека mfc42.dll, которую легко можно найти в Интернете. Но скорее всего она уже имеется на большинстве компьютеров.
Внешний вид программы:
Загрузка редактора для музыкального звонка:
- Загрузить «Редактор мелодий» (257 КБ) можно здесь.
Автор Буров Михаил. (email burov (at) kosnet.ru)
Универсальный дверной звонок на микроконтроллере
Универсальный дверной звонок на микроконтроллере
Большинство дверных звонков применяемых в быту в виду своей дешевизны издают простые звуки, например типа ударов гонга, птичья трель или одноголосная мелодия, которые воспроизводится однообразно при каждом нажатии кнопки. Если возникает необходимость сменить мелодию в подобных звонках, то возникают заметные осложнения. Другая особенность упомянутых звонков представляет всего лишь один тип питания, это сеть или батарейки, который не всегда обеспечивает необходимую бесперебойность работы. Предлагаемый звонок выполнен на микроконтроллере, в котором в значительной мере сокращены упомянутые недостатки путем возможности перепрограммирования мелодий, применения комбинированного питания всего устройства плюс вспомогательные приспособления повышающие функциональность и безопасность при эксплуатации.
Музыкальный звонок может быть применен не только в качестве дверного звонка, но и в качестве музыкальной шкатулки или игрушки, где нет необходимости повторять одну и ту же мелодию при каждом нажатии пусковой кнопки, а проигрывать разные мелодии поочередно или случайным образом. Для совместимости режимов работы в звонке предусмотрена возможность фиксации проигрывания выбранной мелодии и дополнительной световой индикации вызова, которую можно использовать для визуального оповещения в вечернее или ночное время, где громкий звук нежелателен.
Главной особенностью предлагаемого звонка является универсальность его питания (от сети и батареек), возможность задавания режима проигрывания мелодии (поочередный перебор или фиксация), возможность перепрограммирования мелодий и переход в режим микропотребления после проигрывания мелодии, регулировка начальной громкости и ряд вспомогательных примочек для установке на месте эксплуатации.
Учитывая специфику применения микроконтроллера для реализации звонка, было принято решение применить уже ставший классическим микроконтроллер (МК) семейства MCS-51 типа AT89C2051, ресурсы которого вполне достаточны для выполнения функций одноголосного музыкального звонка.
Основные характеристики музыкального звонка:
— Частотный диапазон 5 октав
— Нижний предел диапазона нота «До» большой октавы (65,4 Гц)
— Верхний предел диапазона нота «До» 4-й октавы (2093 Гц)
— Темп проигрывания, такт/мин. от 45 до 240
— Поддержка переменного темпа да
— Поддержка типов нот легато, нон легато, стаккато и пауза
— Проигрывание нот-триолей да
— Поддержка полутонов да
— Длительность ноты от 1/1 до 1/32
— Длительность нот с точкой от 1/2 до 1/32
— Длина массива мелодии произвольная
— Число мелодий в массиве произвольное, ограничено емкостью ЭСПЗУ программ микроконтроллера
— Режим проигрывания последовательный и фиксация
— Регулировка громкости да
— Наличие режима микропотребления да
— Ток потребления в режиме
проигрывания до 250 мА
— Ток потребления в режиме пауза 6,5 – 7,5 мА
— Ток потребления в режиме
микропотребления менее 30 мкА
— Питание от сети и батареек (3 шт. по 1,5В)
Описание схемы музыкального звонка
Позвольте ув. Коты и Кошечки начать с некоторых азов, а потом перейти поближе к делу. В основе любого музыкального звонка лежит генератор образцовой частоты, программно-управляемый делитель частоты, генератор временного интервала времени и вспомогательные элементы старт/стоп (рис. 1). По этой концепции выполнен музыкальный звонок в [1]. Сама схема в публикации довольно насыщенная, рассчитана на определенную универасальность применения микросхем ПЗУ того времени (К573РФ2, КР556РТ5,КР556РТ7 и т.д.)
Рис. 1Наряду с публикацией [1] в периодике появлялись аналогичные схемы звонков и на их основе автор данной публикации тоже предложил свой вариант звонка на жесткой логике (рис. 2), которая изначально рассчитана на ПЗУ типа КР573РФ5 или ее аналог i2716. Схема содержит 7 цифровых и 1 аналоговую ИМС с минимальным количеством дискретных элементов.
Рис. 2
Предложенная схема в основном рассчитана на чисто сетевое питание, многие огрехи свойственные в [1] устранены, особенно при паузе на протяжении нескольких ячеек ПЗУ с ее кодом 00h, которые прослушиваются в виде щелчков. Другое улучшение затронуло выбор более оптимального значения задающего генератора образцовой частоты и образцового интервала времени, особенно для последнего. Величина образцовой частоты выбрана равной 33485Гц, которая позволяет перекрыть 3 октавы: от ноты «До» малой октавы (130,8Гц при коэффициенте деления 128) до ноты «До» третей октавы (1046,5Гц при коэффициенте деления 16) при приемлемой погрешности. Изначально образцовый период выбран более коротким, около 0.003125сек. (320Гц), где после предварительного деления на 16 на выводе 7 DD4 получаются интервалы времени длительностью 0,05 секунды, которые достаточны для перекрытия интервала темпа мелодии от 60 до 240 тактов в минуту для нот с длительностью от целой ноты до 1/32. Подобный прием позволяет применить в задающем генераторе керамический конденсатор с меньшей емкостью взамен электролитического, где можно получить более высокую стабильность периода. Более длительные значения звучания нот получаются за счет записи в нескольких ячейках ПЗУ подряд одинакового значения коэфициента деления образцового интервала до получения необходимой длительности звучания. Для этого звонка была разработана двухсторонняя печатная плата с размерами 80х50мм (рис. 3) с расчетом на заводское изготовление, если плату приспособить под «лазерно-утюжную» технологию, то размеры и рисунок дорожек будут иными. Как недостаток этой схемы следует отметить недостаточную экономичность в режиме ожидания (ток потребления около 8…10мА), который можно уменьшить путем применения микросхем серии КР1533 или более предпочтительный вариант, серией КР1554 (ИМС с уровнями ТТЛ и низким энергопотреблением как у микросхем КМОП)
Рис. 3
Другим вариантом воплощения звонка является применение микропроцессора Z80 со стандартной обвязкой и простейшим ЦАП для формирования звука [2], который рассчитан для проигрывания WAV файлов длительностью около 3 секунд, что делает не столь эффективное использование ПЗУ объемом 64КБ.
Самым близким к оптимальному решению является звонок в [3], где был применен МК ATtiny2313, в котором в той или иной мере реализована структура из рис.1 на программном уровне и послужил в качестве прототипа для данного музыкального звонка. Несмотря на то, что упомянутый МК имеет объем ЭСПЗУ для программ 2КБ, его недостаточно для массива нот мелодии, где объяснение довольно простое, любая инструкция (команда) управляющей программы состоит из 2-х байт которое и «съедает» определенный объем из адресного пространства для массива нот. В виду этих особенностей в авторском варианте в [3] число мелодий составляет всего лишь 4. В предлагаемом звонке было принято решение применить более «древний» МК типа AT89C2051 с тем же объемом ЭСПЗУ 2КБ, наличие в его системе большинства однобайтных команд позволяет выиграть дополнительное пространство ЭСПЗУ для массива нот, а саму программу написать на языке Ассемблер для получения более компактного исполняемого кода. С точки зрения интерфейса ввода/вывода эти МК совместимы, у них также совпадают по расположению и функциональному назначению выводы корпуса.
На основе структуры на рис.1 была разработана микроконтроллерная версия 1 (рис. 4) с чисто сетевым питанием, на ней в дальнейшем были отработаны все дальнейшие доработки. В целом схема ничем не отличается он набора типовых приемах подключения внешних устройств и цепей запуска к МК. Для запуска использовал все свойства входов прерываний, один для запуска второй для фиксации мелодии. Для желающих повторить привожу рисунок монтажа (рис. 5) и внешний вид самой сборки (рис. 6), размеры платы составляют 50х50мм.
Рис. 4
Рис. 5Рис. 6.
В качестве достоинств были получены отличные характеристики (они заявлены выше) за исключением микропотребления. Этот «прокол» вызван особенностью транзисторов структуры N-P-N, которые для выключенного состояния требуют лог. «0» на соответствующем выводе порта В/В, а контроллер в режиме пониженного или микропотребления выставляет лог. «1», что не совсем устраивает для режима ожидания. Как результат МК потребляет около 6,5…7мА в режиме паузы или ожидания, для сетевого питания это допустимо, но для батарейного — нет. Для исправления этого изъяна была разработана 2-я версия, в которой транзисторы структуры N-P-N были заменены на P-N- P (рис. 7) и соответственно его монтаж (рис. 8). Расположение деталей полностью совпадает с 1-й версией, только рисунок дорожек изменен в зоне расположения транзисторов. В прошивке также внесены изменения с логикой управления портов В/В и введение активации бита IDL перед входом в режим ожидания.
Рис. 7Рис. 8
После таких перестановок частично проблему удалось решить, при этом было возможно ввести только режим IDL (пониженное потребление), при проверке на авторском экземпляре он составил 1,3…1,5 мА, что также приемлемо только для сетевого питания. Это ограничение вызвано тем, что бит PD регистра PCON (см. структуру МК из даташита производителя) сбрасывается только после общего сброса, когда бит IDL очищается и от любого активного прерывания. Для полного устранения проблемы пришлось отказаться от схемы запуска по выводу прерывания INT0, доработать схему цепи сброса, ввести комбинирование питание от сети и батареек и естественно доработать прошивку, отличается она только записью «1» в бит PD помимо бита IDL регистра PCON. О всех изменениях речь пойдет ниже.
Схема музыкального звонка версии 3 (рис.9) изначально переведена на универсальное питание от батареек и сети, при желании можно оставить только один тип питания (сеть или батарейки). Учитывая специфику режима микропотребления МК его запуск выполняется через вспомогательную цепь SA1R2C1VD1, которая дополняет стандартную цепь начального сброса рекомендованной производителем. Цепь R2C1 служит для формирования сигнала лог. «0» и принужденного его удержания на время инициализации при первом включении питания, дальше она влияния на дальнейшую работу звонка не оказывает.
Рис. 9.
Следующая цепь SA2R3C3 служит для фиксации повторения мелодии, где SA2 надо замкнуть до окончания проигрывания мелодии, иначе будет проигрываться первая мелодия из массива, адрес которой задается при первом включении питания. Индикатор HL1 управляемый усилителем на VT1 предназначен для световой сигнализации проигрывания мелодии и может быть применен для подсветки дверной кнопки или корпуса звонка. В случае возникновения необходимости управления лампой накаливания при пониженной или отключенной громкости, то последовательно с HL1 можно включить светодиод оптрона, который через симистор включает лампу (рис. 10). Такая ситуация очень часто возникает когда в квартире находятся люди с ослабленным слухом или спят маленькие дети и громкий звук нежелателен (противопоказан), особенно в ночное время. Номинал резистора R6 (см. рис. 9) при таком применении следует уменьшить до 75 Ом.
Рис. 10.
Питание от сети стандартное, это понижающий трансформатор, выпрямительный мост, сглаживающий фильтр и стабилизатор напряжения. Коммутация питание сеть/батарейки выполнена на диодах VD3, VD4 которое автоматически определяет наличие напряжения в сети и батареек. При наличии напряжения в сети диод VD4 будет находиться в запертом состоянии и тем самым отключит батарейки от основной схемы. При пропадании напряжения в сети диод VD3 закроется и VD4 откроется, как результат батарейки будут запитывать основную часть схемы, конденсатор C9 предназначен для сглаживания бросков напряжения при коммутации и подавления импульсных помех при работе МК.
Прграмма управления.
Для управления всей схемной части в память программ МК записывается программа, которая и определяет режим работы всего музыкального звонка. В виду малого объема памяти программ МК управляющая программа написана на языке Assembler-51, что дает самый компактный исполняемый код после компиляции. По структуре программа условно поделена на следующие части:
— Основная программа;
— Подпрограмма обслуживания прерываний по таймеру T/C0;
— Подпрограмма обслуживания прерываний по таймеру T/C1;
— Подпрограмма обслуживания прерываний по входу INT0.
— Таблица размерности и типа ноты
— Таблица темпа мелодии
— Таблица частоты ноты
— Массив нот мелодий
Основная программа выполняет следующие операции: инициализация, загрузка нот, отслеживание конца мелодии и конца массива нот. При инициализации предусмотрена проверка первого включения, она сводится к проверке состояния порта P3.2 если на нем уровень лог. «0» то программа воспринимает его как первое включение (время удержания лог. «0» определяется параметрами цепи R1C2 к выводу 6 DD1), если лог. «1» — то это повторный запуск по выводу сброса, этот сигнал формируется дифференцирующей цепью R2C1 и защитным диодом VD1. После инициализации следует загрузка кода ноты состоящая из 2-х байт, которые проверяются на наличие конца мелодии, его признаком является установка в лог «1» младшей тетрады второго байта. Если это условие выполнено, то следует проверка конца массива нот, если нет, то следует переход на загрузку параметров ноты, активацию флажков и проигрывание ноты. При контроле конца мелодии и массива нот в программе предусмотрен перевод МК в режим микропотребления, выполняется путем записи лог. «1» в биты 0 и1 регистра PCON, выход из этого режима происходит путем подачи положительного импульса длительностью не менее 24 тактов кварцевого генератора на вывод 1 DD1. По окончанию проигрывания ноты выполняется переход на загрузку очередной пары байтов очередной ноты.
В качестве признака конца массива нот необходимо чтобы последующая пара байтов имела значение 0FFh. При соблюдении данного условия в пользовательский указатель массива перезаписывается начальный адрес массива.
Каждая нота состоит из пары байтов, поэтому массив нот для любой мелодии должен содержать четное число байтов. Распределение и назначение битов в байтах кода ноты приведены в таблице 1.
Таблица 1. Распределение и назначение битов
Первый байт |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
t3 |
t2 |
t1 |
t0 |
d3 |
d2 |
d1 |
d0 |
Темп мелодии, тактов/мин. |
Длительность ноты |
||||||
Второй байт |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
N1 |
N0 |
f5 |
f4 |
f3 |
f2 |
f1 |
f0 |
Тип ноты |
Код частоты ноты |
Далее операция загрузки нот условно разделена на процедуру загрузки темпа мелодии, длительности и типа ноты, загрузка частоты ноты, установка флажков пользователя и запуск проигрывания. Во время проигрывания программа выполняет опрос флажков и выполняет предписанные для них действия с последующим их сбросом, установка флажков происходит по событиям возникновения прерывания.
Загрузка темпа мелодии выполняется последовательным извлечением из таблицы 2-х байт коэффициента деления по указателю DPTR, где адрес формируется следующим образом. Биты t0…t1 заносятся в младшую тетраду аккумулятора и сдвигаются влево на один бит, в счетчик-указатель DPTR заносится начальный адрес 0220h и извлекается младший байт командой MOVC A,@A+DPTR, перед выполнением надо позаботиться сделать копию аккумулятора в стеке или в одной из ячеек ОЗУ МК. Далее восстанавливают содержимое аккумулятора, инкрементируют его и извлекают из таблицы старший байт аналогичным образом. Извлеченные байты запоминаются в ячейках ОЗУ, которые в дальнейшем служат в качестве константы-источника для перезагрузки регистров TL1и Th2 таймера-счетчика C/T1 при прерывании по переполнению. Значения темпа и коэффициентов деления для таймера-счетчика T/C1 приведены в таблице 2 для кварцевого резонатора на 12 МГц (здесь и далее все значения частоты и периода приведены для кварцевого резонатора с частотой 12 МГц).
Таблица 2. Значения битов t0… t3 для темпа мелодии.
Биты 4…7 первого байта |
Темп мелодии, тактов в минуту |
Кдел (шестн.) |
|||
t3 |
t2 |
t1 |
t0 |
||
0 |
0 |
0 |
0 |
45 |
5DAEh |
0 |
0 |
0 |
1 |
60 |
85F6h |
0 |
0 |
1 |
0 |
75 |
9E60h |
0 |
0 |
1 |
1 |
80 |
A47Bh |
0 |
1 |
0 |
0 |
90 |
AE3Fh |
0 |
1 |
0 |
1 |
105 |
BA74h |
0 |
1 |
1 |
0 |
120 |
C1C7h |
0 |
1 |
1 |
1 |
135 |
CA52h |
1 |
0 |
0 |
0 |
140 |
CBB7h |
1 |
0 |
0 |
1 |
150 |
CF34h |
1 |
0 |
1 |
0 |
165 |
D399h |
1 |
0 |
1 |
1 |
180 |
D762h |
1 |
1 |
0 |
0 |
195 |
DA78h |
1 |
1 |
0 |
1 |
210 |
DD28h |
1 |
1 |
1 |
0 |
225 |
DF7Ah |
1 |
1 |
1 |
1 |
240 |
E184h |
Последующая загрузка длительности и типа ноты выполняется аналогично, где из таблицы ЭСПЗУ МК тоже извлекаются два байта по указателю DPTR по команде MOVC A,@A+DPTR, где первый отвечает за длительность звучания ноты, второй за молчание (паузу) ноты. Начальный адрес таблицы заносится в счетчик-указатель DPTR и равен 1A0h, а смещение состоит из битов N0,N1, d0…d3 первого и второго байтов ноты, для наглядности его представление в аккумуляторе приведено ниже:
Биты в аккумуляторе |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
N1 |
N0 |
d3 |
d2 |
d1 |
d0 |
0/1 |
В зависимости от типа ноты (легато, нон легато, стаккато и пауза) соотношение значений байтов отвечающих за звучание и молчание ноты приведены в таблице 4.
Таблица 4. Назначение битов N0 и N1.
Биты второго байта |
Тип ноты |
Длительность звучания |
Длительность молчания |
|
7 (N1) |
6 (N0) |
|||
0 |
0 |
Пауза |
0 |
4/4 |
0 |
1 |
Легато |
4/4 |
0 |
1 |
0 |
Нон легато |
7/8 |
1/8 |
1 |
1 |
Стаккато |
3/4 |
1/4 |
Длительность ноты с учетом ее типа тоже задана табличным способом, где сумма длительности звучания и молчания ноты с указанными соотношениями в табл. 4 является постоянным и соответствует длительностям целой ноты, 1/2, 1/4 и т. д. где весь набор значений приведен в таблице 5 с учетом длительностей триолей.
Таблица 5. Назначение битов d0… d3 длительности нот.
Биты первого байта |
Длительность ноты |
Сумма длительности звучания и молчания |
|||
3 (d3) |
2 (d2) |
1 (d1) |
0 (d3) |
||
0 |
0 |
0 |
0 |
1/1 |
80h |
0 |
0 |
0 |
1 |
1/2· |
60h |
0 |
0 |
1 |
0 |
1/2 |
40h |
0 |
0 |
1 |
1 |
1/4· |
30h |
0 |
1 |
0 |
0 |
1/3 |
2Bh |
0 |
1 |
0 |
1 |
1/4 |
20h |
0 |
1 |
1 |
0 |
1/8· |
18h |
0 |
1 |
1 |
1 |
1/6 |
15h |
1 |
0 |
0 |
0 |
1/8 |
10h |
1 |
0 |
0 |
1 |
1/16· |
0Ch |
1 |
0 |
1 |
0 |
1/12 |
0Ah |
1 |
0 |
1 |
1 |
1/16 |
08h |
1 |
1 |
0 |
0 |
1/32· |
06h |
1 |
1 |
0 |
1 |
1/24 |
05h |
1 |
1 |
1 |
0 |
1/32 |
04h |
1 |
1 |
1 |
1 |
Признак конца мелодии |
02h |
Примечание: символ · указывает на ноту с точкой.
Извлекаемые из таблицы байты звучания и молчания (в тексте программы они имеют условные обозначения Nt_D и Nt_P) запоминаются в ячейках ОЗУ, которые при последующем проигрывании вычитаются при каждом переполнении таймера-счетчика T/C1. Загружаемая константа для T/C1 выбрана таким образом, что одна целая нота отсчитывает 80h (128 десятичное) переполнений T/C1. Например для ноты нон легато с длительностью 1/2 значение Nt_D=38h (56 десятичное) и Nt_P=8h и их сумма составит 40h (64 десятичное), что для темпа мелодии 120 тактов в минуту длительность звучания будет 0,875 сек. и молчание 0,125 сек., всего длительность ноты 1/2 составит 1 секунду. Если та же нота является стакатто, то при упомянутом темпе мелодии звучание 0,75 сек. и молчание 0,25 сек., при ноте легато звучание 1сек и молчание 0 сек, при паузе звучание 0 сек. и молчание (пауза) 1 секунда.
Далее следует загрузка частоты ноты, где смещение в таблице определяется битами f0…f5 второго байта ноты которые размещаются в аккумуляторе со смещением в один бит влево (см. ниже) и загрузкой начального адреса 240h в счетчик-указатель DPTR аналогично алгоритму упомянутого выше.
Биты в аккумуляторе |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
f5 |
f4 |
f3 |
f2 |
f1 |
f0 |
0/1 |
Извлеченные байты также запоминаются в ячейках ОЗУ и служат константой-источником для перезагрузки регистров TL0 и TH0 при каждом прерывании по переполнению таймера-счетчика C/T0. Величина константы выбрана для получения частоты вдвое большей чем необходимо с целью получения сигнала «меандр» для генерации звука путем инверсии бита P1.7 при каждом прерывании C/T0, которая автоматически делит частоту на 2.
После загрузки параметров ноты следует процедура активации флажков пользователя, запуск счетчиков-таймеров C/T0 и C/T1 с последующей проверкой конца проигрывания, его критерием служит переход с 00h в 0FFh ячеек ОЗУ с именами Nt_D и Nt_P (см. текст программы на ассемблере).
Собственно сам массив нот для мелодий размещен с адреса 2BAh (для версии 2 и 3), который занимает всю оставшиеся ЭСПЗУ МК, где число мелодий и их длина произвольная. В авторском варианте демо-версии размещены 12 фрагментов мелодий со средней длительностью звучания 4…8 секунд, при желании можно довести до 20 или применить AT89C4051 с объемом 4КБ ЭСПЗУ, в которой можно разместить до 60 мелодий, при этом схема и печатная плата остаются неизменными. Для версии 1 массив мелодий размещен по адресу 2AEh. Для замены/добавления мелодий в любом редакторе BIN-файлов заносятся вручную коды нот по указанным выше смещениям адресов, сами ноты должны быть заранее закодированы согласно приведенной выше структуре.
Монтаж и настройка электронной части
Большинство деталей музыкального звонка собраны на односторонней печатной плате размерами 47х45 мм (рис. 11). При монтаже печатной платы в желательно предусмотреть установку микроконтроллера на панельку, это необходимо для удобства ремонта и смены его прошивки МК в процессе эксплуатации.
Рис. 11
При соблюдении номиналов деталей и сборке платы без ошибок, она должна заработать сразу. До установки МК в панельку, следует проверить напряжение на выходе стабилизатора напряжения +5 В ±0,4 В, проверить работу динамика BA1 и светодиода HL1 путем замыкания на землю выводов 19 и 18, при этом из динамика должен раздаться щелчок и светодиод загореться. Далее подключают кассету с батарейками и проверяют напряжение питания на выводе 20, при включенном сетевом питании, оно должно быть 5В, при отключении от сети 4,5В (суммарное напряжение батареек) Убедившись что все в порядке отключают устройство от сети и извлекают батарейки из кассеты, после этого устанавливают МК в панельку, подключают остальные внешние элементы схемы и подают питание от сети. При этом проигрывается первая мелодия из массива нот, которая служит своеобразным контролем правильности работы звонка. Далее размыкают контакты выключателя SA2 и нажатием на кнопку SA1 прослушивают перебираемые мелодии, по одной при каждом нажатии. Для фиксации повторения мелодии необходимо замкнуть контакты SA2 до окончания проигрывания мелодии, последующие нажатия SA1 будут проигрывать выбранную мелодию. При необходимости с помощью резистора R7 устанавливают требуемую громкость. Режим фиксации мелодии предпочтительно применять для сетевого питания, иначе батарейки разрядятся за 2-3 недели (для батарейного варианта питания).
После сборки и наладки электронную часть следует разместить в подходящий корпус, очень удачно подходят корпуса от абонентских громкоговорителей, которые уже содержат громкоговоритель и переменный резистор. В авторском экземпляре звонка применен корпус от звонка китайского производства, где его родная электронная начинка удалена и размещена электронная часть звонка на микроконтроллере (рис.12…14). В виду нехватки места в корпусе кассета с батарейками установлена с наружной стороны (см. рис. 13), но это даже и лучше, подобное размещение удобно для быстрой замены батареек без разборки корпуса.
Рис.12.
Рис. 13
Рис. 14
Детали и их допустимая заменаВ музыкальном звонке стабилизатор напряжения КР142ЕН5А можно заменить на LM7805, выпрямительный мост RС207 можно заменить аналогичным по параметрам или 4-мя выпрямительными диодами, например типа 1N4007 (в последнем случае придется доработать печатную плату).
Светодиод можно взять типа АЛ307 или аналогичные отечественного или зарубежного производства с рабочим прямым током 10-15 мА с красным цветом свечения.
Транзисторы КТ3107БМ и КТ973Б на любые зарубежные аналоги. Громкоговоритель любой малогабаритный мощностью 0,5…1Вт, подойдет даже громкоговоритель от системного блока компьютера.
Понижающий трансформатор можно использовать любой, где вторичная обмотка обеспечивает выходное напряжение 7…9В и ток нагрузки 200…250 мА.
Постоянные резисторы типа МЛТ, ОМЛТ, С2-33 или аналогичные с мощностью рассеивания 0,125 или 0,25 Вт, подстроечный резистор R7 следует выбрать многооборотными типа СП5-2ВБ или его импортный аналог. Электролитические конденсаторы типа К50-35, К50-45 или аналогичные импортного производства. Керамические конденсаторы можно взять любого типа отечественного или зарубежного производства. Если невозможно найти керамические конденсаторы емкостью 2,2 и 10 микрофарады (это конденсаторы C1, C2 и C9), то допустимо применить электролитические, но следует учесть их габариты при установке на печатную плату.
И в заключение стоит отметить, что данную схему можно перевести на другой тип микроконтроллера, например, это может быть МК типа Tiny2313, который по выводам полностью совпадает с AT89C2051. В этом случае вносить изменения в печатную плату не нужно. Изменения в основном затронут только программу управления, только следует учесть более меньший объем ЭСПЗУ для массива мелодий и архитектурные различия между Tiny2313 и AT89C2051. В дальнейшем в музыкальном звонке можно реализовать многоголосный вариант (полифонию) и даже синтез речи, но для этого понадобится более совершенный МК, например это может быть один представитель из семейства ATmega или MSP430.
Литература
1. Симутин А. Программируемый электромузыкальный звонок «К25-унисон» // Радиолюбитель. – 1991. – №7. – С.13-16.
2. Сторчак К. Музыкальный звонок, который умеет все // Радиохобби. – 1998. – №1. – С. 44-45.
3. Дверной звонок
Файлы:
Печатные платы
Пришивки МК
Все вопросы в Форум.
Звонок с заменяемыми мелодиями v2.0
Особенность устройства
- Возможность для пользователя самому обновлять мелодии звонка, используя персональный компьютер (ПК). Для обновления мелодий звонок подключается к LPT порту ПК при помощи специального кабеля.
- Воспроизведение одноголосых мелодий.
Файл (wave) со звучанием звонка можно загрузить здесь. - Для создания мелодий и записи их в звонок используется программный пакета «Мелодия».
Функциональные возможности
- Размер памяти звонка — 255 нотных знаков (8 — 10 мелодий).
- Два режима выбора мелодий — последовательный и ручной.
Электрические характеристики
Напряжение питания | от 3,0 до 5,5 В. |
Ток, потребляемый в режиме покоя | не более 27 мкА. |
Ток, потребляемый в режиме воспроизведения мелодии | не более 250 мА. |
Принципиальная схема звонка
Схема подключения кнопки звонка
Печатная плата и схема расположения элементов
Схему и печатную плату звонка в формате P-CAD 2000 (ACCEL EDA) можно скачать здесь.
Фотография печатной платы
Описание работы звонка
Звонок построен на базе микроконтроллера PIC12C509.
Мелодии звонка хранятся в электрически программируемой
микросхеме памяти с I2C шиной типа 24С04. Все сигналы,
необходимые для управления работой звонка и чтения/записи
мелодий, выведены на один разъем XP1. К этому разъему
подключаются либо кнопка звонка, либо кабель для
связи с компьютером.
Звонок имеет два режима выбора мелодий: последовательный и ручной.
При последовательном режиме мелодии воспроизводятся последовательно
одна за другой по кругу. Кнопка «Выбор мелодии» в этом режиме не используется.
При ручном режиме воспроизводится постоянно одна и та же мелодия.
Эта мелодия выбирается кнопкой «Выбор мелодии».
Режим выбора мелодий задается при записи мелодий в звонок.
Рекомендации по сборке
- Установить все элементы на плату звонка за исключением микроконтроллера DD2.
- Подсоединить звонок кабелем (схему см. ниже) к LPT-порту компьютера. Питание компьютера и звонка при этом рекомендуется выключить.
- Включить питание компьютера и звонка.
- Запустить программу
«Звонок». Появится главное окно программы:
Нажать в окне кнопку «Обновить». Если все собрано правильно и все элементы исправны, то статус звонка обновиться примерно следующим образом:
В противном случае будет выведено сообщение об ошибке:
В случае ошибки проверить правильность монтажа элементов, распайку кабеля, исправность транзисторов VT1, VT2 и EEPROM DD1.
- Получив успешно статус звонка, можно устанавливать микроконтроллер DD2, предварительно выключив питание звонка и компьютера.
Порядок записи мелодий в звонок
- Подсоединить звонок кабелем (схему см. ниже) к LPT-порту компьютера. Питание компьютера и звонка при этом рекомендуется выключить.
- Включить питание компьютера и звонка.
- Запустить программу «Звонок». Нажать в окне программы кнопку «Обновить» и получить статус звонка.
- Записать новые мелодии в звонок с помошью программы «Звонок».
- Выключить питание звонка и компьютера, и отсоединить звонок от компьютера.
Схема кабеля для подключения звонка к компьютеру
Управляющая программа микроконтроллера
Проект не поддерживается.
Актуальный проект
Музыкальный звонок MAXI.
Отправить
Предыдущий проект
Следующий проект
Музончик
МузончикМузыкальный звонок.
Не
бейте меня: Я понимаю,что проигрывать музыку при помощи микроконтроллера — все равно,что забивать гвозди микроскопом. Но вот захотелось поиграться 🙂 Результатом стала программа для моего любимого AT90S2313 которая проигрывает 5 мелодий. |
- Мелодия из к/ф «Бумер» (Мобильник)
- Мелодия из к/ф «Джентельмены удачи»
- Мелодия из к/ф «Ва Банк»
- Мелодия из к/ф «Служебный Роман»
- Песня «Листья желтые»
Это устройство можно использовать в качестве дверного звонка или музыкальной шкатулки. |
Сами исполныемые мелодии вынесены в отдельный файл «Muson.c». Ноты взяты из кодов мелодий для мобильного телефона NOKIA. Желающие могут сами написать свои мелодии. |
Программа занимает 995 байт ПЗУ. Так,что даже у 2313 еще есть куда расти 🙂 |
Вместо 90S2313 можно использовать Tiny2313 (программа для Тини тож прилагается) При этом фузы у Тини должны быть записаны следующим образом: |
- CKSEL = F — Задана работа от внешнего кварца
- CKDIV = 1 — Предделитель отключен.
Схема:
Управляющая программа
обеспечивает следующие
действия:
Пока проигрывается мелодия МК не реагирует на нажатие кнопок. |
Прилагаемые файлы:
PS: В связи с бешеной популярностью этой программы 30.03.2005 были внесены изменения
- Формат выходного файла автоматически Intel standart hex
- Проект пересобран под IAR EWAVR 4.10A
- Пересобран под CodeVision
Господа, учите описания на ваши компиляторы 🙂
PPS: Вот не хотелось, а пришлось
Надеюсь больше нет компиляторов Си для AVR :-))
15.08.2006
Микроконтроллер с длинным проводом для цифрового ввода
У меня есть кнопка дверного звонка в моем доме, подключенная к плате разработчика GHI EMX . Программное обеспечение оценивает время суток и определяет, должен ли звонить дверной звонок.
Примечание: это было реализовано как способ справиться с шалостями динг-донг-канва, которые я получал.
Все это прекрасно работает, за исключением одной проблемы: провод, подключенный к плате EMX, имеет длину около 50 футов (~ 15 метров) и создает достаточно помех для платы, чтобы думать, что кто-то нажал кнопку, и, таким образом, мой дверной звонок звонит через случайные промежутки времени на всем протяжении день. И моя жена, и моя собака не ценят это (но дети думают, что это очень весело).
Я попытался исправить проблему, следуя советам, найденным в этой статье, и реализовав следующую схему:
Это не решило проблему, но я обнаружил, что установка резистора 3 кОм на 1 кОм и замена конденсатора 0,01 мкФ на 40 мкФ работает немного лучше, но все, что больше 3 кОм, вызывает заметную задержку при нажатии кнопки до звон колоколов. Разница для моей схемы заключается в том, что плата работает от 3,3 В вместо 5 В (что, я полагаю, усугубляет проблему) и вместо подключения к заземлению коммутатор замыкает цепь (т.е. два провода идут между микроконтроллером и коммутатором).
Провод, который проходит между выключателем и микроконтроллером, является стандартным проводом дверного звонка, который не экранирован и не скручен. Замена провода дверного звонка экранированным проводом, к сожалению, не вариант, поскольку для этого потребуется оторвать гипсокартон.
Я рассмотрел следующий вопрос здесь , но, похоже, он имеет дело с АЦП, который может немного отличаться от моей проблемы. Любая помощь приветствуется.
Обновление
После прочтения большей части документации кажется, что хотя микроконтроллер питается от 3,3 В, он допускает 5 В на своих выводах ввода / вывода. Я могу установить более высокое значение резистора, если использую 5 В, но поможет ли это что-нибудь?
Музыкальный звонок на AT90s2313 – Радиодед
Эта схема простого музыкального звонка собрана на микроконтроллере. Используется всего одна микросхема, благодаря чему кроме традиционных преимуществ вроде увеличения надежности, уменьшения потребления энергии, появляется принципиальная возможность разместить всю схему в очень небольшом объеме, например оформив в виде музыкальной поздравительной открытки.
Благодаря использованию микроконтроллера схема предельно упрощается, необходимо только подключить питание (от 2,7 до 6 вольт), кварцевый резонатор и если необходимо усилитель низкой частоты, собранный на транзисторе КТ815. Если предполагается что ток через нагрузку не будет превышать 20 мА, (например при использовании пьезоизлучателя), можно обойтись без усилителя. Следует заметить, что 20 мА, это максимальный ток логического нуля, то есть второй вывод звукового излучателя следует подключать к плюсу питания. Кнопка звонка должна иметь нормально замкнутые контакты, при нажатии на нее схема обесточивается, а при отпускании на нее подается питание и происходит автоматический сброс микроконтроллера. Сразу же после сброса начинает работать программа проигрывающая заданную мелодию. После завершения мелодии микроконтроллер переходит в режим пониженного энергопотребления “Power Down” и находится в нем до следующего нажатия на кнопку.
Частоту кварца можно выбрать практически любую в диапазоне от 32768 кГц до 10 МГц. Схема была проверена на частоте 10 МГц, если Вы хотите использовать кварц на меньшую частоту (при этом уменьшится и потребляемый ток схемы), необходимо пропорционально уменьшить коэффициенты таблицы SoundTab и длительности звучания всех нот.
Эта программа написана на ассемблере для AT90S2313 (замена – ATtiny2313), таблица нот рассчитана для работы процессора на максимальной частоте 10 МГц, вместо мелодии используется проигрывание гаммы от более низких нот к более высоким и обратно.
Просмотров всего: 1 277, сегодня: 1
Схема. Многофункциональный дверной звонок с режимом охраны
Кроме выполнения своей основной функции — проигрывания мелодии при нажатии на установленную у двери кнопку — этот звонок показывает текущее время и дату, а также температуру в месте его размещения. При включённом режиме «Охрана» он регистрирует число нажатий на звонковую кнопку, время и дату этих нажатий, оповещает об открывании дверей и окон в помещении. Предусмотрено также оповещение о чрезмерном повышении или понижении температуры, отключение звука (звонка) и подключение дополнительных выносных звуковых или световых сигнализаторов.
Технические характеристики
Напряжение питания, В……………………………………12…20
Минимальный потребляемый ток (ток покоя), мА……..100
Максимальный потребляемый ток, мА…………………..160
Интервал рабочей температуры, °С …………………….-5…+45
Погрешность измерения температуры, °С………………± 0,5
Габаритные размеры, мм ………………………………….171x121x80
Схема многофункционального звонка показана на рис. 1. «Ядро» устройства — микроконтроллер DD1 (ATmega16-16PU). Его тактовая частота стабилизирована кварцевым резонатором ZQ1, работу которого обеспечивают конденсаторы С1 и С2. Номинал резистора R3 выбирают таким, чтобы яркость подсветки экрана ЖКИ HG1 была оптимальной, а подстроечным резистором R2 устанавливают необходимую контрастность изображения на экране ЖКИ. Перед первым включением звонка рекомендуется поставить движок подстроечного резистора в среднее положение.
На транзисторе VT1 собран электронный ключ, управляющий реле К1. Диод VD1 защищает транзистор от напряжения самоиндукции, возникающего на обмотке реле. А к его контактам можно подключить внешний звонок или сигнальную лампу (для людей с ослабленным слухом). Если использована лампа на 220 В, то контакты реле должны быть рассчитаны на коммутацию такого напряжения.
Собственные звуковые сигналы (мелодии) микроконтроллер генерирует на выходе PD5, с которым через защитный резистор R10 соединён УМЗЧ с громкоговорителем. Я использовал простой усилитель, собранный на микросхеме TDA2003, вместо которой можно применить К174УН7.
К разъёму Х1 подключают «охранный шлейф» — замкнутую в нормальном состоянии цепь, разрываемую, например, герконами при открывании дверей и окон, на которых они установлены.
Разъём Х2 предназначен для соединения с программатором. Это необходимо при загрузке программы в установленный на плату звонка микроконтроллер DD1. Я использовал программатор AVR910 [1]. Сначала во FLASH-память микроконтроллера следует загрузить содержимое файла Zwonok(project).hex, а затем запрограммировать конфигурацию микроконтроллера согласно рис. 2.
Находящуюся у входной двери кнопку звонка (SB1) соединяют с разъёмом ХЗ изолированными проводами минимально возможной длины. Но следует иметь в виду, что старые электромагнитные звонки питаются, как правило, от сети 220 В, а их кнопка установлена в разрыв одного из питающих проводов. Если взамен такого звонка будет использован описываемый, придётся переделывать квартирную электропроводку либо можно подключить кнопку по схеме, опубликованной в [2], или другой подобной, обеспечивающей электрическую изоляцию многофункционального звонка от сети.
Кнопки SB2—SB8 служат для управления звонком. Кнопка SB9 требуется для установки устройства в исходное состояние. Это бывает необходимо в случае «зависания» микроконтроллера. Светодиоды HL1—HL4 (соответственно синего, красного, оранжевого и зелёного цветов свечения) предназначены для индикации состояния устройства.
Датчик температуры ВК1 и часы реального времени DD2 соединены с микроконтроллером DD1 шиной I2C. Линии SDA и SCL этой шины связывают с плюсом питания резисторы R6 и R11.
ВК1 — термометр и термостат с цифровым вводом/выводом информации [3]. В нашем случае он используется только как термометр и передаёт измеренные значения температуры девятиразрядным двоичным дополнительным кодом с ценой младшего разряда 0,5 °С. Интервал измеряемой температуры -55… + 125 °С.
DD2 — часы-календарь реального времени [4]. Они отсчитывают секунды, минуты, часы, день недели, число, месяц и год. Точность хода обеспечивает кварцевый резонатор ZQ2. Счёт времени может вестись как в 24-часовом, так и в 12-часовом режиме (в нашем случае использован только 24-часовой режим). Число дней в каждом месяце заложено в память микросхемы и автоматически корректируется с учётом високосных лет.
Кроме полных часов-календаря, микросхема содержит 56 байт энергонезависимого статического ОЗУ. В ней имеется встроенный узел переключения на резервное питание при отключении основного источника напряжения +5 В. Для поддержания хода часов необходимо, чтобы напряжение резервного элемента G1 находилось в интервале 2…3,5 В.
Узел питания многофункционального звонка построен по схеме, изображённой на рис. 3. Резистор R1 гасит излишек напряжения, подаваемого на стабилизатор DA2, уменьшая рассеиваемую этим стабилизатором мощность. Его подбирают таким, чтобы при сработавшем реле К1 (см. рис. 1) напряжение между выводами 1 и 2 стабилизатора DA2 не стало менее 7 В.
Подаваемое на разъём Х1 узла питания постоянное нестабилизированное напряжение Uпит может находиться в интервале 14…20 В. Если же оно стабилизировано и равно 12 В, стабилизатор DA1 вместе с конденсаторами СЗ и С4 можно исключить, а катод диода VD1 и соединённые с ним обкладки конденсаторов С1 и С2 присоединить прямо к левому (по схеме) выводу резистора R1 и выходу +12 В.
Внешний вид многофункционального звонка представлен на рис. 4. Кнопки SB5—SB8 расположены ромбом в соответствии со своим функциональным назначением. Так как кнопкой SB9 приходится пользоваться очень редко, на лицевую панель она не выведена. Однако в панели (ниже светодиодов) предусмотрено небольшое отверстие, через которое на эту кнопку можно нажать, например, стержнем от шариковой авторучки.
Подстроечный резистор R2 — любой малогабаритный, например, СПЗ-38а или СПЗ-386. Резистор R1 в узле питания — С2-23-0.25. Остальные резисторы — С2-23-0,125.
Реле К1 — с обмоткой на 12В и током срабатывания не более 50 мА. Я использовал оказавшееся под рукой старое реле РЭС15 исполнения РС4.591.006. Вместо диода 1N4001 параллельно обмотке реле можно подключить диод Д220 или Д310. Светодиоды серии КИПД 66 заменимы другими подходящего цвета свечения и яркости.
Элемент G1 любой литиевый напряжением 3 В. При ёмкости 48 мА-ч и более он в отсутствие основного питания сможет поддерживать ход часов микросхемы DS1307 более 10 лет.
После включения внешнего питания звонок воспроизводит «мелодию приветствия». Это сделано для того, чтобы после временного отключения электроэнергии можно было своевременно узнать о её включении, не оставляя для этого включёнными осветительные лампы и другие электроприборы. При появлении электроэнергии вы об этом услышите…
Затем происходит инициализация датчика температуры ВК1, часов реального времени DD2, ЖКИ HG1 и включается зелёный светодиод HL4. По завершении запуска программы на экране ЖКИ появляется главное меню (рис. 5).
В строке «Кнопка ЗВОНОК» этого меню выводится информация о числе нажатий на кнопку SB1 и дублирующую её кнопку SB2. Далее следуют строки «Настройки…», «Температура», в которой выводится её текущее значение в градусах Цельсия, и строка с текущими временем и датой.
Если с помощью кнопок SB5 «Вверх» и SB7 «Вниз» выбрать строку «Кнопка ЗВОНОК» и нажать на кнопку SB8 «Ввод», на экран ЖКИ будет выведен отчёт о четырёх последних нажатиях на SB1 и SB2 (рис. 6). После его просмотра в главное меню возвращаются нажатием на кнопку SB6 «Назад».
При входе описанным выше способом в меню «Настройки…» на экране появится изображение, подобное показанному на рис. 7. По строкам этого меню перемещаются тоже с помощью кнопок SB5 «Вверх» и SB7 «Вниз», а выбирают одну из них нажатием на кнопку SB8 «Ввод».
Выбором строк «Установка времени» или «Установка даты» выводят на экран изображения, показанные соответственно на рис. 8 и рис. 9. Параметр для изменения выбирают кнопками SB5 «Вверх» и SB7 «Вниз», а изменяют его с помощью кнопки SB8 «Ввод». При каждом нажатии на неё значение выбранного параметра увеличивается. Завершают установку нажатием на кнопку SB6 «Назад».
При выборе строки «Сброс счётчика» произойдёт обнуление счётчика числа нажатий на кнопки SB1 и SB2, а из меню «Кнопка ЗВОНОК» будет удалён отчёт о нажатиях на них. В конце строки «Сброс счётчика» появится «галочка», информирующая о его нулевом значении.
Выбором строки «Подсветка» включают или выключают подсветку экрана ЖКИ. В конце этой строки в квадратных скобках отображается текущее состояние подсветки.
Если нажатием на кнопку SB3 включена функция «Охрана», то при разрыве «охранного шлейфа» начнётся воспроизведение «мелодии сигнализации». Она будет звучать до тех пор, пока эту функцию не выключат повторным нажатием на ту же кнопку.
Прилагаемые файлы: zwonok.zip
ЛИТЕРАТУРА
1. Рыжков А. USB-программатор микроконтроллеров AVR и AT89S, совместимый с AVR910. — Радио, 2008, № 7, с. 28, 29.
2. Петрянин Д. Замена дверного звонка. — Радио, 2008, № 6, с. 50.
3. DS1621 Digital Thermometer and Thermostat. www.pdfserv.maxim-ic.com/en/ds/DS1621.pdf
4. DS1307 64 x 8, Serial, I2C Real-Time Clock. — www.datasheets.maxim-ic.com/en/ds/DS1307.pdf
Д. ПЕТРЯНИН, г. Ртищево Саратовской обл.
«Радио» №9 2012г.
Post Views: 467
Инструкции и стекCALL в микроконтроллере AVR
CALL — это команда передачи управления, которая используется для вызова определенной подпрограммы. Подпрограмма — это блок инструкций, которые необходимо часто выполнять.
В AVR есть 4 инструкции для подпрограммы вызова, как показано ниже.
Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями теории CS для собеседований SDE с помощью курса CS Theory Course по доступной для студентов цене и будьте готовы к отрасли.
- CALL (подпрограмма вызова)
- RCALL (подпрограмма относительного вызова)
- ICALL (косвенный вызов Z)
- EICALL (расширенный косвенный вызов Z)
CALL :
В этой 4-байтовой инструкции 10 бит используются для кода операции, а остальные 22 бита используются для адреса целевой подпрограммы, как и в инструкции JMP. В этом 4-мегабайтном адресном пространстве 000000- $ 3FFFFF для AVR, и его можно использовать для вызова подпрограмм в пределах заданного диапазона адресов.
Чтобы быть уверенным, что AVR знает, куда вернуться после выполнения подпрограммы, микроконтроллер автоматически сохраняет адрес инструкции чуть ниже инструкции CALL в стеке. После завершения выполнения подпрограммы инструкция RET передает управление обратно вызывающей стороне. Следовательно, каждая подпрограмма имеет в конце инструкцию RET.
Стек:
Стек — это часть ОЗУ ЦП для временного хранения информации.ЦП необходимо это хранилище, потому что количество регистров ограничено. Регистр, используемый для доступа к стеку, называется регистром указателя стека (SP).
В области памяти ввода-вывода есть 2 регистра с именами SPL (младший байт SP) и SPH (старший байт
SP). SP реализуется этими двумя регистрами.
В AVR с более чем 256 байтами памяти есть два 8-битных регистра. С другой стороны, если размер памяти меньше 256 байт, SP состоит только из SPL, поскольку 8-битный регистр может адресовать только 256 байт памяти.
Сохранение информации ЦП в стеке называется операцией PUSH, а загрузка содержимого стека обратно в ЦП называется операцией POP.
Вставка в стек:
Указатель стека (SP) указывает на верхнюю часть стека. Когда мы помещаем данные в стек, данные сохраняются там, где указывает SP, а SP уменьшается на единицу.
Чтобы поместить регистр в стек, мы используем инструкцию PUSH.
PUSH Rr; Rr может быть любым регистром общего назначения (R0 - R31)
Извлечение из стека:
Извлечение содержимого стека обратно в регистр — это функция, противоположная выталкиванию.Когда выполняется инструкция POP, SP увеличивается на единицу, и верхняя позиция стека копируется обратно в регистр. Это означает, что стек является LIFO (Last In First Out).
Для получения данных из стека мы используем инструкцию POP.
POP Rr; Rr может быть любым регистром общего назначения (R0 - R31)
Инициализация указателей стека:
У разных AVR разный объем ОЗУ. В ассемблере AVR RAMEND указывает адрес последнего места в ОЗУ.Итак, если мы хотим инициализировать SP так, чтобы он указывал на последнюю ячейку памяти, мы можем просто загрузить RAMEND в SP. Обратите внимание, что SP состоит из 2 регистров: SPH и SPL. Итак, мы загружаем старший байт RAMEND в SPH и младший байт RAMEND в SPL.
Инструкция CALL, инструкция RET и роль стека:
Когда выполняется инструкция CALL, адрес инструкции ниже инструкции CALL помещается в стек. Когда выполнение этой подпрограммы завершается и выполняется RET, адрес инструкции под инструкцией CALL загружается в счетчик программ и выполняется.
Абсолютный вызов ACALL — набор команд микроконтроллера ACALL 8051/8052
Эксплуатация: | ACALL |
Функция: | Абсолютный вызов в блоке 2K |
Синтаксис: | код ACALL адрес |
Инструкции | Операционный код | байт | Циклы | Флаги |
ACALL стр. 0 | 0x11 | 2 | 2 | Нет |
ACALL стр.1 | 0x31 | 2 | 2 | Нет |
ACALL стр. 2 | 0x51 | 2 | 2 | Нет |
ACALL стр. 3 | 0x71 | 2 | 2 | Нет |
ACALL стр. 4 | 0x91 | 2 | 2 | Нет |
ACALL стр. 5 | 0xB1 | 2 | 2 | Нет |
ACALL стр.6 | 0xD1 | 2 | 2 | Нет |
ACALL стр.7 | 0xF1 | 2 | 2 | Нет |
Описание : ACALL безусловно вызывает подпрограмму по указанному кодовому адресу.ACALL помещает адрес инструкции, следующей за ACALL, в стек, сначала младший байт, затем старший байт. Затем обновляется счетчик программ, так что выполнение программы продолжается по указанному адресу.
Новое значение программного счетчика вычисляется путем замены младшего байта программного счетчика вторым байтом инструкции ACALL и замены битов 0-2 старшего байта программного счетчика на 3. биты, обозначающие страницу.Биты 3-7 старшего байта счетчика программы остаются неизменными.
Так как ACALL влияет только на 11 бит программного счетчика, вызовы могут выполняться только в подпрограммах, находящихся в том же блоке 2k, что и первый байт, следующий за ACALL.
См. Также: LCALL, RET, Набор команд
Что такое микроконтроллер? — Как работают микроконтроллеры
Микроконтроллер — это компьютер. Все компьютеры — будь то персональный настольный компьютер или большой мэйнфрейм или микроконтроллер — имеют несколько общих черт:
- Все компьютеры имеют центральный процессор (центральный процессор), который выполняет программы.Если вы сейчас сидите за настольным компьютером и читаете эту статью, центральный процессор этого компьютера выполняет программу, реализующую веб-браузер, отображающий эту страницу.
- CPU загружает программу откуда-то. На вашем настольном компьютере программа браузера загружается с жесткого диска.
- Компьютер имеет некоторую RAM (оперативную память), где он может хранить «переменные».
- У компьютера есть устройства ввода и вывода, поэтому он может разговаривать с людьми. На настольном компьютере клавиатура и мышь являются устройствами ввода, а монитор и принтер — устройствами вывода.Жесткий диск — это устройство ввода-вывода — он обрабатывает как ввод, так и вывод.
Настольный компьютер, который вы используете, является «компьютером общего назначения», на котором можно запускать любую из тысяч программ. Микроконтроллеры — это «компьютеры специального назначения». Микроконтроллеры хорошо справляются с одной задачей. Есть ряд других общих характеристик, которые определяют микроконтроллеры. Если компьютер соответствует большинству из этих характеристик, то вы можете назвать его «микроконтроллером»:
- Микроконтроллеры — это « встроенные » внутри какого-либо другого устройства (часто потребительского продукта), чтобы они могли управлять функциями или действиями продукт.Поэтому другое название микроконтроллера — «встроенный контроллер».
- Микроконтроллеры посвящены одной задаче и запускают одну конкретную программу. Программа хранится в ПЗУ (постоянное запоминающее устройство) и обычно не изменяется.
- Микроконтроллеры — это часто маломощные устройства . Настольный компьютер почти всегда подключен к розетке и может потреблять 50 Вт электроэнергии. Микроконтроллер с батарейным питанием может потреблять 50 милливатт.
- Микроконтроллер имеет специальное устройство ввода и часто (но не всегда) имеет небольшой светодиодный или ЖК-дисплей для вывода .Микроконтроллер также принимает входные данные от устройства, которым он управляет, и управляет устройством, отправляя сигналы различным компонентам устройства. Например, микроконтроллер внутри телевизора принимает входные данные с пульта дистанционного управления и отображает выходные данные на экране телевизора. Контроллер управляет переключателем каналов, акустической системой и некоторыми регулировками электроники кинескопа, такими как оттенок и яркость. Контроллер двигателя в автомобиле принимает данные от датчиков, таких как кислородный датчик и датчик детонации, и управляет такими вещами, как смесь топлива и синхронизация свечей зажигания.Контроллер микроволновой печи принимает входные данные с клавиатуры, отображает выходной сигнал на ЖК-дисплее и управляет реле, которое включает и выключает микроволновый генератор.
- Микроконтроллер часто бывает маленьким и дешевым . Компоненты выбираются так, чтобы минимизировать размер и быть как можно более дешевыми.
- Микроконтроллер часто, но не всегда, — это с повышенной степенью защиты в некотором роде. Например, микроконтроллер, управляющий двигателем автомобиля, должен работать при экстремальных температурах, с которыми обычный компьютер обычно не может справиться.Микроконтроллер автомобиля на Аляске должен нормально работать при -30 градусов F (-34 C), в то время как тот же микроконтроллер в Неваде может работать при 120 градусах F (49 C). Когда вы добавляете тепло, выделяемое двигателем, температура в моторном отсеке может достигать 150 или 180 градусов F (65-80 C). С другой стороны, микроконтроллер, встроенный в видеомагнитофон, совсем не защищен.
Фактический процессор , используемый для реализации микроконтроллера, может сильно различаться.Например, сотовый телефон, показанный на странице «Внутри цифрового сотового телефона», содержит процессор Z-80. Z-80 — это 8-битный микропроцессор, разработанный в 1970-х годах и первоначально использовавшийся в домашних компьютерах того времени. Мне сказали, что Garmin GPS, показанный в Как работают GPS-приемники, содержит маломощную версию Intel 80386. Изначально 80386 использовался в настольных компьютерах.
Во многих продуктах, таких как микроволновые печи, требования к ЦП довольно низкие, и цена является важным фактором. В этих случаях производители обращаются к специальным микросхемам микроконтроллера — микросхемам, которые изначально были разработаны как недорогие, небольшие, маломощные встроенные процессоры.Motorola 6811 и Intel 8051 — хорошие примеры таких чипов. Также существует линейка популярных контроллеров под названием «микроконтроллеры PIC», созданная компанией Microchip. По сегодняшним меркам эти процессоры невероятно минималистичны; но они чрезвычайно недороги при покупке в больших количествах и часто могут удовлетворить потребности разработчика устройства с помощью всего лишь одного чипа.
Типичная микросхема микроконтроллера младшего уровня может иметь 1000 байтов ПЗУ и 20 байтов ОЗУ на микросхеме, а также восемь контактов ввода / вывода.В больших количествах стоимость этих чипов иногда может составлять всего несколько копеек. Вы, конечно, никогда не собираетесь запускать Microsoft Word на таком чипе — Microsoft Word требует, возможно, 30 мегабайт оперативной памяти и процессора, который может выполнять миллионы инструкций в секунду. Впрочем, для управления микроволновой печью Microsoft Word тоже не нужен. С микроконтроллером у вас есть одна конкретная задача, которую вы пытаетесь выполнить, и важна низкая стоимость и производительность с низким энергопотреблением.
Руководство по микроконтроллерам для начинающих
от Джона Уайлдера
Время от времени я вижу, как новички пытаются начать заниматься встраиваемой электроникой, но не знают, с чего начать.Некоторые даже совершают ошибку, пытаясь написать свой собственный код, не получив предварительно полного понимания микроконтроллера / микропроцессора, с которым они работают, языка программирования, с которым они работают, или даже базовых концепций программирования. Но не волнуйтесь … эта статья должна стать хорошим учебником, чтобы познакомиться с миром встраиваемой электроники.
Эта статья не пытается рассказать о каком-либо конкретном микроконтроллере / микропроцессоре, но представляет собой скорее учебник для объяснения общих концепций, применимых ко всем микроконтроллерам / микропроцессорам.
Во-первых, давайте … зададим себе пару вопросов. Первый вопрос —
Что такое микроконтроллер?
Микроконтроллер — это крошечный микрокомпьютер на микросхеме. Он имеет ЦП, ОЗУ (оперативное запоминающее устройство), регистры специальных функций, память ПЗУ программ, память ПЗУ данных, от одного до нескольких портов параллельного ввода / вывода (ввода / вывода) и может иметь множество встроенных периферийных устройств, включая но не ограничиваясь ими, аналого-цифровой преобразователь (АЦП), цифро-аналоговый преобразователь (ЦАП), последовательный UART, один или несколько таймеров, компараторы / опорное напряжение на кристалле, модуль захвата / сравнения / ШИМ (широтно-импульсная модуляция) , Главный синхронный последовательный порт для связи SPI (последовательный периферийный интерфейс) / I2C (меж интегральная схема), порт USB, порт Ethernet, встроенные генераторы, а также множество других периферийных устройств.
Что такое микропроцессор (подождите, вы имеете в виду, что на самом деле разница есть)?
Микропроцессор — это все, чем является микроконтроллер, но без программного ПЗУ на кристалле. Программный код находится вне кристалла в отдельной внешней микросхеме СППЗУ.
ПЗУ программ и ПЗУ данных
Встроенная память ПЗУ (постоянное запоминающее устройство) микроконтроллера подобна жесткому диску микроконтроллера. Имеет две перегородки. Один раздел зарезервирован для хранения программного кода, а другой раздел зарезервирован для постоянного хранения данных, которые используются микросхемой во время нормального выполнения программы.На данном микроконтроллере PIC, имеющем, скажем, 8 Кбайт программного пространства, программное пространство будет занимать адреса ПЗУ 0x0000 — 0x1FFF (или 0-8191 в десятичном виде). Пространство данных начнется с адреса ПЗУ программы 0x2100. Если бы пространство ПЗУ данных было 256 байтов, пространство ПЗУ данных занимало бы адреса ПЗУ 0x2100 — 0x21FF (или 8448-8704 в десятичном виде).
ЦП
ЦП означает центральный процессор. По сути, это «мозг» микроконтроллера. Это то, что извлекает инструкции из памяти кода и выполняет полученные инструкции.
ОЗУ данных
ОЗУ данных (оперативное запоминающее устройство) — это пространство данных, которое используется для временного хранения постоянных и переменных значений, которые используются микроконтроллером во время нормального выполнения программы. Объем физического пространства ОЗУ на данном микроконтроллере варьируется от одного микроконтроллера к другому. ОЗУ данных на микроконтроллере организовано в несколько «регистров», каждый из которых имеет свой уникальный «адрес». Регистр RAM на 8-битном микроконтроллере может содержать всего 8 бит или один байт данных.Типичная спецификация пространства RAM может указывать, что оно составляет 256 x 8. Это означает, что в RAM всего 256 регистров, каждый из которых может содержать 8 бит.
Регистр — это просто место в памяти, в которое вы можете записывать или читать данные. Некоторые из нас называют регистры «местонахождением».
Регистры специальных функций
Регистры специальных функций (или просто SFR) в микроконтроллере аналогичны регистрам в ОЗУ данных. Вы можете записывать в них данные, а также читать из них данные.Они отличаются тем, что некоторые SFR напрямую управляют аппаратным обеспечением микроконтроллера, тогда как другие управляются аппаратным обеспечением микроконтроллера.
Каждый бит в SFR назначается функции. В SFR у вас есть биты управления и биты флагов. Управляющие биты подобны «переключателям», которые включают или выключают функцию в зависимости от того, записываете ли вы 1 или 0 в эту битовую позицию в SFR. Биты флагов похожи на «световые индикаторы», которые указывают, существует ли данное условие, в зависимости от того, равен ли бит флага 1 или 0.Биты управления напрямую управляют оборудованием. Биты флагов контролируются оборудованием. В любой данной программе мы обычно записываем в управляющие биты, пока читаем биты флагов (некоторые биты флагов должны быть очищены вручную путем записи в них, в зависимости от микроконтроллера… подробнее об этом позже).
Каждой аппаратной части микроконтроллера будет назначен как минимум 1 SFR. Некоторому оборудованию может быть назначено несколько SFR. Проконсультируйтесь с таблицей данных вашего микроконтроллера, чтобы узнать больше о его конкретной организации SFR.
Биты конфигурации
Большинство микроконтроллеров имеют специальные биты, известные как «биты конфигурации». Эти биты настраивают специальные параметры микроконтроллера, включая, помимо прочего, —
* Тип осциллятора
* Сторожевой таймер Вкл / Выкл
* Таймер включения / выключения
* Вкл / Выкл сброса при пониженном энергопотреблении
* Включение / выключение программирования низкого напряжения
* Включение / выключение монитора безопасных часов
* Внутреннее / внешнее переключение Вкл / Выкл
В микроконтроллере PIC есть даже биты конфигурации для защиты программного кода и защиты кода данных.Эти биты предотвращают чтение программы или пространств данных внешним программным оборудованием, чтобы другие не могли украсть ваш код. На микросхеме Atmel AT89S (производной от 8051) это устанавливается так называемыми «битами блокировки».
Некоторые называют биты конфигурации «предохранительными битами». Это происходит из-за старых микропроцессоров, у которых были настоящие «плавкие предохранители» на микросхеме, которые перегорали, если были отключены определенные функции, управляемые битами плавких предохранителей. Эти предохранители были «программируемыми один раз»… после того, как они перегорели, их невозможно было «отключить».Однако с появлением флэш-памяти, доступной на современных микроконтроллерах, на чипе больше нет буквальных «предохранителей». Но сам термин перенесен из-за того, что биты конфигурации по существу обеспечивают тот же контроль, что и биты предохранителей.
ALU (Арифметико-логический блок)
Это аппаратное обеспечение, по сути, отвечает за все математические и логические операции, выполняемые микроконтроллером. На большинстве микроконтроллеров с ALU будет связано 3 флаговых бита —
* Бит нуля — Этот бит флага устанавливается в 1 аппаратным обеспечением, когда математическая операция приводит к нулевому результату.Аппаратно сбрасывает его на 0 всякий раз, когда математическая операция дает ненулевой результат.
* Бит переноса / заимствования — Этот бит флага работает как бит переноса для операций сложения, работая как флаг заимствования для операций вычитания. «Перенос» происходит, когда результат операции сложения приводит к значению, превышающему то, что регистр может хранить. 8-битный регистр может содержать максимальное значение 255 (FF в шестнадцатеричном виде или 11111111 в двоичном).
Если операция сложения приводит к результату больше 255, флаг переноса устанавливается в 1.Если операция сложения приводит к результату меньше 255, перенос не выполняется, поэтому флаг переноса сбрасывается до 0.
Для операций вычитания вместо этого флаг переноса работает как флаг заимствования. Флаг заимствования работает наоборот, чем флаг переноса. Если операция вычитания приводит к отрицательному результату, флаг заимствования сбрасывается до 0. Если операция вычитания дает положительный результат, флаг заимствования устанавливается на 1.
* Бит переноса / заимствования цифр — Этот бит флага выполняет то же действие, что и флаг переноса / заимствования, но работает только для указания того, имеет ли место перенос / заимствование только между битами 3 и 4.
Биты флага ALU могут быть прочитаны в любое время, чтобы узнать, были ли результаты математических операций нулевыми, положительными / отрицательными, больше / меньше и т. Д. И т. Д.
Нулевой бит — это удобный флаговый бит, который позволяет нам сравнивать два значения, чтобы увидеть, равны ли они / не равны. Если мы возьмем два числа и вычтем их, результат будет равен нулю, если они равны, и ненулевым, если не равны. Итак, чтобы сравнить два значения, чтобы увидеть, равны ли они / не равны, мы вычитаем их, затем читаем / проверяем нулевой бит, чтобы увидеть, является ли бит 1 или 0.Если нулевой бит = 1, результат вычитания равен нулю, что означает, что два значения равны. Если нулевой бит = 0, результат вычитания не равен нулю, что означает, что два значения не равны.
Бит переноса / заимствования — это удобный флаг, который позволяет нам сравнивать два значения, чтобы увидеть, больше или меньше одно значение, чем другое значение. Пример… у нас есть два значения: VALUE1 и VALUE2. В коде выполняем эту операцию —
VALUE1 — VALUE2 = VALUE3
После выполнения операции вычитания мы считываем / проверяем высокое / низкое состояние бита переноса / заимствования.
Если VALUE2 больше VALUE1, результат вычитания будет отрицательным, что сбросит бит переноса / заимствования в 0. Если VALUE2 меньше VALUE1, результат вычитания будет положительным, что установит перенос / одолжить бит до 1.
Обратитесь к таблице данных, чтобы узнать, какой SFR содержит эти биты. На микроконтроллерах PIC биты флага ALU находятся в STATUS SFR. В MCS-51 они находятся в PSW SFR (слове состояния программы).
Программный счетчик
Программный счетчик — это «адресный указатель», который сообщает CPU, где найти следующую инструкцию для выполнения в программном ПЗУ.ЦП получит инструкцию, которая находится по адресу ПЗУ программы, загруженному в текущий момент в счетчик программ.
Когда микроконтроллер перезагружается, счетчик программы устанавливается на 0x0000. ЦП получит инструкцию, которая находится по адресу ПЗУ программы 0x0000. После получения этой инструкции счетчик программ автоматически увеличивается до значения 0x0001. Счетчик программ непрерывно автоматически увеличивается на значение 1, что заставляет ЦП последовательно обращаться к содержимому каждой ячейки регистра в программном ПЗУ.Это продолжается до тех пор, пока ЦП не выберет и не выполнит инструкцию, изменяющую значение счетчика программ. Такими инструкциями, которые делают это, являются инструкции перехода (ajmp и ljmp на MCS-51, goto на PIC), вызовы подпрограмм (acall и lcall на MCS-51, вызов на PIC) и любые инструкции, которые добавляют или вычитают значение к или от счетчик программ.
Стек
Стек на микроконтроллере в основном используется во время вызовов подпрограмм и переходов к обработчику прерывания.Это буфер «последним вошел — первым ушел», который используется для хранения адресов возврата. Во время вызова подпрограммы текущий адрес программного счетчика «помещается» в стек с добавлением к нему +1 смещения, затем программный счетчик модифицируется значением адреса, в котором находится вызываемая подпрограмма. Это заставляет счетчик программы переходить к коду подпрограммы для выполнения подпрограммы.
В конце подпрограммы будет инструкция «возврата» (возврат на MCS-51, возврат на PIC). После выполнения команды возврата стек «выталкивается», и последнее значение адреса ПЗУ, которое было помещено в стек, выталкивается из стека и возвращается обратно в счетчик программ.Это заставляет счетчик программ вернуться к инструкции, которая находится после инструкции, которая вызвала подпрограмму (отсюда необходимость смещения +1 в то время, когда адрес ПК помещается в стек), и выполнение программы продолжается с того места, где оно было остановлено. перед вызовом подпрограммы.
Некоторые микроконтроллеры имеют «программный стек» (MCS-51). Программный стек использует часть внутреннего ОЗУ микроконтроллера в качестве пространства стека. Другие микроконтроллеры имеют аппаратный стек (PIC).В аппаратном стеке стек представляет собой собственное выделенное пространство, отдельное от всех остальных пространств памяти на кристалле.
На некоторых микроконтроллерах стек доступен для записи. Это позволяет нам использовать стек для временного резервного копирования критических регистров во время вызовов подпрограмм и выполнения обработчика прерываний. Перед выполнением подпрограммы или обработчика прерывания содержимое регистров для резервного копирования помещается в стек. Затем, непосредственно перед возвратом из подпрограммы или обработчика прерывания, содержимое, которое мы поместили в стек в начале подпрограммы, извлекается из стека по одному, а затем восстанавливается в исходное положение в обратном порядке по сравнению с тем, как оно было помещены в стек (помните… Последним пришел — первым ушел).
Хорошим примером этого может быть резервное копирование аккумулятора и регистров PSW на MCS-51 во время выполнения процедуры обработчика прерывания —
Код (текст):
push ACC; резервное копирование аккумулятора в стек
push PSW; резервное копирование слова состояния программы в стек
; здесь выполнить код обработчика прерывания
pop PSW; восстановить слово состояния программы
pop ACC; восстановить аккумулятор
reti; вернуться к основному коду из прерывания
Как видите, мы сначала помещаем содержимое аккумулятора в стек, а затем помещаем содержимое PSW в стек после него.Затем выполняется код обработчика прерывания.
После выполнения кода обработчика прерывания PSW сначала извлекается из стека, затем аккумулятор извлекается из стека после него… в порядке, обратном тому, как они были вытолкнуты.
Типичный SFR
Типичный SFR настроен, как показано ниже.
Код (текст):
| ПОРТ 1 SFR |
———————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Это SFR защелки порта на микроконтроллере MCS-51 для параллельного порта 1. Каждый порт MCS-51 является 8-битным параллельным портом, и каждый бит в SFR порта назначен каждому контакту порта. P1.0 будет контактом 0 порта 1, P1.1 будет контактом 1 порта 1, P1.2 будет контактом 2 порта 1 и т. Д. И т. Д.
Как показано, у нас есть все нули, записанные в каждый бит в SFR защелки порта 1.Это переведет все контакты порта 1 в состояние низкого уровня (0 вольт). Если бы мы записали 1 в любой из битов SFR порта, это установит контакт, связанный с позицией бита, в которую мы записываем «1», в высокое состояние (+ 5V).
Пример, давайте запишем значение 01010101 в SFR порта 1 —
Код (текст):
| ПОРТ 1 SFR |
———————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
Как показано, это переведет контакты P1.0, P1.2, P1.4 и P1.6 в состояние высокого уровня, а контакты P1.1, P1.3, P1.5 и P1.7 — в состояние низкого уровня.
Несколько слов о таблицах данных … и почему они так важны
Не все микроконтроллеры созданы равными. Каждый из них разработан с использованием определенного оборудования на кристалле. Все микроконтроллеры разных производителей имеют разную архитектуру.Вы обнаружите, что микроконтроллеры PIC сильно отличаются от микроконтроллеров MCS-51, так же как MCS-51 сильно отличается от, скажем, Motorola 65xx в отношении того, как реализованы SFR, как организована ОЗУ данных, набор команд, конфигурационное слово, как параллельные порты работают и т.д. и т.п.
ЕДИНСТВЕННЫЙ способ точно узнать, как работать с вашим микроконтроллером и его оборудованием, — это ознакомиться с его таблицей данных. В таблице данных объясняется каждый SFR, каждая часть встроенного оборудования, абсолютные максимальные электрические характеристики, организация памяти программ / данных, как подключены параллельные порты и как они работают, сводка набора инструкций (для тех из вас, кто кодирует на ассемблере). язык) и т. д.Практически все, что вам, как программисту, нужно знать о своем микроконтроллере, находится в его техническом описании.
Большинство из них находятся в свободном доступе в Интернете с помощью простого поиска в Google (я еще не нашел ни одного, которого нет). Заявление о том, что вы не смогли найти таблицу, не является приемлемым оправданием, когда дело доходит до этого. ЕДИНСТВЕННАЯ причина, по которой кто-либо отказывается просматривать таблицу, — это либо то, что он слишком ленив, либо он не понимает их, но не хочет, чтобы другие знали, что они этого не делают.Я скажу прямо сейчас … на большинство вопросов форума, касающихся микроконтроллеров, можно было бы ответить самостоятельно, если бы человек нашел время, чтобы найти ответ в таблице данных.
Таблицы данных являются обязательными. Без них вы не сможете написать собственный код.
Об авторе
Джон Уайлдер — внештатный инженер-электронщик и энтузиаст электроники более 20 лет. Он четыре года проработал в ВМС США в качестве специалиста по авиационной электронике.Джон также играет на гитаре с 13 лет и начал объединять электронику и музыку с 15 лет. Джон построил свой первый ламповый усилитель в 17 лет. «Музыкальная электроника», — говорит Джон, — это его любовь и страсть.
Джон также является частым участником и страстным членом инженерного сообщества Electro-Tech-Online. В Electro-Tech-Online вы можете задавать вопросы и получать ответы от своих коллег-инженеров по всему, от микроконтроллеров, возобновляемых источников энергии и автомобильной электроники до моделирования схем и проектирования.Кроме того, существуют форумы для микроконтроллеров 8051/8951, AVR, ARM, Arduino, Oshonsoft Project, а также репозиторий кода, где участники обмениваются фрагментами кода.
Следуйте за Джоном в Twitter на @PICmcuguy.
Учебные пособия поAVR — Подпрограммы сборки
AVR Assembly поддерживает повторное использование кода через подпрограммы. Подпрограммы — один из наиболее эффективных способов облегчить вашу жизнь, поскольку вы можете написать код, который делает то, что вы хотите, один раз и повторно использовать его снова и снова.
Однако, прежде чем научиться вызывать подпрограммы, вы должны понять концепцию Указатель стека .
Указатель стека
Указатель стека — это специальный регистр в памяти ввода-вывода, который указывает на пространство, выделенное в SRAM, называемый Стек . Стек используется для временного хранения значений регистров и возврата адресов при вызове подпрограмм.
Указатель стека — это 16-разрядный регистр, определенный во включаемых файлах как SPH и SPL.В микроконтроллерах с очень маленьким объемом SRAM SPH не требуется, и используется только SPL.
Обычно стек начинается на конце SRAM и будет расти от более высоких до более низких значений адреса, когда в нем хранятся данные. Указатель стека всегда указывает на верхних стека.
Инициализация указателя стека
Чтобы использовать стек, указатель стека должен быть инициализирован адресом в SRAM. Поскольку указатель стека находится в памяти ввода-вывода, значения могут быть загружены в него с помощью инструкции out.На более новых AVR указатель стека будет инициализирован последним значением SRAM при включении питания, но на старых AVR он должен быть настроен вручную при запуске любой программы. Пример того, как это сделать, показан ниже
. ldi r16, НИЗКИЙ (RAMEND); загрузить младший байт RAMEND в r16
выход SPL, r16; сохранить r16 в нижнем указателе стека
ldi r16, ВЫСОКИЙ (RAMEND); загрузить старший байт RAMEND в r16
из SPH, r16; сохранить r16 в высоком указателе стека
Константа RAMEND определена во включаемом файле как последний адрес в SRAM.Для многих микроконтроллеров RAMEND — это 16-битный адрес, поэтому он должен быть разбит на 8-битные компоненты с функциями HIGH и LOW для загрузки в рабочий регистр. На небольших микроконтроллерах RAMEND может быть меньше 16 бит, и в этом случае SPH не используется, а SPL — единственный регистр, который необходимо инициализировать.
ldi r16, RAMEND; загрузить RAMEND в r16
выход SPL, r16; сохранить r16 в указателе стека
Примечание: Хотя новые микроконтроллеры автоматически инициализируют указатель стека RAMEND при включении питания, рекомендуется всегда инициализировать его в начале программы.Это защищает вас от указателя стека, начинающегося с неправильного места в случае программного сброса.
Хранение данных в стеке
После инициализации указателя стека регистры могут быть сохранены или загружены в стек — это называется , нажимая или выталкивая , соответственно. Инструкции для этого приведены в таблице ниже.
Мнемоника | Описание |
---|---|
нажимать | push-регистр в стеке |
население | поп-регистр из стека |
Инструкции push и pop просты в использовании:
push r0; поместите r0 в стек
pop r0; восстановить r0 из стека
Когда push вызывается с регистром, содержимое этого регистра сохраняется в верхних стека, т.е.е. адрес, загруженный в указатель стека. Указатель стека автоматически уменьшается на на при вызове push (помните, что стек растет от более высокого адреса к младшему).
Когда команда pop вызывается с регистром, в этот регистр загружается содержимое вершины стека. Указатель стека автоматически увеличивается на на при вызове pop.
Отправка регистра в стек не стирает значение регистра, а просто копирует его содержимое в SRAM.Аналогично, выталкивает значение из стека, не стирает содержимое этого адреса в стеке.
При отправке нескольких регистров в стек, команды pop должны вызываться в порядке , обратном , чтобы восстановить значения в их исходные регистры, то есть
push r0; поместить содержимое r0 в стек
нажмите r1; поместить содержимое r1 в стек
нажмите r2; поместить содержимое r2 в стек
pop r2; восстановить содержимое r2
pop r1; восстановить содержимое r1
pop r0; восстановить содержимое r0
Обратите на это особое внимание, так как вызов всплывающих инструкций в неправильном порядке приведет к восстановлению значений в неправильные регистры.Например
ldi r16,0x01; загрузить r16 с помощью 0x01
ldi r17,0x02; загрузить r17 с помощью 0x02
нажимаем r16; сохранить r16 в стек
нажимаем r17; сохранить r17 в стек
pop r16; восстановить r16 (результат = 0x02)
pop r17; восстановить r17 (результат = 0x01)
Приведенное выше приводит к тому, что содержимое r16 и r17 меняется местами, потому что инструкции pop не вызываются в порядке, обратном тому, в котором был вызван push (конечно, если вы действительно хотите поменять местами содержимое двух регистров без использования третьего, это отличный способ сделать это!).
Помните: Регистры должны быть извлечены из стека в порядке, обратном тому, в котором они были помещены, чтобы восстановить их исходные значения.
Теперь, когда у нас есть понимание указателя стека, мы можем перейти к подпрограммам.
Подпрограммы
Подпрограммы — это последовательности кода, которые можно повторно использовать в любой точке программы. Когда вызывается подпрограмма, микроконтроллер помещает адрес возврата в стек.Затем он перейдет к месту подпрограммы и выполнит код там. Когда достигается оператор возврата, адрес возврата будет , вытянутый из стека , и микроконтроллер перейдет к инструкции сразу же после вызова подпрограммы.
Инструкции, используемые для вызова и возврата из подпрограмм, показаны ниже.
Мнемоника | Описание |
---|---|
звонок | длинный вызов подпрограммы |
icall | косвенный вызов подпрограммы |
звонок | относительный вызов подпрограммы |
рет | возврат из подпрограммы |
Вызов подпрограмм
Ниже показан простой код, вызывающий подпрограмму.
ldi r16,0x01; загрузить r16 с помощью 0x01
ldi r17,0x02; загрузить r17 с помощью 0x02
call addReg; подпрограмма вызова
цикл: цикл rjmp; бесконечная петля
addReg:
добавить r16, r17; добавить r16 и r17
ret; возврат из подпрограммы
Вызов инструкции используется с меткой нашей подпрограммы addReg. Использование инструкции вызова заставит микроконтроллер перейти к заданной метке, выполнить код там, и, когда инструкция ret будет достигнута, вернется к инструкции сразу после вызова — в этом случае бесконечный цикл, который мы установили с помощью rjmp.
Обратите внимание, что мы не можем явно передавать параметры подпрограмме, как функции в C. В приведенном выше примере подпрограмма ожидает, что ее параметры уже находятся в регистрах r16 и r17.
Подпрограммымогут быть вызваны из всего программного пространства с помощью call или относительно на расстоянии до 4К слов с помощью rcall.
rcall doSomething; вызов подпрограммы doSomething
...; другой программный код
сделай что-нибудь:
...; код подпрограммы
ret; возврат из подпрограммы
Последний метод вызова подпрограмм, icall, немного более продвинутый, чем это необходимо здесь, но для полноты он переходит к адресу подпрограммы, загруженной в указатель Z.
ldi ZL, LOW (doSomething); адрес загрузки doSomething
ldi ZH, HIGH (делать что-то); в Z указатель
Я звоню ; косвенный вызов doSomething
сделай что-нибудь:
...; код подпрограммы
ret; возврат из подпрограммы
Косвенные вызовы полезны, когда необходимо вызывать разные подпрограммы в зависимости от параметров времени выполнения. Обычно это реализуется с помощью таблицы поиска, а не с явной загрузкой параметров с помощью ldi, как показано выше.
Регистры сохранения
Когда вызывается подпрограмма, она может изменять регистры, которые вам понадобятся позже в программе.Чтобы этого не происходило, регистры можно поместить в стек в начале подпрограммы, а вернуть обратно в конце.
Например, если ваша подпрограмма изменяет r16 и r17, их значения можно сохранить, включив в подпрограмму следующее:
rcall doSomething; подпрограмма вызова
...; остальная часть программы
сделай что-нибудь:
нажимаем r16; сохранить r16 в стек
нажимаем r17; сохранить r17 в стек
...; код подпрограммы
pop r17; восстановить r17 из стека
pop r16; восстановить r16 из стека
ret; возврат из подпрограммы
Какой микроконтроллер подходит для звонков по домашней телефонной сети (БЕЗ SIM-КАРТЫ)
Какой микроконтроллер подходит для звонков по домашней телефонной сети (БЕЗ SIM-КАРТЫ) — Электротехника Stack ExchangeСеть обмена стеком
Сеть Stack Exchange состоит из 178 сообществ вопросов и ответов, включая Stack Overflow, крупнейшее и пользующееся наибольшим доверием онлайн-сообщество, где разработчики могут учиться, делиться своими знаниями и строить свою карьеру.
Посетить Stack Exchange- 0
- +0
- Авторизоваться Подписаться
Electrical Engineering Stack Exchange — это сайт вопросов и ответов для профессионалов в области электроники и электротехники, студентов и энтузиастов.Регистрация займет всего минуту.
Зарегистрируйтесь, чтобы присоединиться к этому сообществуКто угодно может задать вопрос
Кто угодно может ответить
Лучшие ответы голосуются и поднимаются наверх
Спросил
Просмотрено 62 раза
\ $ \ begingroup \ $ Закрыто. Это вопрос не по теме. В настоящее время он не принимает ответы.Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме обмена электротехническими стеками.
Закрыт 10 месяцев назад.
В образовательных целях я хочу разработать систему безопасности, которая работает с датчиком PIR.Приложение после обнаружения движения позвонит по номеру телефона, который определил.
Знаю примерно все, кроме модуля для звонков.
Не знаю, как приложение домашних телефонных сетей (которые работают с RJ11)
Какие микро и модули подходят?
JRE53.1k88 золотых знаков8181 серебряный знак141141 бронзовый знак
Создан 13 дек.
\ $ \ endgroup \ $ 2 \ $ \ begingroup \ $Нет микроконтроллеров, подходящих для прямого подключения к домашней аналоговой телефонной сети.
- Аналоговые телефонные сети имеют (относительно) высокое постоянное напряжение на проводах. «Высокое» по сравнению с напряжением микроконтроллера менее 100 В постоянного тока, но это приведет к выходу из строя любого микроконтроллера, который вы подключаете напрямую к нему.
- Аналоговая телефонная сеть управляется либо тональными сигналами (звуками, воспроизводимыми в проводах), либо импульсами на проводах. Ни один микроконтроллер не имеет встроенных соединений для этого.
На этой странице описывается создание интерфейса микроконтроллера с обычной телефонной линией.(Ссылка любезно предоставлена The Wayback Machine.)
Вам понадобится несколько микросхем, которые, возможно, больше не будут общедоступными.
В качестве альтернативы вы можете откопать старый аналоговый модем. Подключите последовательный порт микроконтроллера к преобразователю RS232, затем подключите его к модему. Затем ваш микроконтроллер может отправлять команды модему для набора или декодирования сигналов.
Создан 13 дек.
JREJRE53.1k88 золотых знаков8181 серебряный знак141141 бронзовый знак
\ $ \ endgroup \ $ Электротехнический стек Exchange лучше всего работает с включенным JavaScriptВаша конфиденциальность
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Принимать все файлы cookie Настроить параметры
ram — Как называть ячейки памяти в компьютере или микроконтроллере?
Я не знаю, подходит ли это форум для того, чтобы задавать этот вопрос, но я так подумал, потому что этот форум предназначен для преподавателей, а я тренер, и мой вопрос связан с образованием.
Я хочу сделать введение в техническое руководство по основам микроконтроллера, и перешел к главе о памяти.
Я начал с определения трех основных типов памяти в микроконтроллере, а именно:
- Программная память (ПЗУ): Это в основном флэш-память для хранения шестнадцатеричного файла программы для выполнения.
- Память данных (RAM): предназначена для обработки данных во время работы микроконтроллера, но данные теряются после сброса микроконтроллера.
- EEPROM: имеет преимущество чтения и записи данных во время работы микроконтроллера, а также сохраняет данные после сброса устройства.
Затем я разместил изображение блок-схемы микроконтроллера и того, как он подключен к внутренним блокам, в качестве подзаголовка главы о памяти.
Следующий подзаголовок — это термин «регистры», поскольку они являются строительным блоком любого типа ПАМЯТИ в компьютере, будь то ПЗУ, ОЗУ или EEPROM. Потому что я нашел эту информацию на веб-сайте и хочу быть уверенным.
Это ссылка на сайт:
Ссылка
Раздел 5.1: Регистры. Как и в предыдущем разделе, 4. Программная память.
Затем в разделе 5. Память данных автор объясняет следующие части памяти данных:
- 5.1 Регистры
- 5.2 Биты и байты
Итак, мой вопрос: регистры — это ячейки памяти для каждого типа памяти, и разница в том, что память ROM — это энергонезависимые регистры, RAM — энергозависимые регистры, а EEPROM — также энергонезависимые регистры? Так что все они в основном зарегистрированы.