Autor Tema: Keyboard CheatBox  (Leído 16353 veces)

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

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Keyboard CheatBox
« en: 07 de Febrero de 2007, 22:00:30 »
Amables foreros de TODOPIC.

   Tras este rimbombante título, se esconde una oscura idea que ha estado surcando mi mente por varias semanas, y quisiera confesarme ante ustedes y pedir su absolución, y como penitencia convertir esto que son solo fútiles pensamientos, en un proyecto que pueda ayudar a quienes como yo no hemos sido bendecidos con unos dedos ágiles a la hora de usar el teclado en algunos juegos.

   Ya otros muchos osados, han incursionado en el arte de engañar al PC, haciendole creer que tiene conectado un teclado, cuando las frias patas de un diminuto PIC se burlan de su inocencia, de esto da cuenta el conocido RedPic en su memorable "Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)".
Pero mi intención es ir más allá, y lograr mediante un vil truco, engañar en un juego a mis oponentes online, haciéndoles creer que soy un maestro con el teclado y el mouse, quizá convertirme en el mejor jugador de Unreal Tournament 2004 que haya existido.

   Y es que debo decir que he sido brutalmente humillado, barrido a balazos, aplastado, reventado a bombazos y cañonazos, mientras mis contrincantes hacían gala de sus habilidades, saltando, corriendo y moviéndose por los escenarios con inusitada velocidad, y mostrando una (casi obscena) puntería contra mi humilde personaje, que últimamente ya ni siquiera me mira, avergonzado por mi falta de habilidad y puntería, y por dejarlo morir en tan diversas formas en el campo de batalla.
Después de tan shockeante experiencia, algo en mi interior me hizo pensar que era hora de darle a tantos humildes seres como yo, un arma secreta que les permita por una vez en la vida reir al último JA JA JA!!!! y dar muestras de habilidades superiores, que aunque sean provistas por un PIC, en definitiva halla sido nuestro cerebro quien las puso ahí.

   Con esta introducción, los he llevado a las profundidades de mi miseria, pero ahora quisiera revelarles la excelsa idea que ha surgido en los más intrincados y tortuosos caminos de mi sustancia gris.

   Una de las más necesarias cosas en los duelos de Unreal Tournament (desde ahora UT) es la necesidad de moverse constantemente, así como de hacer combinaciones de teclas que hacen que el personaje salte más alto, corra más rápido, esquive los ataques del enemigo, y en definitiva se mueva como un simio desquiciado. Lo malo es que lograr la mitad de las pulsaciones de teclado necesarias para ser una décima parte de lo hábil que son estos infrahumanos esquizofrénicos, deja mis dedos horriblemente adoloridos y agarrotados, debiendo recurrir a una sesión de seis horas al acupunturista para volverles a dar una mediana movilidad. La idea entonces es hacer un pequeño monstruo, una bestia de silicio, que este ubicada entre el teclado y el PC, y se encargue de hacer aquello que yo no logro hacer ¡Moverme desenfrenadamente!. Para ello tomaremos un PIC de fácil acceso a todos los bolsillos y lugares del mundo (aquí en Viña del Mar, Chile, apenas consigo el 16F84 y el 16F628), utilizaremos por ende este último que tiene la ventaja de tener las salidas RB con una resistencia pull-up que nos vendrá como anillo al dedo para controlar el Clock y el Data del teclado.
¿Qué añade este proyecto a los ya presentados en el Foro? Se preguntarán. Bueno un par de cosas bien interesantes, Lo primero que se me ocurre es: ya que el chiche ha de enviar caracteres al PC ¿por qué no incluir un menú con el que podamos elegir ciertas acciones?, bastaría con meternos a un block de notas o un procesador de textos, activar el menú con alguna combinación de teclas especial y el PIC entraría en modo “Auto Programación” ”escribiendo” en pantalla del programa abierto, el menú con las posibles opciones y esperando la presión de una de las teclas de opción para setearse como deseemos.

   Imaginen una opción donde elijamos que al presionar la tecla “J” del teclado, nuestro monstruito envíe una combinación de teclas “combo” de cuatro o cinco caracteres, interesante ¿no? , o que por ejemplo podamos programar la autorepetición de ciertas teclas o conjunto de teclas, teniendo solo una tecla presionada. ¡¡¡Podría dejar a mi personaje moviéndose casi por si mismo mientras me dedico solo a apuntar y matar enemigos!!!! …. Se me hace agua la boca, JAJAJAJAJA.

   Lo segundo es la posibilidad de activar y desactivar los combos previamente guardados en el corazón del PIC con una serie de teclas, esto evitaría que si abro un conversación de chat con mi enemigo, salgan una cantidad in entendible de caracteres y se me haga imposible comunicarme, todos pensarían que soy el mejor jugador de UT pero darían por sentado que tal nivel de entrenamiento me llevo a un estado de paranoia cataléptica que hace imposible comunicarme de forma inteligible.

   Bueno, es tiempo de dejar de divagar y empezar a programar, desde el sábado estoy de vacaciones y voy a invertir mi tiempo en esto.

   Por ahora les dejo estas ideas rondando vuestras inquietas mentes, cualquier aporte, comentario y o sugerencia será bienvenido (siempre que sea bueno) y si no lo es lo podemos arreglar en un duelo de UT. (por supuesto cuando el invento este terminado y el ofensor no haya construido uno para él, porque eso sería hacer trampa, y seremos muchas cosas… pero tramposos NUNCA.

Salud. 8)
« Última modificación: 10 de Febrero de 2007, 17:36:43 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Keyboard CheatBox
« Respuesta #1 en: 07 de Febrero de 2007, 22:12:28 »
Tu fanatismo por ese "UT" es increible...

¿No seria mas facil hacer un pequeño software para la PC que capte lo que presionas en el teclado y en base a eso envie estimulos de teclas presionadas como mas te agrade?

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 SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #2 en: 07 de Febrero de 2007, 22:27:43 »
   Desgraciadamente no BrunoF, el servidor para jugar, verifica que no haya programas extraños, ni modificaciones en los archivos del juego de ningún tipo, que den ventaja a los jugadores, si encuentra algo raro, no te deja ingresar al servidor.

   Solamente engañando al PC y haciendole creer que tiene un teclado común y silvestre conectado podré lograr mi objetivo.

Salud  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Keyboard CheatBox
« Respuesta #3 en: 07 de Febrero de 2007, 22:56:09 »
Excepto que el programa que usa el servidor contenga un modulo que rastree keyloguers te aseguro que no lo va a detectar, y no hay necesidad de modificar ningun archivo del juego.

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 SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #4 en: 07 de Febrero de 2007, 23:00:44 »
   No te lo discuto BrunoF, puede que funcione con un keylooger, de todas formas quiero intentar este proyecto, para aprender y darme el gusto.

   Por otro lado, creo que tomaste muy literal algunos de mis sobredimensionados comentarios sobre el UT, por ejemplo no es cierto que tenga que ir a un acopunturista, pero le añade emoción a la historia ¿verdad?....


Saludos  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Keyboard CheatBox
« Respuesta #5 en: 07 de Febrero de 2007, 23:57:57 »
Pues bienvenido sea entonces. Es posible hacerlo.

Añade emoción como tu dices...yo también fuí asi de fanático hace años con los videojuegos y comprendo tu euforia.

Con ganas todo es posible.

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 elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Keyboard CheatBox
« Respuesta #6 en: 08 de Febrero de 2007, 09:14:37 »
Jajajaja... normalmente te contestaria que te fueras a tomar viento con las trampas... pero por lo menos te has molestado en escribirnos un poquito...

Creo que tienes todo lo necesario en el topic de redpic... ahora intenta hacer andar ese mismo ejemplo y ve modificandolo hacia tus posibilidades... y pregunta las dudas...

ya sabes que aqui nadie hace el trabajo de nadie... solo se solucionan problemas concretos

Pero vamos que la idea es bien sencilla... algun artilugio que se interponga entre el teclado y el ps2 y que cuando reciba cierta combianción de tecla la sustituya por otras o genere un bucle de teclas para hacer tus "combo".

Yo jugaba mucho al unreal tournament y era el nº 1 de la clase, jugabamos en red y todos intentaban matarme a mi... osea no se intentaban matar entre ellos todos a por mi.... la verdad no se que gracia le ves a las trampas, pero weno....



1 saludo.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #7 en: 08 de Febrero de 2007, 10:55:04 »
Hola elmasvital:

  Agradezco tu apoyo al artilugio, la verdad es que si bien la intención primaria no goza de la aprobación de todos, se me ocurren muchas cosas para las cuales serviría un aparatito al que podamos programarle combinaciones de teclas, y a lo mejor alguien lo encuentra útil para aplicaciones mas nobles.

  En cuanto a no saber que gracia le veo a las trampas... bueno, que levante la mano el que nunca uso vidas infinitas en un juego, el que no busco soluciones en internet, o alguna que otra cosa para ayudarse a terminarlo....

   No veo ninguna mano alzada.... ¿Qué pasó?.

Salud  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Keyboard CheatBox
« Respuesta #8 en: 08 de Febrero de 2007, 11:35:04 »
Hola amigos!
Interesante el proyecto.
Pero se puede mirar un poco mas alla de los juegos. Puede resultar muy interesante para hacer una interfaz para que personas discapacitadas puedas operar una computadora, ya sea utilizando botones grandes que realizen la funcion de varias teclas, o transformar otro tipo de entradas en pulsaciones de teclas.

