Taula de continguts:

Generador de tons Arduino sense biblioteca ni funcions de sèrie (amb interrupcions): 10 passos
Generador de tons Arduino sense biblioteca ni funcions de sèrie (amb interrupcions): 10 passos

Vídeo: Generador de tons Arduino sense biblioteca ni funcions de sèrie (amb interrupcions): 10 passos

Vídeo: Generador de tons Arduino sense biblioteca ni funcions de sèrie (amb interrupcions): 10 passos
Vídeo: Thorium: An energy solution - THORIUM REMIX 2011 2024, De novembre
Anonim
Generador de tons Arduino sense biblioteca ni funcions de sèrie (amb interrupcions)
Generador de tons Arduino sense biblioteca ni funcions de sèrie (amb interrupcions)

Normalment, això no és una cosa que faci que sigui instructible, prefereixo la meva fusteria metàl·lica, però com que sóc estudiant d’enginyeria elèctrica i he de fer una classe sobre microcontroladors (Disseny de sistemes incrustats), vaig pensar que en faria un dels meus projectes. Quan originalment vaig fer el projecte i altres per a aquesta classe, vaig trobar que hi havia molt pocs o cap tutorial que no utilitzen les funcions de la biblioteca arduino ni les funcions en sèrie, que és un altre motiu pel qual vaig pensar que seria una bona instrucció.

Aquest codi està dissenyat per al microcontrolador Atmega 2560, de manera que si voleu implementar-lo en una altra placa haureu de canviar els registres d’adreces del codi en funció del manual d’usuari dels controladors. La idea bàsica darrere del codi és que cada vegada que introduïu una tecla al teclat al monitor sèrie, el mega arduino emetrà una freqüència determinada en funció de la tecla que premeu, i es restablirà "q". Ho he fet de manera que "a" emetrà la freqüència A plana i "A" emetrà la freqüència nítida A, "b" emetrà Si bemoll, "c" per a si bemoll, "C" per a nítid, etc. El codi complet es penja al final, però cada pas el desglossarà en trossos, de manera que és més fàcil d’explicar.

Pas 1: definició d'adreces de registre

Definició d'adreces de registre
Definició d'adreces de registre

Aquest pas és fàcil, si utilitzeu l'atmega 2560, només heu d'utilitzar les adreces que he fet servir, tot i que si feu servir una placa amb un xip diferent, haureu de trobar les adreces de cadascun d'aquests registres al vostre manual d’usuari de xips. Les definicions de la part superior són només constants que s’utilitzaran per a les nostres funcions més endavant. Especifiquem les adreces com a volàtils sense signar perquè no volem que el compilador s'emboliqui amb elles.

Pas 2: matrius i variables globals

Matrius i variables globals
Matrius i variables globals
Matrius i variables globals
Matrius i variables globals
Matrius i variables globals
Matrius i variables globals

Aquí volem definir la matriu de freqüència que contindrà totes les freqüències que hauria de generar cada tecla. Aquests valors es calculen a partir de les freqüències de notes reals i, sincerament, he oblidat com els he obtingut, però són els valors adequats en provar-los en un oscil·loscopi per assegurar-me. També estem definint la matriu de notes que conté totes les tecles que cal prémer per a cada to, així com les variables que necessitarem per a les nostres funcions posteriors.

Pas 3: la funció "serial.begin"

El
El

Anomenarem la nostra funció personalitzada que replica la funció "serial.begin" U0init (). Pren la velocitat de transmissió desitjada com a entrada i inicia el port sèrie a aquesta velocitat de transmissió.

Pas 4: la funció "serial.available"

El
El

Anomenarem la funció que imita "serial.available" U0kbhit (). No pren entrada, sinó que detecta si es fa un canvi al teclat mitjançant el bit d’estat RDA i torna cert quan es detecta un canvi.

Pas 5: la funció "serial.read"

El
El

Anomenarem a la funció que imita la funció "serial.read" U0getchar (), que no pren cap entrada i no dóna sortida al canvi que es faci al teclat, que s'emmagatzema al registre UDR0.

Pas 6: la funció "serial.write"

El
El

Anomenarem la funció que imita "serial.write" U0putchar (), que pren les dades del registre UDR0 mentre es detecta i emmagatzema un canvi, i les sortides que tornen al monitor sèrie.

Pas 7: la funció de configuració

La funció de configuració
La funció de configuració

Aquesta és la funció bàsica de configuració que utilitzarà la nostra imitació "serial.begin" per inicialitzar el port sèrie, i inicialitzarà la nostra configuració de bits per als registres del temporitzador i configurarà PB6 perquè emeti els nostres tons.

Pas 8: les funcions de bucle i ISR

Les funcions de bucle i ISR
Les funcions de bucle i ISR

El bucle funciona així: si es detecta un canvi amb la nostra funció "serial.available", la nostra funció "serial.read" emmagatzema aquest canvi i la nostra funció "serial.write" posa aquest canvi al monitor sèrie. Sempre que una variable i sigui inferior a la mida de la matriu de freqüències, configurarà la sortida com la posició de i en aquesta matriu, donant la freqüència en aquesta posició. L'ISR funciona com a restabliment, on si la posició de la matriu de freqüència no és igual a 0 (en altres paraules, si no es prem "q"), emetrà la freqüència, però quan es prem "q" es restablirà. Tingueu en compte que: aquest codi utilitza interrupcions, però es pot fer amb interrupcions desactivades. Publicaré el codi sense interrupcions si en tinc cap sol·licitud, només crec que la versió de la interrupció és més divertida.

Pas 9: cablejat

Cablejat
Cablejat

El cablejat d’aquest codi és extremadament senzill, simplement poseu un cable de sortida de PB6 a una placa de connexió, connecteu un timbre o un altaveu en sèrie amb això i torneu-lo a connectar a terra. Nota: si utilitzeu un altaveu, poseu-hi una resistència petita abans de l’altaveu. Si només voleu veure la sortida però no escoltar-la, connecteu PB6 al cable vermell d’un oscil·loscopi i el cable negre a terra.

Pas 10: ajuntar-ho tot

He afegit el codi complet a aquest pas, ja que he explicat totes les parts en passos anteriors. Només cal una entrada de teclat per a diferents freqüències i sortides que la freqüència a PB6. Espero que us hagi agradat llegir una forma diferent de codificar amb l'IDE.

A més, si us plau, voteu-ho al concurs de microcontroladors: D

Recomanat: