Trying to use ultrasonic sensor with interrupts

a2kcollett
Posts: 1
Joined: Tue May 10, 2022 9:12 am

Trying to use ultrasonic sensor with interrupts

Postby a2kcollett » Tue May 10, 2022 7:30 pm

Hello,

I am hoping someone might know where I am going wrong, so I am completely new to both Arduino's and ESP32, mostly dabbled with Pi's, however, trying to do a project at mo to get ultrasonic sensors to respond quicker, so found a really useful site https://homediyelectronics.com/projects ... rupts/?p=4 covering how to use interrupts to get things to work a bit quicker.

I have tried to modify the sketch to better understand how it works, it does compile but when it goes onto the ESP32 it just keeps rebooting, was hoping someone could point me in the direction of the errors in my way!

Code: Select all

#define trigPin 23                                  // Pin 23 trigger output
#define echoPin 22                                    // Pin 22 Echo input
#define echo_int 0                                    // Interrupt id for echo pulse

#define TIMER_US 80                                   // 80 uS timer duration 
#define TICK_COUNTS 4000                              // 200 mS worth of timer ticks

volatile long echo_start = 0;                         // Records start of echo pulse 
volatile long echo_end = 0;                           // Records end of echo pulse
volatile long echo_duration = 0;                      // Duration - difference between end and start
volatile int trigger_time_count = 0;                  // Count down counter to trigger pulse time
volatile long range_flasher_counter = 0;              // Count down counter for flashing distance LED

hw_timer_t * Timer1 = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
 
// --------------------------
// timerIsr() 50uS second interrupt ISR()
// Called every time the hardware timer 1 times out.
// --------------------------

void IRAM_ATTR timerIsr() {
  portENTER_CRITICAL_ISR(&timerMux);
  trigger_pulse();    
  portEXIT_CRITICAL_ISR(&timerMux);
 
}

// ----------------------------------
// setup() routine called first.
// A one time routine executed at power up or reset time.
// Used to initialise hardware.
// ----------------------------------
void setup() 
{
  pinMode(trigPin, OUTPUT);                           // Trigger pin set to output
  pinMode(echoPin, INPUT);                            // Echo pin set to input
  
  Timer1 = timerBegin(0, TIMER_US, true);                        // Initialise timer 1
  timerAttachInterrupt(Timer1, &timerIsr, true);                 // Attach interrupt to the timer service routine 
  timerAttachInterrupt(echo_int, echo_interrupt, CHANGE);  // Attach interrupt to the sensor echo input
  Serial.begin (9600);                                // Initialise the serial monitor output
}

// ----------------------------------
// loop() Runs continuously in a loop.
// This is the background routine where most of the processing usualy takes place.
// Non time critical tasks should be run from here.
// ----------------------------------
void loop()
{
    Serial.println(echo_duration / 58);               // Print the distance in centimeters
    delay(100);                                       // every 100 mS
}


// --------------------------
// trigger_pulse() called every 10 uS to schedule trigger pulses.
// Generates a pulse one timer tick long.
// Minimum trigger pulse width for the HC-SR04 is 10 us. This system
// delivers a 10 uS pulse.
// --------------------------
void trigger_pulse()
{
      static volatile int state = 0;                 // State machine variable

      if (!(--trigger_time_count))                   // Count to 200mS
      {                                              // Time out - Initiate trigger pulse
         trigger_time_count = TICK_COUNTS;           // Reload
         state = 1;                                  // Changing to state 1 initiates a pulse
      }
    
      switch(state)                                  // State machine handles delivery of trigger pulse
      {
        case 0:                                      // Normal state does nothing
            break;
        
        case 1:                                      // Initiate pulse
           digitalWrite(trigPin, HIGH);              // Set the trigger output high
           state = 2;                                // and set state to 2
           break;
        
        case 2:                                      // Complete the pulse
        default:      
           digitalWrite(trigPin, LOW);               // Set the trigger output low
           state = 0;                                // and return state to normal 0
           break;
     }
}

// --------------------------
// echo_interrupt() External interrupt from HC-SR04 echo signal. 
// Called every time the echo signal changes state.
//
// Note: this routine does not handle the case where the timer
//       counter overflows which will result in the occassional error.
// --------------------------
void echo_interrupt()
{
  switch (digitalRead(echoPin))                     // Test to see if the signal is high or low
  {
    case HIGH:                                      // High so must be the start of the echo pulse
      echo_end = 0;                                 // Clear the end time
      echo_start = micros();                        // Save the start time
      break;
      
    case LOW:                                       // Low so must be the end of hte echo pulse
      echo_end = micros();                          // Save the end time
      echo_duration = echo_end - echo_start;        // Calculate the pulse duration
      break;
  }
}

// --------------------------
// distance_flasher() Called from the timer 1 timerIsr service routine.
// Flashes the onboard LED at a rate inversely proportional
// to distance. The closer it gets the higher the frequency.
// --------------------------
void distance_flasher()
{
      if (--range_flasher_counter <= 0)                // Decrement and test the flash timer
      {                                                // Flash timer time out
         if (echo_duration < 25000)                    // If the echo duration is within limits
         {
           range_flasher_counter = echo_duration * 2;  // Reload the timer with the current echo duration
         }
         else
         {
           range_flasher_counter = 25000;              // If out of range use a default
         }

      }
}
The error I am seeing on the ESP32 is:

Code: Select all

ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1324
ho 0 tail 12 room 4
load:0x40078000,len:13480
ho 0 tail 12 room 4
load:0x40080400,len:3604
entry 0x400805f0
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

Core  1 register dump:
PC      : 0x400d15ef  PS      : 0x00060d30  A0      : 0x800d1064  A1      : 0x3ffb27d0  
A2      : 0x00000000  A3      : 0x400d0fdc  A4      : 0x00000001  A5      : 0x3ffbdb70  
A6      : 0x00000000  A7      : 0x003fffff  A8      : 0x800d162c  A9      : 0x3ffb27a0  
A10     : 0x00000000  A11     : 0x00000000  A12     : 0x40081100  A13     : 0x3ffb8a88  
A14     : 0x00000000  A15     : 0x3ffc1228  SAR     : 0x00000020  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000001  LBEG    : 0x40085c18  LEND    : 0x40085c23  LCOUNT  : 0xffffffff  


Backtrace:0x400d15ec:0x3ffb27d00x400d1061:0x3ffb27f0 0x400d1d26:0x3ffb2820 




ELF file SHA256: 0000000000000000
Any help would be massively appreciated.

Who is online

Users browsing this forum: No registered users and 88 guests