Un Joystick, un teclado y un ratón para el PCW

daquena
Mensajes: 127
Registrado: 17 Jul 2011 19:15

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor daquena » 07 Sep 2011 03:54

Último mensaje de la página anterior:

Espero que con esta ya vaya la vencida...
1) Rediseño del circuito.
a - En vez de usar el PIC16F84, vamos a emplear el PIC16F88, a nivel práctico es casi el mismo, pero ganamos en 3 Entradas/Salidas para futuros usos y no dependemos de la parafernalia del oscilador.
b -Añado también un conmutador para seleccionar "qué" vamos a usar, el teclado original del PCW o el Joystick. Ahora tanto el teclado como el joy estarán enviando de continuo las señales, para evitar cualquier tipo de error, la solución más sencilla suele ser la más acertada... Quedan también eliminados los diodos, ya que carecen de sentido ahora.
c - Eliminado el "Reset". Carecía de sentido...

2) Reprogramación del PIC
Ahora el programa queda en bloques de la siguiente manera para poder implementar los cambios de hardware:
[Poner reloj a 8 MHz] - Frecuencia máxima del oscilador interno
[Definición de variables]
[Lectura del estado del Joystick]
[Escritura de los datos en el Puerto A, bit 3]
[Volver a la lectura]
No hay una subrutina que envíe, como siempre lo hace, lo incluimos en el programa principal

3) Queda pendiente el anti-rebote. Quería probarlo primero antes de diseñar un PCB para ello, ya que "puede" que no afecte, por la baja velocidad del reloj del teclado (16 KHz) y la baja actualización de los juegos en el PCW (Es bastante lentilla)

Como se ve en la imagen que adjunto del reloj, antes de cada envío de 12 bits, los 4 de dirección y los 8 de datos, el teclado hace un doble ciclo a 0 de 12 microsegundos. En el programa está implementado también justo antes de que envíe el Bit0 de la dirección.
Como en los casos (fracasados) anteriores, he comentado el código, también escrito en Basic, para que sea más fácil leerlo e interpretarlo.

Adjunto al post, un archivo RAR con el fuente basic, el HEX compilado y el PDF del circuito.

***************************************************
CIRCUITO:
Imagen

***************************************************
CÓDIGO:

Código: Seleccionar todo

'*******************************************
'* PCW PIC Joystick ************************
'* by daquena / SEP 5 2011 *****************
'*******************************************

'Rev 1.0 - Código original
'Rev 1.1 - Coregido reloj del PCW con cistral de 4 Mhz
'- Añadida entrada "reloj" en PORTB.0
'Rev 1.2 - Envía el chorizo de datos continuamente, los 16 grupos

'Señales del teclado, con su bit y su dirección
'TECLA "A" Bit 5 de la dirección 8
'TECLA "Q" Bit 3 de la dirección 8
'TECLA "O" Bit 2 de la dirección 4
'TECLA "P" Bit 3 de la dirección 3
'TECLA "SPC" Bit 7 de la dirección 5
'TECLA "ARRIBA" Bit 6 de la dirección 1
'TECLA "ABAJO" Bit 6 de la dirección A
'TECLA "IQUIERDA" Bit 7 de la dirección 1
'TECLA "DERECHA" Bit 6 de la dirección 0

Define CLOCK_FREQUENCY = 8

Dim arriba As Bit  'Pulsaciones, en este caso ARRIBA en el Joy
Dim abajo As Bit
Dim izda As Bit
Dim dere As Bit
Dim fuego As Bit

Dim tipo As Bit  '0 simula "opera" 1 simula flechas

'Ahora vamos ausar un byte para cada grupo que se envía según la tabla de arriba
'son los grupos 8, 4, 3, 5, 1, A y 0
Dim dato_8 As Byte  'El dato a enviar (GRUPO "0x8"), cada bit tiene un sentido
Dim dato_4 As Byte
Dim dato_3 As Byte
Dim dato_5 As Byte
Dim dato_1 As Byte
Dim dato_10 As Byte  'el grupo "0xA"
Dim dato_0 As Byte

