Karoshi MSX Community
06 de Julio de 2021, 12:53:31 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: Progamacion puerto de joystick  (Leído 7784 veces)
0 Usuarios y 1 Visitante están viendo este tema.
mohai
Karoshi Fan
**
Mensajes: 80



« : 16 de Julio de 2009, 04:29:00 pm »

Buenas,

lo he puesto en el foro general, pero lo repito aquí a ver si hay más suerte.

Me gustaría saber cómo se comporta el puerto de joystick en lectura/escritura. En concreto los pines 6 y 7. Son pines de entada y salida.
Sé que para leer/escribir en un puerto de joystick, primero se escribe en el registro 15 del PSG y luego se lee el registro 14 el estado.

Segun la página del MAP, el registro 15 (escritura), funciona de la sigiuente manera:

PSG I/O port B (r#15) – write/read

Bit Description Comment
0 Output joystick port 1, pin 6 (set 1 for input)
1 Output joystick port 1, pin 7 (set 1 for input)
2 Output joystick port 2, pin 6 (set 1 for input)
3 Output joystick port 2, pin 7 (set 1 for input)
4 Output joystick port 1, pin 8 
5 Output joystick port 2, pin 8 
6 Joystick input selection, for r#14 inputs (1=port 2)
7 Kana led control (1=off)

Pero según esto, sólo podríamos escribir ceros (o valores en bajo) en los pines 6 y 7. ¿Al poner un 1 en el registro 15, el pin pasa a un estado de "alta impedancia" o algo asi y se prepara para recibir datos?

Me pregunto si esto es cierto, es decir, ¿hay que poner el bit correspondiente a 1 para leer el pin 6 o 7 o el puerto siempre es legible, independientemente de lo que escribamos y en realidad se pueden escribir ceros o unos para generar el estado (alto o bajo) que queramos? (espero no haberos liado)

Lo que quiero es controlar el estado de estos pines (6 y 7).


En el proyecto de Tsujikawa para controlar tarjetas MMC desde el puerto de joystick(http://www.hat.hi-ho.ne.jp/tujikawa/mmc/mmc.html), monta un chip 74HC14 y los pines 6 y 7 (usados como OUT) los invierte 2 veces. ¿Porqué lo hace así? ¿Es para crear un buffer, mantener el bit escrito o para retardar el pulso?

Salu2,
IvI
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #1 : 17 de Julio de 2009, 07:45:07 am »

La verdad es que no tengo ni idea. Lo único que leí hace tiempo acerca de transferencias de datos por el puerto de joystick es la información del MAP acerca del Joynet, con esquemas y demás. Tal vez te de una pista, de todas formas si dices que ya has chequeado el MAP pues no se me ocurre más, la verdad es que nunca he hecho pruebas de ese tipo...

Anyone?
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #2 : 18 de Julio de 2009, 12:58:32 am »

Los pines 6 y 7 tienen unas resistencias de pull-up que hacen que estén a nivel alto. Los pines del puerto B (bits del reg.15) están conectados a los 6 y 7 a través de un buffer, que hace que si a su entrada hay un nivel bajo a la salida también, pero si hay un nivel alto en la entrada la salida está en alta impedancia. Por eso tienen que estar a 1 para poder leer los disparadores por el puerto A (reg. 14), para que no interfiera con la entrada del joystick. Si están a 0 fuerzan la salida a nivel bajo. Esto hace que en la lectura por el reg.14 lea como si estuviese pulsado el disparador (bueno, esto lo supongo yo, que no lo he probado).

En resumen, si quieres mandar datos lo haces por el bit del reg.15 directamente. Si quieres recibir datos por el reg.14, el bit correspondiente del reg.15 ha de estar a 1.

Espero que no me haya liado en exceso al soltar esta parrafada   Roll Eyes
(Esta explicación me la supongo yo al mirar el los esquemas del vg8020, que no lo he probado. Y como además mis conocimienos de electrónica son bastante rudimentarios no sería raro que hubiese dicho alguna burrada bien gorda.  Joe )

En lo del Tsujikawa, por lo que me ha parecido entender en la tradución automática, debe usar el 74hc14 como buffer para adaptar tensiones o algo así, ya que dice que al principio usó una resistencia y esto le daba problemas y resultaba inestable, o algo así  Tongue.
En línea

sempre fun un valente corredor
mohai
Karoshi Fan
**
Mensajes: 80



« Respuesta #3 : 18 de Julio de 2009, 01:10:17 pm »

Por lo que he entendido, despues de revisar los fuentes y los esquemas del Joynet, es que los pines 6 y 7 pueden efectivamente, generar estados altos y bajos y son de entrada y salida, como bien dicen los manuales (Será posible que el Technical Hanbook no diga nada???  Huh).
Lo que debe pasar es que al escribir un 1, el pin correspondiente manda un "pulso" y pasa a estado de lectura, para leer el boton de disparo, pero al escribir un 0, el pin pasa a estado bajo y se queda en ese estado, por eso Tsujikawa puso el 7414, para que se ese "pulso" durara un poco más (supongo).
En el Joynet no usan circuitería alguna, por lo que deduzco que ese estado de "alta impedancia" es suficiente para hacer que el puerto del otro MSX lea un 1.

O tal vez lo que hace el puerto de joystick es comportarse siempre como entrada/salida, mostrando el valor que se le escribe en el registro 14 (1 o 0) y esperando siempre una entrada (de ahí que haya que escribir un 1, para leer el disparo, que es un 0, pero entonces también se podría invertir su comportamiento, leyendo unos en vez de ceros...).

Lástima no tener un osciloscopio para ver que pasa realmente aquí. Ya haré pruebas a ver que tal...
En línea
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #4 : 19 de Julio de 2009, 05:44:55 pm »

El PSG tiene dos puertos físicos de entrada/salida de 8 pines cada uno que son denominados puerto A y puerto B. Estos se corresponden con los registros 14 y 15, cada pin con su bit correspondiente. Cada uno de estos puertos puede ser configurado como de entrada o de salida mediante los 2 bits más altos del reg. 7, pero en el MSX está definido que el A sea de entrada y el B de salida.

Los pines del joystick que se corresponden con ARRIBA, ABAJO, IZQUIERDA y DERECHA, están conectados al puerto A, de lectura.
Los pines 8 de ambos joysticks, que son los de STROBE, están conectados al puerto B, de salida.
Los pines de los disparadores, el 6 y el 7, están conectados a ambos puertos, al A y al B. Para que la salida del puerto B no interfiera con la lectura del puerto A en estos pines, la primera es pasada a través de un buffer. De esta manera si el pin del puerto B está a 1 no afecta al estado del pin del joystick, pero si está a 0 sí que fuerza a 0 el pin del joystick.

Todos los pines de entrada de los joysticks están puestos a nivel alto (a 1, +5v.) a través de unas resistencias de pull-up. Si se cierra el contacto correspondiente a las direcciones o a los disparadores se conectan a GND (se ponen a 0). Es por eso que la lectura de los joysticks está invertida, 1 es no pulsado y 0 es pulsado.

Resumiendo:
- los pines 6 y 7 están normalmente en estado alto (a 1, +5v.)
- si se pulsa el disparo del joystick el pin es conectado a GND y se pone en estado bajo (a 0)
- el puerto A (reg. 14) siempre lee el estado de los pines 6 y 7 del joystick, si están a 1 (+5v.) o a 0 (GND).
- si el pin del puerto B (reg. 15) está a 0 fuerza que el pin del joystick pase a estado bajo (a 0, GND), si está a 1 no le afecta.

La BIOS cuando hace sus cosas en cada interrupción pone los bits de los pines 6 y 7 a 1, por eso puede parecer que es un pulso lo que envía cuando escribes en ellos. Se puede hacer una prueba deshabilitando las interrupciones y trasteando con el reg. 15. No necesitas un osciloscopio para eso, con un simple multímetro lo puedes comprobar.

Bueno, espero no haber sido muy lioso al escribir este tocho.  Roll Eyes

un saludo.
En línea

sempre fun un valente corredor
mohai
Karoshi Fan
**
Mensajes: 80



« Respuesta #5 : 20 de Julio de 2009, 12:55:55 pm »

Explicación perfecta.
Resumiendo, que si se manda un 1 a los pines 6 y 7, los pines muestran un estado alto y, a la vez, se puede leer el disparador, porque el interruptor lo conecta con MASA y bla, bla, bla... y, si se le manda un 0, se pone en estado bajo y el disparador no se puede leer, porque lo conecta a MASA y no cambia el estado...
Pero entiendo que tambien se podría hacer al revés (aunque se salga de la norma y pasando del BIOS, por supuesto), es decir, ponerlos a 0 y leer un 1.
« Última modificación: 20 de Julio de 2009, 02:38:48 pm por mohai » En línea
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #6 : 20 de Julio de 2009, 04:14:02 pm »

Pero entiendo que tambien se podría hacer al revés (aunque se salga de la norma y pasando del BIOS, por supuesto), es decir, ponerlos a 0 y leer un 1.
No, si el bit del puerto B está a 0 por el bit del puerto A siempre vas a leer un 0. Y si le metes un 1 desde fuera (+5v.) lo más seguro es que saques un bonito cortocircuito. Es mejor que uses cada pin sólo de una manera, como entrada o como salida. Si lo que quieres es esperar por "unos", pues pones lo que sea que le conectes al otro lado a 0 hasta que le llegue el momento y listo.
Por cierto, ¿que andas pergeñando con todo esto, si se puede saber, eh? Wink
En línea

sempre fun un valente corredor
mohai
Karoshi Fan
**
Mensajes: 80



« Respuesta #7 : 21 de Julio de 2009, 02:36:34 pm »

Pero entiendo que tambien se podría hacer al revés (aunque se salga de la norma y pasando del BIOS, por supuesto), es decir, ponerlos a 0 y leer un 1.
No, si el bit del puerto B está a 0 por el bit del puerto A siempre vas a leer un 0. Y si le metes un 1 desde fuera (+5v.) lo más seguro es que saques un bonito cortocircuito. Es mejor que uses cada pin sólo de una manera, como entrada o como salida. Si lo que quieres es esperar por "unos", pues pones lo que sea que le conectes al otro lado a 0 hasta que le llegue el momento y listo.
Por cierto, ¿que andas pergeñando con todo esto, si se puede saber, eh? Wink

Ya que preguntas, lo que quiero hacer es unos mandos tipo "Buzz".
En teoría, tengo resuelta la parte de selección de mando (hasta Cool y la lectura de los botones (5 por mando), peeeero, si quiero que cada mando tenga una lucecita y evitar cortos al mismo tiempo, tengo que saber como se comportan los pines 6 y 7 (para encender o apagar el led de cada mando), pues los tengo que usar como bidireccionales, porque si no no hay pines suficientes.
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #8 : 21 de Julio de 2009, 04:05:05 pm »

Que interesante  Shocked, imagino que querrás que en cada momento puedan estar encendidos cualquier número de mandos, ¿No?, si es uno cada vez se podía intentar simplificar algo, si no, con algunos componentes se podría solucionar. ¿Podrías contar como conectas los mandos y el protocolo que estás usando para seleccionarlo?
En línea
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #9 : 21 de Julio de 2009, 04:12:30 pm »

Bien, supongo que entonces usarás las tres salidas disponibles para seleccionar el mando a leer, no? Échale un ojo a
esto. Con un chip de este tipo podrías seleccionar el mando con sólo una salida. Vas enviando pulsos y a cada ciclo el chip va activando una de sus salidas, hasta 10. Si usas una entrada del MSX como comprobador de que el mando seleccionado es el primero, para asegurarte, te quedan libres las otras cinco entradas que necesitas.
Espero que te sirva de algo.

un saludo.
En línea

sempre fun un valente corredor
mohai
Karoshi Fan
**
Mensajes: 80



« Respuesta #10 : 22 de Julio de 2009, 11:55:53 am »

Que interesante  Shocked, imagino que querrás que en cada momento puedan estar encendidos cualquier número de mandos, ¿No?, si es uno cada vez se podía intentar simplificar algo, si no, con algunos componentes se podría solucionar. ¿Podrías contar como conectas los mandos y el protocolo que estás usando para seleccionarlo?


Lo que quiero es poder controlar cada mando por separado, poder encender o apagar cada mando independientemente. Luego, de las combinaciones se encargará el software.

Bien, supongo que entonces usarás las tres salidas disponibles para seleccionar el mando a leer, no? Échale un ojo a
esto. Con un chip de este tipo podrías seleccionar el mando con sólo una salida. Vas enviando pulsos y a cada ciclo el chip va activando una de sus salidas, hasta 10. Si usas una entrada del MSX como comprobador de que el mando seleccionado es el primero, para asegurarte, te quedan libres las otras cinco entradas que necesitas.
Espero que te sirva de algo.

Interesante lo de ese chip, pero no es lo que estaba buscando. Quiero mantener el circuito lo más sencillo posible y que la programación también lo sea.

Lo que tengo pensado es usar un 74138, que viene perfecto para ello.

Como este chip tiene 3 entradas y 8 salidas, lo que haré será conectar sólo 2 bits (pines 7 y 8 ) del puerto 1 para la selección de hasta 4 mandos. Opcionalmente, si conectamos el puerto de joystick 2, obtenemos el tercer bit para los otros 4 mandos.
Luego, la señal de selección (a nivel bajo) la uso como masa de cada mando, igual que muchos joysticks usan el pin 8 como masa.

La teoría es que si pongo un led conectado por un lado a esta "masa" y por el otro al pin 6, al pasar este a estado alto o bajo, se encenderá o se apagará. Esto tiene la desventaja de que el led se puede apagar si pulsamos el disparo, pero es un detalle sin importancia.

Luego el software se encargará de hacer los efectos de luces que hagan falta y leer o no los disparadores.

P.D.: Ya que sobran bits, se me está ocurriendo añadir un vibrador en cada mando (¿Por qué los mandos del Buzz se llaman Buzzers si no vibran  Huh )
« Última modificación: 22 de Julio de 2009, 12:01:55 pm por mohai » En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #11 : 22 de Julio de 2009, 03:15:27 pm »

Con el decodificador de 3 a 8 irá bien para un unico mando encendido, pero como sólo puedes tener una línea seleccionada cada vez, si quieres tener más de uno encendido se verá menos, a no ser que siempre estés haciendo el poling para que todos luzcan igual, pero con 1/8 del tiempo se notará el parpadeo además de verse poco.

Lo podrías arreglar con un algún driver y condensadores, pero ya complicas un poco el circuito...
En línea
mohai
Karoshi Fan
**
Mensajes: 80



« Respuesta #12 : 23 de Julio de 2009, 03:22:53 pm »

Con el decodificador de 3 a 8 irá bien para un unico mando encendido, pero como sólo puedes tener una línea seleccionada cada vez, si quieres tener más de uno encendido se verá menos, a no ser que siempre estés haciendo el poling para que todos luzcan igual, pero con 1/8 del tiempo se notará el parpadeo además de verse poco.

Lo podrías arreglar con un algún driver y condensadores, pero ya complicas un poco el circuito...

Condensadores ... eso suena bien.
El parpadeo, casi seguro que se dá. No me imagino la forma de seleccionar más de un mando a la vez, porque en los puertos de joystick no hay pines suficientes.
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #13 : 23 de Julio de 2009, 05:03:14 pm »

Con el decodificador de 3 a 8 irá bien para un unico mando encendido, pero como sólo puedes tener una línea seleccionada cada vez, si quieres tener más de uno encendido se verá menos, a no ser que siempre estés haciendo el poling para que todos luzcan igual, pero con 1/8 del tiempo se notará el parpadeo además de verse poco.

Lo podrías arreglar con un algún driver y condensadores, pero ya complicas un poco el circuito...

Condensadores ... eso suena bien.
El parpadeo, casi seguro que se dá. No me imagino la forma de seleccionar más de un mando a la vez, porque en los puertos de joystick no hay pines suficientes.

A mí se me ha ocurrido hacerlo así: como tienes cuatro pines de salida, usas 3 para seleccionar el mando con la ayuda del decodificador, y el 4º para indicar si el mando se enciende o no (Si no, siempre habría uno encendido), en cada interrupción del Z80 (por ejemplo) incrementas el mando seleccionado, y pones el 4º en on/off para indidicar el estado del que estás seleccionando. Con este sistema, a cada mando le llega su estado cada 0.16 segundos (a 50Hz), y lo que habría que añadir algo es para que la señal se mantuviera lo suficientemente alta este tiempo... Así, podrías hacer fácilmente lo que quisieras con cada mando y no se apagaría el led al pulsar el botón. Como desventajas, necesitarías que llegaran 3 cables al Joystick, y tendrías que ocupar los dos puertos de Joystick aunque sólo fueras a conectar 4 mandos.

También, te puedes plantear usar otros conectrores: Con uno de joystick y el de impresora tendrías solucionado todos los problemas de entrada y salida, sin parpadeos ni apenas componente adicionales. Y si quieres ir a por todas pues un a un slot, necesitarás algunos componentes más, pero tendrás control absoluto con un sólo conector...

Saluto
En línea
mohai
Karoshi Fan
**
Mensajes: 80



« Respuesta #14 : 24 de Julio de 2009, 01:41:13 pm »

A mí se me ha ocurrido hacerlo así: como tienes cuatro pines de salida, usas 3 para seleccionar el mando con la ayuda del decodificador, y el 4º para indicar si el mando se enciende o no (Si no, siempre habría uno encendido), en cada interrupción del Z80 (por ejemplo) incrementas el mando seleccionado, y pones el 4º en on/off para indidicar el estado del que estás seleccionando. Con este sistema, a cada mando le llega su estado cada 0.16 segundos (a 50Hz), y lo que habría que añadir algo es para que la señal se mantuviera lo suficientemente alta este tiempo... Así, podrías hacer fácilmente lo que quisieras con cada mando y no se apagaría el led al pulsar el botón. Como desventajas, necesitarías que llegaran 3 cables al Joystick, y tendrías que ocupar los dos puertos de Joystick aunque sólo fueras a conectar 4 mandos.

No, si no te creas que no le he dado vueltas al asunto. Usando los 2 puertos de joystick hay más pines disponibles y la cosa se hace mucho más fácil, pero si usas uno solo te ahorras un conector y un cable. Total, ¿cuantas veces se podría reunir a 8 jugadores a la vez?.
El hacerlo lo más sencillo posible es para abaratar costes al máximo.

También, te puedes plantear usar otros conectrores: Con uno de joystick y el de impresora tendrías solucionado todos los problemas de entrada y salida, sin parpadeos ni apenas componente adicionales. Y si quieres ir a por todas pues un a un slot, necesitarás algunos componentes más, pero tendrás control absoluto con un sólo conector...
El conector de impresora viene perfecto para tener un puerto de salida, peeeero, el conector es caro (eso si lo encuentras).
Por supuesto, si monto todo en un cartucho, puedo hacer lo que quiera sin problema, pero lo estaría complicando.

Una vez haya hecho pruebas y tal, quiero publicar los esquemas para que cada uno se pueda hacer el invento, por eso quiero que sea barato y sencillo.
En línea
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!