1,4 → 1,4 |
//#define USE_DAQ |
#define USE_DAQ |
//#define USE_MIKRO |
#define USE_EASIROC |
#define USE_UDPCONTROL |
8,6 → 8,11 |
|
#define erIpAddr "192.168.10.16" |
#define erDAQmode 3 |
|
#define ID_ADC_HG 0x81 |
#define ID_ADC_LG 0x60 |
#define ID_TDC 0xCC |
unsigned int esrcdata[EASIROC_MAX_READ_N_WORDS]; |
#endif |
|
#ifdef USE_UDPCONTROL |
47,6 → 52,7 |
// Options->CompilerDefines (dodaj /DSISVME ali /DWIENVME) |
#ifdef USE_DAQ |
# define USE_CAMAC |
int cres; |
# include "camac.h" |
# ifdef SISVME |
# include "sisWIENVME_VME_dll.h" |
70,7 → 76,7 |
#include "l2d_ui.h" |
|
#ifdef USE_DAQ |
# define VADC_ADDR1 0x55550000 |
//# define VADC_ADDR1 0x55550000 |
# define VADC1 1 |
//# define VADC_ADDR2 0x550000 |
# define VADC2 2 |
91,9 → 97,11 |
|
#ifdef USE_CAEN_TDC |
// CAEN V1290 TDC |
#define TDC_CH_SHIFT |
int V1290_writeOC(int *write_buffer); |
int V1290_readOC(int *write_buffer); |
void V1290_init(); |
void V1290_readConfig(); |
#endif |
// Pomozne funkcije |
int max_from(int* array, int ifrom, int ito); |
171,7 → 179,7 |
int CVICALLBACK daq_run(void *functionData) |
{ |
int i,j; |
int ndat,dtype,ch,rg,adc,cres; |
int ndat,dtype,ch,rg,adc; |
unsigned long a,b,ec1,ec2; |
unsigned long data[100], data2[100]; |
unsigned long aa[NCH][4]; |
305,13 → 313,16 |
#ifdef USE_CAEN_TDC |
dum=0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1016, &dum); Delay(0.01); |
|
|
/* function moved to TDC INIT |
//pair(00)/trailing(01)/leading(10)/both(11) edge |
dum=0x2200; V1290_writeOC(&dum); |
GetCtrlVal (p1h, P1_TDC_EDGE, &dum); |
V1290_writeOC(&dum); |
*/ |
#endif |
|
|
//some init moved to Main |
/* |
#ifdef USE_CAMAC |
BZ(&cres); |
CAMAC_cccz(&cres); |
341,8 → 352,14 |
printf("CSSA_R(NTDCJ2,0,26,&cres)=0x%0x\n", cres); |
#endif |
#endif |
*/ |
#endif |
|
|
#ifdef USE_EASIROC |
//easiroc_singleADCstop(); // clear?? |
easiroc_singleADCstart(); |
#endif |
|
if (dsave) { |
sprintf(dfile,"%s_file%02d.dat",dfile0,fcount); |
/* |
457,8 → 474,13 |
wait_loop(IWAIT); |
//CSSA_R(NGL,0,10,&cres); |
|
|
|
#ifdef USE_EASIROC |
//easiroc_singleADCstop(); // clear?? |
//easiroc_singleADCstart(); |
#endif |
|
|
# ifdef NPIO |
dum=0x0; |
CSSA_W(NPIO, 0, 16, &dum); |
465,6 → 487,8 |
//printf("PIO VETO OFF\n"); |
# endif |
# endif |
|
|
|
// Waiting for LAM |
|
582,8 → 606,9 |
// TDC |
#ifdef USE_CAEN_TDC |
|
int dbg_tdc_t = 0; |
int dbg_tdc_f = 0; |
|
int dbg_tdc_t = 0; GetCtrlVal(p1h, P1_TDC_DBG_STDOUT, &dbg_tdc_t); |
int dbg_tdc_f = 0; GetCtrlVal(p1h, P1_TDC_DBG_FILOUT, &dbg_tdc_f); |
FILE *fpout=NULL; |
if(dbg_tdc_f) fpout=fopen("TDCout.txt", "at"); |
|
626,10 → 651,15 |
|
//TDC Channel = 0000 0x<...Channel...>x 20*x |
tdcch = tdcmap[(dum32 & 0x3FFFFFF) >> 21]; |
#ifdef TDC_CH_SHIFT |
if( (0<tdcch) && (tdcch<=15) ) tdcch -= 1; |
|
#endif |
|
|
//TDC Measurement = 0000 0xxx xxx<...TDC...> |
unsigned long tdc_ev = dum32 & 0x1FFFFF; |
//if(tdcch < 31) printf("tdc_ev[%d] = %d\n", tdcch, tdc_ev); |
|
int tdc_edge = (dum32 & 0x1) >> 26; |
|
648,16 → 678,19 |
if(dbg_tdc_t) printf(">>> tdcch = %d | tdc_ev = %d | raw = %d\n", tdcch, tdc_ev, dum32); |
if(dbg_tdc_f) fprintf(fpout, ">>> tdcch = %d | tdc_ev = %d | raw = %d\n", tdcch, tdc_ev, dum32); |
|
if(l==0) |
//if(l==0) |
if(tdcchhit[tdcch]==0) |
if(tdc_edge==0) { |
if(tdc_edge==0) |
if(tdcch < NCH_TDC) { |
aa[tdcch][0]=tdc_ev; |
if(tdcch < MAXCH_TDC) { |
dtdc[tdcch][0][tdc_ev]+=1; |
} |
if(dbg_tdc_t) printf(">>>>>> TDC Measurement saved >>> CH = %d | edge = %d | ev = %d\n", tdcch, tdc_edge, tdc_ev); |
if(dbg_tdc_f) fprintf(fpout, ">>>>>> TDC Measurement saved >>> CH = %d | edge = %d | ev = %d\n", tdcch, tdc_edge, tdc_ev); |
|
} |
} |
|
tdcchhit[tdcch]=1; |
|
break; |
761,6 → 794,48 |
} |
} |
# endif |
|
|
#ifdef USE_EASIROC |
ndat = easiroc_singleADCevent(esrcdata); |
//printf("ndat = %d\n", ndat); |
//for(int iw=0; iw<ndat; iw++) printf("[%d] 0x%x ", iw, esrcdata[iw]); |
//printf("\n"); |
for (i=0; i<ndat; i++) { |
dtype = (esrcdata[i] >> 24) & 0xFF; |
//int ch, overflow, edge, data; |
switch(dtype) { |
case ID_ADC_HG: |
rg=0; |
ch = (esrcdata[i] >> 16) & 0x1F; |
//overflow = (esrcdata[i] >> 13) & 0x1; |
adc = (esrcdata[i]) & 0xFFF; |
//printf("ID_ADC_HG: ch = %d | X = %d | data = %d\n", ch, overflow, data); |
aa[ch][rg+2]=adc; |
dadc[ch][rg][adc]+=1; |
break; |
case ID_ADC_LG: |
rg=1; |
ch = (esrcdata[i] >> 16) & 0x1F; |
//overflow = (esrcdata[i] >> 13) & 0x1; |
adc = (esrcdata[i]) & 0xFFF; |
//printf("ID_ADC_LG: ch = %d | X = %d | data = %d\n", ch, overflow, data); |
aa[ch][rg+2]=adc; |
dadc[ch][rg][adc]+=1; |
break; |
case ID_TDC: |
//ch = (esrcdata[i] >> 16) & 0x1F; |
//edge = (esrcdata[i] >> 15) & 0x1; |
//data = (esrcdata[i]) & 0x3FFF; |
//printf("ID_TDC: ch = %d | X = %d | data = %d\n", ch, overflow, data); |
printf("EASIROC TDC: esrcdata[i] = 0x%X !?!?!?\n", esrcdata[i]); |
break; |
default: |
printf("EASIROC default: esrcdata[i] = 0x%X !!!\n", esrcdata[i]); |
break; |
} |
} |
#endif |
|
#else /* generate test data */ |
if (!daq_on) break; |
883,15 → 958,67 |
SetStdioWindowSize (900, 600); |
//SetStdioWindowPosition (20, 800); |
SetStdioWindowPosition (20, 1100); |
|
/* |
easiroc_LoadIni("EASIROCini\\EASIROC.ini"); |
PrepareFPGA(); |
PrepareSC(1); |
PrepareReadSC(1); |
//easiroc_PrintData(); |
PrepareSC(2); |
PrepareReadSC(2); |
//easiroc_PrintData(); |
*/ |
|
|
if ((p1h = LoadPanel (0, "l2d_ui.uir", P1)) < 0) return -1; |
DisplayPanel (p1h); |
|
// some Init |
#ifdef USE_DAQ |
WIENVME_VME_START(NULL); |
#endif |
|
#ifdef USE_CAEN_TDC |
V1290_init(); |
#endif |
//WIENVME_VME_START(NULL); |
WIENVME_VME_START("C:\\home\\cvi\\instr\\WIENVME_DLL\\pcivme_ni.dll"); |
|
|
#ifdef USE_CAMAC |
BZ(&cres); |
CAMAC_cccz(&cres); |
CAMAC_cccc(&cres); |
CREM_I(&cres); |
//CSSA_R(NGL,0,25,&cres); |
#ifdef NPIO |
//CAEN C 219 Progammable I/O |
CSSA_R(NPIO, 0, 9, &dum);//init |
//dum=6; //(OUTPUT, POSITIVE, NORMAL, TRANSPARENT) |
dum=2; //(OUTPUT, NEGATIVE, NORMAL, TRANSPARENT) |
CSSA_W(NPIO, 0, 17, &dum); |
Delay(0.01); |
#endif |
|
Delay(0.01); |
#ifdef NTDCJ1 |
CSSA_R(NTDCJ1,0,9,&cres); |
printf("CSSA_R(NTDCJ1,0,9,&cres)=0x%0x\n", cres); |
CSSA_R(NTDCJ1,0,26,&cres); |
CSSA_R(NTDCJ1,1,26,&cres); |
printf("CSSA_R(NTDCJ1,0,26,&cres)=0x%0x\n", cres); |
#endif |
#ifdef NTDCJ2 |
CSSA_R(NTDCJ2,0,9,&cres); |
printf("CSSA_R(NTDCJ2,0,9,&cres)=0x%0x\n", cres); |
CSSA_R(NTDCJ2,0,26,&cres); |
printf("CSSA_R(NTDCJ2,0,26,&cres)=0x%0x\n", cres); |
#endif |
#endif //USE_CAMAC |
|
|
#ifdef USE_CAEN_TDC |
V1290_init(); |
#endif |
|
#endif //USE_DAQ |
|
|
#ifdef USE_MIKRO |
MIKRO_Open (MIKRO_COM); |
MIKRO_Init (MIKRO_X,0); |
903,8 → 1030,6 |
#endif |
#endif |
|
if ((p1h = LoadPanel (0, "l2d_ui.uir", P1)) < 0) return -1; |
DisplayPanel (p1h); |
SetCtrlAttribute (p1h, P1_PLCH, ATTR_MAX_VALUE, NCH-1); |
|
GetCtrlVal(p1h, P1_ADCHLSAVE, &runrec.xy); |
1036,6 → 1161,15 |
printf("PIO VETO OFF\n"); |
# endif |
break; |
case P1_PIO_PULSE: |
# ifdef NPIO |
dum=0x1; |
CSSA_W(NPIO, 0, 16, &dum); |
Delay(0.001); |
dum=0x0; |
CSSA_W(NPIO, 0, 16, &dum); |
# endif |
break; |
case P1_TDCCLEAR: |
#ifdef USE_CAEN_TDC |
dum16=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1014, &dum16); Delay(0.1); |
1051,16 → 1185,13 |
case P1_TDCINIT: |
|
#ifdef USE_CAEN_TDC |
//V1290_init() ; |
|
V1290_init(); |
V1290_readConfig(); |
/* |
////Maximum number of hits per event |
printf("V1290_writeOC(0x3300)\n"); |
dum=0x3300; V1290_writeOC(&dum); Delay(0.1); |
//dum=0x0001; V1290_writeOC(&dum); Delay(0.1); |
printf("V1290_writeOC(0x1000)\n"); |
dum=0x1000; V1290_writeOC(&dum); Delay(0.1); |
printf("V1290_writeOC(0x3400)\n"); |
dum=0x3400; V1290_writeOC(&dum); Delay(0.1); |
printf("V1290_writeOC(0x3300)\n"); dum=0x3300; V1290_writeOC(&dum); Delay(0.1); |
printf("V1290_writeOC(0x1000)\n"); dum= 8; V1290_writeOC(&dum); Delay(0.1); |
printf("V1290_writeOC(0x3400)\n"); dum=0x3400; V1290_writeOC(&dum); Delay(0.1); |
dum=0x0; |
printf("V1290_readOC()\n"); |
if(V1290_readOC(&dum) == -1) |
1069,13 → 1200,15 |
Delay(0.1); |
printf("TDC Maximum number of hits per event = %d\n", dum); |
} |
|
*/ |
#endif |
break; |
case P1_TDCTEST: |
|
#ifdef USE_CAEN_TDC |
/* |
V1290_readConfig(); |
|
/* |
for (i=0x4000;i<0x4050;i+=4) { |
dum=0; |
WIENVME_VME_A24D16_R(TDC_ADDR+i, &dum); |
1094,24 → 1227,8 |
dum=0x0200; V1290_writeOC(&dum); |
dum=0x0; V1290_readOC(&dum); printf("dum = %04X\n", dum&0xFFFF); |
*/ |
|
dum=0x4500; V1290_writeOC(&dum); |
dum=0x0; V1290_readOC(&dum); printf("Ch Enable 1 = %04X\n", dum&0xFFFF); |
dum=0x0; V1290_readOC(&dum); printf("Ch Enable 2 = %04X\n", dum&0xFFFF); |
|
|
dum=0x1600; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); printf("Match window Width = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Window Offset = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Extra Search Window = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Reject Margin = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Trigger Subtraction = %d\n", dum&0xFFFF); |
|
|
dum=0x3400; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); printf("TDC Maximum number of hits per event = %d\n", dum); |
|
|
/* |
// test |
|
1164,9 → 1281,21 |
break; |
#ifdef USE_EASIROC |
case P1_ESRC_INIT: |
easiroc_LoadIni("EASIROCini\\EASIROC.ini"); |
easiroc_Init(erIpAddr, erDAQmode); |
break; |
|
case P1_ESRC_LOAD_INI: |
char iniFileBuff[MAX_PATHNAME_LEN]; |
if( 0 < FileSelectPopupEx ("", "*.ini", "*.ini;*.*", "EASIROC ini file", VAL_LOAD_BUTTON, 0, 0, iniFileBuff) ) { |
printf("Loading ini file %s\n", iniFileBuff); |
if( !easiroc_LoadIni(iniFileBuff) ) { |
printf("Error loading Ini file %s!!!\n", iniFileBuff); |
} |
} |
break; |
|
|
case P1_ESRC_F1: |
easiroc_fTransmitSC(); |
break; |
1200,6 → 1329,20 |
printf("\nEASIROC DAQ SUCESS\n"); |
break; |
|
case P1_ESRC_ADC_START: |
easiroc_singleADCstart(); |
break; |
case P1_ESRC_ADC_EVENT: |
int esrcADCreturn = 0; |
esrcADCreturn = easiroc_singleADCevent(esrcdata); |
printf("esrcADCreturn = %d\n", esrcADCreturn); |
for(int iw=0; iw<esrcADCreturn; iw++) printf("[%d] 0x%x ", iw, esrcdata[iw]); |
printf("\n"); |
break; |
case P1_ESRC_ADC_STOP: |
easiroc_singleADCstop(); |
break; |
|
case P1_ESRC_CLOSE: |
easiroc_Close(); |
break; |
1309,31 → 1452,42 |
{ |
int dum; |
// intialization |
printf("V1290_init()."); |
|
dum=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1014, &dum); Delay(0.1); |
dum=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1016, &dum); Delay(0.1); |
dum=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1018, &dum); Delay(0.1); |
dum=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1014, &dum); Delay(0.1); printf("."); |
dum=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1016, &dum); Delay(0.1); printf("."); |
dum=0x0; WIENVME_VME_A24D16_W(TDC_ADDR+0x1018, &dum); Delay(0.1); printf("."); |
|
//Trigger matching |
dum=0x0000; V1290_writeOC(&dum); |
|
// Constraints: tdc_window < tdc_offset <= 4095 |
/* |
// window precedes trigger |
// Constraints: tdc_window < |tdc_offset| <= 4095 |
// Largest window: 4095-margin; |
// units: clock cycles = 25 ns |
int tdc_margin = 0; |
int tdc_offset = 40; |
int tdc_offset = 40; //negative, see below! |
int tdc_window = tdc_offset - tdc_margin; |
|
// window straddles trigger |
// Constraints: tdc_window + tdc_offset <= 40 |
// units: clock cycles = 25 ns |
int tdc_margin = 8; |
int tdc_offset = 10; //negative, see below! |
int tdc_window = 32; |
*/ |
//set window width |
dum=0x1000; V1290_writeOC(&dum); |
dum=tdc_window; V1290_writeOC(&dum); |
GetCtrlVal(p1h, P1_TDC_WINDOW, &dum); V1290_writeOC(&dum); |
//set window offset |
dum=0x1100; V1290_writeOC(&dum); |
dum=-tdc_offset; V1290_writeOC(&dum); |
GetCtrlVal(p1h, P1_TDC_OFFSET, &dum); V1290_writeOC(&dum); |
//set extra search margin |
dum=0x1200; V1290_writeOC(&dum); |
dum=tdc_margin; V1290_writeOC(&dum); |
GetCtrlVal(p1h, P1_TDC_MARGIN, &dum); V1290_writeOC(&dum); |
|
printf("."); |
|
//enable all channels |
dum=0x4200; V1290_writeOC(&dum); |
//disable all channels |
1351,6 → 1505,8 |
// dum=0x4000 + i; |
// V1290_writeOC(&dum); |
// } |
//disable channels |
//for(int i=0;i<1;i++) {dum=0x4100 + i; V1290_writeOC(&dum);} |
|
//enable(0x30xx)/disable(0x31xx) TDC Header and Trailer |
dum=0x3100; V1290_writeOC(&dum); |
1362,15 → 1518,44 |
*/ |
dum=0x3400; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); |
printf("TDC Maximum number of hits per event = %d\n", dum); |
//printf("TDC Maximum number of hits per event = %d\n", dum); |
printf("."); |
|
//pair(00)/trailing(01)/leading(10)/both(11) edge |
dum=0x2200; V1290_writeOC(&dum); |
dum=0x1; V1290_writeOC(&dum); |
GetCtrlVal(p1h, P1_TDC_EDGE, &dum); V1290_writeOC(&dum); |
|
//enable(0x14xx)/disable(0x15xx) substraction of trigger time |
dum=0x1400; V1290_writeOC(&dum); |
printf(".Done\n"); |
} |
/* ****************** ******************************************* */ |
void V1290_readConfig() |
{ |
int dum; |
dum=0x4500; V1290_writeOC(&dum); |
dum=0x0; V1290_readOC(&dum); printf("Ch Enable 1 = %04X\n", dum&0xFFFF); |
dum=0x0; V1290_readOC(&dum); printf("Ch Enable 2 = %04X\n", dum&0xFFFF); |
|
|
dum=0x1600; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); printf("Match window Width = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Window Offset = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Extra Search Window = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Reject Margin = %d\n", dum&0xFFFF); |
dum=0x0000; V1290_readOC(&dum); printf("Trigger Subtraction = %d\n", dum&0xFFFF); |
|
|
dum=0x3400; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); printf("TDC Maximum number of hits per event = %d\n", dum); |
|
dum=0x2300; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); printf("TDC Edge type = %d\n", dum); |
|
dum=0x2600; V1290_writeOC(&dum); |
dum=0x0000; V1290_readOC(&dum); printf("TDC resolution= %d\n", dum); |
} |
|
#endif |
/* ****** vrne (INT!) max vrednost iz arraya od elementa do elementa ****** */ |
int max_from(int* array, int ifrom, int ito) |