Poll ADC mode bit until conversion has finished

This commit is contained in:
2024-09-15 22:12:23 +02:00
parent ce1444b0f4
commit a9f201b061
2 changed files with 40 additions and 21 deletions

View File

@@ -21,6 +21,7 @@
// TODO: Error handling and recovery besides watchdog timer.
// TODO: Add more documentation from the atmel data sheet.
// TODO: ADS1115 continuous mode instead of single-shot?
// TODO: Implement TWI_vect ISR? This may not actually be
// much better than the blocking approach.
@@ -31,6 +32,7 @@ static void I2C_AHT20_Trigger(void);
static int I2C_ADS1115_WriteRegister(byte reg, word data);
static word I2C_ADS1115_ReadRegister(byte reg);
static bool I2C_ADS1115_IsReady(void);
int I2C_Init(void)
{
@@ -464,10 +466,21 @@ static word I2C_ADS1115_ReadRegister(byte reg)
return data[0] << 8 | data[1];
}
static bool I2C_ADS1115_IsReady(void)
{
word reg;
Sleep(20);
reg = I2C_ADS1115_ReadRegister(0x01);
return reg & BIT(15);
}
word I2C_ADS1115_Read(int channel)
{
word config;
word rate, gain, mux, os;
word os, mode, rate, gain, mux;
// Operational status or single-shot conversion
// start: This bit determines the operational
@@ -482,7 +495,15 @@ word I2C_ADS1115_Read(int channel)
// 0 : Device is performing a conversion
// 1 : Device is not performing a conversion
os = 0x8000; // Start single | 10000000 00000000
os = 0x8000; // Start single | 10000000 00000000
// Device operating mode: This bit controls the
// operating mode.
// 0 : Continuous-conversion mode
// 1 : Single-shot mode or power-down state
mode = 0x0100; // Single-shot | 00000001 00000000
// Data rate: These bits control the data rate setting.
@@ -495,7 +516,7 @@ word I2C_ADS1115_Read(int channel)
// 110 | 475 SPS
// 111 | 860 SPS
rate = 0x0080; // 128 SPS | 00000000 10000000
rate = 0x0080; // 128 SPS | 00000000 10000000
// Programmable gain amplifier configuration: These
// bits set the FSR of the programmable gain amplifier.
@@ -509,7 +530,7 @@ word I2C_ADS1115_Read(int channel)
// 110 | ±0.256 V
// 111 | ±0.256 V
gain = 0x0000; // 6.144 V | 00000100 00000000
gain = 0x0000; // 6.144 V | 00000100 00000000
// Input multiplexer configuration: These bits
// configure the input multiplexer.
@@ -525,18 +546,21 @@ word I2C_ADS1115_Read(int channel)
mux = 0;
if (channel == ADS01)
mux = 0x4000; // | 01000000 00000000
mux = 0x4000; // | 01000000 00000000
else if (channel == ADS02)
mux = 0x5000; // | 01010000 00000000
mux = 0x5000; // | 01010000 00000000
else if (channel == ADS03)
mux = 0x6000; // | 01100000 00000000
mux = 0x6000; // | 01100000 00000000
else if (channel == ADS04)
mux = 0x7000; // | 01110000 00000000
mux = 0x7000; // | 01110000 00000000
// Single-shot conversion, active low, continous mode
config = os | rate | gain | mux;
// Single-shot conversion, active low
config = os | mode | rate | gain | mux;
I2C_ADS1115_WriteRegister(0x01, config);
// Wait until conversion finished
while (!I2C_ADS1115_IsReady());
return I2C_ADS1115_ReadRegister(0x00);
}