settings fixed

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@107 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
l_maliakal_d
2012-01-17 10:47:21 +00:00
parent 3e8f916561
commit 918bcd3836
6 changed files with 81 additions and 147 deletions

View File

@ -278,7 +278,7 @@ int setPhaseShiftOnce(){
bus_w(addr,(CHANGE_AT_POWER_ON_BIT|//DIGITAL_TEST_BIT| bus_w(addr,(CHANGE_AT_POWER_ON_BIT|//DIGITAL_TEST_BIT|
INT_RSTN_BIT|ENET_RESETN_BIT|SW1_BIT&~PHASE_STEP_BIT)); INT_RSTN_BIT|ENET_RESETN_BIT|SW1_BIT&~PHASE_STEP_BIT));
} }
reg=bus_r(addr);
#ifdef VERBOSE #ifdef VERBOSE
printf("Multipupose reg now:%d\n",reg); printf("Multipupose reg now:%d\n",reg);
#endif #endif
@ -960,11 +960,12 @@ int setDACRegister(int idac, int val, int imod) {
u_int32_t addr, reg, mask; u_int32_t addr, reg, mask;
int off; int off;
#ifdef VERBOSE #ifdef VERBOSE
printf("Settings dac %d module %d register to %d\n",idac,imod,val); if(val==-1)
printf("Getting dac register%d module %d\n",idac,imod);
else
printf("Setting dac register %d module %d to %d\n",idac,imod,val);
#endif #endif
// addr=DUMMY_REG;
//off=0;
switch(idac){ switch(idac){
case 0: case 0:
case 1: case 1:
@ -1094,22 +1095,39 @@ int initHighVoltage(int val, int imod){
int initConfGain(int val, int imod){ int initConfGain(int isettings,int val,int imod){
#ifdef VERBOSE int retval;
printf("Setting/Getting confgain of module:%d with val:%d\n",imod,val);
#endif
u_int32_t addr=GAIN_REG; u_int32_t addr=GAIN_REG;
if(val!=-1){ if(val!=-1){
bus_w(addr,val);
#ifdef VERBOSE #ifdef VERBOSE
printf("Value sent to confGain reg is %d\n",val); printf("Setting Gain of module:%d with val:%d\n",imod,val);
#endif #endif
bus_w(addr,((val<<GAIN_OFFSET)|(bus_r(addr)&~GAIN_MASK)));
} }
val=bus_r(addr); retval=(bus_r(addr)&GAIN_MASK);
#ifdef VERBOSE #ifdef VERBOSE
printf("Value read from confGain reg is %d\n",val); printf("Value read from Gain reg is %d\n",retval);
#endif #endif
return val; if((val!=-1)&&(retval!=val))
return -1;
if(isettings!=-1){
#ifdef VERBOSE
printf("Writing Settings of module:%d with val:%d\n",imod,isettings);
#endif
bus_w(addr,((isettings<<SETTINGS_OFFSET)|(bus_r(addr)&~SETTINGS_MASK)));
}
retval=((bus_r(addr)&SETTINGS_MASK)>>SETTINGS_OFFSET);
#ifdef VERBOSE
printf("Settings read from reg is %d\n",retval);
#endif
if((isettings!=-1)&&(retval!=isettings)){
printf("\n\nSettings r\n\n");
return -1;
}
return retval;
} }

View File

@ -51,9 +51,9 @@ int setContinousReadOut(int d);
int setDACRegister(int idac, int val, int imod); int setDACRegister(int idac, int val, int imod);
float getTemperature(int tempSensor, int imod); float getTemperature(int tempSensor,int imod);
int initHighVoltage(int val, int imod); int initHighVoltage(int val,int imod);
int initConfGain(int val, int imod); int initConfGain(int isettings,int val,int imod);
int configureMAC(int ipad, long long int macad, long long int servermacad, int ival); int configureMAC(int ipad, long long int macad, long long int servermacad, int ival);

View File

@ -667,7 +667,7 @@ int setThresholdEnergy(int ethr) {
int imod; int imod;
int ret=ethr; int ret=ethr;
setSettings(GET_SETTINGS); setSettings(GET_SETTINGS,-1);//-1 added by dhanya
if (thisSettings>=0 || thisSettings<3){ if (thisSettings>=0 || thisSettings<3){
myg=g[thisSettings]; myg=g[thisSettings];
myo=o[thisSettings]; myo=o[thisSettings];
@ -780,21 +780,20 @@ int initHighVoltageByModule(int val, int imod)
} }
int initConfGainByModule(int val, int imod) int initConfGainByModule(int isettings,int val, int imod)
{ {
int im; int im;
//for the particular module //for the particular module
if (imod>=0 && imod<nModX) { if (imod>=0 && imod<nModX) {
return initConfGain(val,imod); return initConfGain(isettings,val,imod);
} }
else{ else{
//checks if all modules have the same value(ALLMOD) //checks if all modules have the same value(ALLMOD)
for (im=1; im<nModX; im++) { for (im=1; im<nModX; im++) {
if (initConfGain(val,im)!=initConfGain(val,0)) { if (initConfGain(isettings,val,im)!=initConfGain(isettings,val,0))
return -1; return -1;
}
} }
return initConfGain(val,0); return initConfGain(isettings,val,0);
} }
} }
@ -839,105 +838,42 @@ int initDACs(int* v,int imod)
int setSettings(int i) int setSettings(int i, int imod)
{ {
#ifdef VERBOSE #ifdef VERBOSE
printf("\ninside set settings wit settins=%d...\n",i); printf("\ninside set settings wit settins=%d...\n",i);
#endif #endif
int imod, isett, is; int confgain[] = CONF_GAIN;
int vrefds[] = VREFDS_VALS; int isett=-2,retval;
int vcascn[] = VCASCN_VALS;
int vcascp[] = VCASCP_VALS;
int voutcm[] = VOUTCM_VALS;
int vcascout[] =VCASCOUT_VALS;
int vincm[] = VINCM_VALS;
int vrefcomp[] = VREFCOMP_VALS ;
int ibtestc[] = IBTESTC_VALS;
int ivrefds,ivcascn,ivcascp,ivoutcm,ivcascout,ivincm,ivrefcomp,iibtestc; //reading settings
if(i==GET_SETTINGS){
int v[NDAC]; retval=initConfGainByModule(i,i,imod);
int ind; if(retval==i)
for (ind=0; ind<NDAC; ind++) isett=UNDEFINED;
v[ind]=-1;
//for confGain Register
if(thisSettings!=UNDEFINED)
//if not get settings
if ((i>=HIGHGAIN) && (i<= VERYHIGHGAIN)) {
v[VREF_DS]=vrefds[i];
v[VCASCN_PB]=vcascn[i];
v[VCASCP_PB]=vcascp[i];
v[VOUT_CM]=voutcm[i];
v[VCASC_OUT]=vcascout[i];
v[VIN_CM]=vincm[i];
v[VREF_COMP]=vrefcomp[i];
v[IB_TESTC]=ibtestc[i];
initDACs(v,ALLMOD);
thisSettings=i;
} }
//writing settings
//check settings for module 0 else{
imod=0; retval=initConfGainByModule(i,confgain[i],imod);
isett=UNDEFINED; if(retval!=i)
ivrefds=setDACRegister(VREF_DS,-1,imod); isett=UNDEFINED;
ivcascn=setDACRegister(VCASCN_PB,-1,imod);
ivcascp=setDACRegister(VCASCP_PB,-1,imod);
ivoutcm=setDACRegister(VOUT_CM,-1,imod);
ivcascout=setDACRegister(VCASC_OUT,-1,imod);
ivincm=setDACRegister(VIN_CM,-1,imod);
ivrefcomp=setDACRegister(VREF_COMP,-1,imod);
iibtestc=setDACRegister(IB_TESTC,-1,imod);
for (is=HIGHGAIN; is<UNDEFINED; is++) {
if (ivrefds==vrefds[is] && ivcascn==vcascn[is] && ivcascp==vcascp[is] &&
ivoutcm==voutcm[is] && ivcascout==vcascout[is] && ivincm==vincm[is] &&
ivrefcomp==vrefcomp[is] && iibtestc==ibtestc[is] ) {
printf("ivref from dummyreg =%d\n",ivrefds);
printf("vreg[%d] is %d\n",is,vrefds[is]);
isett = is;
}
#ifdef VERBOSE
printf("Settings of module 0 are %d\n",isett);
#endif
} }
//if error while read/writing
for (imod=1; imod<nModX; imod++) { if(isett==UNDEFINED)
if (isett!=UNDEFINED) { printf("Error:Weird Value read back from the Gain/Settings Reg\n");
ivrefds=setDACRegister(VREF_DS,-1,imod); else{
ivcascn=setDACRegister(VCASCN_PB,-1,imod); //validating the settings read back
ivcascp=setDACRegister(VCASCP_PB,-1,imod); if((retval>=HIGHGAIN)&&(retval<=VERYHIGHGAIN))
ivoutcm=setDACRegister(VOUT_CM,-1,imod); isett=retval;
ivcascout=setDACRegister(VCASC_OUT,-1,imod); else{
ivincm=setDACRegister(VIN_CM,-1,imod); isett==UNDEFINED;
ivrefcomp=setDACRegister(VREF_COMP,-1,imod); printf("Error:Wrong Settings Read out:%d\n",retval);
iibtestc=setDACRegister(IB_TESTC,-1,imod);
if (ivrefds!=vrefds[isett] || ivcascn!=vcascn[isett] || ivcascp!=vcascp[isett] ||
ivoutcm!=voutcm[isett] || ivcascout!=vcascout[isett] || ivincm!=vincm[isett] ||
ivrefcomp!=vrefcomp[isett] || iibtestc!=ibtestc[isett] ) {
isett=UNDEFINED;
#ifdef VERBOSE
printf("Settings of module %d are undefined\n",imod);
printf("%d %d %d %d %d %d %d %d \n", ivrefds,ivcascn,ivcascp,ivoutcm,ivcascout,ivincm,ivrefcomp,iibtestc);
//commented out by dhanya,should be changed back after firmware update
//printf("dacs 1: %08x dacs2: %08x\n",bus_r(MOD_DACS1_REG+(imod<<SHIFTMOD)), bus_r(MOD_DACS2_REG+(imod<<SHIFTMOD)));
#endif
}
} }
} }
thisSettings=isett;
#ifdef VERBOSE #ifdef VERBOSE
printf("detector settings are %d and confGain is %d\n",isett,initConfGainByModule(-1,-1)); printf("detector settings are %d\n",thisSettings);
#endif #endif
if (isett==UNDEFINED && thisSettings==UNINITIALIZED)
;
else
thisSettings=isett;
return thisSettings; return thisSettings;
} }
@ -1652,17 +1588,10 @@ int initModulebyNumber(sls_detector_module myMod) {
copyModule(detectorModules+im,&myMod); copyModule(detectorModules+im,&myMod);
} }
} }
thisSettings=UNDEFINED;
setSettings(GET_SETTINGS); //setting the conf gain and the settings register
int confgain[] = CONF_GAIN; setSettings(myMod.reg,imod);
if ((thisSettings>=HIGHGAIN) && (thisSettings<= VERYHIGHGAIN)) {
int retval=initConfGainByModule(confgain[thisSettings],imod);
if(retval!=confgain[thisSettings]){
printf("Weird Value read from the confGain Reg, changing settings to UNDEFINED",retval);
thisSettings=UNDEFINED;
return -1;
}
}
return myMod.reg; return myMod.reg;
} }