Voy a seguir de cerca este hilo. :-/

Saludos! :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #9 en: 08 de Febrero de 2007, 13:52:21 »
   Exactamente, esa es la idea en mi último comentario.

Espero que muchos puedan sacarle provecho al proyecto, pienso compartir toda la información, programas y PBC, asique no se lo pierdan.

Salud.  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #10 en: 10 de Febrero de 2007, 17:17:46 »
   Ok. Nada comienza sin un principio, y este comienza con un diagrama, y este diagrama es el mas limpio que haya hecho, ningún componente externo, solo el PIC y los dos conectores, uno hembra para recibir las señales desde el teclado y uno macho para conectar al computador y enviarle los caracteres, aunque la comunicación deberá ser bidireccional con ambos, ya que el computador también querrá decirle algunas cosas al teclado, y el teclado deberá ser todo oidos cuando intentemos conversar con él.

   La limpieza del circuito se debe a que el computador provee la alimentación de 5V que necesitamos y el puerto RB del PIC dispone de las resistencias pull-up que necesitamos, en caso de haber utilizado un 16F84A necesitaríamos incluir estas resistencias para tener un uno lógico en los terminales Data y Clock, ya que estos terminales estan conectados en cofiguración "colector abierto". Otra ventaja la provee el occilador incluido en el PIC de 4 Mhz, lo que añade otra característica que evita tener que poner capacitores, resistencias o un cristal.

   Llegó la hora de programar, usaremos Assembler puro y duro y la invaluable información provista en un enlace de proyecto de RedPic: Teclado AT-PS2

   Espero que esto vaya tomando cuerpo, a medida que tenga las distintas rutinas en assembler, las pondre a consideración del público.

   Les dejo el Diagrama también.




Dudas consultas y/o aportes son bienvenidos.
Salud. 8)
« Última modificación: 10 de Febrero de 2007, 17:31:47 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #11 en: 12 de Febrero de 2007, 14:18:01 »
   Antes que nada, agradezco vuestra paciencia.

   Lo segundo, es que no estoy seguro de que la forma que estoy usando es la adecuada para incluir un assembler, que algún moderador me indique si debo hacer algún cambio.

   Y por último, aquí dejo entonces la primera rutina en assembler es la primera parte y solo sirve para leer el teclado. Esta comentada de pies a cabeza, (como a mi me gusta hacerlo) de forma que todos entiendan que hace cada línea (hasta los goto).

  Aquí va entonces, no la he probado todavía, ahora voy a dedicarme a pasarla por un simulador a ver que sucede.


