mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-30 11:36:13 +01:00
make compile for other arch but AVR
This commit is contained in:
parent
24e5e648b8
commit
5e616a9eb2
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* © 2021 Mike S
|
* © 2021 Mike S
|
||||||
* © 2021 Harald Barth
|
* © 2021-2022 Harald Barth
|
||||||
* © 2021 Fred Decker
|
* © 2021 Fred Decker
|
||||||
* © 2021 Chris Harlow
|
* © 2021 Chris Harlow
|
||||||
* © 2021 David Cutting
|
* © 2021 David Cutting
|
||||||
|
@ -48,10 +48,8 @@ void DCCTimer::begin(INTERRUPT_CALLBACK callback) {
|
||||||
// ADCSRA = (ADCSRA & 0b11111000) | 0b00000100; // speed up analogRead sample time
|
// ADCSRA = (ADCSRA & 0b11111000) | 0b00000100; // speed up analogRead sample time
|
||||||
// Set up ADC for free running mode
|
// Set up ADC for free running mode
|
||||||
ADMUX=(1<<REFS0); //select AVCC as reference. We set MUX later
|
ADMUX=(1<<REFS0); //select AVCC as reference. We set MUX later
|
||||||
//ADCSRB = 0; //set free running mode
|
ADCSRA = (1<<ADEN)|(1 << ADPS2); // ADPS2 means divisor 32 and 16Mhz/32=500kHz.
|
||||||
//ADCSRA = (1<<ADEN)|(1<< ADATE)|(1<<ADPS2)|(1<<ADPS0)|4;
|
//bitSet(ADCSRA, ADSC); //do not start the ADC yet. Done when we have set the MUX
|
||||||
ADCSRA = (1<<ADEN)|(1 << ADPS2);
|
|
||||||
//bitSet(ADCSRA, ADSC); //start the ADC
|
|
||||||
|
|
||||||
TCCR1A = 0;
|
TCCR1A = 0;
|
||||||
ICR1 = CLOCK_CYCLES;
|
ICR1 = CLOCK_CYCLES;
|
||||||
|
|
|
@ -81,7 +81,9 @@ void DCCWaveform::interruptHandler() {
|
||||||
TrackManager::setDCCSignal(sigMain);
|
TrackManager::setDCCSignal(sigMain);
|
||||||
TrackManager::setPROGSignal(sigProg);
|
TrackManager::setPROGSignal(sigProg);
|
||||||
|
|
||||||
|
#ifdef ANALOG_READ_INTERRUPT
|
||||||
TrackManager::sampleCurrent();
|
TrackManager::sampleCurrent();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Move on in the state engine
|
// Move on in the state engine
|
||||||
mainTrack.state=stateTransform[mainTrack.state];
|
mainTrack.state=stateTransform[mainTrack.state];
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
#define GITHUB_SHA "PORTX-HAL-202210021139Z"
|
#define GITHUB_SHA "PORTX-HAL-202210022048Z"
|
||||||
|
|
|
@ -213,30 +213,34 @@ bool MotorDriver::canMeasureCurrent() {
|
||||||
*
|
*
|
||||||
* senseOffset handles the case where a shield returns values above or below
|
* senseOffset handles the case where a shield returns values above or below
|
||||||
* a central value depending on direction.
|
* a central value depending on direction.
|
||||||
|
*
|
||||||
|
* Bool fromISR should be adjusted dependent how function is called
|
||||||
*/
|
*/
|
||||||
int MotorDriver::getCurrentRaw() {
|
int MotorDriver::getCurrentRaw(bool fromISR) {
|
||||||
|
(void)fromISR;
|
||||||
if (currentPin==UNUSED_PIN) return 0;
|
if (currentPin==UNUSED_PIN) return 0;
|
||||||
int current;
|
int current;
|
||||||
// This function should NOT be called in an interruot so we
|
|
||||||
// dont need to fart about saving and restoring CPU specific
|
|
||||||
// interrupt registers.
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
current = local_adc1_get_raw(pinToADC1Channel(currentPin))-senseOffset;
|
current = local_adc1_get_raw(pinToADC1Channel(currentPin))-senseOffset;
|
||||||
#else
|
#else
|
||||||
// noInterrupts();
|
#ifdef ANALOG_READ_INTERRUPT
|
||||||
//current = analogRead(currentPin)-senseOffset;
|
|
||||||
current = sampleCurrent-senseOffset;
|
current = sampleCurrent-senseOffset;
|
||||||
//DIAG(F("%d %d"), current, sampleCurrentTimestamp);
|
|
||||||
if ((millis() - sampleCurrentTimestamp) > 3)
|
if ((millis() - sampleCurrentTimestamp) > 3)
|
||||||
DIAG(F("Current sample old %d"), millis() - sampleCurrentTimestamp);
|
DIAG(F("Current sample old %d"), millis() - sampleCurrentTimestamp);
|
||||||
//interrupts();
|
#else
|
||||||
#endif
|
if (!fromISR) noInterrupts();
|
||||||
|
current = analogRead(currentPin)-senseOffset;
|
||||||
|
if (!fromISR) interrupts();
|
||||||
|
#endif //ANALOG_READ_INTERRUPT
|
||||||
|
#endif //ARDUINO_ARCH_ESP32
|
||||||
if (current<0) current=0-current;
|
if (current<0) current=0-current;
|
||||||
if ((faultPin != UNUSED_PIN) && isLOW(fastFaultPin) && powerMode==POWERMODE::ON)
|
if ((faultPin != UNUSED_PIN) && isLOW(fastFaultPin) && powerMode==POWERMODE::ON)
|
||||||
return (current == 0 ? -1 : -current);
|
return (current == 0 ? -1 : -current);
|
||||||
return current;
|
return current;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ANALOG_READ_INTERRUPT
|
||||||
/*
|
/*
|
||||||
* This should only be called in interrupt context
|
* This should only be called in interrupt context
|
||||||
* Copies current value from HW to cached value in
|
* Copies current value from HW to cached value in
|
||||||
|
@ -245,11 +249,6 @@ int MotorDriver::getCurrentRaw() {
|
||||||
#pragma GCC push_options
|
#pragma GCC push_options
|
||||||
#pragma GCC optimize ("-O3")
|
#pragma GCC optimize ("-O3")
|
||||||
bool MotorDriver::sampleCurrentFromHW() {
|
bool MotorDriver::sampleCurrentFromHW() {
|
||||||
#if defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560)
|
|
||||||
const byte mask = 7;
|
|
||||||
#else
|
|
||||||
const byte mask = 31;
|
|
||||||
#endif
|
|
||||||
byte low, high;
|
byte low, high;
|
||||||
//if (!bit_is_set(ADCSRA, ADIF))
|
//if (!bit_is_set(ADCSRA, ADIF))
|
||||||
if (bit_is_set(ADCSRA, ADSC))
|
if (bit_is_set(ADCSRA, ADSC))
|
||||||
|
@ -273,6 +272,7 @@ void MotorDriver::startCurrentFromHW() {
|
||||||
bitSet(ADCSRA,ADSC); // start conversion
|
bitSet(ADCSRA,ADSC); // start conversion
|
||||||
}
|
}
|
||||||
#pragma GCC pop_options
|
#pragma GCC pop_options
|
||||||
|
#endif //ANALOG_READ_INTERRUPT
|
||||||
|
|
||||||
void MotorDriver::setDCSignal(byte speedcode) {
|
void MotorDriver::setDCSignal(byte speedcode) {
|
||||||
if (brakePin == UNUSED_PIN)
|
if (brakePin == UNUSED_PIN)
|
||||||
|
@ -327,20 +327,6 @@ void MotorDriver::setDCSignal(byte speedcode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MotorDriver::getCurrentRawInInterrupt() {
|
|
||||||
|
|
||||||
// IMPORTANT: This function must be called in Interrupt() time within the 56uS timer
|
|
||||||
// The default analogRead takes ~100uS which is catastrphic
|
|
||||||
// so DCCTimer has set the sample time to be much faster.
|
|
||||||
if (currentPin==UNUSED_PIN) return 0;
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32 //On ESP we do all in loop() instead of in interrupt
|
|
||||||
return getCurrentRaw();
|
|
||||||
#else
|
|
||||||
//return analogRead(currentPin)-senseOffset;
|
|
||||||
return getCurrentRaw();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int MotorDriver::raw2mA( int raw) {
|
unsigned int MotorDriver::raw2mA( int raw) {
|
||||||
return (int32_t)raw * senseFactorInternal / senseScale;
|
return (int32_t)raw * senseFactorInternal / senseScale;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,8 +153,12 @@ class MotorDriver {
|
||||||
setDCSignal(128);
|
setDCSignal(128);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
int getCurrentRaw();
|
int getCurrentRaw() {
|
||||||
int getCurrentRawInInterrupt();
|
return getCurrentRaw(false);
|
||||||
|
}
|
||||||
|
int getCurrentRawInInterrupt() {
|
||||||
|
return getCurrentRaw(true);
|
||||||
|
};
|
||||||
unsigned int raw2mA( int raw);
|
unsigned int raw2mA( int raw);
|
||||||
unsigned int mA2raw( unsigned int mA);
|
unsigned int mA2raw( unsigned int mA);
|
||||||
inline bool brakeCanPWM() {
|
inline bool brakeCanPWM() {
|
||||||
|
@ -183,9 +187,12 @@ class MotorDriver {
|
||||||
isProgTrack = on;
|
isProgTrack = on;
|
||||||
}
|
}
|
||||||
void checkPowerOverload(bool useProgLimit, byte trackno);
|
void checkPowerOverload(bool useProgLimit, byte trackno);
|
||||||
|
#ifdef ANALOG_READ_INTERRUPT
|
||||||
bool sampleCurrentFromHW();
|
bool sampleCurrentFromHW();
|
||||||
void startCurrentFromHW();
|
void startCurrentFromHW();
|
||||||
|
#endif
|
||||||
private:
|
private:
|
||||||
|
int getCurrentRaw(bool fromISR);
|
||||||
bool isProgTrack = false; // tells us if this is a prog track
|
bool isProgTrack = false; // tells us if this is a prog track
|
||||||
void getFastPin(const FSH* type,int pin, bool input, FASTPIN & result);
|
void getFastPin(const FSH* type,int pin, bool input, FASTPIN & result);
|
||||||
void getFastPin(const FSH* type,int pin, FASTPIN & result) {
|
void getFastPin(const FSH* type,int pin, FASTPIN & result) {
|
||||||
|
@ -214,8 +221,10 @@ class MotorDriver {
|
||||||
unsigned int sampleDelay;
|
unsigned int sampleDelay;
|
||||||
int progTripValue;
|
int progTripValue;
|
||||||
int lastCurrent;
|
int lastCurrent;
|
||||||
unsigned long sampleCurrentTimestamp;
|
#ifdef ANALOG_READ_INTERRUPT
|
||||||
uint16_t sampleCurrent;
|
volatile unsigned long sampleCurrentTimestamp;
|
||||||
|
volatile uint16_t sampleCurrent;
|
||||||
|
#endif
|
||||||
int maxmA;
|
int maxmA;
|
||||||
int tripmA;
|
int tripmA;
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ int16_t TrackManager::joinRelay=UNUSED_PIN;
|
||||||
byte TrackManager::tempProgTrack=MAX_TRACKS+1;
|
byte TrackManager::tempProgTrack=MAX_TRACKS+1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ANALOG_READ_INTERRUPT
|
||||||
/*
|
/*
|
||||||
* sampleCurrent() runs from Interrupt
|
* sampleCurrent() runs from Interrupt
|
||||||
*/
|
*/
|
||||||
|
@ -95,6 +96,7 @@ void TrackManager::sampleCurrent() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// The setup call is done this way so that the tracks can be in a list
|
// The setup call is done this way so that the tracks can be in a list
|
||||||
// from the config... the tracks default to NULL in the declaration
|
// from the config... the tracks default to NULL in the declaration
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* © 2021 Neil McKechnie
|
* © 2021 Neil McKechnie
|
||||||
* © 2021 Mike S
|
* © 2021 Mike S
|
||||||
* © 2021 Fred Decker
|
* © 2021 Fred Decker
|
||||||
* © 2020-2021 Harald Barth
|
* © 2020-2022 Harald Barth
|
||||||
* © 2020-2021 Chris Harlow
|
* © 2020-2021 Chris Harlow
|
||||||
*
|
*
|
||||||
* This file is part of CommandStation-EX
|
* This file is part of CommandStation-EX
|
||||||
|
@ -43,6 +43,11 @@
|
||||||
#undef USB_SERIAL // Teensy has this defined by default...
|
#undef USB_SERIAL // Teensy has this defined by default...
|
||||||
#define USB_SERIAL Serial
|
#define USB_SERIAL Serial
|
||||||
|
|
||||||
|
// All AVRs must read analog values from the DCC timer interrupt
|
||||||
|
#ifdef ARDUINO_ARCH_AVR
|
||||||
|
#define ANALOG_READ_INTERRUPT
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(ARDUINO_AVR_UNO)
|
#if defined(ARDUINO_AVR_UNO)
|
||||||
#define ARDUINO_TYPE "UNO"
|
#define ARDUINO_TYPE "UNO"
|
||||||
#undef HAS_ENOUGH_MEMORY
|
#undef HAS_ENOUGH_MEMORY
|
||||||
|
|
Loading…
Reference in New Issue
Block a user