TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: RedPic en 07 de Mayo de 2006, 10:05:11

Título: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 07 de Mayo de 2006, 10:05:11
Hace unos cuantos proyectos dejamos algo sin terminar de forma lógica y conveniente. Y eso es algo que mi religión no me permite. Ya decía Shakespeare: Bien estás lo que bien acaba. Asi que esto todavía no ha acabado ...

En nuestro anterior proyecto Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.net.ar/foros/index.php?topic=2256.0) conseguimos que nuestro PIC reconociese a este tipo de teclado como suyo propio, hijo adoptivo y deseado, sin echar en falta a aquellos matriciales que tanto dan que hablar entre nuestros amables picmaníacos cuando comienzan en esto de la picmanía.

Pero este proyecto estaba cojo, leía lo que el teclado PS/2 tenía que decirle ... y ... nada más. Ahora vamos a ponerle la otra pata a este proyecto completándolo con lo que indica el título de este proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)

Mi propósito es darle a aquel proyecto la vuelta como un calcetín y hacer que sea el PIC quien hable "tecladés" y podamos así conectarlo a nuestro PC, sin que éste sea capaz de detectar que lo que le hemos conectado no es exactamente lo que el cree que tiene conectado ...

Aplicaciones posibles: Uffff ..... por ejemplo un conversor RS232 a PS/2 para conectar cacharros que solo dispongan de esa salida serie ... o ... que nuestro PIC pueda por ejemplo apagar al PC enviando la secuencia [Alt][Ctrl][Del][Alt][A] .... o un data aware ... o ... qué sé yo .... (yo si sé lo que quiero hacer con él pero es un asunto privado ja ja ja  :D  :D  :D )

Los principios teóricos son exactamente los mismos que en nuestro proyecto de referencia y lo único que vamos a hacer realmente es convertir en salidas lo que antes eran entradas ... así que decidiremos qué teclas vamos a mandar, leeremos a qué codigos de rastreo son equivalentes, contruiremos el churrete con los bytes que correspondan, calcularemos sus paridades y escupiremos los bites tal como haría un PS/2 de verdad ....

Enlaces donde hay de todo lo necesario para este proyecto:

(http://picmania.garcia-cuervo.net/images/en_espagnol.gif) Ratón PS/2 controlado por un dsPIC (http://manolo.auna.net/proyectos-raton.html)

(http://picmania.garcia-cuervo.net/images/en_espagnol.gif) Teclado AT-PS2 Interfaz y funciones v1.2 (http://picmania.garcia-cuervo.net/recursos/teclado_at-ps2_interfaz_y_funciones_v1.2.pdf)

(http://picmania.garcia-cuervo.net/images/es_ingles.gif) TECHNICAL SPECIFICATION FOR G83-6000 (http://picmania.garcia-cuervo.net/recursos/kbd_spec.pdf)

(http://picmania.garcia-cuervo.net/images/es_ingles.gif) AT Keyboard Interface V1.04 (http://www.electronic-engineering.ch/microchip/projects/keyboard/v1xx/keyboard_v1xx.html)

(http://picmania.garcia-cuervo.net/images/es_ingles.gif) The PS/2 Keyboard Interface (http://www.netputer-engineering.org/ps2keyboard/)

(http://picmania.garcia-cuervo.net/images/es_ingles.gif) DIY hardware keylogger (http://www.keelog.net/diy.html)

(http://picmania.garcia-cuervo.net/images/es_ingles.gif) As to connect pic to the connector mini din (ps/2) in CCS C Forum (http://www.ccsinfo.net/forum/viewtopic.php?t=25673)

Como os digo, aquí esta T O D O ... ahora hay que darle forma ...  :mrgreen:

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 10 de Mayo de 2006, 15:55:32
Después de la  Consulta técnica sobre mezcla de señales PS/2  (http://www.todopic.com.ar/foros/index.php?topic=11946.0) realizada en el Foro Técnico y las amables pero desafiantes respuestas de los amigos Chaly (http://www.todopic.com.ar/foros/index.php?action=profile;u=459) y Nocturno (http://www.todopic.com.ar/foros/index.php?action=profile;u=2197) ... llega la hora de tomar decisiones ...

Afortunadamente los señores de Microchip tienen un micro para cada cosa ... y despues de realizar la operación matemática de extraer aquellos PIC's que estan al mismo tiempo incluidos en los dos conjuntos:

A.- El de PIC's que disponen de al menos dos interrupciones externas y

B.- El de PIC's que los amables señores de Microchip (http://www.microchip.com) han tenido la gentileza de enviarme a casa ...

llego a la conclusión definitiva de utilizar para este proyecto el PIC 18F1320 (del que aquí tenéis su Datasheet (http://picmania.garcia-cuervo.net/recursos/pic18f1220-1320 39605c.pdf))

Es pequeño, pero de gran corazón, tiene pocas patillas, las suficientes, y puede correr como un gamo ya que soporta hasta 40Mhz de reloj, tiene tres eran tres las interrupciones de Elena y por supuesto lleva en la mochila su correspondiente ICSP. ¿Que más quiero? Pues casi casi que funcionaría en la RRBOARD1 (http://picmania.garcia-cuervo.net/proyectos_rrboard1.htm) ... salvo las conexiones de los pines del RS232 que están un poco complicadillas .... en fin, no se puede tener todo en esta vida.

Abajo os pongo un poco de la biografía de este micro por la que me he enamorado de él:

(http://picmania.garcia-cuervo.net/images/prj_ps2emul_18f1320_devices.gif)

(http://picmania.garcia-cuervo.net/images/prj_ps2emul_18f1320_pinout.gif)

Esta es la asignación de funciones que le he previsto provisionalmente ...

(http://picmania.garcia-cuervo.net/images/prj_ps2emul_18f1320_uso_de_pines.gif)

Os mantendré informados.

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: nostrico en 02 de Junio de 2006, 14:48:35
Amigo el proyecto que estoy queriendo hacer es alrevez es enviar datos del PIC al PS/2... puesto que deseo hacer mis tarjetas de presentación de un club de pana y dispongo de un PC pero he realizado tarjetas con memorias de 24LC02 que ocurre quiero enviar la data por el PS/2 para que valla contabilizando la información capturada en un word o excel... gracias...
 :) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: nostrico en 05 de Junio de 2006, 11:03:11
Gracias RED PIC... Ya lo termine y funciona muy bien... NoStRiCo
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: QUENELVI en 19 de Junio de 2006, 13:19:13
Se un poquitin de programacion de pics, y pues dentro de un proyecto de manipulacion de software necesito  manipular el ordenador desde un pic, y me he  :shock: con la sabiduria que aqui se muestra.
pues bien como tu dices RedPic, esta funcion puede tener muchas aplicaciones,  entre ellas la de mi proyecto,
La ejecucion del teclado sin que este este presente,esta super! :)   Me podrias ilustrar acerca de como hacerlo te lo agradecería enormenente, pues la verdad si me hace falta una manita  :
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 04 de Julio de 2006, 06:19:18
Del salón en el ángulo oscuro,
de su dueño tal vez olvidada,
silenciosa y cubierta de polvo,
veíase el arpa.


   Gustavo Adolfo Bécquer (1836-1870)

No creaís ni por un momento que la Emulación Teclado PS/2 con PIC es como el arpa de don Gustavo.  :mrgreen:

Ahora podéis comprender los post en el Foro Técnico (http://www.todopic.com.ar/foros/index.php?board=25.0) que llevan por títulos Consulta técnica sobre mezcla de señales PS/2 (http://www.todopic.com.ar/foros/index.php?topic=11946.0), Función del pin VEE en CD4051, CD4052 ó CD4053 (http://www.todopic.com.ar/foros/index.php?topic=12124.0) y Mezclando Fuentes de Alimentación y otros asuntos relacionados con el PS/2 (http://www.todopic.com.ar/foros/index.php?topic=12795.0).

Aquí está el resultado de todo ello: Mi Emulador de Teclado PS/2 versión Pachanga de Chiringito de Playa  :D  :D  :D

(http://picmania.garcia-cuervo.net/images/prj_kbdemul_schema_thumb.gif) (http://picmania.garcia-cuervo.net/images/prj_kbdemul_schema.gif)

(http://picmania.garcia-cuervo.net/images/prj_kbdemul_pcb_Componentes.gif)

(http://picmania.garcia-cuervo.net/images/prj_kbdemul_pcb.gif)

(http://picmania.garcia-cuervo.net/images/prj_kbdemul_foto_01_pcb.gif)

Ahora voy a implementar en la RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.0) lo que estuvimos haciendo con la RRBOARD1 en Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0) con el fin de tener un "receptor" de teclado que no sea mi PC, se puede montar un follón demasiado gordo depurando con mi PC y su propio teclado.

Asi al montar el KBDEMUL podrá "emitir" señales de teclado que en vez de ir al PC irán a la RRBOARD2 y ésta los convertirá a RS232 que podré ver por el Monitor Serie del PC  :mrgreen:

Ea, a continuar currando ...  :P  :P  :P

Os mantendré informados.


Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 05 de Julio de 2006, 07:46:36
En Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0) ya tenéis disponible la necesaria adaptación de la RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.0) para que pueda recibir el Teclado y emitir vía RS232 al PC.

Con eso pretendo depurar el "emisor" antes de pasar a la prueba real de todo en serie PC <-> PIC <-> Keyboard  :mrgreen:  :mrgreen:  :mrgreen:

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 17 de Julio de 2006, 18:51:09
Este proyecto continúa adelante con buen pié ...  :mrgreen:  :mrgreen:  :mrgreen:

Soldados los componentes sobre el PCB, dado a la corriente contínua, reconocido el 18F1320 como amigo por el GTP-USB+, programado con el echo.c ...

(http://picmania.garcia-cuervo.net/images/prj_kbdemul_foto_02_primera_luz.gif)

(http://picmania.garcia-cuervo.net/images/prj_kbdemul_dump_01_primera_respuesta.gif)

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: poseidon20 en 18 de Julio de 2006, 00:29:56
Hola que tal a todos, no se si preguntar, hasta verguenza me da por el contenido del tema, pero espero que el amigo RedPic se digne a mirar esta humilde pregunta. Aca va, Bueno para comenzar estoy tratando de utilizar el teclado de una PC para poder escribir mensajes en un panel matricial (de esos endonde la letra sale de un lado y todo ese rollo), bueno la mayoria que he visto graban los mensajes en esos paneles por medio de la PC pero lo que prentendemos hacer es que el panel sea independiente de esta y solo utilize el teclado, como se comprendera me baje los enlaces que el amigo RedPic pusos al inicio, sino no tendria base sobre la cual formular mis preguntas. La cuestion es que entiendo bien como el teclado envia la informacion, pero tengo una dudillas, digamos que al presionar una tecla el teclado envia el "make code", pero si la tecla se mantiene presionada seguira enviando ese make code hasta que se suelte o solo lo envia una vez a pesar de que la tecla siga presioanda. Bueno cuando la suelta siempre enviara las dos tramas del "brake code". Necesito saber esto para el programa que pienso hacer. Espero que no sea mucha molestia ni insolensia mia preguntar esto, espero que me puedan ayudar. Gracias

:-/ :-/ :-/Cada Uno es Dueño de Su Destino :-/ :-/ :-/
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: BrunoF en 18 de Julio de 2006, 01:07:36
Hola.
Pues si mal no recuerdo, si mantienes una tecla presionada, seguirá enviando "make codes" hasta que la sueltes.Momento en el cual enviará un "break code". El tiempo entre cada "make code" que enviará si mantienes una tecla presionada es configurable.
¿O estoy equivocado Redpic?
Saludos.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 18 de Julio de 2006, 05:39:19
Exactamente Bruno. El teclado tiene una variable configurable que es el "repeat time" o tiempo de repetición de tecla pulsada.

Poseidon, puedes ver cómo manejo esto desde un PIC en el hilo Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0) Ahí publico el programa completo que lee el teclado y transmito por la RS232 lo que deseo ... tu puedes utilizarlo para guardar un texto, o dar ordenes al PIC o lo que quieras ...

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 20 de Julio de 2006, 21:24:58
Gracias al código escrito por Nostrico (http://www.todopic.com.ar/foros/index.php?action=profile;u=4476) en su hilo NECESITO TRANSMITIR DATOS POR EL PS/2 DEL TECLADO... (http://www.todopic.com.ar/foros/index.php?topic=12301.msg73293#msg73293)
este proyecto llega a buen puerto ...  :-/  :-/  :-/

He utilizado sus dos funciones para emular el PS/2 y funciona perfectamente.

Al final he realizado lo que os decía hace unos días:

Montar la KBDEMUL recibiendo códigos ASCII desde la RS-232 y convirtiendolos a PS/2, y después envíandoselos a la RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.0) programada con el software del Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0), que a su vez lee PS/2 y convierte a la inversa en ASCII y lo transmite a otro canal serie  :D  :D  :D

O sea: PC Serie COM3 -> PS/2 en KBDEMUL -> PS/2 en RRBOARD2 -> PC Serie COM1


(http://picmania.garcia-cuervo.net/images/prj_kbdemul_dump_primera_inyeccion.gif)

El programa de test queda tal como puede verse mas abajo

Código: C
  1. // Original de Nostrico del foro Todopic
  2. // adaptado al 18f1320 por redpic
  3. //
  4.  
  5. #include <18f1320.h>
  6. #fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
  7. #use delay(OUT_CLOCK=20000000)
  8. #use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B4)
  9.  
  10. #define CONTROL_A    PIN_A0
  11. #define CONTROL_B    PIN_A1
  12. #define CONTROL_C    PIN_A2
  13. #define CONTROL_INH  PIN_A4
  14.  
  15. #define OUT_CLOCK    PIN_B3
  16. #define OUT_DATA     PIN_B5
  17.  
  18. unsigned int8 rec_char;
  19.  
  20. unsigned char convert_ascci_to_scancode(unsigned char c){
  21.  
  22.    unsigned char scancode;
  23.  
  24.         if (c == 'a' || c == 'A') {scancode = 0x1c;}
  25.    else if (c == 'b' || c == 'B') {scancode = 0x32;}
  26.    else if (c == 'c' || c == 'C') {scancode = 0x21;}
  27.    else if (c == 'd' || c == 'D') {scancode = 0x23;}
  28.    else if (c == 'e' || c == 'E') {scancode = 0x24;}
  29.    else if (c == 'f' || c == 'F') {scancode = 0x2b;}
  30.    else if (c == 'g' || c == 'G') {scancode = 0x34;}
  31.    else if (c == 'h' || c == 'H') {scancode = 0x33;}
  32.    else if (c == 'i' || c == 'I') {scancode = 0x43;}
  33.    else if (c == 'j' || c == 'J') {scancode = 0x3b;}
  34.    else if (c == 'k' || c == 'K') {scancode = 0x42;}
  35.    else if (c == 'l' || c == 'L') {scancode = 0x4b;}
  36.    else if (c == 'm' || c == 'M') {scancode = 0x3a;}
  37.    else if (c == 'n' || c == 'N') {scancode = 0x31;}
  38.    else if (c == 'o' || c == 'O') {scancode = 0x44;}
  39.    else if (c == 'p' || c == 'P') {scancode = 0x4d;}
  40.    else if (c == 'q' || c == 'Q') {scancode = 0x15;}
  41.    else if (c == 'r' || c == 'R') {scancode = 0x2d;}
  42.    else if (c == 's' || c == 'S') {scancode = 0x1b;}
  43.    else if (c == 't' || c == 't') {scancode = 0x2c;}
  44.    else if (c == 'u' || c == 'U') {scancode = 0x3c;}
  45.    else if (c == 'v' || c == 'V') {scancode = 0x2a;}
  46.    else if (c == 'w' || c == 'W') {scancode = 0x1d;}
  47.    else if (c == 'x' || c == 'X') {scancode = 0x22;}
  48.    else if (c == 'y' || c == 'Y') {scancode = 0x35;}
  49.    else if (c == 'z' || c == 'Z') {scancode = 0x1a;}
  50.  
  51.    else if (c == '0') {scancode = 0x45;}
  52.    else if (c == '1') {scancode = 0x16;}
  53.    else if (c == '2') {scancode = 0x1e;}
  54.    else if (c == '3') {scancode = 0x26;}
  55.    else if (c == '4') {scancode = 0x25;}
  56.    else if (c == '5') {scancode = 0x2e;}
  57.    else if (c == '6') {scancode = 0x36;}
  58.    else if (c == '7') {scancode = 0x3d;}
  59.    else if (c == '8') {scancode = 0x3e;}
  60.    else if (c == '9') {scancode = 0x46;}
  61.  
  62.    else if (c == '/') {scancode = 0x5a;}   // ENTER
  63.    else if (c == ' ') {scancode = 0x29;}   // ESPACIO
  64.    else if (c == '>') {scancode = 0x0d;}   // TABULADOR
  65.    else if (c == '<') {scancode = 0x66;}   // BORRADOR
  66.    else if (c == '$') {scancode = 0x58;}   // TAG DE MAYUSCULA $m$yuscula
  67.    else if (c == '-') {scancode = 0x4a;}   // -_
  68.  
  69.    else {scancode = 0x29;}                 // Cualquier otra cosa ESPACIO
  70.  
  71.    return scancode;
  72. }
  73.  
  74.  
  75. void output_scancode_ps2(unsigned char scancode){
  76.  
  77.    int contador;
  78.    int salida, unos=1;
  79.    boolean paridad=true;
  80.  
  81.    output_high(OUT_CLOCK);        // START -------------------------------
  82.    output_high(OUT_DATA);
  83.    delay_us(40);
  84.  
  85.    output_high(OUT_CLOCK);
  86.    output_low(OUT_DATA);
  87.    delay_us(40);
  88.  
  89.    output_low(OUT_CLOCK);
  90.    output_low(OUT_DATA);
  91.    delay_us(40);
  92.  
  93.    salida =1;
  94.  
  95.    do{
  96.       output_high(OUT_CLOCK);
  97.       output_bit(OUT_DATA, scancode&0x01);
  98.       delay_us(40);
  99.       output_low(OUT_CLOCK);
  100.       output_bit(OUT_DATA, scancode&0x01);
  101.       delay_us(40);
  102.  
  103.       if ((scancode & 0x01) == 0x01) {unos++;}
  104.  
  105.       scancode = scancode>>1;
  106.       salida++;
  107.  
  108.    }while(salida <  9);
  109.  
  110.    output_high(OUT_CLOCK);        // PARITY ------------------------------
  111.    output_bit(OUT_DATA, unos&0x01);
  112.    delay_us(40);
  113.    output_low(OUT_CLOCK);
  114.    output_bit(OUT_DATA, unos&0x01);
  115.    delay_us(40);
  116.  
  117.    output_high(OUT_CLOCK);        // STOP --------------------------------
  118.    output_high(OUT_DATA);
  119.    delay_us(40);
  120.    output_low(OUT_CLOCK);
  121.    output_high(OUT_DATA);
  122.    delay_us(40);
  123.  
  124.    output_high(OUT_CLOCK);        // FIN ---------------------------------
  125.    output_high(OUT_DATA);
  126.  
  127.    delay_ms(175);
  128. }
  129.  
  130.  
  131. void main(){
  132.  
  133.    delay_ms(300);
  134.    printf("\r\nKBDEMUL with a 18F1320\r\nInject signal for PS/2\r\n\n");
  135.    delay_ms(500);
  136.  
  137.    output_high(CONTROL_A); // Conmuta CD4053 a salida PIC->PC
  138.    output_high(CONTROL_B);
  139.    output_high(CONTROL_C);
  140.  
  141.    do{
  142.       rec_char=getch();
  143.       putc(rec_char;);
  144.       output_scancode_ps2(convert_ascci_to_scancode(rec_char));
  145.    }while(true);
  146.  
  147. }

Y por último el montaje completo conectado al PC de mi hija, que alimenta y "habla" con el teclado salvo que el PIC "inyecte" algun texto, que entonces aparece en el PC tal cual se hubiese tecleado  :mrgreen:  :mrgreen:  :mrgreen:

(http://picmania.garcia-cuervo.net/images/kbdemul_funcionando_montaje.jpg)


Y con esto y un bizcocho, hasta mañana a las ocho  :D  :D  :D

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: nostrico en 11 de Septiembre de 2006, 09:41:34
Saludos REDPIC te felicito por este proyecto amigo... y estamos a la orden... Tengo otros codigitos que le pueden servir a mucha gente por acá... pronto se los enviaré...

 
:-/ NOSTRICO  :-/  NOSTRICO  :-/ NOSTICO  :-/ JGCJ ... OPEN SOURCE...
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: ESTECA55 en 11 de Septiembre de 2006, 12:08:49
hola

RedPic, fantastico este proyecto, la verdad que tiene muchas aplicaciones, y paso a contarles una que pienso darle muy pronto,

El programa de CNC Mach, tiene la posibilidad de asignar como entradas cualquier tecla del teclado, ya que por el puerto paralelo se disponen solo de 5 entardas, de esta manera, se puede ampliar la cantidad de entradas.

Gracias, ya les contare cuando arme algo

Exitos
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jel_75 en 20 de Octubre de 2006, 18:08:18
Hola, los felicito por este proyecto la verdad que muy bueno, pero ahora los molesto con una pregunta se podria hacer que tambien leyese e indicase el estado de los 3 leds? alguna pista...

Muchas Gracias de parte de "El Rengo de la Maraton de los PICs".
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 21 de Octubre de 2006, 03:21:14
Jel_75:

El documento "definitivo" es el TECHNICAL SPECIFICATION FOR G83-6000 (http://picmania.garcia-cuervo.com/recursos/kbd_spec.pdf), en la página 20 tienes cómo encender o apagar los tres Led's del tecaldo desde el PC/PIC que hace de Host.

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jel_75 en 21 de Octubre de 2006, 09:35:58
Muchas Gracias RedPic, lo que estaba buscando era al reves poder leer cuando el PC ordena al keyboard encender alguna luz para en mi caso activar un dispositivo externo, pero ese manual me viene de perlas, ya uqe creo que podre leer cuando el PC ponga esos condigos al PIC y usarlos, si me funciona subire el codigo resultante.

 :-/

Saludos
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 21 de Octubre de 2006, 10:08:48
Claro, ahí tienes el comando, para enviarlo ... o para leerlo. La info es la misma.

Con este documento he hecho este Emulación teclado en el que estamos y el contrario :  Ponga un teclado PS/2 en su PIC (http://www.todopic.com.ar/foros/index.php?topic=2256.0) que son las dos caras de una misma cosa  :mrgreen:

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 07 de Noviembre de 2006, 18:02:34
 :-/  :mrgreen:  :mrgreen:  :mrgreen:  :-/

Mi primer producto profesional ....

Aunque la primera tirada ha sido realizada de forma artesanal la siguiente va ya con todas las bendiciones de una fabricación profesional, profesional.

Muchas gracias al amigo Azicuetano por su apoyo y ayuda.  :wink:

(http://picmania.garcia-cuervo.net/images/kbdemul_produccion_linea.jpg)

(http://picmania.garcia-cuervo.net/images/kbdemul_produccion_detalle.jpg)

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Azicuetano en 07 de Noviembre de 2006, 18:55:16
Gracias a ti por compartirlo!!!  :mrgreen:

Un saludo desde Alicante.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 24 de Noviembre de 2006, 16:17:47
¡¡¡ Gracias Iván !!!

(http://picmania.garcia-cuervo.net/images/kbdemul_-_profesional_pcb.jpg)

Primera remesa profesional de placas del KBDEMUL  :mrgreen: :mrgreen: :mrgreen:



Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: PalitroqueZ en 24 de Noviembre de 2006, 16:50:30
:-/  :mrgreen:  :mrgreen:  :mrgreen:  :-/

Mi primer producto profesional ....

Aunque la primera tirada ha sido realizada de forma artesanal la siguiente va ya con todas las bendiciones de una fabricación profesional, profesional.

Muchas gracias al amigo Azicuetano por su apoyo y ayuda.  :wink:

Te quedaron muy bonitos los equipos RedPic, Parecen equipos de acabado profesional. Buen trabajo  :)

Salu2
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: aitopes en 24 de Noviembre de 2006, 17:12:59
Que buen keylogger por hard que se podria hacer aprovechando todo lo expuesto en este hilo!  :shock:

Saludos. :mrgreen:
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Azicuetano en 26 de Noviembre de 2006, 21:11:39
Citar
¡¡¡ Gracias Iván !!!



Primera remesa profesional de placas del KBDEMUL   


OSTRAS!!! que guapas que se te han quedado Diego!!!! Son preciosas las PCB´s.

Así si que se sueldan rápido, ¿eh? jaja. Bueno tío... a ver si hay suerte y os piden tantos equipos como para que no deis a basto a soldar y os lo tengan que hacer unos terceros.

Es icreible ver la gestación del KBDEMUL y... ver lo bien que se queda después de que lo hallas parido  :mrgreen: :mrgreen:


Un saludo desde Alicante.

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Nocturno en 27 de Noviembre de 2006, 02:36:00
Enhorabuena, maestro Diego.  :-/ :-/ :-/
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: LordLafebre en 27 de Noviembre de 2006, 12:16:28
Hola:

Felicidades Redpic...!!!!   :-/ :-/
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: Manofwar en 27 de Noviembre de 2006, 16:35:43
Enhorabuena Diego, muy guapas tus niñas. :lol:
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: BrunoF en 27 de Noviembre de 2006, 19:14:42
Felicidades Diegooo!!!
Estas hecho un crack!

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: aitopes en 18 de Diciembre de 2006, 01:19:59
A ver.....RedPic, corrigeme si estoy muy equivocado:

¿Seria posible usando lo expuesto en este hilo hacer una interfaz que "traduzca" la pulsacion de varios pulsadores robustos a "golpes de tecla" en la PC?

Tengo muchas ganas de armar una maquina tipo "fichines" con el MAME, con un mueble y todo, y la parte de los controles me tenia medio complicado...pero si se puede engañar al ordenador que esta dentro de la caja y hacerle creer que se estan pulsando teclas (las asignadas por el MAME) mientras que en realidad se estan machacando brutos e irrompibles pulsadores industriales, seria la ostia! :-/

Es posible?!?!? :shock:
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 18 de Diciembre de 2006, 02:16:29
Si, se puede.

Puedes convertir cualquier cosa en teclazos de ordenador. Exactamente eso es lo que hago con este diseño, que ya tiene hasta su versión comercial: Las cajas que ves en los post anteriores recogen datos de tarjetas chip y los "inyectan" en el PC exactamente como si hubiesen sido tecleados por un keyboard normal y corriente.  :mrgreen:




Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: aitopes en 18 de Diciembre de 2006, 09:37:23
Bien!
Lo mio sera mas que sencillo: 10 o 12 pulsadores, y un bucle leyendolos...cuando se pulse alguno, enviar el codigo al puerto, y a cruzar los dedos....;)
Voy a leer todo para ver el tema de los tiempos, etc.
Gracias!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: MGLSOFT en 18 de Diciembre de 2006, 09:41:19
A ver.....RedPic, corrigeme si estoy muy equivocado:

¿Seria posible usando lo expuesto en este hilo hacer una interfaz que "traduzca" la pulsacion de varios pulsadores robustos a "golpes de tecla" en la PC?

Tengo muchas ganas de armar una maquina tipo "fichines" con el MAME, con un mueble y todo, y la parte de los controles me tenia medio complicado...pero si se puede engañar al ordenador que esta dentro de la caja y hacerle creer que se estan pulsando teclas (las asignadas por el MAME) mientras que en realidad se estan machacando brutos e irrompibles pulsadores industriales, seria la ostia! :-/

Es posible?!?!? :shock:

Que es el MAME??
Obviar respuestas groseras ... :D :D
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: aitopes en 18 de Diciembre de 2006, 09:49:04
Hola!

Micro Arcade Machine Emulator es un soft que se consigue en varios sabores (win, linux, dos, etc) que permite emular el hard de los "fichines", esas maquinas recreativas de los 80-90. Soporta casi 2000 juegos, y para jugar solo hace falta una PC pequeña, este soft gratis y la ROM del juego que quieras. Por ejemplo, el PAC MAN ocupa unos 8 kb. La imagen y sonidos que ves en la pantalla son exactos a los originales....de hecho, estas usando el programa original que esta corriendo en una maquina virtual.
Lo que voy a hacer es el mueble para esconder la compu dentro, y hacerme el bocho de que tengo una de las maquinas originales....prometo mostrar resultados, y si hay interes, abrir un hilo e ir mostrando resultados.

Saludos!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 18 de Diciembre de 2006, 09:50:33
MAME significa Multiple Arcade Machine Emulator ... Espacio Latino (http://mame.espaciolatino.com/)  :D






Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: mariofer en 18 de Julio de 2008, 19:57:46
Lo que voy a hacer es el mueble para esconder la compu dentro, y hacerme el bocho de que tengo una de las maquinas originales....prometo mostrar resultados, y si hay interes, abrir un hilo e ir mostrando resultados.


Si Ariel, hay bastante interes de mi parte! has concluido el proyecto?
Me interesaria mucho ver como has implementado lo de leer pulsadores y enviar el codigo correspondiente a una tecla al PC.
Saludos!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: juasan11 en 08 de Diciembre de 2008, 10:53:43
Buenas redpic. Yo tambien ando haciendo un proyecto similar al tuyo, solo que necesito saber como has hecho para enviar al teclado por que aqui no veo ese codigo.
Estoy haciendo un adaptador braille para teclado y necesito capturar pulsaciones de teclado de 8 en 8 como maximo y reenviarlas con la letra coorespondiente, para el caso de las ocho teclas pulsadas la letra correspodiente es \ (alt gr, \ , suelto \,suelto alt gr),use hace mucho una funcion del amigo nostrico pero esta diseñada con delays y cuando mi adaptador empieza a ir mas rapido se acaba colgando. Estoy trabajando con una funcion hecha a base de un timer, de momento me funciona bien pero me gustaria conocer un poco mejor como lo has hecho tu.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 08 de Diciembre de 2008, 11:12:41
amigo juasan11 lo lamento pero este proyecto no contempla el by-pass entre el PC y el Teclado, solo la emulación del teclado propiamente dicho. Es como el final del viaje y no un punto de parada intermedio.

No sería especialmente complejo rediseñarlo para que se inserte entre ambos pero habría que hacer cambios sustanciales, sobre todo en el tratamiento de las señales, y sospecho que el hardware, tal como está montado, tampoco serviría.

Lo siento.

P.D.: Yo, a nivel de experimentos he hecho por separado ambas partes del problema, éste en el que emulamos un teclado PS/2 (nuetro PIC habla "tecladés")y Ponga un teclado PS/2 en su PIC (vida) (http://www.todopic.com.ar/foros/index.php?topic=2256.0) en el que leemos un Teclado PS/2 y lo utilizamos desde el PIC (nuestro PIC entiende "tecladés"). Entre ambos está lo que creo que tú quieres hacer.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: juasan11 en 08 de Diciembre de 2008, 11:44:26
Muchas gracias por la contestacion.
crees que por tiempo a 20 mhz me deberia dar tiempo a recibir toda la informacion, consultar dentro de la tabla que me he generado en rom y enviar la secuencia de scancodes correcta.
Me explico un poco mejor, tiene dos modos de funcionamiento a selecionar mediante un interruptor de palanca de dos posiciones, tiene que esto es lo que mas me ha sorprendido de tu proyecto el cd 4053, (coincidimos en esto,sorprendente), el pic 16f876 con solo una interrupcion externa dedicada al reloj del teclado, lo alimento a traves del mismo puerto ps/2.
Bueno las dos posiciones corresponden, una al modo teclado normal, (el flujo de datos no pasa por el pic, pasa por el cd 4053),la segunda es el modo braille solo se usan 8 teclas del teclado que con combinaciones de ellas se sacan los 255 caracteres del ascii.(ademas se usan las teclas como tabulador, enter, ctrl, alt,...)
Pues esto funciona bien pero con una persona acostumbrada a este tipo de escritura (suelen escribir mas rapido que una persona normal en un teclado normal), me satura el pic, o eso creo, a veces cuando son secuencias largas se acaba perdiendo algun byte del final, por ejemplo para enviar Á: pulso ´, suelto ´, pulso shift, pulso a, suelto a, suelto shift, alguna vez he perdido suelto shift y se ha quedado en mayusculas o con alt gr y ya no funcionaba nada.

Lo que yo he descifrado es que las interrupciones recibidas despues de que sueltes la primera tecla (que es cuando se pone a comparar con la tabla y a enviar el scan code sacado de la tabla)  cortan la transmision y eso que la transmision no la tengo hecha como aqui si no con  un timer.

Sera posible hacerlo todo con tan solo un pic o me hara falta ponerle dos, uno para recibir y otro para enviar.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 08 de Diciembre de 2008, 12:23:44
Sin tener muy claro cuál es la secuencia correcta puedo pensar en voz alta ...

Los 20 Mhz deberían ser suficientes, quizás habría que ver la rutina que consulta la tabla por si es posible hacerla mas rápida y eficiente, que el 90% de las veces es posible,.

Y en cualquier caso antes que poner dos PIC's, por lo engorroso, es preferible utilizar un 18F2550 o 4550 y hacerlo correr a 48Mhz con el mismos cristal de 20Mhz, con lo que debería haber tiempo mas que de sobra para ambas funciones y aún para otras si fuera necesario.

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: juasan11 en 08 de Diciembre de 2008, 12:39:10
este es el codigo destinado a entrar en las tablas,

void compara_pul(void){
   int8 w=0,pulsa=0;
   for(w=1;w<=g;w++){
      if((salida[w]!=0xF0)&&(salida[w-1]!=0xF0)&&(salida[w]!=0x00)){     //        descifro un pulsado dentro del vector donde se almacena lo recibido
         if(salida[w]==0x1C){//a
            pulsa=pulsa|0x80;                                         // con este sistema genero una especie de codigo ascii
         }
         else if(salida[w]==0x1B){//s
            pulsa=pulsa|0x40;
         }
         else if(salida[w]==0x23){//d
            pulsa=pulsa|0x20;
         }
         else if(salida[w]==0x2B){//f
            pulsa=pulsa|0x10;
         }
         else if(salida[w]==0x3B){//j
            pulsa=pulsa|0x08;
         }
         else if(salida[w]==0x42){//k
            pulsa=pulsa|0x04;
         }
         else if(salida[w]==0x4B){//l
            pulsa=pulsa|0x02;
         }
         else if(salida[w]==0x4C){//ñ
            pulsa=pulsa|0x01;
         }
      }         
   }
   for(w=0;w<41;w++){
      salida[w]=0;
   }
   x=1;
   
   braille=TABLA[pulsa];            //hay 4 tablas alojadas en rom que tiene los codigos alojados en la posicion de memoria pulsa
   braille1=TABLA1[pulsa];
   acentos=TABLA2[pulsa];
   acentos1=TABLA3[pulsa];      // con estas cuatro variables se entran en la parte de las secuencias de envio, estan todas las posibles hasta las teclas especiales

Como lo podria optimizar
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Aleix en 11 de Febrero de 2009, 09:04:31
Hola,
En primer lugar felicitar a RedPic por este genial proyecto.
Yo queria comentar un problema que tengo. Necesito hacer que un pic me envie la pulsación de una tecla cada cierto tiempo.
Lo que he hecho es montar un 16F876A en una plaquita a 10Mhz y lo he programado con el codigo que ha colgado RedPic. Al no tener que conmutar de teclado a pic he obiado todo lo referente a este hw y en el main simplemente he hecho que mande una 'a' cada 3 segundo. El HW utilizado simplemente es el conector PS/2 macho con las dos R de 10K de pull-up en el data y el clk (pines RB5 y RB3). Todo el sistema se alimenta de la tension del PC (5V del conector PS/2).
Ahora viene cuando lo conecto al PC (y este con el cursor en un bloc de notas ) en teoria tendria que escribir a    aaaaaaaaaaaaa... etc... y no hace nada... simplemente mi PC se pone a pitar... que puede suceder???

Muchas gracias por todo.
Atentamente Aleix.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jhoonyn46 en 14 de Febrero de 2009, 17:18:39
buenos dias amigo su proyecto es interesante solo quiero hacer una pregunta porque yo estoy haciendo algo parecido pero con un mouse ps/2 y no se como hacer para que el mouse me funcione en la teoria dice q tiene el mismo fucionamiento del teclado pero no es real porque de verdad no logro hacer que aunque sea me envie datos al pic porq no activa ni su reloj interno, si uste tiene algo que me pueda servir de ayuda espero me lo haga saber yo estoy programando en lenguaje c y estoy usando un pic 16f628a, gracias por todo y espero me pueda ayudar.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: SavageChicken en 14 de Febrero de 2009, 19:44:18
Hola,
En primer lugar felicitar a RedPic por este genial proyecto.
Yo queria comentar un problema que tengo. Necesito hacer que un pic me envie la pulsación de una tecla cada cierto tiempo.
Lo que he hecho es montar un 16F876A en una plaquita a 10Mhz y lo he programado con el codigo que ha colgado RedPic. Al no tener que conmutar de teclado a pic he obiado todo lo referente a este hw y en el main simplemente he hecho que mande una 'a' cada 3 segundo. El HW utilizado simplemente es el conector PS/2 macho con las dos R de 10K de pull-up en el data y el clk (pines RB5 y RB3). Todo el sistema se alimenta de la tension del PC (5V del conector PS/2).
Ahora viene cuando lo conecto al PC (y este con el cursor en un bloc de notas ) en teoria tendria que escribir a    aaaaaaaaaaaaa... etc... y no hace nada... simplemente mi PC se pone a pitar... que puede suceder???

Muchas gracias por todo.
Atentamente Aleix.

Eso que comentas, sucede cuando tu PIC no envía el tren de datos correcto al PC, seguramente hay algún bit de más o de menos en tu programa.
Recuerda también que la comunicación PC<--->Teclado es bidireccional, cuando conectas un teclado al PC, este último envía una seria de comandos al teclado para inicializarlo (a lo que el teclado debe saber responder), además cuando el PC no entiende algúna tecla enviada por el teclado le pide que se la reenvíe, por otro lado cuando el PC no puede recibir un dato por estar ocupado pone las lineas de clock y data en ciertos nivele lógicos para hacerselo saber al Teclado.
En fin... como verás la cosa no es tan solo enviar una letra "a", sino que debes respetar el protocolo de comunicación para que la cosa ande.
Todo esto te lo comento porque yo implementé un aparatito que se comunicaba con el PC y le mandaba teclas presionadas, y me dio bastante trabajo, al final tube que implementar el protocolo casi completo y recién ahí funcionó bien, antes de eso eran puros pitidos, y en el mejor de los casos funcionaba un rato y luego pitidos nuevamente.

Para que veas de que hablo date una vuelta por este link (http://www.todopic.com.ar/foros/index.php?topic=15948.0)

Salud  8)
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: basicline en 21 de Marzo de 2009, 07:53:58
Hola maestros.....
Estoy leyendo con gran interes todos los avances que teneis sobre el tema de comunicar un pic a un puerto ps/2 convencional.
Vereis yo no tengo mucha idea, por no decir nada de asembler, tengo alguna nocion de 'c' y para soldar una resistencia y un cristal valgo.
La custion es que necesito montar un circuito el cual a traves de una serie de pulsadores me envie al sistema una serie de teclas predefinidas, la cantidad de pulsadores no deberia de sobrepasar de 8.
Con un 16f84a y un cristas de 44MHz y un manual de Microchip he conseguido enviar letras pero a traves de MsDos, cuando entro en Windows tengo el mismo problema que "jhoonyn46" . He visto el post que proporciona "SavageChicken" y esta muy bien pero no llego con mis conocimientos para modificarlo en base a mis pretensiones, aunque me ha servido para saver que lo que estoy haciendo esta mal.
Os agradeceria muchisimo alguna ayuda para que alguien como yo pueda llegar a buen puerto.
Si "jhoonyn46" lo consigue, yo necesito lo mismo.

Muchas gracias y un saludo
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 21 de Marzo de 2009, 10:19:24
Aprovecho para comentaros algo sobre este tema ... iba esta mañana en el coche y me acordé del tema del teclado ps/2, tengo media docena de ellos cubriéndose de polvo amontonados uno sobre otro, y pensando en los líos que montamos cada vez que necesitamos un puñetero teclado matricial de 4x4 en lugar de tener todo un teclado de mas de cien teclas por banda, viento en popa a toda vela, no corta el mar sino vuela, un teclado bergantín  ... (http://users.ipfw.edu/JEHLE/poesia/PIRATA.HTM)   :D :D

Me dije yo a mi mismo ensimismado, como mirando para adentro, te voy a hacer unos tecladones como los que usa el ranchero te los comienzo de lana, te los acabo de cuero ... (http://www.redkaraoke.es/canciones/alla-en-el-rancho-grande/16385)  :D :D  :D :D

Resumiendo y dejándome de poetas y cancioneros, voy a construirme una librería que haga todo el ciclo completo de un teclado ps/2 de forma que si lo conectamos a un PC el puñetero Güindous no se entere de que le estamos dando gato por liebre de verdad, sin necesidad de conectarle un teclado de verdad para que le responda, que el PIC le diga y haga todo el proceso completo.

Ya os iré dando noticias del tema.  :mrgreen:

Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: SavageChicken en 26 de Marzo de 2009, 14:35:10
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)
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 26 de Marzo de 2009, 17:18:28
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:
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: fornelius84 en 21 de Abril de 2009, 14:15:14
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
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: megadigit 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.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: mysterpic en 29 de Enero de 2010, 00:02:54
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
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: shadowpucci en 13 de Abril de 2010, 11:22:52
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?


Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Suky en 13 de Abril de 2010, 13:19:20
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!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: kiljaeded en 19 de Abril de 2010, 21:29:40
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?
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Jummi 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.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: ale_nevermind en 07 de Junio de 2011, 01:34:46
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!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jo.an. en 21 de Julio de 2011, 20:57:23
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
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por lie
Publicado por: Suky 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
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: ale_nevermind en 12 de Agosto de 2011, 02:15:00
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!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jo.an. en 16 de Agosto de 2011, 21:31:26
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
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jo.an. en 29 de Agosto de 2011, 20:38:26
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
Título: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: camarohero en 20 de Julio de 2012, 13:49:56
Siento tener que revivir el tema, pero esto me viene como anillo al dedo y no lo encuentro en ningun otro lado
lo que necesito hacer es básicamente enviar un caracter por el puerto COM" de una PC y que lo reciba otra PC por el puerto PS/2 como si de un teclado se tratase
ya tengo el programa hecho, imprime correctamente en el puerto COM y con el hypertermina puedo ver los caracteres que envio, ahora falta la conversion a PS/2

Ya lei todo el post, agradezco a RedPic por compartirlo pero todas las fotos y diagramas estan caidos
Agradeceria eternamente cualquier actualizacion en la documentacion

Gracias y saludos de Juarez, Mexico
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: AcoranTf en 21 de Julio de 2012, 14:03:56
Precisamente eso me ocurrio hace unos dias que anduve intentando bajar el codigo, para un mini proyecto que estoy tratando de realizar y me vendria muy bien la rutina que envia los datos por PS2. Si no aparece tendre que hacerla desde cero, pero estaria muy bien aprovechar esata que ya esta hecha.

Saludos.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Suky en 21 de Julio de 2012, 14:13:30
Busquen por aquí: http://picmania.garcia-cuervo.net/proyectos.php


Saludos!
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: AcoranTf en 21 de Julio de 2012, 15:01:32
Busquen por aquí: http://picmania.garcia-cuervo.net/proyectos.php


Saludos!

Gracias Suky, ya habia localizado esa rutina en el hilo original de nostrico. De todos modos lo que yo necesito es solo el secuenciador para el envio d elos codigos de scan, asi que tendre que "filtrarlo" y eliminar todo lo que no me va a hacer falta.

Saludos.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: camarohero en 26 de Julio de 2012, 13:29:41
Código: [Seleccionar]
// Original de Nostrico del foro Todopic
// adaptado al 18f1320 por redpic
//

#include <18f1320.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(OUT_CLOCK=20000000)
#use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B4)

#define CONTROL_A PIN_A0
#define CONTROL_B PIN_A1
#define CONTROL_C PIN_A2
#define CONTROL_INH PIN_A4

#define OUT_CLOCK PIN_B3
#define OUT_DATA PIN_B5

unsigned int8 rec_char;

unsigned char convert_ascci_to_scancode(unsigned char c){

  unsigned char scancode;

       if (c == 'a' || c == 'A') {scancode = 0x1c;}
  else if (c == 'b' || c == 'B') {scancode = 0x32;}
  else if (c == 'c' || c == 'C') {scancode = 0x21;}
  else if (c == 'd' || c == 'D') {scancode = 0x23;}
  else if (c == 'e' || c == 'E') {scancode = 0x24;}
  else if (c == 'f' || c == 'F') {scancode = 0x2b;}
  else if (c == 'g' || c == 'G') {scancode = 0x34;}
  else if (c == 'h' || c == 'H') {scancode = 0x33;}
  else if (c == 'i' || c == 'I') {scancode = 0x43;}
  else if (c == 'j' || c == 'J') {scancode = 0x3b;}
  else if (c == 'k' || c == 'K') {scancode = 0x42;}
  else if (c == 'l' || c == 'L') {scancode = 0x4b;}
  else if (c == 'm' || c == 'M') {scancode = 0x3a;}
  else if (c == 'n' || c == 'N') {scancode = 0x31;}
  else if (c == 'o' || c == 'O') {scancode = 0x44;}
  else if (c == 'p' || c == 'P') {scancode = 0x4d;}
  else if (c == 'q' || c == 'Q') {scancode = 0x15;}
  else if (c == 'r' || c == 'R') {scancode = 0x2d;}
  else if (c == 's' || c == 'S') {scancode = 0x1b;}
  else if (c == 't' || c == 't') {scancode = 0x2c;}
  else if (c == 'u' || c == 'U') {scancode = 0x3c;}
  else if (c == 'v' || c == 'V') {scancode = 0x2a;}
  else if (c == 'w' || c == 'W') {scancode = 0x1d;}
  else if (c == 'x' || c == 'X') {scancode = 0x22;}
  else if (c == 'y' || c == 'Y') {scancode = 0x35;}
  else if (c == 'z' || c == 'Z') {scancode = 0x1a;}

  else if (c == '0') {scancode = 0x45;}
  else if (c == '1') {scancode = 0x16;}
  else if (c == '2') {scancode = 0x1e;}
  else if (c == '3') {scancode = 0x26;}
  else if (c == '4') {scancode = 0x25;}
  else if (c == '5') {scancode = 0x2e;}
  else if (c == '6') {scancode = 0x36;}
  else if (c == '7') {scancode = 0x3d;}
  else if (c == '8') {scancode = 0x3e;}
  else if (c == '9') {scancode = 0x46;}

  else if (c == '/') {scancode = 0x5a;} // ENTER
  else if (c == ' ') {scancode = 0x29;} // ESPACIO
  else if (c == '>') {scancode = 0x0d;} // TABULADOR
  else if (c == '<') {scancode = 0x66;} // BORRADOR
  else if (c == '$') {scancode = 0x58;} // TAG DE MAYUSCULA $m$yuscula
  else if (c == '-') {scancode = 0x4a;} // -_

  else {scancode = 0x29;} // Cualquier otra cosa ESPACIO

  return scancode;
}


void output_scancode_ps2(unsigned char scancode){

  int contador;
  int salida, unos=1;
  boolean paridad=true;

  output_high(OUT_CLOCK); // START -------------------------------
  output_high(OUT_DATA);
  delay_us(40);

  output_high(OUT_CLOCK);
  output_low(OUT_DATA);
  delay_us(40);

  output_low(OUT_CLOCK);
  output_low(OUT_DATA);
  delay_us(40);

  salida =1;

  do{
    output_high(OUT_CLOCK);
    output_bit(OUT_DATA, scancode&0x01);
    delay_us(40);
    output_low(OUT_CLOCK);
    output_bit(OUT_DATA, scancode&0x01);
    delay_us(40);

    if ((scancode & 0x01) == 0x01) {unos++;}

    scancode = scancode>>1;
    salida++;

  }while(salida < 9);

  output_high(OUT_CLOCK); // PARITY ------------------------------
  output_bit(OUT_DATA, unos&0x01);
  delay_us(40);
  output_low(OUT_CLOCK);
  output_bit(OUT_DATA, unos&0x01);
  delay_us(40);

  output_high(OUT_CLOCK); // STOP --------------------------------
  output_high(OUT_DATA);
  delay_us(40);
  output_low(OUT_CLOCK);
  output_high(OUT_DATA);
  delay_us(40);

  output_high(OUT_CLOCK); // FIN ---------------------------------
  output_high(OUT_DATA);

  delay_ms(175);
}


void main(){

  delay_ms(300);
  printf("\r\nKBDEMUL with a 18F1320\r\nInject signal for PS/2\r\n\n");
  delay_ms(500);

  output_high(CONTROL_A); // Conmuta CD4053 a salida PIC->PC
  output_high(CONTROL_B);
  output_high(CONTROL_C);

  do{
    rec_char=getch();
    putc(rec_char;);
    output_scancode_ps2(convert_ascci_to_scancode(valor));
  }while(true);

}   
Por el momento no he podido programar un solo PIC :/
todo me falla no le encuentro el modo y ni siquiera se como empezar un proyecto en mplab con C porque no le entiendo nada al assembler
tengo mi picKit 3 sin hacer nada :( :( :(
entonces quisera convertir el codigo a arduino (ese si se deja)
pero no estoy seguro como traducir
Código: [Seleccionar]
rec_char = getch(); a lenguaje arduino
y
Código: [Seleccionar]
puct(rec_char;); como se haria?
tampoco se como podria hacer
Código: [Seleccionar]
output_bit(OUT_DATA, unos&0x01);especificamente que significa la rutina "unos&0x01"?? lo entiendo como una comparacion en pic? de la cantidad de "1's" en el scancode comparndo con "1"???
basicamente tengo esas dudas
buscare un tutorial en el foro sobre "programacion de un pic para dummies con pickit 3" jaja
gracias por sus respuestas
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: camarohero en 01 de Agosto de 2012, 04:42:11
a todo aquel que le interese les comparto mi codigo en lenguaje arduino
extraje algunas partes del codigo de Redpic y de Nostrico AGRADEZCO SUS GANAS DE COOPERAR
ahora quiero que me ayuden con unas pequenas preguntas:
1.-que compilador usaron para los codigos posteados??
2.- como hacer que la computadora detecte en un inicio que tiene conectado un teclado en el puerto ps/2???
se ve muy facil y entendible, creo que por alli puedo empezar a usar PIC's (estrenar mi picKit 3 debbug express)
bueno sin mas rodeos aquiles baeza  :D

Código: [Seleccionar]
int clock = 10;
int data = 11;
char lectura;
byte peticion;
boolean bit_paridad = 0;
int delay_inicio = 20;
int delay_micro = 40;

void setup(){
  pinMode(clock, OUTPUT);
  digitalWrite(clock, HIGH);
  pinMode(data, OUTPUT);
  digitalWrite(data, HIGH);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()){
    lectura = Serial.read();
         if(lectura == 'A'){mayuscula(0x1c);}
    else if(lectura == 'B'){mayuscula(0x32);}
    else if(lectura == 'C'){mayuscula(0x21);}
    else if(lectura == 'D'){mayuscula(0x23);}
    else if(lectura == 'E'){mayuscula(0x24);}
    else if(lectura == 'F'){mayuscula(0x2b);}
    else if(lectura == 'G'){mayuscula(0x34);}
    else if(lectura == 'H'){mayuscula(0x33);}
    else if(lectura == 'I'){mayuscula(0x43);}
    else if(lectura == 'J'){mayuscula(0x3b);}
    else if(lectura == 'K'){mayuscula(0x42);}
    else if(lectura == 'L'){mayuscula(0x4b);}
    else if(lectura == 'M'){mayuscula(0x3a);}
    else if(lectura == 'N'){mayuscula(0x31);}
    else if(lectura == 'O'){mayuscula(0x44);}
    else if(lectura == 'P'){mayuscula(0x4d);}
    else if(lectura == 'Q'){mayuscula(0x15);}
    else if(lectura == 'R'){mayuscula(0x2d);}
    else if(lectura == 'S'){mayuscula(0x1b);}
    else if(lectura == 'T'){mayuscula(0x2c);}
    else if(lectura == 'U'){mayuscula(0x3c);}
    else if(lectura == 'V'){mayuscula(0x2a);}
    else if(lectura == 'W'){mayuscula(0x1d);}
    else if(lectura == 'X'){mayuscula(0x22);}
    else if(lectura == 'Y'){mayuscula(0x35);}
    else if(lectura == 'Z'){mayuscula(0x1a);}
    else if(lectura == 'a'){caracter(0x1c);}
    else if(lectura == 'b'){caracter(0x32);}
    else if(lectura == 'c'){caracter(0x21);}
    else if(lectura == 'd'){caracter(0x23);}
    else if(lectura == 'e'){caracter(0x24);}
    else if(lectura == 'f'){caracter(0x2b);}
    else if(lectura == 'g'){caracter(0x34);}
    else if(lectura == 'h'){caracter(0x33);}
    else if(lectura == 'i'){caracter(0x43);}
    else if(lectura == 'j'){caracter(0x3b);}
    else if(lectura == 'k'){caracter(0x42);}
    else if(lectura == 'l'){caracter(0x4b);}
    else if(lectura == 'm'){caracter(0x3a);}
    else if(lectura == 'n'){caracter(0x31);}
    else if(lectura == 'o'){caracter(0x44);}
    else if(lectura == 'p'){caracter(0x4d);}
    else if(lectura == 'q'){caracter(0x15);}
    else if(lectura == 'r'){caracter(0x2d);}
    else if(lectura == 's'){caracter(0x1b);}
    else if(lectura == 't'){caracter(0x2c);}
    else if(lectura == 'u'){caracter(0x3c);}
    else if(lectura == 'v'){caracter(0x2a);}
    else if(lectura == 'w'){caracter(0x1d);}
    else if(lectura == 'x'){caracter(0x22);}
    else if(lectura == 'y'){caracter(0x35);}
    else if(lectura == 'z'){caracter(0x1a);}
    else if(lectura == '0'){caracter(0x45);}
/*  else if(lectura == '1'){caracter(0x16);}
    else if(lectura == '2'){caracter(0x1e);}
    else if(lectura == '3'){caracter(0x26);}
    else if(lectura == '4'){caracter(0x25);}
    else if(lectura == '5'){caracter(0x2e);}
    else if(lectura == '6'){caracter(0x36);}
    else if(lectura == '7'){caracter(0x3d);}
    else if(lectura == '8'){caracter(0x3e);}
    else if(lectura == '9'){caracter(0x46);}    
    else if(lectura == '0'){caracter(0x45);}  */            //esto se usa en caso de querer pulsar las teclas de arriba,
    else if(lectura == '1'){caracter(0x69);}
    else if(lectura == '2'){caracter(0x72);}                 //estas otras para usar el num pad
    else if(lectura == '3'){caracter(0x7a);}
    else if(lectura == '4'){caracter(0x6b);}
    else if(lectura == '5'){caracter(0x73);}
    else if(lectura == '6'){caracter(0x74);}
    else if(lectura == '7'){caracter(0x6c);}
    else if(lectura == '8'){caracter(0x75);}
    else if(lectura == '9'){caracter(0x7d);}
    else if(lectura == '0'){caracter(0x70);}
    else if(lectura == ' '){mayuscula(0x29);}                          //Espacio!!
    else if(lectura == '>'){caracter(0x5a);}                           //Enter!!!!
    else if(lectura == '<'){caracter(0x66);}                           //Borrar!!!
    else if(lectura == '*'){ctrl();caracter(0x1c);F0();ctrl();}        //Seleccionar todo!!!
    else if(lectura == '+'){ctrl();caracter(0x76);F0();ctrl();}        //Ctrl + Esc (inicio)
    else if(lectura == '$'){caracter(0x0d);}                           //Tab!!!
    else if(lectura == '|'){alt();caracter(0x0c);F0();alt();}          //Cerrar!!!
    else if(lectura == '.'){caracter(0x49);}
    else if(lectura == ','){caracter(0x41);}
    else if(lectura == '@'){alt();caracter(0x1c);caracter(0x74);caracter(0x6b);F0();alt();}
    else if(lectura == '?'){alt();caracter(0x74);caracter(0x7a);F0();alt();}
  }
}

void mayuscula(byte peticion){
  shift();
  bit_paridad = HIGH;
  iniciar();
  for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    if(bitRead(peticion, contador) ==1){bit_paridad = !bit_paridad;}  
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
  
  finalizar();
  F0();
  shift();
  
  F0();
  bit_paridad = HIGH;
  iniciar();
  for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    if(bitRead(peticion, contador) ==1){bit_paridad = !bit_paridad;}  
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
  
  finalizar();

}

void caracter(byte peticion){
  bit_paridad = HIGH;
  iniciar();
  for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    if(bitRead(peticion, contador) ==1){bit_paridad = !bit_paridad;}  
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
  
  finalizar();
  
  F0();                                                                       //Se suelta la tecla
  bit_paridad = HIGH;
  iniciar();
  for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(peticion, contador));
    delayMicroseconds(delay_micro);
    if(bitRead(peticion, contador) ==1){bit_paridad = !bit_paridad;}  
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, bit_paridad);
  delayMicroseconds(delay_micro);
  
  finalizar();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////Rutina de inicio///////////////////////////////////////////////////////////

void iniciar(){
  delay(delay_inicio);
  Serial.flush();
  digitalWrite(clock, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);

  digitalWrite(clock, HIGH);
  digitalWrite(data, LOW);
  delayMicroseconds(delay_micro);

  digitalWrite(clock, LOW);
  digitalWrite(data, LOW);
  delayMicroseconds(delay_micro);

}

void finalizar(){
  digitalWrite(clock, HIGH); ////// STOP
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, HIGH);
  digitalWrite(data, HIGH);  ////// FIN
  delay(delay_inicio);
}


void shift(){
  iniciar();
    for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(0x12, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(0x12, contador));
    delayMicroseconds(delay_micro);
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
  finalizar();
}

void F0(){
  iniciar();
    for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(0xf0, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(0xf0, contador));
    delayMicroseconds(delay_micro);
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
  finalizar();
}

void ctrl(){
  iniciar();
    for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(0x14, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(0x14, contador));
    delayMicroseconds(delay_micro);
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
  finalizar();
}


void alt(){
  iniciar();
    for(int contador = 0; contador <= 7; contador++){
    digitalWrite(clock, HIGH);
    digitalWrite(data, bitRead(0x11, contador));
    delayMicroseconds(delay_micro);
    
    digitalWrite(clock, LOW);
    digitalWrite(data, bitRead(0x11, contador));
    delayMicroseconds(delay_micro);
  }
  digitalWrite(clock, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
    
  digitalWrite(clock, LOW);
  digitalWrite(data, HIGH);
  delayMicroseconds(delay_micro);
  finalizar();
}
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: Suky en 01 de Agosto de 2012, 10:24:32
1. CCS
2. http://www.todopic.com.ar/foros/index.php?topic=11910.msg252813#msg252813 (Probado en Win y Linux)
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 06 de Enero de 2013, 15:17:15
Listo. Gracias a la indicación del amigo pajaro (http://www.todopic.com.ar/foros/index.php?action=profile;u=10985) todos mis posts en este hilo estaban rotos (cosas del cambio de dominio) y ya los he reparado. Si véis alguno que siga mal no dudéis en decírmelo.  :mrgreen:
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: cosmic en 24 de Marzo de 2014, 18:22:14
Hola amigo Suky. ((:-))
Me gustaria saber como implementar las rutinas PS2 que subiste en este post, lo que requiero es enviar
dos letras A,B y C por el puerto PS2 desde un pic 873 sin usar un teclado de por medio..
Si tienes un ejemplo te lo agradezco.. :-/
Te dejo la imagen de mi circuito.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: aderregibus en 07 de Agosto de 2014, 17:40:55
Hola RedPic,

Primero que nada, felicitaciones por el proyecto.
En uno de los posts vi que el proyecto se convirtió en un producto comercial, y me interesaría saber si actualmente lo estás produciendo y vendiendo porque me interesa mucho.

Gracias.
Título: Re: Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: RedPic en 08 de Agosto de 2014, 06:46:41
Hola aderregibus, muchas gracias por tu comentario.

Desgraciadamente este proyecto duró muy poco comercialmente ya que se realizó cuando los PC's abandonaban el PS/2 y venían exclusivamente con USB. De hecho solo se instalaron unas pocas unidades y ya hubo que pasarse a los diseños basados en los 18Fxx50. Además la empresa para la que se hicieron estos diseños ya no existe siquiera.  :?

Así que toma lo que desees de lo publicado en este foro a modo de experimento o proyecto pedagógico y haz con él lo que mejor te parezca.  :mrgreen:

Un saludo.
Título: Re:Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: jnf en 07 de Abril de 2016, 20:56:59
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!
1. CCS
2. http://www.todopic.com.ar/foros/index.php?topic=11910.msg252813#msg252813 (Probado en Win y Linux)

este es el mismo problema de las minas, alguna solución
Título: Re:Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: rod232 en 19 de Octubre de 2016, 19:36:28
Tengo el mismo problema, en la inicialización del teclado ps2, funciona si reinicio la pc con un teclado ps2, pero a la hora de reiniciarlo con la placa no me levanta...
He probado con el código que proporcionó suky, pero no funciona mi pic al iniciar la pc con el pic conectado a ella, les pego el código por si hay algún error en el cual no me fijé
Código: [Seleccionar]
#include <16F628A.h>     // Definiciones del PIC 16F628a
#fuses INTRC,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(internal=4000000) // Oscilador a 4 Mhz


#define T_CLOCK PIN_B2
#define T_DATA  PIN_B1
unsigned int8 valor;
char miletra;

/* ****************************************************************************************** */
void vEnvia_Byte(char Data){
char k=0,Unos=1;
 
   while(input(T_CLOCK)==0);
   output_high(T_CLOCK);
   output_high(T_DATA);
   output_drive(T_DATA);
   output_drive(T_CLOCK);
   /* ** Enviamos Bit Start ** */
   output_high(T_CLOCK);
   output_high(T_DATA);
   delay_us(40);
   output_low(T_DATA);
   delay_us(40);
   output_low(T_CLOCK); 
   delay_us(40);
   /* ** Enviamos 8 bits de datos ** */
   for(k=0;k<8;k++){
      output_high(T_CLOCK);
      delay_us(5);
      output_bit(T_DATA,Data & 0x01);
      delay_us(35);
      output_low(T_CLOCK);
      delay_us(40);
      if(bit_test(Data,0)==1){Unos++;}
      Data>>=1;   
   }
   /* ** Enviamos bit de paridad ** */
   output_high(T_CLOCK);
   delay_us(5);
   output_bit(T_DATA,Unos&0x01);
   delay_us(35);
   output_low(T_CLOCK);
   delay_us(40);
   /* ** Enviamos bit Stop ** */
   output_high(T_CLOCK);
   delay_us(5);
   output_high(T_DATA);
   delay_us(35);
   output_low(T_CLOCK);
   delay_us(40);
 
   output_float(T_CLOCK);
   output_float(T_DATA);
 
   delay_us(100);
}
/* ****************************************************************************************** */
char cLee_Byte(void){
char k;
char Data=0xEC;
 
   /* ** Condicion RTS ** */
   delay_us(100);
   if(input(T_DATA)==0){
      /* ** Esperamos a que el Host este listo para enviar datos ** */
      while(input(T_CLOCK)==0);
      output_high(T_CLOCK);
      output_drive(T_CLOCK);
      output_high(T_CLOCK);
      delay_us(200);
      output_low(T_CLOCK);
      if(input(T_DATA)==0){
         /* ** Se recibe los 8 bits de datos ** */
         for(k=0;k<8;k++){
            delay_us(40);
            output_high(T_CLOCK);
            delay_us(20);
            shift_right(&Data,1,input(T_DATA));
            delay_us(20);
            output_low(T_CLOCK);
         }
         /* ** Se ignora bit de paridad ** */
         delay_us(40);
         output_high(T_CLOCK);
         delay_us(40);
         output_low(T_CLOCK);
         /* ** Se testea bit Stop ** */
         delay_us(40);
         output_high(T_CLOCK);
         delay_us(20);
         if(input(T_DATA)==1){
         delay_us(15);
         /* ** Se envia Ack ** */
         output_drive(T_DATA);
         output_low(T_DATA);
         delay_us(5);
         output_low(T_CLOCK);
         delay_us(40);
         output_high(T_CLOCK);
         delay_us(10);
         }
      }
   }
   output_float(T_CLOCK);
   output_float(T_DATA);
   delay_us(100);
   return(Data);
}
/* ****************************************************************************************** */
#int_EXT
void Leer_Host(){
static char Dato_Host;
 
   Dato_Host=cLee_Byte();
   if(Dato_Host!=0xEC){
      if(Dato_Host==0xEE){
         vEnvia_Byte(0xEE);
      }else{
         vEnvia_Byte(0xFA);
         if(Dato_Host==0xF2){
            vEnvia_Byte(0xAB);
            vEnvia_Byte(0x83);
         }
         if(Dato_Host==0xFF){
            delay_ms(1);
            vEnvia_Byte(0xAA);
         }
      }
   }
}
/* ****************************************************************************************** */

void main()
{
   delay_ms(800);
   vEnvia_Byte(0xAA); 
   ext_int_edge(H_TO_L);
   clear_interrupt(INT_EXT);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);   
   do{
     
      vEnvia_Byte(0x44); //O
      delay_ms(100);
      vEnvia_Byte(0x4b); //L
      delay_ms(100);
      vEnvia_Byte(0x1c); //A
      delay_ms(100);
      vEnvia_Byte(0x29); //ESPACIO
      delay_ms(100);//
      vEnvia_Byte(0x42); //K
      delay_ms(100);//
      vEnvia_Byte(0x24); //E
      delay_ms(100);
      vEnvia_Byte(0x29); //ESPACIO
      delay_ms(100);//
      vEnvia_Byte(0x1c); //A
      delay_ms(100);//
      vEnvia_Byte(0x1b); //S
      delay_ms(100);//
      vEnvia_Byte(0x24); //E
      delay_ms(100);//
      vEnvia_Byte(0x29); //ESPACIO
      delay_ms(100);//
      vEnvia_Byte(0x29); //ESPACIO
      delay_ms(100);//
      vEnvia_Byte(0x29); //ESPACIO
      delay_ms(100);// 
      output_toggle(PIN_B3);
      delay_ms(500);
   }
   while(true);
}
Le coloqué un led piloto en el pin B3 para ver si funcionaba, como dije, solamente al conectar otro teclado ps2 cuando la pc inicia, al sacar el teclado y conectar el pic al puerto ps2 me escribe..si conecto el pic al puerto ps2 al iniciar la pc, no escribe nada...disculpen las molestias...
Título: Re:Proyecto: Emulación Teclado PS/2 con PIC (Engañe a su PC y dele gato por liebre)
Publicado por: germanmkurylo en 31 de Enero de 2020, 16:37:12
buenas tardes
bueno este codigo funciona correctamente y esta echo en principio para cajas de musicas pero falta implementar el inicio con la pc lo cual me quede trancado asi que recurro a ustedes para terminarlo
la interrupcion externa esta sin escribir


//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
#include <16F628A.h>                       
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOMCLR,PUT     
#use delay(clock=4000000)                     

//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                             Defino Variables                              *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
#zero_ram
unsigned char   cont_pulsos;                  // Contador de Pulsos Recibidos
unsigned char   pulsos_rx;                     // Contador de pulsos del Monedero
unsigned char   filtro_monedero;
unsigned long   tiempo_monedero;
unsigned long   filtro_10;
unsigned long   filtro_20;
unsigned long   filtro_30;
unsigned long   filtro_40;
unsigned long   filtro_50;
unsigned long   filtro_60;
unsigned long   filtro_70;
unsigned long   filtro_80;
unsigned long   filtro_90;
unsigned long   filtro_100;
unsigned long   filtro_200;
unsigned long   filtro_300;
unsigned long   filtro_400;
unsigned long   filtro_500;
unsigned long   filtro_600;
unsigned long   filtro_700;
unsigned long   filtro_800;
unsigned long   filtro_900;
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                              Defino Flags                                 *//
//*                                                                           *//
//*                                                                           *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
int1         busy_contador;                  // Indica que el Contador está en Operacion

int1         moneda_recibida;                  // Indica a Recepcion de una Moneda

int1         tiempo_10ms;

int1         monedero_st;

int1         bt_1;

//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                                 Entrada                                   *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//

//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                                 Salidas                                   *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
#define OUT_CLOCK          PIN_B1               // Salida de Clock
#define OUT_DATA          PIN_A3               // Salida de Datos
#define inibidor_monedero   PIN_A2               // Inibidor monedero
                                                // 0-> Monedero Normal
                                                // 1-> Monedero trabado
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                              Interrupcion Externa                         *//
//*                                                                           *//
//*                                                                           *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
#INT_EXT
{
}

//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                              Interrupcion Timer 1                          *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
#INT_TIMER1
void trata_int_timer1(void)
{
   tiempo_10ms = 1;

   set_timer1(65350);
}

//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                           Configuracion de Fuses                          *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
void output_scancode_ps2(unsigned char scancode)
{
   int salida, unos=1;

   output_high(OUT_CLOCK);
   output_high(OUT_DATA);
   delay_us(10);

   output_high(OUT_CLOCK);
   output_low(OUT_DATA);
   delay_us(10);

   output_low(OUT_CLOCK);
   output_low(OUT_DATA);
   delay_us(10);

   salida = 1;

   do
   {
       output_high(OUT_CLOCK);
       output_bit(OUT_DATA, scancode&0x01);
       delay_us(10);
       output_low(OUT_CLOCK);
       output_bit(OUT_DATA, scancode&0x01);
       delay_us(10);

       if ((scancode & 0x01) == 0x01) {unos++;}

       scancode = scancode>>1;
       salida++;

   }while(salida < 9);

     output_high(OUT_CLOCK);
     output_bit(OUT_DATA, unos&0x01);
     delay_us(10);
     output_low(OUT_CLOCK);
     output_bit(OUT_DATA, unos&0x01);
     delay_us(10);

     output_high(OUT_CLOCK);
     output_high(OUT_DATA);
     delay_us(10);
     output_low(OUT_CLOCK);
     output_high(OUT_DATA);
     delay_us(10);

     output_high(OUT_CLOCK);
     output_high(OUT_DATA);

     delay_ms(5);
}

//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
//*                                   MAIN                                    *//
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
void main(void)
{
   unsigned int contador_veces;

   // ***** Inicializa IOS ***** //
      setup_comparator(NC_NC_NC_NC);

   output_a(0b00001100);                        // Mantiene portA en 0
   output_b(0b00000010);                        // Mantiene portB en 0

   // ***** Configura IOS ***** //
   // **** Bits-76543210*******//
   set_tris_a(0b11000011);                  // Configura PORTA
   set_tris_b(0b11110001);                  // Configura PORTB

   EXT_INT_EDGE(H_TO_L);

   SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
   set_timer1(64275);

   // ***** Configura INT *****//
//   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);


   delay_ms(100);
   while(true)
   {
      if(tiempo_10ms == 1)
      {
         if(input(pin_b0) == 0)
         {
            if(monedero_st == 0)
            {
               filtro_monedero++;
               if(filtro_monedero >= 25)
               {
                  monedero_st = 1;
                  output_low(inibidor_monedero);
                  cont_pulsos++;
                  busy_contador = 1;
                  filtro_monedero = 0;
               }
            }
         }
         else
         {
            filtro_monedero = 0;
            monedero_st = 0;
            if(busy_contador == 1)
            {
               tiempo_monedero++;
               if(tiempo_monedero > 7500)
               {
               
                  pulsos_rx = cont_pulsos;
                  cont_pulsos = 0;
                  busy_contador = 0;
                  moneda_recibida = 1;
                  tiempo_monedero = 0;
                  if(moneda_recibida == 1)
                  {
                       for(contador_veces = 1; contador_veces < pulsos_rx; ++contador_veces)
                       {
                           output_low(pin_a4);
                           output_scancode_ps2(0x2D);
                           delay_ms(20);
                       }
                      moneda_recibida = 1;
                  }
                  output_high(inibidor_monedero);
                  delay_ms(2500);
               }
            }
            else
            {
               tiempo_monedero = 0;
            }
         }
         output_low(pin_b2);
         output_high(pin_b3);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_b4) == 0)
         {
            filtro_10++;
            if(filtro_10 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x03);
                  delay_ms(20);
               filtro_10 = 0;
            }   
         }
         else
         {
            filtro_10 = 0;
         }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_b6) == 0)
         {
            filtro_30++;
            if(filtro_30 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x31);
                  delay_ms(20);
               filtro_30 = 0;
            }   
         }
         else
         {
            filtro_30 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_b7) == 0)
         {
            filtro_40++;
            if(filtro_40 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x3A);
                  delay_ms(20);
               filtro_40 = 0;
            }   
         }
         else
         {
            filtro_40 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a6) == 0)
         {
            filtro_50++;
            if(filtro_50 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x33);
                  delay_ms(20);
               filtro_50 = 0;
            }   
         }
         else
         {
            filtro_50 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a7) == 0)
         {
            filtro_60++;
            if(filtro_60 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x3b);
                  delay_ms(20);
               filtro_60 = 0;
            }   
         }
         else
         {
            filtro_60 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a0) == 0)
         {
            filtro_70++;
            if(filtro_70 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x35);
                  delay_ms(20);
               filtro_70 = 0;
            }   
         }
         else
         {
            filtro_70 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a1) == 0)
         {
            filtro_80++;
            if(filtro_80 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x25);
                  delay_ms(20);
               filtro_80 = 0;
            }   
         }
         else
         {
            filtro_80 = 0;
         }

         output_high(pin_b2);
         output_low(pin_b3);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_b5) == 0)
         {
            filtro_100++;
            if(filtro_100 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x32);
                  delay_ms(20);
               filtro_100 = 0;
            }   
         }
         else
         {
            filtro_100 = 0;
         }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_b7) == 0)
         {
            filtro_400++;
            if(filtro_400 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x34);
                  delay_ms(20);
               filtro_400 = 0;
            }   
         }
         else
         {
            filtro_400 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a6) == 0)
         {
            filtro_500++;
            if(filtro_500 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x2b);
                  delay_ms(20);
               filtro_500 = 0;
            }   
         }
         else
         {
            filtro_500 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a7) == 0)
         {
            filtro_600++;
            if(filtro_600 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x2a);
                  delay_ms(20);
               filtro_600 = 0;
            }   
         }
         else
         {
            filtro_600 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a0) == 0)
         {
            filtro_700++;
            if(filtro_700 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x2c);
                  delay_ms(20);
               filtro_700 = 0;
            }   
         }
         else
         {
            filtro_700 = 0;
         }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
         if(input(pin_a1) == 0)
         {
            filtro_800++;
            if(filtro_800 >= 200)
            {         
               output_low(pin_a4);
                 output_scancode_ps2(0x25);
                  delay_ms(20);
               filtro_800 = 0;
            }   
         }
         else
         {
            filtro_800 = 0;
         }
         tiempo_10ms = 0;
      }

   }



}