18F2550'yi USB Klavye olarak bağlama

Başlatan baran123, 22 Mart 2015, 21:49:12

baran123

Klavye olarak bağlandım windows8 aygıtlarda klavye olarak görüyor daha sonra harf göndermek için bir örnek buldum fakat herhangi bir tepki olmuyor.Daha önce böyle bir çalışma yapan oldumu ?

B7 de led var 20Mhz Kristal takılı bide MCLR 10K ile VCC'de devrem bu kadar

#include <18F2550.h> 
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOMCLR 
#use DELAY(CLOCK=48MHz, CRYSTAL=20MHz) 

#include <usb_desc_keyboard.h>
#include <pic18_usb.h> 
#include <usb.c> 

#define KB_MODIFIER_LEFT_SHIFT 2 

int1 time_expired = FALSE; 
unsigned int8 timer0_count; 

#int_timer0 
void int_timer0_handler() { 

   set_timer0(28036); 
    
   timer0_count++; 
   if(timer0_count == 100) { 
      time_expired = TRUE; 
      timer0_count = 0; 
   } 
} 

void send_char(char);
unsigned int16 ToHidKeyboardScancode(char); 

void main() { 
    
   set_tris_b(0x00);  
   output_high(pin_b7);
   setup_timer_0(T0_INTERNAL | T0_DIV_32); 
   set_timer0(28036); 
      
   enable_interrupts(INT_TIMER0); 
   enable_interrupts(GLOBAL); 
    
   usb_init_cs(); 

   while(TRUE) { 
      
      usb_task(); 
      
      if(usb_enumerated()) {  
      
         if(time_expired) { 
            //printf(send_char, "Hello World!\n"); 
            send_char('H'); 
            send_char('e'); 
            send_char('l'); 
            send_char('l'); 
            send_char('o'); 
            time_expired = FALSE; 
         }          
      } 
   } 
} 

void send_char(char c) { 

   unsigned int8 tx_msg[7]; 
   unsigned int16 scancode; 
    
   if (usb_tbe(1)) { 
      
      memset(tx_msg, 0x00, sizeof(tx_msg)); 
      
      scancode = ToHidKeyboardScancode(c); 
      if(bit_test(scancode, 8)) tx_msg[0] = KB_MODIFIER_LEFT_SHIFT; 
      tx_msg[2] = scancode; 
      usb_put_packet(1, tx_msg, sizeof(tx_msg), USB_DTS_TOGGLE); 
            
      // release key 
      delay_ms(100); 
      memset(tx_msg, 0x00, sizeof(tx_msg)); 
      usb_put_packet(1, tx_msg, sizeof(tx_msg), USB_DTS_TOGGLE); 
      delay_ms(100);
   } 
} 

unsigned int16 ToHidKeyboardScancode(char c) 
{ 
   unsigned int16 shift = 0; 
    
   if ((c>='A')&&(c<='Z')) 
   { 
      c = tolower(c); 
      shift = 0x100; 
   } 
   if ((c>='a')&&(c<='z')) 
   { 
      return(((c-='a')+4)|shift); 
   } 
   if ((c>='1')&&(c<='9')) 
   { 
      return((c-='0')+0x1D); 
   } 
   switch(c) 
   { 
      case '!':   return(0x11E); 
      case '@':   return(0x11F); 
      case '#':   return(0x120); 
      case '$':   return(0x121); 
      case '%':   return(0x122); 
      case '^':   return(0x123); 
      case '&':   return(0x124); 
      case '*':   return(0x125); 
      case '(':   return(0x126); 
      case ')':   return(0x127); 
      case '0':   return(0x27); 
      case '\n':  return(0x28);  //enter 
      case '\r':  return(0x28);  //enter 
      case '\b':  return(0x2A);  //backspace 
      case '\t':  return(0x2B);  //tab 
      case ' ':   return(0x2C);  //space 
      case '_':   return(0x12D); 
      case '-':   return(0x2D); 
      case '+':   return(0x12E); 
      case '=':   return(0x2E); 
      case '{':   return(0x12F); 
      case '[':   return(0x2F); 
      case '}':   return(0x130); 
      case ']':   return(0x30); 
      case '|':   return(0x131); 
      case '\\':   return(0x31); 
      case ':':   return(0x133); 
      case ';':   return(0x33); 
      case '"':   return(0x134); 
      case '\'':   return(0x34); 
      case '~':   return(0x135); 
      case '`':   return(0x35); 
      case '<':   return(0x136); 
      case ',':   return(0x36); 
      case '>':   return(0x137); 
      case '.':   return(0x37); 
      case '?':   return(0x138); 
      case '/':   return(0x38); 
   } 
}

blacklogic

Bildiğim kadarıyla bunu yapamazsınız. Chipin OTG desteği olması lazım.

RaMu

OTG ile ilgisi yok.
Konuyu ters yorumlamışsınız ve
terside psp klavye olarak yapılabiliyor.

18f2550 gibi mcular ile örnekleri mevcut.
CcsC nin programla birlikte yüklenen örneğide var;
ex_usb_keyboard.c
ex_usb_keyboard_and_cdc.c
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

Hocam yapılmış bir kaç örnek buldum ama bir türlü çalıştıramadım.HID klavye olarak görüyor fakat herhangi bir karakter yollamıyor.

t2

Not defterinde belge açıp bekleyelim.
Belki klavye aygıt, buraya yazar

baran123

#5
Alıntı yapılan: t2 - 23 Mart 2015, 22:31:18
Not defterinde belge açıp bekleyelim.
Belki klavye aygıt, buraya yazar
Hocam hiçbir şeyi bu kadar beklemedim ama nafile :D

esensoy

Baran microchip kütüphanesindeki usb hid keyboard uygulaması çalışıyor, pic32 ve pic24 de denedim ben, o pic18 de de çalışıyro bildiğim kadarıyla,
Oradan devam et bence,
PC ye tuşa basma işlevi bu pdf in 8 . sayfasında belirtilmiş,
http://www.ti.com/lit/an/slaa514/slaa514.pdf
key kodlarıda bunlar;
http://www.mindrunway.ru/IgorPlHex/USBKeyScan.pdf

Diyelimki A ya basmak istiyorsun,
Byte 0 = 0;
Byte 1 = 0;
Byte 2 = 0x04;
Byte 3 = 0;
Byte 4 = 0;
Byte 5 = 0;
Byte 6 = 0;
Byte 7 = 0;

Diyelim ki Right Ctrl + A yapmak istiyorsun;
Byte 0 = 0x10; (bit 4)
Byte 1 = 0;
Byte 2 = 0x04;
Byte 3 = 0;
Byte 4 = 0;
Byte 5 = 0;
Byte 6 = 0;
Byte 7 = 0;

Buradan sonra her bir tuşu gönderdikten sonra mutlaka
Byte 0 = 0;
Byte 1 = 0;
Byte 2 = 0;
Byte 3 = 0;
Byte 4 = 0;
Byte 5 = 0;
Byte 6 = 0;
Byte 7 = 0;
şeklinde de göndermelisin yoksa sürekli bastı diye algılıyor;
En tehlikeli an "zafer" anıdır.

baran123