attachInterrupt()

Description

Attach interrupt service to encoder interface.

Under different operating mode, the condition to trigger interrupt is different:

  1. Pulse/DIR, CW/CCW and A/B Pulse mode: index interrupt event (trigger by setIndexReset()), comparator interrupt event (trigger by setComparator()), counter overflow interrupt event (trigger by setRange()), counter underflow interrupt event (trigger by setRange()).
  2. PWM pulse capture mode: Pulse changing from LOW to HIGH edge trigger and pulse going from HIGH to LOW edge trigger.
  3. SSI mode: Does not have a mechanism to trigger interrupt.

Syntax


Enc0.attachInterrupt(isr)
Enc1.attachInterrupt(isr)
Enc2.attachInterrupt(isr)
Enc3.attachInterrupt(isr)

Parameters

Enc0、Enc1、Enc2、Enc3:Correspond to ENC0, ENC1, ENC2 & ENC3 encoder interfaces.

isr:Interrupt service routine. This function must have an integer (int) type parameter to associate the interrupt event to one of the following 10 conditions:

  1. INTR_COMPARE:Interrupt event triggered by comparator.
  2. INTR_INDEX:Interrupt event triggered by index.
  3. INTR_OVERFLOW:Interrupt event triggered by counter overflow. (The function is available after Coding 105)
  4. INTR_UNDERFLOW:Interrupt event trggered by counter underflow. (The function is available after Coding 105)
  5. INTR_A_PULSE_LOW:Interrupt event triggered by pulse on pin A, changing from LOW to HIGH.
  6. INTR_A_PULSE_HIGH:Interrupt event triggered by a pulse on Pin A, changing from HIGH to LOW.
  7. INTR_B_PULSE_LOW:Interrupt event triggered by a pulse on Pin B, changing from LOW to HIGH.
  8. INTR_B_PULSE_HIGH:Interrupt event triggered by a pulse on Pin B, changing from HIGH to LOW.
  9. INTR_Z_PULSE_LOW:Interrupt event triggered by a pulse on Pin Z, changing from LOW to HIGH.
  10. INTR_Z_PULSE_HIGH:Interrupt event triggered by a pulse on Pin Z, changing from HIGH to LOW.

In the above, condition 1 to 4 only occur under Pulse/DIR, CW/CCW and A/B Pulse operating mode. Condition 5 to 10 only occur under PWM operating mode.

Returns

None

Example

#include <Encoder.h>

volatile unsigned long num1 = 0L;
volatile unsigned long num2 = 0L;
void encoder_isr(int flag) { // ISR function
    if(flag == INTR_COMPARE)
      num1++; // If the counter value meet the specified value, increase the value by 1.
    else if(flag == INTR_INDEX)
      num2 ++; // When the motor complete one full revolution, increase the value by 1.
}

void setup() {
  Serial.begin(9600);
  Enc0.begin(MODE_AB_PHASE);
  Enc0.setIndexReset(); // When an index signal occurs (Pin Z goes HIGH), raise an interrupt event to call ISR function.
  Enc0.setComparator(20L); // When the counter reach 20, raise an interrupt to call ISR function.
  Enc0.attachInterrupt(encoder_isr); // Attach ISR and initiate interrupt function.
}

void loop() {
  Serial.print("Pulse number: ");
  Serial.print(Enc0.read()); // Read pulse counter.
  Serial.print("    ");
  Serial.print("index: ");
  Serial.print(num1); // Output rotary encoder total revolution.
  Serial.print("    ");
  Serial.print("trigger: "); // Output number of time the counter value reach 20.
  Serial.println(num2);
  delay(100);
}

See also

detachInterrupt()
setRange()
setIndexReset()
setComparator()


Libraries Reference Home

The text of the 86Duino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.