Writing /var/lib/dokuwiki/data/meta/teaching/ie0624/proyectos/caja_de_musica.meta failed
teaching:ie0624:proyectos:caja_de_musica
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:ie0624:proyectos:caja_de_musica [2018/12/17 00:52] – micros | teaching:ie0624:proyectos:caja_de_musica [2022/09/20 00:08] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 18: | Line 18: | ||
El funcionamiento de AY-3-8910 consiste en la decrementación del valor guardado en un registro, y se activar (o desactivar) la señal de audio cuando este registro llega a cero, con lo que se consigue generar una señal cuadrada a frecuencias pre-establecidas y dependientes de la señal de reloj que se usa en el PSG (en nuestro caso, se usa una señal de 2MHz generada con los timers del STM32). Para programar este registro se hace uso de tres pines con los que se establece la comunicación con el PSG, los cuales son llamados BC1, BDIR y LATCH (se tiene un cuarto pin de BCD2, sin embargo, este se mantiene conectado a Vcc), y otros ocho con los que se envían los datos en paralelo. A continuación se indican cuales pines del STM32 se usarán, y a qué función se destinarán: | El funcionamiento de AY-3-8910 consiste en la decrementación del valor guardado en un registro, y se activar (o desactivar) la señal de audio cuando este registro llega a cero, con lo que se consigue generar una señal cuadrada a frecuencias pre-establecidas y dependientes de la señal de reloj que se usa en el PSG (en nuestro caso, se usa una señal de 2MHz generada con los timers del STM32). Para programar este registro se hace uso de tres pines con los que se establece la comunicación con el PSG, los cuales son llamados BC1, BDIR y LATCH (se tiene un cuarto pin de BCD2, sin embargo, este se mantiene conectado a Vcc), y otros ocho con los que se envían los datos en paralelo. A continuación se indican cuales pines del STM32 se usarán, y a qué función se destinarán: | ||
- | * DATAPIN0-DATAPIN7: | + | * DATAPIN0-DATAPIN7: |
- | * LATCHPIN: | + | * LATCHPIN: |
- | | + | |
- | | + | |
- | * CLOCKPIN: | + | * CLOCKPIN: |
Ahora, para la programación del PSG, primero debe enviarse la dirección del registro que se quiere programar, los valores a programarse en los registros son de hasta 12 bits, por lo que se requiere guardar el byte inferior en un registro y el byte superior en otro, lo que significa que por cada nota a programarse debe hacerse dos llamados al chip. | Ahora, para la programación del PSG, primero debe enviarse la dirección del registro que se quiere programar, los valores a programarse en los registros son de hasta 12 bits, por lo que se requiere guardar el byte inferior en un registro y el byte superior en otro, lo que significa que por cada nota a programarse debe hacerse dos llamados al chip. | ||
- | Para establecer guardar un solo registro, se comienza por establecer el PSG en modo inactivo (se apaga BDIR y BC1) con lo que se pone todas las entradas de datos en modo de alta impedancia, posteriomente se apaga el pin de latch, indicando que se va a iniciar una nueva transmisión de datos, una vez hecho esto, se envía la dirección del registro donde se quiera programar el valor ($00 y $01 para el valor del canal A y $02 y $03 para el del canal B), hecho esto, se activa la señal de latch y se pone el PSG en modo latch (BDIR encendido y BC1 apagado) para terminar de escribir el valor, posteriormente se establece el modo inactivo para acabar la transmisión de la dirección, con lo que se completó la primera comunicación con el PSG, después se repite el mismo proceso, pero esta vez se envía el valor que se quiere programar en el registro en los pines de datos. | + | Para establecer guardar un solo registro, se comienza por establecer el PSG en modo inactivo (se apaga BDIR y BC1) con lo que se pone todas las entradas de datos en modo de alta impedancia, posteriomente se apaga el pin de latch, indicando que se va a iniciar una nueva transmisión de datos, una vez hecho esto, se envía la dirección del registro donde se quiera programar el valor (0x00 y 0x01 para el valor del canal A y 0x02 y 0x03 para el del canal B), hecho esto, se activa la señal de latch y se pone el PSG en modo latch (BDIR encendido y BC1 apagado) para terminar de escribir el valor, posteriormente se establece el modo inactivo para acabar la transmisión de la dirección, con lo que se completó la primera comunicación con el PSG, después se repite el mismo proceso, pero esta vez se envía el valor que se quiere programar en el registro en los pines de datos. |
Por ejemplo, para programar un valor 478 (=0x1DE) en el canal A, primero se envía (por el método de comunicación antes explicado) la dirección del primer registro (0x00), posteriormente, | Por ejemplo, para programar un valor 478 (=0x1DE) en el canal A, primero se envía (por el método de comunicación antes explicado) la dirección del primer registro (0x00), posteriormente, | ||
- | En el código usado, tenemos una función que establece la comunicación para el envío de la dirección y los datos, la cual se llama write_data y recibe la dirección y el dato a enviar, esta se usa en las funciones set_chA y set_chB, las cuales hacen los dos llamados necesarios a write_data con las direcciones de registro respectivas | + | En el código usado, tenemos una función que establece la comunicación para el envío de la dirección y los datos, la cual se llama write_data y recibe la dirección y el dato a enviar, esta se usa en las funciones set_chA y set_chB, las cuales hacen los dos llamados necesarios a write_data con las direcciones de registro respectivas. |
+ | Para la reproducción de canciones se tienen piezas previamente programadas en arrays de dimensiones ix3, donde la primera columna establece el número MIDI de la nota del canal A y la segunda columna establece el del canal B, es importante destacar que este valor no es el que se programa en el AY-3-8910, sino el número de la nota que se usa para llamar otro array que contiene los valores respectivos de cada nota a programar en el PSG. Y la última columna establece la cantidad de tiempo que se tendrán estas dos notas activas. | ||
+ | |||
+ | Por ultimo, se tiene un for que avanza por el array de la canción, llamando a las funciones set_chA y set_chB de manera recursiva y estableciendo las notas respectivas de array, y un llamado a la función array con el respectivo valor del array, con lo que se quiere tener la nota sin cambios por esa cantidad de tiempo. | ||
+ | |||
+ | ====Amplificación de sonido==== | ||
+ | |||
+ | Para la señal de sonido se tienen dos pines en el AY-3-8910 en los cuales se obtienen las señales analógicas de audio generadas, estas se conectan la una a la otra, y este nodo se conecta a tierra con una resistencia de 100 kOhm, y a la entrada de la etapa de amplificación con una resistencia de 10 kOhm y un capacitor de 100 uF. | ||
+ | |||
+ | Con la señal resultante de esto, implementamos la siguiente etapa de amplificación: | ||
+ | |||
+ | Este circuito implementa el TDA2003 para amplificar la señal de audio, para después ser usada en una bocina de 8 Ohm y 6 Watt. | ||
=====Instrucciones de uso===== | =====Instrucciones de uso===== | ||
+ | |||
+ | Al estar las canciones previamente programadas, | ||
+ | |||
+ | *Activar el dip-switch #1 (Con esto se activa el STM32 y el AY-3-8910). | ||
+ | *Activar el dip-switch #2 (Se activa el TDA2003 y toda la etapa de audio). | ||
+ | *Ajustar el volumen de audio con el potenciometro. | ||
=====Referencias===== | =====Referencias===== | ||
+ | |||
+ | *www.vgmpf.com/ | ||
+ | *http:// | ||
+ | *https:// | ||
+ | *https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
=====Código del dispositivo===== | =====Código del dispositivo===== |
teaching/ie0624/proyectos/caja_de_musica.1545007979.txt.gz · Last modified: 2022/09/20 00:08 (external edit)