Conectando Arduino al puerto de cinta de C64

8

Actualización : se realiza una implementación práctica de esto en el proyecto Tapuino realizado por Peter Edwards. Compruébelo, todo está abierto: enlace

Estoy trabajando en un proyecto en el que estoy usando mi Arduino para transmitir archivos de datos de cinta TAP desde mi PC al C64. El lado de software del proyecto va bien, sin embargo, todavía soy nuevo en electrónica y no me gusta freír a mi Commodore. Así que necesito ayuda de interfaz de hardware en realidad.

Las cintas C64 utilizan la modulación PWM para almacenar el programa en la cinta de casete y al leer los datos, un disparador opamp + schmitt convierte la señal de audio en ondas cuadradas. Cada transición alta-baja desencadena una interrupción en la máquina y la distancia entre dos interrupciones (que es la duración del pulso) representa una parte atómica de la corriente.

El pinout del puerto del cassette tiene este aspecto (la parte superior e inferior tienen los mismos pines dos veces):

A-1,GND,Ground

B-2,+5V,5voltiosCC

C-3,MOTOR,Controldelmotor,aprox.Fuentedealimentaciónde6voltiosdelmotor

D-4,LEER,Entradadedatos,leerdatosdelabasededatos

E-5,ESCRIBIR,Salidadedatos,escribirdatosenlabasededatos

F-6,SENSE,Detección,sisepresionaunadelasteclasPLAY,RECORD,F.FWDoREW

Miideaactualeslasiguiente:

Basadoenel C64 Interconecting Blue Book (a partir de la página 29) la máquina utiliza el nivel TTL en el puerto de LECTURA y ESCRITURA, por lo que supongo que puedo conectar directamente un pin PWM desde el Arduino al pin de LECTURA.

También necesito conectarme con el pin SENSE. Creo que también puedo conectarlo directamente a uno de los PIN digitales y escribir LOW digital cuando necesito señalar el estado del botón pulsado. ¿Es eso correcto?

Más tarde deseo detectar la presencia de una señal de + 6V en el pin MOTOR. Algunos cargadores detienen el conjunto de datos en medio del proceso de carga, así que tengo que detectar eso también para emular la cinta correctamente. ¿Debo usar algún tipo de resistencia para limitar la corriente allí o puedo conectarlo directamente también? Tal vez debería usar un relé allí?

    
pregunta NagyI

2 respuestas

4

Según el documento que proporcionó, el puerto de la base de datos está buscando una señal digital pura con un ciclo de trabajo variable (0,75 para H, 0,25 para L).

Mientras el pin Arduino pueda conducir suficiente corriente (debería poder hacerlo) y esté funcionando a 5 V, funcionará una conexión directa. Es posible que desee investigar utilizando un búfer TTL entre el Arduino y el C64 (el búfer se alimentaría desde el suministro +5 del puerto de la base de datos, y el terreno sería común tanto para el C64 como para el Arduino).

En cuanto al SENSE, sería más fácil usar una salida digital para controlar un MOSFET de pequeña señal (como un 2N7002) - un alto lógico enciende el MOSFET, que tira del pin SENSE (conectado al drenaje) para tierra (conectada a la fuente) sin que Arduino tenga que hundir ninguna corriente en absoluto.

El pin MOTOR también podría usarse para conducir una puerta MOSFET. El drenaje se elevaría a la tensión de alimentación de Arduino con un pullup débil (alrededor de 10k), la fuente conectada a tierra. El drenaje también iría a un pin lógico digital. Cuando MOTOR está alto, la entrada lógica es baja y viceversa, y el Arduino ve una señal lógica limpia.

Por ejemplo ...

Nota usando dos puertas NAND como un búfer de clases. (¿Puedes decir que solía buscar piezas?)

TTL es bastante robusto. No creo que haya muchas posibilidades de dañar nada.

    
respondido por el Adam Lawrence
2

Suena como un proyecto interesante. Mi recuerdo es que el hardware del VIC-20 alimentó los pulsos de la Datasette a un circuito de detección de bordes (no recuerdo si detectó subidas o bajadas de bordes); las rutinas de carga de cinta C64 eran compatibles con las del VIC-20, por lo que no creo que el cargador estándar pudiera haber usado ningún truco que el VIC-20 no admitiera, aunque sí los cargadores personalizados. Nunca jugué con cosas en el día lo suficiente como para determinar si la propia Datasette convertía los flancos ascendentes y descendentes en pulsos (por ejemplo, al enviar una señal retardada y no retardada a una compuerta XOR). Se me ocurrió una rutina para convertir los datos en anchos de pulso, pero nunca descubrí cómo utilizar el detector de bordes.

Con respecto a obtener datos de la PC al C64, si no desea utilizar una tarjeta de sonido (algunas tarjetas de sonido tienen un procesamiento de imagen estéreo y pueden causar estragos en la fase de audio saliente) hay Podría sugerir dos enfoques: (1) enviar datos de intervalo de pulso desde la PC a Arduino, y simplemente tener los pulsos salientes individuales de Arduino en el tiempo. Quizás codifique el formato de datos con dos pulsos por byte, utilizando algo como la siguiente codificación:

0000-1100 -- Output a 20us high followed by 24-60us low (in multiples of 3us)
1101      -- Output 40us low
1110      -- Output 80us low
1111      -- Byte values of $FF will be ignored
          -- Other byes with one nybble equal to 1111 could be used to simulate the
             tape motor buttons or indicate an "okay to pause here" indication.

No creo que ningún esquema de carga intente cronometrar los pulsos con una precisión superior a tres, y este esquema permitiría que los datos se envíen a través de un UART a 115200. La PC debe agregar bytes de relleno 0xFF para que la velocidad a la que datos El envío al Arduino coincidirá razonablemente bien con la velocidad a la que el Arduino lo está registrando. Debido a que cada nybble tardará entre 44 y 80 microsegundos en procesarse, el Arduino solo tendría que sondear su UART entre nybbles y podría deshabilitar las interrupciones cerca del final de cada pulso. Si la PC rellena sus datos razonablemente eficaz, uno podría (1) hacer que la PC intente enviar datos un poco más rápido de lo que Arduino lo emitiría, y utilizaría hardware o software para reducir la velocidad, o (2) el Arduino le quitaría un microsegundo a cada pulso cuando su búfer estuviera casi lleno, o agregaría un microsegundo a cada pulso cuando su búfer estuviera casi vacio. Para evitar que se produzcan fallos de audio debido a problemas momentáneos de PC, se puede hacer que Arduino suspenda la salida en un byte "está bien para hacer una pausa aquí" si su búfer no estuviera casi lleno.

    
respondido por el supercat

Lea otras preguntas en las etiquetas