# Interrupt in complex programs

**URL:** <https://forum.xod.io/t/interrupt-in-complex-programs/1959>\
**Category:** Uncategorized\
**Created:** [March 7, 2019, 12:12pm UTC](https://forum.xod.io/t/interrupt-in-complex-programs/1959 "2019-03-07T12:12:05Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![dinosalvioni](https://avatars.discourse-cdn.com/v4/letter/d/85f322/32.png) [@dinosalvioni](https://forum.xod.io/u/dinosalvioni)\
**Post date:** [March 7, 2019, 12:12pm UTC](https://forum.xod.io/t/interrupt-in-complex-programs/1959/1 "2019-03-07T12:12:05Z")

</div>

I had do dinosalvioni/hwlibrary/rf433receive node baseo on bradzilla84/433mhz-rcswitch  
it works fine in “stand alone program” but when i put it in more big complex software (as example bitrex/xod-menu-system) it start but dont work (interrupt dont receive siglal or similar effect)  
I suspect it is something related to interrupt management  
How XOD operate with interrupts?  
there’s a node for use easy interrupts signal? (as example interrupt number -\> interrupt pulse that start and run “over the main program”)

Any comment and workaround is welcome.

The best thing would be a tutorial on the interrupt’s use

I Use Arduino Mega

Thanks a lot

---

<div class="post-metadata">

**Author:** ![nkrkv](https://yyz1.discourse-cdn.com/flex027/user_avatar/forum.xod.io/nkrkv/32/8_2.png) [@nkrkv](https://forum.xod.io/u/nkrkv)\
**Post date:** [March 11, 2019, 1:03pm UTC](https://forum.xod.io/t/interrupt-in-complex-programs/1959/2 "2019-03-11T13:03:05Z")

</div>

There’s no interrupt management built in XOD C++ runtime (yet). A quick solution one could try is the following (very rough draft, unchecked):

```cpp
volatile uint8_t interruptCount = 0;

void myISR() {
  // Record we have had an interrupt
  ++interruptCount;
}

void evaluate(Context ctx) {
    if (isSettingUp()) {
        // Register handler once
        auto pin = getValue<input_PORT>(ctx);
        attachInterrupt(digitalPinToInterrupt(pin), myISR, RISING);
    }

    if (interruptCount) {
        // Process a single interrupt
        --interruptCount;
        emitValue<output_OUT>(ctx, 1);
    }

    // Come back on next transaction
    setTimeout(ctx, 0);
}

```