View File

@ -10,14 +10,6 @@
#define RGSH2VALS {260,300,260} #define RGSH2VALS {260,300,260}
//high,dynamic,low,medium,very high //high,dynamic,low,medium,very high
#define VREFDS_VALS {0,0,200,300,400,500,600}
#define VCASCN_VALS {0,0,220,320,420,520,620}
#define VCASCP_VALS {0,0,240,340,440,540,640}
#define VOUTCM_VALS {0,0,260,360,460,560,660}
#define VCASCOUT_VALS {0,0,280,380,480,580,680}
#define VINCM_VALS {0,0,300,400,500,600,700}
#define VREFCOMP_VALS {0,0,320,420,520,620,720}
#define IBTESTC_VALS {0,0,340,440,540,640,740}
#define CONF_GAIN {0,0, 0, 1, 6, 2, 1}//dynamic gain confgain yet to be figured out-probably 8 or 16 #define CONF_GAIN {0,0, 0, 1, 6, 2, 1}//dynamic gain confgain yet to be figured out-probably 8 or 16
@ -115,7 +107,7 @@ int program_one_dac(int addr, int value,int imod );
int set_one_dac(int imod); int set_one_dac(int imod);
int initDAC(int dac_addr, int value,int imod ); int initDAC(int dac_addr, int value,int imod );
int initDACs(int* v,int imod ); int initDACs(int* v,int imod );
int setSettings(int i); int setSettings(int i,int imod);
float initDACbyIndex(int ind,float val, int imod); float initDACbyIndex(int ind,float val, int imod);
float initDACbyIndexDACU(int ind,int val, int imod); float initDACbyIndexDACU(int ind,int val, int imod);
float getDACbyIndexDACU(int ind, int imod); float getDACbyIndexDACU(int ind, int imod);
@ -125,7 +117,7 @@ int setThresholdEnergy(int ethr);
/* Other DAC index routines*/ /* Other DAC index routines*/
float getTemperatureByModule(int tempSensor, int imod); float getTemperatureByModule(int tempSensor, int imod);
int initHighVoltageByModule(int val, int imod); int initHighVoltageByModule(int val, int imod);
int initConfGainByModule(int val, int imod); int initConfGainByModule(int isettings,int val,int imod);
/* Initialization*/ /* Initialization*/
int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts,int imod ); int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts,int imod );