Dim reloj As Bit  'detección del pulso del reloj
'Un ciclo de reloj del PIC son 0,25 microsegundos,
'el del PCW 50 microsegundos... tenemos 200 ciclos para operar
TRISB = 255  'ponemos el puerto b como lectura
TRISA.3 = 0  'y el bit 3 del A como escritura
PORTA.3 = 1  'ponemos la salida a 1 portb.3 en 1

'********************************************
'** PROGRAMA PRINCIPAL **********************
'********************************************
loop:  'Inicio de un bucle infinito

arriba = PORTB.1  'Leemos el Joy
abajo = PORTB.2
izda = PORTB.3
dere = PORTB.4
fuego = PORTB.5
tipo = PORTB.7

'Ahora ponemos el estado que corresponda, pero al contrario.
'El estado lógico en reposo de una tecla es "1" pasa a "0" cuando se pulsa
'Escaneamos siempre el joy y luego al final enviamos el choorizo
If tipo = 0 Then  'Si el tipo es "OPERA"
   dato_8.5 = Not abajo
   dato_8.3 = Not arriba
   dato_4.2 = Not izda
   dato_3.3 = Not dere
   dato_5.7 = Not fuego
Else  'es un tipo "FLECHAS"
   dato_10.6 = Not abajo
   dato_1.6 = Not arriba
   dato_1.7 = Not izda
   dato_0.6 = Not dere
   dato_5.7 = Not fuego
Endif
'*************************************************************************
'A enviar el chorizo de 16 grupos y 12 bits (192 bits) al ciclo del reloj del PCW
Dim ind_grupo As Byte
Dim dato_temp As Byte  'Lo usamos para el ciclo

reloj = 1  'Ponemos la referencia del reloj a 1
For ind_grupo = 0 To 16
      'PRimero, antes de enviar los 12 bits, necesitamos hacer una sincronización.
      'de 1 pasa a 0 durante 12uS, luego a 1 otros 12uS, y finalmente a 0 12uS más para pasar a 1 de nuevo
      '----_-_-----
      PORTA.3 = 0
      WaitUs 12
      PORTA.3 = 1
      WaitUs 12
      PORTA.3 = 0
      WaitUs 12
      PORTA.3 = 1
      'Comenzamos a enviar datos
      While reloj = 1  'Mientras que el relos esté en 1 esperamos...
         reloj = PORTB.0  'Comprobamos que esté en 1, cuando lea que es 0 termina el bucle
      Wend  'podemos enviar el dato
      PORTA.3 = ind_grupo.0  'Enviamos el dato, en este caso, el bit menos sig del grupo que estamos
      reloj = 1  'ponemos la referencia del reloj a 1 para el siguiente dato
      WaitUs 14  'esperamos a que el reloj se vuelva a poner a 1, tarda 12uS, pa librarlo, ponemos 14...
      '************
      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = ind_grupo.1
      reloj = 1
      WaitUs 14
      '************
      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = ind_grupo.2
      reloj = 1
      WaitUs 14
      '************
      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = ind_grupo.3
      reloj = 1
      WaitUs 14
      '************
      'AHORA A POR LOS DATOS
      If ind_grupo = 0 Then dato_temp = dato_0
      If ind_grupo = 1 Then dato_temp = dato_1
      If ind_grupo = 2 Then dato_temp = 255  'Todos los bits a 1, no lo usamos
      If ind_grupo = 3 Then dato_temp = dato_3
      If ind_grupo = 4 Then dato_temp = dato_4
      If ind_grupo = 5 Then dato_temp = dato_5
      If ind_grupo = 6 Then dato_temp = 255
      If ind_grupo = 7 Then dato_temp = 255
      If ind_grupo = 8 Then dato_temp = dato_8
      If ind_grupo = 9 Then dato_temp = 255
      If ind_grupo = 10 Then dato_temp = dato_10
      If ind_grupo = 11 Then dato_temp = 255
      If ind_grupo = 12 Then dato_temp = 255
      If ind_grupo = 13 Then dato_temp = 255
      If ind_grupo = 14 Then dato_temp = 255
      If ind_grupo = 15 Then dato_temp = 255
      
      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.0
      reloj = 1
      WaitUs 14
      '************
      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.1
      reloj = 1
      WaitUs 14
      '************
      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.2
      reloj = 1
      WaitUs 14
      '************

      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.3
      reloj = 1
      WaitUs 14
      '************

      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.4
      reloj = 1
      WaitUs 14
      '************

      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.5
      reloj = 1
      WaitUs 14
      '************

      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.6
      reloj = 1
      WaitUs 14
      '************

      While reloj = 1
         reloj = PORTB.0
      Wend  'podemos enviar el dato
      PORTA.3 = dato_temp.7
      reloj = 1
      WaitUs 14
      '************

      
