Cómo sincronizar la frecuencia del reloj con un microcontrolador

3

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.

    
pregunta user108391

3 respuestas

14

El puerto de datos YM2612 funcionará de forma asíncrona con el reloj de generación de sonido. El tiempo de escritura es tal que los datos se escriben solo en el flanco ascendente de * WR.

La secuencia es esta.

a) El YM2612 está ocupado haciendo una generación de sonidos, de acuerdo con los bits de control en sus registros internos. Cientos o millones de ciclos de reloj pasan.

b) Se presiona una tecla en su teclado. La medición de latencia del jugador comienza ahora. El Arduino lo ve, mediante interrupción o sondeo, y luego descubre qué enviar al chip de sonido. Si está programando esto en C, esto podría tomar miles de ciclos Arduino.

c) El Arduino toma 10s o cientos de sus ciclos de reloj cargando un 595, usar su mecanismo SPI sería más rápido y más fácil que el bit banging. Si estás golpeando los bits en C a través de las llamadas a digitalWrite (), pueden tomar 10s de relojes cada uno para ejecutar, muy lento.

d) Eventualmente, el Arduino tira el * WR pin low, y ahora debe esperar un tiempo mínimo con el low. Consulte la hoja de datos 2612 para saber cuánto tiempo debe permanecer baja. Es probable que sea uno o dos ciclos de su reloj.

e) Después de ese retraso mínimo, (escribirlo bajo e inmediatamente alto nuevamente por digitalWrite () en C significará que es bajo por 10s de relojes Arduino) lo vuelve a poner alto, y los datos de 8 bits finalmente llegan al YM2612 registros internos. Después de cualquier retraso interno en el 2612, el sonido finalmente cambia. El usuario escucha el cambio de sonido.

f) Enjuague y repita

Podría manejar el Arduino desde 8MHz si es más conveniente, pero no olvide configurar la frecuencia de reloj que Arduino utiliza en el programa del cargador.

    
respondido por el Neil_UK
4

Además de la respuesta de Neil_UK, si desea asegurarse de que los chips de sonido estén realmente sincronizados con su reloj Arduino, puede configurar una de sus salidas a genera una onda cuadrada de 8MHz a través de PWM y la conecta a la entrada de reloj del IC de sonido.

Esto es similar a cómo se hace en el proyecto MIDIbox SID : allí, un Microchip El microcontrolador PIC16 a 16MHz proporciona un reloj de 1MHz para un chip SID 6581.

    
respondido por el ris8_allo_zen0
0

Al parecer, no puedo pulsar Intro porque eso termina mi comentario ...

Aparece Shift-enter aparentemente. Así es como entiendo que está sucediendo, por favor avíseme si hay errores evidentes aquí (aunque compré los osciladores de lata para hacer que este circuito sea construible y manejable, y estoy bastante seguro de que debería poder resolverlo) desde allí.) Entonces, por ejemplo

1) El pin del reloj del YM2612 ve una onda cuadrada de 8MHz ... todo está bien aquí

2) En algún momento, jalaré / WR bajo, después de cargar los valores de bit a los pines D0 a D7, dependiendo de los datos que estoy enviando al chip.

3) Ahora ... aquí es donde todavía estoy un poco confuso. Entonces, una vez que el pin / WR se presione hacia BAJO, luego en el PRÓXIMO borde positivo del reloj, los datos de los pines D0 a D7 se enclavarán en el YM2612. Esto puede suceder (y probablemente sucederá) durante más de un ciclo de reloj, ya que el reloj está generando 8 millones de aristas / ciclos por segundo, y el Arduino puede funcionar más lento que eso, por lo que podría ejecutar la instrucción de escritura, por ejemplo, 100 veces de una sola vez. ¿Esto afectaría la respuesta del YM2612 de alguna manera notable?

Sé que con el SN76489, envía 14 bits a la vez a través del bus de 8 bits, siendo los primeros cuatro bits la atenuación del canal y los 10 restantes la mitad del período del tono de salida. Creo que antes de enviar una escritura de datos, tiene que enviar una escritura de dirección preliminar para fijar el chip a la dirección / registro correcto en el que está escribiendo. Creo que es lo mismo en el YM2612, así que solo volvería a escribir la información que ya estaba allí.

Lo siento por todas las preguntas, estoy muy interesado en esto y no sé todo lo que me gustaría todavía. Sus dos respuestas hasta ahora han sido muy, muy útiles y lo aprecio más de lo que saben. Espero que tengan un gran fin de semana!

También aquí hay una hoja de datos muy breve de YM2612 para referencia

enlace

Usted usa los pines A0 y A1 para designar a qué direcciones está escribiendo y qué datos se están escribiendo en ellos. Ahora que hemos aclarado la parte del reloj, ordené los osciladores de lata y tendré esa ventosa en la mesa de trabajo tan pronto como sea posible. He estado esperando para hacer este proyecto durante mucho tiempo. Gracias de nuevo chicos

    
respondido por el user108391

Lea otras preguntas en las etiquetas