View File

@ -207,33 +207,32 @@
/* multi purpose register */ /* multi purpose register */
#define PHASE_STEP_BIT 0x00000001 #define PHASE_STEP_BIT 0x00000001
#define PHASE_STEP_OFFSET 0 #define PHASE_STEP_OFFSET 0
/* #define READOUT_BUSY_BIT 0x00000002 /* #define READOUT_BUSY_BIT 0x00000002
#define FIFOTEST_BUSY_BIT 0x00000004 #define FIFOTEST_BUSY_BIT 0x00000004
#define WAITING_FOR_TRIGGER_BIT 0x00000008 #define WAITING_FOR_TRIGGER_BIT 0x00000008
#define DELAYBEFORE_BIT 0x00000010 */ #define DELAYBEFORE_BIT 0x00000010 */
#define SW1_BIT 0x00000020 #define SW1_BIT 0x00000020
#define SW1_OFFSET 5 #define SW1_OFFSET 5
#define WRITE_BACK_BIT 0x00000040 #define WRITE_BACK_BIT 0x00000040
#define WRITE_BACK_OFFSET 6 #define WRITE_BACK_OFFSET 6
#define RESET_BIT 0x00000080 #define RESET_BIT 0x00000080
#define RESET_OFFSET 7 #define RESET_OFFSET 7
#define ENET_RESETN_BIT 0x00000800 #define ENET_RESETN_BIT 0x00000800
#define ENET_RESETN_OFFSET 11 #define ENET_RESETN_OFFSET 11
#define INT_RSTN_BIT 0x00002000 #define INT_RSTN_BIT 0x00002000
#define INT_RSTN_OFFSET 13 #define INT_RSTN_OFFSET 13
#define DIGITAL_TEST_BIT 0x00004000 #define DIGITAL_TEST_BIT 0x00004000
#define DIGITAL_TEST_OFFSET 14 #define DIGITAL_TEST_OFFSET 14
#define CHANGE_AT_POWER_ON_BIT 0x00008000 #define CHANGE_AT_POWER_ON_BIT 0x00008000
#define CHANGE_AT_POWER_ON_OFFSET 15 #define CHANGE_AT_POWER_ON_OFFSET 15
/* settings/conf gain register */
#define GAIN_MASK 0x0000000f
#define GAIN_OFFSET 0
#define SETTINGS_MASK 0x000000f0
#define SETTINGS_OFFSET 4
#endif #endif