Código: Microchip Assembler
  1. ;**********************************************************************
  2. ;                                                                     *
  3. ;    Filename:      CheatBox.asm                                      *
  4. ;    Date:          07/01/2007                                        *
  5. ;    File Version:  0.1                                               *
  6. ;                                                                     *
  7. ;    Author:        Rubén Arranz                                      *
  8. ;    Company:       Electronics Design                                *
  9. ;                                                                     *
  10. ;                                                                     *
  11. ;**********************************************************************
  12. ;                                                                     *
  13. ;    Files required:                                                  *
  14. ;                    16F648A.lkr                                      *
  15. ;                                                                     *
  16. ;                                                                     *
  17. ;**********************************************************************
  18. ;                                                                     *
  19. ;    Notes:                                                           *
  20. ;                                                                     *
  21. ;                                                                     *
  22. ;                                                                     *
  23. ;                                                                     *
  24. ;**********************************************************************
  25.  
  26.         list      p=16F648A           ; list directive to define processor
  27.         #include <p16F648A.inc>&#160; &#160; &#160;&#160; ; processor specific variable definitions
  28.  
  29.         errorlevel&#160; -302&#160; &#160; &#160; &#160; &#160; &#160; &#160; ; suppress message 302 from list file
  30.  
  31.         __CONFIG&#160;&#160; _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC_NOCLKOUT
  32.  
  33. ;Variables Tenemos disponibles desde 0x20 hasta 0x7F en el Banco 0
  34. ;Mirar Datasheet para los otros bancos de memoria.
  35.  
  36. BITTECLADO      equ             0x20    ;Bits faltantes por leer del Teclado
  37. TDATA           equ             0x21    ;Variable para almacenar el dato recibido
  38. TPARIDAD        equ             0x22    ;Variable intermedia de control de paridad
  39. TGEN            equ             0x23    ;Variable de proposito general asociada al teclado
  40. TSTATUS         equ             0x24    ;Esta Variable tendra varios FLAGS para indicarnos el estado de lectura del Teclado
  41. ;*** Como un dato puede estar compuesto por 3 Bytes, Vamos a Guardarlos en las siguientes tres variables
  42. TDATA1          equ             0x25    ;Primer parte del Dato
  43. TDATA2          equ             0x26    ;Segunda parte del Dato
  44. TDATA3          equ             0x27    ;Tercera parte del Dato
  45. CSTATUS         equ             0x28    ;Esta Variable tendra varios FLAGS para indicarnos el estado de lectura del Computador
  46.  
  47. ;Constantes
  48. CCK             equ             H'0000' ;Clock Hacia el computador
  49. CDT             equ             H'0001' ;Linea de Datos desde y Hacia el Computador
  50. TCK             equ             H'0002' ;Clock del Teclado
  51. TDT             equ             H'0003' ;Linea de Datos desde y Hacia el Teclado
  52. ;*** Los siguientes son los Flags de TSTATUS
  53. T_PAR           equ             H'0000' ;Indica el estado de la paridad del teclado
  54. T_WAIT          equ             H'0001' ;Indica un estado de espera mientras dura el estado bajo del clock
  55. T_EN            equ             H'0002' ;Indica si el teclado est&#225; inhibido de recibir datos o no
  56. T_CKHI          equ             H'0003' ;Este FLAG nos dir&#225; qui&#233;n puso en BAJO el Clock del Computador
  57. ;*** Los siguientes son los Flags de CSTATUS
  58. C_PAR           equ             H'0000' ;Indica el estado de la paridad del teclado
  59. C_WAIT          equ             H'0001' ;Indica un estado de espera mientras dura el estado bajo del clock
  60. C_EN            equ             H'0002' ;Indica si el teclado est&#225; inhibido de recibir datos o no
  61. C_CKHI          equ             H'0003' ;Este FLAG nos dir&#225; qui&#233;n puso en BAJO el Clock del Teclado
  62. C_DTHI          equ             H'0004' ;Este FLAG nos dir&#225; qui&#233;n puso en BAJO el Clock del Teclado
  63.  
  64.  
  65. ;**********************************************************************
  66. RESET_VECTOR    CODE    0x000           ; Vector de Reset del Procesador
  67.                 goto&#160; &#160; Rst&#160; &#160; &#160; &#160; &#160; &#160; &#160; ; Vamos al inicio del Programa
  68.  
  69. MAIN                    CODE    0x004
  70. ;*** Tras un reset, lo primero que hacemos es cargar la configuraci&#243;n grabada en memoria.
  71. ;*** Desactivamos toda rutina y ejecutaremos el Bucle Principal
  72. ;       -Leer Teclado y host (Todo lo que implica) y almacenar en variables correspondientes.
  73. ;       -Verificar si se intenta entrar en AutoProgramaci&#243;n y saltar all&#237; en caso de ser as&#237;.
  74. ;       -Verificar activaci&#243;n/desactivaci&#243;n de alg&#250;n "Combo" y realizar seg&#250;n el caso
  75. ;       -Enviar en forma transparente los datos desde y hacia el Host y desde y hacia el Teclado
  76. ;       -Si hay combos para enviar al host, inhibir el teclado y enviar los datos al host.
  77.  
  78. ;*** Rutina principal
  79. Rst
  80.                 bsf     STATUS,RP0              ;Me cambio al Banco de memoria 1
  81.                 bcf     OPTION_REG,NOT_RBPU     ;Activo las resistencia Pull-Up del Port B
  82.                 bcf     STATUS,RP0              ;Vuelvo al viejo y querido Banco de memoria 0
  83.                 movlw   0x86                    ;Direcciono TRISB en Forma Indirecta, para no tener...
  84.                 movwf   FSR                     ;... Que cambiar de Banco a Cada Rato.
  85.  
  86. ;*** Para Tener en cuenta:
  87. ;*** La Forma de leer y escribir el puerto ser&#225; diferente de lo normal, ya que los puertos...
  88. ;*** ...deber&#225;n actuar como de lectura y escritura, la soluci&#243;n es solo actuar como salidas...
  89. ;*** ...cuando queremos poner un "cero", y cuando queremos poner un "uno", le pedimos al port...
  90. ;*** ...que se convierta en entrada, dejando que la resistencia pull-up haga el trabajo...
  91. ;*** ...y nosotros podremos detectar si del otro lado alguien pone un "cero".
  92. ;*** Resumiendo poner un 0 implica TRISB_X -> 0 (Convertirlo en Salida) / PORTB_X -> 0
  93. ;*** Poner un 1 Implica PORTB_X -> 1 / TRISB_X -> 1 (Convertirlo en Entrada)
  94. Inicio
  95.                 call    LeerTeclado
  96.                 call    LeerCompu
  97.                 goto    Inicio
  98.  
  99.  
  100. ;*** La idea de esta rutina es la siguiente:
  101. ;*** Primero que nada debemos pasar la informaci&#243;n del teclado al computador, con la m&#237;nima demora.
  102. ;*** No seremos agentes retendores de datos, el circuito intentar&#225; ser transparente para el teclado
  103. ;*** y el computador, solo "espiaremos" los datos para tomar acciones y en los silecios que ocurran
  104. ;*** entre ambos, enviar al host las teclas que correspondan.
  105. LeerTeclado
  106.                 btfss   PORTB,TDT       ;Lo primero entonces es pasar el dato...
  107.                 goto    Poner0          ;... al computador
  108.                 bsf     PORTB,CDT       ;Si el dato es un 1 ponemos un 1...
  109.                 bsf     INDF,CDT                ;... Convertimos el puerto a Entrada y...
  110.                 goto    BeginTec                ;...continuamos
  111. Poner0
  112.                 bcf     INDF,CDT                ;... Si el Dato es un 0, Convertimos el puerto en Salida...
  113.                 bcf     PORTB,CDT       ;... ponemos un 0 y continuamos.
  114. BeginTec
  115.                 movlw   0xFF            ;Hecho esto, verificamos si estamos a mitad...
  116.                 andwf   BITTECLADO,W    ;... de una previa lectura de tecaldo
  117.                 btfss   STATUS,Z                ;... de ser as&#237;...
  118.                 goto    LeerTec         ;... continuamos con la lectura a medio camino.
  119.                 bcf     TSTATUS,T_PAR   ;Si es una nueva lectura, limpiamos el Flag de Paridad...
  120.                 clrf    TPARIDAD                ;... la variable intermedia de control de paridad....
  121.                 clrf    TDATA           ;... limpiamos la variable que contendr&#225; el dato...
  122.                 bcf     TSTATUS,T_WAIT  ;... y el FLAG de espera de subida de reloj
  123.                 movlw   0x0B            ;Debemos leer 11 Bits desde el teclado...
  124.                 movwf   BITTECLADO      ;...Usaremos esta variable como contador para ello.
  125.  
  126. LeerTec
  127.                 btfss   PORTB,TCK       ;Testeamos El clock del teclado, si esta en bajo...
  128.                 goto    LeerTec2                ;...indicar&#237;a algo para leer, de lo contrario...
  129.                 bsf     PORTB,CCK       ;Pasamos el Valor Alto del Clock de Teclado al Computador...
  130.                 bsf     INDF,CCK                ;... y convertimos ese puerto a entrada
  131.                 bsf     TSTATUS,T_CKHI  ;Este Flag Nos avisar&#225; si el Computador desea enviar Algo
  132.                 bcf     TSTATUS,T_WAIT  ;...Aun no hay nada para recibir, Limpiamos la espera de subida de reloj...
  133.                 return                  ;...y volvemos al bucle principal
  134. LeerTec2
  135.                 bcf     INDF,CCK                ;Convertimos el puerto en Salida...
  136.                 bcf     PORTB,CCK       ;... y Transmitimos la bajada de Clock al computador
  137.                 bcf     TSTATUS,T_CKHI  ;Este Flag Nos avisar&#225; si el Computador desea enviar Algo
  138.                 btfsc   TSTATUS,T_WAIT  ;...Debemos verificar que el clock haya subido para no leer..
  139.                 return                  ;... dos o mas veces el mismo dato
  140.                 bsf     TSTATUS,T_WAIT  ;...Seteamos el FLAG de espera de subida de reloj
  141.                 call    ExtraeDato      ;Llamamos a una rutina que nos Obtiene el Dato que nos Interesa
  142.                 decfsz  BITTECLADO,F    ;Decrementamos el Bit a Leer...
  143.                 return                  ;... si aun no terminamos seguimos la rutina de lectura
  144. Tec_CKBajo
  145.                 btfss   PORTB,TCK       ;Es el &#250;ltimo bit...
  146.                 goto    Tec_CKBajo      ;... esperamos que el clock vuelva a nivel alto...
  147.                 movfw   TDATA
  148.                 movwf   TDATA1
  149.                 btfss   TPARIDAD,0      ;Verificamos si hay algun error de Paridad...
  150.                 return                  ;... si no hay error regresamos al bucle principal...
  151. ;               call    Reenvio         ;...Pero si hay error, pedimos un "Resend"...
  152.                 return                  ;...Y volvemos al bucle principal
  153.  
  154. ;-----------------------------&#160; RUTINA PARA EXTRAER LOS DATOS&#160; -----------------------------------
  155. ;*** La complejidad de esta rutina consiste en lo siguiente:
  156. ;*** Primero distinguir cual de los 11 bits estamos tratando de extraer
  157. ;*** Si es el primero, no tiene mayor relevancia, auque deber&#237;a ser un "0"
  158. ;*** Desde el segundo hasta el noveno, son los datos y debemos almacenarlos en "TDATA"
  159. ;*** Asimismo debemos verificar la paridad para saber si hubo un error en la transmisi&#243;n...
  160. ;*** ... e iremos almacenando nuestro propio c&#225;lculo de paridad en la variable "TPARIDAD"
  161. ;*** En el Bit 10 recibiremos el bit de paridad, el cual compararemos con el que nosotros...
  162. ;*** hemos calculado, si ocurri&#243; un error dejaremos constancia en la variable "TPARIDAD".
  163. ;*** Para finalizar, recibiremos el Bit 11, el bit de Stop, que debiera ser "1"
  164. ExtraeDato
  165.                 movlw   0x0B            ;Buscamos saber si este es el primer bit
  166.                 xorwf   BITTECLADO,W    ;Un XOR de BITTECLADO con 0x0B nos dir&#225; si este es el primer Bit
  167.                 btfsc   STATUS,Z                ;Si despues del XOR el bit Z del STATUS qued&#243; en "0"
  168.                 return                  ;Es el 1&#186; bit, y regreso sin hacer nada
  169.                 movlw   0x02            ;Probamos ahora si es el bit N&#186; 10, el de paridad
  170.                 xorwf   BITTECLADO,W    ;Un XOR de BITTECLADO con 0x02 nos dir&#225; si este es el Bit de Paridad
  171.                 btfsc   STATUS,Z                ;Si despues del XOR el bit Z del STATUS qued&#243; en "0"
  172.                 goto    VerifParidad    ;Es el 10&#186; bit, vamos a chequear si la paridad coincide
  173.                 movlw   0x01            ;Intentemos finalmente con el bit de Stop
  174.                 xorwf   BITTECLADO,W    ;Un XOR de BITTECLADO con 0x01 nos dir&#225; si este es el Bit de Stop
  175.                 btfsc   STATUS,Z                ;Si despues del XOR el bit Z del STATUS qued&#243; en "0"
  176.                 return                  ;Es el 11&#186; bit, y regreso sin hacer nada
  177. ;*** Si todo lo anterior fall&#243;, es un bit de datos com&#250;n y silvestre, y vamos a extraer su informaci&#243;n
  178. ;*** Utilizaremos el acarreo para "empujar" el bit de dato en la variable TDATA y formar el byte completo
  179.                 bcf     STATUS,C                ;Asumimos que el Dato es Cero limpiando el bit de acarreo...
  180.                 btfsc   PORTB,TDT       ;Verificamos si el dato enviado es un cero...
  181.                 bsf     STATUS,C                ;...si no lo es ponemos un 1 en el acarreo
  182.                 btfsc   STATUS,C                ;Antes de cargar el valor verificamos si modifica el bit de paridad...
  183.                 comf    TPARIDAD,F      ;...si el dato es un "1" el bit de paridad se ve afectado.
  184.                 rrf     TDATA,F         ;Finalmente el cero o uno es ingresado al dato
  185. ;*** algo interesante, es que el bit es ingresado como MSB, pero en los sucesivos ingresos de datos
  186. ;*** se ir&#225; desplazando hasta convertirse en LSB
  187.                 return                  ;Volvemos a la rutina que nos llam&#243;
  188. VerifParidad
  189.                 movlw   b'00001000'     ;Vamos a limpiar el bit de paridad...
  190.                 andwf   PORTB,W         ;... que nos env&#237;a el teclado...
  191.                 movwf   TGEN            ;... y lo almacenaremos en esta variable de prop&#243;sito General.
  192.                 movlw   b'00001000'     ;Hacemos lo propio con el bit de Paridad....
  193.                 andwf   TPARIDAD,W      ;... calculado por nosotros
  194.                 xorwf   TGEN,W          ;Comparamos ahora los dos bits
  195.                 bsf     TSTATUS,T_PAR   ;Asumimos que la paridad esta con error...
  196.                 btfss   STATUS,Z                ;...Ahora verificamos si hay diferencia o no...
  197.                 bcf     TSTATUS,T_PAR   ;...Si no hay diferencia limpiamos el error de paridad...
  198.                 return                  ;...Y regresamos a la rutina que nos llam&#243;.
  199.  
  200. ;*** Cuando el Computador intente enviar datos al teclado, pondr&#225; el clock a estado l&#243;gico bajo
  201. ;*** El problema es no "pillarme la cola" y pensar que el host est&#225; poniendo el clock a "0"&#160; cuando...
  202. ;*** Soy yo mismo el que lo est&#225; haciendo, esto lo evitamos con un FLAG que me dir&#225; si yo tengo el Clock abajo
  203. LeerCompu
  204.                 btfss   TSTATUS,T_CKHI  ;Chequeo el FLAG de Clock
  205.                 return                  ;Yo lo puse a nivel bajo, no obtengo nada con chequearlo ahora.
  206.                 btfsc   PORTB,CCK       ;Sabiendo que puse un 1 en el Clock, verifico si se encuentra en 0
  207.                 return                  ;Esta en uno, como yo lo dej&#233;, el host no intenta enviar ning&#250;n dato.
  208. ;*** Hay algo en el horizonte, parece que el host intenta decirle algo al teclado
  209. ;*** Lo primero que tenemos que saber es que a nuestro CheatBox no le interesa nada de lo que el host
  210. ;*** Tenga para decir, nos limitamos a transmitir la informaci&#243;n que nos llega del host al teclado
  211. ;*** Otro dato a tener en cuenta es si el host esta enviando datos o solo inhibiendo al teclado
  212. ;*** Esto es importante para saber si debo abortar o no la transmisi&#243;n en curso.
  213. ;*** Una simple inhibici&#243;n, dejar&#237;a la linea de Datos en alto y liberar&#237;a el clock
  214. ;*** Una condici&#243;n RTS, implicar&#237;a poner a nivel bajo la l&#237;nea de Datos y despues liberar el clock
  215.                 bcf     INDF,TCK                ;Convertimos el puerto clock del teclado en Salida...
  216.                 bcf     PORTB,TCK       ;... y Transmitimos la bajada de Clock al Teclado
  217. Inhib_RTS
  218.                 btfss   PORTB,CDT       ;Probamos la linea de Datos...
  219.                 goto    Req_to_Send     ;... lo temido... El computador intenta enviar datos
  220.                 btfss   PORTB,CCK       ;... Sigue a nivel alto, aun no pasa nada, pobamos el Clock
  221.                 goto    Inhib_RTS               ;... Continua a Nivel bajo, Volvemos a probar
  222.                 bsf     PORTB,TCK       ;Era solo una inhibici&#243;n temporal, Transmitimos la subida de Clock al Teclado...
  223.                 bsf     INDF,TCK                ;...y convertimos el puerto clock del Entrada
  224.                 return                  ;Volvemos al bucle principal, aqu&#237; no ha pasado nada.
  225. ;*** Esta rutina se encargar&#225; de leer el Data del host y enviarlo al Teclado, y leer el Clock...
  226. ;*** ...del Teclado y enviarselo al host, hasta que se detecte el fin de la transmisi&#243;n.
  227. ;*** La forma que voy a implementar para detectar el fin de la transmisi&#243;n del host, es descubrir el bit
  228. ;*** de Stop del host (que es un "1" l&#243;gico) y prestar atenci&#243;n a cuando el teclado lo convierta en "0"
  229. ;*** Indicando un ACK, y por lo tanto el fin de la transmisi&#243;n.
  230. Req_to_Send
  231.                 bcf     INDF,TDT                ;Convertimos el puerto de datos del teclado en Salida...
  232.                 bcf     PORTB,TDT       ;... y Transmitimos el nivel l&#243;gico bajo al teclado
  233. Libera_CK
  234.                 btfss   PORTB,CCK       ;Ahora debo esperar a que el host...
  235.                 goto    Libera_CK               ;...libere el clock
  236.                 bsf     PORTB,TCK       ;Transmito esto al Teclado, Poniendo un uno en el Clock del Teclado...
  237.                 bsf     INDF,TCK                ;... Y transform&#225;ndolo en entrada.
  238. RTS_Loop
  239.                 btfss   PORTB,TCK       ;Testeo el Nivel Logico del Clock del Teclado...
  240.                 goto    RTS_CCK_0       ;En este caso un cero... pongamoslo en el Clock del Host
  241.                 bsf     PORTB,CCK       ;En este caso un uno, ponemos un uno y....
  242.                 bsf     INDF,CCK                ;... convertimos el puerto en entrada.
  243.                 goto    RTS_Test_CDT    ;Vemos que hay en la linea de datos del host
  244. RTS_CCK_0
  245.                 bcf     INDF,CCK                ;En este caso un cero, Convertimos el puerto en salida...
  246.                 bcf     PORTB,CCK       ;...y ponemos un valor l&#243;gico de cero en &#233;l
  247. RTS_Test_CDT
  248.                 btfss   PORTB,CDT       ;Testeo el Nivel Logico de la linea de datos del host...
  249.                 goto    RST_TDT_0       ;En este caso un cero... pongamoslo en la linea de datos del teclado
  250.                 bsf     PORTB,TDT       ;En este caso un uno, ponemos un uno y...
  251.                 bsf     INDF,TDT                ;... convertimos el puerto en entrada.
  252.                 bsf     CSTATUS,C_DTHI  ;Adem&#225;s marcamos el Flag correspondiente
  253.                 goto    RTS_Test_Stop   ;Averiguemos si llegamos al bit final...
  254. RST_TDT_0
  255.                 bcf     INDF,TDT                ;En este caso un cero, Convertimos el puerto en salida...
  256.                 bcf     PORTB,TDT       ;...y ponemos un valor l&#243;gico de cero en &#233;l
  257.                 bcf     CSTATUS,C_DTHI  ;Adem&#225;s marcamos el Flag correspondiente
  258. RTS_Test_Stop
  259.                 btfss   CSTATUS,C_DTHI  ;Determinamos si el FLAG dice que puse un 1 en la salida
  260.                 goto    RTS_Loop                ;No, hay un cero, Seguimos con la transmisi&#243;n.
  261.                 btfsc   PORTB,TDT       ;Si, hay un uno, vemos si el tecladolo cambi&#243; por un cero
  262.                 goto    RTS_Loop                ;No hay cambio, continuamos con la transmisi&#243;n
  263. ;*** Fin de la transmisi&#243;n
  264.                 clrf    BITTECLADO      ;Limpiamos el Contador de bits de teclado para empezar de cero
  265. RST_End
  266.                 btfss   PORTB,TDT       ;Esperamos a que el bit de datos del teclado suba a 1
  267.                 goto    RST_End         ;Antes de regresar a la rutina principal
  268.                 return                  ;Volvemos a la rutina que nos llam&#243;
  269.                
  270.                 end                     ;Fin del Programa




   Como siempre dudas consultas y/o aportes son bienvenidos.

Salud  8)

