Construcción de adaptador Joystick a PS/2

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

Re: Construcción de adaptador Joystick a PS/2

Mensaje por spark2k06 » 28 Oct 2016, 17:54

neuro_999 escribió:Las pruebas que hice yo con la velocidad baja me salieron mal, pero era con el codigo ps2, x eso te preguntaba con ese codigo distinto basado en el de uart.
Seguire probando.
Veo que tienes la última versión, ya me contarás si te va bien ahora a la velocidad 20/40.

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

Re: Construcción de adaptador Joystick a PS/2

Mensaje por spark2k06 » 29 Oct 2016, 18:55

Estoy un poco atascado con el código, a ver si alguien me ayuda a ver una solución, os pongo aquí mismo el loop de arduino, si necesitáis algo mas decidme, pero es bastante descriptivo:

void loop()
{

if ((DB9_PINChanges = DB9_PIN ^ DB9_PINAux) != 0) // Esperamos a que se produzca un cambio en el estado del joystick.
{

DB9_PINAux = DB9_PIN; // Guardamos el estado actual del joystick.

if (CHECK_BIT(DB9_PINChanges, 0)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 0));
if (CHECK_BIT(DB9_PINChanges, 1)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 1));
if (CHECK_BIT(DB9_PINChanges, 2)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 2));
if (CHECK_BIT(DB9_PINChanges, 3)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 3));
if (CHECK_BIT(DB9_PINChanges, 4)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 4));
if (CHECK_BIT(DB9_PINChanges, 5)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 5));
if (CHECK_BIT(DB9_PINChanges, 6)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 6));
if (CHECK_BIT(DB9_PINChanges, 7)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 7));

if (DB9_PIN == 0b11100011) PressKey('1'); // Tecla 1 (Izquierda + Derecha + Boton 1) -> Select + Boton 1
if (DB9_PIN == 0b11010011) PressKey('2'); // Tecla 2 (Izquierda + Derecha + Boton 2) -> Select + Boton 2
if (DB9_PIN == 0b10110011) PressKey('3'); // Tecla 3 (Izquierda + Derecha + Boton 3) -> Select + Boton 3
if (DB9_PIN == 0b10110000) PressKey('4'); // Tecla 4 (Izquierda + Derecha + Boton 3) -> Start + Boton 3

if (DB9_PIN == 0b11110010) Reset();
if (DB9_PIN == 0b11110001) MasterReset();
if (DB9_PIN == 0b11100000) NMI();
if (DB9_PIN == 0b11010000) LOAD48K();

}

}

El caso es que funciona bien, pero a veces... si pulso muy rápido o combino algunas teclas, de vez en cuando se queda alguna pulsada aunque del joystick se encuentre soltada, no pasa siempre pero no se ya... me estoy volviendo un poco loco para solucionarlo. A ver si se te ocurre una solución, por ejemplo @Quest... autor de los primeros códigos de control de PS/2.

El keymapKempston, el resto son 0:

KEY_UP, //01 0b00000001
KEY_DOWN, //02 0b00000010
KEY_N, //03 0b00000011
KEY_LEFT, //04 0b00000100
KEY_RIGHT, //08 0b00001000
KEY_ESCAPE, //12 0b00001100
KEY_ENTER, //15 0b00001111
KEY_SPACE, //16 0b00010000
KEY_V, //32 0b00100000
KEY_B, //64 0b01000000

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Construcción de adaptador Joystick a PS/2

Mensaje por yombo » 29 Oct 2016, 19:19

spark2k06 escribió:Estoy un poco atascado con el código, a ver si alguien me ayuda a ver una solución, os pongo aquí mismo el loop de arduino, si necesitáis algo mas decidme, pero es bastante descriptivo:

