Thursday, February 22, 2024

i2c – Use class object inside a ISR

I’ve to simulate an ADC that behaves as a I2C slave. The simulated values that the ADC shall expose are despatched over serial, saved on an attribute and are requested by a grasp system over I2C.

A simplified answer is the next. I’ve a struct ADC that describes the converter:

struct ADC 
  uint32_t register_1;

  void write(uint32_t information){
    register_1 = information;

  uint8_t learn(){
    return register_1;

  // another strategies to setup...

In loop(), I learn the serial with the intention to replace ADC::register worth and within the onRequest handler I finally ship the requested information by accessing ADC::register:

ADC adc{};

void setup(){
  // setup adc, Wire and Serial right here

void loop(){
  if (Serial.out there() > 0)
     // learn serial, parse acquired information and verify them
     uint32_t information = parse_serial(); // do something is required to verify information...

     // replace adc attribute
     uint8_t oldSREG = SREG;
     noInterrupts(); // disable interrupts to replace uint32
     SREG = oldSREG;


void slaveTransmitterHandler(){

I am unsure if I’ve to declare the adc object as risky (this is able to imply to declare all ADC strategies and variables as risky). Is it protected to make use of an object contained in the I2C handler known as by the I2C interrupt? So far as I do know, it’s not (I can discover no motive why it must be completely different from non class variables), however I’ve all the time labored with non class variables and by no means with cpp objects. Additionally, I am unable to discover any details about this matter.

It could possibly be potential that I am fallacious with the entire design, even when it appears to me to be very constant. I am open to vary it for one thing higher, so please if this design is nonsense, touch upon that! I am right here to be taught 🙂



Related Articles


Please enter your comment!
Please enter your name here

Latest Articles