Autor Tema: leer datos pad psx  (Leído 5912 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
leer datos pad psx
« en: 08 de Mayo de 2006, 09:49:43 »
Hola soy estudiante de GS de electronica, y estoy realizando un proyecto de electronica, en el que manejo una estructura metalica mediante cilindros neumaticos, y controlandola con el pc, realizando con el un simulador, aora quiero leer los datos de un mando de psx, para mientras se juega a la play que la estrucutra se mueva segun nuestros movimientos he conseguido la informaciond e esta pagina:

http://sophiateam.undrgnd.free.fr/psx/index.html

Creo que solo necesito leer los bits de la patilla data, pero no se como hacerlo con el compilador ccs si podrían echarme una mano porfavor estoy muy apurado gracias

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
Re: leer datos pad psx
« Respuesta #1 en: 09 de Mayo de 2006, 02:54:23 »
Hola, no sabria darte el enlace ahora pero tienes tambien algo para los pics 16C765, vamos los PIC con USB viejillos
Saludos desde Logroño (España)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: leer datos pad psx
« Respuesta #2 en: 09 de Mayo de 2006, 17:22:45 »
Hola soy estudiante de GS de electronica, y estoy realizando un proyecto de electronica, en el que manejo una estructura metalica mediante cilindros neumaticos, y controlandola con el pc, realizando con el un simulador, aora quiero leer los datos de un mando de psx, para mientras se juega a la play que la estrucutra se mueva segun nuestros movimientos he conseguido la informaciond e esta pagina:

http://sophiateam.undrgnd.free.fr/psx/index.html

Creo que solo necesito leer los bits de la patilla data, pero no se como hacerlo con el compilador ccs si podrían echarme una mano porfavor estoy muy apurado gracias

Hola. Hace un tiempo estuve jugando con esto...Logre leer los datos de los joysticks de PSX, pero no es tan facil como leer el DATA solamente.
Es un protocolo MUY estructurado, y con rangos de tiempo bien precisos. Si no respetas los tiempos, se producen retrasos en la obtencion de datos, o bien ghosting(esto seria, por ejemplo, que cuando presionas el cuadrado, al leer el pad, el triangulo envia el mismo estado que el cuadrado, es decir,clona el valor,obviamente esto es erroneo) en los botones, o bien directamente lo peor...se cuelga el PAD de PSX .

Si bien tuve 100% de exito tomando los datos de joysticks "compatibles" con la PSX(es decir, no originales), no logre hacer funcionar correctamente los joysticks originales(es decir los SONY), ya que muchas veces se colgaban, o bien presentaban una demora insoportable al enviar los datos. Obviamente debe estar relacionado a un problema con los tiempos,y deberia ser de facil solucion.
He paralizado mi desarrollo, y aunque faltaba poco para el exito, igualmente lo he abandonado.
Otro problemita es que lo he programado en asembler, aunque si igualmente te interesa, aqui posteo el codigo:
Detalle: algunos cables(el data, por ejemplo, necesitaban pull ups externas de 4.7k, si no las colocas, obtendras resultados erroneos)aunque no recuerdo cuales necesitaban pull ups, y cuales no. Creo que solo eran 2 cables...
Código: ASM
  1. ;POR BRUNO FASCENDINI --- bipus24hs@hotmail.com
  2.  
  3.  
  4.         LIST            P=PIC16F877A
  5.         #include        <P16F877A.INC>
  6.  
  7.         __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _HS_OSC
  8.  
  9.         ERRORLEVEL      -302
  10.  
  11. ;DEFINICION DE PINES DEL PROTOCOLO DE LA PSX
  12.  
  13. JDATA                   EQU             0       ;(MARRON)
  14. COMMAND                 EQU             1       ;(NARANJA)
  15. ATTENTION               EQU             2       ;(AZUL)
  16. CLOCK                   EQU             3       ;(BLANCO)
  17. ACKNOWLEDGE             EQU             4       ;(VERDE)
  18. ;-                                              (ROJO)
  19. ;+                                              (AMARILLO)
  20.  
  21.  
  22. ;PORTB Y PORTC DEBEN IR TODOS CON LEDS EN MODO FUENTE(muestra las teclas presionadas)
  23.  
  24.  
  25. DATAPSX                 EQU             0X21
  26. CONT1                   EQU             0X22
  27. PSX5A                   EQU             0X25
  28. PDel0                   EQU             0X27
  29. PDel1                   EQU             0X28
  30. PDel2                   EQU             0X29
  31.  
  32.  
  33. SAT1STDATA              EQU             0X30
  34. SAT2NDDATA              EQU             0X31
  35.  
  36. PSXID                   EQU             0X40
  37.  
  38. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. ;Memoria EEPROM
  40. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41.  
  42.  
  43. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. ;VECTOR RESET
  45. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46.  
  47.                         ORG     0X0000
  48.                         GOTO INICIO
  49.  
  50. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. ;VECTOR INTERRUPCION
  52. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  53.  
  54.                         ORG     0X0004
  55.                         GOTO    INICIO
  56.  
  57. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. ;VECTOR INICIO PROGRAMA
  59. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60.  
  61.                         ORG     0X10           
  62.  
  63. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. ;CONFIG PUERTOS
  65. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66.  
  67.  
  68. INICIO                  BCF     STATUS,RP0
  69.                         BCF     STATUS,RP1
  70.        
  71.                         BSF     STATUS,RP0
  72.                         MOVLW   0x06                    ;PINS DEL PUERTO A Y PUERTO E TODOS DIGITALES.
  73.                         MOVWF   ADCON1
  74.                         MOVLW   B'00010001'
  75.                         MOVWF   TRISA                   ;PUERTO A RA0 = DATA(I) RA1= COMMAND(O) RA2= ATTENTION(O) RA3= CLOCK(O) RA4 = ACKNOWLEDGE(I) RA5= LED(O)
  76.  
  77.                         BCF     STATUS,RP0
  78.                         MOVLW   0XFF                    ;TODOS LOS PINES DE SALIDA EN ALTO( PARA QUE EL JOYSTICK NO RECIBA COMANDOS POR AHORA)
  79.                         MOVWF   PORTA
  80.                         BSF     STATUS,RP0
  81.                         CLRW
  82.                         MOVWF   TRISB                   ;RB0 = TH(I) RB1 = TR(I) RB2 = TL(O) RB3 = U (O) RB4 = D(O) RB5 = L(O) RB6 = R(O) RB7 = NO ASIGNADO
  83.  
  84.                         BCF     STATUS,RP0
  85.                         CLRF    PORTB                   ;HACER CREER A LA SATURN QUE NO HAY PERIFERICO CONECTADO, HASTA INICIALIZAR EL PROTOCOLO
  86.                         BSF     STATUS,RP0
  87.                         MOVLW   0x00
  88.                         MOVWF   TRISC
  89.                        
  90.                         BCF     STATUS,RP0
  91.                         CLRF    PORTC
  92.                         BSF     STATUS,RP0
  93.                         MOVLW   0X00
  94.                         MOVWF   TRISD
  95.                
  96.                         BCF     STATUS,RP0
  97.                         CLRF    PORTD
  98.                         BSF     STATUS,RP0
  99.                         MOVLW   0X00
  100.                         MOVWF   TRISE  
  101.                         BCF     STATUS,RP0
  102.                         BCF     STATUS,RP1
  103.  
  104. DEMORA                  movlw     .43       ; 1 set numero de repeticion  (C)
  105.                         movwf     PDel0     ; 1 |
  106. PLoop0                  movlw     .226      ; 1 set numero de repeticion  (B)
  107.                         movwf     PDel1     ; 1 |
  108. PLoop1                  movlw     .205      ; 1 set numero de repeticion  (A)
  109.                         movwf     PDel2     ; 1 |
  110. PLoop2                  clrwdt              ; 1 clear watchdog
  111.                         clrwdt              ; 1 ciclo delay
  112.                         decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
  113.                         goto      PLoop2    ; 2 no, loop
  114.                         decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
  115.                         goto      PLoop1    ; 2 no, loop
  116.                         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
  117.                         goto      PLoop0    ; 2 no, loop
  118.                         clrwdt              ; 1 ciclo delay
  119.  
  120. WAITPERCOMP             BSF     PORTA,ATTENTION
  121.                         CALL    SEND0X01
  122.                         CALL    SEND0X42
  123.                         CALL    GET0X5A
  124.                         CALL    BUSCATIPOPERIF
  125.                         CALL    GETYFILLHIGHBYTE
  126.                         CALL    GETYFILLLOWBYTE
  127.  
  128.  
  129.                         MOVF    SAT1STDATA,W
  130.                         MOVWF   PORTB
  131.  
  132.                         MOVF    SAT2NDDATA,W
  133.                         MOVWF   PORTC
  134.  
  135.                         GOTO    WAITPERCOMP
  136.  
  137. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. ;FUNCIONES:
  139. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  140.  
  141.  
  142. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  143.  
  144.  
  145. SEND0X01                        NOP
  146.                                 NOP
  147.                                 BCF     PORTA,ATTENTION         ;EXIGIR ATENCION DEL PAD
  148.  
  149.                                 MOVLW   0X08
  150.                                 MOVWF   CONT1
  151.  
  152.                                 MOVLW   0X01
  153.                                 MOVWF   DATAPSX
  154.  
  155. NEXT01                          BCF     PORTA,CLOCK             ;ENVIAR 0X01
  156.  
  157.                                 BSF     PORTA,COMMAND
  158.                                 BTFSS   DATAPSX,0
  159.                                 BCF     PORTA,COMMAND
  160.                                                
  161.                                 BSF     PORTA,CLOCK
  162.  
  163.                                 RRF     DATAPSX,F
  164.  
  165.                                 DECFSZ  CONT1,F
  166.                                 GOTO    NEXT01
  167.  
  168.  
  169.                                 BTFSC   PORTA,ACKNOWLEDGE
  170.                                 GOTO    $-1
  171.  
  172.                                 BTFSS   PORTA,ACKNOWLEDGE
  173.                                 GOTO    $-1
  174.  
  175.                                 RETURN
  176.  
  177. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  178.  
  179.  
  180. SEND0X42                        MOVLW   0X08                            ;ENVIAR 0X42 Y RECIBIR ID
  181.                                 MOVWF   CONT1
  182.                                
  183.                                 MOVLW   0X42
  184.                                 MOVWF   DATAPSX
  185.  
  186.  
  187. NEXTID                          RRF     PSXID,F
  188.  
  189.                                 BCF     PORTA,CLOCK
  190.  
  191.                                 BSF     PORTA,COMMAND
  192.                                 BTFSS   DATAPSX,0
  193.                                 BCF     PORTA,COMMAND
  194.  
  195.                                 BSF     PORTA,CLOCK
  196.  
  197.                                 BSF     PSXID,7
  198.                                 BTFSS   PORTA,JDATA
  199.                                 BCF     PSXID,7
  200.  
  201.                                 RRF     DATAPSX,F
  202.  
  203.                                 DECFSZ  CONT1,F
  204.                                 GOTO    NEXTID
  205.  
  206.                                 BTFSC   PORTA,ACKNOWLEDGE
  207.                                 GOTO    $-1
  208.  
  209.                                 BTFSS   PORTA,ACKNOWLEDGE
  210.                                 GOTO    $-1
  211.  
  212.                                 RETURN
  213.  
  214. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215.  
  216.  
  217. GET0X5A                         MOVLW   0X08                            ;RECIBIR 0X5A
  218.                                 MOVWF   CONT1
  219.                                 BSF     PORTA,COMMAND
  220.  
  221. NEXT5A                          RRF     PSX5A,F
  222.  
  223.                                 BCF     PORTA,CLOCK
  224.  
  225.                                 NOP
  226.                                 NOP
  227.  
  228.                                 BSF     PORTA,CLOCK
  229.  
  230.                                 BSF     PSX5A,7
  231.                                 BTFSS   PORTA,JDATA
  232.                                 BCF     PSX5A,7
  233.  
  234.                                 DECFSZ  CONT1,F
  235.                                 GOTO    NEXT5A
  236.  
  237.                                 BTFSC   PORTA,ACKNOWLEDGE
  238.                                 GOTO    $-1
  239.  
  240.                                 BTFSS   PORTA,ACKNOWLEDGE
  241.                                 GOTO    $-1
  242.  
  243.                                 RETURN
  244.  
  245. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  246.  
  247.  
  248. BUSCATIPOPERIF                  MOVF    PSX5A,W
  249.                                 XORLW   0X5A
  250.                                 BTFSS   STATUS,Z
  251.                                 GOTO    NOCOMPAT                ;ENVIAR QUE EL PERIFERICO NO ENVIO 0X5A. NO RECONOCIDO
  252.  
  253.  
  254.                                 MOVF    PSXID,W
  255.                                 XORLW   0X41
  256.                                 BTFSC   STATUS,Z
  257.                                 GOTO    DIGPADCONECTED
  258.  
  259.                                 MOVF    PSXID,W
  260.                                 XORLW   0X73
  261.                                 BTFSC   STATUS,Z
  262.                                 GOTO    ANALOGREDCONECTED
  263.  
  264.                                 MOVF    PSXID,W
  265.                                 XORLW   0X53
  266.                                 BTFSC   STATUS,Z
  267.                                 GOTO    ANALOGGREENCONECTED
  268.  
  269. NOCOMPAT                        MOVLW   0XFF
  270.                                 MOVWF   PSXID
  271.  
  272.                                 RETURN
  273.  
  274.  
  275. DIGPADCONECTED                  MOVLW   0X00
  276.                                 MOVWF   PSXID
  277.  
  278.                                 RETURN
  279.  
  280.  
  281. ANALOGREDCONECTED               MOVLW   0X01
  282.                                 MOVWF   PSXID
  283.  
  284.                                 RETURN
  285.  
  286.  
  287. ANALOGGREENCONECTED             MOVLW   0X02
  288.                                 MOVWF   PSXID
  289.  
  290.                                 RETURN
  291.  
  292. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  293.  
  294.  
  295. GETYFILLHIGHBYTE                MOVLW   0X08
  296.                                 MOVWF   CONT1
  297.                                 BSF     PORTA,COMMAND
  298.  
  299. NEXTSAT1ST                      RRF     SAT1STDATA,F
  300.  
  301.                                 BCF     PORTA,CLOCK
  302.  
  303.                                 NOP
  304.                                 NOP
  305.  
  306.                                 BSF     PORTA,CLOCK
  307.  
  308.                                 BSF     SAT1STDATA,7
  309.                                 BTFSS   PORTA,JDATA
  310.                                 BCF     SAT1STDATA,7
  311.  
  312.                                 DECFSZ  CONT1,F
  313.                                 GOTO    NEXTSAT1ST
  314.  
  315.                                 BTFSC   PORTA,ACKNOWLEDGE
  316.                                 GOTO    $-1
  317.  
  318.                                 BTFSS   PORTA,ACKNOWLEDGE
  319.                                 GOTO    $-1
  320.  
  321.                                 RETURN
  322.  
  323. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  324.  
  325.                                                                
  326.  
  327. GETYFILLLOWBYTE                 MOVLW   0X08
  328.                                 MOVWF   CONT1
  329.                                 BSF     PORTA,COMMAND
  330.  
  331. NEXTSAT2ND                      RRF     SAT2NDDATA,F
  332.  
  333.                                 BCF     PORTA,CLOCK
  334.  
  335.                                 NOP
  336.                                 NOP
  337.  
  338.                                 BSF     PORTA,CLOCK
  339.  
  340.                                 BSF     SAT2NDDATA,7
  341.                                 BTFSS   PORTA,JDATA
  342.                                 BCF     SAT2NDDATA,7
  343.  
  344.                                 DECFSZ  CONT1,F
  345.                                 GOTO    NEXTSAT2ND
  346.  
  347.                                 RETURN
  348.  
  349.  
  350.                                 END
Si logras hacerlo funcionar, estare aqui esperando el codigo.
Agrego: El programa es para el joystick con vibracion, el modelo que enciende luz roja creo.EN MODO DIGITAL. Hice el programa para el modo analogico tambien, ya que en modo analogico, el pad envia mayor cantidad de bytes de datos. Si lo necesitas,lo busco y lo posteo tambien.
Exitos.
« Última modificación: 09 de Mayo de 2006, 17:26:07 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Re: leer datos pad psx
« Respuesta #3 en: 11 de Mayo de 2006, 10:21:00 »
m interesaria el programa de analogico pero el assembler n lo domino, solo se me da bien el c, e encontrado programas cn l 16f84 para pasarlo al puerto midi, pero creia q podría leer solo la pata data, como funciona tu programa exactamnte?
gracias x vuestras respuestas

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: leer datos pad psx
« Respuesta #4 en: 14 de Mayo de 2006, 18:03:39 »
salkudos! Estaba pensando hacer algo parecido a esto, asi que ayer estuve intentando buscar algo de informacion pero la busqueda en google de "mando play station" y derivaods es una locura; salen un monton de enclaces y no encontre ninguno que tuviera informacion utilizable. Por eso queria preguntarte BrunoF si la informacion la encontraste en alguna web o si sabes donde puese encontrarse
Saludos desde Córdoba, españa

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: leer datos pad psx
« Respuesta #5 en: 14 de Mayo de 2006, 19:54:31 »
Hola. El protocolo de la PSX es bastante simple, o bastante complicado, dependiendo de como lo miremos.

JDATA         EQU      0   ;(MARRON)
COMMAND         EQU      1   ;(NARANJA)
ATTENTION      EQU      2   ;(AZUL)
CLOCK         EQU      3   ;(BLANCO)
ACKNOWLEDGE      EQU      4   ;(VERDE)

JDATA: Esta es una linea que proviene del joystick e ingresa al pic(entrada).Es la que nos enviara todos los valores del joystick.
NECESITA pull up externa(ya que la PSX tiene una dentro y en este caso, nosotros somos la PSX :D :mrgreen:)

COMMAND: Esta es una linea que proviene del PIC y va hacia el joystick(salida). Es con la que daremos las instrucciones necesarias al joystick(mas tarde comento esto).


ATTENTION: Esta linea proviene del PIC y va hacia el joystick(salida). Antes y durante la transmicion de datos, esta linea debe ponerce en bajo(0). Sirve para indicarle al joystick que queremos obtener data del mismo o bien escribir datos en el mismo(por ejemplo, cuando queremos que vibre si tiene ramble pack).

CLOCK:esta es una linea que proviene del PIC y va hacia el joystick(salida).El PIC genera el clock, y mediante este leeremos o escribiremos los datos en el joystick.

ACKNOWLEDGE: Esta linea proviene del joystick y va hacia el PIC(entrada).Es muy parecido al ACKNOWLEDGE en comunicaciones I2C. Luego de cada byte que enviamos o recibimos, el joystick debe enviarnos una señal de acknowledge para verificar que lo que estamos leyendo o escribiendo es correcto y la comunicacion esta funcionando.Destaco que el ultimo byte que leamos/escribamos NO enviara acknowledge(idem comunicaciones I2C).
NECESITA pull up externa(ya que la PSX tiene una dentro y en este caso, nosotros somos la PSX :D :mrgreen:)

Volviendo al clock. La info que tome de la web(veo si encuentro las paginas) no se ponen de acuerdo. Encontre  paginas que decian que los datos deben ser escritos/leidos en cada ALTO del clock, mientras que otras paginas decian que debian escribirse/leerse en los BAJOS del clock.
Mi experiencia personal, probando ambos metodos, es que en ALTO funciona.Asi que prueben en ALTO, ya que logre hacerlo funcionar.

El protocolo es asi:



Inicializamos el CLOCK y el ATTENTION en ALTO.Respeten esto!.Dejen pasar un tiempo, y luego:ponemos en BAJO el ATTENTION.
Luego procedemos a enviar 0x01 al joystick.

Se vería asi:

CLOCK:  -----____-----____-----____-----____-----____-----____-----____-----____----------

                           1bit        2bit        3bit        4bit        5bit        6bit       7bit         8bit

ATTENTION:_____________________________________________________________(dejenlo en bajo)

COMMAND:____--------_______________________________________________

Envio 0x01 mediante la linea command.

ACK:        ---------------------------------------------------------------------------------------___-----

Si no recuerdo mal, la transmicion y recepcion se hace comenzando con el bit menos significativo primero.

Respeten los tiempos! Cada bit a cargar en COMMAND, debe ser cargado durante los BAJOS del CLOCK y mantenidos durante los ALTOS.
NO JUEGUEN CON EL CLOCK! una vez finalizado los 8 clocks por cada byte de comunicacion, DEJENLO EN ALTO(como deberia quedar al finalizar de cada byte)hasta que necesiten nuevamente volver a cambiarlo.

Luego de enviado el 0x01, inmediatamente debemos recibir un pulso bajo de ACKNOWLEDGE. Si no lo reciben, hay algo mal.



Ahora, procedemos a pedirle que se identifique. Esta parte de la comunicacion es BIDIRECCIONAL, o sea que mientras enviamos el byte, debemos leer el otro: el ID.
El ID es un byte que nos envia el periferico con un valor preestablecido para cada tipo.
Si tenemos conectado un joystick digital recibiremos 0X41.
Si tenemos conectado un joystick analogico que enciende luz roja recibiremos 0X73.
Si tenemos conectado un joystick analogico que enciende luz verde recibiremos 0X53.
Hay otros identificadores para el resto de perifericos(memory cards, etc) pero bueno...no los recuerdo :D :D.

Entonces, lo que debemos hacer es enviar el valor 0x42, y a la vez, leer el ID del periferico:

CLOCK:  -----____-----____-----____-----____-----____-----____-----____-----____----------

                           1bit        2bit        3bit        4bit        5bit        6bit       7bit         8bit
ATTENTION:_____________________________________________________________(dejenlo en bajo)

COMMAND:____________---------_______________________________---------___________

Envio 0x42 por la linea command como se ve arriba.

JDATA:     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                           1bit        2bit        3bit        4bit        5bit        6bit       7bit         8bit

Leo en cada ALTO del clock esta linea(JDATA) para obtener el ID del periferico conectado.

ACK:        --------------------------------------------------------------------------------------___-----

Otra vez deberemos recibir el ACKNOWLEDGE(ACK). Si no lo reciben, hay algo mal...



Bien, tercer paso de la comunicacion:

Simplemente ahora DEBEMOS recibir el valor 0x5A  del joystick. Este valor es siempre el mismo(al menos en los perifericos que yo probe)

Entonces, simplemente esta vez, generamos el clock y leemos el JDATA.

CLOCK:  -----____-----____-----____-----____-----____-----____-----____-----____----------

                           1bit        2bit        3bit        4bit        5bit        6bit       7bit         8bit
ATTENTION:_____________________________________________________________(dejenlo en bajo)

COMMAND: -noimporta-noimporta-noimporta-noimporta-noimporta-noimporta-noimporta-noimporta

JDATA:  ______________---------________---------------------________----------__________
                           1bit        2bit        3bit        4bit        5bit        6bit       7bit         8bit

Leo en cada ALTO del clock esta linea(JDATA) para obtener 0x5A. Si obtienen otro valor, algo esta mal

ACK:        ---------------------------------------------------------------------------------------___-----

Otra vez deberemos recibir el ACKNOWLEDGE(ACK). Si no lo reciben, hay algo mal...



Una vez obtenido el 0x5A. Finalmente comenzaremos a obtener los valores de los pulsadores y direcciones del PAD.
Esto se hace de manera similar a la obtencion del 0x5A. Solo generamos el clock y vamos leyendo los datos.

NOTA: Tanto el mando que es solo digital(ya casi ni se usa), como los mandos analogicos EN MODO DIGITAL, nos enviaran un ID 0x41.
En este modo, el PAD enviara 2 bytes de datos. Entonces, generamos 16 clock(2 bytes) y leemos los 2 bytes recibidos.
Cada bit corresponde a un pulsador.En modo digital, son 16 en total:
NO ESTAN EN ORDEN PERO SON: Circulo,Cuadrado,Rectangulo,Triangulo,L1,L2,R1,R2,Up,Down,Left,Right,Select,Start y......una aclaracion para los 2 pulsadores restantes:
Los mandos analogicos de PSX NO originales envian igualmente estando en modo digital los valores de los dos pulsadores "OCULTOS".Estos pulsadores son los que se encuentran al presionar hacia abajo las palancas analogicas(poseen 2 palancas los de PSX).
No ocurre lo mismo en los mandos analogicos originales de PSX, los cuales NO envian los valores de estos dos pulsadores si estan en modo DIGITAL.

Bien, entonces. Dije que con estos mandos, recibiremos 2 bytes. Luego de recibido el primer byte, nos fijaremos en recibir SI o SI el ACKNOWLEDGE. En el caso del segundo byte, como he dicho antes, por ser el ultimo byte de la comunicacion, NO RECIBIREMOS EL ACKNOWLEDGE. POR LO TANTO! Cuidado! no se queden esperando a este ACKNOWLEDGE porque nunca les llegara. :D :D

Luego de recibidos los dos bytes, procedemos a poner en ALTO(1) la linea ATTENTION. De esta manera, permitimos al PAD que se encargue de hacer sus otras obligaciones(volver a checkear los valores de los pulsadores para poder actualizar los datos).

Bien, y por ultimo en modo analogico.
En lugar de recibir 2 bytes, recibiremos 6.
Por lo tanto, necesitaremos generar 48 pulsos de CLOCK e ir leyendo cada byte para obtener los valores.
Los 3 primeros bytes que leamos, son identicos a los 2 que recibimos en modo digital.
Hay una diferencia. Sí recibiremos un ACKNOWLEDGE al final del segundo byte, ya que, en este modo, NO ES EL ULTIMO BYTE de la comunicacion.

Entonces, quedan 4 bytes restantes. Estos corresponden a los valores analogicos de las 2 palancas.
No recuerdo el orden, pero creo que era:

Byte3: Eje X Palanca analogica Izquierda
Byte4:Eje Y Palanca analogica Izquierda
Byte5: Eje X Palanca analogica Derecha
Byte6: Eje Y Palanca analogica Derecha(recordemos, que por ser ultimo byte, el pad no enviara ACKNOWLEDGE)

Las palancas poseen una resolucion de 1 byte por eje. Esto es lo mismo que decir 256 posiciones para el eje X y 256 para el Y. Esto nos da un total de 256*256 = 65536 posiciones posibles para cada palanca analogica.

En este caso, al ATTENTION recien lo ponemos en ALTO(1) una vez recibidos los 6 bytes.



Cada vez que deseen obtener los datos, simplemente vuelven a hacer todo lo dicho. Y es TODO! no intenten esquivar ningun paso xq no van a lograr que funcione....
Y RECUERDEN EL ATTENTION:
Lo ponen en BAJO(0) ANTEs de iniciar una peticion al mando, y hasta DESPUES de obtenerla.
Una vez obtenida, lo ponen en ALTO hasta la proxima peticion

Una cosa mas a tener en cuenta: Entre cada comunicacion, dejen un tiempo de descanso para el PAD, asi le permiten poder refrescar internamente los valores de los pulsadores.



El programa que publique anteriormente, es para mando en modo digital. Si lo ven, hace exactamente lo que he desarrollado en este post.
Espero que tenga exito(especialmente con los tan tercos mandos originales de PSX).
Exitos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: leer datos pad psx
« Respuesta #6 en: 15 de Mayo de 2006, 06:33:10 »
Pues muchas gracias por toda esta informacion , ahora dentro de poco vienen los examenes y ya tengo varios proyectos entre manos pero para cuando acaben el pad ya me esta mirando con ojos de corderito. Yo programo en C, asi que si lo consigo hacer lo subire
Saludos desde Córdoba, españa

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Re: leer datos pad psx
« Respuesta #7 en: 17 de Mayo de 2006, 17:35:33 »
La página web más completa que e encontrado, es está:

http://sophiateam.undrgnd.free.fr/

Aquí aparece toda la explicación y un programa para pic, para controlar el mando de la play desde el pic, la cuestión es que lo que quiero hacer es leer solo la pata de DATA del mando, mientras la play se encarga de enviar y recibir datos al mando, para que a´sí mientras juego, mi pic interprete los bytes de la patilla DATA del mando, e interpretarla yo

Gracias por todas vuestras respuestas.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: leer datos pad psx
« Respuesta #8 en: 30 de Mayo de 2006, 01:56:19 »
Hola. Bueno, en ese caso deberias entonces, interceptar las lineas DATA,CLOCK,ACK y probablemente el ATTENTION tambien, e ir leyendo los datos que envia el periferico.
Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: leer datos pad psx
« Respuesta #9 en: 27 de Junio de 2006, 14:05:01 »
Bueno, he logrado leer bien todos los pads de PSX, tanto en modo digital como en analogico :mrgreen:
Solo lee los 2 primeros bytes de datos, es decir los pulsadores. Para el modo analogico es necesario leer 4 bytes mas(es facil hacerlo)

Aqui pongo el codigo que use:

Código: ASM
  1. ;POR BRUNO FASCENDINI --- bipus24hs@hotmail.com
  2. ;FUNCIONA BIEN
  3. ;configurado para FOSC = 20MHZ! CUIDADO CON ESTO! ACOMODAR LOS TIEMPOS SINO
  4.  
  5.  
  6.         LIST            P=PIC16F877A
  7.         #include        <P16F877A.INC>
  8.  
  9.         __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _HS_OSC
  10.  
  11.         ERRORLEVEL      -302
  12.  
  13. ;DEFINICION DE PINES DEL PROTOCOLO DE LA PSX
  14.  
  15. #DEFINE         JDATA           0       ;(MARRON)(BROWN)
  16. #DEFINE         COMMAND         1       ;(NARANJA)(ORANGE)
  17. #DEFINE         ATTENTION       2       ;(AZUL)(BLUE)
  18. #DEFINE         CLOCK           3       ;(BLANCO)(WHITE)
  19.  
  20. ;-                                      (ROJO)(RED)
  21. ;+                                      (AMARILLO)(YELLOW)
  22.  
  23. ;PORTB Y PORTC DEBEN IR TODOS CON LEDS EN MODO FUENTE(muestra las teclas presionadas)
  24.  
  25.  
  26. FLAGS                   EQU             0x20
  27. DATAPSX                 EQU             0X21
  28. CONT1                   EQU             0X22
  29. PSX5A                   EQU             0X23
  30. PDel0                   EQU             0X24
  31. PDel1                   EQU             0X25
  32. PDel2                   EQU             0X26
  33. SAT1STDATA              EQU             0X27
  34. SAT2NDDATA              EQU             0X28
  35. PSXID                   EQU             0X29
  36.  
  37.  
  38. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. ;Memoria EEPROM
  40. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41.  
  42.  
  43. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. ;VECTOR RESET
  45. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46.  
  47.                         ORG     0X0000
  48.                         GOTO    INICIO
  49.  
  50. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. ;VECTOR INTERRUPCION
  52. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  53.  
  54.                         ORG     0X0004
  55.                         GOTO    INICIO
  56.  
  57. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. ;VECTOR INICIO PROGRAMA
  59. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60.  
  61.                         ORG     0X05           
  62.  
  63. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. ;CONFIG PUERTOS
  65. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66.  
  67.  
  68. INICIO                  BCF             STATUS,RP0
  69.                         BCF             STATUS,RP1
  70.        
  71.                         BSF             STATUS,RP0
  72.                         MOVLW           0x06                    ;PINS DEL PUERTO A Y PUERTO E TODOS DIGITALES.
  73.                         MOVWF           ADCON1
  74.                         MOVLW           B'00010001'
  75.                         MOVWF           TRISA                   ;PUERTO A RA0 = DATA(I) RA1= COMMAND(O) RA2= ATTENTION(O) RA3= CLOCK(O) RA4 = ACKNOWLEDGE(I) RA5= LED(O)
  76.  
  77.                         BCF             STATUS,RP0
  78.                         MOVLW           0XFF                    ;TODOS LOS PINES DE SALIDA EN ALTO( PARA QUE EL JOYSTICK NO RECIBA COMANDOS POR AHORA)
  79.                         MOVWF           PORTA
  80.                         BSF             STATUS,RP0
  81.                         CLRF            TRISB                   ;LEDS PARA VER PRIMER BYTE DE DATOS
  82.  
  83.                         BCF             STATUS,RP0
  84.                         CLRF            PORTB
  85.                         BSF             STATUS,RP0
  86.                         CLRF            TRISC                   ;LEDS PARA VER SEGUNDO BYTE DE DATOS
  87.                        
  88.                         BCF             STATUS,RP0
  89.                         CLRF            PORTC
  90.                         BSF             STATUS,RP0
  91.                         MOVLW           0X00
  92.                         MOVWF           TRISD
  93.                
  94.                         BCF             STATUS,RP0
  95.                         CLRF            PORTD
  96.                         BSF             STATUS,RP0
  97.                         MOVLW           0X00
  98.                         MOVWF           TRISE  
  99.                         BCF             STATUS,RP0
  100.                         BCF             STATUS,RP1
  101.  
  102.                         MOVLW   0X5A
  103.                         MOVWF   PSX5A
  104.                         MOVLW   0X42
  105.                         MOVWF   PSXID
  106.                         CALL    BUSCATIPOPERIF
  107.  
  108.  
  109. WAITPERCOMP             BSF     PORTA,ATTENTION
  110.                         CALL    DEMORA8MS
  111.                        
  112.                         MOVLW   0x01
  113.                         CALL    SENDPSX
  114.  
  115.                         MOVLW   0x42
  116.                         CALL    SENDPSX
  117.                         MOVWF   PSXID
  118.  
  119.                         MOVLW   0x00
  120.                         CALL    SENDPSX
  121.                         MOVWF   PSX5A
  122.  
  123.                         CALL    BUSCATIPOPERIF
  124.  
  125.                         MOVLW   0x00
  126.                         CALL    SENDPSX
  127.                         MOVWF   SAT1STDATA
  128.  
  129.                         MOVLW   0x00
  130.                         CALL    SENDPSX
  131.                         MOVWF   SAT2NDDATA
  132.  
  133.                         MOVF    SAT1STDATA,W
  134.                         MOVWF   PORTB
  135.  
  136.                         MOVF    SAT2NDDATA,W
  137.                         MOVWF   PORTC
  138.  
  139.                         GOTO    WAITPERCOMP
  140.  
  141. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. ;FUNCIONES:
  143. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  144.  
  145. SENDPSX                         BCF     PORTA,ATTENTION         ;EXIGIR ATENCION DEL PAD
  146.  
  147.                                 MOVWF   DATAPSX
  148.                                 CALL    DEMORA20US                      ;PAUSA ENTRE COMANDOS(NECESARIA)
  149.  
  150.                                 MOVLW   0X08
  151.                                 MOVWF   CONT1
  152.  
  153. NEXT01                          BSF     PORTA,COMMAND  
  154.                                 BTFSS   DATAPSX,0      
  155.                                 BCF     PORTA,COMMAND  
  156.  
  157.                                 BCF     PORTA,CLOCK             ;ENVIAR 0X01
  158.  
  159.                                 CALL    DEMORA1US
  160.                                 CALL    DEMORA1US
  161.  
  162.                                 BSF     PORTA,CLOCK             ;CLOCK alto
  163.  
  164.                                 RRF     DATAPSX,F               ;ROTAR data a enviar
  165.  
  166.                                 CALL    DEMORA1US
  167.  
  168.                                 BSF     DATAPSX,7      
  169.                                 BTFSS   PORTA,JDATA    
  170.                                 BCF     DATAPSX,7      
  171.  
  172.                                 DECFSZ  CONT1,F         ;decrementar contador
  173.                                 GOTO    NEXT01 
  174.  
  175.                                 MOVF    DATAPSX,W
  176.                                 RETURN
  177.  
  178.  
  179. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  180.  
  181.  
  182. BUSCATIPOPERIF                  MOVF    PSX5A,W
  183.                                 XORLW   0X5A
  184.                                 BTFSS   STATUS,Z
  185.                                 GOTO    NOCOMPAT                ;ENVIAR QUE EL PERIFERICO NO ENVIO 0X5A. NO RECONOCIDO
  186.  
  187.                                 MOVF    PSXID,W
  188.                                 XORLW   0X73                    ;ID= 0X73?
  189.                                 BTFSC   STATUS,Z
  190.                                 GOTO    ANALOGREDCONECTED
  191.  
  192.                                 MOVF    PSXID,W
  193.                                 XORLW   0X53                    ;ID= 0X53?
  194.                                 BTFSC   STATUS,Z
  195.                                 GOTO    ANALOGGREENCONECTED
  196.  
  197.                                 MOVF    PSXID,W
  198.                                 XORLW   0X41                    ;ID= 0X41?
  199.                                 BTFSC   STATUS,Z
  200.                                 GOTO    DIGPADCONECTED
  201.  
  202. NOCOMPAT                        MOVLW   0X00
  203.                                 MOVWF   PSXID
  204.                                 RETURN
  205.  
  206.  
  207. DIGPADCONECTED                  MOVLW   0X01
  208.                                 MOVWF   PSXID
  209.                                 RETURN
  210.  
  211.  
  212. ANALOGREDCONECTED
  213.                                 MOVLW   0X02
  214.                                 MOVWF   PSXID
  215.                                 RETURN
  216.  
  217.  
  218. ANALOGGREENCONECTED
  219.                                 MOVLW   0X03
  220.                                 MOVWF   PSXID
  221.                                 RETURN
  222.  
  223.  
  224. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  225.  
  226. DEMORA20US                      MOVLW   .39
  227.                                 MOVWF   PDel0
  228.                                 DECFSZ  PDel0,F
  229.                                 GOTO    $-1
  230.  
  231.                                 NOP
  232.                                 NOP
  233.                                 RETURN
  234.  
  235.  
  236. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  237.  
  238. DEMORA1US                       NOP
  239.                                 RETURN
  240.  
  241.  
  242. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  243.  
  244. DEMORA8MS               MOVLW     .20      ; 1 set numero de repeticion  (C)
  245.                         MOVWF     PDel0     ; 1 |
  246. PLoop20                 MOVLW     .2      ; 1 set numero de repeticion  (B)
  247.                         MOVWF     PDel1     ; 1 |
  248. PLoop21                 MOVLW     .205      ; 1 set numero de repeticion  (A)
  249.                         MOVWF     PDel2     ; 1 |
  250. PLoop22                 CLRWDT              ; 1 clear watchdog
  251.                         CLRWDT              ; 1 ciclo delay
  252.                         DECFSZ    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
  253.                         GOTO      PLoop22    ; 2 no, loop
  254.  
  255.                         DECFSZ    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
  256.                         GOTO      PLoop21    ; 2 no, loop
  257.  
  258.                         DECFSZ    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
  259.                         GOTO      PLoop20    ; 2 no, loop
  260.  
  261.                         RETURN
  262.  
  263.  
  264. ;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  265.                                                
  266.                         END

Que les sirva.Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: leer datos pad psx
« Respuesta #10 en: 30 de Diciembre de 2012, 23:10:09 »
Hola BrunoF

me propongo leer con un pic18f2550 los botones pulsados de un mando de playstation  2
lei un poco tu codigo en asm y las explicaciones.
Pero al no programar en asm me guie por los comentarios.

tu llegaste a leer todas las teclas?
como conectastes los 9 pines del mando?
que micro usaste?

¿el protocolo de la ps2 es el spi?

un saludo
« Última modificación: 31 de Diciembre de 2012, 00:23:13 por pajaro »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: leer datos pad psx
« Respuesta #11 en: 31 de Diciembre de 2012, 00:53:00 »
tu llegaste a leer todas las teclas?

Hola. Sí, logré leer todas las teclas, tanto digitales como analógicas. Tal vez en el código de ejemplo no se lean todas.

como conectastes los 9 pines del mando?

En el código fuente CREO que figuraban los colores y los pines a los que iba conectado cada uno.

que micro usaste?

Creo recordar que era un 18F4550. 99.99% similar al 2550.

¿el protocolo de la ps2 es el spi?

Si, es SPI. Podés usar el módulo SSP para facilitar las transacciones.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.