void loop()
{

if ((DB9_PINChanges = DB9_PIN ^ DB9_PINAux) != 0) // Esperamos a que se produzca un cambio en el estado del joystick.
{

DB9_PINAux = DB9_PIN; // Guardamos el estado actual del joystick.

if (CHECK_BIT(DB9_PINChanges, 0)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 0));
if (CHECK_BIT(DB9_PINChanges, 1)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 1));
if (CHECK_BIT(DB9_PINChanges, 2)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 2));
if (CHECK_BIT(DB9_PINChanges, 3)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 3));
if (CHECK_BIT(DB9_PINChanges, 4)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 4));
if (CHECK_BIT(DB9_PINChanges, 5)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 5));
if (CHECK_BIT(DB9_PINChanges, 6)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 6));
if (CHECK_BIT(DB9_PINChanges, 7)) sendCodeMR(keymapKempston[DB9_PINChanges], CHECK_BIT(DB9_PIN, 7));

if (DB9_PIN == 0b11100011) PressKey('1'); // Tecla 1 (Izquierda + Derecha + Boton 1) -> Select + Boton 1
if (DB9_PIN == 0b11010011) PressKey('2'); // Tecla 2 (Izquierda + Derecha + Boton 2) -> Select + Boton 2
if (DB9_PIN == 0b10110011) PressKey('3'); // Tecla 3 (Izquierda + Derecha + Boton 3) -> Select + Boton 3
if (DB9_PIN == 0b10110000) PressKey('4'); // Tecla 4 (Izquierda + Derecha + Boton 3) -> Start + Boton 3

if (DB9_PIN == 0b11110010) Reset();
if (DB9_PIN == 0b11110001) MasterReset();
if (DB9_PIN == 0b11100000) NMI();
if (DB9_PIN == 0b11010000) LOAD48K();

}

}

El caso es que funciona bien, pero a veces... si pulso muy rápido o combino algunas teclas, de vez en cuando se queda alguna pulsada aunque del joystick se encuentre soltada, no pasa siempre pero no se ya... me estoy volviendo un poco loco para solucionarlo. A ver si se te ocurre una solución, por ejemplo @Quest... autor de los primeros códigos de control de PS/2.

El keymapKempston, el resto son 0:

KEY_UP, //01 0b00000001
KEY_DOWN, //02 0b00000010
KEY_N, //03 0b00000011
KEY_LEFT, //04 0b00000100
KEY_RIGHT, //08 0b00001000
KEY_ESCAPE, //12 0b00001100
KEY_ENTER, //15 0b00001111
KEY_SPACE, //16 0b00010000
KEY_V, //32 0b00100000
KEY_B, //64 0b01000000
Quizá es porque lees dos veces los pines, prueba con esto:

Código: Seleccionar todo

