Sisällysluettelo:

Arduino -sävygeneraattori ilman kirjastoa tai sarjatoimintoja (keskeytyksillä): 10 vaihetta
Arduino -sävygeneraattori ilman kirjastoa tai sarjatoimintoja (keskeytyksillä): 10 vaihetta

Video: Arduino -sävygeneraattori ilman kirjastoa tai sarjatoimintoja (keskeytyksillä): 10 vaihetta

Video: Arduino -sävygeneraattori ilman kirjastoa tai sarjatoimintoja (keskeytyksillä): 10 vaihetta
Video: Arduinon perusteet Osa #1, Arduino-ympäristö 2024, Marraskuu
Anonim
Arduino -sävygeneraattori ilman kirjastoa tai sarjatoimintoja (keskeytyksillä)
Arduino -sävygeneraattori ilman kirjastoa tai sarjatoimintoja (keskeytyksillä)

Tämä ei ole asia, johon yleensä tekisin opastettavan, mieluummin metallityöni, mutta koska olen sähkötekniikan opiskelija ja minun on suoritettava luokka mikrokontrollereista (Embedded Systems Design), ajattelin tehdä opastettavan yksi projekteistani. Kun tein alun perin projektin ja muut tälle luokalle, huomasin, että on hyvin vähän tai ei lainkaan opetusohjelmia, jotka eivät käytä arduino -kirjaston toimintoja tai sarjatoimintoja, mikä oli toinen syy, miksi ajattelin, että tämä olisi hyvä opettavainen.

Tämä koodi on suunniteltu Atmega 2560 -mikro -ohjaimelle, joten jos haluat ottaa sen käyttöön toisella kortilla, sinun on muutettava koodirekisterit ohjaimesi käyttöoppaan perusteella. Koodin perusajatus on, että aina kun näppäilet näppäimistön näppäimen sarjamonitoriin, arduino mega lähettää tietyn taajuuden sen mukaan, mitä näppäintä painat, ja "q" nollaa sen. Tein sen niin, että "a" lähettää A -tasaisen taajuuden ja "A" antaa A -terävän taajuuden, "b" antaa B -tason, "c" C -tasaisen, "C" C -terävän ja niin edelleen. Koko koodi ladataan lopussa, mutta jokainen vaihe hajottaa koodin osiin, jotta se on helpompi selittää.

Vaihe 1: Rekisteriosoitteiden määrittäminen

Rekisteriosoitteiden määrittäminen
Rekisteriosoitteiden määrittäminen

Tämä vaihe on helppo, jos käytät atmega 2560 -laitetta, sinun on vain käytettävä käyttämiäni osoitteita, mutta jos käytät eri sirulla varustettua levyä, sinun on löydettävä kunkin rekisterin osoitteet sirujen käyttöopas. Yläosassa olevat määritelmät ovat vain vakioita, joita käytetään toiminnoissamme myöhemmin. Määritämme osoitteet epävakaiksi allekirjoittamattomiksi, koska emme halua kääntäjän sekoittavan niihin.

Vaihe 2: Taulukot ja globaalimuuttujat

Taulukot ja globaalimuuttujat
Taulukot ja globaalimuuttujat
Taulukot ja globaalimuuttujat
Taulukot ja globaalimuuttujat
Taulukot ja globaalimuuttujat
Taulukot ja globaalimuuttujat

Tässä haluamme määritellä taajuusryhmän, joka sisältää kaikki taajuudet, jotka kukin avain antaa. Nämä arvot lasketaan todellisista nuotin taajuuksista, ja rehellisesti unohdin, miten sain ne, mutta ne ovat oikeat arvot, kun testasin niitä oskilloskoopilla varmistaakseni. Määrittelemme myös nuottijoukon, joka sisältää kaikki kunkin näppäimen painettavat näppäimet sekä muuttujat, joita tarvitsemme myöhempiin toimintoihimme.

Vaihe 3: "serial.begin" -toiminto

The
The

Kutsumme mukautettua toimintoamme, joka toistaa "serial.begin" -funktion U0init (). Se ottaa halutun siirtonopeuden syötteeksi ja käynnistää sarjaportin kyseisellä siirtonopeudella.

Vaihe 4: "Sarja. Käytettävissä" -toiminto

The
The

Kutsumme toimintoa, joka jäljittelee "serial.available" U0kbhit (). Se ei syötä, vaan havaitsee sen sijaan, onko näppäimistöllä tehty muutos RDA -tilabitin avulla, ja palauttaa arvon true, kun muutos havaitaan.

Vaihe 5: "Serial.read" -toiminto

The
The

Kutsumme funktiota, joka jäljittelee "serial.read" -toimintoa U0getchar (), joka ei syötä eikä lähetä mitään muutoksia näppäimistöön, joka on tallennettu UDR0 -rekisteriin.

Vaihe 6: "serial.write" -toiminto

The
The

Kutsumme toimintoa, joka jäljittelee "serial.write" U0putchar (): aa, joka ottaa tiedot UDR0 -rekisteristä, kun muutos havaitaan ja tallennetaan, ja antaa lähtöjä, jotka muuttuvat takaisin sarjamonitoriksi.

Vaihe 7: Asennustoiminto

Asetustoiminto
Asetustoiminto

Tämä on perusasetustoiminto, joka käyttää "serial.begin" -imitoitamme sarjaportin alustamiseen ja alustaa ajastinrekisterien bittiasetuksemme ja asettaa PB6: n lähettämään äänemme.

Vaihe 8: Silmukka- ja ISR -toiminnot

Silmukka- ja ISR -toiminnot
Silmukka- ja ISR -toiminnot

Silmukka toimii näin: jos muutos havaitaan "serial.available" -toiminnolla, "serial.read" -toiminto tallentaa muutokset, ja "serial.write" -toiminto tuo muutoksen sarjamonitoriin. Niin kauan kuin muuttuja i on pienempi kuin taajuusryhmän koko, se asettaa ulostulon i: n asemaan kyseisessä taulukossa ja antaa taajuuden kyseisessä paikassa. ISR toimii kuittauksena, jossa jos taajuusryhmän sijainti ei ole 0 (toisin sanoen, jos "q" ei paineta), se lähettää taajuuden, mutta kun "q" painetaan, se nollautuu. Huomaa: tämä koodi käyttää keskeytyksiä, mutta se voidaan tehdä keskeytysten ollessa poissa käytöstä. Lähetän koodin keskeytyksettä, jos saan sitä koskevia pyyntöjä, mielestäni keskeytysversio on vain hauskempi.

Vaihe 9: Johdotus

Johdotus
Johdotus

Tämän koodin johdotus on erittäin helppoa, yksinkertaisesti liitä lähtöjohto PB6: sta leipälevyyn, kytke summeri tai kaiutin sarjaan ja kytke se takaisin maahan. Huomautus: jos käytät kaiutinta, aseta pieni vastus kaiuttimen eteen. Jos haluat vain nähdä ulostulon, mutta et kuule sitä, kytke PB6 oskilloskoopin punaiseen johtoon ja musta johto maahan.

Vaihe 10: Yhdistä kaikki

Lisäsin täyden koodin tähän vaiheeseen, koska olen selittänyt sen kaikki osat aiemmissa vaiheissa. Se tarvitsee vain näppäimistötulon eri taajuuksille ja lähettää taajuuden PB6: lle. Toivottavasti nautit lukemasta eri tapaa koodata IDE: n kanssa!

Äänestä myös tätä mikrokontrollerikilpailussa: D

Suositeltava: