Innehållsförteckning:
- Steg 1: Definiera registeradresser
- Steg 2: Arrays och globala variabler
- Steg 3: Funktionen "serial.begin"
- Steg 4: Funktionen "serial.available"
- Steg 5: Funktionen "serial.read"
- Steg 6: Funktionen "serial.write"
- Steg 7: Inställningsfunktionen
- Steg 8: Loop- och ISR -funktionerna
- Steg 9: Kabeldragning
- Steg 10: Sätt ihop allt
Video: Arduino tongenerator utan bibliotek eller seriella funktioner (med avbrott): 10 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:46
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
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
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"
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"
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"
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"
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
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
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
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:
DIY handkontaktdispenser utan kontakt utan en Arduino eller en mikrokontroller: 17 steg (med bilder)
DIY handkontaktdispenser utan kontakt utan en Arduino eller en mikrokontroller: Som vi alla vet drabbade COVID-19-utbrottet världen och förändrade vår livsstil. I detta tillstånd är alkohol och handdesinfektionsmedel viktiga vätskor, men de måste användas på rätt sätt. Vidrör alkoholbehållare eller handdesinfektionsmedel med infekterade händer
Programmera en Arduino med en annan Arduino för att visa en rullande text utan bibliotek: 5 steg
Programmera en Arduino Använda en annan Arduino för att visa en rullande text utan bibliotek: Sony Spresense eller Arduino Uno är inte så dyra och kräver inte mycket ström. Men om ditt projekt har begränsning av kraft, utrymme eller till och med budget kan du överväga att använda Arduino Pro Mini. Till skillnad från Arduino Pro Micro, Arduino Pro Mi
RC5 fjärrkontrolls avkodare utan bibliotek: 4 steg
RC5 Remote Control Protocol Decoder Without Library: innan vi avkodar rc5 diskuterar vi först vad som är rc5 -kommando och vad det är för struktur. så i princip rc5 -kommando som används i fjärrkontroller som används i tv -apparater, cd -spelare, d2h, hemmabiosystem etc. har 13 eller 14 bitar arrangerade i en
Kör utan skärm / skärm (utan huvud) på Raspberry Pi eller andra Linux / unix -baserade datorer: 6 steg
Kör utan skärm / skärm (utan huvud) på Raspberry Pi eller andra Linux / unix -baserade datorer: När de flesta köper en Raspberry PI tror de att de behöver en datorskärm. Slösa inte dina pengar på onödiga datorskärmar och tangentbord. Slösa inte din tid på att flytta tangentbord och bildskärmar mellan datorer. Bind inte upp en TV när det är nej
Navigera robot med skosensorer, utan GPS, utan karta: 13 steg (med bilder)
Navigera robot med skosensorer, W/o GPS, W/o karta: Roboten rör sig i en förprogrammerad väg och överför (över bluetooth) sin faktiska rörelseinformation till en telefon för spårning i realtid. Arduino är förprogrammerad med sökväg och oblu används för att känna av robotens rörelse. oblu överför rörelse till