• Estoy haciendo un adaptador de teclado de C64 (los Joystick son parte del teclado) a la PC, por la entrada Mini-DIN/PS2 de la PC.

    Este consta de un pic 16F84, y 3 registros de shift (74HC165 y 74HC164). La placa tambien tiene un MAX 232 y salida de puerto serial, pero se la voy a anular, porque me desperdicia 2 patas utiles.

    El primer problema que surgio, fue que ya habia ubicado los integrados y los conectores, e iba a conectarlos entre si, para eso me fije en el diagrama de la C64, y ahí me di cuenta que meti la pata, que los joystick colicionaban con el teclado, no eran la 9na y 10ma fila de la matriz como yo supuse. Me acorde que en la commodore cuando movia el joystick se metian caracteres (hace mucho que no  la uso!!!).
    Asi que desde el vamos uno de los 74hc164 esta de mas!!!Ademas las patas de las 8 filas no pueden ser de solo salida, porque tambien son entradas de uno de los JOY, asi que el hardware ya no va a ser 100% compatible, salvo que reordene algunas patas del PIC y vuele el 232... Por las dudas los JOYs los conecto recien a lo ultimo.

    El barrido del teclado ya lo probe y lo hace bien. Cada barrido guarda el estado en RAM (matriz de 8 x 8 bits) de cada tecla y si cambio de estado lo envia por el puerto serial.
    Todabia tengo que ajustar la cantidad de barridos por segundo, porque a veces tiene mucho revote y debe ser porque esta leyendo muy seguido y detecta cualquier minimo contacto.

    Solo faltaba la parte de transformar a codigo de teclado de PC, cosa simple en la que ya tengo experiencia. Antes de conectar al pic a la PC, para descartar otros problemas, probe un teclado por puerto de PS2 para ver que esta todo bien ahora que tengo teclado USB hace un mes....
    Aca entro en escena el XP, que ya no quiere aceptar teclado PS2s, ni que resetee, desconecte el usb, etc, etc.... me cuelga el mouse, no me deja escribir la re#$&$#%&%$$...

    Estoy muy hinchado las %&##$% y tengo cosas mas lindas para hacer con mis 6502, con el SID, que se yo cuantas cosas y ahora estoy trabado con esta $%%#$% de teclado la $%$#$ que lo re mil %$&#$%#.

    Lo dejo por unos dias porque sino rompo la pc a patadas.

    Alguno hizo algo por el estilo (no patear la PC, lo del teclado)? Modificaron el codigo de algun emulador para agregarle hardware original?

    Imagen000
     

  • si haces algo asi pero al reves sos mi idolo, asi solucionamos el problema de teclados rotos en las C=  ;)
     

  • si haces algo asi pero al reves sos mi idolo, asi solucionamos el problema de teclados rotos en las C=  ;)


    No te creas, me suena mucho mas facil (ademas no dependes de XP). Lo voy a ver, total el firmware para leer el teclado de PC lo tengo (lo voy a usar para mi Home Computer)...suena interesante
     

  • Para hacer un adaptador de teclado PS2 para conectar en la C=, por lo que pense no se podria usar un 16F84, habria que pasarse a un 16F874 / 877 porque nos faltan algunas patas:
    - 2 patas de I/O para comunicacion de Teclado (clock y data)
    - 8 de entrada de filas. (la C= las usa como salida, pero tambien como entrada de joystick, pero esto no afecta a nuestra placa)
    - 8 salidas de columnas
    Se le podria meter un latch o algun intermediario para ahorrar patas del pic, pero perderiamos tiempo de respuesta que es muy importante. Se puede usar la interrupcion de cambio del port para las filas y responder casi inmediatamente, y el teclado de PC se leeria por polling.

    El pic es mucho mas rapido que la C=, eso ayuda para responder el estado de las columnas entre el tiempo que la computadora setea las filas y va a leer las columnas.

    La placa seria re simple, un zocalo de 40 pines del 16F877, un cristal (20mhz, 12, da lo mismo), una entrada MiniDin conectada directamente al pic (2 patas) + 2 patas de alimentacion comun al pic.

    Despues necesita un conector de 20 pines que encaje con el de la placa de la C=, y la conexion seria directa con el PIC.
    Habria que ver (a ver si alguno lo sabe) si se pueden sacar 0 y 5V del conector de 20 pines del teclado (me parece que en el plano figuran los +5, pero es justo el pin que no esta)

    No harian falta resistencias de pull up porque eso esta en el integrado de la C64.

    La verdad que me esta entusiasmando la idea porque va a ser rapido de hacer
     

  • Te conviene un 16F873 que es mas barato y mas que nada bastante mas chico, es de 28 pines pero no en el ancho de uno de 40 sino en el ancho de uno de 16, solo que mas largo.
     

  • Fabrique mi primer circuito impreso para hacer el adaptador de PS2 a C64, salio muy bien para ser el primero, salvo 2 pistas que las pifie y una que me olvide de dibujarla, y que por alguna razon el conector de 20 pines salio un 5% mas chico (y entro forzado).
    Ademas segui el consejo y le puse el 16F873, asi que todo bien.
    La placa se conecta directo al conector del teclado (20 pines). La hice lo mas chico posible (tube que usar un conector de 90grados de 2 hileras, porque no consegui simple), pero igual lo puedo mejorar, sobre todo porque si la C64 tiene el teclado puesto no cierra la carcaza, menos con el conector del teclado PS2  :-[
    La alimentacion la saca del mismo conector del teclado de C64, asi que es compacta y simple, lo medi y todo bien, el harware listo 100% solo falta el firmware que es lo mas facil.........   :-/

    Placa1
     

  • Pero el FIRMWARE NO ES FACIL!!!
    De hecho hace un par de dias me da vuelta la cabeza el problema y no me lo puedo sacar, y por mas que encuentro como simplificarlo, dependo de muchas suposisiones que no se si son ciertas, y que hay que probar.

    Aca esta la complicacion:
    El pic que tiene que responder a tiempo a la C64, desde que esta setea el valor de las columnas (habilita 1 a la vez para ver que fila de esa columna esta cerrada), para hacerle creer que es un teclado, pero para obtener esta informacion tiene que realizar bastante procesamiento.
    El micro de la C64 anda a 1Mhz, mas o menos, es muy lento, seguro, pero el pic por mas que lo ponga a 20Mhz (que son 5 millones de instrcciones por segundo, no 20) tiene que hacer bastante procesamiento. Tiene que leer los 8 bits de las columnas y detectar estos casos:
      FF, no esta leyendo, enviar FF por las columnas
      00,leer todo a la vez, la C64 lo hacer para ver todas las filas a la vez, a ver si alguna esta apretada, y hacer el scan
      7f,bf,df,..... meter el valor de una de las 8 columnas

     y hay otro problema: el joystick 1 tambien va a meter valores en el puerto de columnas, y estos pueden venir en cualquier orden !! confused

    Ademas el PIC tiene que estar atento al teclado, y que pasa si mientras esta leyendo el teclado de PC, la C64 pregunta por una tecla???

    Como esto podria escribir hojas y hojas con todas mis preocupaciones sobre este tema. No digo que sea imposible, pero si que hay que hacer ajustes tras ajuster y resignar mucho.

    En conclusion, todo da a entender que es mejor dar un paso al costado, hacer un renunciamiento historico, reconocer que me precipite, lo subestime y no lo analise correctamente y optar por lo mejor para mi salud mental (puede que ya sea tarde biglaugh)

    Igual voy a seguir con el proyecto original (usar el teclado+joystic en la PC, pero ahora con 16f873 e impreso) y este lo voy a retomar pero pasandole mas cosas al hardware (miren este proyecto, me gusto lo del 6116:  LINK )

    Si alguno se le ocurre como hacer andar esta placa, espero sus comentarios. Yo igual el resto del dia lo voy a dedicar a llorar  :'(

         Saludos
        MARCOS
     

  • Veamos, hasta donde entiendo lees los codigos del teclado PS2, lees los valores de las filas que genera la C64, y generas los unos y ceros en las columnas para que la C64 los detecte e interprete la tecla adecuada que se presiono en el teclado PS2.
    No hay que perder de vista que el teclado de C64 no son mas que llaves que cortocircuitan dos contactos, no es un aparato inteligente, asi que tenes que limitarte a emular eso, y lo que suceda con los joysticks no deberia afectarte, si el PIC actua igual que las llaves del teclado, los joysticks deberian afectar lo que vos envias con el PIC y se obtendria la misma lectura en la C64. Ahora, hay que tener en cuenta que los joysticks hasta donde se creeria que no se conectan en medio de la placa del teclado de C64, aunque si esto es asi, en el conector de teclado tendria que haber lineas que vienen del joystick, que entran y salen de la placa del teclado. No me puse a ver los planos de la C64 asi que no puedo asegurar que no interfieran directamente en la placa, pero supongamos que no. En este caso lo unico que podria afectar la lectura de los joysticks seria que la presion de alguna tecla en el teclado de la C64 no sea exactamente un cortocircuito sino que haya una resistencia entre fila y columna afectadas, esto es normal si se usa goma conductora, por lo cual tendrias que medir la resistencia que hay cuando presionas una tecla (entre la fila y la columna correspondientes), creo que la goma conductora suele tener una resistencia baja, de 100 ohms o menos (una vez medi una pero ya no me acuerdo el valor exacto), por lo que a la salida del PIC tendrias que colocarle esa resistencia en serie. Esto es fundamental porque puede que el circuito de joystick se cortocircuite con la lectura del teclado, sabiendo que al tener resistencia no es un cortocircuito real.
    En mi opinion, tendrias que tener un registro conteniendo el ultimo codigo leido del teclado PS2, codigo sin procesar digamos, tal cual como viene del teclado, esto indicaria la ultima tecla, o el codigo de que no hay ninguna tecla presionada. Tendrias que hacer una rutina de mapeo de ese codigo a filas y columnas de la C64, y almacenarlo en otros dos registros, FILA y COLUMNA. Cuando la C64 coloque el mismo valor en las filas que el almacenado en FILA, enviarias en las columnas el valor almacenado en COLUMNA, mientras dure la coincidencia de fila. Mientras no llegue otro codigo desde el teclado PS2, tendrias siempre esos valores almacenados, y responderias siempre lo mismo.
    El problema creo que esta en que la lectura de PS2 no es instantanea y requiere cierto tiempo para procesarla, con lo cual tenes el problema que mencionas, que mientras lo estas leyendo la C64 puede intentar la lectura del teclado. Tal vez convendria programar una interrupcion lo mas frecuente posible, en donde se chequee que la C64 lee la fila esperada, y donde envies la columna en respuesta a eso, saliendo luego de la interrupcion. Esto no deberia influir mucho en la ejecucion de la lectura del teclado PS2, pero tambien se puede hacer manualmente, llamando a esa pequeña rutina tan a menudo como sea posible en la rutina de lectura de PS2.
    Es un problema importante el de la velocidad, creo que no se puede resolver satisfactoriamente sin conocer el temporizado exacto de la lectura de teclado en la C64, habra que investigarlo un poco mas.
     

  • 17 años atrás


    (miren este proyecto, me gusto lo del 6116:  LINK )


    Hay uno mejor:

    http://www.speccy.org/foro/viewtopic.php?f=8&t=188
     

  • Veamos, hasta donde entiendo lees los codigos del teclado PS2, lees los valores de las filas que genera la C64, y generas los unos y ceros en las columnas para que la C64 los detecte e interprete la tecla adecuada que se presiono en el teclado PS2.

    Si, el PS2 por cada tecla te envia un mensaje con una tecla para decirte que se apreto, y otro para avisarte que se solto. Ese codigo lo transformas al codigo de C64 (8*8 codigos+1 del restore que esta aparte), y lo guardas en una matriz de 8 bytes, + 1 bit del restore (guardas 1 cuando se apreta y 0 cuando suelta). Hasta ahi todo bien, el problema que toda esta transformacion lleva unos ciclos (muy pocos, peroobligatorios). Si justo en ese momento (muy pero muy pocas probabilidades) la C64 se le da por leer el estado del teclado, el pic no puede responder porque esta ocupado, y devuelve todo 0xff, nada apretado. Si hay una tecla apretada, la C64 lo toma como que se solto, pero al proximo ciclo la va a volver a leer y toma como que se apreto, o sea que se produjo una repeticion no deseada.

    La interrupcion de timer no ayuda, porque igual se atraza bastante con respecto a lo necesario, y no es complicado hacer un loop que revise en cada ciclo el estado del PS2, y (lea un bit de ser necesario hasta formar un byte) y el estado de columna que solicita la C64, pero por mas chico que sea, en el peor de los casos (la C64 cambia el port de salida del teclado justo despues lo revisamos y vimos que no cambio) siempre se pierden muchos ciclos y puede que lleguemos tarde.


    se obtendria la misma lectura en la C64. Ahora, hay que tener en cuenta que los joysticks hasta donde se creeria que no se conectan en medio de la placa del teclado de C64, aunque si esto es asi, en el conector de teclado tendria que haber lineas que vienen del joystick, que entran y salen de la placa del teclado. No me puse a ver los planos de la C64 asi que no puedo asegurar que no interfieran directamente en la placa, pero supongamos que no. En este caso lo


    Tema joystick:
    Una cosa es lo que a vos o a mi, usando nuestro conocimiento y sentido comun, deduscamos de como estan conectados los joystick, y otra muy distinta es como estan conectados en la realidad. Adjunto la parte del circuito que nos interesa. Yo segui el sentido comun y tube problemas, mire el circuito y dije, no puede ser, medi y si, era asi. Y luego recorde que, en el basic, cuando apretabas el joystick te metia toda clase de cosas por el teclado. (hace mas de 10 años que no uso la C64 en serio, la encendi para ver si andaba, pero me resulta muy incomoda ponerla en la TV y usar el datasete y todo eso)

    Fijate que lo que leo de la C64, para saber que columna esta barriendo, puede estar conteniendo el estado del joystick, y ser cualquier cosa. El mismo problema lo tiene el teclado real, lo que pasa es que yo pensaba hacer una especia de prediccion, de ver que cada vez que cambiaba el valor del port, le mando la proxima columna, pero si se mete el joystick, va a ser un zafarrancho.

    Voy a tener que hacer un programa de prueba para ver como interfiere el Joystick con el teclado, pero mucho no me atrae, porque tengo que grabarlo el programa (voy a tocar el handler de teclado) y no quiero usar el datasete  :)

    Lo de la resistencia no creo que afecte, porque es cierto que casi todas las teclas tienen unos 100 ohms, pero el Shift lock (unido al shift izquiedo) es 0ohm, y lo mismo los Joystick que tambien son contactos de 0 ohms ,si los apretas bien (por lo menos los mios de Atari y sin uso).

       
    Te muestro como lee la kernel:
      Aca aparentemente lee la tecla Commodore
    E938   A9 7F      LDA #$7F
    E93A   8D 00 DC   STA $DC00
    E93D   AD 01 DC   LDA $DC01
    E940   C9 FB      CMP #$FB

    Entre la instruccion STA $DC00 , la ejecucion de LDA .... el pic tiene que avivarse que se puso un valor en DC00, y sacar de la tabla el valor de la columna 7 (hay que transformar de 7f a 7, no es simple, son varios pasos) y responder a DC01. Tal vez se pueda, pero me suena mucho...

    Aca verifica si hay al menos una tecla apretada (todas las columnas):
    EA87   A9 00      LDA #$00
    EA89   8D 8D 02   STA $028D
    EA8C   A0 40      LDY #$40
    EA8E   84 CB      STY $CB
    EA90   8D 00 DC   STA $DC00
    EA93   AE 01 DC   LDX $DC01
    EA96   E0 FF      CPX #$FF
    EA98   F0 61      BEQ $EAFB
    EA9A   A8         TAY
    EA9B   A9 81      LDA #$81



    Aca pasa a la proxima columna:
    EAD5   68         PLA
    EAD6   2A         ROL
    EAD7   8D 00 DC   STA $DC00
    EADA   D0 CC      BNE $EAA8

    Como vez, tiene que saltar y recien ahi si lee el valor de la columna. Esto el PIC lo contesta de taquito.



    Key01
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal