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]
}
Prasad.