Table of Contents

Caja de música utilizando un AY-3-8910

Introducción

A continuación se presenta el desarrollo y la explicación de un dispositivo reproductor de música programada haciendo uso de un PSG AY-3-8910, el cual se programa haciendo uso del STM32.

Nota histórica

Los generadores de sonido programables son dispositivos utilizados en computadores antiguos para reproducir música o diversos sonidos, este consigue esto mediante la generación de ondas sencillas para generar notas y de la combinación de diversas formas de onda (sierra, rampa, triangular) para los sonidos. El uso de estos se hizo muy popular en estos computadores ya que el procesamiento de los computadores era bastante más lento que el actual, y al tenerse un dispositivo dedicado a este fin, se reducía la carga requerida por el procesador para generar sonidos, ya que solo necesita programar el PSG cada vez que se quiera actualizar el sonido o notas actualmente reproducido. Ejemplos de estos son el AY-3-8910 (usado en diversas consolas de videojuegos, la ZX Spectrum y la Apple II) y el SN746489 (usado en arcades, la BBC Micro y la IBM PCjr, entre otros).

Desarrollo técnico

Para el desarrollo de la aplicación se tienen dos principales etapas, las cuales son: el proceso de comunicación y programación del AY-3-8910 y la etapa de amplificación de audio haciendo uso de un TDA2003.

Programación del AY-3-8910

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:

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 (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, se envía con este mismo método el byte inferior del valor a enviar (0xDE), continuando se envía la dirección del segundo registro del canal A (0x01) y se envía a este el byte superior del valor a enviar (0x01) con lo que se consigue programar la nota C4 en el canal A.

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

Al estar las canciones previamente programadas, el uso de este dispositivo es bastante simple, para su uso solo se debe seguir las siguientes instrucciones:

Referencias

Código del dispositivo