Оглавление:
- Шаг 1: Определение адресов регистров
- Шаг 2: массивы и глобальные переменные
- Шаг 3. Функция "serial.begin"
- Шаг 4. Функция "serial.available"
- Шаг 5. Функция "serial.read"
- Шаг 6. Функция "serial.write"
- Шаг 7: Функция настройки
- Шаг 8: Функции цикла и ISR
- Шаг 9: Подключение
- Шаг 10: Собираем все вместе
Видео: Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями): 10 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
Я обычно не делаю инструктаж по этому поводу, я предпочитаю свои металлоконструкции, но, поскольку я студент-электротехник и мне нужно пройти курс по микроконтроллерам (проектирование встроенных систем), я подумал, что сделаю инструктаж по один из моих проектов. Когда я изначально создавал проект и другие для этого класса, я обнаружил, что очень мало или совсем нет руководств, которые не используют функции библиотеки arduino или последовательные функции, что является еще одной причиной, по которой я подумал, что это будет хорошим руководством.
Этот код разработан для микроконтроллера Atmega 2560, поэтому, если вы хотите реализовать его на другой плате, вам необходимо изменить регистры адреса в коде в соответствии с руководством пользователя вашего контроллера. Основная идея кода заключается в том, что всякий раз, когда вы вводите клавишу на клавиатуре в монитор последовательного порта, Arduino Mega будет выводить определенную частоту в зависимости от того, какую клавишу вы нажимаете, при этом «q» сбрасывает ее. Я сделал так, что «a» будет выводить плоскую частоту A, а «A» - выводить частоту A-Shar, «b» - вывод B-flat, «c» для C-бемоль, «C» для C-диеза и так далее. Полный код загружается в конце, но каждый шаг разбивает код на части, чтобы его было легче объяснить.
Шаг 1: Определение адресов регистров
Этот шаг прост, если вы используете atmega 2560, вам просто нужно использовать адреса, которые я использовал, хотя, если вы используете плату с другим чипом, вам нужно будет найти адреса для каждого из этих регистров на вашем компьютере. руководство пользователя чипов. Определения вверху - это просто константы, которые будут использоваться для наших функций позже. Мы указываем адреса как изменчивые без знака, потому что мы не хотим, чтобы компилятор с ними связывал.
Шаг 2: массивы и глобальные переменные
Здесь мы хотим определить массив Frequency, который будет содержать все частоты, которые должна выводить каждая клавиша. Эти значения рассчитываются на основе реальных частот нот, и, честно говоря, я забыл, как я их получил, но это правильные значения, поскольку я проверял их на осциллографе, чтобы убедиться. Мы также определяем массив нот, который содержит все клавиши, которые нужно нажимать для каждого тона, а также переменные, которые нам понадобятся для наших последующих функций.
Шаг 3. Функция "serial.begin"
Мы вызовем нашу пользовательскую функцию, которая копирует функцию "serial.begin" U0init (). Он принимает на входе желаемую скорость передачи и запускает последовательный порт с этой скоростью.
Шаг 4. Функция "serial.available"
Мы вызовем функцию, имитирующую "serial.available" U0kbhit (). Он не принимает ввод, а вместо этого определяет, есть ли на клавиатуре изменение, используя бит состояния RDA, и возвращает истину при обнаружении изменения.
Шаг 5. Функция "serial.read"
Мы вызовем функцию, имитирующую функцию serial.read U0getchar (), которая не принимает никаких входных данных и выводит любые изменения, сделанные на клавиатуре, которые хранятся в регистре UDR0.
Шаг 6. Функция "serial.write"
Мы вызовем функцию, имитирующую "serial.write" U0putchar (), которая берет данные из регистра UDR0, пока изменение обнаруживается и сохраняется, и выводит эти изменения обратно в монитор последовательного порта.
Шаг 7: Функция настройки
Это основная функция настройки, которая будет использовать нашу имитацию "serial.begin" для инициализации последовательного порта, инициализирует наши битовые настройки для регистров таймера и устанавливает PB6 для вывода наших сигналов.
Шаг 8: Функции цикла и ISR
Цикл функционирует следующим образом: если изменение обнаруживается с помощью нашей функции "serial.available", наша функция "serial.read" сохраняет это изменение, а наша функция "serial.write" помещает это изменение в монитор последовательного порта. Пока переменная i меньше, чем размер массива частот, она установит на выходе позицию i в этом массиве, выводя частоту в этой позиции. Функция ISR выполняет функцию сброса, где, если позиция массива частот не равна 0 (другими словами, если «q» не нажата), он выводит частоту, но при нажатии «q» выполняется сброс. Обратите внимание: этот код использует прерывания, но это можно сделать и с отключенными прерываниями. Я отправлю код без прерываний, если получу какие-либо запросы, я просто думаю, что версия с прерыванием более интересна.
Шаг 9: Подключение
Подключить этот код очень просто: просто подключите выходной провод от PB6 к макетной плате, последовательно подключите к нему зуммер или динамик и снова подключите его к земле. Примечание: если вы используете динамик, вставьте небольшой резистор перед динамиком. Если вы просто хотите видеть выходной сигнал, но не слышите его, просто подключите PB6 к красному проводу осциллографа, а черный провод к земле.
Шаг 10: Собираем все вместе
Я добавил полный код к этому шагу, так как я объяснил все его части на предыдущих шагах. Он просто принимает ввод с клавиатуры для разных частот и выводит эту частоту на PB6. Надеюсь, вам понравилось читать о другом способе программирования в среде IDE!
Также проголосуйте за это в конкурсе микроконтроллеров: D
Рекомендуемые:
Программирование Arduino с использованием другого Arduino для отображения прокручиваемого текста без библиотеки: 5 шагов
Программирование Arduino с использованием другого Arduino для отображения прокручиваемого текста без библиотеки: Sony Spresense или Arduino Uno не так дороги и не требуют большого количества энергии. Однако, если ваш проект имеет ограничения по мощности, пространству или даже бюджету, вы можете рассмотреть возможность использования Arduino Pro Mini. В отличие от Arduino Pro Micro, Arduino Pro Mi
Тональный генератор «Джимикки Каммал» с использованием Arduino Pro Mini: 5 шагов
Тональный генератор "Jimikky Kammal" с использованием Arduino Pro Mini: это простой проект тонального генератора с использованием Arduino Pro Mini. Фрагмент суперхита "Jimikky Kammal" фильма "Velipadinte Pusthakam" разворачивается в монотонном режиме. Музыкальные ноты встречаются в природе как плавные и катящиеся синусо
Тональный генератор Морзе (маломощный CW звуковой сигнал): 3 шага
Тональный генератор Морзе (CW Beeper с низким энергопотреблением): Здесь я описываю, как построить простой тональный генератор с низким энергопотреблением, который я использую, чтобы научить моего сына азбуке Морзе. Во время уборки своего погреба я нашел свой старый кейер Морзе Вермахта. Этот ключ использовался немецкими войсками во время Второй мировой войны. У манипулятора был
Тональный генератор микроконтроллера в C-коде: 8 шагов (с изображениями)
Генератор тона микроконтроллера на языке C: в конце октября прошлого года пользователь Instructables carmitsu отправил мне сообщение, увидев мой синтезатор для ланчбокса. Из его сообщения: Я преподаю музыку в начальной школе. Мы много играем на магнитофонах. то есть дети играют на маленьких флейтах … У меня разорвано
Нулевой охладитель / подставка для ноутбука (без клея, без сверления, без гаек и болтов, без винтов): 3 шага
Охладитель / подставка для ноутбука с нулевой стоимостью (без клея, без сверления, без гаек и болтов, без винтов): ОБНОВЛЕНИЕ: ПОЖАЛУЙСТА, ПРОГОЛОСОВАЙТЕ ЗА МОЙ ИНСТРУКЦИЮ, СПАСИБО ^ _ ^ ВЫ МОЖЕТЕ ПОПРОБОВАТЬ ЗАПИСЬ НА www.instructables.com/id/Zero-Cost-Aluminium-Furnace-No-Propane-No-Glue-/ ИЛИ МОЖЕТ БЫТЬ ГОЛОСОВАТЬ ЗА ЛУЧШЕГО ДРУГА