Innholdsfortegnelse:

Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd): 10 trinn
Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd): 10 trinn

Video: Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd): 10 trinn

Video: Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd): 10 trinn
Video: Как использовать термопару MAX6675 типа k с Arduino 2024, November
Anonim
Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd)
Arduino tonegenerator uten bibliotek eller serielle funksjoner (med avbrudd)

Dette er ikke noe jeg normalt vil gjøre instruksjoner om, jeg foretrekker metallarbeidet mitt, men siden jeg er elektroteknikkstudent og må ta en klasse på mikrokontrollere (Embedded Systems Design), tenkte jeg at jeg skulle lage en instruks på et av prosjektene mine. Da jeg opprinnelig laget prosjektet og andre for denne klassen, fant jeg ut at det er svært få eller ingen opplæringsprogrammer som ikke bruker arduino -bibliotekets funksjoner eller serielle funksjoner, noe som er en annen grunn til at jeg trodde dette ville være en god instruks.

Denne koden er designet for Atmega 2560 mikrokontroller, så hvis du vil implementere den på et annet bord, må du endre adresseregistrene i koden basert på brukerhåndboken til kontrollerne. Den grunnleggende ideen bak koden er at når du skriver inn en tast på tastaturet i den serielle skjermen, vil arduino mega sende ut en viss frekvens basert på hvilken tast du trykker på, med "q" tilbakestille den. Jeg gjorde det slik at "a" sender ut A flat frekvens og "A" sender A skarp frekvens, "b" sender B flat, "c" for C flat, "C" for C sharp, og så videre. Hele koden lastes opp på slutten, men hvert trinn bryter koden i biter, så det er lettere å forklare.

Trinn 1: Definere registeradresser

Definere registeradresser
Definere registeradresser

Dette trinnet er enkelt, hvis du bruker atmega 2560, trenger du bare å bruke adressene jeg brukte, selv om du bruker et brett med en annen brikke, må du finne adressene for hvert av disse registerene på din chips brukerhåndbok. Definisjonene øverst er bare konstanter som vil bli brukt til funksjonene våre senere. Vi angir adressene som flyktige usignerte fordi vi ikke vil at kompilatoren skal rote med dem.

Trinn 2: Matriser og globale variabler

Arrays og globale variabler
Arrays og globale variabler
Arrays og globale variabler
Arrays og globale variabler
Arrays og globale variabler
Arrays og globale variabler

Her vil vi definere frekvensmatrisen som vil inneholde alle frekvensene som hver nøkkel skal sende ut. Disse verdiene er beregnet ut fra de faktiske notatfrekvensene, og ærlig talt glemte jeg hvordan jeg fikk dem, men de er de riktige verdiene da jeg testet dem på et oscilloskop for å være sikker. Vi definerer også notatmatrisen som inneholder alle tastene som skal trykkes for hver tone, samt variablene vi trenger for våre senere funksjoner.

Trinn 3: Funksjonen "serial.begin"

De
De

Vi kaller vår tilpassede funksjon som replikerer funksjonen "serial.begin" for U0init (). Den tar ønsket baudrate som inngang og starter den serielle porten på baudrate.

Trinn 4: Funksjonen "serial.available"

De
De

Vi kaller funksjonen som etterligner "serial.available" U0kbhit (). Det tar ikke input, men oppdager i stedet om det er gjort en endring på tastaturet ved hjelp av RDA -statusbiten og returnerer true når en endring oppdages.

Trinn 5: Funksjonen "serial.read"

De
De

Vi kaller funksjonen som etterligner "serial.read" -funksjonen U0getchar (), som ikke tar noen input og sender ut hvilken endring som er gjort på tastaturet, som er lagret i UDR0 -registeret.

Trinn 6: Funksjonen "serial.write"

De
De

Vi kaller funksjonen som etterligner "serial.write" U0putchar (), som tar dataene fra UDR0 -registeret mens en endring oppdages og lagres, og utganger som endres tilbake til den serielle skjermen.

Trinn 7: Oppsettfunksjonen

Oppsettfunksjonen
Oppsettfunksjonen

Dette er den grunnleggende oppsettfunksjonen som vil bruke vår "serial.begin" -imitasjon for å initialisere serieporten, og vil initialisere bitinnstillingene våre for timeregistrene og sette PB6 til å sende ut tonene våre.

Trinn 8: Loop- og ISR -funksjonene

Loop- og ISR -funksjonene
Loop- og ISR -funksjonene

Sløyfen fungerer slik: Hvis det oppdages en endring med vår "serial.available" -funksjon, lagrer vår "serial.read" -funksjon den endringen, og vår "serial.write" -funksjon setter den endringen i seriell monitor. Så lenge en variabel i er mindre enn størrelsen på frekvensmatrisen, vil den sette utgangen til å være posisjonen til i i den matrisen, og sende frekvensen på den posisjonen. ISR fungerer som tilbakestilling, der hvis frekvensmatriseposisjonen ikke er lik 0 (med andre ord hvis "q" ikke trykkes), vil den sende ut frekvensen, men når "q" trykkes vil den nullstilles. Vær oppmerksom på: denne koden bruker avbrudd, men det kan gjøres med avbrudd deaktivert. Jeg legger ut koden uten avbrudd hvis jeg får noen forespørsler om den, jeg synes bare avbruddsversjonen er morsommere.

Trinn 9: Kabling

Kabling
Kabling

Kablingene for denne koden er ekstremt enkle, bare sett en utgangskabel fra PB6 til et brødbrett, koble en summer eller høyttaler i serie med det, og koble den tilbake til bakken. Merk: Hvis du bruker en høyttaler, må du sette en liten motstand foran høyttaleren. Hvis du bare vil se utgangen, men ikke høre den, bare koble PB6 til den røde ledningen til et oscilloskop og den svarte ledningen til bakken.

Trinn 10: Sett alt sammen

Jeg la til hele koden til dette trinnet, siden jeg har forklart alle delene av den i tidligere trinn. Det tar bare et tastaturinngang for forskjellige frekvenser og sender ut denne frekvensen til PB6. Håper du likte å lese en annen måte å kode med IDE!

Vennligst også stem på dette i Microcontroller -konkurransen: D

Anbefalt: