/* 87024.c :This demo program is for 87024 Analog Output Module in Com0. It can communicate with CM0 via DMA. If without DMA, it may caused communication lost data in send/receive long data. User needs to know: 1. The communication protocol for COM0 is always 115200,N,8,1 and Checksum disable. User can't modify it. 2. User need to know the module's location on Slot (Slot 0 ~ 7). Step on this Demo: Step 1: Open COM Port Step 2: Read configuration ($AA2) Step 3: Write configuration ($AANNTTCCFF) Step 4: Write Analog Output value #AAN(data) Step 5: Close COM Port Compiler: BC++ 3.1, Turbo C ++ 1.01(3.01) MSC 6.0, MSVC 1.52. Compile mode: large Project: 87024.c ..\Lib\(8000.Lib, 8000E.lib) Hardware: 8000 [21 Jan,2014] by Hans */ #include #include #include"..\..\lib\8000E.h" int Read87024_Config(int iSlot,int *iRangeCode_Original,int *iSlewRate_Original); int Write87K_87024AO(int iSlot,int iChannel,float fValue); int Set87024_Config(int iSlot,int iChannel,int iRangeCode); void OpenCom0(void); void CloseCom0(void); char *_Demo_Date=__DATE__; void main() { int iRet,iSlot,iChannel; int iRangeCode,iRangeCode_Original; int iSlewRate,iSlewRate_Original; unsigned char cTemp[10]; int quit=0; float fValue; InitLib(); Print("/*******************/\n\r"); Print("/* 87024 demo */\n\r"); Print("/* */\n\r"); Print("/* [%s] */\n\r",_Demo_Date); Print("/*******************/\n\r"); Print("\n\r"); //Step 1. Open COM Port OpenCom0(); Print("Please Input Slot Number(0 to 7) ="); LineInput(cTemp,10); sscanf(cTemp,"%d",&iSlot); iRangeCode=0x32; // 0 to +10V //For detailed specifications, refer to //CD:Napdos\DCON\IO_Module\hw_dcon_on_87kUnit iSlewRate=0x0; //Immediate output //Step 2: Read configuration ($AA2) //To prevent reading EEPROM again. iRet=Read87024_Config(iSlot,&iRangeCode_Original,&iSlewRate_Original); if(iRet==NoError) { if((iRangeCode_Original==iRangeCode) && (iSlewRate_Original==iSlewRate)) { //The present configuration is the same as the input configuration. //So there is no need to write into the EEPROM. } else { //Step 3: Write configuration ($AANNTTCCFF) Set87024_Config(iSlot,iRangeCode,iSlewRate); } } else Print("Read Configuration Error"); for(;;) { Print("Please Input Channel Number(0~3) = "); LineInput(cTemp,10); sscanf(cTemp,"%d",&iChannel); Print("Please Input Value(float) = "); LineInput(cTemp,10); sscanf(cTemp,"%f",&fValue); //Step 4: Write Analog Output value, #AAN(data) iRet=Write87K_87024AO(iSlot,iChannel,fValue); if(iRet==NoError) { Print("Output success!!\n\r"); } else { Print("AO receive response error. Error Code = %d\n\r",iRet); } Print("Please input 1 to exit program or the other keys to I/O again:"); LineInput(cTemp,10); sscanf(cTemp,"%d",&quit); //Step 5: Close COM Port if (quit==1) { CloseCom0(); return; } } } // To open COM0 with DMA void OpenCom0(void) { InstallCom_0(115200L, 8, 0,1); //open COM 0, baudrate 115200,N,8,1 OpenCom0UseDMA(); //Open COM 0 with DMA } // To close COM0 with DMA void CloseCom0(void) { CloseCom0UseDMA(); } // Send command to 87k module int SendCmdTo87K(unsigned char *cCmd) { ToComStr_0(cCmd); //Send command string ToCom_0(0x0d); //Send the terminal char 0x0D return NoError; } //------------------------------------------------------------------------------ unsigned char _87K_Response[256]; //------------------------------------------------------------------------------ // Blocked mode to receive data from 87k module int ReceiveResponseFrom87K(unsigned char *cCmd, long lTimeout) { unsigned char c,data; long t; int newcnt,cnt=0; Com0SetInputBuf(_87K_Response,256); //Set a Buffer for receiving data from COM 0 t=GetTimeTicks(); while(1){ newcnt=Com0GetDataSize(); // Get Data size from COM 0 if(newcnt != cnt){ if(_87K_Response[newcnt-1]=='\r'){ //if get the terminal char 0x0D newcnt--; _87K_Response[newcnt]=0; // Add zero data to the end. strcpy(cCmd,_87K_Response); break; } cnt=newcnt; } else { // timeout if time for geteting data is more than lTimeout if(GetTimeTicks()-t > lTimeout) return TimeOut; } } return NoError; } //===================================================================== //====== The following functions are used to read 87024 module. === //====== You can copy the following functions to your own program. === //===================================================================== int Read87024_Config(int iSlot,int *iRangeCode_Original,int *iSlewRate_Original) { /* DCON protocol to read 87024 Configuration Command: $AA2 Response: !AATTCCFF Slot: 0 ~ 7 RangeCode: For detailed specifications, refer to CD:8000\Napdos\DCON\IO_Module\hw_dcon_on_87kUnit CD:8000\Napdos\7000\Manual SlewRate: For detailed specifications, refer to CD:8000\Napdos\DCON\IO_Module\hw_dcon_on_87kUnit CD:8000\Napdos\7000\Manual */ unsigned char InBufCom0[20]; int iRet; ChangeToSlot(iSlot);//Change to specified slot iRet=SendCmdTo87K("$002"); iRet=ReceiveResponseFrom87K(InBufCom0,100); if(iRet==NoError) { if(InBufCom0[0]== '!') //Valid response first character: ! { *iRangeCode_Original=((ascii_to_hex(InBufCom0[3])<<4)&0xF0) +(ascii_to_hex(InBufCom0[4])&0xF); *iSlewRate_Original=((ascii_to_hex(InBufCom0[7]))&0x3) +((ascii_to_hex(InBufCom0[8]))&0xC); return NoError; } else return -1;//Outpur string error. } else return iRet; } int Set87024_Config(int iSlot,int iRangeCode,int iSlewRate) { /* DCON protocol to write the 87024 Configuration Command: %AANNTTCCFF Response: !AA Slot: 0 ~ 7 RangeCode: For detailed specifications, refer to CD:8000\Napdos\DCON\IO_Module\hw_dcon_on_87kUnit CD:8000\Napdos\7000\Manual SlewRate: For detailed specifications, refer to CD:8000\Napdos\DCON\IO_Module\hw_dcon_on_87kUnit CD:8000\Napdos\7000\Manual */ unsigned char InBufCom0[20],OutBufCom0[20],Slew[10]; int SlewRate_low,SlewRate_high,SlewRate; int iRet,iHex; OutBufCom0[0]=0x25; //0x25 = % //FF =2Bit+Slew rate+Checksum SlewRate_low=(iSlewRate << 2)&0x0F; SlewRate_high=iSlewRate >> 2; sprintf(Slew,"%01X%01X",SlewRate_high,SlewRate_low); sscanf(Slew,"%02X",&iHex); SlewRate=iHex & 0x3C; ChangeToSlot(iSlot);//Change to specified slot sprintf(OutBufCom0+1,"0001%02X0A%02X",iRangeCode,SlewRate); iRet=SendCmdTo87K(OutBufCom0); iRet=ReceiveResponseFrom87K(InBufCom0,100); if(iRet==NoError) { if(InBufCom0[0]== '!') //Valid response first character: ! { return NoError; } else return -1;//Response string error. } else return iRet; } int Write87K_87024AO(int iSlot,int iChannel,float fValue) { /* DCON protocol to write the 87024 value Command: #AAN(data) Response: > Slot: 0 ~ 7 Channel: 0 ~ 1 */ int iRet; unsigned char OutBufCom0[20],InBufCom0[20]; OutBufCom0[0]=0x23;//0x23 = # sprintf(OutBufCom0+1,"00%01d%+06.3f",iChannel,fValue); ChangeToSlot(iSlot);//Change to specified slot iRet=SendCmdTo87K(OutBufCom0); iRet=ReceiveResponseFrom87K(InBufCom0,100); if(iRet==NoError) { if(InBufCom0[0] =='>') //Valid response first character: > { return NoError; } else return -1; //Response string error. } else return iRet; }