« Última modificación: 15 de Febrero de 2007, 20:44:05 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #12 en: 15 de Febrero de 2007, 19:21:09 »
AHIJUNA.....

   En este momento no podría estar mas entusiasmado :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

   He logrado que mi artilugio comience a funcionar, de hecho en este instante, mientras escribo estas líneas, "el aparatejo esta conectado".

   Por ahora captura los datos enviados por el teclado al host y puede guardar las teclas enviadas en una variable, por otro lado es capáz de enviarle al teclado los comando que envía el computador. Es decir el teclado cree que esta conectado directo al computador, y el computador (iluso el pobre) cree que quien le envía los datos es el teclado directamente, pero mi monstruito esta "in the midle".

   Para no estar agregando el código en asembler modificado en un nuevo post, lo he incluido en el post anterior.

   Otro dato importante es que el clock interno del PIC de 4Mhz, era insuficiente (según las simulaciones) para hacer la taréa, por lo que tuve que incluir a mi pesar un componente más, una resistencia en RB7 de 6K8 para tener un oscilador RC, según mis calculos con ella el PIC ronda los 10Mhz

   Me queda ahora una tarea no menos complicada, hacer un menú con opciones y ejecutarlas a pedido del usuario al presionar algunas teclas, pero ello implica ahora que el PIC maneje los tiempos de reloj y permita además la comunicación normal del host y el teclado.

