/** INCLUDES *******************************************************/ #include "./USB/usb.h" #include "./USB/usb_function_cdc.h" #include "HardwareProfile.h" /** CONFIGURATION **************************************************/ #pragma config CPUDIV = NOCLKDIV #pragma config USBDIV = OFF #pragma config FOSC = HS #pragma config PLLEN = ON #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRTEN = OFF #pragma config BOREN = ON #pragma config BORV = 30 #pragma config WDTEN = OFF #pragma config WDTPS = 32768 #pragma config MCLRE = OFF #pragma config HFOFST = OFF #pragma config STVREN = ON #pragma config LVP = OFF #pragma config XINST = OFF #pragma config BBSIZ = OFF #pragma config CP0 = OFF #pragma config CP1 = OFF #pragma config CPB = OFF #pragma config WRT0 = OFF #pragma config WRT1 = OFF #pragma config WRTB = OFF #pragma config WRTC = OFF #pragma config EBTR0 = OFF #pragma config EBTR1 = OFF #pragma config EBTRB = OFF /** I N C L U D E S **********************************************************/ #include "GenericTypeDefs.h" #include "Compiler.h" #include "usb_config.h" #include "USB/usb_device.h" #include "USB/usb.h" #include "HardwareProfile.h" #include #include /** V A R I A B L E S ********************************************************/ #if defined(__18CXX) #pragma udata #endif char USB_In_Buffer[64]; char USB_Out_Buffer[64]; char Buffer[5] = {0,0,0,0,0}; char goflag=0;//開始フラグ char adcsel=0;//adcチャンネル選択 /** P R I V A T E P R O T O T Y P E S ***************************************/ static void InitializeSystem(void); void ProcessIO(void); void USBDeviceTasks(void); void YourHighPriorityISRCode(); void YourLowPriorityISRCode(); void USBCBSendResume(void); void UserInit(void); char SSPtrans(char sch); void toHEX(unsigned char data, char *buffer); /** VECTOR REMAPPING ***********************************************/ #if defined(__18CXX) #define REMAPPED_RESET_VECTOR_ADDRESS 0x1000 #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1008 #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1018 #define APP_VERSION_ADDRESS 0x1016 #define APP_SIGNATURE_ADDRESS 0x1006 #define APP_FIRMWARE_VERSION_MAJOR 1 #define APP_FIRMWARE_VERSION_MINOR 0 #pragma romdata AppVersionAndSignatureSection = APP_VERSION_ADDRESS ROM unsigned char AppVersion[2] = {APP_FIRMWARE_VERSION_MINOR, APP_FIRMWARE_VERSION_MAJOR}; #pragma romdata AppSignatureSection = APP_SIGNATURE_ADDRESS ROM unsigned short int SignaturePlaceholder = 0xFFFF; #pragma code HIGH_INTERRUPT_VECTOR = 0x08 void High_ISR (void) { _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm } #pragma code LOW_INTERRUPT_VECTOR = 0x18 void Low_ISR (void) { _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm } extern void _startup (void); // See c018i.c in your C18 compiler dir #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS void _reset (void) { _asm goto _startup _endasm } #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() { #if defined(USB_INTERRUPT) USBDeviceTasks(); #endif } #pragma interruptlow YourLowPriorityISRCode void YourLowPriorityISRCode(){} #endif /** DECLARATIONS ***************************************************/ #if defined(__18CXX) #pragma code #endif #if defined(__18CXX) void main(void) #else int main(void) #endif { InitializeSystem(); while(1) { #if defined(USB_INTERRUPT) if(USB_BUS_SENSE && (USBGetDeviceState() == DETACHED_STATE)) { USBDeviceAttach(); } #endif #if defined(USB_POLLING) USBDeviceTasks(); #endif ProcessIO(); } } static void InitializeSystem(void) { UserInit(); USBDeviceInit(); } void UserInit(void) { char rch; ANSEL=0x00; ANSELH=0x00; ADCON0=0x00; ADCON1=0x00; AD_RESET=1; TRISB=0x10; TRISC=0x00; // MSSP初期化(SPIモード) SSPSTAT = 0x01; // SMP:0,CKE:0,BF:full SSPCON1 = 0x22; // NonWC,SSPon,CKP:0,Fosc/64(KHz) Delay10KTCYx(100); AD_RESET=0; ////ads1247初期化 Nop(); // ディレイ AD_RESET=1; Delay10KTCYx(10); SSPtrans(0x42); // MUX1(02h)設定 SSPtrans(0x00); // データバイト数-1 // SSPtrans(0x30); // 設定内容 00110000b 内部リファレンス使用 SSPtrans(0x00); // 設定内容 00000000b 外部リファレンス使用 SSPtrans(0x4a); // IDAC0(0ah)設定 SSPtrans(0x00); // データバイト数-1 SSPtrans(0x08); // 設定内容 00001000b DRDY_mode:on SSPtrans(0x43); // SYS0(03h)設定 SSPtrans(0x00); // データバイト数-1 SSPtrans(0x06); // 設定内容 00000110b ゲイン:1 出力データレート:320sps } void ProcessIO(void) { BYTE numBytesRead; char rch,byte_data[3]; if(USBUSARTIsTxTrfReady()) { BYTE i,j; long k; unsigned char data,g; j=0; numBytesRead = getsUSBUSART(USB_Out_Buffer,64); if(numBytesRead != 0) { for(i=0;i0x7f){ g-=0x80; }else{ g+=0x80; } toHEX(g, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(byte_data[1], Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(byte_data[0], Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; switch(adcsel) { case 0: USB_In_Buffer[j++] = '2'; SSPtrans(0x40); // MUX0(00h)設定 SSPtrans(0x00); // データバイト数-1 SSPtrans(0x10); // 設定内容 00010000b 入力ピン:正AIN2-負AIN0 x軸 adcsel=1; break; case 1: USB_In_Buffer[j++] = '0'; SSPtrans(0x40); // MUX0(00h)設定 SSPtrans(0x00); // データバイト数-1 SSPtrans(0x18); // 設定内容 00011000b 入力ピン:正AIN3-負AIN0 y軸 adcsel=2; break; case 2: USB_In_Buffer[j++] = '1'; SSPtrans(0x40); // MUX0(00h)設定 SSPtrans(0x00); // データバイト数-1 SSPtrans(0x08); // 設定内容 00001000b 入力ピン:正AIN1-負AIN0 z軸 adcsel=0; break; } USB_In_Buffer[j++] = 0xd; USB_In_Buffer[j++] = 0xa; } if(j>0){ putUSBUSART(USB_In_Buffer,j); } } } CDCTxService(); } ////16進数変換 void toHEX(unsigned char data, char *buffer){ *buffer = '0' + ((char)(data >> 4) & 0x0F); if(((data >> 4) & 0x0F) > 9) *buffer += 7; buffer++; *buffer = '0' + ((char)(data) & 0x0F); if(((data) & 0x0F) > 9) *buffer += 7; } //// SPI送受信 // Entry sch : 送信文字 // Exit 受信文字 // 受信だけの時はダミー文字を送信 char SSPtrans(char sch) { char rch; SSPBUF = sch; // データ書き込み while(SSPSTATbits.BF==0); // 送信完了待ち rch = SSPBUF; // データ読み出し PIR1bits.SSPIF = 0; // SSPIF clear return(rch); } ////以下usb関係 void USBCBSuspend(void){} void USBCBWakeFromSuspend(void){} void USBCB_SOF_Handler(void){} void USBCBErrorHandler(void){} void USBCBCheckOtherReq(void) { USBCheckCDCRequest(); } void USBCBStdSetDscHandler(void){} void USBCBInitEP(void) { CDCInitEP(); } void USBCBSendResume(void) { static WORD delay_count; if(USBGetRemoteWakeupStatus() == TRUE) { if(USBIsBusSuspended() == TRUE) { USBMaskInterrupts(); USBCBWakeFromSuspend(); USBSuspendControl = 0; USBBusIsSuspended = FALSE; delay_count = 3600U; do { delay_count--; }while(delay_count); USBResumeControl = 1; delay_count = 1800U; do { delay_count--; }while(delay_count); USBResumeControl = 0; USBUnmaskInterrupts(); } } } #if defined(ENABLE_EP0_DATA_RECEIVED_CALLBACK) void USBCBEP0DataReceived(void) { } #endif BOOL USER_USB_CALLBACK_EVENT_HANDLER(int event, void *pdata, WORD size) { switch( event ) { case EVENT_TRANSFER: break; case EVENT_SOF: USBCB_SOF_Handler(); break; case EVENT_SUSPEND: USBCBSuspend(); break; case EVENT_RESUME: USBCBWakeFromSuspend(); break; case EVENT_CONFIGURED: USBCBInitEP(); break; case EVENT_SET_DESCRIPTOR: USBCBStdSetDscHandler(); break; case EVENT_EP0_REQUEST: USBCBCheckOtherReq(); break; case EVENT_BUS_ERROR: USBCBErrorHandler(); break; case EVENT_TRANSFER_TERMINATED: break; default: break; } return TRUE; } /** EOF main.c *************************************************/