Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания): 10 стъпки
Генератор на тонове Arduino без библиотека или серийни функции (с прекъсвания): 10 стъпки
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

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