/** 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チャンネル選択 unsigned char kx0,kx1,kx2; unsigned char ky0,ky1,ky2; /** 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; 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); SSPtrans(0x06); ////ads1220初期化 Delay10TCYx(40); // 18:ng 19:ok SSPtrans(0x43); // レジスタ書き込み00h-03h SSPtrans(0b10000001); // AIN0-GND GAIN:1 PGA:off SSPtrans(0b10000000); // 330sps nomalmode single temp:off burn:off SSPtrans(0b11000000); // ref:AVDD SSPtrans(0b00000010); // DOUT/DRDY Delay10KTCYx(10); } void ProcessIO(void) { BYTE numBytesRead; char rch,byte_data[3]; if(USBUSARTIsTxTrfReady()) { BYTE i,j,l; long k; unsigned char data,g; j=0; numBytesRead = getsUSBUSART(USB_Out_Buffer,64); if(numBytesRead != 0) { for(i=0;i0){ putUSBUSART(USB_In_Buffer,j); } } case 'S': case 's': goflag=0;//停止 break; case 'C': case 'c': //開始 SSPtrans(0x40); // レジスタ書き込み00h SSPtrans(0b10000001); // AIN0-GND GAIN:1 PGA:off SSPtrans(0x08); //start adcsel=0; goflag=1; break; default: break; } } } if(goflag==1){ if (AD_RDY==0) { // 変換終了? rch = SSPtrans(0x10); // Data Read Command rch = SSPtrans(0xff); // NOP:ffh byte_data[2] = rch; rch = SSPtrans(0xff); byte_data[1] = rch; rch = SSPtrans(0xff); byte_data[0] = rch; g=byte_data[2]; if(g>0x7f){ g-=0x80; }else{ g+=0x80; } switch(adcsel) { case 0: kx2=g; kx1=byte_data[1]; kx0=byte_data[0]; SSPtrans(0x40); // レジスタ書き込み00h SSPtrans(0b10010001); // AIN1-GND GAIN:1 PGA:off SSPtrans(0x08); //start adcsel=1; break; case 1: ky2=g; ky1=byte_data[1]; ky0=byte_data[0]; SSPtrans(0x40); // レジスタ書き込み00h SSPtrans(0b10100001); // AIN2-GND GAIN:1 PGA:off SSPtrans(0x08); //start adcsel=2; break; case 2: toHEX(kx2, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(kx1, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(kx0, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; USB_In_Buffer[j++] = '0'; USB_In_Buffer[j++] = 0xd; USB_In_Buffer[j++] = 0xa; toHEX(ky2, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(ky1, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(ky0, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; USB_In_Buffer[j++] = '1'; USB_In_Buffer[j++] = 0xd; USB_In_Buffer[j++] = 0xa; 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]; USB_In_Buffer[j++] = '2'; USB_In_Buffer[j++] = 0xd; USB_In_Buffer[j++] = 0xa; SSPtrans(0x40); // レジスタ書き込み00h SSPtrans(0b10000001); // AIN0-GND GAIN:1 PGA:off SSPtrans(0x08); //start adcsel=0; break; } } 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 *************************************************/