diff --git a/AnalogReadFast.h b/AnalogReadFast.h
deleted file mode 100644
index 445b233..0000000
--- a/AnalogReadFast.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * AnalogReadFast.h
- *
- * Copyright (C) 2016 Albert van Dalen http://www.avdweb.nl
- *
- * This file is part of CommandStation.
- *
- * CommandStation is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * CommandStation is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with CommandStation. If not, see .
- */
-
-#ifndef COMMANDSTATION_DCC_ANALOGREADFAST_H_
-#define COMMANDSTATION_DCC_ANALOGREADFAST_H_
-
-#include
-
-int inline analogReadFast(uint8_t ADCpin);
-#if defined(ARDUINO_ARCH_MEGAAVR)
-
-int inline analogReadFast(uint8_t ADCpin)
-{ byte ADC0CTRLCoriginal = ADC0.CTRLC;
- ADC0.CTRLC = (ADC0CTRLCoriginal & 0b00110000) + 0b01000011;
- int adc = analogRead(ADCpin);
- ADC0.CTRLC = ADC0CTRLCoriginal;
- return adc;
-}
-#else
-int inline analogReadFast(uint8_t ADCpin)
-{ byte ADCSRAoriginal = ADCSRA;
- ADCSRA = (ADCSRA & B11111000) | 4;
- int adc = analogRead(ADCpin);
- ADCSRA = ADCSRAoriginal;
- return adc;
-}
-#endif
-#endif // COMMANDSTATION_DCC_ANALOGREADFAST_H_
diff --git a/DCCTimer.cpp b/DCCTimer.cpp
index bbec1c1..af10f8f 100644
--- a/DCCTimer.cpp
+++ b/DCCTimer.cpp
@@ -38,6 +38,7 @@ INTERRUPT_CALLBACK interruptHandler=0;
void DCCTimer::begin(INTERRUPT_CALLBACK callback) {
interruptHandler=callback;
noInterrupts();
+ ADC0.CTRLC = (ADC0.CTRLC & 0b00110000) | 0b01000011; // speed up analogRead sample time
TCB0.CTRLB = TCB_CNTMODE_INT_gc & ~TCB_CCMPEN_bm; // timer compare mode with output disabled
TCB0.CTRLA = TCB_CLKSEL_CLKDIV2_gc; // 8 MHz ~ 0.125 us
TCB0.CCMP = CLOCK_CYCLES -1; // 1 tick less for timer reset
@@ -59,6 +60,7 @@ INTERRUPT_CALLBACK interruptHandler=0;
void DCCTimer::begin(INTERRUPT_CALLBACK callback) {
interruptHandler=callback;
noInterrupts();
+ ADCSRA = (ADCSRA & 0b11111000) | 0b00000100; // speed up analogRead sample time
TCCR1A = 0;
ICR1 = CLOCK_CYCLES;
TCNT1 = 0;
diff --git a/MotorDriver.cpp b/MotorDriver.cpp
index aef9f6d..3e8c14d 100644
--- a/MotorDriver.cpp
+++ b/MotorDriver.cpp
@@ -18,7 +18,6 @@
*/
#include
#include "MotorDriver.h"
-#include "AnalogReadFast.h"
#include "DIAG.h"
#define setHIGH(fastpin) *fastpin.out |= fastpin.maskHIGH
@@ -27,29 +26,36 @@
MotorDriver::MotorDriver(byte power_pin, byte signal_pin, byte signal_pin2, int8_t brake_pin,
byte current_pin, float sense_factor, unsigned int trip_milliamps, byte fault_pin) {
powerPin=power_pin;
+ pinMode(powerPin, OUTPUT);
+
signalPin=signal_pin;
- getFastPin(signalPin,fastSignalPin);
+ getFastPin(F("SIG"),signalPin,fastSignalPin);
+ pinMode(signalPin, OUTPUT);
+
signalPin2=signal_pin2;
if (signalPin2!=UNUSED_PIN) {
dualSignal=true;
- getFastPin(signalPin2,fastSignalPin2);
+ getFastPin(F("SIG2"),signalPin2,fastSignalPin2);
+ pinMode(signalPin2, OUTPUT);
}
else dualSignal=false;
brakePin=brake_pin;
+ if (brakePin!=UNUSED_PIN){
+ pinMode(brakePin < 0 ? -brakePin : brakePin, OUTPUT);
+ setBrake(false);
+ }
+
currentPin=current_pin;
- senseFactor=sense_factor;
+ pinMode(currentPin, INPUT);
+
faultPin=fault_pin;
+ if (faultPin != UNUSED_PIN) pinMode(faultPin, INPUT);
+
+ senseFactor=sense_factor;
tripMilliamps=trip_milliamps;
rawCurrentTripValue=(int)(trip_milliamps / sense_factor);
simulatedOverload=(int)(32000/senseFactor);
- pinMode(powerPin, OUTPUT);
- pinMode(brakePin < 0 ? -brakePin : brakePin, OUTPUT);
- setBrake(false);
- pinMode(signalPin, OUTPUT);
- if (signalPin2 != UNUSED_PIN) pinMode(signalPin2, OUTPUT);
- pinMode(currentPin, INPUT);
- if (faultPin != UNUSED_PIN) pinMode(faultPin, INPUT);
}
void MotorDriver::setPower(bool on) {
@@ -98,8 +104,8 @@ int MotorDriver::getCurrentRaw() {
// IMPORTANT: This function can be called in Interrupt() time within the 56uS timer
// The default analogRead takes ~100uS which is catastrphic
- // so analogReadFast is used here. (-2uS)
- return analogReadFast(currentPin);
+ // so DCCTimer has set the sample time to be much faster.
+ return analogRead(currentPin);
}
unsigned int MotorDriver::raw2mA( int raw) {
@@ -109,8 +115,8 @@ int MotorDriver::mA2raw( unsigned int mA) {
return (int)(mA / senseFactor);
}
-void MotorDriver::getFastPin(int pin, FASTPIN & result) {
- DIAG(F("\nMotorDriver Pin=%d,"),pin);
+void MotorDriver::getFastPin(const FSH* type,int pin, FASTPIN & result) {
+ DIAG(F("\nMotorDriver %S Pin=%d,"),type,pin);
uint8_t port = digitalPinToPort(pin);
result.out = portOutputRegister(port);
result.maskHIGH = digitalPinToBitMask(pin);
diff --git a/MotorDriver.h b/MotorDriver.h
index 61b36aa..6ebb62e 100644
--- a/MotorDriver.h
+++ b/MotorDriver.h
@@ -18,6 +18,8 @@
*/
#ifndef MotorDriver_h
#define MotorDriver_h
+#include "FSH.h"
+
// Virtualised Motor shield 1-track hardware Interface
#ifndef UNUSED_PIN // sync define with the one in MotorDrivers.h
@@ -40,11 +42,11 @@ class MotorDriver {
virtual unsigned int raw2mA( int raw);
virtual int mA2raw( unsigned int mA);
inline int getRawCurrentTripValue() {
- return rawCurrentTripValue;
+ return rawCurrentTripValue;
}
private:
- void getFastPin(int pin, FASTPIN & result);
+ void getFastPin(const FSH* type,int pin, FASTPIN & result);
byte powerPin, signalPin, signalPin2, currentPin, faultPin;
FASTPIN fastSignalPin, fastSignalPin2;
bool dualSignal; // true to use signalPin2