void loop()
{

temp = DB9_PIN

if ((DB9_PINChanges = temp ^ DB9_PINAux) != 0) // Esperamos a que se produzca un cambio en el estado del joystick.
{

DB9_PINAux = temp; // Guardamos el estado actual del joystick.


Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Construcción de adaptador Joystick a PS/2

Mensaje por yombo » 29 Oct 2016, 22:04

spark2k06 escribió:funciona mucho mejor, y además tiene toda su lógica. Muchas gracias @yombo :okidoki;
Me alegro! :chocala!:

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

Re: Construcción de adaptador Joystick a PS/2

Mensaje por spark2k06 » 30 Oct 2016, 21:53

Código compartido en github:

https://github.com/spark2k06/zxuno/tree/master/joy2ps2

He modificado los mapeos, a los que me han parecido mas lógicos, y he añadido la posibilidad de intercambiar los cursores por OPQA y viceversa en cualquier momento desde el botón 4 del joystick.

Próximamente, me pondré a preparar los gerbers del diseño final del adaptador... de momento ya tengo pedido un arduino nano bien barato a aliexpress, para facilitar el cambio del software fácilmente desde el USB del arduino y el cual conectaré a la PCB que prepare.

El mapeo queda así:

Espacio (Boton 1)
V (Boton 2)
B (Boton 3)
Cambio de mapeo del PAD -> OPQA - Cursores (Boton 4)

Al inicio, se mapea en Cursores por defecto
1 (Select + Boton 1)

2 (Select + Boton 2)
3 (Select + Boton 3)
4 (Select + Boton 4)

ESC (Select)

Intro (Start)
F2 (Start + Boton 3)

NMI (Start + Boton 1) -> se cambia el mapeo del pad a Cursores

Load 128K, letra a letra (Start + Boton 2)
Reset (Select + Arriba) -> se cambia el mapeo del pad a Cursores
MasterReset (Select + Abajo) -> se cambia el mapeo del pad a Cursores

Si se os ocurren optimizaciones en el código, siempre serán bienvenidas.
Última edición por spark2k06 el 30 Oct 2016, 21:53, editado 1 vez en total.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Construcción de adaptador Joystick a PS/2

Mensaje por yombo » 30 Oct 2016, 22:25

Hay un fallito sin importancia, que puede ocasionar una pulsación de tecla al empezar: La variable temp no tiene un valor inicial asignado cuando se usa por primera vez en main()

Luego, una optimización más irrelevante aún es en sendPS2(), donde calculas el bit de paridad para cada bit, cuando basta para el último. Esto lo puedes hacer creando otra variable local copia de 'code' para shiftear, y usar el dato original al calcular la paridad, ya fuera del bucle de los 8 bits.

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

Re: Construcción de adaptador Joystick a PS/2

Mensaje por spark2k06 » 31 Oct 2016, 04:48

yombo escribió:Hay un fallito sin importancia, que puede ocasionar una pulsación de tecla al empezar: La variable temp no tiene un valor inicial asignado cuando se usa por primera vez en main()
Hecho! :okidoki;
yombo escribió:Luego, una optimización más irrelevante aún es en sendPS2(), donde calculas el bit de paridad para cada bit, cuando basta para el último. Esto lo puedes hacer creando otra variable local copia de 'code' para shiftear, y usar el dato original al calcular la paridad, ya fuera del bucle de los 8 bits.
Estás registrado en github? Creo entenderte con el cambio pero prefiero ver la función tal cual la propones, ésta es una función original de Quest, no mía. Si estas registrado, puedes hacer un pull request? De lo contrario, puedes ponerme aquí mismo el código de la función con tu propuesta? :gracias!:

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

Re: Construcción de adaptador Joystick a PS/2

Mensaje por spark2k06 » 31 Oct 2016, 08:42

Para el diseño final del Joystick, he realizado un par de cambios, de manera que facilite algunas combinaciones:

* Ahora Start será Arriba + Abajo en lugar de Arriba + Abajo + Izquierda + Derecha
* Ahora Botón 4 será Arriba + Abajo + Izquierda + Derecha en lugar de Arriba + Abajo

De esta manera, el mapeo, ya espero que definitivo... será así:

* Espacio (Boton 1)
* V (Boton 2)
* B (Boton 3)
* Cambio de mapeo del PAD -> OPQA - Cursores - OPQA ... (Boton 4)
---> Al conectar el ZXUno, se mapea en Cursores por defecto

* 1 (Select + Boton 1)
* 2 (Select + Boton 2)
* 3 (Select + Boton 3)
* 4 (Select + Boton 4)

* ESC (Select)
* Intro (Start)
* F2 (Start + Boton 3)

* NMI (Start + Boton 1) -> provoca cambio del pad a Cursores
* Load 128K (letra a letra) (Start + Izquierda)
* Load 48K (L + "") (Start + Derecha)
* Reset (Select + Arriba) -> provoca cambio del pad a Cursores
* MasterReset (Select + Abajo) -> provoca cambio del pad a Cursores

He modificado los fuentes en github para tener en cuenta estos cambios de diseño del Joystick.

Avatar de Usuario
Quest
Mensajes: 900
Registrado: 27 Sep 2015, 00:20

Re: Construcción de adaptador Joystick a PS/2

Mensaje por Quest » 31 Oct 2016, 09:22

Me paso por aquí para comentar solamente que sigo de vez en cuando el hilo, pero no intervengo porque realmente no tengo mucho tiempo ahora. Es genial ver cómo este tema avanza :) , ya comenté hace tiempo que el código era muy "temprano" y que posiblemente contenía bugs y mucho margen de mejora (de hecho no había hecho prácticamente nada en Arduinos antes). Así que agradezco de verdad este trabajo. Cuando tenga más tiempo, puedo ir añadiendo las mejoras vistas por aquí para obtener un conversor lo más funcional y correcto posible.

:gracias!: :chocala!:
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder