Inhoudsopgave:
- Stap 1: Registeradressen definiëren
- Stap 2: Arrays en globale variabelen
- Stap 3: De functie "serial.begin"
- Stap 4: De "serial.available" functie
- Stap 5: De functie "serial.read"
- Stap 6: De functie "serial.write"
- Stap 7: De Setup-functie
- Stap 8: De lus- en ISR-functies
- Stap 9: Bedrading
- Stap 10: Alles bij elkaar
Video: Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen) - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
Dit is niet iets waar ik normaal gesproken een instructable van zou maken, ik geef de voorkeur aan mijn metaalbewerking, maar omdat ik een student elektrotechniek ben en een les over microcontrollers (Embedded Systems Design) moet volgen, dacht ik dat ik een instructable zou maken op een van mijn projecten. Toen ik oorspronkelijk het project en andere voor deze klas maakte, ontdekte ik dat er heel weinig tot geen tutorials zijn die geen gebruik maken van de arduino-bibliotheekfuncties of seriële functies, wat nog een reden is waarom ik dacht dat dit een goede instructable zou zijn.
Deze code is ontworpen voor de Atmega 2560-microcontroller, dus als u deze op een ander bord wilt implementeren, moet u de adresregisters in de code wijzigen op basis van de gebruikershandleiding van uw controller. Het basisidee achter de code is dat wanneer je een toets op het toetsenbord in de seriële monitor invoert, de arduino mega een bepaalde frequentie zal uitvoeren op basis van welke toets je indrukt, met "q" om deze te resetten. Ik heb het zo gemaakt dat "a" de A-frequentie zal uitvoeren en "A" de A-scherpe frequentie zal uitvoeren, "b" Bes zal uitvoeren, "c" voor Bes, "C" voor C-scherp, enzovoort. De volledige code wordt aan het einde geüpload, maar elke stap zal de code in stukjes opsplitsen, zodat het gemakkelijker uit te leggen is.
Stap 1: Registeradressen definiëren
Deze stap is eenvoudig, als je de atmega 2560 gebruikt, hoef je alleen de adressen te gebruiken die ik heb gebruikt, maar als je een bord met een andere chip gebruikt, moet je de adressen voor elk van deze registers op je gebruikershandleiding van chips. De definities bovenaan zijn slechts constanten die later voor onze functies zullen worden gebruikt. We specificeren de adressen als vluchtig niet-ondertekend omdat we niet willen dat de compiler ermee knoeit.
Stap 2: Arrays en globale variabelen
Hier willen we de frequentiereeks definiëren die alle frequenties zal bevatten die elke toets zou moeten uitvoeren. Deze waarden worden berekend op basis van de werkelijke nootfrequenties, en eerlijk gezegd ben ik vergeten hoe ik ze heb gekregen, maar het zijn de juiste waarden omdat ik ze op een oscilloscoop heb getest om er zeker van te zijn. We definiëren ook de notenreeks die alle toetsen bevat die voor elke toon moeten worden ingedrukt, evenals de variabelen die we nodig hebben voor onze latere functies.
Stap 3: De functie "serial.begin"
We noemen onze aangepaste functie die de functie "serial.begin" repliceert U0init(). Het neemt de gewenste baudrate als invoer en start de seriële poort op die baudrate.
Stap 4: De "serial.available" functie
We noemen de functie die "serial.available" imiteert U0kbhit(). Het vereist geen invoer, maar detecteert in plaats daarvan of er een wijziging is aangebracht op het toetsenbord met behulp van de RDA-statusbit en retourneert waar wanneer een wijziging wordt gedetecteerd.
Stap 5: De functie "serial.read"
We noemen de functie die de functie "serial.read" imiteert U0getchar(), die geen invoer en uitvoer vereist, ongeacht de wijziging die op het toetsenbord wordt aangebracht, dat is opgeslagen in het UDR0-register.
Stap 6: De functie "serial.write"
We noemen de functie die "serial.write" imiteert U0putchar(), die de gegevens uit het UDR0-register haalt terwijl een wijziging wordt gedetecteerd en opgeslagen, en die de wijziging teruggeeft naar de seriële monitor.
Stap 7: De Setup-functie
Dit is de basisinstellingsfunctie die onze "serial.begin"-imitatie zal gebruiken om de seriële poort te initialiseren, en onze bitinstellingen voor de timerregisters zal initialiseren en PB6 zal instellen om onze tonen uit te voeren.
Stap 8: De lus- en ISR-functies
De lus werkt als volgt: als een wijziging wordt gedetecteerd met onze "serial.available"-functie, slaat onze "serial.read"-functie die wijziging op, en onze "serial.write"-functie zet die wijziging in de seriële monitor. Zolang een variabele i kleiner is dan de grootte van de frequentiereeks, zal deze de uitvoer instellen op de positie van i in die reeks, waarbij de frequentie op die positie wordt uitgevoerd. De ISR functioneert als de reset, waarbij als de positie van de frequentiearray niet gelijk is aan 0 (met andere woorden als "q" niet wordt ingedrukt), het de frequentie zal uitvoeren, maar wanneer "q" wordt ingedrukt, wordt deze gereset. Let op: deze code maakt gebruik van interrupts, maar het kan worden gedaan met interrupts uitgeschakeld. Ik zal de code zonder onderbrekingen posten als ik er verzoeken voor krijg, ik denk dat de onderbrekingsversie leuker is.
Stap 9: Bedrading
De bedrading voor deze code is uiterst eenvoudig, plaats gewoon een uitgangsdraad van PB6 naar een breadboard, sluit een zoemer of luidspreker in serie daarmee aan en sluit deze weer aan op aarde. Let op: als je een speaker gebruikt, plaats dan een kleine weerstand voor de speaker. Als u alleen de uitvoer wilt zien maar niet wilt horen, sluit u PB6 gewoon aan op de rode draad van een oscilloscoop en de zwarte draad op aarde.
Stap 10: Alles bij elkaar
Ik heb de volledige code aan deze stap toegevoegd, omdat ik alle onderdelen ervan in eerdere stappen heb uitgelegd. Er is slechts een toetsenbordinvoer nodig voor verschillende frequenties en voert die frequentie uit naar PB6. Ik hoop dat je het leuk vond om een andere manier van coderen met de IDE te lezen!
Stem hier ook op in de Microcontroller-wedstrijd:D
Aanbevolen:
Arduino tekst-naar-spraak-converter met LM386 - Pratend Arduino-project - Talkie Arduino-bibliotheek: 5 stappen
Arduino tekst-naar-spraak-converter met LM386 | Pratend Arduino-project | Talkie Arduino-bibliotheek: Hallo allemaal, in veel projecten hebben we arduino nodig om zoiets als een pratende klok te spreken of wat gegevens te vertellen, dus in deze instructables zullen we tekst omzetten in spraak met behulp van Arduino
Arduino UNO (menu's en functies maken): 4 stappen
Arduino UNO (menu's en functies maken): in deze instructable zullen we onderzoeken hoe we menu's kunnen maken, de temperatuur van een TC74A0-sensor kunnen lezen en "waarden" kunnen weergeven (in dit geval mobiele telefoonnummers) op een manier die oneindig is, maar beperkt tot het geheugen van de arduino aan boord. We zullen
Arduino minder bekende functies: 9 stappen
Arduino minder bekende functies: dit is meer een lijst van niet zo vaak genoemde functies van Arduino-platforms die doorgaans worden gebruikt (bijv. Uno, Nano). Deze vermelding moet als referentie dienen wanneer u die functies moet opzoeken en het woord moet verspreiden. Bekijk de code om te zien
Een Instructable Robot Met Veel Functies: 8 Stappen (met Afbeeldingen)
Een Instructable Robot Met Veel Functies: Hallo vrienden, in deze instructable ga ik een fantastische robot introduceren die de volgende taken kan uitvoeren:- Het kan bewegen en de besturing van zijn bewegingen wordt gedaan door Bluetooth2- Het kan schoonmaken als een stofzuiger3- Het kan nummers van Bluetoot afspelen
"Wise Clock 2" (Arduino-gebaseerde wekker met veel extra functies) in elkaar zetten: 6 stappen
"Wise Clock 2" monteren (Arduino-gebaseerde wekker met veel extra functies): Deze tutorial laat zien hoe je de kit voor Wise Clock 2, een open source (hardware en software) project, in elkaar zet. Een complete Wise Clock 2-kit kan hier worden gekocht. Samenvattend, dit is wat Wise Clock 2 kan doen (met de huidige open source software