improve mode instruction, and change it & rt & vo volt anytime

This commit is contained in:
Roy
2021-07-09 16:10:33 +08:00
parent 0aea99cb2f
commit ca4a265b65
4 changed files with 225 additions and 62 deletions
@@ -47,6 +47,8 @@ static void iv_vscan(void)
Vset = Vset - iv->_Vstep * GPT.GptimerMultiple;
}
}
return;
}
static void iv_cy_vscan(void)
@@ -127,6 +129,8 @@ static void iv_cy_vscan(void)
PeriodicEvent = false;
}
}
return;
}
static void it_vscan(void)
@@ -140,6 +144,8 @@ static void it_vscan(void)
if(!vscanReset) {
Vset = it->_Vinit;
}
return;
}
static void rt_vscan(void)
@@ -153,6 +159,8 @@ static void rt_vscan(void)
if(!vscanReset) {
Vset = rt->_Vinit;
}
return;
}
static void vo_vscan(void)
@@ -166,6 +174,8 @@ static void vo_vscan(void)
if(!vscanReset) {
Vset = vo->_Vinit;
}
return;
}
#define DELTAVOLTMAX 2000000 //2000000 = 10mV
@@ -238,6 +248,8 @@ static void cc_vscan(void)
Vset = cc->_Vmax;
}
}
return;
}
static void cv_vscan(void)
@@ -246,7 +258,8 @@ static void cv_vscan(void)
static bool VminCounter;
static bool VmaxCounter;
NotifyCycleNumber = (instru.cycleNumber - cv->_cycleNumber + 1);
//NotifyCycleNumber = (instru.cycleNumber - cv->_cycleNumber + 1);
if (vscanReset) {
VmaxCounter = false;
@@ -342,6 +355,8 @@ static void cv_vscan(void)
}
}
}
return;
}
static void lsv_vscan(void)
@@ -384,6 +399,8 @@ static void lsv_vscan(void)
PeriodicEvent = false;
}
}
return;
}
static void ca_vscan(void)
@@ -397,12 +414,13 @@ static void ca_vscan(void)
if(!vscanReset){
Vset = ca->_Vinit;
}
return;
}
static void uni_pulse_vscan(uint32_t time)
{
uint32_t t = time;
struct wm_uni_pulse_ctx_t *p = (struct wm_uni_pulse_ctx_t *)wm_get();
uint32_t m;
@@ -453,6 +471,8 @@ static void uni_pulse_vscan(uint32_t time)
return;
}
return;
}
static void pulse_vscan(void)
@@ -563,8 +583,74 @@ static void pulse_vscan(void)
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
DAC_outputV(Usercode_Correction_to_DAC(VOUT_GAIN_240K, pulse->_sti_v));
}
return;
}
static void chg_vo_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
int32_t val = value;
struct wm_vo_ctx_t *vo = (struct wm_vo_ctx_t *)wm_get();
if (pa == DAC_VOLT) {
vo->_Vinit = val;
}
return;
}
static void chg_it_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
int32_t val = value;
struct wm_it_ctx_t *it = (struct wm_it_ctx_t *)wm_get();
if (pa == DAC_VOLT) {
it->_Vinit = val;
}
return;
}
static void chg_rt_para(uint16_t parameter, int32_t value)
{
uint16_t pa = parameter;
int32_t val = value;
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
if (pa == DAC_VOLT) {
rt->_Vinit = val;
}
return;
}
static void set_para(uint8_t eliteFxn, uint16_t parameter, int32_t value)
{
uint8_t mode = eliteFxn;
uint16_t pa = parameter;
int32_t val = value;
if (mode == CURVE_VO) {
chg_vo_para(pa, val);
return;
}
if (mode == CURVE_IT) {
chg_it_para(pa, val);
return;
}
if (mode == CURVE_RT) {
chg_rt_para(pa, val);
return;
}
return;
}
#endif
@@ -24,6 +24,7 @@ struct HEADSTAGE_INSTRUCTION {
int32_t Vinit;
int32_t Vmax;
int32_t Vmin;
uint32_t steptime;
/** ADC parameter **/
uint32_t sampleRate;
@@ -31,6 +32,7 @@ struct HEADSTAGE_INSTRUCTION {
uint8_t AutoGainEnable;
uint8_t VinAutoGainEnable;
uint8_t VoutAutoGainEnable;
bool hign_z_en;
uint8_t IinADCGainLv;
// voltage output gain
uint16_t VoutGainLevel;
@@ -141,6 +143,7 @@ static void InitEliteInstruction(){
instru.StepTime = STEPTIME_ONE_SEC;
instru.AdcChannel = 0; // RIS_ADC_IIN: 0x00, RIS_ADC_VIN: 0x01, RIS_DAC_VOUT: 0x02, RIS_HIGH_Z: 0x03
instru.gain_switch_on = 0b11110000; // cur auto gain switch, |lv0|lv1|lv2|lv3|none|none|none|none|
instru.hign_z_en = 1;
//pulse mode
instru.sti_t1 = 0;
@@ -26,20 +26,25 @@ enum all_mode_e {
CURVE_VO = 0x03, // Function Generator //0x30,
CURVE_RT = 0x04, // R-T Graph //0x40,
CURVE_VT = 0x05, // V-T Graph //0x50,
CURVE_IT = 0x0D, // I-T Graph //0x60,
CURVE_IT = 0x06, // I-T Graph //0x60,
CURVE_CC = 0x07, // Constant Current (CC) //0xD0,
CURVE_OCP = 0x08, // Open Circuit Potential (OCP)
CURVE_CV = 0x09, // Cyclic Voltammetry (CV) //0xC0,
CURVE_LSV = 0x0A, // Linear Sweep Voltammetry (LSV) //0x02,
CURVE_CA = 0x0B, // Chronoamperometric Graph (CA) //0x03,
CURVE_PULSE = 0x0C, //0x94,
CURVE_UNI_PULSE = 0x06, // universal pulse
CURVE_UNI_PULSE = 0x0D, // universal pulse
CURVE_CALI_ADC = 0xF1, // Cali ADC - test //0x92,
SET_SAMPLE_RATE = 0xE0, //0x70,
SET_ADC_DAC_GAIN = 0xE1, //0x80,
SET_PARA = 0xE2
};
enum set_para_e {
DAC_VOLT = 0x01,
};
// CIS (control instruction)
@@ -661,13 +661,16 @@ static void update_ZM_instruction(uint8 *ins) {
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.notifyRate = (uint32_t)(ins[9]);
instru.notifyRate = OldStep2NewStepTime(instru.notifyRate); //5000;10000;20000;
instru.steptime = (uint32_t)(ins[9]);
instru.steptime = OldStep2NewStepTime(instru.steptime); //5000;10000;20000;
instru.step = ((uint32_t)(ins[7]) << 8) | (uint32_t)(ins[8]);//1~1000 = 0.1mv ~ 100mv
instru.step = instru.step * 100000 / instru.notifyRate;
instru.step = instru.step * 100000 / instru.steptime;
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = 1;
instru.hign_z_en = ~(ins[11] & 0x0F);
instru.notifyRate = ((uint32_t)ins[12] << 8) | (uint32_t)ins[13];
instru.notifyRate = 10000 / instru.notifyRate * 10;
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
@@ -699,13 +702,16 @@ static void update_ZM_instruction(uint8 *ins) {
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.notifyRate = (uint32_t)(ins[9]);
instru.notifyRate = OldStep2NewStepTime(instru.notifyRate); //5000;10000;20000;
instru.steptime = (uint32_t)(ins[9]);
instru.steptime = OldStep2NewStepTime(instru.steptime); //5000;10000;20000;
instru.step = ((uint32_t)(ins[7]) << 8) | (uint32_t)(ins[8]);//1~1000 = 0.1mv ~ 100mv
instru.step = instru.step * 100000 / instru.notifyRate;
instru.step = instru.step * 100000 / instru.steptime;
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = ((uint16_t)(ins[10]) << 8) | (uint16_t)(ins[11]);
instru.hign_z_en = ~(ins[13] & 0x0F);
instru.notifyRate = ((uint32_t)ins[14] << 8) | (uint32_t)ins[15];
instru.notifyRate = 10000 / instru.notifyRate * 10;
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
@@ -732,6 +738,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.eliteFxn = CURVE_VO;
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
instru.hign_z_en = ~(ins[6] & 0x0F);
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
instru.VoutGainLevel = VOUT_GAIN_15K;
@@ -739,7 +746,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.VoutGainLevel = VOUT_GAIN_240K;
}
instru.notifyRate = ((uint32_t)ins[5] << 8) | (uint32_t)ins[6];
instru.notifyRate = ((uint32_t)ins[7] << 8) | (uint32_t)ins[8];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
@@ -755,10 +762,10 @@ static void update_ZM_instruction(uint8 *ins) {
// TODO: input to json
instru.AutoGainEnable = 1;
instru.IinADCGainLv = I_GAIN_100R;
IinADCGainCtrl(instru.IinADCGainLv);
// IinADCGainCtrl(instru.IinADCGainLv);
instru.VinAutoGainEnable = 1;
instru.VinADCGainLv = VIN_GAIN_1K;
VinADCGainCtrl(instru.VinADCGainLv);
// VinADCGainCtrl(instru.VinADCGainLv);
// end
ModeLED(WORKING);
@@ -767,13 +774,14 @@ static void update_ZM_instruction(uint8 *ins) {
case CURVE_RT: {
instru.eliteFxn = CURVE_RT;
instru.notifyRate = ((uint32_t)ins[3] << 8) | (uint32_t)ins[4];
instru.notifyRate = ((uint32_t)ins[7] << 8) | (uint32_t)ins[8];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
instru.VsetRate = 2;
// instru.Ve1 = 25000 + 5000; // Vout = 0.1 V at RT mode
instru.Ve1 = ((uint16_t)ins[5] << 8) | (uint16_t)ins[6];
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
instru.hign_z_en = ~(ins[6] & 0x0F);
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
@@ -787,10 +795,10 @@ static void update_ZM_instruction(uint8 *ins) {
// TODO: input to json
instru.AutoGainEnable = 1;
instru.IinADCGainLv = I_GAIN_100R;
IinADCGainCtrl(instru.IinADCGainLv);
// IinADCGainCtrl(instru.IinADCGainLv);
instru.VinAutoGainEnable = 1;
instru.VinADCGainLv = VIN_GAIN_1K;
VinADCGainCtrl(instru.VinADCGainLv);
// VinADCGainCtrl(instru.VinADCGainLv);
// end
if(instru.Ve1 < DAC_VOUT_GAIN_LARGE_BOUNDARY_USERCODE && instru.Ve1 > DAC_VOUT_GAIN_LARGE_BOUNDARY1_USERCODE){
@@ -806,9 +814,10 @@ static void update_ZM_instruction(uint8 *ins) {
case CURVE_VT: {
instru.eliteFxn = CURVE_VT;
instru.notifyRate = ((uint32_t)ins[3] << 8) | (uint32_t)ins[4];
instru.notifyRate = ((uint32_t)ins[5] << 8) | (uint32_t)ins[6];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
instru.hign_z_en = ~(ins[4] & 0x0F);
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
@@ -826,7 +835,7 @@ static void update_ZM_instruction(uint8 *ins) {
case CURVE_OCP: {
instru.eliteFxn = CURVE_OCP;
instru.notifyRate = ((uint32_t)ins[3] << 8) | (uint32_t)ins[4];
instru.notifyRate = ((uint32_t)ins[5] << 8) | (uint32_t)ins[6];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
@@ -846,11 +855,12 @@ static void update_ZM_instruction(uint8 *ins) {
case CURVE_IT: {
instru.eliteFxn = CURVE_IT;
instru.notifyRate = ((uint32_t)ins[3] << 8) | (uint32_t)ins[4];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.notifyRate = ((uint32_t)ins[7] << 8) | (uint32_t)ins[8];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
instru.Ve1 = ((uint16_t)ins[5] << 8) | (uint16_t)ins[6];
instru.Ve1 = ((uint16_t)ins[3] << 8) | (uint16_t)ins[4];
instru.Vinit = (int32_t)instru.Ve1;
instru.hign_z_en = ~(ins[6] & 0x0F);
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
@@ -873,16 +883,17 @@ static void update_ZM_instruction(uint8 *ins) {
}
case CURVE_CC: {
instru.eliteFxn = CURVE_CC;
instru.notifyRate = ((uint32_t)ins[12] << 8) | (uint32_t)ins[13];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
instru.charge = ins[3]; //0:discharge 1:charge
instru.eliteFxn = CURVE_CC;
instru.notifyRate = ((uint32_t)ins[14] << 8) | (uint32_t)ins[15];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.sampleRate = 15;
instru.charge = ins[3]; //0:discharge 1:charge
instru.constantCurrent = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
instru.Vmax = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.Vmin = (uint32_t)(ins[10]) << 8 | (uint32_t)(ins[11]);
instru.hign_z_en = ~(ins[13] & 0x0F);
instru.VoutGainLevel = VOUT_GAIN_240K;
instru.VoutGainLevel = VOUT_GAIN_240K;
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
@@ -904,7 +915,7 @@ static void update_ZM_instruction(uint8 *ins) {
}
case CURVE_CV: {
if (ins[3] == PARA_1) {
if (ins[3] == PARA_1) { //370209 01 61A8 6B6C 57E4 00002710 0016E360
instru.sampleRate = 15;
instru.Vinit = ((int32_t)(ins[4]) << 8) | (int32_t)(ins[5]);
instru.Ve1 = ((uint16_t)(ins[6]) << 8) | (uint16_t)(ins[7]);
@@ -916,11 +927,22 @@ static void update_ZM_instruction(uint8 *ins) {
} else if (instru.Vinit <= instru.Ve1 || instru.Vinit == instru.Vmin){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) {
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[10]) << 24 | (uint32_t)(ins[11]) << 16 | (uint32_t)(ins[12]) << 8 | (uint32_t)(ins[13]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.Currentmax = (int32_t)(ins[14]) << 24 | (int32_t)(ins[15]) << 16 | (int32_t)(ins[16]) << 8 | (int32_t)(ins[17]);
} else if (ins[3] == PARA_2) { // 370609 02 0005 4321 000A
instru.eliteFxn = CURVE_CV;
instru.Currentmax = (int32_t)(ins[10]) << 24 | (int32_t)(ins[11]) << 16 | (int32_t)(ins[12]) << 8 | (int32_t)(ins[13]);
instru.cycleNumber = ((uint16_t)(ins[4]) << 8) | (uint16_t)(ins[5]);
instru.notifyRate = (uint32_t)(ins[8]) << 8 | (uint32_t)(ins[9]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.hign_z_en = ~(ins[7] & 0x0F);
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
instru.gain_switch_on = 0b11110000;
@@ -930,11 +952,7 @@ static void update_ZM_instruction(uint8 *ins) {
instru.gain_switch_on = 0b01110000;
}
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[4]) << 24 | (uint32_t)(ins[5]) << 16 | (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = ((uint16_t)(ins[14]) << 8) | (uint16_t)(ins[15]);
instru.VoutGainLevel = VOUT_GAIN_240K;
ModeLED(WORKING);
@@ -944,36 +962,42 @@ static void update_ZM_instruction(uint8 *ins) {
}
case CURVE_LSV: {
instru.eliteFxn = CURVE_LSV;
instru.sampleRate = 15;
instru.Ve1 = ((uint16_t)(ins[3]) << 8) | (uint16_t)(ins[4]);
instru.Ve2 = ((uint16_t)(ins[5]) << 8) | (uint16_t)(ins[6]);
instru.Vinit = (int32_t)instru.Ve1;
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.Currentmax = (int32_t)(ins[13]) << 24 | (int32_t)(ins[14]) << 16 | (int32_t)(ins[15]) << 8 | (int32_t)(ins[16]);
instru.notifyRate = (uint32_t)(ins[11]) << 8 | (uint32_t)(ins[12]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[7]) << 24 | (uint32_t)(ins[8]) << 16 | (uint32_t)(ins[9]) << 8 | (uint32_t)(ins[10]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = 1;//ins[17];
if (ins[3] == PARA_1) {
instru.sampleRate = 15;
instru.Ve1 = ((uint16_t)(ins[4]) << 8) | (uint16_t)(ins[5]);
instru.Ve2 = ((uint16_t)(ins[6]) << 8) | (uint16_t)(ins[7]);
instru.Vinit = (int32_t)instru.Ve1;
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
instru.directionInit = VDIRECTION(instru.Ve1,instru.Ve2);
instru.Currentmax = (int32_t)(ins[12]) << 24 | (int32_t)(ins[13]) << 16 | (int32_t)(ins[14]) << 8 | (int32_t)(ins[15]);
instru.VoutGainLevel = VOUT_GAIN_240K;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)(ins[8]) << 24 | (uint32_t)(ins[9]) << 16 | (uint32_t)(ins[10]) << 8 | (uint32_t)(ins[11]);
STEP_TO_VSETRATE(instru.step);
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = 1;//ins[16.17];
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
instru.gain_switch_on = 0b11110000;
} else if (ins[3] == PARA_2) {
instru.eliteFxn = CURVE_LSV;
instru.notifyRate = (uint32_t)(ins[6]) << 8 | (uint32_t)(ins[7]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.hign_z_en = ~(ins[5] & 0x0F);
} else {
// fast notify rate, >= 10sps, auto gain changer only use ADC gain level = 1.2.3
instru.gain_switch_on = 0b01110000;
instru.VoutGainLevel = VOUT_GAIN_240K;
if (instru.notifyRate > 1000) {
// slow notify rate, < 10sps, auto gain changer only use ADC gain level = 1.2.3.4
instru.gain_switch_on = 0b11110000;
} else {
// fast notify rate, >= 10sps, auto gain changer only use ADC gain level = 1.2.3
instru.gain_switch_on = 0b01110000;
}
ModeLED(WORKING);
}
ModeLED(WORKING);
break;
}
@@ -981,9 +1005,10 @@ static void update_ZM_instruction(uint8 *ins) {
instru.eliteFxn = CURVE_CA;
instru.sampleRate = 15;
instru.Vinit = ((int32_t)(ins[3]) << 8) | (int32_t)(ins[4]);
instru.notifyRate = (uint32_t)(ins[5]) << 8 | (uint32_t)(ins[6]);
instru.notifyRate = (uint32_t)(ins[7]) << 8 | (uint32_t)(ins[8]);
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.VsetRate = VsetRateTable[0];
instru.hign_z_en = ~(ins[6] & 0x0F);
instru.VoutGainLevel = VOUT_GAIN_240K;
@@ -1177,6 +1202,50 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
case SET_PARA: {
int32_t value;
if (instru.eliteFxn == CURVE_VO) {
switch (ins[3]){
case DAC_VOLT:
value = (ins[4] << 8) | ins[5]; // usercode
value = (value - 25000) * 4 * 10000; //[5nV]
set_para(instru.eliteFxn, DAC_VOLT, value);
break;
default:
break;
}
} else if (instru.eliteFxn == CURVE_IT) {
switch (ins[3]){
case DAC_VOLT:
value = (ins[4] << 8) | ins[5]; // usercode
value = (value - 25000) * 4 * 10000; //[5nV]
set_para(instru.eliteFxn, DAC_VOLT, value);
break;
default:
break;
}
} else if (instru.eliteFxn == CURVE_RT) {
switch (ins[3]){
case DAC_VOLT:
value = (ins[4] << 8) | ins[5]; // usercode
value = (value - 25000) * 4 * 10000; //[5nV]
set_para(instru.eliteFxn, DAC_VOLT, value);
break;
default:
break;
}
}
break;
}
case 0xFF: { // 0x3000FF
switch (ins[3]) {
case 0x01: {