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); } }

