Съдържание:

Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания): 10 стъпки
Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания): 10 стъпки

Видео: Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания): 10 стъпки

Видео: Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания): 10 стъпки
Видео: Веб-программирование – информатика для руководителей бизнеса 2016 2024, Юли
Anonim
Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания)
Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания)

Обикновено това не е нещо, на което да преподавам, предпочитам металообработването си, но тъй като съм студент по електротехника и трябва да взема курс по микроконтролери (дизайн на вградени системи), реших да направя инструктаж по един от моите проекти. Когато първоначално направих проекта и други за този клас, открих, че има много малко или никакви уроци, които не използват функциите на библиотеката arduino или серийни функции, което е друга причина, поради която смятах, че това би било добра инструкция.

Този код е предназначен за микроконтролера Atmega 2560, така че ако искате да го внедрите на друга платка, ще трябва да промените адресните регистри в кода въз основа на ръководството за потребителя на вашите контролери. Основната идея зад кода е, че всеки път, когато въведете ключ от клавиатурата в серийния монитор, arduino mega ще изведе определена честота въз основа на клавиша, който натиснете, като "q" го нулира. Направих го така, че "а" ще извежда A плоска честота и "A" ще извежда A остра честота, "b" извежда B плоска, "c" за C плоска, "C" за C остра и т.н. Пълният код се качва в края, но всяка стъпка ще разбие кода на парчета, така че е по -лесно да се обясни.

Стъпка 1: Определяне на адреси в регистъра

Определяне на адреси в регистъра
Определяне на адреси в регистъра

Тази стъпка е лесна, ако използвате atmega 2560, просто трябва да използвате адресите, които използвах, въпреки че, ако използвате дъска с различен чип, ще трябва да намерите адресите за всеки от тези регистри във вашия ръководство за потребителя на чипове. Дефинициите в горната част са само константи, които по -късно ще бъдат използвани за нашите функции. Ние посочваме адресите като променливи без подпис, защото не искаме компилаторът да се забърква с тях.

Стъпка 2: Масиви и глобални променливи

Масиви и глобални променливи
Масиви и глобални променливи
Масиви и глобални променливи
Масиви и глобални променливи
Масиви и глобални променливи
Масиви и глобални променливи

Тук искаме да определим честотния масив, който ще съдържа всички честоти, които всеки ключ трябва да изведе. Тези стойности се изчисляват от действителните нотни честоти и честно казано забравих как ги получих, но те са правилните стойности, докато ги тествах на осцилоскоп, за да се уверя. Ние също така дефинираме масива с бележки, който съдържа всички клавиши, които трябва да натиснете за всеки тон, както и променливите, от които се нуждаем за по -късните ни функции.

Стъпка 3: Функцията "serial.begin"

The
The

Ще извикаме нашата персонализирана функция, която репликира функцията "serial.begin" U0init (). Той приема желаната скорост на предаване като вход и стартира серийния порт при тази скорост на предаване.

Стъпка 4: Функцията "serial.available"

The
The

Ще извикаме функцията, имитираща "serial.available" U0kbhit (). Той не приема въвеждане, но вместо това открива дали е направена промяна на клавиатурата, използвайки бита за състояние на RDA, и връща истина, когато бъде открита промяна.

Стъпка 5: Функцията "serial.read"

The
The

Ще извикаме функцията, имитираща функцията "serial.read" U0getchar (), която не приема вход и извежда каквато и да е промяна, направена на клавиатурата, която се съхранява в регистъра UDR0.

Стъпка 6: Функцията "serial.write"

The
The

Ще извикаме функцията, имитираща "serial.write" U0putchar (), която взема данните от регистъра на UDR0, докато промяната се открива и съхранява, и извежда тези данни обратно към серийния монитор.

Стъпка 7: Функция за настройка

Функция за настройка
Функция за настройка

Това е основната функция за настройка, която ще използва нашата имитация "serial.begin" за инициализиране на серийния порт и ще инициализира нашите битови настройки за регистрите на таймера и ще настрои PB6 да извежда нашите тонове.

Стъпка 8: Циклични и ISR функции

Циклични и ISR функции
Циклични и ISR функции

Цикълът функционира така: ако се открие промяна с нашата функция "serial.available", нашата функция "serial.read" съхранява тази промяна, а нашата функция "serial.write" поставя тази промяна в серийния монитор. Докато променлива i е по -малка от размера на честотния масив, тя ще настрои изхода да бъде позицията на i в този масив, извеждайки честотата в тази позиция. ISR функционира като нулиране, където ако позицията на честотния масив не е равна на 0 (с други думи, ако "q" не е натиснат), той ще изведе честотата, но когато е натиснат "q", той ще се нулира. Моля, обърнете внимание: този код използва прекъсвания, но може да се направи и с деактивирани прекъсвания. Ще публикувам кода без прекъсвания, ако получа някакви заявки за него, просто мисля, че версията за прекъсване е по -забавна.

Стъпка 9: Окабеляване

Електрически инсталации
Електрически инсталации

Окабеляването за този код е изключително лесно, просто поставете изходен проводник от PB6 към макет, свържете последователно зумер или високоговорител с това и го свържете отново към земята. Забележка: ако използвате високоговорител, поставете малък резистор преди високоговорителя. Ако просто искате да видите изхода, но да не го чуете, просто свържете PB6 към червения проводник на осцилоскоп и черния проводник към земята.

Стъпка 10: Съберете всичко заедно

Добавих пълния код към тази стъпка, тъй като обясних всички части от него в предишните стъпки. Просто е необходим клавиатурен вход за различни честоти и извежда тази честота към PB6. Надявам се да ви хареса да четете различен начин за кодиране с IDE!

Също така, моля, гласувайте за това в конкурса за микроконтролер: D

Препоръчано: