/** 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 #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 chipadrs; unsigned int ReadEE(char chip, int adrs); void WriteEE(char chip, int adrs, unsigned int data); void toHEX(unsigned char data, char *buffer); void DataTrans(unsigned char data); /** 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) { ANSEL=0x00; ANSELH=0x00; ADCON0=0x00; ADCON1=0x00; TRISB=0x50; TRISC=0x40; /* SSPの初期設定I2Cモード */ OpenI2C(MASTER, SLEW_ON); //マスターモードに設定 SSPADD = 24; //400kbpsに設定 chipadrs =0b10010000; } void ProcessIO(void) { BYTE numBytesRead; char rch,byte_data[3]; if(USBUSARTIsTxTrfReady()) { BYTE i,j; unsigned int k; unsigned char data,g; j=0; numBytesRead = getsUSBUSART(USB_Out_Buffer,64); if(numBytesRead != 0) { for(i=0;i>12; if(k==15){adcsel=0;} if(k==14){adcsel=1;} if(k==13){adcsel=2;} k = ReadEE(chipadrs, 0x00) - 0x8000; toHEX(k >> 8, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; toHEX(k & 0xff, Buffer); USB_In_Buffer[j++] = Buffer[0]; USB_In_Buffer[j++] = Buffer[1]; USB_In_Buffer[j++] = '0'; USB_In_Buffer[j++] = '0'; switch(adcsel) { case 0: WriteEE(chipadrs, 0x01, 0b1110001111000011); USB_In_Buffer[j++] = '0'; adcsel=1; break; case 1: WriteEE(chipadrs, 0x01, 0b1101001111000011); USB_In_Buffer[j++] = '1'; adcsel=2; break; case 2: WriteEE(chipadrs, 0x01, 0b1111001111000011); USB_In_Buffer[j++] = '2'; 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; } //adc読み出し関数 unsigned int ReadEE(char chip, int adrs){ unsigned int data; StartI2C(); //スタート条件出力 while(SSPCON2bits.SEN); //出力完了待ち DataTrans(chip); //チップアドレスと制御データ出力 DataTrans(adrs & 0xFF); //下位アドレス出力 RestartI2C(); //リスタート条件出力 while(SSPCON2bits.RSEN); //出力完了待ち DataTrans(chip | 0x01); //チップアドレスと制御データ出力 while(DataRdyI2C()); //データ入力待ち data = ReadI2C(); //データ読み込み SSPCON2bits.ACKDT = 0; //ACK出力準備 SSPCON2bits.ACKEN = 1; //ACK出力 while(SSPCON2bits.ACKEN); //出力完了待ち while(DataRdyI2C()); //データ入力待ち data = data<<8; data |= ReadI2C(); //データ読み込み SSPCON2bits.ACKDT = 1; //NACK出力準備 SSPCON2bits.ACKEN = 1; //NACK出力 while(SSPCON2bits.ACKEN); //出力完了待ち StopI2C(); //ストップ条件出力 while(SSPCON2bits.PEN); //出力完了待ち return(data); //データを戻り値にする } //adc書き込み関数 void WriteEE(char chip, int adrs, unsigned int data){ StartI2C(); //スタート条件出力 while(SSPCON2bits.SEN); //出力完了待ち DataTrans(chipadrs); //チップアドレスと制御データ出力 DataTrans(adrs & 0xFF); //下位アドレス出力 DataTrans(data >> 8 ); //書き込みデータ出力 DataTrans(data & 0xFF); //書き込みデータ出力 StopI2C(); //ストップ条件出力 while(SSPCON2bits.PEN); //出力完了待ち } //I2Cデータ出力共通関数 void DataTrans(unsigned char data){ WriteI2C(data); //データ出力実行 IdleI2C(); //バスアイドル待ち } ////以下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 *************************************************/