071 -- Timing Generator

From the front end programmer's point of view, it is simply a 1024 element memory. Each 071 memory word is 24 bits long; for convenience we store each in the low order three bytes of one of our own four-byte words.

The SETTING and READING-THE-SETTING requests thus contain buffers which must be an exact multiple of four bytes long. The user specifies a length and an offset so he can read or write any arbitrary chunk of 071 memory.

To load the 071 memory we need to:

  1. Write the starting 071 memory location with F(20)A(0)
  2. Write the 071 memory words, one after the other, with F(16)A(0) commands. Each Camac command transfers an entire three byte word. We increment our local buffer pointer by four bytes after each transfer.

Note that the offset and length are in bytes, so we must divide both by four to obtain the starting 071 memory location and the number of 071 words to write.

Reading is similar:

  1. Write the starting 071 memory location with F(20)A(0)
  2. Read F(0)A(0), and throw the result away.
  3. Read the requested number of 071 words, one after the other, with F(0)A(0) commands. We increment our local buffer pointer by four bytes after each transfer.

The 071 card also supports a few status bits, which can be obtained with F(4)A(0). The basic control options are:

	Control Word
	(from console)   CAMAC     Meaning
	      1        F(24)A(0)   OFF (disable)
	      2        F(26)A(0)   ON (enable)
	      3        F(9)A(0)    RESET the 071 card.

SSDN:

0 0
0 OID = 85 (hex)
crate slot
0 A

Please note: a change has been made to the 071 driver to allow applications to view the 071 memory in 3 different ways.

  1. A = 0, the same as described above, the application program writes to both DACs at once
  2. A = 1, the application program writes to the lower order DAC by sending down 2 bytes per DAC memory location.

    for example, to read/write 6 locations starting at location 32:

       offset = 64 bytes (32 * 2 bytes per location)
       length = 12 bytes (6 * 2 bytes per location)
       data   =  2 bytes per location (4msbs are not used, 12 lsbs are the DAC
                 data)
    
  3. A = 2, the application program writes to the higher order DAC by sending down 2 bytes per DAC memory location.

    for example, to read/write 6 locations starting at location 32:

       offset = 64 bytes (32 * 2 bytes per location)
       length = 12 bytes (6 * 2 bytes per location)
       data   =  2 bytes per location (4msbs are not used, 12 lsbs are the DAC
                 data)
    

071 Memory

	                   4 bytes wide
	+------------------------+---------------------+
	|                        |    16 bit pointer   | location 0
	+------------------------+---------------------+
	|                        |    16 bit pointer   | location 1
	+------------------------+---------------------+
	|                        |    16 bit pointer   | location 2
	+------------------------+---------------------+
	               ...................
	+------------------------+---------------------+
	|                        |    16 bit pointer   | location 15
	+----------+-------------+---+-----------------+
	|   8 bits | 12 bits MSB DAC | 12 bits LSB DAC | location 16
	+----------+-----------------+-----------------+
	|   8 bits | 12 bits MSB DAC | 12 bits LSB DAC | location 17
	+----------+-----------------+-----------------+
	              ...................
	+----------+-----------------+-----------------+
	|   8 bits | 12 bits MSB DAC | 12 bits LSB DAC | location 1023
	+----------+-----------------+-----------------+

Please note: For A = 0 the first 16 locations (0-15) are treated no differently from the other 1008 locations. However, for A = 1 or A = 2 the first 16 locations are treated as 2 byte words which belong to both DACs. So each DAC looks as follows:

	+----------------------+
	|     lower 2 bytes    | location 0
	+----------------------+
	     ..............
	+----------------------+
	|     lower 2 bytes    | location 15
	+----------------------+
	|       2 bytes *      | location 16
	+----------------------+
	|       2 bytes *      | location 17
	+----------------------+
	     ...............    
	+----------------------+
	|       2 bytes *      | location 1023
	+----------------------+

	   * msb 2 bytes for A = 2
	     lsb 2 bytes for A = 1

	   note first 16 locations are always lsb 2 bytes
	   for either A = 1 or A = 2

Security, Privacy, Legal