From 45f3cb25a75fbb32782e8470b7f948b3a865b1fc Mon Sep 17 00:00:00 2001 From: David Schleef Date: Fri, 17 May 2002 02:21:14 +0000 Subject: [PATCH] Changed new_sv to use chanspec. Updated 6052e. Changed ni.c to use CR_ALT_SOURCE for one observable. --- comedi_calibrate/Makefile | 2 +- comedi_calibrate/calib.h | 11 +++--- comedi_calibrate/comedi_calibrate.c | 61 +++++++++++++---------------- comedi_calibrate/ni.c | 14 ++++++- comedi_calibrate/other.c | 36 +++++++++++++++++ 5 files changed, 83 insertions(+), 41 deletions(-) create mode 100644 comedi_calibrate/other.c diff --git a/comedi_calibrate/Makefile b/comedi_calibrate/Makefile index 390f6bf..93d0680 100644 --- a/comedi_calibrate/Makefile +++ b/comedi_calibrate/Makefile @@ -7,7 +7,7 @@ LDFLAGS += -L../lib/ -lcomedi -lm BINS = comedi_calibrate -objs = comedi_calibrate.o ni.o cb.o +objs = comedi_calibrate.o ni.o cb.o other.o all: $(BINS) diff --git a/comedi_calibrate/calib.h b/comedi_calibrate/calib.h index 1a744cb..7669258 100644 --- a/comedi_calibrate/calib.h +++ b/comedi_calibrate/calib.h @@ -122,6 +122,10 @@ int get_bipolar_lowgain(comedi_t *dev,int subdev); int get_bipolar_highgain(comedi_t *dev,int subdev); int get_unipolar_lowgain(comedi_t *dev,int subdev); +/* other */ + +void comedi_nanodelay(comedi_t *dev, unsigned int delay); + /* printing scientific numbers */ int sci_sprint(char *s,double x,double y); @@ -169,11 +173,8 @@ typedef struct{ int maxdata; int order; - int aref; - int range; int subd; - int chan; - int cr_flags; + unsigned int chanspec; comedi_range *rng; @@ -184,7 +185,7 @@ typedef struct{ }new_sv_t; int new_sv_measure(comedi_t *dev, new_sv_t *sv); -int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,int chan,int range,int aref); +int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec); #endif diff --git a/comedi_calibrate/comedi_calibrate.c b/comedi_calibrate/comedi_calibrate.c index cbc1320..d1f6dd6 100644 --- a/comedi_calibrate/comedi_calibrate.c +++ b/comedi_calibrate/comedi_calibrate.c @@ -208,10 +208,12 @@ void set_target( calibration_setup_t *setup, int obs,double target) comedi_range *range; lsampl_t maxdata, data; - range = comedi_get_range(setup->dev, setup->observables[obs].preobserve_insn.subdev, + range = comedi_get_range(setup->dev, + setup->observables[obs].preobserve_insn.subdev, CR_CHAN( setup->observables[obs].preobserve_insn.chanspec ), CR_RANGE( setup->observables[obs].preobserve_insn.chanspec )); - maxdata = comedi_get_maxdata( setup->dev, setup->observables[obs].preobserve_insn.subdev, + maxdata = comedi_get_maxdata( setup->dev, + setup->observables[obs].preobserve_insn.subdev, CR_CHAN(setup->observables[obs].preobserve_insn.chanspec)); data = comedi_from_phys(target,range,maxdata); @@ -256,12 +258,11 @@ void measure_observable( calibration_setup_t *setup, int obs) new_sv_init(&sv, setup->dev, setup->observables[obs].observe_insn.subdev, - CR_CHAN( setup->observables[obs].observe_insn.chanspec), - CR_RANGE( setup->observables[obs].observe_insn.chanspec), - CR_AREF( setup->observables[obs].observe_insn.chanspec)); + setup->observables[obs].observe_insn.chanspec); sv.order=7; // read internal calibration source and turn on dithering - sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE; + //sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE; + //sv.cr_flags = CR_ALT_FILTER; n = new_sv_measure(setup->dev, &sv); sci_sprint_alt(s,sv.average,sv.error); @@ -529,12 +530,10 @@ double check_gain_chan_x( calibration_setup_t *setup, linear_fit_t *l,unsigned i orig = setup->caldacs[cdac].current; - new_sv_init(&sv, setup->dev,0, - CR_CHAN(ad_chanspec), - CR_RANGE(ad_chanspec), - CR_AREF(ad_chanspec)); + new_sv_init(&sv, setup->dev,0,ad_chanspec); // read internal calibration source and turn on dithering - sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE; + //sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE; + //sv.cr_flags = CR_ALT_FILTER; setup->caldacs[cdac].current=0; update_caldac( setup, cdac ); @@ -607,12 +606,10 @@ double check_gain_chan_fine( calibration_setup_t *setup, linear_fit_t *l,unsigne orig = setup->caldacs[cdac].current; - new_sv_init(&sv, setup->dev,0, - CR_CHAN(ad_chanspec), - CR_RANGE(ad_chanspec), - CR_AREF(ad_chanspec)); + new_sv_init(&sv, setup->dev,0,ad_chanspec); // read internal calibration source and turn on dithering - sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE; + //sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE; + //sv.cr_flags = CR_ALT_FILTER; setup->caldacs[cdac].current=0; update_caldac( setup, cdac ); @@ -741,9 +738,9 @@ double read_chan( calibration_setup_t *setup, int adc,int range) new_sv_t sv; char str[20]; - new_sv_init(&sv, setup->dev, 0,adc,range,AREF_OTHER); + new_sv_init(&sv, setup->dev, 0,CR_PACK(adc,range,AREF_OTHER)); sv.order=7; - sv.cr_flags = CR_ALT_FILTER; + //sv.cr_flags = CR_ALT_FILTER; n=new_sv_measure( setup->dev, &sv); @@ -758,10 +755,10 @@ int read_chan2( calibration_setup_t *setup, char *s,int adc,int range) int n; new_sv_t sv; - new_sv_init(&sv, setup->dev,0,adc,range,AREF_OTHER); + new_sv_init(&sv, setup->dev,0,CR_PACK(adc,range,AREF_OTHER)); sv.order=7; // turn on dithering - sv.cr_flags = CR_ALT_FILTER; + //sv.cr_flags = CR_ALT_FILTER; n=new_sv_measure( setup->dev, &sv); @@ -782,20 +779,19 @@ void set_ao(comedi_t *dev,int subdev,int chan,int range,double value) #endif -int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,int chan,int range,int aref) +int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec) { memset(sv,0,sizeof(*sv)); sv->subd=subdev; //sv->t.flags=TRIG_DITHER; - sv->chan=chan; - sv->range=range; - sv->aref=aref; + sv->chanspec = chanspec; //sv->chanlist[0]=CR_PACK(chan,range,aref); - sv->maxdata=comedi_get_maxdata(dev,subdev,chan); - sv->rng=comedi_get_range(dev,subdev,chan,range); + sv->maxdata=comedi_get_maxdata(dev,subdev,CR_CHAN(chanspec)); + sv->rng=comedi_get_range(dev,subdev, + CR_CHAN(chanspec), CR_RANGE(chanspec)); sv->order=7; @@ -818,16 +814,15 @@ int new_sv_measure( comedi_t *dev, new_sv_t *sv) exit(1); } - ret = comedi_data_read_hint(dev, sv->subd, sv->chan | sv->cr_flags, sv->range, - sv->aref); + ret = comedi_data_read_hint(dev, sv->subd, sv->chanspec, 0, 0); if(ret<0){ printf("hint barf\n"); goto out; } - usleep( 1000 ); + comedi_nanodelay(dev, 1000*99); + //usleep( 1000 ); - ret = comedi_data_read_n(dev, sv->subd, sv->chan | sv->cr_flags, sv->range, - sv->aref, data, n); + ret = comedi_data_read_n(dev, sv->subd, sv->chanspec, 0, 0, data, n); if(ret<0){ printf("barf\n"); goto out; @@ -868,8 +863,7 @@ int new_sv_measure_order( comedi_t *dev, new_sv_t *sv,int order) exit(1); } - ret = comedi_data_read_n(dev, sv->subd, sv->chan | sv->cr_flags, sv->range, - sv->aref, data, n); + ret = comedi_data_read_n(dev, sv->subd, sv->chanspec, 0, 0, data, n); if(ret<0){ printf("barf order\n"); goto out; @@ -1051,3 +1045,4 @@ int sci_sprint_alt(char *s,double x,double y) return sprintf(s,"%0.*f(%2.0f)e%d",sigfigs-1,mantissa,error,maxsig); } + diff --git a/comedi_calibrate/ni.c b/comedi_calibrate/ni.c index b16db4c..02a6f03 100644 --- a/comedi_calibrate/ni.c +++ b/comedi_calibrate/ni.c @@ -143,6 +143,7 @@ int ni_setup_board( calibration_setup_t *setup, const char *device_name ) void ni_setup_observables( calibration_setup_t *setup ) { comedi_insn tmpl; + comedi_insn po_tmpl2; int bipolar_lowgain; int bipolar_highgain; int unipolar_lowgain; @@ -160,11 +161,20 @@ void ni_setup_observables( calibration_setup_t *setup ) tmpl.n = 1; tmpl.subdev = ad_subdev; + memset(&po_tmpl2,0,sizeof(tmpl)); + po_tmpl2.insn = INSN_CONFIG; + po_tmpl2.n = 2; + po_tmpl2.subdev = ad_subdev; + /* 0 offset, low gain */ o = setup->observables + ni_zero_offset_low; o->name = "ai, bipolar zero offset, low gain"; + o->preobserve_insn = po_tmpl2; + o->preobserve_insn.data = o->preobserve_data; + o->preobserve_insn.data[0] = INSN_CONFIG_ALT_SOURCE; + o->preobserve_insn.data[1] = CR_PACK(0,0,0); o->observe_insn = tmpl; - o->observe_insn.chanspec = CR_PACK(0,bipolar_lowgain,AREF_OTHER); + o->observe_insn.chanspec = CR_ALT_SOURCE; o->target = 0; /* 0 offset, high gain */ @@ -231,7 +241,7 @@ void ni_setup_observables( calibration_setup_t *setup ) o->preobserve_insn.chanspec = CR_PACK(0,0,0); o->preobserve_insn.data = o->preobserve_data; o->observe_insn = tmpl; - o->observe_insn.chanspec = + o->observe_insn.chanspec = CR_PACK(6,bipolar_lowgain,AREF_OTHER); set_target( setup, ni_ao0_reference,5.0); o->target -= voltage_reference; diff --git a/comedi_calibrate/other.c b/comedi_calibrate/other.c new file mode 100644 index 0000000..b4408e1 --- /dev/null +++ b/comedi_calibrate/other.c @@ -0,0 +1,36 @@ +/* +comedi_calibrate/other.c - functions that might move to the library +Copyright (C) 2002 David A. Schleef + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include + + +/* Note that this silently fails if delay >= 100000 */ + +void comedi_nanodelay(comedi_t *dev, unsigned int delay) +{ + comedi_insn insn; + + memset(&insn, 0, sizeof(insn)); + insn.insn = INSN_WAIT; + insn.n = 1; + insn.data = &delay; + +} + + -- 2.26.2