Indholdsfortegnelse:

Arduino -tonegenerator uden bibliotek eller serielle funktioner (med afbrydelser): 10 trin
Arduino -tonegenerator uden bibliotek eller serielle funktioner (med afbrydelser): 10 trin

Video: Arduino -tonegenerator uden bibliotek eller serielle funktioner (med afbrydelser): 10 trin

Video: Arduino -tonegenerator uden bibliotek eller serielle funktioner (med afbrydelser): 10 trin
Video: Arduino-kode VL53L1X Time-of-Flight 400cm Laserafstandssensor 2024, November
Anonim
Arduino Tone Generator Uden bibliotek eller serielle funktioner (med afbrydelser)
Arduino Tone Generator Uden bibliotek eller serielle funktioner (med afbrydelser)

Dette er ikke noget, jeg normalt ville lave en instruktion om, jeg foretrækker mit metalarbejde, men da jeg er el -ingeniørstuderende og skal tage en klasse om mikrokontrollere (Embedded Systems Design), tænkte jeg, at jeg ville lave en instruerbar om et af mine projekter. Da jeg oprindeligt lavede projektet og andre til denne klasse, fandt jeg ud af, at der er meget få eller ingen selvstudier, der ikke bruger arduino -bibliotekets funktioner eller serielle funktioner, hvilket er en anden grund til, at jeg troede, at dette ville være en god instruerbar.

Denne kode er designet til Atmega 2560 mikrokontroller, så hvis du vil implementere den på et andet bord, skal du ændre adresseregistrene i koden baseret på din controllers brugermanual. Den grundlæggende idé bag koden er, at når du indtaster en tast på tastaturet i den serielle skærm, vil arduino mega udsende en bestemt frekvens baseret på hvilken tast du trykker på, med "q" nulstiller den. Jeg gjorde det sådan, at "a" udsender A -fladfrekvensen, og "A" udsender A -skarp frekvens, "b" udsender B -flad, "c" for C -flad, "C" for C -skarp osv. Den fulde kode uploades i slutningen, men hvert trin vil opdele koden i stykker, så det er lettere at forklare.

Trin 1: Definition af registeradresser

Definere registeradresser
Definere registeradresser

Dette trin er let, hvis du bruger atmega 2560, skal du bare bruge de adresser, jeg brugte, selvom hvis du bruger et bræt med en anden chip, skal du finde adresserne til hvert af disse registre på din chips 'brugermanual. Definitionerne øverst er bare konstanter, der senere vil blive brugt til vores funktioner. Vi angiver adresserne som flygtige usignerede, fordi vi ikke ønsker, at kompilatoren skal rode med dem.

Trin 2: Arrays 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 frekvensmatrixet, som vil indeholde alle de frekvenser, som hver nøgle skal udsende. Disse værdier beregnes ud fra de faktiske notefrekvenser, og ærligt talt glemte jeg, hvordan jeg fik dem, men de er de rigtige værdier, da jeg testede dem på et oscilloskop for at sikre mig. Vi definerer også notearrayet, der indeholder alle de taster, der skal trykkes på for hver tone, samt de variabler, vi skal bruge til vores senere funktioner.

Trin 3: Funktionen "serial.begin"

Det
Det

Vi kalder vores brugerdefinerede funktion, der replikerer funktionen "serial.begin" U0init (). Den tager den ønskede baudrate som input og starter den serielle port ved denne baudrate.

Trin 4: Funktionen "serial.available"

Det
Det

Vi kalder den funktion, der efterligner "serial.available" U0kbhit (). Det tager ikke input, men registrerer i stedet, om der er foretaget en ændring på tastaturet ved hjælp af RDA -statusbit og returnerer sandt, når en ændring opdages.

Trin 5: Funktionen "serial.read"

Det
Det

Vi kalder den funktion, der efterligner "serial.read" -funktionen U0getchar (), som ikke tager input og udsender den ændring, der foretages på tastaturet, som er gemt i UDR0 -registret.

Trin 6: Funktionen "serial.write"

Det
Det

Vi kalder den funktion, der efterligner "serial.write" U0putchar (), som tager dataene fra UDR0 -registret, mens en ændring registreres og gemmes, og output, der ændres tilbage til den serielle skærm.

Trin 7: Opsætningsfunktionen

Opsætningsfunktionen
Opsætningsfunktionen

Dette er den grundlæggende opsætningsfunktion, der vil bruge vores "serial.begin" -imitation til at initialisere den serielle port og vil initialisere vores bitindstillinger for timeregistrene og indstille PB6 til at udsende vores toner.

Trin 8: Loop- og ISR -funktionerne

Loop- og ISR -funktionerne
Loop- og ISR -funktionerne

Sløjfen fungerer som sådan: Hvis der registreres en ændring med vores "seriel.tilgængelig" -funktion, gemmer vores "seriel. Læs" -funktion den ændring, og vores "seriel.skrive" -funktion sætter denne ændring i den serielle skærm. Så længe en variabel i er mindre end størrelsen på frekvensarrayet, vil den indstille outputtet til at være positionen for i i det array og udsende frekvensen på den position. ISR fungerer som nulstilling, hvor hvis frekvensmatrixpositionen ikke er 0 (med andre ord, hvis der ikke trykkes på "q"), udsender den frekvensen, men når der trykkes på "q", nulstilles den. Bemærk: denne kode bruger afbrydelser, men det kan gøres med afbrydelser deaktiveret. Jeg sender koden uden afbrydelser, hvis jeg får anmodninger om den, jeg synes bare, at afbrydelsesversionen er sjovere.

Trin 9: Ledningsføring

Ledninger
Ledninger

Kabelføringen til denne kode er ekstremt let. Du skal blot sætte en outputledning fra PB6 til et brødbræt, tilslutte en summer eller højttaler i serie med det, og slut den tilbage til jorden. Bemærk: Hvis du bruger en højttaler, skal du sætte en lille modstand i før højttaleren. Hvis du bare vil se output, men ikke høre det, skal du bare tilslutte PB6 til et oscilloskops røde ledning og det sorte kabel til jorden.

Trin 10: Sæt det hele sammen

Jeg tilføjede den fulde kode til dette trin, da jeg har forklaret alle delene af det i tidligere trin. Det tager bare et tastaturindgang til forskellige frekvenser og udsender denne frekvens til PB6. Håber du nød at læse en anden måde at kode med IDE på!

Stem også for dette i Microcontroller -konkurrencen: D

Anbefalede: