Subversion Repositories f9daq

Compare Revisions

Ignore whitespace Rev 298 → Rev 299

/cvi/apps/l2d2_easyroc/l2d.c
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)