nRF9160DK and timer

Hello

Sorry for the dumb question, but how do I get this timer to work?

What am I doing wrong?

I would like to measure the distance with the HC-SR04 sensor.

#include <zephyr/zephyr.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/sys/printk.h>


#define LED0_NODE DT_ALIAS(led0)
#define LED1_NODE DT_ALIAS(led1)

static const struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
static const struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(LED1_NODE, gpios);

static volatile float countToUs = 1;

static volatile uint32_t tCount = 0;


bool getDistance(float* dist)
{
  // send 12us trigger pulse
  gpio_pin_set_dt(&led0,0);
  k_usleep(20);
  gpio_pin_set_dt(&led0,1);
  k_usleep(12);
  gpio_pin_set_dt(&led0,0);
  k_usleep(20);
  
  // wait till Echo pin goes high
  while(!gpio_pin_get_dt(&led1));
  // reset counter
  tCount = 0;
  // wait till Echo pin goes low
  while(gpio_pin_get_dt(&led1));
  
  // calculate duration in us
  float duration = countToUs*tCount;

  float distance = duration*0.017;
  
  // check value
  if(distance < 400.0) {

    // save
    *dist = distance;

    return true;
  }
  else {
    return false;
  }
}

// set up and start Timer1
void start_timer(void)
{   
  NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer;  
  NRF_TIMER1->TASKS_CLEAR = 1;
  // set prescalar n
  // f = 16 MHz / 2^(n)
  uint8_t prescaler = 0;
	NRF_TIMER1->PRESCALER = prescaler;
	NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_16Bit;

  uint16_t comp1 = 500;
  // set compare
	NRF_TIMER1->CC[1] = comp1;

  // set conversion factor
  countToUs = 0.0625*comp1*(1 << prescaler);

  printk("timer tick = %f us\n", countToUs);

  // enable compare 1
	NRF_TIMER1->INTENSET =
    (TIMER_INTENSET_COMPARE1_Enabled << TIMER_INTENSET_COMPARE1_Pos);

  // use the shorts register to clear compare 1
  NRF_TIMER1->SHORTS = (TIMER_SHORTS_COMPARE1_CLEAR_Enabled <<
                        TIMER_SHORTS_COMPARE1_CLEAR_Pos);

  // enable IRQ
  NVIC_EnableIRQ(TIMER1_IRQn);

  // start timer
  NRF_TIMER1->TASKS_START = 1;
}

// Timer 1 IRQ handler
// just increment count
void TIMER1_IRQHandler(void)
{
	if (NRF_TIMER1->EVENTS_COMPARE[1] &&
      NRF_TIMER1->INTENSET & TIMER_INTENSET_COMPARE1_Msk) {

    // clear compare register event
    NRF_TIMER1->EVENTS_COMPARE[1] = 0;

    tCount++;
  }
}

void main(void)
{

    // set up timers
	start_timer();

	int trigPin; //triger pin
	int echoPin; // echo pin


	trigPin = gpio_pin_configure_dt(&led0, GPIO_OUTPUT_ACTIVE);
	echoPin = gpio_pin_configure_dt(&led1, GPIO_INPUT);


    // main loop:
    while(1) {

      // get HC-SR04 distance
      float dist;
      if(getDistance(&dist)) {

        // enable to print to serial port
        printk("dist = %d cm\n", dist);
      }

      // delay
      k_msleep(1000);
    }

}

I understand that the error starts there, but how should it be done?
Thank you
Parents Reply Children
No Data
Related