Construcción de adaptador Joystick a PS/2

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

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

Mensaje por mcleod_ideafix » 25 Oct 2016, 09:15

yombo escribió:Yo no estaría muy seguro. Los Arduino (Atmega) no tienen salidas en colector abierto. Recuerdo haber medido 5V en pines configurados como entrada.
Según este datasheet, sí. En la página 98 aparece un esquema de uno de los pines de GPIO y se puede ver cómo tiene un driver que lo puede dejar en alta impedancia, y una resistencia de pullup interna con un mosfet para desactivarla.

En la sección 18.2.1 puede leerse esto:
18.2.1.
Configuring the Pin
Each port pin consists of three register bits: DDxn, PORTxn, and PINxn. As shown in the Register Description, the DDxn bits are accessed at the DDRx I/O address, the PORTxn bits at the PORTx I/O address, and the PINxn bits at the PINx I/O address.
The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written to '1', Pxn is configured as an output pin. If DDxn is written to '0', Pxn is configured as an input pin.
If PORTxn is written to '1' when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written to '0' or the pin has to be configured as an output pin. The port pins are tri-stated when reset condition becomes active, even if no clocks are running.
If PORTxn is written to '1' when the pin is configured as an output pin, the port pin is driven high. If PORTxn is written logic zero when the pin is configured as an output pin, the port pin is driven low.
Por lo que entiendo que para que un pin se comporte como una salida en colector abierto lo que se hace es escribir un 0 en él, y luego para conmutar entre el estado "0" y el estado "Z" lo que se hace es configurarlo como salida o como entrada, respectivamente. En nuestro caso no interesa dejar activa la resitencia de pullup porque eso metería 5V a la FPGA. El pullup (a 3.3V) ya lo pone el ZX-UNO.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

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

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

Mensaje por spark2k06 » 25 Oct 2016, 09:51

mcleod_ideafix escribió:Por lo que entiendo que para que un pin se comporte como una salida en colector abierto lo que se hace es escribir un 0 en él, y luego para conmutar entre el estado "0" y el estado "Z" lo que se hace es configurarlo como salida o como entrada, respectivamente. En nuestro caso no interesa dejar activa la resitencia de pullup porque eso metería 5V a la FPGA. El pullup (a 3.3V) ya lo pone el ZX-UNO.
Precisamente es lo que veo que pretendía hacer Quest en su código durante la inicialización:

void ps2Init()
{
//ponemos en alto ambas señales
PS2_PORT &= ~_BV(PS2_DAT); //A 0
PS2_PORT &= ~_BV(PS2_DAT); //A 0
ps2Mode(PS2_DAT, HI);
ps2Mode(PS2_CLK, HI);
}


Pero veo que puede haber un bug, la segunda línea es exactamente igual que la primera, y me imagino que pretendía poner a 0 el valor de PS2_CLK... si no lo pone a 0, esta podría quedar en pullup.

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

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

Mensaje por spark2k06 » 25 Oct 2016, 12:41

No obstante, veo que hace una comprobación en sendPS2 viendo que las lineas estén en alto(a 0 y como input) antes de continuar... parece entonces que por defecto, al arrancar el arduino la línea de CLK ya se encuentra en alto y pasa desapercibido este "fallo"... porque a mí sí me enviaba los códigos correctamente... vamos solo faltaría polímetro en mano ver que todo está en orden cuando se opera de esta forma, pero podemos intuir que sí.

void sendPS2(unsigned char code)
{

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

uint8_t ps2Stat()
{
if (!(PS2_PIN & (1<<PS2_CLK)))
return 1;
if (!(PS2_PIN & (1<<PS2_DAT)))
return 1;

return 0;
}

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

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

Mensaje por yombo » 25 Oct 2016, 12:49

spark2k06 escribió:Me dejas mosqueado,
Lo siento :-), yo sólo comento lo que medí ;-)

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

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

Mensaje por yombo » 25 Oct 2016, 12:57

mcleod_ideafix escribió:
yombo escribió:Es que he estado indagando en el código verilog y por lo que veo esta configuración se realiza desde el Z80, y no he encontrado dónde se hace exactamente.
En la BIOS. Si te fijas, cuando el ordenador arranca, en un momento determinado se enciende Num Lock. Eso lo hace la BIOS para indicar que el teclado ha sido inicializado. En rigor, la mayoría de teclados no requiere inicialización, pero algunos sí, y Quest incorporó esta inicialización. Si conectas un teclado y el joystick PS/2, el joystick simplemente puede ignorar cualquier comando que venga por el puerto PS/2. Su única misión es enviar scancodes.

Si en lugar de un teclado y un joystick lo que se conectan son dos teclados completos, en un PC seguramente haya colisiones en la inicialización. En el ZX-UNO puede que no, pero la verdad es que no tengo ni idea de lo que podría pasar :D
He mirado en la BIOS y me parece entender que se envían varios bytes de configuración al teclado, y que no hay respuesta por parte de éste. Si esto es correcto, entonces no habría ningún problema en conectar dos teclados, y funcionaría (evitando pulsar teclas en ambos a la vez)
Última edición por yombo el 25 Oct 2016, 13:05, editado 1 vez en total.

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

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

Mensaje por spark2k06 » 25 Oct 2016, 13:05

yombo escribió:
spark2k06 escribió:Me dejas mosqueado,
Lo siento :-), yo sólo comento lo que medí ;-)
Y te lo agradezco, por lo que he ido viendo y he comentado en este hilo del código de Quest... al parecer antes de ponerlo como Input los pone a 0 (en alto que le llama), por lo que no habría problema ya que no hay pullup, y por tanto no debería dar voltaje de 5V... aún así en cuanto pueda lo compruebo.

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

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

Mensaje por yombo » 25 Oct 2016, 13:11

spark2k06 escribió:
yombo escribió:
spark2k06 escribió:Me dejas mosqueado,
Lo siento :-), yo sólo comento lo que medí ;-)
Y te lo agradezco, por lo que he ido viendo y he comentado en este hilo del código de Quest... al parecer antes de ponerlo como Input los pone a 0 (en alto que le llama), por lo que no habría problema ya que no hay pullup, y por tanto no debería dar voltaje de 5V... aún así en cuanto pueda lo compruebo.
Igual yo activé el pullup cuando medí aquello, no lo recuerdo :-P


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

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

Mensaje por spark2k06 » 26 Oct 2016, 06:06

Las pruebas han dado los siguientes resultados:

Tensión de entrada: 5,06V

1. Output LO -> 0V, entre GND y A2/A3 existe una pequeñísima resistencia de 22 ohmios. (Funcionamiento en PS/2 -> LO)

2. Output HI -> 5,06V

3. Input HI pullup -> 4,86V

4. Input HI-Z -> 0,06V (Funcionamiento en PS/2 -> HI-Z)


Como vemos, en el modo de funcionamiento PS/2 como mucho entran 0,06V en HI-Z a la FPGA, algo insignificante.

Voy terminando por tanto el diseño del invento.

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

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

Mensaje por mcleod_ideafix » 26 Oct 2016, 09:57

spark2k06 escribió:4. Input HI-Z -> 0,06V (Funcionamiento en PS/2 -> HI-Z)
Estupendo! Si acaso, comprueba que realmente eso es Hi-Z y no un estado bajo. Pon una resistencia externa de unos 10K entre ese pin y 3.3V (si tienes una salida de 3.3V en tu Arduino, si no, 5V) y comprueba que ahora sí mides la tensión de pullup con el pin en ese estado.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder