Sisukord:

Arduino toonigeneraator ilma raamatukogu või jadafunktsioonita (katkestustega): 10 sammu
Arduino toonigeneraator ilma raamatukogu või jadafunktsioonita (katkestustega): 10 sammu

Video: Arduino toonigeneraator ilma raamatukogu või jadafunktsioonita (katkestustega): 10 sammu

Video: Arduino toonigeneraator ilma raamatukogu või jadafunktsioonita (katkestustega): 10 sammu
Video: How to use MAX6675 thermocouple k type with Arduino 2024, November
Anonim
Arduino toonigeneraator ilma raamatukogu või jadafunktsioonita (katkestustega)
Arduino toonigeneraator ilma raamatukogu või jadafunktsioonita (katkestustega)

See pole midagi, mida ma tavaliselt juhendaksin, ma eelistan oma metallitööd, aga kuna olen elektrotehnikaüliõpilane ja pean läbima mikrokontrollerite klassi (Embedded Systems Design), mõtlesin, et teen juhendi üks minu projektidest. Kui ma algselt tegin projekti ja teisi selle klassi jaoks, leidsin, et väga vähe või üldse mitte õpetusi, mis ei kasuta arduino raamatukogu funktsioone ega jadafunktsioone, on veel üks põhjus, miks ma arvasin, et see oleks hea juhendatav.

See kood on loodud Atmega 2560 mikrokontrolleri jaoks, nii et kui soovite selle teisele tahvlile rakendada, peate oma kontrollerite kasutusjuhendi põhjal muutma koodis olevaid aadressiregistreid. Koodi põhiidee seisneb selles, et alati, kui sisestate seeriamonitorile klaviatuuri klahvi, väljastab arduino mega teatud sageduse vastavalt sellele, millist klahvi vajutate, ja "q" selle lähtestab. Ma tegin selle nii, et "a" väljastab lamedat sagedust A ja "A" teravate sagedust A, "b" väljastab B tasapinda, "c" C tasapinda, "C" C teravat jne. Kogu kood laaditakse üles lõpus, kuid iga samm lagundab koodi tükkideks, nii et seda on lihtsam selgitada.

Samm: määrake registriaadressid

Registriaadresside määratlemine
Registriaadresside määratlemine

See samm on lihtne, kui kasutate atmega 2560, peate lihtsalt kasutama minu kasutatavaid aadresse, kuigi kui kasutate erineva kiibiga tahvlit, peate leidma oma iga registri aadressid kiipide kasutusjuhend. Ülaosas olevad definitsioonid on lihtsalt konstandid, mida kasutatakse hiljem meie funktsioonide jaoks. Me määrame aadressid lenduvaks allkirjastamata, sest me ei taha, et kompilaator nendega jama teeks.

2. samm: massiivid ja globaalsed muutujad

Massiivid ja globaalsed muutujad
Massiivid ja globaalsed muutujad
Massiivid ja globaalsed muutujad
Massiivid ja globaalsed muutujad
Massiivid ja globaalsed muutujad
Massiivid ja globaalsed muutujad

Siin tahame määratleda sagedusmassiivi, mis sisaldab kõiki sagedusi, mida iga klahv peaks väljastama. Need väärtused on arvutatud tegelikest noodisagedustest ja ausalt öeldes unustasin, kuidas need sain, kuid need on õiged väärtused, kuna veendusin neid ostsilloskoobil. Samuti määratleme märkmete massiivi, mis sisaldab kõiki klahve, mida iga tooni jaoks vajutada, samuti muutujaid, mida vajame oma hilisemate funktsioonide jaoks.

3. samm: funktsioon "serial.begin"

The
The

Nimetame meie kohandatud funktsiooni, mis kordab funktsiooni "serial.begin" U0init (). See võtab sisendiks soovitud andmeedastuskiiruse ja käivitab jadaporti selle kiirusega.

Samm 4: funktsioon "serial.available"

The
The

Nimetame funktsiooni, mis imiteerib "serial.available", U0kbhit (). See ei võta sisendit, vaid tuvastab selle asemel, kas klaviatuuril on RDA olekubiti kasutades muudatusi tehtud, ja tagastab muudatuse tuvastamisel tõese väärtuse.

Samm: funktsioon "serial.read"

The
The

Funktsiooni, mis jäljendab funktsiooni "serial.read", nimetame U0getchar (), mis ei sisenda ega väljasta kõiki muudatusi, mis on tehtud UDR0 registrisse salvestatud klaviatuuril.

6. samm: funktsioon "serial.write"

The
The

Nimetame funktsiooni, mis imiteerib "serial.write", U0putchar (), mis võtab andmed UDR0 registrist, kui muudatus tuvastatakse ja salvestatakse, ning väljundid, mis muutuvad tagasi seeriamonitoriks.

Samm: seadistusfunktsioon

Seadistusfunktsioon
Seadistusfunktsioon

See on põhiline häälestusfunktsioon, mis kasutab jadapordi lähtestamiseks meie jäljendust "serial.begin" ja lähtestab taimeriregistrite bitiseaded ning seab PB6 meie toonid väljastama.

8. samm: silmuse ja ISR funktsioonid

Loop ja ISR funktsioonid
Loop ja ISR funktsioonid

Tsükkel toimib nii: kui meie "serial.available" funktsiooniga tuvastatakse muutus, salvestab meie funktsioon "serial.read" selle muutuse ja meie "serial.write" funktsioon paneb selle muudatuse jadamonitori. Niikaua kui muutuja i on väiksem kui sagedusmassiivi suurus, seab see väljundiks selle massiivi i positsiooni, andes sageduse sellesse asendisse. ISR toimib lähtestamisena, kus kui sagedusmassiivi positsioon ei ole võrdne 0 -ga (teisisõnu, kui "q" ei vajutata), väljastab see sageduse, kuid kui vajutatakse "q", lähtestab see. Pange tähele: see kood kasutab katkestusi, kuid seda saab teha katkestustega. Postitan koodi katkestusteta, kui saan selle kohta päringuid, lihtsalt arvan, et katkestusversioon on lõbusam.

9. samm: juhtmestik

Juhtmestik
Juhtmestik

Selle koodi ühendamine on äärmiselt lihtne, pange lihtsalt PB6 väljundkaabel leivaplaadile, ühendage sellega sumin või kõlar jadaga ja ühendage see uuesti maandusega. Märkus: kui kasutate kõlarit, pange kõlarite ette väike takisti. Kui soovite lihtsalt väljundit näha, kuid mitte kuulda, ühendage PB6 ostsilloskoobi punase juhtmega ja must juhe maandusega.

Samm: pange see kõik kokku

Lisasin sellele etapile täieliku koodi, kuna olen selle kõiki osi eelmistes sammudes selgitanud. See võtab lihtsalt klaviatuuri sisendi erinevatele sagedustele ja väljastab selle sageduse PB6 -le. Loodan, et teile meeldis IDE -ga teistmoodi koodide lugemine!

Samuti palun hääletage selle eest mikrokontrolleri konkursil: D

Soovitan: