Joy2PS2 v1.0 para ZXUno

Proyectos ajenos al equipo oficial pero desarrollados o promovidos por la comunidad, relacionados con el ZX-UNO / Projects outside the official team but developed or promoted by the community, related to the ZX-UNO

Avatar de Usuario
brunosilva
Mensajes: 312
Registrado: 18 Jun 2016, 19:54

Re: Os presento Joy2PS2 para ZXUno

Mensaje por brunosilva » 18 Dic 2016, 09:48

spark2k06 escribió:Doy por concluido el asunto. Reanudamos los envíos y reservas.
Ok can i pay again?

The same value?

Bruno


Sent from my iPhone using Tapatalk


Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: Os presento Joy2PS2 para ZXUno

Mensaje por spark2k06 » 20 Dic 2016, 17:34

Una pregunta sobre el mapeo, que la verdad, cuesta un poco seguir el código verilog para entenderlo (pero si lo tengo que hacer lo haré :enelPC: )

Cada tecla ocupará cuatro direcciones consecutivas.
D+0 : tecla1 (o 0 si no la hay)
D+1 : tecla2 (o 0 si no la hay)
D+2 : señales de reset y joystick, 0 si no hay
D+3 : modificadores y señales de usuario, 0 si no hay
*/

Qué efecto tiene en el core del spectrum si, por lo que sea, recibe un scancode correspondiente a una tecla no existente en el mapeado (es decir, todo a 0)? Lo ignora sin más o podría tener algún otro efecto no deseado?

Edito: He hecho pruebas y por lo visto las ignora.

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: Os presento Joy2PS2 para ZXUno

Mensaje por spark2k06 » 21 Dic 2016, 05:11

He conseguido hacer que funcione un teclado convencional al mismo tiempo que el addon Joy2PS2 :joystick: :D

Para empezar, el tema de las colisiones era inexistente. Revisando el código de PS/2 de Quest ya se ve que no se va a enviar nada si las lineas CLK y DATA no se encuentran en alto, o sea disponibles, y es de suponer que cualquier microcontrolador de teclado actuará de forma similar, llenando un buffer posiblemente en su caso:

//envio de datos ps/2 simulando reloj con delays.
void sendPS2(unsigned char code)
{

//Para continuar las líneas deben estar en alto
if (ps2Stat())
return;

...

Según este código si se encuentran en uso, directamente ignoraría los eventos. En este sentido, lo que sí que voy a hacer es crear una cola FIFO a modo de buffer para no perder ni una sola pulsación, enviandolas en cuanto se encuentren las lineas disponibles. De esta manera incluso podriamos usar dos Joy2PS2 para dos jugadores. En cuanto lo tenga bien probado, actualizo en github y os aviso :boingg:

Y volviendo al tema del teclado en combinación con el addon, he conseguido hacerlo funcionar utilizando tiempos normales de reloj y semireloj para los flancos, por lo visto, para que funcione bien la clave está en el tiempo de espera final:

//En us, reloj y semireloj, para los flancos
//zxuno v2 test15: CK1 = 240, CK2 = 480. Uso normal: CK1 = 20, CK2 = 40 microsegundos
//(revertir a normal cuando el core ps/2 del ZX-UNO se mejore)
#define CK1 20
#define CK2 40
...

//envio de datos ps/2 simulando reloj con delays.
void sendPS2(unsigned char code)
{

...
//_delay_us(CK2 * 3); //fin
_delay_us(2500);
}

He usado 2500us y parece que va bien... pero habría que jugar con distintos tiempos para ver cual es el optimo. El caso es que así, ya se puede trabajar bastante bien con el teclado al mismo tiempo. Por lo visto el problema se producía al trabajar con distintos reloj y semireloj de los que usa el teclado, y es que en cuanto entraba en juego este último todo se iba al garete. No obstante, yo estoy seguro que el teclado sigue escuchando al arduino y devuelve códigos 0xFE... pero he comprobado que en tal caso el ZXUno los ignoraría, así que todo parece en orden. Este cambio sí que lo he dejado subido en mi cuenta de github.

Otra ventaja de dejarlo con tiempos de reloj y semireloj normales, aunque aún no lo he probado, es que debería funcionar también conectándolo en un PC sin hacer ningún cambio.

Lo dicho, esto va viento en popa...

Edito para comentar que he probado con otro teclado y se sincroniza peor...por lo tanto va bien el asunto pero hay que seguir probando, no obstante ya sea desde el core o desde arduino, estoy seguro de que tiene solución. En resumen, es un problema de sincronismo.
Última edición por spark2k06 el 21 Dic 2016, 05:11, editado 1 vez en total.

Avatar de Usuario
Mejias3D
Mensajes: 429
Registrado: 06 Oct 2015, 23:01

Re: Os presento Joy2PS2 para ZXUno

Mensaje por Mejias3D » 21 Dic 2016, 15:11

spark2k06 escribió:[...]Según este código si se encuentran en uso, directamente ignoraría los eventos. En este sentido, lo que sí que voy a hacer es crear una cola FIFO a modo de buffer para no perder ni una sola pulsación, enviandolas en cuanto se encuentren las lineas disponibles. De esta manera incluso podriamos usar dos Joy2PS2 para dos jugadores. En cuanto lo tenga bien probado, actualizo en github y os aviso :boingg: [...]
Excelente, buen trabajo!

Ya me estoy imaginando tu sistema como nuevo estándar común para todos los cores de máquinas que tengan teclado (ordenadores y alguna consola, como la Videopac G7000 de Philips) o bien no tengan teclado pero tengan 2 puertos de Joystick, como ocurre con la mayoria de consolas!
:chocala!: :okidoki;

EDITO:
Ya tienes el ingreso en tu cuenta para mi pedido de un Joy2PS2

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: Os presento Joy2PS2 para ZXUno

Mensaje por spark2k06 » 21 Dic 2016, 17:49

Mejias3D escribió: Excelente, buen trabajo!

Ya me estoy imaginando tu sistema como nuevo estándar común para todos los cores de máquinas que tengan teclado (ordenadores y alguna consola, como la Videopac G7000 de Philips) o bien no tengan teclado pero tengan 2 puertos de Joystick, como ocurre con la mayoria de consolas!
:chocala!: :okidoki;
Esa es la idea, como comente en el otro hilo, yo por ejemplo me estoy construyendo una minibartop cuyo sistema principal será una raspberry pi 3, pero también llevará dentro un Joy2PS2 alimentado por el microUSB del mismo y con las dos salidas de PS/2 hacia el exterior para conectar al ZXUno y autoalimentarlo por el propio PS/2.

Quedan cosas por pulir y cores que habría que adaptar para manejarlos con este addon, poco a poco ... :teclando..:
Mejias3D escribió: EDITO:
Ya tienes el ingreso en tu cuenta para mi pedido de un Joy2PS2
Gracias, pago comprobado.
Adjuntos
IMG_20161221_154158.jpg

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: Os presento Joy2PS2 para ZXUno

Mensaje por spark2k06 » 21 Dic 2016, 18:55

Por cierto, he pedido unos pocos arduinos y componentes que necesitaré... en un mes aproximadamente habrá disponibilidad de nuevo, eso sí, de momento para la revision 1.

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: Os presento Joy2PS2 para ZXUno

Mensaje por spark2k06 » 23 Dic 2016, 17:18

Sigo con las pruebas, de momento los mejores tiempos con los que me va son 4 y 8 microsegundos (a eso hay que sumarle los tiempos de las instrucciones de arduino, que suma poco pero suma):

//En us, reloj y semireloj, para los flancos
//zxuno v2 test15: CK1 = 240, CK2 = 480. Uso normal: CK1 = 20, CK2 = 40 microsegundos
//(revertir a normal cuando el core ps/2 del ZX-UNO se mejore)
#define CK1 4
#define CK2 8

Queda claro que a tiempos mas cortos mejor se combina con un teclado convencional, aunque de vez en cuanto surge algún problema, pero en lineas generales trabaja bastante bien.

Otro efecto positivo de utilizar tiempos bajos es que puedes pulsar y soltar mas rápido los botones, detectándo mejor dichos cambios el ZXUno, por lo tanto sin teclado convencional externo usando las mismas líneas ya roza la perfección :D .

Código joy2ps2.ino actualizado.

Observaréis que he decidido utilizar un tiempo de espera final también corto, de 50 microsegundos, según he podido leer es suficiente:

...
//Bit de parada
ps2Mode(PS2_DAT, HI);
_delay_us(CK1);
ps2Mode(PS2_CLK, LO);
_delay_us(CK2);
ps2Mode(PS2_CLK, HI);
_delay_us(CK1);

_delay_us(50); //fin

}

http://www.computer-engineering.org/ps2protocol/

Communication: Device-to-Host
The Data and Clock lines are both open collector. A resistor is connected between each line and +5V, so the idle state of the bus is high. When the keyboard or mouse wants to send information, it first checks the Clock line to make sure it's at a high logic level. If it's not, the host is inhibiting communication and the device must buffer any to-be-sent data until the host releases Clock. The Clock line must be continuously high for at least 50 microseconds before the device can begin to transmit its data.
Lo próximo que haré es un buffer mediante cola FIFO, para que se puedan usar dos Joy2PS2 al mismo tiempo, aunque ahora también es posible, pero no se pueden pulsar al mismo tiempo botones de ambos joystick, lo eventos de uno de ellos simplemente no se enviarían.

Avatar de Usuario
spark2k06
Mensajes: 1188
Registrado: 12 Feb 2016, 13:58

Re: Os presento Joy2PS2 para ZXUno

Mensaje por spark2k06 » 02 Feb 2017, 06:23

spark2k06 escribió:Lo próximo que haré es un buffer mediante cola FIFO, para que se puedan usar dos Joy2PS2 al mismo tiempo, aunque ahora también es posible, pero no se pueden pulsar al mismo tiempo botones de ambos joystick, lo eventos de uno de ellos simplemente no se enviarían.
Por fin he tenido la oportunidad de probar dos gamepad interconectando dos addon por el puente mediante cable PS/2, y se confirma el buen funcionamiento del buffer de eventos :) Con el anterior código, no funcionan bien, también lo he comprobado. De manera que, quien utilice el teclado basado en el código arduino de Quest, aconsejaría usar buffer para hacerlo compatible con este addon (u otros dispositivos de PS/2 basados en lo mismo).

Y a raíz de estas pruebas, he visto una cosa curiosa en el test de teclados de la BIOS, y es que si pulsas espacio y lo mantienes mientras pulsas cualquier dirección de los cursores, sale del test! ... curioso, lo podéis probar con un teclado convencional.
Adjuntos
IMG_20170202_055154.jpg

Responder