Obsah:

Generátor tónů Arduino bez knihovny nebo sériových funkcí (s přerušením): 10 kroků
Generátor tónů Arduino bez knihovny nebo sériových funkcí (s přerušením): 10 kroků

Video: Generátor tónů Arduino bez knihovny nebo sériových funkcí (s přerušením): 10 kroků

Video: Generátor tónů Arduino bez knihovny nebo sériových funkcí (s přerušením): 10 kroků
Video: Jak bastlit arduino? Aby se to nerozpadlo. 2024, Listopad
Anonim
Generátor tónů Arduino bez knihovny nebo sériových funkcí (s přerušením)
Generátor tónů Arduino bez knihovny nebo sériových funkcí (s přerušením)

Není to něco, o čem bych normálně dělal instruktáž, dávám přednost své kovoobrábění, ale jelikož jsem student elektrotechniky a musím absolvovat třídu mikrokontrolérů (Embedded Systems Design), řekl jsem si, že bych instruktáž vytvořil na jeden z mých projektů. Když jsem původně vytvořil projekt a další pro tuto třídu, zjistil jsem, že existuje velmi málo až žádné výukové programy, které nepoužívají funkce knihovny arduino nebo sériové funkce, což je další důvod, proč jsem si myslel, že by to byl dobrý návod.

Tento kód je určen pro mikrokontrolér Atmega 2560, takže pokud jej chcete implementovat na jinou desku, budete muset změnit registry adres v kódu na základě uživatelské příručky k ovladačům. Základní myšlenkou kódu je, že kdykoli zadáte klávesu na klávesnici do sériového monitoru, arduino mega vydá určitou frekvenci podle toho, jakou klávesu stisknete, s resetováním „q“. Udělal jsem to tak, že „a“bude vysílat plochou frekvenci A a „A“bude produkovat ostrou frekvenci A, „b“bude vydávat B plochý, „c“pro C plochý, „C“pro ostrý C a tak dále. Úplný kód je nahrán na konci, ale každý krok rozdělí kód na kousky, takže je snazší to vysvětlit.

Krok 1: Definování registračních adres

Definování registračních adres
Definování registračních adres

Tento krok je snadný, pokud používáte atmega 2560, stačí použít adresy, které jsem použil, ačkoli pokud používáte desku s jiným čipem, budete muset najít adresy pro každý z těchto registrů ve vašem uživatelská příručka čipů. Definice nahoře jsou jen konstanty, které budou později použity pro naše funkce. Adresy určujeme jako volatilní bez znaménka, protože nechceme, aby si s nimi kompilátor pohrával.

Krok 2: Pole a globální proměnné

Pole a globální proměnné
Pole a globální proměnné
Pole a globální proměnné
Pole a globální proměnné
Pole a globální proměnné
Pole a globální proměnné

Zde chceme definovat pole Frequency, které bude obsahovat všechny frekvence, které by měl každý klíč vydávat. Tyto hodnoty jsou vypočítány ze skutečných frekvencí not a upřímně jsem zapomněl, jak jsem je získal, ale jsou to správné hodnoty, protože jsem je pro jistotu testoval na osciloskopu. Rovněž definujeme pole not, které obsahuje všechny klávesy, které je třeba stisknout pro každý tón, a také proměnné, které budeme potřebovat pro naše pozdější funkce.

Krok 3: Funkce „serial.begin“

The
The

Vlastní funkci, která replikuje funkci „serial.begin“, zavoláme U0init (). Jako vstup vezme požadovanou přenosovou rychlost a spustí sériový port na této přenosové rychlosti.

Krok 4: Funkce „serial.available“

The
The

Funkci imitující „serial.available“nazveme U0kbhit (). Nepotřebuje vstup, ale místo toho detekuje, zda došlo ke změně na klávesnici pomocí stavového bitu RDA, a vrátí true, když je změna detekována.

Krok 5: Funkce „serial.read“

The
The

Funkci imitující funkci „serial.read“nazveme U0getchar (), která nebere žádný vstup a nevydává žádnou změnu provedenou na klávesnici, která je uložena v registru UDR0.

Krok 6: Funkce „serial.write“

The
The

Zavoláme funkci, která napodobuje „serial.write“U0putchar (), která bere data z registru UDR0, když je změna detekována a uložena, a výstupy, které se mění zpět na sériový monitor.

Krok 7: Funkce nastavení

Funkce nastavení
Funkce nastavení

Toto je základní funkce nastavení, která k inicializaci sériového portu použije naši imitaci „serial.begin“a inicializuje naše nastavení bitů pro registry časovačů a nastaví PB6 na výstup našich tónů.

Krok 8: Funkce Loop a ISR

Funkce Loop a ISR
Funkce Loop a ISR

Smyčka funguje takto: pokud je detekována změna s naší funkcí „serial.available“, naše funkce „serial.read“tuto změnu uloží a naše funkce „serial.write“tuto změnu umístí do sériového monitoru. Dokud je proměnná i menší než velikost frekvenčního pole, nastaví výstup na pozici i v tomto poli a vydá frekvenci v této poloze. ISR funguje jako reset, kde pokud se pozice frekvenčního pole nerovná 0 (jinými slovy, pokud není stisknuto „q“), vydá frekvenci, ale když se stiskne „q“, resetuje se. Poznámka: tento kód používá přerušení, ale lze to provést s vypnutými přerušeními. Pokud dostanu nějaké požadavky, kód zveřejním bez přerušení, jen si myslím, že verze přerušení je zábavnější.

Krok 9: Zapojení

Elektrické vedení
Elektrické vedení

Zapojení pro tento kód je velmi snadné, jednoduše připojte výstupní vodič z PB6 na prkénko, zapojte do série bzučák nebo reproduktor a připojte jej zpět k zemi. Poznámka: pokud používáte reproduktor, vložte před něj malý odpor. Pokud chcete výstup pouze vidět, ale neslyšet, připojte PB6 k červenému vodiči osciloskopu a černý vodič k zemi.

Krok 10: Dát to všechno dohromady

K tomuto kroku jsem přidal úplný kód, protože jsem v předchozích krocích vysvětlil všechny jeho části. Stačí jen vstup klávesnice pro různé frekvence a výstupy této frekvence do PB6. Doufám, že jste si užili čtení jiného způsobu kódování pomocí IDE!

Také pro to prosím hlasujte v soutěži o mikrořadič: D

Doporučuje: