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!
Bookmarks