INHOUDSOPGAWE:

Arduino -toonopwekker sonder biblioteek of seriefunksies (met onderbrekings): 10 stappe
Arduino -toonopwekker sonder biblioteek of seriefunksies (met onderbrekings): 10 stappe

Video: Arduino -toonopwekker sonder biblioteek of seriefunksies (met onderbrekings): 10 stappe

Video: Arduino -toonopwekker sonder biblioteek of seriefunksies (met onderbrekings): 10 stappe
Video: Простейший радиомаяк на Si5351 и Arduino. Самодельный CW Beacon с синтезатором частоты. 2024, November
Anonim
Arduino -toonopwekker sonder biblioteek of seriefunksies (met onderbrekings)
Arduino -toonopwekker sonder biblioteek of seriefunksies (met onderbrekings)

Dit is nie iets waaroor ek normaalweg 'n instruksie kan gee nie, maar ek verkies my metaalwerk, maar aangesien ek 'n elektriese ingenieurstudent is en 'n klas oor mikrobeheerders (Embedded Systems Design) moet volg, het ek gedink ek sou 'n instruksie maak een van my projekte. Toe ek oorspronklik die projek en ander vir hierdie klas gemaak het, het ek gevind dat daar baie min of geen tutoriale is wat nie die arduino -biblioteekfunksies of reeksfunksies gebruik nie, en dit is nog 'n rede waarom ek gedink het dat dit 'n goeie instruksie sou wees.

Hierdie kode is ontwerp vir die Atmega 2560 -mikrobeheerder, dus as u dit op 'n ander bord wil implementeer, moet u die adresregisters in die kode verander volgens die gebruikershandleiding van u beheerders. Die basiese idee agter die kode is dat elke keer as u 'n sleutel op die sleutelbord in die seriële monitor invoer, die arduino mega 'n sekere frekwensie sal lewer, gebaseer op die toets wat u druk, met 'q'. Ek het dit so gemaak dat "a" die A -plat frekwensie sal uitvoer en "A" die A skerp frekwensie, "b" B flat, "c" vir C flat, "C" vir C skerp, ensovoorts. Die volledige kode word aan die einde opgelaai, maar elke stap verdeel die kode in stukke, sodat dit makliker is om te verduidelik.

Stap 1: Definieer registeradresse

Definieer registeradresse
Definieer registeradresse

Hierdie stap is maklik; as u die atmega 2560 gebruik, hoef u net die adresse te gebruik wat ek gebruik het, maar as u 'n bord met 'n ander chip gebruik, moet u die adresse vir elk van hierdie registers op u chips se gebruikershandleiding. Die definisies bo -aan is slegs konstantes wat later vir ons funksies gebruik sal word. Ons spesifiseer die adresse as onbestendig sonder teken, omdat ons nie wil hê dat die samesteller daarmee moet mors nie.

Stap 2: Skikkings en globale veranderlikes

Skikkings en globale veranderlikes
Skikkings en globale veranderlikes
Skikkings en globale veranderlikes
Skikkings en globale veranderlikes
Skikkings en globale veranderlikes
Skikkings en globale veranderlikes

Hier wil ons die frekwensie -skikking definieer wat al die frekwensies bevat wat elke sleutel moet uitvoer. Hierdie waardes word bereken uit die werklike nootfrekwensies, en ek het eerlikwaar vergeet hoe ek dit gekry het, maar dit is die regte waardes terwyl ek dit op 'n ossilloskoop getoets het om seker te maak. Ons definieer ook die note -reeks wat al die sleutels bevat om vir elke toon te druk, sowel as die veranderlikes wat ons benodig vir ons latere funksies.

Stap 3: Die funksie "serial.begin"

Die
Die

Ons noem ons persoonlike funksie wat die funksie "serial.begin" herhaal U0init (). Dit neem die gewenste baudrate as invoer en begin die seriële poort by die baudrate.

Stap 4: Die funksie "serial.available"

Die
Die

Ons noem die funksie wat 'seriële.beskikbaar' naboots, U0kbhit (). Dit neem nie insette nie, maar ontdek in plaas daarvan of daar 'n verandering op die sleutelbord aangebring is met behulp van die RDA -statusbit en word waar as 'n verandering opgespoor word.

Stap 5: Die funksie "serial.read"

Die
Die

Ons noem die funksie wat die funksie "serial.read" naboots, U0getchar (), wat geen invoer en uitsette neem nie, ongeag die verandering op die sleutelbord wat in die UDR0 -register gestoor word.

Stap 6: Die funksie "serial.write"

Die
Die

Ons noem die funksie wat 'serial.write' naboots U0putchar (), wat die data uit die UDR0 -register neem terwyl 'n verandering opgespoor en gestoor word, en uitsette wat na die seriële monitor terugkeer.

Stap 7: Die opstelfunksie

Die opstelfunksie
Die opstelfunksie

Dit is die basiese opstelfunksie wat ons 'serial.begin' nabootsing sal gebruik om die seriële poort te initialiseer, en ons bit -instellings vir die timerregisters sal initialiseer en PB6 sal instel om ons kleure uit te voer.

Stap 8: Die lus- en ISR -funksies

Die Loop- en ISR -funksies
Die Loop- en ISR -funksies

Die lus funksioneer so: as 'n verandering met ons funksie "serial.available" opgespoor word, stoor ons "serial.read" -funksie die verandering, en ons "serial.write" -funksie plaas die verandering in die seriële monitor. Solank 'n veranderlike i kleiner is as die grootte van die frekwensie -skikking, stel dit die uitset op die posisie van i in die skikking, en gee die frekwensie op daardie posisie uit. Die ISR funksioneer as die reset, waar as die frekwensie skikking posisie nie gelyk is aan 0 nie (met ander woorde as "q" nie ingedruk word nie), sal dit die frekwensie uitvoer, maar as "q" ingedruk word, sal dit herstel word. hierdie kode gebruik onderbrekings, maar dit kan gedoen word as onderbrekings gedeaktiveer is. Ek sal die kode sonder onderbrekings plaas as ek versoeke daarvoor kry, ek dink net die onderbrekingsweergawe is lekkerder.

Stap 9: Bedrading

Bedrading
Bedrading

Die bedrading vir hierdie kode is uiters maklik. Plaas eenvoudig 'n uitsetdraad van PB6 na 'n broodbord, koppel 'n gonser of luidspreker in serie daarmee en koppel dit weer aan die grond. Let wel: as u 'n luidspreker gebruik, plaas 'n klein weerstand voor die luidspreker. As u net die uitset wil sien, maar dit nie wil hoor nie, moet u slegs PB6 aan die rooi leiding van 'n ossilloskoop koppel en die swart aan die grond.

Stap 10: Alles saamvoeg

Ek het die volledige kode by hierdie stap gevoeg, aangesien ek al die dele daarvan in die vorige stappe verduidelik het. Dit neem net 'n sleutelbordinvoer vir verskillende frekwensies en voer die frekwensie uit na PB6. Hoop u het dit geniet om 'n ander manier te lees om met die IDE te kodeer!

Stem ook hiervoor in die Microcontroller -wedstryd: D

Aanbeveel: