Interfacing with a Dallas DS1803 Dual Potentiometer (I2C)

' DS1803.Bas (BASICX)
' Illustrates how to control DS1803 Addressable Dual Potentiometer
' SCL_PIN (term 2 on BASICX) ------- SCL (term 9 on DS1803)
' SDA_PIN (term 3 on BASICX)-------- SDA (term 10 on DS1803)
' The manufacturer's device code foe the DS1803 is 0101.
' Note that the secondary address is determined by A2 (term 4), A1 (term 5)
' and A0 (term 6) on the 1803.  The above SCL and SDA leads may be multipled
' to eight devices, each strapped for a unique A2 A1 A0 setting.
' Pot 0 is set to a value of &H55 and Pot 1 to &H80.  The settings of the
' two pots are then read from the 1803 and displayed on the screen.
' Compile with I2C.Bas and SerialPort.Bas.
' copyright Peter H. Anderson and David Seebold, Baltimore, MD, Oct '99

Sub Main()

   Dim pot_setting_0 as byte, pot_setting_1 as byte
   Dim space as String
   space = " "
   Call OpenSerialPort(2,9600)
      Call ds1803_write_pot(0, 0, &H55)  
			' dev 0, pot 0, setting &H55 (85 decimal)
      Call ds1803_write_pot(0, 1, &H80)  
                        ' dev 0, pot 1, setting &H80, or 128
      Call ds1803_read_pots(0, pot_setting_0, pot_setting_1)
			'note that pot_settings are passed by reference

      Call PutB(pot_setting_0)      
      Call PutStr(space)
      Call PutB(pot_setting_1)
      Call NewLine()
      Call Sleep(0.5)

End Sub


Sub ds1803_write_pot(byVal device as byte, _
                     byVal pot as byte, _
                     byVal setting as byte)

'writes specified setting to specified potentiometer on specified device

   Call i2c_start()
   Call i2c_out_byte(&H50 + (device * 2))
   Call i2c_nack()
   Call i2c_out_byte(&Ha9 + pot)  ' 0xa9 for pot 0, 0xaa for pot 1
   Call i2c_nack()
   Call i2c_out_byte(setting)
   Call i2c_nack()
   Call i2c_stop()
   Call Sleep(0.025)  ' wait for it to burn into EEPROM

End Sub


Sub ds1803_read_pots(byVal device as byte, _
                     byRef p_setting_0 as byte, _
                     byRef p_setting_1 as byte)
'reads data from both potentiometers

   Call i2c_start()
   Call i2c_out_byte(&H51 + (device * 2))
   Call i2c_nack()
   Call i2c_in_byte(p_setting_0)
   Call i2c_ack()
   Call i2c_in_byte(p_setting_1)
   Call i2c_ack()
   Call i2c_stop()

End Sub