Cuprins:

Generator de tonuri Arduino Fără bibliotecă sau funcții seriale (cu întreruperi): 10 pași
Generator de tonuri Arduino Fără bibliotecă sau funcții seriale (cu întreruperi): 10 pași

Video: Generator de tonuri Arduino Fără bibliotecă sau funcții seriale (cu întreruperi): 10 pași

Video: Generator de tonuri Arduino Fără bibliotecă sau funcții seriale (cu întreruperi): 10 pași
Video: Cele mai bune 10 aplicații de marketing AI 2024, Noiembrie
Anonim
Generator de tonuri Arduino fără bibliotecă sau funcții seriale (cu întreruperi)
Generator de tonuri Arduino fără bibliotecă sau funcții seriale (cu întreruperi)

Nu este un lucru pe care, în mod normal, l-aș face instructabil, prefer metalurgia mea, dar, deoarece sunt student la inginerie electrică și trebuie să urmez o clasă de microcontrolere (Embedded Systems Design), m-am gândit să fac un instructable pe unul dintre proiectele mele. Când am făcut inițial proiectul și altele pentru această clasă, am constatat că există foarte puține tutoriale care nu folosesc funcțiile de bibliotecă arduino sau funcțiile seriale, care este un alt motiv pentru care am crezut că ar fi un bun instructiv.

Acest cod este conceput pentru microcontrolerul Atmega 2560, deci, dacă doriți să îl implementați pe o altă placă, va trebui să schimbați registrele de adrese din cod pe baza manualului de utilizare al controlerelor dvs. Ideea de bază din spatele codului este că ori de câte ori introduceți o tastă de pe tastatură în monitorul serial, arduino mega va emite o anumită frecvență pe baza tastei pe care o apăsați, cu „q” resetând-o. Am făcut-o astfel încât „a” să emită frecvența A flat și „A” să emită frecvența A netă, „b” să scoată B flat, „c” pentru C flat, „C” pentru C sharp și așa mai departe. Codul complet este încărcat la sfârșit, dar fiecare pas va împărți codul în bucăți, astfel încât să fie mai ușor de explicat.

Pasul 1: Definirea adreselor de înregistrare

Definirea adreselor de registru
Definirea adreselor de registru

Acest pas este ușor, dacă utilizați atmega 2560, trebuie doar să utilizați adresele pe care le-am folosit, deși dacă utilizați o placă cu un cip diferit, va trebui să găsiți adresele pentru fiecare dintre aceste registre pe manual de utilizare a cipurilor. Definițiile din partea de sus sunt doar constante care vor fi folosite pentru funcțiile noastre mai târziu. Specificăm adresele ca nesemnate volatile, deoarece nu dorim ca compilatorul să se amestece cu ele.

Pasul 2: tablouri și variabile globale

Tablouri și variabile globale
Tablouri și variabile globale
Tablouri și variabile globale
Tablouri și variabile globale
Tablouri și variabile globale
Tablouri și variabile globale

Aici vrem să definim matricea de frecvență care va conține toate frecvențele pe care fiecare tastă ar trebui să le emită. Aceste valori sunt calculate din frecvențele actuale ale notelor și, sincer, am uitat cum le-am obținut, dar sunt valorile potrivite pe măsură ce le-am testat pe un osciloscop pentru a mă asigura. De asemenea, definim matricea de note care conține toate tastele de apăsat pentru fiecare ton, precum și variabilele de care vom avea nevoie pentru funcțiile noastre ulterioare.

Pasul 3: Funcția „serial.begin”

The
The

Vom apela funcția noastră personalizată care reproduce funcția „serial.begin” U0init (). Acesta ia viteza de transmisie dorită ca intrare și pornește portul serial la acea viteză de transmisie.

Pasul 4: Funcția „serial.available”

The
The

Vom numi funcția care imită „serial.available” U0kbhit (). Nu necesită intrare, dar detectează în schimb dacă există o modificare făcută pe tastatură utilizând bitul de stare RDA și revine adevărat atunci când este detectată o modificare.

Pasul 5: Funcția „serial.read”

The
The

Vom numi funcția care imită funcția "serial.read" U0getchar (), care nu ia intrări și ieșiri, indiferent de modificările efectuate pe tastatură, care este stocată în registrul UDR0.

Pasul 6: Funcția „serial.write”

The
The

Vom apela funcția care imită „serial.write” U0putchar (), care preia datele din registrul UDR0 în timp ce o modificare este detectată și stocată și ieșirile care se întorc la monitorul serial.

Pasul 7: Funcția de configurare

Funcția de configurare
Funcția de configurare

Aceasta este funcția de bază de configurare care va folosi imitația „serial.begin” pentru a inițializa portul serial și va inițializa setările de biți pentru registrele temporizatorului și va seta PB6 să emită tonurile noastre.

Pasul 8: Funcțiile Loop și ISR

Funcțiile Loop și ISR
Funcțiile Loop și ISR

Bucla funcționează astfel: dacă se detectează o modificare cu funcția noastră "serial.available", funcția noastră "serial.read" stochează această modificare, iar funcția noastră "serial.write" introduce această modificare în monitorul serial. Atâta timp cât o variabilă i este mai mică decât dimensiunea matricei de frecvență, aceasta va seta ieșirea să fie poziția lui i în matricea respectivă, ieșind frecvența la acea poziție. ISR funcționează ca resetare, în cazul în care dacă poziția matricei de frecvență nu este egală cu 0 (cu alte cuvinte dacă „q” nu este apăsat), va emite frecvența, dar atunci când „q” este apăsat se va reseta. Vă rugăm să rețineți: acest cod folosește întreruperi, dar se poate face cu întreruperi dezactivate. Voi posta codul fără întreruperi dacă primesc cereri pentru acesta, cred că versiunea de întrerupere este mai distractivă.

Pasul 9: Cablare

Cablare
Cablare

Cablarea acestui cod este extrem de ușoară, pur și simplu puneți un fir de ieșire de la PB6 la o placă de măsurare, conectați un buzzer sau difuzor în serie cu acesta și conectați-l înapoi la masă. Notă: dacă utilizați un difuzor, puneți un rezistor mic în fața difuzorului. Dacă doriți doar să vedeți ieșirea, dar să nu o auziți, conectați doar PB6 la cablul roșu al unui osciloscop și cablul negru la masă.

Pasul 10: Puneți totul împreună

Am adăugat codul complet la acest pas, deoarece am explicat toate părțile acestuia în pașii anteriori. Este nevoie doar de o intrare de la tastatură pentru diferite frecvențe și de ieșiri care frecvență la PB6. Sper că ți-a plăcut să citești un mod diferit de codificare cu IDE!

De asemenea, vă rugăm să votați acest lucru în cadrul concursului de microcontroler: D

Recomandat: