Съдържание:
- Стъпка 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 07:53
Обикновено това не е нещо, на което да преподавам, предпочитам металообработването си, но тъй като съм студент по електротехника и трябва да взема курс по микроконтролери (дизайн на вградени системи), реших да направя инструктаж по един от моите проекти. Когато първоначално направих проекта и други за този клас, открих, че има много малко или никакви уроци, които не използват функциите на библиотеката arduino или серийни функции, което е друга причина, поради която смятах, че това би било добра инструкция.
Този код е предназначен за микроконтролера Atmega 2560, така че ако искате да го внедрите на друга платка, ще трябва да промените адресните регистри в кода въз основа на ръководството за потребителя на вашите контролери. Основната идея зад кода е, че всеки път, когато въведете ключ от клавиатурата в серийния монитор, arduino mega ще изведе определена честота въз основа на клавиша, който натиснете, като "q" го нулира. Направих го така, че "а" ще извежда A плоска честота и "A" ще извежда A остра честота, "b" извежда B плоска, "c" за C плоска, "C" за C остра и т.н. Пълният код се качва в края, но всяка стъпка ще разбие кода на парчета, така че е по -лесно да се обясни.
Стъпка 1: Определяне на адреси в регистъра
Тази стъпка е лесна, ако използвате atmega 2560, просто трябва да използвате адресите, които използвах, въпреки че, ако използвате дъска с различен чип, ще трябва да намерите адресите за всеки от тези регистри във вашия ръководство за потребителя на чипове. Дефинициите в горната част са само константи, които по -късно ще бъдат използвани за нашите функции. Ние посочваме адресите като променливи без подпис, защото не искаме компилаторът да се забърква с тях.
Стъпка 2: Масиви и глобални променливи
Тук искаме да определим честотния масив, който ще съдържа всички честоти, които всеки ключ трябва да изведе. Тези стойности се изчисляват от действителните нотни честоти и честно казано забравих как ги получих, но те са правилните стойности, докато ги тествах на осцилоскоп, за да се уверя. Ние също така дефинираме масива с бележки, който съдържа всички клавиши, които трябва да натиснете за всеки тон, както и променливите, от които се нуждаем за по -късните ни функции.
Стъпка 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
Прост генератор на тонове: 7 стъпки (със снимки)
Прост генератор на тонове: Arduino Tone Generator е набор от превключватели, споделящи общ терминал към GND, докато останалите пинове са свързани към 2, 3, 4, 5, 6, 7, 8 и 9 цифрови щифтове Arduino и с високоговорител също инсталиран между GND и цифров пин 11 от Arduino Uno
Генератор на тонове "Jimikky Kammal" Използване на Arduino Pro Mini: 5 стъпки
Генератор на тонове "Jimikky Kammal" Използване на Arduino Pro Mini: Това е прост проект за генератор на тонове, използващ Arduino Pro Mini. Част от супер хит песента " Джимики Камал " на филма " Velipadinte Pusthakam " е разработен в монотонен. Музикалните ноти се срещат в природата като плавен и подвижен синусо
Генератор на тонове на Морз (CW бипер с ниска мощност): 3 стъпки
Генератор на тонове на Морс (ниска мощност CW бийпър): Тук описвам как да създам прост генератор на ниска мощност, който използвам, за да науча сина си на морзов код. Този ключ е използван от германските сили по време на Втората световна война. Ключът имаше
Охладител / стойка за лаптоп с нулева цена (без лепило, без пробиване, без гайки и болтове, без винтове): 3 стъпки
Охладител / стойка за лаптоп с нулева цена (без лепило, без пробиване, без гайки и болтове, без винтове): АКТУАЛИЗИРАНЕ: МОЛЯ ПРИЛОЖНО ГЛАСУВАНЕ ЗА МОИТЕ ИНСТРУКЦИИ, БЛАГОДАРЯ ^ _ ^ МОЖЕТЕ И ДРУГИ ДА ИЗБОРИТЕ ВЛИЗАЙТЕ НА www.instructables.com/id/Zero-Cost-Aluminium-Furnace-No-Propane-No-Glue-/ ИЛИ МОЖЕ ДА ГЛАСУВАТЕ ЗА МОЙ НАЙ-ДОБРИЯ ПРИЯТЕЛ