Innehållsförteckning:

Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott): 10 steg
Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott): 10 steg

Video: Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott): 10 steg

Video: Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott): 10 steg
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, November
Anonim
Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott)
Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott)

Detta är inte något jag normalt skulle göra instruktioner om, jag föredrar mitt metallarbete, men eftersom jag är elingenjör och måste gå en lektion om mikrokontroller (Embedded Systems Design) tänkte jag göra en instruktion om ett av mina projekt. När jag ursprungligen gjorde projektet och andra för den här klassen upptäckte jag att det finns väldigt få eller inga självstudier som inte använder arduino -biblioteksfunktionerna eller seriefunktionerna, vilket är en annan anledning till att jag trodde att det här skulle vara en bra instruerbarhet.

Denna kod är utformad för Atmega 2560 mikrokontroller, så om du vill implementera den på ett annat kort måste du ändra adressregistren i koden baserat på din handbok för kontrollerna. Grundtanken bakom koden är att när du anger en tangent på tangentbordet i den seriella bildskärmen kommer arduino mega att mata ut en viss frekvens baserat på vilken tangent du trycker på, med "q" återställer den. Jag gjorde det så att "a" kommer att mata ut A -frekvensen och "A" kommer att mata ut den A -skarpa frekvensen, "b" matar ut B -plattan, "c" för C -plattan, "C" för C -skarp osv. Hela koden laddas upp i slutet, men varje steg bryter ner koden i bitar så det är lättare att förklara.

Steg 1: Definiera registeradresser

Definiera registeradresser
Definiera registeradresser

Det här steget är enkelt, om du använder atmega 2560 behöver du bara använda de adresser jag använde, men om du använder ett kort med ett annat chip måste du hitta adresserna för vart och ett av dessa register på din chips användarhandbok. Definitionerna överst är bara konstanter som kommer att användas för våra funktioner senare. Vi anger adresserna som flyktiga osignerade eftersom vi inte vill att kompilatorn ska röra med dem.

Steg 2: Arrays och globala variabler

Arrays och globala variabler
Arrays och globala variabler
Arrays och globala variabler
Arrays och globala variabler
Arrays och globala variabler
Arrays och globala variabler

Här vill vi definiera frekvensmatrisen som innehåller alla frekvenser som varje nyckel ska mata ut. Dessa värden beräknas från de faktiska notfrekvenserna, och ärligt talat glömde jag hur jag fick dem, men de är de rätta värdena när jag testade dem på ett oscilloskop för att vara säker. Vi definierar också notmatrisen som innehåller alla tangenter att trycka på för varje ton, liksom de variabler vi behöver för våra senare funktioner.

Steg 3: Funktionen "serial.begin"

De
De

Vi kallar vår anpassade funktion som replikerar funktionen "serial.begin" U0init (). Den tar önskad baudrate som ingång och startar den seriella porten vid den baudrate.

Steg 4: Funktionen "serial.available"

De
De

Vi kallar funktionen som imiterar "serial.available" U0kbhit (). Det tar ingen inmatning utan upptäcker istället om det har gjorts en ändring på tangentbordet med hjälp av RDA -statusbiten och returnerar sant när en ändring upptäcks.

Steg 5: Funktionen "serial.read"

De
De

Vi kallar funktionen som imiterar funktionen "serial.read" för U0getchar (), som inte tar in och matar ut vilken ändring som helst som görs på tangentbordet, som lagras i UDR0 -registret.

Steg 6: Funktionen "serial.write"

De
De

Vi kallar funktionen som imiterar "serial.write" U0putchar (), som tar data från UDR0 -registret medan en ändring upptäcks och lagras, och utdata som ändras tillbaka till seriell bildskärm.

Steg 7: Inställningsfunktionen

Inställningsfunktionen
Inställningsfunktionen

Detta är den grundläggande installationsfunktionen som kommer att använda vår "serial.begin" -imitation för att initiera serieporten, och kommer att initiera våra bitinställningar för timerregistren och ställa in PB6 för att mata ut våra toner.

Steg 8: Loop- och ISR -funktionerna

Loop- och ISR -funktionerna
Loop- och ISR -funktionerna

Slingan fungerar som så: om en förändring upptäcks med vår "seriell.tillgänglig" -funktion, lagrar vår "seriell.läsnings" -funktion den ändringen, och vår "seriell.skrivning" -funktion lägger den ändringen i seriell bildskärm. Så länge som en variabel i är mindre än storleken på frekvensmatrisen, kommer den att ställa in utgången till positionen för i i den matrisen, och mata ut frekvensen vid den positionen. ISR fungerar som återställning, där om frekvensmatrispositionen inte är lika med 0 (med andra ord om "q" inte trycks in) kommer den att mata ut frekvensen, men när "q" trycks in kommer den att återställas. Observera: denna kod använder avbrott, men det kan göras med avbrott inaktiverade. Jag lägger upp koden utan avbrott om jag får några förfrågningar om den, jag tycker bara att avbrottsversionen är roligare.

Steg 9: Kabeldragning

Kabeldragning
Kabeldragning

Kablarna för den här koden är extremt enkla, helt enkelt sätta en utgångskabel från PB6 till en brödbräda, anslut en summer eller högtalare i serie med den och anslut den till marken igen. Obs! Om du använder en högtalare, sätt in ett litet motstånd före högtalaren. Om du bara vill se utgången men inte hör den, anslut bara PB6 till ett oscilloskopets röda kabel och den svarta ledningen till jord.

Steg 10: Sätt ihop allt

Jag lade till hela koden i detta steg, eftersom jag har förklarat alla delar av den i tidigare steg. Det tar bara en tangentbordsinmatning för olika frekvenser och matar ut den frekvensen till PB6. Hoppas du tyckte om att läsa ett annat sätt att koda med IDE!

Rösta också på detta i Microcontroller -tävlingen: D

Rekommenderad: