From ff3b86b60a09e24b2b66ad9b321de814a720a6c7 Mon Sep 17 00:00:00 2001 From: Seth T Date: Thu, 6 Oct 2016 12:40:18 -0400 Subject: [PATCH] support timing on Arduino 101 The MsTimer2 library (using timer2 with hard-coded 1ms resolution) supports ATmega1280, ATmega328, ATmega48/88/168 and ATmega128/8 (http://playground.arduino.cc/Main/MsTimer2). For the Arduino/Genuino 101 we need to use the CurieTimerOne library (https://www.arduino.cc/en/Reference/CurieTimerOne). --- BaseI2CDevice.cpp | 30 ++++++++++++++++++++---- EVShield.cpp | 59 +++++++++++++++++++++++++++++------------------ MsTimer2.cpp | 22 ++++++++++-------- MsTimer2.h | 4 +++- SHDefines.h | 3 +++ 5 files changed, 79 insertions(+), 39 deletions(-) diff --git a/BaseI2CDevice.cpp b/BaseI2CDevice.cpp index 738dbd0..47d69b8 100644 --- a/BaseI2CDevice.cpp +++ b/BaseI2CDevice.cpp @@ -21,7 +21,11 @@ */ #include "BaseI2CDevice.h" -#include "MsTimer2.h" +#if defined(ARDUINO_ARC32_TOOLS) + #include "CurieTimerOne.h" +#else + #include "MsTimer2.h" +#endif #include extern "C" { @@ -77,7 +81,11 @@ uint8_t* BaseI2CDevice::readRegisters( uint8_t buffer_length, // (optional) length of user-supplied buffer bool clear_buffer) // should we zero out the buffer first? (optional) { - MsTimer2::reset(); + #if defined(ARDUINO_ARC32_TOOLS) + CurieTimerOne.rdRstTickCount(); + #else + MsTimer2::reset(); + #endif if (!buffer) { buffer = _buffer; @@ -119,7 +127,11 @@ uint8_t* BaseI2CDevice::readRegisters( _write_error_code = Wire.endTransmission(); - MsTimer2::reset(); + #if defined(ARDUINO_ARC32_TOOLS) + CurieTimerOne.rdRstTickCount(); + #else + MsTimer2::reset(); + #endif return buffer; } @@ -167,7 +179,11 @@ bool BaseI2CDevice::writeRegisters( uint8_t bytes_to_write, // number of bytes to write uint8_t* buffer) // optional user-supplied buffer { - MsTimer2::reset(); + #if defined(ARDUINO_ARC32_TOOLS) + CurieTimerOne.rdRstTickCount(); + #else + MsTimer2::reset(); + #endif if (!buffer) { buffer = _buffer; @@ -193,7 +209,11 @@ bool BaseI2CDevice::writeRegisters( _write_error_code = Wire.endTransmission(); - MsTimer2::reset(); + #if defined(ARDUINO_ARC32_TOOLS) + CurieTimerOne.rdRstTickCount(); + #else + MsTimer2::reset(); + #endif return _write_error_code == 0; // 0 indicates success } diff --git a/EVShield.cpp b/EVShield.cpp index 846e564..1eda012 100644 --- a/EVShield.cpp +++ b/EVShield.cpp @@ -20,7 +20,11 @@ #include "EVShield.h" #include "Wire.h" -#include "MsTimer2.h" +#if defined(ARDUINO_ARC32_TOOLS) + #include "CurieTimerOne.h" +#else + #include "MsTimer2.h" +#endif static void pingEV(); #if defined(__AVR__) @@ -128,9 +132,13 @@ void EVShield::initProtocols(SH_Protocols protocol) void EVShield::I2CTimer() { - //TCNT2 = 0; - MsTimer2::set(300, pingEV); // 300ms period - MsTimer2::start(); +#if defined(ARDUINO_ARC32_TOOLS) + CurieTimerOne.start(300000, pingEV); // in microseconds +#else + //TCNT2 = 0; + MsTimer2::set(300, pingEV); // 300ms period + MsTimer2::start(); +#endif } void EVShield::initLEDTimers() @@ -751,25 +759,30 @@ int EVShieldBankB::sensorReadRaw(uint8_t which_sensor) void pingEV() { - TWCR = (1< +#if defined(__AVR__) + #include +#endif namespace MsTimer2 { extern unsigned long msecs; diff --git a/SHDefines.h b/SHDefines.h index dd3505d..0ecdfc8 100644 --- a/SHDefines.h +++ b/SHDefines.h @@ -41,6 +41,9 @@ #endif #endif +#if defined(ARDUINO_ARC32_TOOLS) + #define MODEL_EVSHIELD_D +#endif /**