ESP32 Input Capture interrupt handling

Prasad
Posts: 48
Joined: Sun Jul 23, 2017 5:26 pm

ESP32 Input Capture interrupt handling

Postby Prasad » Sun May 06, 2018 6:31 pm

How can we achieve Input Capture interrupt handling in ESP32? I'm trying to capture a incoming signal form my RFID scanner hardware. I need to synchronise the frequency in which the data is being sent from the hardware. Any guidance would be highly appreciated.

To be exact here is the Arduino code which i'm trying to achieve in ESP,

Code: Select all

/******* Sketch to test Input Capture interrupt handling *********************************
functionality: measure length of pulses on the ICP pin with precision of 0.5 microseconds
Show the min and max pulse widths in microseconds on the serial port

**************************************************************************************************************/
#include <stdio.h>      // for verbose debugging using sprintf 

#define icpPin 8        // ICP input pin on arduino
#define outPin 2        // output pin that will shadow the input, can be monitored with a scope 

                       // some variables to help see that something is happening in the interrupt handlers
volatile unsigned int Value;     // this stores the current ICR1 value
volatile unsigned int MinValue;     
volatile unsigned int MaxValue;
volatile unsigned int Overflows;
volatile unsigned int PulseCount;


/* Overflow interrupt vector */
ISR(TIMER1_OVF_vect){                 // here if no input pulse detected 
  Overflows++;                       // incriment overflow count  
}

/* ICR interrupt vector */
ISR(TIMER1_CAPT_vect){
  TCNT1 = 0;                            // reset the counter  
  if( bit_is_set(TCCR1B ,ICES1)){       // was rising edge detected ?   
       digitalWrite(outPin,HIGH );      // yes, set our output pin high to mirror the input
  }
  else {                                // falling edge was detected 
       Value = ICR1;                    // save the input capture value 
       digitalWrite(outPin,LOW );       // set our output pin low to mirror the input  
       PulseCount++;
       if(Value < MinValue)             // update min or max values as appropriate   
           MinValue = Value;
       if (Value > MaxValue)
           MaxValue = Value;    
  }     
  TCCR1B ^= _BV(ICES1);                 // toggle bit value to trigger on the other edge    
}

void setup() {
 Serial.begin(19200);
 pinMode(outPin, OUTPUT);               // declare the ledPin as an OUTPUT
 pinMode(icpPin, INPUT);                // ICP pin (digital pin 8 on arduino) as input
 MinValue =    30000;                   // Initialise with extreme values 
 MaxValue =    0;


 TCCR1A = 0 ;                    // this register set to 0!
 TCCR1B =_BV(CS11);              // NORMAL MODE!!, prescaller 8, rising edge ICP1 - this works
 TCCR1B |= _BV(ICES1);           // enable input capture     

 TIMSK1 =  _BV(ICIE1);                         // enable input capture interrupt for timer 1
 TIMSK1 |= _BV(TOIE1);                         // enable overflow interrupt to detect missing input pulses 
 Serial.print("Finished setup\r\n");
}

// this loop prints the number of pulses in the last second, showing min and max pulse widths 
void loop() {
 char buffer[80];
 // show the captured data, divide pulse widths by 2 to display time in microseconds
 sprintf(buffer,"Got %d pulses: min=%d, max=%d (%d timer overflows)\r\n", PulseCount, MinValue / 2, MaxValue / 2, Overflows);         
 Serial.print(buffer);    // send the info to the serial port
 /* reset variables ready for the next reading */   
 PulseCount = Overflows = 0; // reset counts
 MinValue =    30000;        // set values to extremes
 MaxValue =    0;       
  
 delay(1000);             // wait 1 second for next update  [/font]            
}
Thank you!
Prasad.

Who is online

Users browsing this forum: yojig666 and 122 guests