/* * Project name: HIDtest2 (USB HID Read & Write Test) * Copyright: (c) MikroElektronika, 2005-2008 * Revision History: 20050502: - initial release; * Description: This example establishes connection with the HID terminal that is active on the PC. Upon connection establishment, the HID Device Name will appear in the respective window. The character that user sends to PIC from the HID terminal will be re-sent back to user. * Test configuration: MCU: PIC18F4550 http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf Dev.Board: EasyPIC5 http://www.mikroe.com/en/tools/easypic5/ Oscillator: HS 8.000 MHz (USB osc. is raised with PLL to 48.000MHz) Ext. Modules: on-board USB-HID http://www.mikroe.com/pdf/easypic5/easypic5_manual.pdf#page27 SW: mikroC PRO for PIC http://www.mikroe.com/en/compilers/mikroc/pro/pic/ * NOTES: (*) Be VERY careful about the configuration flags for the 18F4550 - there's so much place for mistake! - Place jumpers J12 in the right position */ /******************************************************** ********************************************************/ #define BUFFER_SIZE 64 /*ALSO EDIT THIS PART OF USBdsc.c : unsigned char const HID_INPUT_REPORT_BYTES = 64; (previously 1) unsigned char const HID_OUTPUT_REPORT_BYTES = 64; (previously 1) Data is now sent in blocks of 64 bytes, instead of just 1 !! ********************************************************* k *********************************************************/ unsigned char userWR_buffer[BUFFER_SIZE], userRD_buffer[BUFFER_SIZE]; void Init_Main(); //************************************************************************************************** // Main Program Routine //************************************************************************************************** void main() { unsigned char i; Init_Main(); /*Enable the USB HID Module*/ LATB0_bit = 1; HID_Enable(&userRD_buffer, &userWR_buffer); Delay_ms(1000); Delay_ms(1000); LATB0_bit = 0; while (1) { //Connect a LED to RB1 to LATB1_bit = ~LATB1_bit; //show something is going on /*HID_Read() Returns a value not zero when there's data to be read! */ if (HID_Read()) { //Clear the Write buffer to be sure no data from //previous actions is still there. for (i = 0; i < BUFFER_SIZE ; i++) { userWR_buffer[i] = 0; } /* This part Toggles a LED connected to pin RB0 if the proper command is received from PC. The command is defined by the first byte. */ if (userRD_buffer[0] == 0x32) { LATB0_bit = !LATB0_bit; } /*This part sends back the status of RB0 if the proper command is received from PC. Again, command defined by first byte. Although only one byte contains valid data, all 64 bytes are sent. Application on Host must use correct location of data. */ if (userRD_buffer[0] == 0x81) { UserWR_buffer[1] = LATB0_bit; while (!HID_Write(&userWR_buffer, BUFFER_SIZE)); } /*This part reads a 32-byte wide array, reverses it and sends it back to host. The first byte contains the command from PC, byte 2 to 33 contain data. */ if (userRD_buffer[0] == 0x53) { for (i = 1 ; i < 33 ; i++ ) { userWR_buffer[i] = userRD_buffer[33 - i]; } while (!HID_Write(&userWR_buffer, BUFFER_SIZE)); } } } HID_Disable(); } //************************************************************************************************** // Main Interrupt Routine //************************************************************************************************** void interrupt() { HID_InterruptProc(); } //************************************************************************************************** //************************************************************************************************** // Initialization Routine //************************************************************************************************** void Init_Main() { //-------------------------------------- // Disable all interrupts //-------------------------------------- INTCON = 0; // Disable GIE, PEIE, TMR0IE,INT0IE,RBIE INTCON2 = 0xF5; INTCON3 = 0xC0; RCON.IPEN = 0; // Disable Priority Levels on interrupts PIE1 = 0; PIE2 = 0; PIR1 = 0; PIR2 = 0; ADCON1 |= 0x0F; // Configure all ports with analog function as digital CMCON |= 7; // Disable comparators //-------------------------------------- // Ports Configuration //-------------------------------------- TRISA = 0xFF; TRISB = 0x00; TRISC = 0xFF; TRISD = 0; TRISE = 0x07; LATA = 0; LATB = 0; LATC = 0; LATD = 0; LATE = 0; //-------------------------------------- // Visual Confirmation PIC Is Stable //-------------------------------------- LATB0_bit = 1; Delay_ms(500); LATB0_bit = 0; Delay_ms(500); LATB0_bit = 1; Delay_ms(500); LATB0_bit = 0; Delay_ms(500); } //************************************************************************************************** //***********************************************o***************************************************