Next ind_grupo  'Pasamos al siguiente grupo a enviar
Goto loop  'Volvemos al principio para poder escanear de nuevo el joy en reenviar el chorizo de nuevo
End                                               


*********************************************
FINALMENTE, EL RELOJ:
Imagen

Pues anda, lo de siempre, a intentar hacer funcionar el chisme.
Saludinos:joystick.rar

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 07 Sep 2011 11:04

se nos escapa algo, no funciona.
He cargado el HEX en un 16f88, desmontado el teclado para sacar las señales, como he sacado las señales del conector del teclado en lugar del dim las he recolocado, pero no funciona.
luego subo fotos y explicacion

Avatar de Usuario
zx4ever
Mensajes: 270
Registrado: 31 Oct 2010 19:44
Agradecido : 1 vez
Agradecimiento recibido: 3 veces

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor zx4ever » 07 Sep 2011 11:06

Fantastico, dentro de poco podremos jugar con "joystick" en el PCW.

Animo muchachos que ya queda menos.

Salu2

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 07 Sep 2011 12:12

he pinchado el osciloscopio en la señal de reloj, y un ciclo completo no es igual que el teorico que muestras, de hecho ni siquiera me coincide la frecuencia, me salen 32 microsegundos por ciclo...
Imagen

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 07 Sep 2011 12:31

foto tomada a 10microS/div y 2V/div, siento que en la anterior no se vea claroImagen

daquena
Mensajes: 127
Registrado: 17 Jul 2011 19:15

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor daquena » 07 Sep 2011 14:31

umm... esto cambia mucho las cosas...
pillo un rato y reprogramo
muchas gracias!
edito: es más, me pillo el osciloscopio del curro y a ver si esta tarde/noche puedo mirar no solamente eso, que ya lo has descubierto, sino también confirmar como se envían los datos, que he encontrado dos versiones distintas...
pasa por hacer las cosas a ciegas...

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 07 Sep 2011 19:44

creo que se avecina algún quebradero de cabeza, se me a ocurrido pasar las señales de reloj y data por un analizador casero (logicanalizer 1.5) y sorprendentemente la señal de reloj no es normal, hay momentos que se detiene.



daquena
Mensajes: 127
Registrado: 17 Jul 2011 19:15

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor daquena » 07 Sep 2011 21:27

ya te digo, acabo de subir de mi retro-chavola de ver con el osciloscopio tanto la señal del reloj, como la de datos, y lo primero que me sorprendió, fue que el reloj lo genera el teclado, no el PCW...
mira estas fotillos...
Imagen
Aquí se ve que la fz de mi teclado es 30Khz... el tuyo 33, y el de John Elliott, 16Khz...
Más...
El doble pulso de sincronía:
Imagen
aquí lo veo como 5,8 uS... frente a los 12 que corren por internés..
Más...
El quebradero de cabeza a groso modo...
Imagen
Aquí solamente se ve la primera parte del primer grupo, se aprecian los 4 bits de dirección y después el dato...
Cuando cierro la base de tiempos, se ve como tanto el reloj como la línea de datos van en "cierta" sincronía, con huecos entre grupos, pero para las dos líneas...
Funciona (creo) que así:
HUECO(50uS)
SINCRONÍA (18 uS- "1" de 6uS, un "0" de 6 y otro "1" de 6)
HUECO (50uS)
DIRECCIÓN (+-33uS cada pulso)
HUECO (50uS)
DATOS (+-33us cada pulso)
y vuelve a enviar otro ciclo como este para otro grupo...
Ojo, el reloj ca acompasado con ello... con sus huecos y todo...
A ver como se puede plantear...

Gracias y saludinos!!!
Esto va a ser "muchísimo" más complicado de lo que parecía al principio...

javu61
Mensajes: 325
Registrado: 26 Mar 2011 15:58
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor javu61 » 07 Sep 2011 22:16

Hola:

Los teclados son periféricos asíncronos, el ordenador no puede enviar nada al teclado, es el propio teclado el que lo gestiona todo, por eso general el la señal de relog. La comunicación asíncrona usa el bit de start para indicar que empieza la comunicación, pero el teclado usa un relog propio, por lo que no hay velocidades críticas como en un puerto serie, y cada teclado puede funcionar a la velocidad que desee mas o menos.

Saludos

daquena
Mensajes: 127
Registrado: 17 Jul 2011 19:15

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor daquena » 08 Sep 2011 03:01

Volví a la retro-corripa a seguir leyendo cosas e intentar entender lo que hay por ahí...
Bien, creo que ya lo tengo.
Comienzo a explicar por el reloj...
El reloj solamente actúa cuando se envía un bit, esto es, primero 4 ciclos, queda 1 "a oscuras" y luego vuelve con 8 más para los datos.
La señal de datos, justo antes del comienzo, y sin ningún tipo de señal de reloj, hace dos unos seguidos, de 6 uS cada uno y un hueco de la misma duración entre ellos.
Cada ciclo de reloj tiene una duración de 33 uS, 12 a "0" y 21 a "1".
No es lógica inversa como pone por algún otro lado.
Cuando de pulsa una tecla, el/los bit/bits que le corresponden, pasan de "0" a "1".
Se envían en total un ciclo de 17 grupos, cada uno de ellos de 12 bits, los 4 primeros el número de grupo, y los siguientes 8 los datos de las pulsaciones.
Se envía el grupo 0F primero con el bit número 6 a "1", para indicar el comienzo del envío del mapa del teclado. Al final se vuelve a enviar el mismo grupo pero con el bit 6 a "0", para indicar el final. El bit 7 del grupo 0F, siempre está a "1", parece ser que indica que se están enviando datos.
Entre los grupos 0F(Inicio) y 0F(Final), están el resto en orden, desde el 00 al 0E, los otros 15.
Imagen

John Elliott describió un mapa del teclado para cada grupo/bit, esta noche he podido corroborar de su certeza. Es el siguiente:
Imagen

En la siguiente imagen centré el ciclo completo de los 17 grupos que se envían, desde el primer 0F al último:
Imagen

Pues ahora ya sé como funciona, comprobado físicamente, y comentar que de las dos fuentes de donde saqué la información, ninguna de las dos decía la "verdad" completa...

Nada, hoy ya no, pero este puente, a ver si rehago por X-ésima vez el código para el PIC, y esta vez, esperemos que funcione...

Buenas noches, muchas gracias a todos y saludinos!!!

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 08 Sep 2011 07:06

Un trabajo excelente!!!! Gracias Daquena
PD Nota mental.... cambiar de osciloscopio

dancresp
Mensajes: 5669
Registrado: 13 Nov 2010 02:08
Agradecido : 343 veces
Agradecimiento recibido: 470 veces

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor dancresp » 08 Sep 2011 09:38

Estoy seguro que lo acabarás consiguiendo, pero por el camino nos estás dejando un hilo muy interesante.

Ánimos, que ya te queda menos.
Buscando la IP de la W.O.P.R. he encontrado mi índice

daquena
Mensajes: 127
Registrado: 17 Jul 2011 19:15

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor daquena » 08 Sep 2011 18:30

Pues creo que ya lo tengo...
Esto es una simulación en Multisim 11, el programa se lo cargué a un 16f84 (tiene menos puertos) y el resultado:
Imagen

He cambiado algunas cosas, para que sea más fácil implementarlo el hard, ahora las señales son para cada puerto:
ARRIBA - Puerto A Bit 1
ABAJO - Puerto A Bit 0
IZQUIERDA - Puerto A Bit 7
DERECHA - Puerto A Bit 6
FUEGO - Puerto B Bit 7
Tipo Teclado - Puerto B Bit 6
SALIDA RELOJ - Puerto B Bit 2
SALIDA DATOS - Puerto B Bit 3

Sin cristal y sin nada más. En este diseño no hay teclado, se conecta directamente al conector del teclado... Intentaré ver como lo soluciono.

El fuente comentado, el fichero HEX y el circuito en el fichero adjunto:

CIRCUITO:
Imagen

A ver si a esta ya va la vencida...

Saludinos!!!!joystickpcw13.zip

OTRA COSA VERY IMPORTANTE:
Si no conectáis las resistencias a las entradas del pic, estará leyendo un "0" siempre, como "pulsado" en el mando es a masa internamente, estará enviando de continuo los datos de las teclas O P Q A Spc... cosas que hay que tener en cuenta...
Lo siguiente, un adaptador de teclado y ratón PS2 a PCW... pero antes un poco más de explorador...
Saludinos!!!!!

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 08 Sep 2011 20:47

1 Me parece buena idea prescindir del teclado... ya se solucionara con un conmutador doble (reloj-data) que selecciones entre el apaño y el teclado
2 Lamento ser portador de malas noticias pero no va...
Esta vez mi osciloscopio no me dice nada... es muy viejo,y no es capaz de presentar una señal clara
y el analizador casero tampoco obtiene datos (pero estoy seguro que los hay, por que tira basura)
que el osciloscopio no me saque ninguna señal mas o menos clara, me da la impresión de que hay algo mal en la base de tiempos.
por disparar a ciegas....¿estas seguro que no se han confundido us con ms?
PD: Por favor no mates al mensajero...

vcoraba
Mensajes: 299
Registrado: 29 Oct 2010 15:07
Agradecido : 1 vez
Agradecimiento recibido: 1 vez

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor vcoraba » 08 Sep 2011 21:54

hola otra vez...
Usando la herramienta osciloscope de PIC Simulator ide he sacado esta imagen y a simple vista ya se ve que la trama de bits de sincronizacion es correcta en la forma pero no en su duración , segun la imagen de tu osciloscopio deberia durar 6us+6us+6us osea 18us, y aquí se ve que dura mas
(en la segunda imagen esta ajustada con las barras) 268-218= 49 us.
Por favor no te lo tomes a mal, no voy de listillo solo intento facilitarte las cosas.
Un saludo y gracias por tu empeño y aguantar pesadosImagenImagen

Avatar de Usuario
ron
Mensajes: 19574
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 2478 veces
Agradecimiento recibido: 2270 veces

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor ron » 08 Sep 2011 22:01

Vaya nivelazo, fantástico.

Gracias infinitas por compartirlo.


daquena
Mensajes: 127
Registrado: 17 Jul 2011 19:15

Re: Un Joystick, un teclado y un ratón para el PCW

Mensajepor daquena » 09 Sep 2011 04:23

pues pasa algo... jajaja
mira, esto es en multisim: 16 uS
Imagen

y esto otro con pic simulator ide: 25 uS
Imagen

y no tienes manera de verlo con el analizador en el pic real?
vaya jodienda, a ver si al final puedo acercarme mañana a uviéu a por el XXXX pic de los XXXXX

Saludinos!!!!


Volver a “Amstrad PCW”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado