From 1eddb799238e24613935ec59410e8d1d58682ba3 Mon Sep 17 00:00:00 2001 From: Michael Dryden <mdryden@chem.utoronto.ca> Date: Wed, 4 Feb 2015 19:00:25 -0500 Subject: [PATCH] experiment: changed set_timer_period to return divider used --- DSTAT-temp/src/experiment.c | 27 ++++++++++++++++++--------- DSTAT-temp/src/experiment.h | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/DSTAT-temp/src/experiment.c b/DSTAT-temp/src/experiment.c index 53070d1..d8a11e7 100644 --- a/DSTAT-temp/src/experiment.c +++ b/DSTAT-temp/src/experiment.c @@ -75,43 +75,52 @@ void send_data_int32(int32_t data){ udi_cdc_putc(((unsigned char *)(&data))[3]); } -void set_timer_period(uint32_t period, volatile void *tc) +uint16_t set_timer_period(uint32_t period, volatile void *tc) { + /** + * Sets a suitable timer source and sets period for a 16-bit timer + * + * @param period 32-bit period in CPU cycles + * @param *tc pointer to timer to set + * @return divider used. + */ uint16_t temp_div = ceil((double)period/65536); + uint16_t divider = 0; if (temp_div == 1) tc_write_clock_source(tc, TC_CLKSEL_DIV1_gc); else if (temp_div == 2){ tc_write_clock_source(tc, TC_CLKSEL_DIV2_gc); - period /= 2; + divider = 2; } else if (temp_div <= 4){ tc_write_clock_source(tc, TC_CLKSEL_DIV4_gc); - period /= 4; + divider = 4; } else if (temp_div <= 8){ tc_write_clock_source(tc,TC_CLKSEL_DIV8_gc); - period /= 8; + divider = 8; } else if (temp_div <= 64){ tc_write_clock_source(tc,TC_CLKSEL_DIV64_gc); - period /= 64; + divider = 64; } else if (temp_div <= 256){ tc_write_clock_source(tc,TC_CLKSEL_DIV256_gc); - period /= 256; + divider = 256; } else if (temp_div <= 1024){ tc_write_clock_source(tc,TC_CLKSEL_DIV1024_gc); - period /= 1024; + divider = 1024; } else{ printf("#Frequency/ADC rate is too low\n\r"); - return; + return 0; } + period /= divider; tc_write_period(tc, (uint16_t)period); - return; + return divider; } void pot_init(void){ diff --git a/DSTAT-temp/src/experiment.h b/DSTAT-temp/src/experiment.h index b52a58e..8b1ab53 100644 --- a/DSTAT-temp/src/experiment.h +++ b/DSTAT-temp/src/experiment.h @@ -77,7 +77,7 @@ extern uint8_t autogain_enable; void send_data_uint16(uint16_t data); void send_data_int32(int32_t data); -void set_timer_period(uint32_t period, volatile void *tc); +uint16_t set_timer_period(uint32_t period, volatile void *tc); void pot_init(void); void pot_set_gain(void); void volt_exp_start(void); -- GitLab