PCDAC -- Digital/Analog and Analog/Digital Conversion via BusMaster, IBM PC and DT2801 Initially released: 1984 Michael Herring Updated: 16 September 1985 Henry Thompson 1. Introduction 2. The DT2801 Series Analog And Digital I/O Boards 2.1 A/D 2.2 D/A 2.3 Digital I/O 3. User Functions 3.1 Miscellaneous Functions 3.2 A/D Functions 3.3 D/A Functions 3.4 Digital I/O Functions 4. Error Handling 4.1 Status Register Functions 4.2 Error Functions 5. Checkout 6. Calibration 1. Introduction The Data Translation DT2801-series IBM-PC-compatible analog & digital i/o boards provide an inexpensive analog i/o capacity for the Xerox 1108 with Extended Processor Option (CPE) and BusMaster interface option. These boards provide for analog-to-digital output (A/D), digital-to-analog input (D/A), and digital input/output. DT2801 boards can be mounted in an IBM PC or PC expansion chassis attached to the 1108's BusMaster interface. If the direct memory access capacities of the DT2801 board are to be used, a PC-compatible memory board must also be mounted in the PC or PC expansion chassis. The PCDAC user package provides a convenient interface between Interlisp-D and one DT2801-series board. The PCDAC package provides a functional-level interface, so that the user need not be concerned with details of the board's command sequences such as command register formats, handshaking, and error diagnosis. The user may instead concentrate on the design of the application, and on data manipulation. The PCDAC package also includes system diagnostic aids. The PCDAC user package uses the BUSMASTER and BUSEXTENDER library packages. 2. The DT2801 Series Analog And Digital I/O Boards This sketch is intended to be helpful to the casual reader of this document, and to establish context within this document. It is not guaranteed in any way. For details on the DT2801 series boards please consult a current Data Translation DT2801 Series User Manual. The DT2801 series boards are identical except in the resolution of their on-board sampling clock and in details of their A/D subsystems. The A/D subsystems vary in resolution, maximum throughput, choice of gains, whether single-ended inputs are possible, whether unipolar inputs are directly supported, and whether bipolar inputs are encoded as offset or twos-complement. I will sketch the capabilities of the A/D, D/A, and digital i/o subsystems separately. Where the capabilities vary between boards of the series, I give the lower capacity first and the higher capacity or additional alternative in square brackets. 2.1 A/D There are 8 double-ended input channels [or unipolar, or as 16 single-ended], 10V full-scale, with 12[16]-bit resolution, 4 programmable gain settings from 1 to 8[500]. and maximum throughput of 100Hz [27.5KHz]. Sampling can be triggered by software or by an externally-supplied trigger signal, or clocked either by an externally-supplied clock pulse or by an on-board clock with 2.5[1.25] usec resolution and sampling rate from 3[6]Hz to maximum throughput rate. Input from multiple channels cannot be sampled truly simultaneously. Input is either done one point at a time under direct control of the program, or in block conversions under the control of the sampling clock. In block conversions any consecutive range of input channels can be sampled, but they are sampled round-robin, one per clock. During block input conversions, the board cannot do anything else; in particular it cannot change the output levels on the D/A channels or digital output ports, nor read the digital input ports. Block input conversions can deposit their data directly into RAM memory on the pc, by direct memory access (dma). A dma buffer must reside entirely within one 64KB memory page. It can be arranged that data be deposited continuously into a circular buffer. Data in the pc memory can be transferred to or from the 1108's memory while the block conversion is taking place. See the documentation for the BUSMASTER library package for a details on pc dma and on 1108 access to pc memory. 2.2 D/A There are two 12-bit output channels, which can be used separately or with their outputs latched simultaneously. The output ranges of the two channels can be set separately (by jumpers) as up to 10 volts, unipolar or bipolar. Triggering and clock rates are as for the A/D subsystem. As with A/D input, D/A output is done either one point at a time under direct control of the program, or in block conversions under the control of the sampling clock. However, in either case, either one channel is output or both channels are output, latching simultaneously. During block input conversions, the board cannot do anything else; in particular it cannot change the output levels on the digital output ports, nor read the digital input ports or the A/D channels. Dma is handled similar to the A/D subsystem. 2.3 Digital I/O There are two 8-bit digital i/o ports, each of which can be programmed (independently) to serve as an input port or as an output port. They can be used together as one 16-bit port. Digital i/o, and the setting of the directions of the ports, can be synchronized to an externally-supplied trigger signal. The base i/o addresses for the board's control registers, and the dma channel to be used by the board, are fully jumper-selectable. A screw-terminal i/o panel is available from Data Translation. 3. User Functions As documented in the DT2801 series User Manual, certain commands can be requested to delay their action until the board receives an externally-supplied trigger signal. Those PCDAC worker functions which encapsulate such commands have an optional EXTTRIGGER? argument which, if specified non-NIL, requests this feature. This EXTTRIGGER? argument is not described separately under each function. Most of the functions described below operate in the context of a global variable PCDAC.BOARD, which is initialised to contain an instance of the PCDAC record. This record has fields for both fixed attributes of a configuration, such as the i/o address, dma channel and tick duration, as well as providing a place for recording the contingent state of the board as the package thinks it ought to be at any given time. In the unlikely event that more than one board is connected to a given machine, the user will have to use RESETVAR to switch multiple instances of PCDAC into and out of PCDAC.BOARD as and when appropriate to the application. The names and meanings of the fixed attribute fields which should reflect the particular configuration in use at a given site are as follows (default values in brackets) pcdNAME The model name of the board [ "2801-A" ] pcdDMACHANNEL The dma channel to use for block transfers to/from the board. Must match the jumper setting on the board [ 1 ] pcdIOADDRESS The pc bus i/o address of the board. Must match the jumper setting on the board [ 748 = 2EC hex] pcdTICKDURATION The length of a board clock tick in seconds [ 1.25E-6 ] pcdDATAFORMAT The format the board uses for data points - either 12XS, for 12 bit samples which are excess 2048 when bipolar, or 16TC, for 16 bit two's complement samples [ 12XS ] pcdBIPOLAR? T if samples are bipolar, NIL if unipolar. Must match the jumper setting on the board [ T ] 3.1 Miscellaneous Functions (PCDAC.STOP CERROK? -- --) Stops whatever command the board is running. Some error checking/reporting is supressed if CERROK? is non-NIL. This function encapsulates the DT2801 series boards' command sequence Stop. (PCDAC.RESET) Calls PCDAC.STOP and then resets the board. This function encapsulates the DT2801 series boards' command sequence Reset. (PCDAC.HARDRESET) Calls BUS.RESET and then PCDAC.RESET. (PCDAC.SETCLOCK N HERTZFLG) Sets the rate of the board's internal clock for subsequent PCDAC.STARTREADA/D and PCDAC.STARTWRITED/A function calls. This function encapsulates the DT2801 series boards' command sequence Set Internal Clock Period. If HERTZFLG is NIL then N is the length of the desired clock period in 2.5 microsecond ticks (1.25 microseconds on a DT2801-A). If HERTZFLG is non-NIL then N is the desired sampling rate in hertz, and the number of ticks will be calculated on the basis of the TICKDURATION field of PCDAC.BOARD. (PCDAC.SETUPDMA PAGE ADDRESS NPOINTS WRITETOMEM? AUTOINIT?) Sets up a single direct memory access operation in the usual way: one would typically call it once before each call to PCDAC.STARTREADA/D or PCDAC.STARTWRITED/A with DMA? non-NIL. PCDAC.SETUPDMA masks the dma channel given in PCDAC.BOARD, loads that channel's mode, address, and transfer-count registers, and finally unmasks it. PCDAC.SETUPDMA presumes that BUSDMA.INIT has been called. PAGE is the high 4 bits and ADDRESS the low 16 bits of the 20-bit base address of the dma buffer in the external-bus memory. NPOINTS is the number of 16-bit data points to be transferred (minimum 1, maximum = default = 32768). WRITETOMEM? specifies the direction of the transfer: NIL for PCDAC.STARTWRITED/A, non-NIL for PCDAC.STARTREADA/D. AUTOINIT? is NIL if the dma controller is to stop honoring dma requests when NPOINTS data points have been transferred; it is non-NIL if the dma buffer is to be used as a circular buffer, with address and transfer-count registers automatically reinitialized every NPOINTS data points; in this latter case the dma controller does not of itself stop honoring dma requests. See the documentation for the BUSMASTER library package for more details. 3.2 A/D Functions The argument GAINCODE in the following functions encodes the analog input gain: GAINCODE gain on DT2801xxx board gain on DT2805xxx board 0 1 1 1 2 10 2 4 100 3 8 500 (PCDAC.READA/DIMMEDIATE GAINCODE CHANNEL EXTTRIGGER?) => 16-bit word Performs a single A/D conversion on the channel at the analog input gain encoded by GAINCODE (described above), returning the result as a positive integer. This function encapsulates the DT2801 series boards' command sequence Read A/D Immediate. (PCDAC.SETA/DPARAMETERS GAINCODE STARTCHANNEL ENDCHANNEL NPOINTS) Determines several parameters for subsequent PCDAC.STARTREADA/D function calls. GAINCODE encodes the analog input gain settting, as described above. The channels from STARTCHANNEL to ENDCHANNEL inclusive are scanned cyclically, one channel being sampled at each clock. (ENDCHANNEL defaults to STARTCHANNEL.) NPOINTS is significant only if the PCDAC.STARTREADA/D function is called with CONTINUOUS?=NIL; then it is the number of A/D conversions (one channel each) to take place during that Read A/D command (minimum = 3, maximum = default = 65535). This function encapsulates the DT2801 series boards' command sequence Set A/D Parameters. (PCDAC.STARTREADA/D DMA? CONTINUOUS? EXTCLOCK? EXTTRIGGER?) Initiates a scan of clocked A/D conversions on the channels and at the input gain specified in the last PCDAC.SETA/DPARAMETERS function call. If DMA? is specified non-NIL then the 16-bit data values will be deposited in external-bus memory by direct memory access according to the last PCDAC.SETUPDMA's NPOINTS; otherwise the data must be input a point at a time with PCDAC.READA/DDATUM. If CONTINUOUS? is specified non-NIL then A/D conversions will take place until a Stop command is issued to the DT2801 series board; otherwise the number of conversions that takes place is governed by the last PCDAC.SETA/DPARAMETERS call. If EXTCLOCK? is specified non-NIL then conversions are clocked by an external signal supplied to the board; otherwise the board's internal clock is used, at the clock rate specified in the last PCDAC.SETCLOCK call. This function encapsulates the DT2801 series boards' command sequence Read A/D With DMA and, with PCDAC.READA/DDATUM, the command sequence Read A/D. Note that, when PCDAC.STARTREADA/D is called with DMA? specified non-NIL, both the Read A/D command and the dma operation can have had word counts specified, or either or both can have been specified to have no effective word count. The hardware treats the two counters completely separately. The simplest thing is to specify both word counts the same and to call PCDAC.SETUPDMA before each PCDAC.STARTREADA/D call. However exotic results, some of them quite useful, can be got with other combinations. Again, see the documentation for the BUSMASTER library package. (PCDAC.READA/DDATUM) => 16-bit word Inputs individual data points during a Read A/D command started by PCDAC.STARTREADA/D with DMA?=NIL. The datum is returned as a positive integer. Coordination with PCDAC.SETA/DPARAMETERS' NPOINTS and with the clock may be required; the functions PCDAC.READYFORCOMMAND? and PCDAC.READYFORREAD? may be of use in this. Note that the "Read A/D" command sequence described in the DT2801 series User Manual actually corresponds to PCDAC.STARTREADA/D plus one PCDAC.READA/DDATUM. 3.3 D/A Functions (PCDAC.WRITED/AIMMEDIATE DACSELECT DATUM SECONDDATUM EXTTRIGGER?) Performs a single D/A conversion on DAC channels 0, 1, or both simultaneously (as DACSELECT is 0, 1, or 2). If only one channel is selected, then the less significant bits of the integer DATUM goes to that channel, and SECONDDATUM is ignored if present; if both channels are selected, then DATUM goes to channel 0 and SECONDDATUM to channel 1. This function encapsulates the DT2801 series boards' command sequence Write D/A Immediate. (PCDAC.SETD/APARAMETERS DACSELECT NPOINTS) Determines two parameters for subsequent PCDAC.STARTWRITED/A calls. DACSELECT determines whether output is to channel 0 only, channel 1 only, or both channels simultaneously (as DACSELECT is 0, 1, or 2). If DACSELECT is 2, then data are output in pairs, the first datum of each pair going to channel 0 and the second to channel 1. NPOINTS is significant only if PCDAC.STARTWRITED/A is called with CONTINUOUS?=NIL; then it is the number of D/A conversions (one or both channels) to take place during that Write D/A command (minimum = 3, maximum = default = 65535). This function encapsulates the DT2801 series boards' command sequence Set D/A Parameters. (PCDAC.STARTWRITED/A DMA? CONTINUOUS? EXTCLOCK? EXTTRIGGER?) Initiates a scan of clocked D/A conversions on the DAC or DACs specified in the last PCDAC.SETD/APARAMETERS call. If DMA? is specified non-NIL then the 16-bit data values will be read from external-bus memory by direct memory access according to the last PCDAC.SETUPDMA call; otherwise the data must be output a point at a time with PCDAC.WRITED/ADATUM. If CONTINUOUS? is specified non-NIL then D/A conversions will take place until a Stop command is issued to the DT2801 series board; otherwise the number of conversions that takes place is governed by the last PCDAC.SETD/APARAMETERS' NPOINTS. If EXTCLOCK? is specified non-NIL then conversions are clocked by an external signal supplied to the board; otherwise the board's internal clock is used, at the clock rate specified in the last PCDAC.SETCLOCK call. This function encapsulates the DT2801 series boards' command sequence Write D/A With DMA and, with one or two PCDAC.WRITED/ADATUM calls, the command sequence Write D/A. Note that, when PCDAC.STARTWRITED/A is called with DMA? specified non-NIL, both the Write D/A command and the dma operation can have had word counts specified, or either or both can have been specified to have no effective word count. The hardware treats the two counters completely separately. The simplest thing is to specify both word counts the same and to call PCDAC.SETUPDMA before each PCDAC.STARTWRITED/A call. However exotic results, some of them quite useful, can be got with other combinations. Again, see the documentation for the BUSMASTER library package. (PCDAC.WRITED/ADATUM DATUM) Outputs individual data points during a Write D/A command started by PCDAC.STARTWRITED/A with DMA?=NIL. The less significant bits of the integer DATUM are output. If both DACs are being written to, then pairs of data points must be output, with the first point of each pair going to DAC 0. Coordination with PCDAC.SETD/APARAMETERS' NPOINTS and with the clock may be required; the functions PCDAC.READYFORCOMMAND? and PCDAC.READYFORWRITE? may be of use in this. Note that the "Write D/A" command sequence described in the DT2801 series User Manual actually corresponds to PCDAC.STARTWRITED/A plus one or two PCDAC.WRITED/ADATUM calls. 3.4 Digital I/O Functions (PCDAC.SETDIGITALINPUT PORTSELECT EXTTRIGGER?) Configures digital i/o ports 0, 1, or both (as PORTSELECT is 0, 1, or 2) to accept digital inputs. This function encapsulates the DT2801 series boards' command sequence Set Digital Port For Input. (PCDAC.SETDIGITALOUTPUT PORTSELECT EXTTRIGGER?) Configures digital i/o ports 0, 1, or both (as PORTSELECT is 0, 1, or 2) to provide digital outputs. This function encapsulates the DT2801 series boards' command sequence Set Digital Port For Output. (PCDAC.READDIGITALIMMEDIATE PORTSELECT EXTTRIGGER?) => 8-bit byte/16-bit word Reads digital input from digital i/o ports 0, 1, or both. If PORTSELECT is 0 or 1 then one byte of data is read (from port 0 or 1) and returned as a small positive integer. If PORTSELECT is 2, then two bytes of data are read simultaneously (one from each port) and returned as a 16-bit positive integer, with the port 1 data as the more significant byte. The ports selected must of course currently be set for input. This function encapsulates the DT2801 series boards' command sequence Read Digital Input Immediate. (PCDAC.WRITEDIGITALIMMEDIATE PORTSELECT DATUM EXTTRIGGER?) Writes digital output to digital i/o ports 0, 1, or both. If PORTSELECT is 0 or 1 then one byte of data is written (to port 0 or 1), namely the least significant 8 bits of the integer DATUM. If PORTSELECT is 2, then two bytes of data are written simultaneously: the least significant 8 bits of the integer DATUM are written to port 0 and the next less significant 8 bits are written to port 1. The ports selected must of course currently be set for output. This function encapsulates the DT2801 series boards' command sequence Write Digital Input Immediate. 4. Error Handling Errors can be difficult to diagnose in real-time systems, and this package provides a number of facilities to ease the pain as much as possible. They depend on the fact that all the user functions described above attempt to keep up to date, within the instance of the PCDAC record in PCDAC.BOARD, a description of the state of the board. Thus if and when an error is detected a display of the state can be made. The crucial point to remember about errors in this context is that no interrupts from the board are possible. Thus errors will not be detected unless explicitly checked for. All the user functions described in the previous section check that the board is ready before issuing commands, so an error resulting from one command will be detected whenever another command is called for. If you need to be super-conservative, setting the pcdSYNCHRONOUS? field of PCDAC.BOARD to a non-NIL value will cause most functions to wait for the board to return to ready status before returning. The exceptions include the PCDAC.START... functions, for obvious reasons. The current [Sept. 1985] state of the error handling mechanisms is perhaps a bit over-engineered. In the original release of this package, if at any time an error was detected, a display of the state of the board, the on-board status register and the error register was printed on the standard output stream, and a prompt offering to redisplay or return was offered. This is not consistent with the Interlisp standard approach, in that it was unconditional - there was no way to disable it. As a complete redesign of the error handling was not possible at this time, a rather crude facility has been added whereby if pcdQUIETERRORS is set in PCDAC.BOARD, this mechanism is bypassed and ERROR is called instead. This means that ERRORSET and BREAKCHECK and so on can come in to play. The error message consists of the string "PCDAC problems" and a list of three items: the internal PCDAC message associated with the error and the values of the on-board status and error registers, if available. Returning a non-NIL value from the break will cause a symbolic display of these values to be printed out. pcdQUIETERRORS is initially NIL, so that the full-blown original error handling will occur, but user level packages are advised to set it to T and protect themselves suitably with ERRORSET. 4.1 Status Register Functions (PCDAC.READSTATUS) => 8-bit byte Returns the current on-board status register as a small integer. (PCDAC.SHOWSTATUS STATUS -- --) => 8-bit byte Displays the status value STATUS in a human-readable form. If STATUS is NIL gets it from the board. If the error bit is set in STATUS, tries to read and display the error register as well. Returns the status byte. (PCDAC.READYFORCOMMAND -- --) => boolean Checks for errors and busy waits for the board to show Ready in the status register. Times out after PCDAC.TIMEOUTCOUNT tries. (PCDAC.READYFORREAD -- --) => boolean Checks for errors and busy waits for the board to show Data Out Ready in the status register. Times out after PCDAC.TIMEOUTCOUNT tries. (PCDAC.READYFORWRITE -- --) => boolean Checks for errors and busy waits for the board to show not Data In Full in the status register. Times out after PCDAC.TIMEOUTCOUNT tries. 4.2 Error Functions (PCDAC.ERROR? CERROK?) => boolean Returns T or NIL depending on whether Composite Error is set in the on-board status register or not. Will print a description of the status and error if the bit is set, unless CERROK? is non-NIL. May cause an error/show the board status if it can't get a valid status (e.g. if the pc is powered down). (PCDAC.CLEARERROR --) Tries to stop the board if necessary and then clears the on-board error register if possible. May cause an error/show the board status if it has difficulty. This function encapsulates the DT2801 series boards' command sequence Clear Error Register. (PCDAC.READERROR --) => 16-bit word Tries to stop the board if necessary and then reads and returns the on-board error register if possible. May cause an error/show the board status if it has difficulty. (PCDAC.SHOWERROR ERROR --) Displays a human readable form of ERROR if non-NIL, or of the results of (PCDAC.READERROR) if ERROR is NIL. 5. Checkout The BUSMASTER library package provides checkout tools for the basic busmaster board and pc connection setup. Two functions are provided in this package specifically for checkout and setup of DT2801 series boards. (PCDAC.TEST quietFlg) => boolean Returns T or NIL depending on whether it succeeds in running a test based on the DT2801 series boards' command sequence Test. Prints out diagnostic messages in case of failure and, if quietFlg is NIL, a message on success. May cause an error/show the board status if it has difficulty. (PCDAC.MAKETEST) Prompts for a screen region, and brings up therein a test window. Left or middle mouse buttons bring up a command menu, and parameters are set by way of TogMenus on the margins. [See the documentation of the TOGMENU Lispusers package for a complete discussion - in brief, a TogMenu shows its value, can be sequenced through a sequence of values with the left mouse button, and will bring up a standard menu, perhaps including some options not in the basic sequence, in response to the middle mouse button.] The parameter menus and their meanings are as follows: Input Channel Determines the channel for use in input operations - values range from 0 to 15. Output Channel Determines the channel(s) for use in output operations - possible values are 0, 1 and Both. Sample Rate Determines the rate in Hertz at which input/output sampling will occur. Values of 5, 10 and 27 KHz are provided, or any value may be given via type-in. Input Gain Determines the on-board gain factor by which input samples are multiplied. Possible values are 1, 2, 4 and 8. [This is true for all boards except the DT2805, for which these settings effect a gain of 1, 10, 100 and 500]. Level Datum Determines the value to be output by the Level Out command (q.v.). Values of PFS-1, PFS-2, 0, MFS+1 and MFS are provided, or any numerical value may be given via type-in. PFS stands for Positive Full Scale, MFS for Minus Full Scale, and 0 for mid-scale. Note that the representations of these values differ for different boards and different jumper settings. For example on a DT2801-A in bipolar mode samples are represented as excess 2048, so a value of 0 for this menu = midscale = an actual sample value of 2048. The actual sample values transmitted thus depend on the pcdDATAFORMAT and pcdBIPOLAR? fields of PCDAC.BOARD. Time Compression Determines the ratio of samples read to samples displayed by the Scope command (q.v.). Values of 1, 2, 10 and 30 are provided, or any value may be given via type-in. Max Amplitude Determines the absolute value of the amplitude by which data points will be scaled for display by the Scope command. Determines the peak amplitude of the sine waves generated by the Play Tone command. Values of 1000, PFS, 2 and 10 are provided, or any numerical value may be given via type-in. Midpoint Determines the sample value which will be vertically centered in the display window by the Scope command. Determines a d.c. offset for the sine waves generated by the Play Tone command. Values of 0, PFS-2 and MFS+1 are provided, or any numerical value may be given via type-in. See the description of the Level Datum menu above for a description of the meanings of these values. Display Every Determines the interval in milliseconds at which a stretch of samples will be displayed by the Scope command (q.v.). Values of 100, 500, 1000 and AFAP are provided, or any value may be given via type-in. AFAP stands for "as fast as possible". Frequency Determines the frequency of the sine wave generated by the Play Tone command. The commands available and their meanings are as follows: Checkout Runs PC.CHECKOUT (see the BUSMASTER library package documentation) and PCDAC.TEST and displays the results. Reset Resets the busmaster and the a/d - d/a board. Level Out Puts the level datum given by the menu of that name out on the d/a channel specified by the Output Channel menu. For use in calibrating the board, as described in the manufacturer's manual. Play Tone Outputs a continuous sine wave of the frequency given by the menu of that name, at a peak amplitude determined by the Max Amplitude menu and a sampling rate determined by the menu of that name, with a d.c. offset determined by the Midpoint menu, on the d/a channel specified by the Output Channel menu. A good way to tell if you've got things hooked up right for output. Note that not all combinations of frequency and sampling rate make sense. Quiet Stops whatever noise the board is making. Scope Displays a digital oscillograph of the signal connected to the a/d channel specified by the Input Channel menu, sampled as per the Sample Rate menu, with an input gain determined by the menu of that name. Uses the settings of the Max Amplitude, Time Compression and Midpoint menus to control the appearance of the display, and the Display Every menu to determine the refresh rate. The problem is that at most points in the sample rate/compression space, there is not room to keep up with the signal, even if there were time, so some of the signal goes undisplayed. You basically get to chose between missing a small amount frequently, or a large amount infrequently. Usually the latter (use 1000 or AFAP) is what you want if you are looking at steady state phenomena, and the former (use 100 or even less) if you are trying to catch something or want immediate feedback (e.g. during calibration). Continues until either the STOP key is pressed or a mouse button is clicked. Note that the only way to guarantee that you will see something is to have Max Amplitude PFS and Midpoint 0 in bipolar mode, or Midpoint 2048 in unipolar mode. Playback Plays back the last 32768 samples (= 3.3 seconds at 1OKHz) displayed by the Scope command at a sampling rate determined by the menu of that name on the d/a channel specified by the Output Channel menu. 6. Calibration The testing tool described in the preceding section can be used to assist in carrying out the manufacturer's suggested calibration procedures. The available Level Out settings are as required for D/A calibration, and the Scope command with Midpoint at MFS+1 or PFS-2 and Max Amplitude successively decreased as you get close works very well for A/D calibration. A useful technique in the absence of a d.c. voltage source accurate to 5 places is to do the D/A calibration using the most accurate voltmeter you can find, and then use the voltages thus generated to do the A/D calibration by simply connecting a calibrated output channel to the input channel to be calibrated.  0Z*****00** HELVETICA MODERN MODERN HELVETICA HELVETICA  HELVETICA  HELVETICA HELVETICA W  3     G   L 2   u         -  2  ?   D ;  + r d:  _   _Z  9   k *[` h D  ;V  V (TP  N   G  &S  2  ]_  'U a = k H e  t;  &y  3 a0(    @ j M A q d       C   <R    x    (7    _ 7 R^   x *  P:n0  ,  qLz