View File

@ -73,7 +73,7 @@ int init_detector( int b) {
setDummyRegister(); setDummyRegister();
setPhaseShiftOnce(); setPhaseShiftOnce();
setDAQRegister(); setDAQRegister();
setSettings(GET_SETTINGS); setSettings(GET_SETTINGS,-1);
//testRAM(); //testRAM();
@ -1435,10 +1435,6 @@ int set_module(int file_des) {
} else { } else {
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
retval=initModulebyNumber(myModule); retval=initModulebyNumber(myModule);
if(retval==-1){
ret=FAIL;
strcpy(mess,"Cannot set this settings as confGain register read back weird value\n");
}
#endif #endif
} }
} }
@ -1712,10 +1708,10 @@ int set_settings(int file_des) {
sprintf(mess,"Detector locked by %s\n",lastClientIP); sprintf(mess,"Detector locked by %s\n",lastClientIP);
} else { } else {
#ifdef MCB_FUNCS #ifdef MCB_FUNCS
retval=setSettings(arg[0]); retval=setSettings(arg[0],imod);
#endif #endif
#ifdef VERBOSE #ifdef VERBOSE
printf("Settings changed to %d\n", isett); printf("Settings changed to %d\n",retval);
#endif #endif
if (retval==isett || isett<0) { if (retval==isett || isett<0) {