Problem with ADS1015 ads.begin()

Hello everyone,
I'm having problems with programming the ADS1015.
I used normal arduino programming with setup() and loop(), and the example programming worked normally. When I switched to programming with main() and while(1) instead of loop() and a hardware initialization function (hw_config()) instead of setup() both serial.print() and ads didn't work right .begin().
It worked in other tests with other components that I did the second way, but this example it crashes in ads.begin() and I didn't print correctly the serial.print and the program crashes in ads.begin().
Below the two programs, the example of adafruit and mine, respectively.

#include <Adafruit_ADS1X15.h>

//Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
  Adafruit_ADS1015 ads;  /* Use this for the 12-bit version */

void setup(void)
{
  Serial.begin(9600);

  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");

     ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV     
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  
 
  if (!ads.begin()) {
    Serial.println("Failed to initialize ADS.");
    while (1);
  }
 
}

void loop(void)
{
  int16_t adc0, adc1, adc2, adc3;
  float volts0, volts1, volts2, volts3;
  
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);

  volts0 = ads.computeVolts(adc0);
  volts1 = ads.computeVolts(adc1);
  volts2 = ads.computeVolts(adc2);
  volts3 = ads.computeVolts(adc3);

  Serial.println("------------------");
  Serial.print("AIN0: "); Serial.print(adc0); Serial.print("  "); Serial.print(volts0); Serial.println("V");
  Serial.print("AIN1: "); Serial.print(adc1); Serial.print("  "); Serial.print(volts1); Serial.println("V");
  Serial.print("AIN2: "); Serial.print(adc2); Serial.print("  "); Serial.print(volts2); Serial.println("V");
  Serial.print("AIN3: "); Serial.print(adc3); Serial.print("  "); Serial.print(volts3); Serial.println("V");

  delay(500);
}
#include <Adafruit_ADS1X15.h>

Adafruit_ADS1015 ads;  /* Use this for the 12-bit version */

//Definições para trabalho com bits
#define set_bit(Reg,bit) (Reg|=(1<<bit))   
#define reset_bit(Reg,bit) (Reg&=~(1<<bit))

void hw_config(void);

int16_t adc0, adc1, adc2, adc3;
float volts0, volts1, volts2, volts3;
    
int main()
{
  hw_config();
  
  
  while(1)
  { 
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);

  volts0 = ads.computeVolts(adc0);
  volts1 = ads.computeVolts(adc1);
  volts2 = ads.computeVolts(adc2);
  volts3 = ads.computeVolts(adc3);

  Serial.println("-----------------------------------------------------------");
  Serial.print("AIN0: "); Serial.print(adc0); Serial.print("  "); Serial.print(volts0); Serial.println("V");
  //Serial.print("AIN1: "); Serial.print(adc1); Serial.print("  "); Serial.print(volts1); Serial.println("V");
  //Serial.print("AIN2: "); Serial.print(adc2); Serial.print("  "); Serial.print(volts2); Serial.println("V");
  //Serial.print("AIN3: "); Serial.print(adc3); Serial.print("  "); Serial.print(volts3); Serial.println("V");

   _delay_ms(1000);
  }
    
}

void hw_config(void)//função da configuração de hardware
{
  set_bit(DDRB,PORTB5);
  Serial.begin(9600);
  Serial.println("Hello!");
 
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      (default)
  
  if (!ads.begin()) {
    while (1);
  } 
  
}```

setup() and loop() are required for every arduino sketch. There is a main() program in the background that calls setup() once and then repeatedly calls loop(). You can not do it any other way and stay within the IDE.

Add this line at the top of your main():
init();
That initializes the Arduino runtime library so you can use Arduino features like "Serial". It is possible that the Adafruit_ADS1X15 library is trying to use an Arduino feature that needs initialization.

Note: There is also an "initVariant()" you may need to call.

The easiest and safest way to use the Arduino runtime is to split your 'main()' into 'setup()' and 'loop()' to let the 'main()' in the Arduino runtime do the necessary initialization.

The second safest is to use the beginning of the Arduino main() in your own sketch:

#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.