/* X310Demo.c: Demo program for X310 Compiler: BC++ 3.1 Turbo C ++ 1.01(3.01) Compile mode: large Project: X310Demo.c ..\..\lib\7188el.lib ..\..\lib\XBoard\X310.lib Hardware: 7188EX + X310 [May/21/2002] by Kevin [May/20/2005] by Liam [05/July/2005] by Liam [Dec 23, 2010] by Nicholas [Dec 14, 2011] by Nicholas [March,16,2012] by Nicholas */ /************************************************************************/ /* X310: 2 channel 12-Bit A/D (Analog input) */ /* ch0: 0~20mA */ /* ch1: 0~10V */ /* 2 channel 12-Bit D/A (Analog output)0.0~10.0V */ /* 3 channel D/I */ /* 3 channel D/O */ /************************************************************************/ /************************************************************************/ /* [Software specific] */ /* Input/Output range: 0mA 20mA +0.0V +10.0V */ /* Decimal integer: 0 4095 0 4095 */ /* Hexadecimal: 000 FFF 000 FFF */ /* */ /* [A/D] */ /* sampling rate: 1800 data/sec (with floating convertion) */ /* Accuracy==> Typical: +- 1 LSB (+/- 2.4 mV) (+/- 4.9 uA) */ /* Maximum: +- 2 LSB (+/- 4.8 mV) (+/- 9.8 uA) */ /* [D/A] */ /* thoughput: 1300 data/sec (with floating convertion) */ /* Accuracy==> Typical: +- 1 LSB (+/- 2.4 mV) */ /* Maximum: +- 2 LSB (+/- 4.8 mV) */ /* [D/O] */ /* throughput: can generates 2KHz square wave signals. */ /************************************************************************/ /************************************************************************/ /* [Caution] */ /* The block 7 first 16 bytes of EEPROM on X board is used to */ /* store A/D & D/A calibration settings. When you use the */ /* EEPROM on X board, don't overwrite it. */ /************************************************************************/ #include #include "..\..\lib\7188e.h" #include "..\..\lib\XBoard\X310.h" void UserTimerFunction(void); void main(void) { int iRet, iAction, j, quit, iFlag; int iValue, iInChannel, iDIValue, iOutChannel, iDOValue, iStatus; float fValue; InitLib(); X310_Init(); X310_SetDelay(5); //Set reading exchanged A/D channel delay time 0.05ms iFlag=0; Puts("\n\rDemo program for 7188EX + X310\n\r"); while(iAction!=12) { iAction=0; quit=0; Puts("\n\r"); Puts("1) Reads setting from EEPROM\n\r"); Puts("2) A/D (Analog input)\n\r"); Puts("3) A/D (Analog input) read 32767 times\n\r"); Puts("4) D/A (Analog output)\n\r"); Puts("5) Read DI (all channels)\n\r"); Puts("6) Read DI (one channel)\n\r"); Puts("7) Write DO (all channels)\n\r"); Puts("8) Write DO (one channel)\n\r"); Puts("9) DO Readback (all channels)\n\r"); Puts("10) DO Readback (one channel)\n\r"); Puts("11) Start User's Timer Function to read A/D ch0, the interval is 2 sec\n\r"); Puts("\n\r"); Puts("12) Quits demo program\n\r\n\r"); Puts("Choose an option and press [Enter]:"); Scanf("%d", &iAction); Puts("\n\r"); switch(iAction) { // Reads settings from EEPROM(on X board) case 1: iValue=X310_Init(); if((iValue&0x1)==0) Print("EEPROM A/D Gain (Ch0) ==> [%+8.6f]\n\r",X310_fAD_Gain[0]); else Print("No setting in EEPROM, A/D Gain (Ch0) ==> %+8.6f\n\r",X310_fAD_Gain[0]); if((iValue&0x2)==0) Print("EEPROM A/D Offset (Ch0) ==> [%+8.6f]\n\r",X310_fAD_Offset[0]); else Print("No setting in EEPROM, A/D Offset (Ch0) ==> %+8.6f\n\r",X310_fAD_Offset[0]); if((iValue&0x10)==0) Print("EEPROM A/D Gain (Ch1) ==> [%+8.6f]\n\r",X310_fAD_Gain[1]); else Print("No setting in EEPROM, A/D Gain (Ch0) ==> %+8.6f\n\r",X310_fAD_Gain[1]); if((iValue&0x20)==0) Print("EEPROM A/D Offset (Ch1) ==> [%+8.6f]\n\r",X310_fAD_Offset[1]); else Print("No setting in EEPROM, A/D Offset (Ch0) ==> %+8.6f\n\r",X310_fAD_Offset[1]); Puts("\n\r"); if((iValue&0x4)==0) Print("EEPROM D/A Gain (Ch0) ==> [%+8.6f]\n\r",X310_fAD_Gain[0]); else Print("No setting in EEPROM, D/A Gain (Ch0) ==> %+8.6f\n\r",X310_fDA_Gain[0]); if((iValue&0x8)==0) Print("EEPROM D/A Offset (Ch0) ==> [%+8.6f]\n\r",X310_fDA_Offset[0]); else Print("No setting in EEPROM, D/A Offset (Ch0) ==> %+8.6f\n\r",X310_fDA_Offset[0]); if((iValue&0x40)==0) Print("EEPROM D/A Gain (Ch1) ==> [%+8.6f]\n\r",X310_fAD_Gain[0]); else Print("No setting in EEPROM, D/A Gain (Ch0) ==> %+8.6f\n\r",X310_fDA_Gain[1]); if((iValue&0x80)==0) Print("EEPROM D/A Offset (Ch1) ==> [%+8.6f]\n\r",X310_fDA_Offset[1]); else Print("No setting in EEPROM, D/A Offset (Ch0) ==> %+8.6f\n\r",X310_fDA_Offset[1]); Puts("\n\r"); break; // A/D (Analog input) case 2: Puts("Channel (0 ~ 1): "); Scanf("%d", &iInChannel); if(iInChannel>1) { Puts("Unknow Channel Number!!\r\n\r\n"); break; } fValue=X310_AnalogIn(iInChannel); if(iInChannel==0) Print("AI[%d]= %6.4f mA\n\r", iInChannel, fValue); else Print("AI[%d]= %6.4f V\n\r", iInChannel, fValue); break; // A/D (Analog input) reads 32767 times case 3: Puts("Please select A/D channel(0~1): "); Scanf("%d",&iInChannel); if(iInChannel>1) { Puts("Unknow Channel Number!!\r\n\r\n"); break; } fValue=X310_AnalogInHexToFloat(X310_AnalogIn_no(iInChannel,32767),iInChannel); if(iInChannel==0) Print("AI[%d]= %6.4f mA\n\r", iInChannel, fValue); else Print("AI[%d]= %6.4f V\n\r", iInChannel, fValue); break; // D/A (Analog output) case 4: Puts("Channel (0 ~ 1): "); Scanf("%d", &iOutChannel); Puts("Voltage (0.0 ~ +10.0): "); Scanf("%f", &fValue); X310_AnalogOut(iOutChannel, fValue); Print("AO[%d] %5.3fV OK.\n\r", iOutChannel, fValue); break; // Read DI (all channels) case 5: iDIValue=X310_Read_All_DI(); Print("Input value=> 0x%02x\r\n\r\n", iDIValue); break; // Read DI (one channel) case 6: Print("Please select inport channel(0~2): "); Scanf("%d", &iInChannel); if(iInChannel>2) { Puts("Unknow Channel Number!!\r\n\r\n"); break; } iDIValue=X310_Read_One_DI(iInChannel); if(iDIValue) Print("Channel %d ==> OFF\r\n\r\n", iInChannel); else Print("Channel %d ==> ON\r\n\r\n", iInChannel); break; // Write DO (all channels) case 7: Print("Please input Output value(0 ~ 0x07): "); Scanf("%x", &iDOValue); X310_Write_All_DO(iDOValue); Print("Output value=> 0x%02x\r\n\r\n", iDOValue); break; // Write DO (one channel) case 8: Print("Please select outport channel(0~2) and status(0:OFF, 1:ON)\n\r"); Print("Channel number and status:"); Scanf("%d %d", &iOutChannel, &iStatus); if(iOutChannel>2) { Puts("Unknow Channel Number!!\r\n\r\n"); break; } X310_Write_One_DO(iOutChannel, iStatus); Print("Channel %d ==> %s\r\n\r\n", iOutChannel, (iStatus>=1)?"ON":"OFF"); break; // Read DO (all channels) case 9: iDOValue=X310_Read_All_DO(); Print("Digital Output ReadBack=> 0x%02x\r\n\r\n", iDOValue); break; // Read DO (one channels) case 10: Print("Please select outport channel(0~2): "); Scanf("%d", &iOutChannel); if(iOutChannel>2) { Puts("Unknow Channel Number!!\r\n\r\n"); break; } iRet=X310_Read_One_DO(iOutChannel); if(iRet) Print("Channel %d ==> ON\r\n\r\n", iOutChannel); else Print("Channel %d ==> OFF\r\n\r\n", iOutChannel); break; //Start User's Timer Function, the interval is 2 sec case 11: if(iFlag==0) { iFlag=1; InstallUserTimerFunction_ms(2000,UserTimerFunction); } break; case 12: if(iFlag==1) { StopUserTimerFun(); } default: quit=1; break; } if(!quit) { Puts("Press any key to continue...\n\r"); Getch(); } } } void UserTimerFunction(void) { int iInChannel=0; float fValue; fValue=X310_AnalogIn(iInChannel); Print("AI[%d]= %6.4fmA\n\r\n\r", iInChannel, fValue); }