Autor Tema: USB-HID Teclado  (Leído 20509 veces)

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

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: USB-HID Teclado
« Respuesta #15 en: 12 de Abril de 2010, 23:53:51 »
No se si estare razonando fuera del recipiente, pero hasta donde se, los eventos de teclado se envian como "se apreto X tecla" o "se solto X tecla". Asiq tal vez al mandar "hhoooollllaaaa", la maquina "cree" q todavia se esta apretando la 'h' cuando aparece la 'o', por lo tanto pone solo una. Proba poner un NULL despues de cada letra. Tal vez haciendote una funcioncita q mande los caracteres del string uno por uno con un NULL entre medio.
Saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado adrianjpc

  • PIC10
  • *
  • Mensajes: 10
    • uElectronika
Re: USB-HID Teclado
« Respuesta #16 en: 13 de Abril de 2010, 16:34:42 »
Hola muchachos del foro.

Necesito su valiosa ayuda.

Estoy trabajando el programa del manejo del pic para conectarlo al puerto USB en configuracion HID emulando un teclado (el programa es del gran RedRaven). La configuracion es exitosa y corre bien, pero me encontre con lo siguiente: si envio la cadena "hhooolllaaa" al pc desde el pic, veo con sorpresa que en el editor de texto abierto en donde recibo el dato, se escribe "hola", y yo estaba esperando la palabra completa tal y como la habia enviado!!! :(.

No se porque no escribe los caracteres si estan repetidos, por ejemplo si envio "1000" solo aparece "10". Intente enviar 5 bytes en el mismo array de transmision, es decir llenando los espacios del vector tx_msg[3:7] y  ahi si aparecen bien, pero me genera problemas en otros caracteres, se desaparecen algunos en los envios.

El codigo es el siguiente:
Código: [Seleccionar]

#include <18F2550.h>
#device adc = 10
#fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,FCMEN,PUT
#use delay(clock=4M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8, parity=N)

#include <ctype.h>

#DEFINE USB_HID_DEVICE  TRUE

#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT    //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8

#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT    //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8

#include <pic18_usb.h>
#include "kbd_HID.h" //USB Configuration and Device descriptors for this UBS device
#include "usb.c" //handles usb setup tokens and get descriptor reports


#define LED1    PIN_B0
#define LED2 PIN_B1
#define shift 0x02
#define ctrl 0x01
#define alt 0x04

#define LED_ON  output_high
#define LED_OFF output_low

int8 rx_msg[USB_EP1_RX_SIZE];
int8 tx_msg[8]={2,0,0,0,0,0,0,0};
char data_p[20]="holllaaaa";

int1 data_rx_ok=0;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int8 char_2_usb_kbd_code(char c)
{
    int8 ic=0;

if(isalnum(c))
{
if(isdigit(c))
{
tx_msg[1] = 0x00;
if(c=='0')
return (0x27);
else
{
ic = c-0x13;
return (ic);
}
}

if(islower(c))
{
tx_msg[1] = 0x00;
ic = c-0x5d;
return (ic);
}
else
{
tx_msg[1] = shift;
ic = c-0x3d;
return (ic);
}
}

else
{
switch (c)
{
case '!' : ic=0x1e; tx_msg[1]=shift; break;
case '@' : ic=0x1f; tx_msg[1]=shift; break;
case '#' : ic=0x20; tx_msg[1]=shift; break;
case '$' : ic=0x21; tx_msg[1]=shift; break;
case '%' : ic=0x22; tx_msg[1]=shift; break;
case '^' : ic=0x23; tx_msg[1]=shift; break;
case '&' : ic=0x24; tx_msg[1]=shift; break;
case '*' : ic=0x25; tx_msg[1]=shift; break;
case '(' : ic=0x26; tx_msg[1]=shift; break;
case ')' : ic=0x27; tx_msg[1]=shift; break;
case '\n': ic=0x28; tx_msg[1]= 0x00; break;//INTRO
case 0x1b: ic=0x29; tx_msg[1]= 0x00; break;//ESC
case 0x08: ic=0x2a; tx_msg[1]= 0x00; break;//BCKP
case 0x09: ic=0x2b; tx_msg[1]= 0x00; break;//TAB
case ' ' : ic=0x2c; tx_msg[1]= 0x00; break;//SPACE
case '-' : ic=0x2d; tx_msg[1]= 0x00; break;
case '=' : ic=0x2e; tx_msg[1]= 0x00; break;
case '[' : ic=0x2f; tx_msg[1]= 0x00; break;
case ']' : ic=0x30; tx_msg[1]= 0x00; break;
case 0x5c: ic=0x31; tx_msg[1]= 0x00; break;
case '_' : ic=0x2d; tx_msg[1]=shift; break;
case '+' : ic=0x2e; tx_msg[1]=shift; break;
case '{' : ic=0x2f; tx_msg[1]=shift; break;
case '}' : ic=0x30; tx_msg[1]=shift; break;
case '|' : ic=0x31; tx_msg[1]=shift; break;
case ';' : ic=0x33; tx_msg[1]= 0x00; break;
case 0x27: ic=0x34; tx_msg[1]= 0x00; break;
case 0x60: ic=0x35; tx_msg[1]= 0x00; break;
case ',' : ic=0x36; tx_msg[1]= 0x00; break;
case '.' : ic=0x37; tx_msg[1]= 0x00; break;
case '/' : ic=0x38; tx_msg[1]= 0x00; break;
case ':' : ic=0x33; tx_msg[1]=shift; break;
case '"' : ic=0x34; tx_msg[1]=shift; break;
case '~' : ic=0x35; tx_msg[1]=shift; break;
case '<' : ic=0x36; tx_msg[1]=shift; break;
case '>' : ic=0x37; tx_msg[1]=shift; break;
case '?' : ic=0x38; tx_msg[1]=shift; break;
default  : ic=0x00; tx_msg[1]= 0x00; break;

}
return (ic);
}



}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// usb_keyboard_task()
//
// Sends a packet of keyboard data.  The protocol was specified in the HID
// report descriptor (see usb_desc_kbmouse.h), and is:
//     tx_msg[0]   = HID report id (2)
//     tx_msg[1]   = modifier (an 8bit bitmap of shift, tab, alt keypress) (0x01=ctrl, 0x02=shift, 0x04=alt)
//     tx_msg[2]   = const 0
//     tx_msg[3:7] = an array of held down keys.  a=4, b=5, etc.
//                   if msg[2:7]={0} then no keys are held down
//
//     rx_msg[1] = HID report id (2)
//     rx_msg[0] = 5bit bitmap of led status
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void usb_keyboard_task(char data)
{
tx_msg[3] = char_2_usb_kbd_code(data);
usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void usb_rx_task(void)
{

   if (usb_kbhit(1))
      usb_get_packet(1, rx_msg, sizeof(rx_msg));
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
/**************************************** programa principal ********************************************/
void main()
{
int8 i = 0;

LED_ON(LED2);
LED_OFF(LED1);

usb_init();
    usb_task();
    usb_wait_for_enumeration();
delay_ms(1000);
data_rx_ok = true;
    while (TRUE)
  {
usb_task();
LED_OFF(LED2);
if (usb_enumerated())
{
LED_ON(LED1);
LED_OFF(LED2);
if(data_rx_ok)
{
data_rx_ok = false;
for(i=0;i<19;i++)
{
    usb_keyboard_task(data_p[i]);
delay_ms(30);
}
// inicbuff();
}

   
    }
    }
}

Lo que hace el programa es enviar una sola vez el dato data_p. La funcion char_2_usb_kbd_code me pasa de ascii a ps/2. Cambie el cristal a 20MHz para trabajarlo a HS y tampoco me dio resultado.

La configuracion del USB esta bien, ya que simula bien y la he montado y tambien todo corre bien.

Gracias por la ayuda de antemano.



Hola MLO__  ya solucione el problema, la idea era enviar caracteres null entre cada caracter como comento gera, pero dentro de la cadena que uno esta declarando en este caso envia. yo antes lo los hice pero afuera de la cadena y no me funcionaba, ahora si todo sale muy bien tal y lo que quieres enviar.

en el siguiete codigo envio un numero de 8 digitos (11223344) y la computadora en el block de notas  recibo el mismo numero enviado
 
El codigo es el siguiente:
Código: [Seleccionar]
#include <18F4550.h>
#include <stdlib.h>
#include <string.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE  TRUE
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //Turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //Turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8
#define USB_EP1_RX_SIZE 8

#include <pic18_usb.h>                           //Microchip PIC18Fxx5x Hardware soportada por CCS's PIC USB driver
#include <.\include\usb_kbd_HID.h>               //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                                 //handles usb setup tokens and get descriptor reports
#include <ctype.h>


#byte portb=0x06
#define LED1    PIN_D0
#define LED2    PIN_D1

#define LED_ON  output_high
#define LED_OFF output_low

int8 rx_msg[USB_EP1_RX_SIZE];
int8 tx_msg[8]={2,0,0,0,0,0,0,0};
char envia[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0};//40(return
//char envia[20]={0,N1,0,N2,0,N3,0,N4,0,N5,0,N6,0,N7,0,N8,0,40,0};//40(return)

void show8nums(unsigned int32 num)
{
   char numch[1];
   int j;
   if (num<m)
   {
   int j;
     for( j=0;j<=15;j+=2)
      { 
          numch[0]=num%10;
         
             if(numch[0]==0)
             {
                 envia[15-j]=39;
             }
              else
              {
                 envia[15-j]=numch[0]-1+30;
              }
         delay_ms(10);         
         num=num/10;
       
      }
     
   }
 }

void usb_rx_task(void){

   if (usb_kbhit(1)){
      usb_get_packet(1, rx_msg, sizeof(rx_msg));
   }
}

void main() {
   int8 i;
   
   usb_init();                    //inicializamos el USB
   usb_task();                    //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();     //esperamos hasta que el dispositivo usb sea configurado por el host
   
   LED_ON(LED2);
   LED_OFF(LED1);
   i=0;
   
   if (usb_enumerated())
   {
     delay_ms(1000);
     usb_rx_task();

     LED_ON(LED1);
     LED_OFF(LED2);

     tx_msg[3]=0; //clear
     tx_msg[4]=0;// clear;
     tx_msg[5]=0;// clear;
     tx_msg[6]=0;// clear;
     tx_msg[7]=0;// clear;
     usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);

     show8nums(11223344); numero de 8 digitos a enviar
           
        while ( i<=19)
           {           
              delay_ms(100);
              tx_msg[4]=envia[i];// CARACTER;
              usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
              i=i+1;
                   
           }
      i=0;
      LED_ON(LED2);
      LED_OFF(LED1);
    }
 }




Saludos a todos de su amigo adrianjpc :wink:


« Última modificación: 13 de Abril de 2010, 16:37:11 por adrianjpc »

Desconectado adrianjpc

  • PIC10
  • *
  • Mensajes: 10
    • uElectronika
Re: USB-HID Teclado
« Respuesta #17 en: 13 de Abril de 2010, 22:06:09 »
Ahora tengo otro problema, cuando conecto el dispositivo usb, no me aparece por primera vez el numero 11223344 que yo mando, si no cuando lo conecto por segunda vez, no se enque estoy mal, les agredeceria su ayudaa.

Saludos    :(

Desconectado biche.6

  • PIC10
  • *
  • Mensajes: 2
Re: USB-HID Teclado
« Respuesta #18 en: 25 de Mayo de 2010, 17:07:07 »
Disculpen si pregunto algo que es logico pero no tengo muchos conocimientos en ccs que supongo es el que estan utilizando si es asi mi pregunta es la
siguiente:

1.-al poner  todo el programa de adrianpic a un nuevo source files me da algunos errores al momento de compilar se debe a las librerias que llamo creo me podrian ayudar de ante mano gracias:

gracias por la ayuda..............


Desconectado adrianjpc

  • PIC10
  • *
  • Mensajes: 10
    • uElectronika
Re: USB-HID Teclado
« Respuesta #19 en: 25 de Mayo de 2010, 18:26:40 »
Disculpen si pregunto algo que es logico pero no tengo muchos conocimientos en ccs que supongo es el que estan utilizando si es asi mi pregunta es la
siguiente:

1.-al poner  todo el programa de adrianpic a un nuevo source files me da algunos errores al momento de compilar se debe a las librerias que llamo creo me podrian ayudar de ante mano gracias:

gracias por la ayuda..............



el error que tu tienes se deve a la siguiente libreria
Código: [Seleccionar]
#include <.\include\usb_kbd_HID.h>               //USB Configuration and Device descriptors for this UBS device


Te adjunto la libreria
Suerte!!!



Desconectado biche.6

  • PIC10
  • *
  • Mensajes: 2
Re: USB-HID Teclado
« Respuesta #20 en: 26 de Mayo de 2010, 16:47:54 »
Muchas gracias por la respuesta ya logre compilar el programa. Grabo el programa en el micro y al conectar me reconoce pero al abrir el bloc de notas salta a la siguiente columna y no escribe nada tambien cree otro proyecto con el ejercicio 1 (de adrianpic el que no escribia hhhhoolaa solo escribia hola) y este escribe reconoce bien y al abrir el bloc de notas se escribe gg me podrian ayudar y gracias por seguir apoyandonos.

gracias.... :?

Desconectado Zarek

  • PIC10
  • *
  • Mensajes: 12
Re: USB-HID Teclado
« Respuesta #21 en: 08 de Octubre de 2012, 11:59:15 »
tengo un problema que para mi al menos me parece raro, tambien me baso en este ejemplo de redpic, para simular el teclado mi idea es al tener una entrada en un pin del 18f2550 enviar un caracter hacia el PC y poder verlo por ejemplo en el block de notas.
la verdad es que no le pillo el error.

Código: [Seleccionar]
in8 envia[1]
void deteccion_pin(void){

    
         if(bit_test(porta,1)==1){


         usb_put_packet(1,envia,sizeof(envia),USB_DTS_TOGGLE);   // Enviamos los datos por USB.
            delay_ms(500);
            return;
A ver si alguien me puede ayudar, ya que el dispositivo es reconocido por el PC, lo unico que modifique fue la rutina keyboard_task
« Última modificación: 08 de Octubre de 2012, 12:03:44 por Zarek »