USB HID Joystick for Dummies


Results 1 to 22 of 22

Threaded View

  1. #18
    scumari's Avatar
    scumari Guest

    Default Re: USB HID Joystick for Dummies

    Ok , A 4 axis joystick with 12 buttons and a hat switch:
    PBP code-----------------------------------------------------
    Include "Js_hid_desc.bas" ' Include the HID descriptors
    'Include "modedefs.bas" ' Include serial modes

    DEFINE OSC 48
    DEFINE LOADER_USED 1
    DEFINE RESET_ORG 1100h ' For Microchip USB Bootloader
    DEFINE INTERRUPT_ORG 1108h ' For Microchip USB Bootloader 'LED var PORTC.0

    ' Define ADCIN parameters
    Define ADC_BITS 8 ' Set number of bits in result
    Define ADC_CLOCK 3 ' Set clock source (3=rc)
    Define ADC_SAMPLEUS 100 ' Set sampling time in uS

    USBBufferSizeMax con 10 ' maximum buffer size
    USBBufferSizeTX con 10 ' input
    USBBufferSizeRX con 10 ' output

    ' the USB buffer...
    USBBuffer Var Byte[USBBufferSizeMax]
    USBBufferCount Var Byte
    temp var byte

    ' ************************************************** **********
    ' * Port configuration: *
    ' * PORTD.0-7 are digital inputs *
    ' * AN0,AN5 active as analog inputs *
    ' ************************************************** **********

    PORTA = 0
    PORTB = 0
    PORTC = 0
    PORTD = 0
    PORTE = 0
    TRISA = %11111111
    TRISB = %11111111
    TRISC = %11111111
    TRISD = %11111111
    TRISE = %11111111

    ADCON1 = %00001001

    ' ************************************************** **********
    ' * main program loop - remember, you must keep the USB *
    ' * connection alive with a call to USBService every couple *
    ' * of milliseconds or so... *
    ' ************************************************** **********
    USBInit ' initialise USB...
    ProgramStart:
    ' gosub DoUSBIn
    ADCIN 0,USBBuffer[0]
    ADCIN 1,USBBuffer[1]
    ADCIN 2,USBBuffer[2]
    ADCIN 3,USBBuffer[3]
    USBService ' keep connection alive
    temp = 255-PORTD
    USBBuffer.0(32) = PORTD.0
    USBBuffer.0(33) = PORTD.1
    USBBuffer.0(34) = PORTD.2
    USBBuffer.0(35) = PORTD.3
    USBBuffer.0(36) = temp.4
    USBBuffer.0(37) = temp.5
    USBBuffer.0(38) = temp.6
    USBBuffer.0(39) = temp.7
    USBService ' keep connection alive
    temp = 255-PORTB
    USBBuffer.0(40) = temp.0
    USBBuffer.0(41) = temp.1
    USBBuffer.0(42) = temp.2
    USBBuffer.0(43) = temp.3
    USBBuffer.0(44) = temp.4
    USBBuffer.0(45) = temp.5
    USBBuffer.0(46) = temp.6
    USBBuffer.0(47) = temp.7


    DoUSBOut1:
    USBBufferCount = USBBufferSizeTX ' TX buffer size
    USBService ' keep connection alive
    USBOut 1, USBBuffer, USBBufferCount, DoUSBOut2 ' if bus available, transmit data
    DoUSBOut2:
    GoTo ProgramStart

    DISCRIPTOR code----------------------------------------------------------------
    ReportDescriptor1
    RETLW 0x05
    RETLW 0x01 ; USAGE_PAGE (Generic Desktop)
    RETLW 0x09
    RETLW 0x04 ; USAGE (Joystick)
    RETLW 0xa1
    RETLW 0x01 ; COLLECTION (Application)
    RETLW 0x05
    RETLW 0x01 ; USAGE_PAGE (Generic Desktop)
    RETLW 0x09
    RETLW 0x04 ; USAGE (Joystick)
    RETLW 0xa1
    RETLW 0x00 ; COLLECTION (Physical)
    RETLW 0x09
    RETLW 0x30 ; USAGE (X)
    RETLW 0x09
    RETLW 0x31 ; USAGE (Y)
    RETLW 0x09
    RETLW 0x32 ; USAGE (Z)
    RETLW 0x09
    RETLW 0x33 ; USAGE (Rx)
    RETLW 0x75
    RETLW 0x08 ; REPORT_SIZE (8)
    RETLW 0x95
    RETLW 0x04 ; REPORT_COUNT (4)
    RETLW 0x35
    RETLW 0x00 ; PHYSICAL_MINIMUM (0)
    RETLW 0x46
    RETLW 0xff
    RETLW 0x00 ; PHYSICAL_MAXIMUM (255)
    RETLW 0x15
    RETLW 0x00 ; LOGICAL_MINIMUM (0)
    RETLW 0x26
    RETLW 0xff
    RETLW 0x00 ; LOGICAL_MAXIMUM (255)
    RETLW 0x81
    RETLW 0x02 ; INPUT (DataVarAbs)
    RETLW 0xc0 ; END_COLLECTION
    ; ------------ Hat Switches -------------------
    RETLW 0x09
    RETLW 0x39 ; Usage (Hat Sw)
    RETLW 0x15
    RETLW 0x00 ; Log Min (0)
    RETLW 0x25
    RETLW 0x03 ; Log Max (3)
    RETLW 0x35
    RETLW 0x00 ; Phy Min (0)
    RETLW 0x46
    RETLW 0x0e
    RETLW 0x01 ; Phy Max (270)
    RETLW 0x65
    RETLW 0x14 ; Unit (Eng Rot : Ang Pos)
    RETLW 0x75
    RETLW 0x04 ; Report Size (4)
    RETLW 0x95
    RETLW 0x01 ; Report Count (1)
    RETLW 0x81
    RETLW 0x02 ; Input (Data, Variable, Absolute)
    ; ------------ Buttons ------------------------
    RETLW 0x05
    RETLW 0x09 ; USAGE_PAGE (Button)
    RETLW 0x19
    RETLW 0x01 ; USAGE_MINIMUM (Button 1)
    RETLW 0x29
    RETLW 0x0c ; USAGE_MAXIMUM (Button 12)
    RETLW 0x15
    RETLW 0x00 ; LOGICAL_MINIMUM (0)
    RETLW 0x25
    RETLW 0x01 ; LOGICAL_MAXIMUM (1)
    RETLW 0x45
    RETLW 0x00 ; PHYSICAL_MAXIMUM (0)
    RETLW 0x55
    RETLW 0x00 ; UNIT_EXPONENT (0)
    RETLW 0x75
    RETLW 0x01 ; REPORT_SIZE (1)
    RETLW 0x95
    RETLW 0x0c ; REPORT_COUNT (12)
    RETLW 0x81
    RETLW 0x02 ; INPUT (Data Var Abs)
    RETLW 0xc0 ; END_COLLECTION
    EndReportDescriptor1


    Now a 8 axis joystick with 8 buttons:
    PBP Code-----------------------------------
    Include "Th_hid_desc.bas" ' Include the HID descriptors
    'Include "modedefs.bas" ' Include serial modes

    DEFINE OSC 48
    DEFINE LOADER_USED 1
    DEFINE RESET_ORG 1100h ' For Microchip USB Bootloader
    DEFINE INTERRUPT_ORG 1108h ' For Microchip USB Bootloader 'LED var PORTC.0

    ' Define ADCIN parameters
    Define ADC_BITS 8 ' Set number of bits in result
    Define ADC_CLOCK 3 ' Set clock source (3=rc)
    Define ADC_SAMPLEUS 100 ' Set sampling time in uS

    'Define LCD_DREG PORTB ' LCD data pin port
    'Define LCD_DBIT 0 ' LCD data pin bit
    'Define LCD_RSREG PORTC ' LCD register select pin port
    'Define LCD_RSBIT 6 ' LCD register select pin bit
    'Define LCD_EREG PORTC ' LCD enable pin port
    'Define LCD_EBIT 7 ' LCD enable pin bit
    'Define LCD_BITS 4 ' LCD number of data bits
    'Define LCD_LINES 2 ' LCD number of lines

    'define HSER_RCSTA 090h
    'define HSER_TXSTA 0A4h
    'define HSER_BAUD 115200
    'define HSER_CLROERR

    USBBufferSizeMax con 10 ' maximum buffer size
    USBBufferSizeTX con 10 ' input
    USBBufferSizeRX con 10 ' output

    ' the USB buffer...
    USBBuffer Var Byte[USBBufferSizeMax]
    USBBufferCount Var Byte
    temp var byte

    ' ************************************************** **********
    ' * Port configuration: *
    ' * PORTD.0-7 are digital inputs *
    ' * AN0,AN5 active as analog inputs *
    ' ************************************************** **********

    PORTA = 0
    PORTB = 0
    PORTC = 0
    PORTD = 0
    PORTE = 0
    TRISA = %11111111
    TRISB = %11111111
    TRISC = %11111111
    TRISD = %11111111
    TRISE = %11111111

    ADCON1 = %00001001

    ' ************************************************** **********
    ' * main program loop - remember, you must keep the USB *
    ' * connection alive with a call to USBService every couple *
    ' * of milliseconds or so... *
    ' ************************************************** **********
    USBInit ' initialise USB...
    ProgramStart:
    'gosub DoUSBIn
    ADCIN 0,USBBuffer[0]
    ADCIN 1,USBBuffer[1]
    ADCIN 2,USBBuffer[2]
    USBService
    ADCIN 3,USBBuffer[3]
    ADCIN 4,USBBuffer[4]
    ADCIN 5,USBBuffer[5]
    GoSub DoUSBOut ' keep connection alive
    ADCIN 6,USBBuffer[6]
    ADCIN 7,USBBuffer[7]

    temp = 255-PORTD
    USBBuffer.0(64) = temp.4
    USBBuffer.0(65) = temp.5
    USBBuffer.0(66) = temp.6
    USBBuffer.0(67) = temp.7

    temp = 255-PORTB
    USBBuffer.0(68) = temp.0
    USBBuffer.0(69) = temp.1
    USBBuffer.0(70) = temp.2
    USBBuffer.0(71) = temp.3

    USBBuffer.0(72) = temp.4
    USBBuffer.0(73) = temp.5
    USBBuffer.0(74) = temp.6
    USBBuffer.0(75) = temp.7


    'GoSub DoUSBOut
    USBBufferCount = USBBufferSizeTX ' TX buffer size
    USBService ' keep connection alive
    USBOut 1, USBBuffer, USBBufferCount, DoUSBOut2 ' if bus available, transmit data
    DoUSBOut2:

    GoTo ProgramStart

    DISCRIPTOR code----------------------------------------------------------------
    ReportDescriptor1
    RETLW 0x05
    RETLW 0x01 ; USAGE_PAGE (Generic Desktop)
    RETLW 0x09
    RETLW 0x04 ; USAGE (Joystick)
    RETLW 0xa1
    RETLW 0x01 ; COLLECTION (Application)
    RETLW 0x05
    RETLW 0x01 ; USAGE_PAGE (Generic Desktop)
    RETLW 0x09
    RETLW 0x04 ; USAGE (Joystick)
    RETLW 0xa1
    RETLW 0x00 ; COLLECTION (Physical)
    RETLW 0x09
    RETLW 0x30 ; USAGE (X)
    RETLW 0x09
    RETLW 0x31 ; USAGE (Y)
    RETLW 0x09
    RETLW 0x32 ; USAGE (Z)
    RETLW 0x09
    RETLW 0x33 ; USAGE (Rx)
    RETLW 0x09
    RETLW 0x34 ; USAGE (Ry)
    RETLW 0x09
    RETLW 0x35 ; USAGE (Rz)
    RETLW 0x09
    RETLW 0x36 ; USAGE (Ry)
    RETLW 0x09
    RETLW 0x37 ; USAGE (Rz)
    RETLW 0x75
    RETLW 0x08 ; REPORT_SIZE (8)
    RETLW 0x95
    RETLW 0x08 ; REPORT_COUNT (8)
    RETLW 0x35
    RETLW 0x00 ; PHYSICAL_MINIMUM (0)
    RETLW 0x46
    RETLW 0xff
    RETLW 0x00 ; PHYSICAL_MAXIMUM (255)
    RETLW 0x15
    RETLW 0x00 ; LOGICAL_MINIMUM (0)
    RETLW 0x26
    RETLW 0xff
    RETLW 0x00 ; LOGICAL_MAXIMUM (255)
    RETLW 0x81
    RETLW 0x02 ; INPUT (DataVarAbs)
    RETLW 0xc0 ; END_COLLECTION
    RETLW 0x05
    RETLW 0x09 ; USAGE_PAGE (Button)
    RETLW 0x19
    RETLW 0x01 ; USAGE_MINIMUM (Button 1)
    RETLW 0x29
    RETLW 0x10 ; USAGE_MAXIMUM (Button 16)
    RETLW 0x15
    RETLW 0x00 ; LOGICAL_MINIMUM (0)
    RETLW 0x25
    RETLW 0x01 ; LOGICAL_MAXIMUM (1)
    RETLW 0x45
    RETLW 0x00 ; PHYSICAL_MAXIMUM (0)
    RETLW 0x75
    RETLW 0x01 ; REPORT_SIZE (1)
    RETLW 0x95
    RETLW 0x10 ; REPORT_COUNT (16)
    RETLW 0x81
    RETLW 0x02 ; INPUT (Data Var Abs)
    RETLW 0xc0 ; END_COLLECTION
    EndReportDescriptor1


    They both work for FSX and X-Plane.
    See http://www.scumari.nl

    Have fun!
    Last edited by scumari; - 3rd December 2012 at 22:12.

Similar Threads

  1. USB hid maker help please.
    By BobEdge in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 3rd April 2013, 14:49
  2. Simple USB Comms Problem
    By awmt102 in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 6th January 2010, 20:17
  3. USB MSD with HID code ?
    By Chris Barron in forum USB
    Replies: 1
    Last Post: - 11th November 2009, 17:33
  4. i cant get 18f2550 work as HID
    By Ahmadabuomar in forum mel PIC BASIC Pro
    Replies: 19
    Last Post: - 13th October 2009, 16:39
  5. Replies: 0
    Last Post: - 6th March 2009, 07:52

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts