Teclado USB con 18F2550

2

Estoy tratando de construir mi propio teclado mecánico. Todo el mundo usa Teensy como puedo ver. Quiero usar PIC18F2550 en su lugar. Estoy usando CCS C por cierto. El problema es que no puedo enviar más de 5 bits. Trataron de enviar diferentes matrices, chocaron de alguna manera. El aumento en el recuento de informes de "usb_desc_keyboard.h" no funciona. La función "usb_puts" tampoco funcionó.

Cuando envío varios arreglos, uno por uno, PIC envía caracteres clave. No hay problema allí. Pero no hace la misma respuesta que un teclado regular. Normalmente, el primer tipo lleva más tiempo que otros. De esta manera PIC envía caracteres continuamente. Quiero enviar 64 bits juntos. ¿Es eso posible?

Estoy usando el método de matriz para las interacciones de los botones, no tengo ningún problema.

EDITAR:

Agregué el código. El tamaño de la matriz tx_msg es 7. Quiero aumentar esto a 64. Encontré a este tipo diciendo que lo hizo. enlace Voy a intentar esto cuando llegue a casa.

void usb_keyboard_task(void) 
{
   static int8 tx_msg[7]={0,0,0,0,0,0,0};
   static int8 leds;

   if(!input(pin_B0))
      tx_msg[2]=0x04;
   else
      tx_msg[2]=0;

   usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);

   //receive NUM LOCK, CAPS LOCK, etc LED status from PC.
   //we won't do anything with it.
   if (usb_kbhit(2)) 
   {
      usb_get_packet(2, &leds, 1);
   }   
}

void main(void) 
{    
   setup_adc_ports(NO_ANALOGS);
   set_tris_a(0b0000000);
   set_tris_b(0b11111111);
   port_b_pullups(0b11111111);   
   usb_init_cs();   

   output_high(pin_A0);

   while (TRUE)
   {       
      usb_task();
      usb_debug_task();
      if(usb_enumerated())
      {
         usb_keyboard_task();
         delay_ms(50);
      }
   } 
} 
    
pregunta Hammers

1 respuesta

2

Finalmente lo hice. Permítanme compartir con ustedes cómo me las he arreglado. Primero que todo, utilicé la función "usb_puts" y no "usb_put_package". Debe realizar un solo cambio en "usb_desc_keyboard.h". Reorganizar "recuento de informes" de acuerdo a su necesidad.

0x95, 0x0C, // número de informes (5) // 47,48

En la versión predeterminada, esto era "0x05". Puede enviar 5 estados clave con usb. En mi prototipo hay 12 botones. Una matriz de 3x4. Con un par de experimentos he elevado este número.

static int8 tx_msg [14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; tx_msg [0], tx_msg [1] está reservado, en realidad no lo sé.

Comenzamos a usar desde tx_msg [2] y enviamos datos.

Aquí hay un código de ejemplo:

void usb_send()
{
   static int8 tx_msg[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};      

   static int8 leds;
   //receive NUM LOCK, CAPS LOCK, etc LED status from PC.
   //we won't do anything with it.
   if (usb_kbhit(2)) 
   {
      usb_get_packet(2, &leds, 1);
   }     

   //make necessary changes in tx_msg here.

   if(!input(pin_B3))
      tx_msg[13]=0x0F;
   else
      tx_msg[13]=0;

   usb_puts(1,tx_msg,sizeof(tx_msg),timeout);     
}
    
respondido por el Hammers

Lea otras preguntas en las etiquetas