1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-27 01:56:14 +01:00

first stab at ESP32

This commit is contained in:
Harald Barth 2021-10-04 23:03:36 +02:00
parent 50bb1c950b
commit 43191e225e
3 changed files with 36 additions and 1 deletions

View File

@ -169,7 +169,26 @@ bool IRAM_ATTR DCCTimer::isPWMPin(byte pin) {
void IRAM_ATTR DCCTimer::setPWM(byte pin, bool high) { void IRAM_ATTR DCCTimer::setPWM(byte pin, bool high) {
} }
#elif defined(ARDUINO_ARCH_ESP32)
// https://www.visualmicro.com/page/Timer-Interrupts-Explained.aspx
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void DCCTimer::begin(INTERRUPT_CALLBACK callback) {
interruptHandler = callback;
hw_timer_t *timer = NULL;
timer = timerBegin(0, 2, true); // prescaler can be 2 to 65536 so choose 2
timerAttachInterrupt(timer, interruptHandler, true);
timerAlarmWrite(timer, CLOCK_CYCLES / 2, true); // divide by prescaler
timerAlarmEnable(timer);
}
// We do not support to use PWM to make the Waveform on ESP
bool IRAM_ATTR DCCTimer::isPWMPin(byte pin) {
return false;
}
void IRAM_ATTR DCCTimer::setPWM(byte pin, bool high) {
}
#else #else
// Arduino nano, uno, mega etc // Arduino nano, uno, mega etc

View File

@ -66,7 +66,9 @@ void IRAM_ATTR DCCWaveform::loop(bool ackManagerActive) {
if (ackflag) { if (ackflag) {
progTrack.checkAck(); progTrack.checkAck();
// reset flag AFTER check is done // reset flag AFTER check is done
portENTER_CRITICAL(&timerMux);
ackflag = 0; ackflag = 0;
portEXIT_CRITICAL(&timerMux);
} }
#endif #endif
} }
@ -88,8 +90,11 @@ void IRAM_ATTR DCCWaveform::interruptHandler() {
if (progTrack.state==WAVE_PENDING) if (progTrack.state==WAVE_PENDING)
progTrack.interrupt2(); progTrack.interrupt2();
#ifdef SLOW_ANALOG_READ #ifdef SLOW_ANALOG_READ
else if (progTrack.ackPending && ackflag == 0) // We need AND we are not already checking else if (progTrack.ackPending && ackflag == 0) { // We need AND we are not already checking
portENTER_CRITICAL(&timerMux);
ackflag = 1; ackflag = 1;
portEXIT_CRITICAL(&timerMux);
}
#else #else
else if (progTrack.ackPending) else if (progTrack.ackPending)
progTrack.checkAck(); progTrack.checkAck();

View File

@ -26,6 +26,17 @@
#define SLOW_ANALOG_READ #define SLOW_ANALOG_READ
#endif #endif
////////////////////////////////////////////////////////////////////////////////
//
#if defined (ARDUINO_ARCH_ESP32)
#define ESP_FAMILY
#define SLOW_ANALOG_READ
#else
#define portENTER_CRITICAL(A) do {} while (0)
#define portEXIT_CRITICAL(A) do {} while (0)
#endif
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// //
// WIFI_ON: All prereqs for running with WIFI are met // WIFI_ON: All prereqs for running with WIFI are met