Pero la cosa mejora....  :D :D :D :-) :D :D :D

Salud 8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Keyboard CheatBox
« Respuesta #13 en: 15 de Febrero de 2007, 20:02:53 »
Felicitaciones! Lo has hecho en tiempo record! :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Keyboard CheatBox
« Respuesta #14 en: 15 de Febrero de 2007, 20:34:37 »
   Gracias aitopes.
   Aunque lo de tiempo record está por verse, creo que me falta lo más dificil.
   Lo otro es que el chirimbolo ya hizo su primer "pataleta", como era casi obvio me puse a jugar UT con el aparatito conectado y despues de unos minutos el teclado dejó de funcionar y el PC émitía mas "beeps" que sapo con hipo.
   Desconecte el teclado, y el artilugio y la cosa seguía igual, no tuve mas remedio que pegarle al reset con un zapato para que se callara.
   Espero encontrar que causó el problema, me imagino que en algún lado no estoy siguiendo el protocolo de comunicación al pie de la letra, en general es lo que mas me enferma que suceda, porque cuando no sabes que causó el problema tapoco sabes como solucionarlo.
   En las simulaciones trabajaba bien, pero generalmente uno no plantea todas las posibilidades, incluso como comenté, escribí en este foro y luego mande un mail con el aparatito andando excelente, fue en el UT me dio problemas.

   Bueno, si alguien ve algo mal en el código, no dude en avisarme.

Salud  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.