#ifndef MAIN_C #define MAIN_C /** INCLUDES *******************************************************/ #if defined(__PIC24F__) #include #endif #if defined(__18F14K50) #include #endif #include "./USB/usb.h" #include "HardwareProfile.h" #include "./USB/usb_function_hid.h" /** CONFIGURATION **************************************************/ #if defined(__PIC24FJ64GB002__) _CONFIG1(WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GCP_OFF & JTAGEN_OFF) _CONFIG2(IESO_ON & PLLDIV_DIV2 & PLL96MHZ_ON & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_ON & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) _CONFIG3(WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM) _CONFIG4(DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC & RTCOSC_SOSC & DSBOREN_OFF & DSWDTEN_OFF) #endif #if defined(__18F14K50) #pragma config CPUDIV = NOCLKDIV ,USBDIV = OFF, FOSC = HS #pragma config PLLEN = OFF, PCLKEN = ON, HFOFST = OFF, DEBUG = OFF #pragma config PWRTEN = ON, BOREN = OFF, BORV = 30, MCLRE = ON #pragma config FCMEN = OFF, IESO = OFF, WDTEN = OFF, WDTPS = 1, LVP = OFF #pragma config XINST = OFF, STVREN = ON, BBSIZ = OFF #pragma config CP0 = OFF, CP1 = OFF, CPB = OFF, CPD = OFF #pragma config WRT0 = OFF, WRT1 = OFF, WRTC = OFF, WRTB = OFF, WRTD = OFF #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF #endif /** VARIABLES ******************************************************/ #pragma udata BYTE old_sw1,old_sw2; #if defined(__18F14K50) #pragma udata usbram2 #else #pragma udata #endif unsigned char ReceivedDataBuffer[64]; unsigned char ToSendDataBuffer[64]; #pragma udata USB_HANDLE USBOutHandle = 0; USB_HANDLE USBInHandle = 0; /** PRIVATE PROTOTYPES *********************************************/ void BlinkUSBStatus(void); BOOL Switch1IsPressed(void); BOOL Switch2IsPressed(void); static void InitializeSystem(void); void ProcessIO(void); void UserInit(void); void USBCBSendResume(void); /** VECTOR REMAPPING ***********************************************/ #pragma code #if defined(USB_INTERRUPT) #if defined(__18CXX) void YourHighPriorityISRCode(); void YourLowPriorityISRCode(); #define REMAPPED_RESET_VECTOR_ADDRESS 0x00 #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x08 #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x18 #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS void Remapped_High_ISR (void) { _asm goto YourHighPriorityISRCode _endasm } #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS void Remapped_Low_ISR (void) { _asm goto YourLowPriorityISRCode _endasm } #pragma code #pragma interrupt YourHighPriorityISRCode void YourHighPriorityISRCode() { USBDeviceTasks(); } #pragma interruptlow YourLowPriorityISRCode void YourLowPriorityISRCode() { } #endif #endif #if 0 void __attribute__((interrupt, auto_psv)) _T1Interrupt(void) { } #endif /** DECLARATIONS ***************************************************/ #pragma code /** DECLARATIONS ***************************************************/ #pragma code /******************************************************************** * Function: void main(void) *******************************************************************/ void main(void) { InitializeSystem(); USBDeviceInit(); //usb_device.c. Initializes USB module SFRs and firmware variables to known states. #if defined(USB_INTERRUPT) USBDeviceAttach(); #endif while(1) { #if defined(USB_POLLING) // Check bus status and service USB interrupts. USBDeviceTasks(); #endif // Application-specific tasks. // Application related code may be added here, or in the ProcessIO() function. ProcessIO(); } } /******************************************************************** * Function: static void InitializeSystem(void) *******************************************************************/ static void InitializeSystem(void) { char i; #if defined(__PIC24FJ64GB002__) unsigned int pll_startup_counter = 600; CLKDIV = 0x0000; // CPU:32MHz CLKDIVbits.PLLEN = 1; // 96MHz PLL On, while(pll_startup_counter--); RCONbits.SWDTEN = 0; //ウオッチドック OFF AD1PCFG = 0xFFFF; //AD OFF /* 入出力ポート設定 */ TRISA = 0x0000; //ポートAを全て出力 TRISB = 0x0003; //ボートBの0&1ビット目を入力、他は入力 #endif #if defined(__18F14K50) /* 入出力ポート設定 */ TRISA = 0x00; TRISB = 0x00; TRISC = 0xf0; ADCON0bits.ADON = 0; //AD OFF #endif //Initialize all of the push buttons mInitAllSwitches(); old_sw1 = sw1; old_sw2 = sw2; //initialize the variable holding the handle for the last transmission USBOutHandle = 0; USBInHandle = 0; /*USBの状態検出の指定*/ #if defined(USE_USB_BUS_SENSE_IO) tris_usb_bus_sense = INPUT_PIN; // See HardwareProfile.h #endif #if defined(USE_SELF_POWER_SENSE_IO) tris_self_power = INPUT_PIN; // See HardwareProfile.h #endif for( i = 0; i < 64; i++ ) { //送受信バッファのクリアー ReceivedDataBuffer[ i ] = 0x00; ToSendDataBuffer[ i ] = 0x00; } } /******************************************************************** * Function: void ProcessIO(void) *******************************************************************/ void ProcessIO(void) { // User Application USB tasks if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return; if ( USBOutHandle == 0 ) { USBOutHandle = HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64); //パケットの受信 } if( HIDRxHandleBusy( USBOutHandle ) == FALSE ) //受信中? TRUE:ビジー状態 FALSE:受信終了 { led01 = 1; //LED1 Off if( ReceivedDataBuffer[0] == 0x01 ) { led01 = 0; //LED1 On } led02 = 1; //LED2 Off if( ReceivedDataBuffer[1] == 0x01 ) { led02 = 0; //LED2 On } USBOutHandle = 0; } if ( USBInHandle == 0 ) { USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); //パケットの送信 } if( HIDTxHandleBusy( USBInHandle ) == FALSE ) //送信中? TRUE:ビジー状態 FALSE:送信終了 { ToSendDataBuffer[0] = 0; if ( sw1 == 0 ) //SW ON? 0:On 1:Off { ToSendDataBuffer[0] = 0x01; } ToSendDataBuffer[1] = 0; if ( sw2 == 0 ) //SW ON? 0:On 1:Off { ToSendDataBuffer[1] = 0x01; } ToSendDataBuffer[2] = ToSendDataBuffer[2] + 1; USBInHandle = 0; } } /****************************************************************************** * Function: BOOL Switch1IsPressed(void) *****************************************************************************/ BOOL Switch1IsPressed(void) { if(sw1 != old_sw1) { old_sw1 = sw1; // Save new value if(sw1 == 0) // If pressed return TRUE; // Was pressed } return FALSE; // Was not pressed } /****************************************************************************** * Function: BOOL Switch2IsPressed(void) *****************************************************************************/ BOOL Switch2IsPressed(void) { if(sw2 != old_sw2) { old_sw2 = sw2; // Save new value if(sw2 == 0) // If pressed return TRUE; // Was pressed } return FALSE; // Was not pressed }