Interfacing with a Dallas DS1867 Dual
Potentiometer (EEPROM)
copyright, Towanda Malone and Peter H. Anderson
Baltimore, MD 21239, Sept 98
Introduction.
The focus of this discussion is the DS1867 Dual Potentiometer. The
DS1867 is available in 10K, 50K and 100K models. We sell the DS1867-010
(10K) in a DIP package. A data sheet is available from
The interesting feature of this device is the potentiometer settings
are stored in EEPROM on
power down. These values are then loaded from EEPROM on power up.
In many applications involving data acquisition, an amplifier is
required to buffer a high
impedance sensor and provide gain or attenuation. Accurate sources of
V_ref can be expensive
and all and all the use of a potentiometer is tempting.
I designed circuits for Bell Labs for 20 years and designing a
potentiometer into a circuit was to
be avoided at all costs. The reasons were adjustment was an additional
manufacturing step, the
end user or dissatisfied employees could wreak havoc in toying with the
adjustments, the wiper
was subject to contamination over time, pots used a relatively large
amount of board space and
were relatively expensive.
However, devices such as the DS1867 take away many of those arguments
and permit the
designer to design relatively inexpensive analog circuitry and rely on a
DS1867 to "mop" up the
inaccuracies. The calibration may be no more than a worker or the end
user depressing an up or
down pushbutton while watching an LED flash slower and slower and stopping
when it is at
minimum speed. That is, the craft doesn't need a screw driver and
voltmeter. Rather, the clever
designer can design all of the test instrumentation into the processor.
Note that the resistance associated with the wiper itself is in the
range of 400 to 1K Ohms and
clearly this must be taken into account in designing the interfacing
analog conditioning circuitry.
Note that when used in an op amp configured as a voltage follower, this
R_W is simply in series
with an op amp input and as the input impedance of the op amp is very high
and thus the input
current very low, this wiper resistance is of no significance. In other
configurations, the variation
in wiper resistance might be masked by a much higher series resistance.
The Dallas data sheet
provides a few examples.
Operation.
The following programs for the BASIC Stamp and PIC illustrate the
interface. Note that in these
programs, the values of the two potentiometers are set in the program.
Clearly, in an actual
application, there would be a mechanism for varying these values.
The two potentiometers consist of terminals H0, L0 and W0 for one pot
and H1, L1 and W1 for
the other. In addition, there is a "stack bit" that permits the selection
of either W0 or W1 to be
gated to output S_OUT. (Dallas doesn't miss a trick).
Potentiometer settings are in the range of 00 - FF (hex). Zero (hex)
corresponds to the wiper
being on the L side, FF (hex) on the H side. Thus, 40 (hex) would cause
the wiper to be
one-quarter of the way between L and H. Note that for a 10K pot, the 256
positions corresponds
to a resistor quantizing value of nominally 50 Ohms.
In transferring data to the DS1867, /RST is brought high with clock at
zero.
Data is then sent; the stack bit is sent first, followed by the 8-bit
setting of POT 1 (most
significant bit first), followed by the 8-bit setting of POT 0 (most
significant bit first). Thus, a
total of 17 bits are sent.
Each bit is sent by bringing DQ to the appropriate state and then
clocking. Data is clocked into
the DS1867 on the rising edge of the clock pulse.
The /RST lead is then brought low. Only at that time is the new wiper
position engaged.
(It is critical to note that there are only 17 positive going clock
pulses. Towanda spent quite a bit
of time debugging her program and the problem was traced to an erroneous
18 th positive edge at
the end of the sequence.)
Program DS1867.ASM.
; DS1867.ASM ; ; Dual Digital Potentiometer with EEPROM DS1867-10 ; ; Sets Stack bit to 0, Pot 1 to B0 (hex) and Pot 0 to 40H. ; ; copyright, Towanda Malone, Baltimore, MD, Sept, '98 LIST p=16f84 #include <p16f84.inc> __CONFIG 11h ; PIC DS1867 CONSTANT RST = 0 ; term 6 ----------------> term 5 CONSTANT CLK = 1 ; term 7 ----------------> term 6 CONSTANT DQ = 2 ; term 8 ----------------> term 8 CONSTANT BASE_VARS = 0CH ; starting point for variables STACK EQU BASE_VARS+0 R_POT_1 EQU BASE_VARS+1 R_POT_0 EQU BASE_VARS+2 O_BYTE EQU BASE_VARS+3 _N EQU BASE_VARS+4 ORG 000H BSF STATUS, RP0 ; RP1 = 0, RP0 = 1, BANK1 BSF TRISB, RST ; inputs BSF TRISB, CLK ; BSF TRISB, DQ ; BCF STATUS, RP0 ; bank 0 MAIN: MOVLW .0 ; dummy up some values MOVWF STACK MOVLW 0B0H MOVWF R_POT_1 MOVLW 40H MOVWF R_POT_0 CALL WRITE_VAL GOTO $ ; loop indefinitely WRITE_VAL: SSTART: BSF STATUS, RP0 BCF TRISB, DQ ; make these outputs BCF TRISB, CLK BCF TRISB, RST BCF STATUS, RP0 BCF PORTB, RST BCF PORTB, CLK BSF PORTB, RST ; bring RST high with CLK low OUT_STACK: BTFSC STACK, 0 ; ouput the stack bit and then clock BSF PORTB, DQ BTFSS STACK, 0 BCF PORTB, DQ CALL CLOCK_PULSE OUT_R_POT_1: ; output value for R_POT_1 MOVF R_POT_1, W MOVWF O_BYTE CALL OUT_BYTE OUT_R_POT_0: MOVF R_POT_0, W MOVWF O_BYTE CALL OUT_BYTE SSTOP: BCF PORTB, RST RETURN OUT_BYTE: ; output 8 bits, beginning with most sig bit MOVLW .8 MOVWF _N OUT_BYTE_1: RLF O_BYTE, F ; set the bit BTFSC STATUS, C BSF PORTB, DQ BTFSS STATUS, C BCF PORTB, DQ CALL CLOCK_PULSE ; and then clock DECFSZ _N, F GOTO OUT_BYTE_1 RETURN CLOCK_PULSE: BSF PORTB, CLK BCF PORTB, CLK RETURN END
Program DS1867.BS2.
' DS1867.BS2 ' ' Illustrates an interface with the BASIC Stamp 2 ' ' BASIC Stamp DS1867 ' ' P0, term 5 ----------------> (/RST), term 5 ' P1, term 6 ----------------> (CLK), term 6 ' P2, term 7 ----------------> (DQ), term 8 ' ' copyright, Towanda Malone, Baltimore, Sept, '98 ' STACK VAR BYTE R_POT_1 VAR BYTE R_POT_0 VAR BYTE O_BYTE VAR BYTE N VAR BYTE DIRS = $00 ' all inputs MAIN: STACK = 0 ' dummy up some values R_POT_1 = $B0 R_POT_0 = $40 GOSUB WRITE_VAL DONE: GOTO DONE WRITE_VAL: SSTART: DIR0 = 1 ' make /RST, CLK and DQ outputs DIR1 = 1 DIR2 = 1 OUT1 = 0 ' CLK low OUT0 = 1 ' /RST high OUT_STACK: OUT0 = STACK.BIT0 ' output the Stack bit GOSUB CLOCK_PULSE OUT_R_POT_1: O_BYTE = R_POT_1 GOSUB OUT_BYTE OUT_R_POT_0: O_BYTE = R_POT_0 GOSUB OUT_BYTE SSTOP: OUT0 = 0 ' bring /RST low RETURN OUT_BYTE: ' output 8 bits, beginning with most sig bit FOR N = 0 TO 7 OUT2 = O_BYTE.BIT7 GOSUB CLOCK_PULSE O_BYTE = O_BYTE * 2 ' shift one place to the left NEXT RETURN CLOCK_PULSE: ' bring CLK high and low OUT1=1 OUT1=0 RETURN
EEPROM.
The 17 bits of wiper position data are not saved to EEPROM unless power
is lost. A minimum of
4 ms between 4.5 and 3.0 VDC is required on power down. This can easily
be achieved with a
0.1 uFd capacitor across the power terminals V_CC and GRD.
On power up, the data is automatically read from EEPROM. Note that
during the power up
recovery (a maximum of 10 msec) the pots are set to mid scale (80 hex).
Both the writing to and reading from EEPROM are transparent to the
user.
The EEPROM "wear out" is specified at 50,000 writes.
Cascading.
Any number of DS1867 devices may be daisy chained on the same three
wire bus, with /RST and
CLK multipled to each device and C_OUT of the first DS1867 connected to DQ
of the second
and C_OUT of the second to DQ of the third, etc. This is simply a shift
register.
For three devices where Device #3 is furthest from the processor;
/RST high Stack_3, Pot_1_3, Pot_0_3, Stack_2, Pot_1_2, Pot_0_2, Stack_1, Pot_1_0, Pot_0_1, /RST low
Note that in this case, 17 X 3 or 51 bits are sent.
Reading the Pot Settings.
The C_OUT terminal may also be used to read the content of a
potentiometer. Figure #5 in the
data sheet illustrates how C_OUT may be looped back to DQ through a series
limiting resistor.
A technique for reading the pot;
Configure processor terminal DQ as an input. /RST high
Note that C_OUT now may be read. A clock pulse causes the state on
C_OUT to be loaded into
the DQ input on the first DS1867.
This "read and clock" sequence is repeated 17 (or 34 or 51) times and
all bits are then back in
their previous positions. Bringing /RST low again engages the wipers.
Voltage Swing.
Logic levels associated with the DS1867 are TTL levels; V_CC and
ground. An additional
terminal, V_B is provided to bias the substrate such that signals on the
potentiometer can range
from V_B to V_CC. For example, if V_B is tied to -5.0 VDC, the potentials
on the pot may
swing from -5.0 to 5.0 V.
Timing.
It is worthy of note that the device may be clocked at anything from
near DC to 10 MHz. Each
pot setting requires 17 clock cycles and thus the resistance may be varied
quite quickly.
This raises the possibility of using the DS1867 in real time feedback
control applications. In fact,
it might be used as a dual 8-bit digital to analog converter.
Again, note that the EEPROM write is performed only on power down, not
on each write to the
device. Thus, I assume the resistance could be changed some 500,000 times
per second
indefinitely.
However, I did not note this capability until we had completed testing and the fixture has since been taken down. Thus, this is somewhat speculative. I would be interested if anyone walks down this road.