Cuprins:
- Pasul 1: Definirea adreselor de înregistrare
- Pasul 2: tablouri și variabile globale
- Pasul 3: Funcția „serial.begin”
- Pasul 4: Funcția „serial.available”
- Pasul 5: Funcția „serial.read”
- Pasul 6: Funcția „serial.write”
- Pasul 7: Funcția de configurare
- Pasul 8: Funcțiile Loop și ISR
- Pasul 9: Cablare
- Pasul 10: Puneți totul împreună
Video: Generator de tonuri Arduino Fără bibliotecă sau funcții seriale (cu întreruperi): 10 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
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
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
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”
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”
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”
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”
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
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
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
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:
Dispenser de dezinfectare a mâinilor fără contact DIY fără Arduino sau microcontroler: 17 pași (cu imagini)
Dispozitiv de dezinfectare a mâinilor fără contact DIY fără un Arduino sau un microcontroler: După cum știm cu toții, focarul COVID-19 a lovit lumea și ne-a schimbat stilul de viață. În această stare, alcoolul și dezinfectantele pentru mâini sunt fluide vitale, cu toate acestea, acestea trebuie utilizate corect. Atingerea recipientelor cu alcool sau a produselor dezinfectante pentru mâini cu mâinile infectate c
Rularea fără ecran / afișare (fără cap) pe Raspberry Pi sau alte computere bazate pe Linux / unix: 6 pași
Rularea fără ecran / afișare (fără cap) pe Raspberry Pi sau alte computere bazate pe Linux / unix: Când majoritatea oamenilor cumpără un Raspberry PI, cred că au nevoie de un ecran de computer. Nu pierdeți banii pe monitoare și tastaturi de computer inutile. Nu vă pierdeți timpul mutând tastaturi și monitoare între computere. Nu lega un televizor când nu
Cum să rulați motorul DC fără perii Quadcopter fără drone utilizând controlerul de viteză al motorului fără perii HW30A și testerul servo: 3 pași
Cum să rulați motorul DC fără perii Quadcopter cu drone utilizând regulatorul de viteză al motorului fără perii HW30A și testerul servo: Descriere: Acest dispozitiv se numește Servo Motor Tester care poate fi utilizat pentru a rula servo motorul prin conectarea simplă a servomotorului și alimentarea acestuia. De asemenea, dispozitivul poate fi folosit ca generator de semnal pentru regulatorul de viteză electric (ESC), apoi nu puteți
Instalați tonuri de apel fără un plan de date: 9 pași
Instalați tonuri de apel fără un plan de date: m-am săturat de taxa de 180 USD pe an pentru un plan de date pentru fiecare dintre telefoanele mele mobile, așa că le-am anulat. Apoi am aflat că îmi pot crea propriile tonuri de apel free.mp3, le pot încărca pe net și le pot descărca pe telefonul meu. Apoi am aflat despre taxa de $ pentru
Răcitor / suport pentru laptop cu cost zero (fără lipici, fără găurire, fără piulițe și șuruburi, fără șuruburi): 3 pași
Zero Cost Laptop Cooler / Stand (Fără lipici, fără găurire, fără piulițe și șuruburi, fără șuruburi): ACTUALIZARE: VĂ RUGĂM VOTĂ PENTRU MEA MEA MEA INTRAREA PE www.instructables.com/id/Zero-Cost-Aluminum-Furnace-No-Propane-No-Glue-/ SAU POATE VOTA PENTRU CEL MAI BUN PRIETEN AL MEU