Thông báo

Collapse
No announcement yet.

Cần trợ giúp làm USB Joystick với PIC 18F4550

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Cần trợ giúp làm USB Joystick với PIC 18F4550

    Các bạn biết về lập trình vi điều khiển cho mình hỏi một ý tưởng này với.


    Mình có nhu cầu lập làm một Joystick analog. Có khoảng 8 nút bấm, các nút này là dạng analog. Bàn phím nó chỉ có một sợi dây ra (tất nhiên chuẩn xác thì là 2 sợi nhưng 1 sợi là mát rồi), khi bấm mỗi một nút thì sợi này sẽ cho ra một điện áp nhất định, thay đổi từ 0 - 5V (0,5V, 1V, 1,5V,....)

    Mình có nhu cầu làm một cái mạch càng nhỏ gọn càng tốt để nhận cái tín hiệu điện áp này và chuyển ra cổng usb (sử dụng lớp HID của con 18F4550). Khi đó trên máy tính sẽ có thể gán nút cho mỗi phím bấm từ vô lăng. Mỗi mức điện áp analog nào đó ở đầu vào thì đầu ra của Joystick sẽ trả về một nút có giá trị nào đó từ 0 - 255.

    Dự kiến dùng PIC 18F4550 vì nghĩ nó có khả năng làm được việc này.


    Sơ đồ khối mạch tổng quát mình dự kiến như ảnh đính kèm

    Tài liệu về gamepad POV HAT BUTTON AXIS

    https://libstock.mikroe.com/projects...og-digital-pov

    Tài liệu tham khảo về USB HID Report Descriptor
    http://eleccelerator.com/tutorial-ab...t-descriptors/

    Tài liệu tham khảo về nút bấm:
    http://forum.mikroe.com/viewtopic.ph...278577#p278577


    - Hướng dẫn tự tạo chart thêu
    Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

  • #2
    Bạn tìm cái topic USB keyboard của tôi .... trong mục PIC ... sau đó viết thêm đọc ADC và gán phím đưa ra usb là được. Ví dụ 0,5V gán cho phím a, 1v gán cho phím b ... cứ vậy thôi.
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      Lên microchip tải MLA(microchip libraries applucation) về trong có demo joystick.

      Comment


      • #4
        Nguyên văn bởi queduong Xem bài viết
        Bạn tìm cái topic USB keyboard của tôi .... trong mục PIC ... sau đó viết thêm đọc ADC và gán phím đưa ra usb là được. Ví dụ 0,5V gán cho phím a, 1v gán cho phím b ... cứ vậy thôi.
        Em tìm mãi mới ra bài này của Mod http://www.dientuvietnam.net/forums/...h%C3%ADch-game

        Chắc ý mod đang nói đến bài đó phải không ạ.
        - Hướng dẫn tự tạo chart thêu
        Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

        Comment


        • #5
          Nguyên văn bởi duong_act Xem bài viết
          Lên microchip tải MLA(microchip libraries applucation) về trong có demo joystick.

          Các ví dụ về joystick trên mạng có vẻ như họ toàn dùng nút bấm thẳng vào các chân vi điều khiển. em cần dùng một chân analog, đầu ra gửi tác tín hiệu của joystick tương ứng các số từ 0 ÷ 255 gì đó để có thể vào control panel trên pc gán nút được
          - Hướng dẫn tự tạo chart thêu
          Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

          Comment


          • #6
            Nguyên văn bởi ngochoangims Xem bài viết

            Em tìm mãi mới ra bài này của Mod http://www.dientuvietnam.net/forums/...h%C3%ADch-game

            Chắc ý mod đang nói đến bài đó phải không ạ.
            Chuẩn rồi, viết thêm đoạn code đọc adc vào chân AN0 ( chân số 2 ) rồi gán phím tương ứng với giá trị adc là ok.
            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

            Comment


            • #7
              Nguyên văn bởi ngochoangims Xem bài viết


              Các ví dụ về joystick trên mạng có vẻ như họ toàn dùng nút bấm thẳng vào các chân vi điều khiển. em cần dùng một chân analog, đầu ra gửi tác tín hiệu của joystick tương ứng các số từ 0 ÷ 255 gì đó để có thể vào control panel trên pc gán nút được
              ​Từ code joystick dung nút bấm bạn vứt phần nút bấm đi. Dùng ADC có sẵn trong pic đọc analog rồi thêm chút là ra thôi. Cái khó khan nhất là làm thành joystick thì code mẫu có rồi.

              Comment


              • #8
                Nguyên văn bởi duong_act Xem bài viết

                ​Từ code joystick dung nút bấm bạn vứt phần nút bấm đi. Dùng ADC có sẵn trong pic đọc analog rồi thêm chút là ra thôi. Cái khó khan nhất là làm thành joystick thì code mẫu có rồi.

                Bạn cho hỏi nếu mình làm đúng theo sơ đồ và code ở đây http://artjoy.narod.ru/eng/index_eng.html
                Thì có thể dùng luôn cái chân x-axis cho đúng mục đích của mình được không. Nhìn có vẻ như nó cũng lấy tín hiệu analog. Nếu được thì mình dùng luôn mạch và code sẵn đó mà ko phải làm gì
                - Hướng dẫn tự tạo chart thêu
                Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

                Comment


                • #9
                  Nguyên văn bởi duong_act Xem bài viết
                  Lên microchip tải MLA(microchip libraries applucation) về trong có demo joystick.

                  Cảm ơn bác, sau vài ngày đọc đủ các loại tài liệu em đã từ một người không biết tý gì về vi điều khiển đã tự code được cái đo điện áp bằng DAC và hiển thị trên LCD. Phần ADC đã hòm hòm, giờ còn phần gửi dữ liệu đọc được ra cổng USB cho máy tính nhận như Game Pad mà đang bí quá
                  - Hướng dẫn tự tạo chart thêu
                  Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

                  Comment


                  • #10
                    Các bác cho em hỏi đoạn code cho Joystick dưới đây em đã kiểm tra trên proteus thấy chạy OK. Giờ em muốn sửa nó để thay vì các nút bấm của họ và nút axis thành nút bấm analog của em như đã hỏi ở bài đầu thì làm thế nào .

                    Giả dụ em có tín hiệu analod từ nút bấm đọc được giá trị qua bộ adc của con 18F4550 bằng lệnh"

                    Code:
                    gia_tri_nut_bam = Adc_read(0); //ví dụ lệnh này thu được kết quả là giá trị gia_tri_nut_bam = 240
                    Giờ phải sửa đoạn code dưới thế nào để gửi giá trị đó lên máy tính qua cổng usb



                    Code:
                    /*
                    * Project name:
                                    USB HID JOYSTICK PROJECT
                    
                     * Copyright (c) 2012 Emil Enchev
                    
                     * Description:
                      USB HID JOYSTICK PROJECT
                    
                     * Test configuration:
                         MCU:             PIC18F4550
                    
                         dev.board:       easypic5
                    
                         Oscillator:      HS+PLL, 32.000 MHz (8MHz Crystal)
                    
                         SW:              mikroC PRO for PIC
                    
                     * NOTES:
                     1. USB COMM.Enabled J12
                     2. PORTB PULL-UP
                     3. PORTA - ANALOG INPUTS(10k potentiometers):
                        3.1. PORTA,0 -> x_axys
                        3.2  PORTA,1 -> y_axys
                        3.3. PORTA,2 -> ANALOG Point Of View Hat(POV), PORTB 4,5,6,7 - DIGITAL POV CONTROL
                                        SET PORTB,4=0 for digital POV
                        3.4. PORTA,3 -> Throttle
                        
                        Note: For testing, You can move the jumpers to change AN0-AN3 on the internal
                        ADC input on easyPic Board, but it's better to use mikroElektronika's
                        Additional Potentiometer board: http://www.mikroe.com/add-on-boards/measurement/potentiometer/
                    
                     4. DIGITAL Inputs:
                           PORTB,0 =>  Button1
                           PORTB,1 =>  Button2
                           PORTB,2 =>  Button3
                           PORTB,3 =>  Button4
                    
                    
                      5.  Open Control Panel-> Game Controllers -> HID Manipulator to test functions
                      6.  You can use Analog or Digital POV control. If PORTB,4,5,6 or 7 pressed - POV control is digital
                    
                     */
                    
                    #define button1 PORTB.F0
                    #define button2 PORTB.F1
                    #define button3 PORTB.F2
                    #define button4 PORTB.F3
                    
                    
                    unsigned char readbuff[64] absolute 0x500;
                    unsigned char writebuff[64] absolute 0x540;
                    unsigned char buttons;
                    unsigned char pov, pov_hat, dig_pov;
                    char x_axis, y_axis, throttle=0;   // signed char
                    
                    void interrupt()
                    {
                         USB_Interrupt_Proc();        // USB servicing is done inside the interrupt
                    }
                    
                    void main()
                    {
                            PORTB=0;           //Initialize PORTB
                            TRISB=255;         //PORTB - INPUTS
                    
                            HID_Enable(readbuff,writebuff);
                    
                            while(1)
                            {
                                    //   Joystick buttons
                                    buttons=button1 + (button2*2) + (button3*4) + (button4*8); //Compact buttons
                                    buttons=~buttons;       //Convert to LOW LEVEL Detection
                                    buttons<<=4;            //Send bits to left
                                    dig_pov=~PORTB & 0b11110000;  //Read upper 4 bits only
                                    dig_pov>>=4;                 //move bits right
                    
                                    //Point Of View Hat
                                    if(dig_pov==0){               //Alternate Analog POV
                                        pov=Adc_Read(2)>>2;
                                    if (pov>=0 && pov<=60)        //Up
                                        pov_hat=buttons;
                                    if (pov>=61 && pov<=142)      //Right
                                        pov_hat=buttons|1;
                                    if (pov>=143 && pov<=175)     //Down
                                        pov_hat=buttons|2;
                                    if (pov>=176 && pov<=193)     //Left
                                        pov_hat=buttons|3;
                                        }else{                    //Alternate digital POV
                                        if (dig_pov==1) pov_hat=buttons;
                                        if (dig_pov==3) pov_hat=buttons|1;
                                        if (dig_pov==5) pov_hat=buttons|2;
                                        if (dig_pov==9) pov_hat=buttons|3;
                                             }
                    
                                    //Joystick Axes
                                    x_axis=(Adc_Read(0)>>2)-128;      //Read only the upper 8 bits of the ADC
                                    y_axis=(Adc_Read(1)>>2)-128;
                                    throttle=(Adc_Read(3)>>2)-128;
                    
                                    //USB
                                    writebuff[0]=throttle;
                                    writebuff[1]=x_axis;
                                    writebuff[2]=y_axis;
                                    writebuff[3]=pov_hat;
                    
                                    while(!HID_Write(writebuff,4));
                            }
                    }
                    Em đọc mãi không hiểu đoạn này

                    while(!HID_Write(writebuff,4));

                    Có thể thay luốn nó thành nhuw dưới đây để gửi lên máy tính được không

                    while(!HID_Write(gia_tri_nut_bam,4));

                    Code:
                    void main()
                    {
                    ...............
                            HID_Enable(readbuff,writebuff);
                    
                            while(1)
                            {
                     
                             gia_tri_nut_bam = Adc_Read(0);
                    
                            while(!HID_Write(gia_tri_nut_bam,4));
                            }
                    }
                    - Hướng dẫn tự tạo chart thêu
                    Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

                    Comment


                    • #11
                      Code:
                      gia_tri_nut_bam = Adc_Read(0);
                      writebuff[0] = gia_tri_nut_bam;
                      while(!HID_Write(writebuff,1)); // truyền giá trị nút bấm.
                      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                      Comment


                      • #12
                        Nguyên văn bởi queduong Xem bài viết
                        Code:
                        gia_tri_nut_bam = Adc_Read(0);
                        writebuff[0] = gia_tri_nut_bam;
                        while(!HID_Write(writebuff,1)); // truyền giá trị nút bấm.

                        Em loay hoay bao nhiêu ngày nay vẫn chưa làm nó chạy được.
                        Hay khi nào Mod rảnh rảnh thì chỉnh giúp em bản code cơ bản cho chạy được với chức năng như đề bài với. Em càng làm càng rối vì vướng nhiều thứ quá.

                        Với lại cả cái ADC này nó tận 10 bit, mấy cái phím, game pad, ... toàn dùng 8 bit. Em có xem code mẫu bàn phím tự động của Mod và một số vi dụ khác thấy có cái lệnh dịch trái << và dịch phải >> nhưng em đọc tài liệu mà không hiểu cái này ý nghĩa nó thế nào. Thường thấy người ta dùng nó để cắt bớt 10 thành 8 nhưng không hiểu nó cắt kiểu gì. Vì theo em hiểu dịch phải n bit là cắt n bit bên phải của chuỗi.
                        Ví dụ một biến 10 bit có giá trị như sau bien_1 = 0b 00 01 01 11 11 nếu dịch phải 2 bit :
                        bien_2 = bien_1 >> 2 thì nó thành bien_2 = 0b 00 00 01 01 11 như thế là bị mất thông tin của 2 bít bị cắt -> như thế đâu có ổn nhỉ. Ngoài ra 2 bít bị cắt lại bị từ điền vào thành 2 số 0 (màu xanh) thì nó vẫn là 10 bít, chỉ là số bị nhỏ đi chứ ạ.

                        Còn đoạn mã dưới đây:
                        Code:
                                         if (pov>=0 && pov<=60)        //Up                    
                        pov_hat=buttons;                
                        if (pov>=61 && pov<=142)      //Right                    
                        pov_hat=buttons|1;                
                        if (pov>=143 && pov<=175)     //Down                    
                        pov_hat=buttons|2;                
                        if (pov>=176 && pov<=193)     //Left
                        Em nhờ Mod giải thích giùm các đoạn pov_hat=buttons|1; có nghĩa gì thế, cái dấu sọc đứng | có tác dụng gì ở đây (em đọc tài liệu thì nó là phép toán logic OR bitwise) nhưng nhìn vào cái dòng lệnh đó chẳng thể hiểu được
                        - Hướng dẫn tự tạo chart thêu
                        Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

                        Comment


                        • #13
                          Hỏi ngu tý : Joystick kết nối HID à ?
                          À vừa xem thì HID thật. Mà trong cái mình bảo có 1 demo về joystick có cả nút bấm, analog phần mềm nữa cậu chưa xem à ?
                          http://www.microchip.com/mplab/micro...r-applications

                          Comment


                          • #14
                            Nguyên văn bởi duong_act Xem bài viết
                            Hỏi ngu tý : Joystick kết nối HID à ?
                            À vừa xem thì HID thật. Mà trong cái mình bảo có 1 demo về joystick có cả nút bấm, analog phần mềm nữa cậu chưa xem à ?
                            http://www.microchip.com/mplab/micro...r-applications

                            Mình có cài cái đó vào máy từ hôm bạn bảo nhưng mình chưa làm được gì với nó. Nó dành cho người có một lượng kiến thức nhất định và học sâu về cái này. Mình đam mê không tiếp cận ngay được mọi cái như các bạn được đào tạo chính thức .
                            Bạn giải thích giúp mình đoạn code mình hỏi ở post #12 với. Ví dụ đoạn

                            if (pov>=143 && pov<=175)
                            pov_hat=buttons|2;

                            Mình hiểu là: Nếu pov >=143 và pov <=175 thì gán pov_hat = buttons|2; nhưng cái buttons|2 nghĩa là gì ??
                            - Hướng dẫn tự tạo chart thêu
                            Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

                            Comment


                            • #15
                              queduong , duong_act cho mình hỏi hai code dưới đây sai chỗ nào mà ko chạy được (mình dùng MicroC Pro 6.3), mạch chỉ làm cho 8 nút bấm, các nút này được gán bằng cách quy đổi giá trị adc tại cổng AN0 :

                              1. Code chính thực hiện chương trình (Main.c):

                              Code:
                              //
                              unsigned char readbuff[64] absolute 0x500;
                              unsigned char writebuff[64] absolute 0x540;
                              unsigned char pov;
                              unsigned char buttons;
                              //
                              void interrupt()
                              {
                                   USB_Interrupt_Proc();        // USB servicing is done inside the interrupt
                              }
                              
                              void main()
                              {
                                      HID_Enable(&readbuff,&writebuff);       // Enable HID communication
                              
                                      while(1)
                                      {
                                      pov = ADC_Get_Sample(0) / 4;
                                      if(pov >= 0 && pov <= 32)     buttons = 0b00000001;
                                      if(pov >= 33 && pov <= 64)    buttons = 0b00000010;
                                      if(pov >= 65 && pov <= 96)    buttons = 0b00000011;
                                      if(pov >= 97 && pov <= 128)   buttons = 0b00000100;
                                      if(pov >= 129 && pov <= 160)  buttons = 0b00000101;
                                      if(pov >= 161 && pov <= 192)  buttons = 0b00000110;
                                      if(pov >= 193 && pov <= 224)  buttons = 0b00000111;
                                      if(pov >= 225 && pov <= 230)  buttons = 0b00001000;
                                      writebuff[0] = buttons;
                                      while(!HID_Write(&writebuff,1));
                                      }
                              }
                              2. Code Hid USB Joystick report descriptor (USB_DSC.c):

                              Code:
                              const unsigned int USB_VENDOR_ID = 0x1234;
                              const unsigned int USB_PRODUCT_ID = 0x0001;
                              const char USB_SELF_POWER = 0x80;            // Self powered 0xC0,  0x80 bus powered
                              const char USB_MAX_POWER = 50;               // Bus power required in units of 2 mA
                              const char HID_INPUT_REPORT_BYTES = 64;
                              const char HID_OUTPUT_REPORT_BYTES = 64;
                              const char USB_TRANSFER_TYPE = 0x03;         //0x03 Interrupt
                              const char EP_IN_INTERVAL = 1;
                              const char EP_OUT_INTERVAL = 1;
                              
                              const char USB_INTERRUPT = 1;
                              const char USB_HID_EP = 1;
                              const char USB_HID_RPT_SIZE = 45; // Con số này tính bằng cách nào?? thấy Mod queduong điền trong auto keyboard như vậy
                              
                              /* Device Descriptor */
                              const struct {
                                  char bLength;               // bLength         - Descriptor size in bytes (12h)
                                  char bDescriptorType;       // bDescriptorType - The constant DEVICE (01h)
                                  unsigned int bcdUSB;        // bcdUSB          - USB specification release number (BCD)
                                  char bDeviceClass;          // bDeviceClass    - Class Code
                                  char bDeviceSubClass;       // bDeviceSubClass - Subclass code
                                  char bDeviceProtocol;       // bDeviceProtocol - Protocol code
                                  char bMaxPacketSize0;       // bMaxPacketSize0 - Maximum packet size for endpoint 0
                                  unsigned int idVendor;      // idVendor        - Vendor ID
                                  unsigned int idProduct;     // idProduct       - Product ID
                                  unsigned int bcdDevice;     // bcdDevice       - Device release number (BCD)
                                  char iManufacturer;         // iManufacturer   - Index of string descriptor for the manufacturer
                                  char iProduct;              // iProduct        - Index of string descriptor for the product.
                                  char iSerialNumber;         // iSerialNumber   - Index of string descriptor for the serial number.
                                  char bNumConfigurations;    // bNumConfigurations - Number of possible configurations
                              } device_dsc = {
                                    0x12,                   // bLength
                                    0x01,                   // bDescriptorType
                                    0x0200,                 // bcdUSB
                                    0x00,                   // bDeviceClass
                                    0x00,                   // bDeviceSubClass
                                    0x00,                   // bDeviceProtocol
                                    8,                      // bMaxPacketSize0
                                    USB_VENDOR_ID,          // idVendor
                                    USB_PRODUCT_ID,         // idProduct
                                    0x0001,                 // bcdDevice
                                    0x01,                   // iManufacturer
                                    0x02,                   // iProduct
                                    0x00,                   // iSerialNumber
                                    0x01                    // bNumConfigurations
                                };
                              
                              /* Configuration 1 Descriptor */
                              const char configDescriptor1[]= {
                                  // Configuration Descriptor
                                  0x09,                   // bLength             - Descriptor size in bytes
                                  0x02,                   // bDescriptorType     - The constant CONFIGURATION (02h)
                                  0x29,0x00,              // wTotalLength        - The number of bytes in the configuration descriptor and all of its subordinate descriptors
                                  1,                      // bNumInterfaces      - Number of interfaces in the configuration
                                  1,                      // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests
                                  0,                      // iConfiguration      - Index of string descriptor for the configuration
                                  USB_SELF_POWER,         // bmAttributes        - Self/bus power and remote wakeup settings
                                  USB_MAX_POWER,          // bMaxPower           - Bus power required in units of 2 mA
                              
                                  // Interface Descriptor
                                  0x09,                   // bLength - Descriptor size in bytes (09h)
                                  0x04,                   // bDescriptorType - The constant Interface (04h)
                                  0,                      // bInterfaceNumber - Number identifying this interface
                                  0,                      // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber.
                                  2,                      // bNumEndpoint - Number of endpoints supported not counting endpoint zero
                                  0x03,                   // bInterfaceClass - Class code
                                  0,                      // bInterfaceSubclass - Subclass code
                                  0,                      // bInterfaceProtocol - Protocol code
                                  0,                      // iInterface - Interface string index
                              
                                  // HID Class-Specific Descriptor
                                  0x09,                   // bLength - Descriptor size in bytes.
                                  0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.
                                  0x01,0x01,              // bcdHID - HID specification release number (BCD).
                                  0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.
                                  1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.
                                  0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows
                                  USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.
                              
                                  // Endpoint Descriptor
                                  0x07,                   // bLength - Descriptor size in bytes (07h)
                                  0x05,                   // bDescriptorType - The constant Endpoint (05h)
                                  USB_HID_EP | 0x80,      // bEndpointAddress - Endpoint number and direction
                                  USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
                                  0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
                                  EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate
                              
                                  // Endpoint Descriptor
                                  0x07,                   // bLength - Descriptor size in bytes (07h)
                                  0x05,                   // bDescriptorType - The constant Endpoint (05h)
                                  USB_HID_EP,             // bEndpointAddress - Endpoint number and direction
                                  USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
                                  0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
                                  EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate
                              };
                              
                              const struct {
                                char report[USB_HID_RPT_SIZE];
                              }hid_rpt_desc =
                                {
                                  0x05, 0x01,             // USAGE_PAGE (Generic Desktop)
                                  0x09, 0x04,             // USAGE (Joystick)
                                  0xa1, 0x01,             // COLLECTION (Application)
                                  0xa1, 0x00,             // COLLECTION (Physical)
                                  0x05, 0x09,             // USAGE_PAGE (Button)
                                  0x19, 0x01,             // USAGE_MINIMUM (Button 1)
                                  0x29, 0x08,             // USAGE_MAXIMUM (Button 8)
                                  0x15, 0x00,             // LOGICAL_MINIMUM (0)
                                  0x25, 0x01,             // LOGICAL_MAXIMUM (1)
                                  0x75, 0x01,             // REPORT_SIZE (1)
                                  0x95, 0x08,             // REPORT_COUNT (8)
                                  0x81, 0x02,             // INPUT (Data,Var,Abs)
                                  0xc0,                    // END_COLLECTION
                                  0xc0                    // END_COLLECTION
                                };
                              
                              //Language code string descriptor
                              const struct {
                                char bLength;
                                char bDscType;
                                unsigned int string[1];
                                } strd1 = {
                                    4,
                                    0x03,
                                    {0x0409}
                                  };
                              
                              
                              //Manufacturer string descriptor
                              const struct{
                                char bLength;
                                char bDscType;
                                unsigned int string[11];
                                }strd2={
                                  24,           //sizeof this descriptor string
                                  0x03,
                                  {'d','i','e','n','t','u','v','i','e','t','n'}
                                };
                              
                              //Product string descriptor
                              const struct{
                                char bLength;
                                char bDscType;
                                unsigned int string[6];
                              }strd3={
                                  14,          //sizeof this descriptor string
                                  0x03,
                                  {'U','S','B','S','W','C'}
                               };
                              
                              //Array of configuration descriptors
                              const char* USB_config_dsc_ptr[1];
                              
                              //Array of string descriptors
                              const char* USB_string_dsc_ptr[3];
                              
                              void USB_Init_Desc(){
                                USB_config_dsc_ptr[0] = &configDescriptor1;
                                USB_string_dsc_ptr[0] = (const char*)&strd1;
                                USB_string_dsc_ptr[1] = (const char*)&strd2;
                                USB_string_dsc_ptr[2] = (const char*)&strd3;
                              }
                              - Hướng dẫn tự tạo chart thêu
                              Chuyên bán buôn - bán lẻ kit thêu tranh chữ thập -

                              Comment

                              Về tác giả

                              Collapse

                              ngochoangims Tìm hiểu thêm về ngochoangims

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X