Բովանդակություն:

Arduino տոնային գեներատոր `առանց գրադարանի կամ սերիական գործառույթների (ընդհատումներով). 10 քայլ
Arduino տոնային գեներատոր `առանց գրադարանի կամ սերիական գործառույթների (ընդհատումներով). 10 քայլ

Video: Arduino տոնային գեներատոր `առանց գրադարանի կամ սերիական գործառույթների (ընդհատումներով). 10 քայլ

Video: Arduino տոնային գեներատոր `առանց գրադարանի կամ սերիական գործառույթների (ընդհատումներով). 10 քայլ
Video: ESP32 Tutorial 14 - Playing Custom Music Note Using SunFounder ESP32 IoT Learnig kit 2024, Հուլիսի
Anonim
Arduino տոնային գեներատոր `առանց գրադարանի կամ սերիական գործառույթների (ընդհատումներով)
Arduino տոնային գեներատոր `առանց գրադարանի կամ սերիական գործառույթների (ընդհատումներով)

Սա այն չէ, ինչին սովորաբար սովորեցնելու հնարավորություն կտայի, ես նախընտրում եմ իմ մետաղագործությունը, բայց քանի որ ես էլեկտրատեխնիկայի ուսանող եմ և պետք է դասեր անցնեմ միկրոկոնտրոլերների վրա (ներդրված համակարգերի դիզայն), ես մտածեցի, որ այն ուսուցանելու եմ իմ նախագծերից մեկը: Երբ ես ի սկզբանե պատրաստեցի նախագիծը և այս դասի մյուս անդամները, ես գտա, որ շատ քչերն են դասընթացներ, որոնք չեն օգտագործում arduino գրադարանի գործառույթները կամ սերիական գործառույթները, ինչը ևս մեկ պատճառ է, որ ես կարծում էի, որ սա լավ ուսանելի կլինի:

Այս կոդը նախատեսված է Atmega 2560 միկրոկառավարիչի համար, այնպես որ, եթե ցանկանում եք այն տեղադրել մեկ այլ տախտակի վրա, ապա պետք է փոխեք հասցեների գրանցամատյանները ծածկագրում ՝ հիմնվելով ձեր վերահսկիչների օգտագործողի ձեռնարկի վրա: Կոդի հիմնական գաղափարն այն է, որ երբ ստեղնաշարի վրա ստեղն մուտքագրեք սերիական մոնիտոր, arduino մեգան որոշակի հաճախականություն կտա ՝ ելնելով այն ստեղնից, որը սեղմում եք, իսկ «q» - ն այն վերականգնում է: Ես այնպես արեցի, որ «a» - ն դուրս գա A հարթ հաճախականությունից, իսկ «A» - ն ՝ A սուր հաճախականությունը, «b» - ն ՝ B հարթ, «c» - ն ՝ C հարթության համար, «C» - ն ՝ C- ի դեպքում և այլն: Ամբողջական ծածկագիրը վերբեռնվում է վերջում, բայց յուրաքանչյուր քայլը կբաժանի կոդը կտորների, այնպես որ ավելի հեշտ կլինի բացատրել:

Քայլ 1: Գրանցման հասցեների սահմանում

Գրանցման հասցեների սահմանում
Գրանցման հասցեների սահմանում

Այս քայլը հեշտ է, եթե դուք օգտագործում եք atmega 2560, պարզապես անհրաժեշտ է օգտագործել իմ օգտագործած հասցեները, չնայած եթե օգտագործում եք այլ չիպով տախտակ, ապա ձեզ հարկավոր է գտնել այս գրանցամատյաններից յուրաքանչյուրի հասցեները չիպսերի օգտագործողի ձեռնարկ: Վերին սահմանումները պարզապես հաստատուններ են, որոնք հետագայում կօգտագործվեն մեր գործառույթների համար: Մենք հասցեները նշում ենք որպես անկայուն անստորագիր, քանի որ չենք ցանկանում, որ կոմպիլյատորը խառնվի դրանց հետ:

Քայլ 2: raանգվածներ և գլոբալ փոփոխականներ

Arանգվածներ և գլոբալ փոփոխականներ
Arանգվածներ և գլոբալ փոփոխականներ
Raանգվածներ և գլոբալ փոփոխականներ
Raանգվածներ և գլոբալ փոփոխականներ
Raանգվածներ և գլոբալ փոփոխականներ
Raանգվածներ և գլոբալ փոփոխականներ

Այստեղ մենք ցանկանում ենք սահմանել Հաճախականության զանգված, որը կպարունակի բոլոր այն հաճախականությունները, որոնք պետք է թողարկի յուրաքանչյուր ստեղն: Այս արժեքները հաշվարկվում են իրական նոտաների հաճախականություններից, և անկեղծ ասած, ես մոռացել եմ, թե ինչպես եմ դրանք ստացել, բայց դրանք ճիշտ արժեքներն են, երբ դրանք ստուգել եմ օսլիլոսկոպով `համոզվելու համար: Մենք նաև սահմանում ենք նշումների զանգվածը, որը պարունակում է յուրաքանչյուր հնչերանգի համար սեղմելու բոլոր ստեղները, ինչպես նաև այն փոփոխականները, որոնք մեզ անհրաժեշտ կլինեն մեր հետագա գործառույթների համար:

Քայլ 3. «Serial.begin» գործառույթը

The
The

Մենք կանչում ենք մեր սովորական գործառույթը, որը կրկնում է «serial.begin» գործառույթը U0init (): Որպես մուտքագրում վերցնում է ցանկալի բաուդրատը և սկսում է սերիական պորտը այդ բաուդրատից:

Քայլ 4. «Serial.available» գործառույթը

The
The

Մենք կանվանենք «serial.available» U0kbhit () ընդօրինակող գործառույթը: Այն մուտքագրում չի պահանջում, բայց փոխարենը հայտնաբերում է, թե արդյոք ստեղնաշարի վրա փոփոխություն է կատարվել ՝ օգտագործելով RDA կարգավիճակի բիտը և փոփոխության հայտնաբերման դեպքում վերադարձնում է true:

Քայլ 5. «serial.read» գործառույթը

The
The

«Serial.read» գործառույթը ընդօրինակող գործառույթը կանվանենք U0getchar (), որը մուտք և ելք չի վերցնում ստեղնաշարի վրա կատարված ցանկացած փոփոխությունից, որը պահվում է UDR0 գրանցամատյանում:

Քայլ 6. «Սերիալ. Գրել» գործառույթը

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

Խորհուրդ ենք տալիս: