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