Estoy creando un proyecto que utiliza viejos chips de síntesis de FM: el Yamaha YM2612, que fue el chip de generación de sonido utilizado en el Sega Genesis, y también el TI SN76489, que también estaba en el Sega.
YM2612 tiene 8 pines de datos (D0 a D7) que se utilizan para escribir en los registros internos del chip. Para bloquear una instrucción de escritura (un byte, por así decirlo), entonces los valores se asignan de D0 a D7, y luego uno de los pines parpadea bajo y luego alto en el YM2612 IC. Los datos se pueden escribir para especificar el tipo de sonido, ataque, decaimiento, lanzamiento, sostenido, timbre, frecuencia, duración de la nota, etc., pero todo se transfiere de esta manera. El SN76489 es muy similar aquí y también usa 8 pines de entrada que funcionan de la misma manera.
Quiero crear un proyecto que use el Arduino, el PIC u otro microcontrolador para controlar uno de estos chips y usarlo como sintetizador, así puedo preprogramar parches de sonido y tocar notas a través de ellos. Esto, por supuesto, requiere escribir datos en los registros como se describe anteriormente. El problema que tengo es este:
El chip Sega se controla con una frecuencia de reloj de 8 MHz. Si tuviera que usar un Arduino, por ejemplo, que tiene un reloj de 16Mhz, ¿cómo puedo proporcionar el reloj de 8 MHz para el chip de sonido mientras sincronizo las instrucciones de escritura de mi Arduino para que sucedan en el momento adecuado?
De manera óptima, cargaría un registro de desplazamiento de 8 bits como el 74HC595 con los ocho bits de datos, y luego pondría el pin / WR bajo en el chip, y luego lo volvería a poner alto, así que se han escrito 8 bits. ¿Pero no requeriría esto que el Arduino opere a la misma frecuencia que el chip de sonido? Además, si el Arduino ejecuta 16 millones de instrucciones por segundo (nominalmente, o para este ejemplo), algunos de los comandos de escritura tomarán varios ciclos, porque tendré que escribir 8 bits en un registro de desplazamiento, lo que podría requerir 16 instrucciones o algo así, por BYTE escrito en el registro de desplazamiento. Esto parece desordenar todas las consideraciones de frecuencia y no tengo idea de cómo resolverlo.