Inhoudsopgave:

Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen) - Ajarnpa
Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen) - Ajarnpa

Video: Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen) - Ajarnpa

Video: Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen) - Ajarnpa
Video: Waveform Generator using Arduino 2024, November
Anonim
Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen)
Arduino-toongenerator zonder bibliotheek- of seriële functies (met onderbrekingen)

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

Registeradressen definiëren
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

Arrays en globale variabelen
Arrays en globale variabelen
Arrays en globale variabelen
Arrays en globale variabelen
Arrays en globale variabelen
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"

De
De

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

De
De

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"

De
De

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"

De
De

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

De Setup-functie
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- en ISR-functies
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

Bedrading
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: