Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Marlin/src/feature/adc/adc_mcp3426.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#include "adc_mcp3426.h"

// Read the ADC value from MCP342X on a specific channel
int16_t MCP3426::ReadValue(uint8_t channel, uint8_t gain) {
int16_t MCP3426::ReadValue(uint8_t channel, uint8_t gain, uint8_t address) {
Error = false;

#if PINS_EXIST(I2C_SCL, I2C_SDA) && DISABLED(SOFT_I2C_EEPROM)
Expand All @@ -44,7 +44,7 @@ int16_t MCP3426::ReadValue(uint8_t channel, uint8_t gain) {

Wire.begin(); // No address joins the BUS as the master

Wire.beginTransmission(I2C_ADDRESS(MCP342X_ADC_I2C_ADDRESS));
Wire.beginTransmission(I2C_ADDRESS(address));

// Continuous Conversion Mode, 16 bit, Channel 1, Gain x4
// 26 = 0b00011000
Expand Down Expand Up @@ -75,7 +75,7 @@ int16_t MCP3426::ReadValue(uint8_t channel, uint8_t gain) {
uint8_t buffer[len] = {};

do {
Wire.requestFrom(I2C_ADDRESS(MCP342X_ADC_I2C_ADDRESS), len);
Wire.requestFrom(I2C_ADDRESS(address), len);
if (Wire.available() != len) {
Error = true;
return 0;
Expand Down
5 changes: 1 addition & 4 deletions Marlin/src/feature/adc/adc_mcp3426.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,9 @@
#include <stdint.h>
#include <Wire.h>

// Address of MCP342X chip
#define MCP342X_ADC_I2C_ADDRESS 104

class MCP3426 {
public:
int16_t ReadValue(uint8_t channel, uint8_t gain);
int16_t ReadValue(uint8_t channel, uint8_t gain, uint8_t address);
bool Error;
};

Expand Down
15 changes: 10 additions & 5 deletions Marlin/src/gcode/feature/adc/M3426.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

#include "../../../feature/adc/adc_mcp3426.h"

#define MCP3426_BASE_ADDR (0b1101 << 3)

/**
* M3426: Read 16 bit (signed) value from I2C MCP3426 ADC device
*
Expand All @@ -36,12 +38,15 @@
* M3426 I<byte-2 value in base 10> 0 or 1, invert reply
*/
void GcodeSuite::M3426() {
uint8_t channel = parser.byteval('C', 1), // Select the channel 1 or 2
gain = parser.byteval('G', 1);
const bool inverted = parser.byteval('I') == 1;
uint8_t channel = parser.byteval('C', 1), // Channel 1 or 2
gain = parser.byteval('G', 1), // Gain 1, 2, 4, or 8
address = parser.byteval('A', 3); // Address 0-7 (or 104-111)
const bool inverted = parser.boolval('I');

if (address <= 7) address += MCP3426_BASE_ADDR;

if (channel <= 2 && (gain == 1 || gain == 2 || gain == 4 || gain == 8)) {
int16_t result = mcp3426.ReadValue(channel, gain);
if (WITHIN(channel, 1, 2) && (gain == 1 || gain == 2 || gain == 4 || gain == 8) && WITHIN(address, MCP3426_BASE_ADDR, MCP3426_BASE_ADDR + 7)) {
int16_t result = mcp3426.ReadValue(channel, gain, address);

if (mcp3426.Error == false) {
if (inverted) {
Expand Down