X9241A - Digital Potentiometer

From Combustory
(Difference between revisions)
Jump to: navigation, search
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{default}}
+
<anyweb>http://combustory.com/wiki/ads/ad_rtc.html</anyweb>
== Warning ==
+
'''This page is in progress and none of the code can be considered good or complete. I am just using this as an alternate storage of the code for right now.'''
+
  
 +
{{default}}
 +
<anyweb>http://combustory.com/wiki/ads/ad_rtc_1.html</anyweb>
 
== Summary ==
 
== Summary ==
 +
This code shows how to communicate with the X9241A Digital Potentiometer.  I plan on updating this info eventually to explain this chip, but for now you will probably want to get the data sheet to help with understanding what was done here.  The bottom line is that I have created this program to accept commands via serial commands to set the storage registers to certain values and to modify the pot registers to change based on serial commands. I have not figured out how to read the registers, but that is not so important to my application.
  
== Example of Method ==
+
== Method ==
 
=== I2C ===
 
=== I2C ===
  
Line 19: Line 20:
 
** Send WCR Byte - Potentiometer value (binary - 00 D5 D4 D3 D2 D1 D0) - D values are the 0-63 potentiometer positions
 
** Send WCR Byte - Potentiometer value (binary - 00 D5 D4 D3 D2 D1 D0) - D values are the 0-63 potentiometer positions
  
'''Sample Code'''
 
<pre>
 
      Wire.beginTransmission(X9241_I2C_ADDRESS);
 
      Wire.send(0xa0); //Instruction to write WCR-00
 
      Wire.send(0x20); //Send a D value of 32
 
      Wire.endTransmission();
 
</pre>
 
  
 
==== x9241A_Digital_Potentiometer_v.01 code ====
 
==== x9241A_Digital_Potentiometer_v.01 code ====
  
<pre>
+
<source lang="c">
 
/*
 
/*
 
  * x9241A Digital Potentiometer v.01
 
  * x9241A Digital Potentiometer v.01
Line 111: Line 105:
 
           Wire.send(0xc7);
 
           Wire.send(0xc7);
 
           Wire.send(0x3c);
 
           Wire.send(0x3c);
 +
          Wire.endTransmission();
 
           delay(100);           
 
           delay(100);           
 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
Line 340: Line 335:
 
//*****************************************************The End***********************
 
//*****************************************************The End***********************
  
</pre>
+
</source>
  
== A/C_Control_v.01 User Guide ==
+
== x9241A_Digital_Potentiometer_v.01 User Guide ==
 
==== Commands ====
 
==== Commands ====
== Troubleshooting ==
+
[[Category:Electronics]]
=== Summary ===
+
When Troubleshooting a multi-functional issue, it is best practice to break down the issue into pieces and test each piece as a separate system.  However, we will first run through a quick test to see if we can find any obvious issues first.
+
=== Quick Test ===
+

Latest revision as of 02:52, 13 February 2011

Welcome to Combustory


Any questions or comments:

  • Send them to - combustor@combustory.com

Contents

Summary

This code shows how to communicate with the X9241A Digital Potentiometer. I plan on updating this info eventually to explain this chip, but for now you will probably want to get the data sheet to help with understanding what was done here. The bottom line is that I have created this program to accept commands via serial commands to set the storage registers to certain values and to modify the pot registers to change based on serial commands. I have not figured out how to read the registers, but that is not so important to my application.

Method

I2C

There are basically only two functions that I am after right now which are both three byte instructions:

  • Read WCR(Wiper Control Register) for the four potentiometers 0-3 (So far this is failing miserably)
    • Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address.
    • Send 2nd byte - Instruction (binary - 1001 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer
    • Read WCR requested Byte
  • Write WCR for the four potentiometers 0-3 (This works)
    • Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address.
    • Send 2nd byte - Instruction (binary - 1010 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer
    • Send WCR Byte - Potentiometer value (binary - 00 D5 D4 D3 D2 D1 D0) - D values are the 0-63 potentiometer positions


x9241A_Digital_Potentiometer_v.01 code

/*
 * x9241A Digital Potentiometer v.01
 * by <http://www.combustory.com> John Vaughters
 *
 * This Program illustrates the use of I2C to set up the x9241A Digital Potentiometer by setting and transferring the registers.
 * I attempted to read the register data through I2C, but was unable to get it to work.
 * Since the reading part was not so important to me I stopped trying.  
 * To set the registers up and transfer them to the Wiper registers met my goals and that is where I stopped.
 *
 * The x9142A has four Digital Pots and each pot has four static registers and one dynamic register the Wiper Control Register (WCR). 
 * Therefore, there are 16 total bytes of storage and four WCR's.
 * This Program has the following commands:
 * S - Set the 16 registers.  Each pot has four registers and this command will set each register group with the same value. So register 00 for each pot will
 *     be the same value for each pot, and the same for register 01 through 11.
 * G(0-3) - Global Transfer of Registers to the WCR's.  This command will bulk load the values stored in registers into the WCR's.  
 *          For example, a G0 will load the 00 register for each pot into the WCR in one command. A G1 loads the 01 register for each pot, etc.
 * (0-3)(0-3) - This set of commands transfers a single register into a single WCR. The digits are arranged like this (WCR)(Reg). 
 *              For example, a 00 command will load register 00 into WCR 00 or a 13 command will load register 11 into WCR 01, etc.
 * W(0-3) - This command writes directly to the WCR.  I have created four values that are just random, but the command shows how to write directly to the WCR for each pot.
 *          For example, a W0 command will write a value of decimal 16.  These commands are just for example purposes.
 *
 * Command Note: If you enter a command that is not recognized, then it is ignored and nothing happens and nothing is printed.
 */
 
 
#include "Wire.h"
#define X9241_I2C_ADDRESS 0x2D
 
// Global Variables
long command;
 
 
void setup() {
  Wire.begin();
  Serial.begin(57600);
 
}
 
void loop() {
   if (Serial.available()) {      // Look for char in serial que and process if found
      command = Serial.read();
      if (command == 83) {      //If command = "S" Set Register Data
      // This sets the four registers of each Digital Pot
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc0);  // This is the set register command c and the 16 registers are 0-f
          Wire.send(0x0a);  // This line is the value to set the register: 0-63 is a valid setting
          Wire.endTransmission(); 
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc1);
          Wire.send(0x14);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc2);
          Wire.send(0x20);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc3);
          Wire.send(0x3c);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc4);
          Wire.send(0x0a);
          Wire.endTransmission(); 
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc5);
          Wire.send(0x14);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc6);
          Wire.send(0x20);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc7);
          Wire.send(0x3c);
          Wire.endTransmission();
          delay(100);          
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc8);
          Wire.send(0x0a);
          Wire.endTransmission(); 
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xc9);
          Wire.send(0x14);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xca);
          Wire.send(0x20);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xcb);
          Wire.send(0x3c);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xcc);
          Wire.send(0x0a);
          Wire.endTransmission(); 
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xcd);
          Wire.send(0x14);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xce);
          Wire.send(0x20);
          Wire.endTransmission();
          delay(100);
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xcf);
          Wire.send(0x3c);
          Serial.println("cmd: S");
       }   
       else if (command == 71) {      //If command = "G" Transfer Global Register Data   
        delay(100);
        if (Serial.available()) {
         command = Serial.read(); 
         if (command == 48) {        // If command = "0" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0x10); // Global Load WCR's with Reg-00
          Wire.endTransmission();
          Serial.println("cmd: G0");
         }
         else if (command == 49) {        // If command = "1" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0x11); // Global Load WCR's with Reg-01
          Wire.endTransmission();
          Serial.println("cmd: G1");
         }
         else if (command == 50) {        // If command = "2" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0x12); // Global Load WCR's with Reg-10
          Wire.endTransmission();
          Serial.println("cmd: G2");
         }
         else if (command == 51) {        // If command = "3" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0x13); // Global Load WCR's with Reg-11
          Wire.endTransmission();
          Serial.println("cmd: G3");
         }
        }
       }
 
       else if (command == 48) {      //If command = "0" Transfer Register-00 Data to WCR 0-3
         delay(100);
         if (Serial.available()) {
         command = Serial.read(); 
         if (command == 48) {              // If command = "0" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xd0); // Load WCR-00 with Reg-00
          Wire.endTransmission();
          Serial.println("cmd: 00");
         }
         else if (command == 49) {        // If command = "1" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xd1); // Load WCR-00 with Reg-01
          Wire.endTransmission();
          Serial.println("cmd: 01");
         }
         else if (command == 50) {        // If command = "2" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xd2); // Load WCR-00 with Reg-10
          Wire.endTransmission();
          Serial.println("cmd: 02");
         }
         else if (command == 51) {        // If command = "3" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xd3); // Load WCR-00 with Reg-11
          Wire.endTransmission();
          Serial.println("cmd: 03");
         }
        }
       }
        else if (command == 49) {      //If command = "1" Transfer Register-01 Data to WCR 0-3
         delay(100);
         if (Serial.available()) {
         command = Serial.read(); 
          if (command == 48) {              // If command = "0" 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
           Wire.send(0xd4); // Load WCR-01 with Reg-00
           Wire.endTransmission();
           Serial.println("cmd: 10");
          }
          else if (command == 49) {        // If command = "1" 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
           Wire.send(0xd5); // Load WCR-01 with Reg-01
           Wire.endTransmission();
           Serial.println("cmd: 11");
          }
          else if (command == 50) {        // If command = "2" 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
           Wire.send(0xd6); // Load WCR-01 with Reg-10
           Wire.endTransmission();
           Serial.println("cmd: 12");
          }
          else if (command == 51) {        // If command = "3" 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
           Wire.send(0xd7); // Load WCR-01 with Reg-11
           Wire.endTransmission();
           Serial.println("cmd: 13");
          }
         }
        }
        else if (command == 50) {      //If command = "2" Transfer Register-10 Data to WCR 0-3
         if (Serial.available()) {
          command = Serial.read(); 
          if (command == 48) {              // If command = "0" 
           Wire.beginTransmission(X9241_I2C_ADDRESS);
           Wire.send(0xd8); // Load WCR-10 with Reg-00
           Wire.endTransmission();
           Serial.println("cmd: 20");
          }
         else if (command == 49) {        // If command = "1" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xd9); // Load WCR-10 with Reg-01
          Wire.endTransmission();
          Serial.println("cmd: 21");
         }
         else if (command == 50) {        // If command = "2" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xda); // Load WCR-10 with Reg-10
          Wire.endTransmission();
          Serial.println("cmd: 22");
         }
         else if (command == 51) {        // If command = "3" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xdb); // Load WCR-10 with Reg-11
          Wire.endTransmission();
          Serial.println("cmd: 23");
         }
        }
       }
       else if (command == 51) {      //If command = "3" Transfer Register-11 Data to WCR 0-3
        delay(100);
        if (Serial.available()) {
         command = Serial.read(); 
        if (command == 48) {              // If command = "0" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xdc); // Load WCR-11 with Reg-00
          Wire.endTransmission();
          Serial.println("cmd: 30");
         }
         else if (command == 49) {        // If command = "1" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xdd); // Load WCR-11 with Reg-01
          Wire.endTransmission();
          Serial.println("cmd: 31");
         }
         else if (command == 50) {        // If command = "2" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xde); // Load WCR-11 with Reg-10
          Wire.endTransmission();
          Serial.println("cmd: 32");
         }
         else if (command == 51) {        // If command = "3" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xdf); // Load WCR-11 with Reg-11
          Wire.endTransmission();
          Serial.println("cmd: 33");
         }
        }
       }
       else if (command == 87) {      //If command = "W" write directly to WCR 0-3
        delay(100);
        if (Serial.available()) {
         command = Serial.read(); 
        if (command == 48) {              // If command = "0" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xa0); //Instruction to write WCR-00
          Wire.send(0x10); //Send a D value of 16
          Wire.endTransmission();
          Serial.println("cmd: W0");
         }
         else if (command == 49) {        // If command = "1" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xa4); //Instruction to write WCR-01
          Wire.send(0x20); //Send a D value of 32
          Wire.endTransmission();
          Serial.println("cmd: W1");
         }
         else if (command == 50) {        // If command = "2" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xa8); //Instruction to write WCR-10
          Wire.send(0x2a); //Send a D value of 26
          Wire.endTransmission();
          Serial.println("cmd: W2");
         }
         else if (command == 51) {        // If command = "3" 
          Wire.beginTransmission(X9241_I2C_ADDRESS);
          Wire.send(0xac); //Instruction to write WCR-11
          Wire.send(0x30); //Send a D value of 48
          Wire.endTransmission();
          Serial.println("cmd: W3");
         }
        }
       }
    }
}
//*****************************************************The End***********************

x9241A_Digital_Potentiometer_v.01 User Guide

Commands

Personal tools
Sponsers
Your Ad Here
Your Ad Here