Autor Tema: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)  (Leído 70709 veces)

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

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Si no recuerdo mal, ya existe una librería completa, que hace lo que estas comentando, en MikroBasic, pero nada como hacer la librería propia ¿verdad?  :D

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Si no recuerdo mal, ya existe una librería completa, que hace lo que estas comentando, en MikroBasic, pero nada como hacer la librería propia ¿verdad?  :D

Si, así me aseguro que entiendo como funciona y de paso me divierto  :mrgreen: :mrgreen: :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado fornelius84

  • PIC10
  • *
  • Mensajes: 1
Hola a todos. e estado leyendo pero hay algunas cosas que no me quedan claras.

Si por ejemplo yo quisiera emular un cntrl+alt+supr con el PIC para enviarselo al PC y que este se reiniciara, necesitaria de alguna forma manipular el puerto PS-2 con algun hardware??

E visto que hay gente que como mínimo, usa un conector PS2, donde se conecta el teclado al PIC, luego otro mas donde comunica PIC al PC.

Estoy algo peridido. Solo se que tengo que dar gato por liebre ;)

Saludos

Desconectado megadigit

  • PIC10
  • *
  • Mensajes: 15
Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
« Respuesta #48 en: 25 de Noviembre de 2009, 19:32:17 »
Muy buen proyecto, solo me quedan algunas dudas, que tal ves sean tontas pero igual prefiero preguntar:

1.- Se supone que este proyecto es para enviarle caracteres al PC, con el PIC, entonces, como es que le decimos al PIC que, por ejemplo envie una "f". Porque veo una la siguiente linea:

valor=getch();

pero de donde obtiene el valor la funcion getch();?????

2.- Se podrian definir pines que correspondan a una letra determinada y enviarsela a la PC????

3.- las variables contador y paridad nunca se utilizan en el codigo (si no me equivoco), entonces para que se ocupan?????

de antemano les agradesco mucho.

Desconectado mysterpic

  • PIC10
  • *
  • Mensajes: 1
que tal amigos de este foro, estoy muy emocionado con este proyecto de emulacion de Teclado ps/2 con pic, mi programa lo hice en asembler y funciona (ya subire el codigo pronto ya que soy nuevo), mi problema es cuando reenicio mi pc con mi modulo conectado y ya no funciona¡¡, debe ser que al iniciar el sistema hace una inicializacion quisiera que me  digan el porque de esto les agradecere bastantate

Desconectado shadowpucci

  • PIC10
  • *
  • Mensajes: 1
Buenas... Realmente que se pasaron con este proyecto...

yo estaba necesitando emular un teclado conectado al ps2 sin que este uno conectado realmente, por lo que la duncionalidad del proyecto me sobra!. Tengo conocimientos de C para PC y para 8051, por lo que hice un soft en una pc que saque el comando por puerto paralelo (no habia ganas de protobard con el micro, y como tengo hecha la interfaz de la pag de esteca55 para puerto paralelo, bueno, usemos esa dije...) y no puedo hace que la pc 2 (a la que quiero "emularle" un teclado) me reconozca el "teclado" conectado. Yo saco por dos pines las señal de CK y datos, con el AAh de "BAT succes", pero nada... jamas me reconoce un "teclado" conectado... lleva alguna otra clase de handshaking el teclado? mis conocimientos en cuanto a esto son algo limitados, solo algunas cosas que saque de las paginas sugeridas por ustedes. Este proyecto tiene en cuenta eso? se podria utilizar?



Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Te dejo unas funciones que he utilizado para implementación completa de la emulación, sin necesidad de otro teclado. Se lee los comandos que envía host y se le responde adecuadamente:

Lectura y escritura de bytes:


Código: C
  1. /* ****************************************************************************************** */
  2. void vEnvia_Byte(char Data){
  3. char k=0,Unos=1;
  4.  
  5.    while(input(T_CLOCK)==0);
  6.    output_high(T_CLOCK);
  7.    output_high(T_DATA);
  8.    output_drive(T_DATA);
  9.    output_drive(T_CLOCK);
  10.    /* ** Enviamos Bit Start ** */
  11.    output_high(T_CLOCK);
  12.    output_high(T_DATA);
  13.    delay_us(40);
  14.    output_low(T_DATA);
  15.    delay_us(40);
  16.    output_low(T_CLOCK);  
  17.    delay_us(40);
  18.    /* ** Enviamos 8 bits de datos ** */
  19.    for(k=0;k<8;k++){
  20.       output_high(T_CLOCK);
  21.       delay_us(5);
  22.       output_bit(T_DATA,Data & 0x01);
  23.       delay_us(35);
  24.       output_low(T_CLOCK);
  25.       delay_us(40);
  26.       if(bit_test(Data,0)==1){Unos++;}
  27.       Data>>=1;  
  28.    }
  29.    /* ** Enviamos bit de paridad ** */
  30.    output_high(T_CLOCK);
  31.    delay_us(5);
  32.    output_bit(T_DATA,Unos&0x01);
  33.    delay_us(35);
  34.    output_low(T_CLOCK);
  35.    delay_us(40);
  36.    /* ** Enviamos bit Stop ** */
  37.    output_high(T_CLOCK);
  38.    delay_us(5);
  39.    output_high(T_DATA);
  40.    delay_us(35);
  41.    output_low(T_CLOCK);
  42.    delay_us(40);
  43.  
  44.    output_float(T_CLOCK);
  45.    output_float(T_DATA);
  46.  
  47.    delay_us(100);
  48. }
  49. /* ****************************************************************************************** */
  50. char cLee_Byte(void){
  51. char k;
  52. char Data=0xEC;
  53.  
  54.    /* ** Condicion RTS ** */
  55.    delay_us(100);
  56.    if(input(T_DATA)==0){
  57.       /* ** Esperamos a que el Host este listo para enviar datos ** */
  58.       while(input(T_CLOCK)==0);
  59.       output_high(T_CLOCK);
  60.       output_drive(T_CLOCK);
  61.       output_high(T_CLOCK);
  62.       delay_us(200);
  63.       output_low(T_CLOCK);
  64.       if(input(T_DATA)==0){
  65.          /* ** Se recibe los 8 bits de datos ** */
  66.          for(k=0;k<8;k++){
  67.             delay_us(40);
  68.             output_high(T_CLOCK);
  69.             delay_us(20);
  70.             shift_right(&Data,1,input(T_DATA));
  71.             delay_us(20);
  72.             output_low(T_CLOCK);
  73.          }
  74.          /* ** Se ignora bit de paridad ** */
  75.          delay_us(40);
  76.          output_high(T_CLOCK);
  77.          delay_us(40);
  78.          output_low(T_CLOCK);
  79.          /* ** Se testea bit Stop ** */
  80.          delay_us(40);
  81.          output_high(T_CLOCK);
  82.          delay_us(20);
  83.          if(input(T_DATA)==1){
  84.          delay_us(15);
  85.          /* ** Se envia Ack ** */
  86.          output_drive(T_DATA);
  87.          output_low(T_DATA);
  88.          delay_us(5);
  89.          output_low(T_CLOCK);
  90.          delay_us(40);
  91.          output_high(T_CLOCK);
  92.          delay_us(10);
  93.          }
  94.       }
  95.    }
  96.    output_float(T_CLOCK);
  97.    output_float(T_DATA);
  98.    delay_us(100);
  99.    return(Data);
  100. }


Mediante interrupción por RB0 determino cuando el host quiere comunicarse:

Código: C
  1. /* ****************************************************************************************** */
  2. #int_EXT
  3. void Leer_Host(){
  4. static char Dato_Host;
  5.  
  6.    Dato_Host=cLee_Byte();
  7.    if(Dato_Host!=0xEC){
  8.       if(Dato_Host==0xEE){
  9.          vEnvia_Byte(0xEE);
  10.       }else{
  11.          vEnvia_Byte(0xFA);
  12.          if(Dato_Host==0xF2){
  13.             vEnvia_Byte(0xAB);
  14.             vEnvia_Byte(0x83);
  15.          }
  16.          if(Dato_Host==0xFF){
  17.             delay_ms(1);
  18.             vEnvia_Byte(0xAA);
  19.          }
  20.       }
  21.    }
  22. }
  23. /* ****************************************************************************************** */


Inicialización:

Código: C
  1. output_float(T_CLOCK);
  2.    output_float(T_DATA);
  3.    
  4.    delay_ms(800);
  5.    vEnvia_Byte(0xAA);  
  6.    ext_int_edge(H_TO_L);
  7.    clear_interrupt(INT_EXT);
  8.    enable_interrupts(INT_EXT);
  9.    enable_interrupts(GLOBAL);
  10.    
  11.    while(1){


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado kiljaeded

  • PIC10
  • *
  • Mensajes: 1
Les hago una pregunta muchchos, se podria usar el 16f84 en el codigo que posteo nostrico, obviando la funcion rs232 para enviar un par de teclas al pc?

Desconectado Jummi

  • PIC10
  • *
  • Mensajes: 21
Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
« Respuesta #53 en: 16 de Noviembre de 2010, 13:06:11 »
Estoy intentando emular un teclado ps/2 desde el pic. Mi intencion es que enviando un comando desde rs232, inyectar en el teclado ps/2 la emulacion de la tecla. El teclado que tengo  es usb, por lo que no hay ningun teclado ps/2 conectado al pc.Estube probando el codigo de Redpic y no me funciona. Yo creo que el problema esta en que  cuando se incia el ordenador el pc manda unos datos al teclado para saber si esta y lo inicializa. Probando con un teclado Ps/2, conectado desde que se inicia el pc, funciona perfectamente. Si lo conecto despues de que cargo el wondows, este no se activa ni envia ninguna pulsacion.

 Por lo que yo creo que se necesita tener conectado el teclado desde un principio y tener emulado la secuencia de arranque del teclado.

  Creen que estoy en lo cierto?

  Ahi creo yo donde entra el codigo de publico suky. Suky podrias pegar el codigo completo de alguno de tus programas para que me sea mas facil entenderlo? Soy muy novato y prefiero verlo entero (con las conexiones al pic si hicieras el favor).

Lo estoy intentando realizar con un pic16f88.

Un saludo a todos.

Desconectado ale_nevermind

  • PIC10
  • *
  • Mensajes: 25
Estimados colegas, les comento que logre implementar exitosamente el codigo.
Tengo el problema de que en algunas maquinas puedo enviar sin problema los scan codes, y en otras no. Supongo que es por el problema de hacer la comunicacion bidireccional.

En mi caso, use un PIC16F628a, pero lamentablemente la entrada de interrupcion externa las estoy usando para leer pulsos de sensores, y dichos pulsos son enviados hacia la PC a traves de PS2.

Como dije anteriormente, funciona correctamente sin la comunicacion bidireccional, pero como hago para leer lo que envia el host si no tengo acceso a la interrupcion.

Muchos saludos!

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
como me enredo mucho con el basic intento pasarlo a asembler.En un progama de este foro hecho en basic (no me acuerdo de quien),dice que si el computador envia un dato o envia otro, se le responde con el pic AA o EE o AB+83.Espero a que la linea clok enviada por el computador este baja,hago un retardo,por que no se cual dato me envia y le respondo con AA,EE,AB+83.Con ninguno de estos datos funciona, sin embargo una vez iniciado con el teclado normal y cambiándolo al pic,si consigo las 10 funciones que necesito.Ya pase por todas las paginas y pdf que hay sobre este tema y no atino.Si hubiese algun amable en este foro que me echase una mano en asembler,se lo agradeceria:att jose

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
« Respuesta #56 en: 21 de Julio de 2011, 21:09:13 »
Creo que el problema se resolveria leyendo el dato que te llega desde la pc y responder adecuadamente, porque envia varios y depende si es el bios o el sistema operativo....
Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado ale_nevermind

  • PIC10
  • *
  • Mensajes: 25
Estimado Suky:

Gracias por la respuesta... acabo de enterarme que los posts no me llegan a mi correo, asi que nunca supe si llego...

Bueno, continuando con el tema, es justamente lo que hago, trato de leer lo que la PC envia desde el inicio del programa, pero este nunca responde, es mas... he creado un ciclo de prueba en espera del evento de cambio en la senal del clk y data, en teoria, al recibir datos desde la PC el PIC debiera esperar por el cambio de estado en data, y luego generar el pulso. Al esperar el pulso de data, lo que me sucede es una suceso de pulsos infinitos.

Quisiera que puedas dar mayores ayudas para implementar el codigo sin interrupciones.

Saludos!

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Siguiendo los pasos de este asunto,te dire que estoy en las mismas.Tengo un disco con xp y otro con 98,con la misma board.El xp le envia al teclado un codigo y este tiene que responder.Con el 98 no pasa esto ya que puedes conectar el teclado despues de cargar el windos y lo reconoce.Lo mas sencillo seria hacerle la vuelta al xp para que quedase esta parte como el 98.Eso se lo dejo a los duros del xp que si pueden que nos echen una mano:att jose

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Un saludo Suky.No pude con esta parte del host al teclado y viceversa.Un apunte curioso:Un disco con 98 y otro con xp y la misma board.El 98 deja meter el teclado despues de cargarlo y lo reconoce,el xp no,bloquea el mouse y hasta ahi llega.Supongo que es el controlador de teclado del xp.La cosa no es tan facil,intente modificar desde regedit los archivos de xp kbdclass.sys y i8042prt.sys (creo que son los que manejan el teclado) y tuve que formatear 3 veces para dejarlos como estaban.Att jose