From fd1aabd0417bef53e7ff54df52eba80be5494d56 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 12 Oct 2018 10:44:11 +0200 Subject: half-baked timer implementation for MSP430 and Arduino --- Makefile | 13 ++++++++++ include/arch/arduino-nano/driver/timer.h | 15 ++++++++--- include/arch/msp430fr5969lp/driver/timer.h | 40 ++++++++++++++++++++++++++++++ src/arch/arduino-nano/Makefile.inc | 8 ------ src/arch/blinkenrocket/Makefile.inc | 4 --- src/arch/msp430fr5969lp/Makefile.inc | 4 +++ src/arch/msp430fr5969lp/driver/timer.cc | 3 +++ 7 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 include/arch/msp430fr5969lp/driver/timer.h create mode 100644 src/arch/msp430fr5969lp/driver/timer.cc diff --git a/Makefile b/Makefile index 8baba0e..224b71f 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,11 @@ ifneq ($(findstring am2320,${drivers}), ) COMMON_FLAGS += -DDRIVER_AM2320 endif +ifneq ($(findstring ccs811,${drivers}), ) + TARGETS += src/driver/ccs811.cc + COMMON_FLAGS += -DDRIVER_CCS811 +endif + ifneq ($(findstring eeprom24lc64,${drivers}), ) TARGETS += src/driver/eeprom24lc64.cc COMMON_FLAGS += -DDRIVER_EEPROM24LC64 @@ -52,6 +57,14 @@ ifneq ($(findstring softi2c,${drivers}), ) COMMON_FLAGS += -DDRIVER_SOFTI2C endif +ifneq (${i2c_freq}, ) + COMMON_FLAGS += -DF_I2C=${i2c_freq} +endif + +ifneq (${timer_freq}, ) + COMMON_FLAGS += -DF_TIMER=${timer_freq} +endif + ifeq (${softi2c_pullup}, 1) COMMON_FLAGS += -DSOFTI2C_PULLUP endif diff --git a/include/arch/arduino-nano/driver/timer.h b/include/arch/arduino-nano/driver/timer.h index 267cb1d..98ef20e 100644 --- a/include/arch/arduino-nano/driver/timer.h +++ b/include/arch/arduino-nano/driver/timer.h @@ -1,23 +1,30 @@ #include #include -#define ON_TIMER_INTERRUPT ISR(TIMER0_COMPA_vect) +#define ON_TIMER_INTERRUPT_head ISR(TIMER0_COMPA_vect) { +#define ON_TIMER_INTERRUPT_tail } class Timer { private: Timer(const Timer ©); - + unsigned char prescaler; public: Timer() {} - inline void setup(unsigned char const frequency) { + inline void setup_khz(unsigned char const frequency) { + OCR0A = frequency ? 255 / frequency : 1; + TCCR0A = _BV(WGM01); + prescaler = _BV(CS01) | _BV(CS00); + } + inline void setup_hz(unsigned char const frequency) { OCR0A = frequency ? 255 / frequency : 1; TCCR0A = _BV(WGM01); + prescaler = _BV(CS02) | _BV(CS00); } inline void start(unsigned char const interrupt) { TCNT0 = 0; - TCCR0B = _BV(CS01) | _BV(CS00); + TCCR0B = prescaler; if (interrupt) { TIMSK0 = _BV(OCIE0A); } diff --git a/include/arch/msp430fr5969lp/driver/timer.h b/include/arch/msp430fr5969lp/driver/timer.h new file mode 100644 index 0000000..34feb12 --- /dev/null +++ b/include/arch/msp430fr5969lp/driver/timer.h @@ -0,0 +1,40 @@ +#include + +#define ON_TIMER_INTERRUPT_head __attribute__((interrupt(TIMER0_A1_VECTOR))) __attribute__((wakeup)) void handle_timer0_overflow() { if (TA0IV == 0x0e) { +#define ON_TIMER_INTERRUPT_tail } } + +class Timer { + private: + Timer(const Timer ©); + + public: + Timer() {} + + inline void setup_khz(uint16_t const frequency) { + TA0CTL = TASSEL__SMCLK | ID__8 | MC__UP; + TA0EX0 = 1; + TA0CCR0 = 1000 / frequency; + TA0CTL |= TACLR; + } + + inline void setup_hz(uint16_t const frequency) { + TA0CTL = TASSEL__SMCLK | ID__8 | MC__UP; + TA0EX0 = 1; + TA0CCR0 = 1000000 / frequency; + TA0CTL |= TACLR; + } + + inline void start(unsigned char const interrupt) { + if (interrupt) { + TA0CTL |= TACLR | TAIE; + } else { + TA0CTL |= TACLR; + } + } + + inline void stop() { + TA0CTL = 0; + } +}; + +extern Timer timer; diff --git a/src/arch/arduino-nano/Makefile.inc b/src/arch/arduino-nano/Makefile.inc index d4d5be7..6dbd95e 100644 --- a/src/arch/arduino-nano/Makefile.inc +++ b/src/arch/arduino-nano/Makefile.inc @@ -37,14 +37,6 @@ ifneq ($(findstring timer,${arch_drivers}), ) TARGETS += src/arch/arduino-nano/driver/timer.cc endif -ifneq (${i2c_freq}, ) - COMMON_FLAGS += -DF_I2C=${i2c_freq} -endif - -ifneq (${timer_freq}, ) - COMMON_FLAGS += -DF_TIMER=${timer_freq} -endif - OBJECTS = ${TARGETS:.cc=.o} .cc.o: diff --git a/src/arch/blinkenrocket/Makefile.inc b/src/arch/blinkenrocket/Makefile.inc index 5a4259f..1d99d0b 100644 --- a/src/arch/blinkenrocket/Makefile.inc +++ b/src/arch/blinkenrocket/Makefile.inc @@ -27,10 +27,6 @@ else ifneq ($(findstring i2c,${arch_drivers}), ) TARGETS += src/arch/blinkenrocket/driver/i2c.cc endif -ifneq (${i2c_freq}, ) - COMMON_FLAGS += -DF_I2C=${i2c_freq} -endif - OBJECTS = ${TARGETS:.cc=.o} .cc.o: diff --git a/src/arch/msp430fr5969lp/Makefile.inc b/src/arch/msp430fr5969lp/Makefile.inc index 28c1cef..037c9cd 100644 --- a/src/arch/msp430fr5969lp/Makefile.inc +++ b/src/arch/msp430fr5969lp/Makefile.inc @@ -43,6 +43,10 @@ ifneq ($(findstring spi_b,${arch_drivers}), ) TARGETS += src/arch/msp430fr5969lp/driver/spi_b.cc endif +ifneq ($(findstring timer,${arch_drivers}), ) + TARGETS += src/arch/msp430fr5969lp/driver/timer.cc +endif + OBJECTS = ${TARGETS:.cc=.o} .cc.o: diff --git a/src/arch/msp430fr5969lp/driver/timer.cc b/src/arch/msp430fr5969lp/driver/timer.cc new file mode 100644 index 0000000..4f2d6d1 --- /dev/null +++ b/src/arch/msp430fr5969lp/driver/timer.cc @@ -0,0 +1,3 @@ +#include "driver/timer.h" + +Timer timer; -- cgit v1.2.3