Estoy trabajando en un proyecto que utiliza el circuito integrado Texas Instruments SN76489, que se usó para crear sonido en juegos de arcade y juegos de Sega de los años 80 y 90, creo. Hice un proyecto similar con el Yamaha YM2612m, que es el chip de sonido principal de Sega Genesis, y tengo ese proyecto completamente en funcionamiento y puedo reproducir sonidos clásicos de Sega en un teclado midi, hasta 6 notas a la vez. Probablemente no sea un gran problema para ustedes, pero es el proyecto más grande que he hecho hasta ahora.
Ahora estoy trabajando con el SN76489 y tengo algunos problemas. La forma en que funciona es que tiene 8 registros internos de 8 bits, y estos se controlan a través de un bus de 8 bits de pines de datos en el IC. Para escribir datos en estos registros, los datos se escriben en los pines del IC (d0 a d7) y un pin de habilitación de escritura separado que está activo bajo (/ wr) se dispara de un nivel lógico alto a uno bajo lógico, y esto bloquea los datos del bus de datos en el chip. Solo repasando las cosas para el registro.
Este es el problema que tengo: no puedo cargar de manera confiable los datos en el chip a propósito. Para probarlo, escribí un programa que escribe valores aleatorios en los pines de datos, y luego parpadea ese / WR pin bajo para escribir los datos en el chip. Lo hace aproximadamente 10 veces por segundo, con el resultado esperado de que el chip generaría tonos aleatorios y sonidos de ruido. Y esta parte funciona absolutamente como se esperaba, así que sé que mi función de escritura funciona, al menos en esta aplicación.
Sin embargo, digamos, por ejemplo, quiero desactivar el canal 0. Esto se hace enviando el byte 0b10011111) que envía el valor "1111" al registro de atenuación del canal 0. Si ejecuto el código que hace esto, y luego ejecute el comando de escritura, no hará lo que yo espero que haga. El 80% de las veces no hace nada, y tal vez el otro 20% de las veces cambia algo inesperado como la frecuencia (tono) de uno de los otros canales. Pude hacer que estos comandos funcionaran correctamente brevemente, pero para hacer esto, tuve que hacer un bucle de ese algoritmo de comandos de escritura unas 20 veces para que funcionara cada vez. ¿Alguien sabe por qué esto podría ser?
Estoy muy confundido acerca de varias partes de este proyecto porque parece que debería ser bastante simple, así que quizás sea un idiota. Estoy usando una señal de reloj de 500 kHz (medida a 488 kHz) porque estoy usando el SN76489N en lugar del SN76489AN. Miré la señal de mi reloj y se ve muy limpia, y siento que mi error está en algún lugar en la ejecución de mi código, ya que parece funcionar en el nivel de hardware.
Una última cosa sobre la que estoy confundido es el pin READY (pin 5.) Se supone que este pin va a alto cuando el chip está listo para recibir su siguiente comando (es decir, ha terminado de ejecutar su última instrucción). Sin embargo, esto Nunca parece ser el caso, ya que coloco un LED en este pin y parece que permanece bajo todo el tiempo, a menos que la corriente de este pin no sea suficiente para alimentar un LED. Debería mirar esto bajo el alcance. Por ahora, tengo una resistencia de 1.5 k pulling que tira del pin al suelo y vi a alguien explicando en algún foro (tal vez este en realidad) que este es un pin de colector abierto que está conectado internamente con una resistencia de 2.2kΩ. Solo sé que los comandos de escritura funcionarán el 0% del tiempo si este pin no se tira hacia abajo con la resistencia, pero no tengo idea de por qué. Pido disculpas si les parezco muy incapaces, sé que hay algunos ingenieros muy inteligentes en este foro.
Entonces, cualquiera que haya trabajado con este chip o uno similar, agradecería mucho su orientación, aunque disfruto estos proyectos y lo inevitable golpeando mi cabeza contra el escritorio hasta que ya no pueda sentir mi cara. Esta es la alegría de la ingeniería.
También estaré encantado de publicar código o esquemas si ayudan. Hoy dibujaré un diagrama y lo publicaré, así como mi código después de que haya comido algo. Estoy privado de alimentos, otro sacrificio que he hecho para este proyecto, jaja.
Gracias Will
Gracias a todos, especialmente a Tony Stewart. El problema estaba en el pin listo, por supuesto. La solución fue conectar el pin listo a una de las entradas de mi microcontrolador (Arduino) y esperar a que este pin esté alto antes de escribir la siguiente instrucción en el chip. Esto resolvió el problema y ahora estoy obteniendo hermosos tonos de esto, jaja. Gracias de nuevo