Jump to content
43oh

Recommended Posts

Hello everyone relative noob here. I'm currently trying to use the Adafruit ADS1015 library with a ads1114. I had the single ended read working a few days ago however its no longer working and readADC_SingleEnded locks the loop(). I'm actually using a msp430g2553 with energia, but that doesnt explain why it worked before and no longer does. Has this ever happened to anyone else before? I also posted this on Arduino forums to see if they knew anything about why this is happening.

Here is my code.

#include <Wire.h>
#include <Adafruit_ADS1015.h>


//Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
float voltage = 0.0;
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("Hello!");
  
  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
  
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  Wire.begin();
}


void loop(void) 
{
  int16_t adc0;
//  adc1, adc2, adc3;
  Serial.print("AIN0: "); Serial.println(adc0);
  adc0 = readADC_SingleEnded(0);
  voltage = (adc0 * 0.1875)/1000;
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("\tVoltage: ");
  Serial.println(voltage, 7);  
  Serial.println(" ");
  
  delay(200);
}
   uint8_t   m_i2cAddress=0x48;
   uint8_t   m_conversionDelay=8;
   uint8_t   m_bitShift=0;
   adsGain_t m_gain;


int16_t readADC_SingleEnded(uint8_t channel) {
  // Start with default values
  uint16_t config = ADS1015_REG_CONFIG_CQUE_NONE    | // Disable the comparator (default val)
                    ADS1015_REG_CONFIG_CLAT_NONLAT  | // Non-latching (default val)
                    ADS1015_REG_CONFIG_CPOL_ACTVLOW | // Alert/Rdy active low   (default val)
                    ADS1015_REG_CONFIG_CMODE_TRAD   | // Traditional comparator (default val)
                    ADS1015_REG_CONFIG_DR_1600SPS   | // 1600 samples per second (default)
                    ADS1015_REG_CONFIG_MODE_SINGLE; 
  // Set PGA/voltage range
  config |= m_gain;
  
 Serial.println("Config is set ");
  // Set single-ended input channel
  switch (channel)
  {
    case (0):
      config |= ADS1015_REG_CONFIG_MUX_SINGLE_0;
      break;
    case (1):
      config |= ADS1015_REG_CONFIG_MUX_SINGLE_1;
      break;
    case (2):
      config |= ADS1015_REG_CONFIG_MUX_SINGLE_2;
      break;
    case (3):
      config |= ADS1015_REG_CONFIG_MUX_SINGLE_3;
      break;
  }


  // Set 'start single-conversion' bit
  config |= 0x8000;
 Serial.println("Single conversion bit set");
  // Write config register to the ADC
  writeRegister(m_i2cAddress, ADS1015_REG_POINTER_CONFIG, config);
 Serial.println("register has been written");
  // Wait for the conversion to complete
  delay(m_conversionDelay);
 Serial.println("conversion delay is over");
  // Read the conversion results
  // Shift 12-bit results right 4 bits for the ADS1015
   Serial.println("Returning the registers read");
  return readRegister(m_i2cAddress, 0x00) >> m_bitShift;  
}


 byte  test;


static void writeRegister(uint8_t i2cAddress, uint8_t reg, uint16_t value) {
     Serial.println("Beginning i2c transmission");
  Wire.beginTransmission(i2cAddress);
     Serial.println("Writing to register");
  Wire.write((uint8_t)reg);
     Serial.println("Writting 8 bit shift");
  Wire.write((uint8_t)(value>>8));
     Serial.println("writing end value");
  Wire.write((uint8_t)(value & 0xFF));
     Serial.println("End of transmission");
  test = Wire.endTransmission(true);
  Serial.println(test);
}


int16_t readRegister(uint8_t i2cAddress, uint8_t reg) {
     Serial.println("Reading from register");
  Wire.beginTransmission(i2cAddress);
     Serial.println("Returning the registers read");
  Wire.write((uint8_t)0x00);
  Wire.endTransmission();
     Serial.println("requesting from i2c the registers read");
  Wire.requestFrom(i2cAddress, (uint8_t)2);
  return ((Wire.read() << 8) | Wire.read());  
}

EDIT:

So i figured out it has something to do with register writing   Wire.endTransmission(); within the writeRegister call of the ADS1115 library, im not sure why. 

Thanks.

Link to post
Share on other sites

Does anyone know how to solve the Wire.endTransmission() issue? I can't use the I2C library that was written for Arduinos. I also used this same chip with an Arduino mega and it ran through the Wire flawlessly. Any help would be super helpful as I'm quite stuck and I really want to get this working since it worked the first time. Is there any reason why it may be locked up like I never ended the I2C originally when I first ran it?

 

Trying to use this I2C Scanner to get something but alas still no response

// I2C scanner for M430G2553
// Added  Wire.write(1);  for sketch to work.
// Grant Forest May 2014
#include "Wire.h"
uint8_t error, address;
void setup () {
    Serial.begin(9600);
    Serial.println("G'Day MyI2C_ScannerV1");
    Wire.begin();
}
void loop () {
  Serial.print(" Scanning...");
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    Wire.write(1);  ///////////////////////////////////// sketch works ok when this line added
    Serial.write("Write complete");
    error = Wire.endTransmission();
    if (error==0) {
      Serial.print("Found Address 0x");
      if (address<15) Serial.print('0');
      Serial.print(address,HEX);
      Serial.print(", ");
      }
    else
    {
      Serial.println("No address found at adress");
    }
  }   

  Serial.println();  

   delay(1000);
}
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...