From 17d5ca3b58ac743175a8cb54faecb18cd4451457 Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Fri, 22 May 2015 22:17:31 +0200 Subject: [PATCH] Clock handling factored out to a separate file. --- firmware/Makefile | 2 +- firmware/clock.c | 9 +++++++++ firmware/clock.h | 9 +++++++++ firmware/firmware.c | 14 ++++++++------ firmware/modbus.c | 7 +++---- 5 files changed, 30 insertions(+), 11 deletions(-) create mode 100755 firmware/clock.c create mode 100644 firmware/clock.h diff --git a/firmware/Makefile b/firmware/Makefile index 9cfa527..e0bd502 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,5 +1,5 @@ PROGRAM=firmware -SRC=firmware.c modbus.c +SRC=firmware.c modbus.c clock.c OBJ=$(SRC:.c=.o) MCU=atmega328p diff --git a/firmware/clock.c b/firmware/clock.c new file mode 100755 index 0000000..b618222 --- /dev/null +++ b/firmware/clock.c @@ -0,0 +1,9 @@ +#include +#include "clock.h" + +void init_clock() +{ + // use the 16-bit Timer/Counter1 with 1024x prescaling + TCCR1B = _BV(CS12)|_BV(CS10); // CLK/1024 +} + diff --git a/firmware/clock.h b/firmware/clock.h new file mode 100644 index 0000000..ed6c1df --- /dev/null +++ b/firmware/clock.h @@ -0,0 +1,9 @@ +#ifndef CLOCK_H__ +#define CLOCK_H__ 1 + +typedef uint16_t clock_t; +#define get_clock() (TCNT1) +#define CLOCK_HZ (F_CPU/1024) +extern void init_clock(); + +#endif /* !CLOCK_H__ */ diff --git a/firmware/firmware.c b/firmware/firmware.c index 2019402..d70705d 100644 --- a/firmware/firmware.c +++ b/firmware/firmware.c @@ -2,9 +2,11 @@ #include #include #include +#include "clock.h" #include "modbus.h" -#define TIMEOUT 0x2FF +#define ECHO_TIMEOUT (CLOCK_HZ/10) // 10 ms +#define MEASUREMENT_WAIT (CLOCK_HZ/3) // three triggers per second #define N_TRIGGERS 3 #define N_SENSORS 12 @@ -48,13 +50,13 @@ static void do_measurement(unsigned char trig) pull_trigger(trig); - starttime = TCNT1; + starttime = get_clock(); while (to_start || to_measure) { uint8_t bits = 0; - uint16_t now = TCNT1; + uint16_t now = get_clock(); - if (now-starttime >= TIMEOUT) + if (now-starttime >= ECHO_TIMEOUT) break; bits = get_pin(trig); @@ -180,8 +182,8 @@ int main() for (trig = 0; trig < N_TRIGGERS; trig++) { uint16_t now; do_measurement(trig); - now = TCNT1; - while (TCNT1-now < 200) + now = get_clock(); + while (get_clock()-now < MEASUREMENT_WAIT) modbus_poll(); } diff --git a/firmware/modbus.c b/firmware/modbus.c index a49bd87..0c238c2 100644 --- a/firmware/modbus.c +++ b/firmware/modbus.c @@ -11,6 +11,7 @@ #include #include +#include "clock.h" #include "modbus.h" #define BUFSIZE 128 // must be a power of two @@ -44,13 +45,11 @@ static uint8_t mb_unit_id; #define UBRR_VAL ((F_CPU + 8UL * UART_BAUD) / (16UL*UART_BAUD) - 1) #define wait_one_byte() _delay_us(10*1000000/UART_BAUD) -#define get_clock() (TCNT1) -#define CLOCK_SPEED (F_CPU/1024) /* * According to Wikipedia, it is indeed 28 bits = 3.5 bytes without * start- and stopbits. */ -#define TIMEOUT (28*CLOCK_SPEED/UART_BAUD) +#define REQ_TIMEOUT (28*CLOCK_HZ/UART_BAUD) uint16_t hold_regs[MB_N_HOLD_REGS]; @@ -196,7 +195,7 @@ void modbus_poll() if (rx_bytes == 0) // nothing received yet return; - if (get_clock() - last_rx < TIMEOUT) // still receiving + if (get_clock() - last_rx < REQ_TIMEOUT) // still receiving return; if (rx_bytes < 4) { // too short -- 2.43.0