From 2e1f9098ad99f01cacb8e8f0c4a63b93f56ffb2c Mon Sep 17 00:00:00 2001 From: Alex Shepherd Date: Sat, 23 Jul 2022 20:26:32 +1200 Subject: [PATCH] Changed Interrupt handling for RP2040 architectures to be similar to ESP32 Added check for proper USB Serial initialisation to examples --- NmraDcc.cpp | 21 +- .../DCCInterface_TurntableControl.ino | 6 +- examples/Fahrstuhl/Fahrstuhl.ino | 297 +++++++++++++++--- .../NmraDccAccessoryDecoder_1.ino | 5 +- .../NmraDccAccessoryDecoder_Pulsed_8.ino | 5 +- .../NmraDccMultiFunctionDecoder_1.ino | 5 +- .../NmraDccMultiFunctionMotorDecoder.ino | 4 + .../NmraDcc_ARD_DCCSHIELD.ino | 5 +- library.properties | 2 +- 9 files changed, 292 insertions(+), 58 deletions(-) diff --git a/NmraDcc.cpp b/NmraDcc.cpp index b4471d0..f6f8e0b 100644 --- a/NmraDcc.cpp +++ b/NmraDcc.cpp @@ -258,8 +258,11 @@ #elif defined ( ESP32 ) static byte ISREdge; // Holder of the Next Edge we're looking for: RISING or FALLING static byte ISRWatch; // Interrupt Handler Edge Filter -#elif defined ( ARDUINO_AVR_NANO_EVERY ) || defined(ARDUINO_ARCH_RP2040) - static PinStatus ISREdge; +#elif defined ( ARDUINO_AVR_NANO_EVERY ) + static PinStatus ISREdge; // Holder of the Next Edge we're looking for: RISING or FALLING +#elif defined ( ARDUINO_ARCH_RP2040) + static PinStatus ISREdge; // Holder of the Next Edge we're looking for: RISING or FALLING + static byte ISRWatch; // Interrupt Handler Edge Filter #else static byte ISREdge; // Holder of the Next Edge we're looking for: RISING or FALLING static byte ISRWatch; // Interrupt Handler Edge Filter @@ -339,7 +342,7 @@ DCC_PROCESSOR_STATE DccProcState ; { SET_TP3; - #ifdef ESP32 + #if defined(ESP32) || defined ( ARDUINO_ARCH_RP2040) // switch (ISRWatch) // { // case RISING: if (digitalRead(DccProcState.ExtIntPinNum)) break; @@ -416,7 +419,7 @@ DCC_PROCESSOR_STATE DccProcState ; #if defined ( __STM32F1__ ) detachInterrupt (DccProcState.ExtIntNum); #endif - #ifdef ESP32 + #if defined(ESP32) || defined ( ARDUINO_ARCH_RP2040) ISRWatch = ISREdge; #else attachInterrupt (DccProcState.ExtIntNum, ExternalInterruptHandler, ISREdge); @@ -507,7 +510,7 @@ DCC_PROCESSOR_STATE DccProcState ; #if defined ( __STM32F1__ ) detachInterrupt (DccProcState.ExtIntNum); #endif - #if defined(ESP32) + #if defined(ESP32) || defined ( ARDUINO_ARCH_RP2040) ISRWatch = ISREdge; #else attachInterrupt (DccProcState.ExtIntNum, ExternalInterruptHandler, ISREdge); @@ -564,7 +567,7 @@ DCC_PROCESSOR_STATE DccProcState ; #if defined ( __STM32F1__ ) detachInterrupt (DccProcState.ExtIntNum); #endif - #if defined(ESP32) + #if defined(ESP32) || defined ( ARDUINO_ARCH_RP2040) ISRWatch = ISREdge; #else attachInterrupt (DccProcState.ExtIntNum, ExternalInterruptHandler, ISREdge); @@ -613,7 +616,7 @@ DCC_PROCESSOR_STATE DccProcState ; detachInterrupt (DccProcState.ExtIntNum); #endif - #if defined(ESP32) + #if defined(ESP32) || defined ( ARDUINO_ARCH_RP2040) ISRWatch = ISREdge; #else attachInterrupt (DccProcState.ExtIntNum, ExternalInterruptHandler, ISREdge); @@ -743,7 +746,7 @@ DCC_PROCESSOR_STATE DccProcState ; #if defined ( __STM32F1__ ) detachInterrupt (DccProcState.ExtIntNum); #endif - #ifdef ESP32 + #if defined(ESP32) || defined ( ARDUINO_ARCH_RP2040) ISRWatch = CHANGE; #else attachInterrupt (DccProcState.ExtIntNum, ExternalInterruptHandler, CHANGE); @@ -1614,7 +1617,7 @@ void NmraDcc::init (uint8_t ManufacturerId, uint8_t VersionId, uint8_t Flags, ui ISRLevel = DccProcState.ExtIntMask; ISRChkMask = DccProcState.ExtIntMask; - #ifdef ESP32 + #if defined(ESP32)|| defined ( ARDUINO_ARCH_RP2040) ISRWatch = ISREdge; attachInterrupt (DccProcState.ExtIntNum, ExternalInterruptHandler, CHANGE); #else diff --git a/examples/DCCInterface_TurntableControl/DCCInterface_TurntableControl.ino b/examples/DCCInterface_TurntableControl/DCCInterface_TurntableControl.ino index 296425f..38048da 100644 --- a/examples/DCCInterface_TurntableControl/DCCInterface_TurntableControl.ino +++ b/examples/DCCInterface_TurntableControl/DCCInterface_TurntableControl.ino @@ -276,8 +276,10 @@ void setupDCCDecoder() void setup() { Serial.begin(115200); - while(!Serial); // Wait for the USB Device to Enumerate - + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) // Wait for the USB Device to Enumerate + delay(20); + Serial.println(F("\nExample Stepper Motor Driver for DCC Turntable Control")); Serial.print(F("Full Rotation Steps: ")); diff --git a/examples/Fahrstuhl/Fahrstuhl.ino b/examples/Fahrstuhl/Fahrstuhl.ino index 2e59c75..3b2591f 100644 --- a/examples/Fahrstuhl/Fahrstuhl.ino +++ b/examples/Fahrstuhl/Fahrstuhl.ino @@ -1,7 +1,55 @@ +#include // Requires AccelStepper Library - http://www.airspayce.com/mikem/arduino/AccelStepper/ +#include // Requires EncButton library - https://github.com/GyverLibs/EncButton +#include // Requires elapsedMillis library - https://github.com/pfeerick/elapsedMillis -#define NUM_LIFT_LEVELS 7 +#define OPTIMIZE_I2C 1 -#if defined(ARDUINO_AVR_UNO) +#include +#include +#include +#include + +#define NUM_LIFT_LEVELS 8 + +#define PROGRAM_NAME "Fahrstuhl" +#define PROGRAM_VERSION "1.0" + +#define EEPROM_BASE_ADDR 100 +#define EEPROM_VALID_DATA_SIGNATURE 0xA5A5 +// Uncomment the line below to force the EEPROM values to be reset to defaults +//#define EEPROM_FORCE_RELOAD_DEFAULT_VALUES + +#define BUTTON_LONG_PRESS_DELAY 2000 + +#if defined (ARDUINO_AVR_NANO) // Setting for Uwe's Fahrstuhl System + +// Uncomment the next line to reverse the direction of the stepper movement +//#define REVERSE_STEPPER_DIRECTION + +#define HOME_SENSOR_PIN 7 + +#define STEPPER_PULSE_PIN 4 +#define STEPPER_ENABLE_PIN 5 +#define STEPPER_DIR_PIN 6 + +#define STEPPER_MAX_SPEED 2100 +#define STEPPER_NORMAL_ACCELERATION 5000 +#define STEPPER_MAX_POSITION 30000U // Maximum Steps to allow the stepper to drive Up Saftey mechanism + +#define BUTTON_MANUAL 8 +#define BUTTON_DOWN 9 +#define BUTTON_UP 10 +#define BUTTON_STOP_HOME 11 + +long defaultPositions[NUM_LIFT_LEVELS] = {1000, 4000, 7000, 10000, 13000, 16000, 19000, 22000}; // Default positions + +#define OLED_DISPLAY_I2C_ADDRESS 0x3C + +#else +//#if defined(ARDUINO_AVR_UNO) // Setting for AJS Dev System + +// Uncomment the next line to reverse the direction of the stepper movement +#define REVERSE_STEPPER_DIRECTION #define HOME_SENSOR_PIN 10 @@ -11,63 +59,164 @@ #define STEPPER_MAX_SPEED 2100 #define STEPPER_NORMAL_ACCELERATION 5000 -#define STEPPER_MAX_POSITION 20000U // Maximum Steps to allow the stepper to drive Up Saftey mechanism +#define STEPPER_MAX_POSITION 30000U // Maximum Steps to allow the stepper to drive Up Saftey mechanism -#define BUTTON_OK A3 -#define BUTTON_DOWN A2 -#define BUTTON_UP A1 -#define BUTTON_HOME A0 +#define BUTTON_MANUAL A3 +#define BUTTON_DOWN A2 +#define BUTTON_UP A1 +#define BUTTON_STOP_HOME A0 + +long defaultPositions[NUM_LIFT_LEVELS] = {1000, 4000, 7000, 10000, 13000, 16000, 19000, 22000}; // Default positions + +#define OLED_DISPLAY_I2C_ADDRESS 0x3C -#elif defined (ARDUINO_AVR_NANO) #endif +SSD1306AsciiWire oled; + #define STEPPER_INC_SPEED (STEPPER_MAX_SPEED / 10) #define STEPPER_MAN_SPEED_CHANGE_MILLIS 5 #define STEPPER_EMERGENCY_STOP_ACCELERATION 100000 #define LIFT_LEVEL_NOT_SET -1 -typedef struct PERSISTENT_VALUES +typedef struct { uint8_t numLiftLevels; uint8_t lastLiftLevel; long lastStepperPosition; - long listPositions[NUM_LIFT_LEVELS]; + long levelPositions[NUM_LIFT_LEVELS]; uint16_t objectSignature; -} persistentValues; +} PERSISTENT_VALUES; -#include -#include -#include +PERSISTENT_VALUES persistentValues; // Define a stepper and the pins it will use AccelStepper stepper(AccelStepper::DRIVER, STEPPER_PULSE_PIN, STEPPER_DIR_PIN, -1, -1, false); EncButton2 homeSensor(INPUT_PULLUP, HOME_SENSOR_PIN); -EncButton2 btnOk(INPUT, BUTTON_OK); +EncButton2 btnManual(INPUT, BUTTON_MANUAL); EncButton2 btnDown(INPUT, BUTTON_DOWN); EncButton2 btnUp(INPUT, BUTTON_UP); -EncButton2 btnHome(INPUT, BUTTON_HOME); +EncButton2 btnStopHome(INPUT, BUTTON_STOP_HOME); + +void displayLevel(int newLevel) +{ + oled.setCursor(0,0); + oled.set2X(); + oled.print("Level: "); + oled.print(newLevel); + oled.clearToEOL(); +} + +void displayMessage(const char* Msg) +{ + oled.setCursor(0,4); + oled.set2X(); + oled.print(Msg); oled.clearToEOL(); +} + +void displayMessageNumber(const char* Msg, int Number) +{ + oled.setCursor(0,4); + oled.set2X(); + oled.print(Msg); + oled.print(Number); + oled.clearToEOL(); +} + +void displayPosition(long newPosition) +{ + oled.setCursor(0,7); + oled.set1X(); + oled.print("Pos: "); + oled.print(newPosition); + oled.clearToEOL(); +} + +void initPersistentValues() +{ + EEPROM.get(EEPROM_BASE_ADDR, persistentValues); + +#ifdef EEPROM_FORCE_RELOAD_DEFAULT_VALUES + persistentValues.objectSignature = 0; +#endif + + if(persistentValues.objectSignature != EEPROM_VALID_DATA_SIGNATURE) + { + Serial.println("initPersistentValues: set detault values"); + + persistentValues.numLiftLevels = NUM_LIFT_LEVELS; + persistentValues.lastLiftLevel = 0; + persistentValues.lastStepperPosition = 0; + persistentValues.objectSignature = EEPROM_VALID_DATA_SIGNATURE; + for(uint8_t i = 0; i < NUM_LIFT_LEVELS; i++) + persistentValues.levelPositions[i] = defaultPositions[i]; + + EEPROM.put(EEPROM_BASE_ADDR, persistentValues); + } + else + Serial.println("initPersistentValues: restored values from EEPROM"); +} void setup() { Serial.begin(115200); - Serial.println("\nStepper Motor Drive Test"); + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) + delay(20); + + Serial.println(); Serial.print(PROGRAM_NAME); Serial.print(" Version: "); Serial.println(PROGRAM_VERSION); + + initPersistentValues(); + + Wire.begin(); + Wire.setClock(400000L); + + oled.setFont(cp437font8x8); + + oled.begin(&Adafruit128x64, OLED_DISPLAY_I2C_ADDRESS); + oled.clear(); + oled.println(PROGRAM_NAME); + oled.println(); + oled.print("Ver: "); oled.println(PROGRAM_VERSION); + oled.println(); + oled.print("Max Levels: "); oled.println(NUM_LIFT_LEVELS); + oled.println(); + oled.print("Used Levels: "); oled.println(persistentValues.numLiftLevels); + delay(2000); + oled.clear(); + displayLevel(persistentValues.lastLiftLevel + 1); + displayPosition(persistentValues.lastStepperPosition); + + stepper.setCurrentPosition(persistentValues.lastStepperPosition); stepper.setEnablePin(STEPPER_ENABLE_PIN); +#ifdef REVERSE_STEPPER_DIRECTION stepper.setPinsInverted(true, false, true); +#else + stepper.setPinsInverted(false, false, true); +#endif + stepper.setMaxSpeed(STEPPER_MAX_SPEED); - btnOk.setHoldTimeout(2000); + btnStopHome.setHoldTimeout(BUTTON_LONG_PRESS_DELAY); + btnManual.setHoldTimeout(BUTTON_LONG_PRESS_DELAY); } -void moveStepper(long relative) +void stepperMoveTo(long newPosition) { stepper.enableOutputs(); stepper.setAcceleration(STEPPER_NORMAL_ACCELERATION); - stepper.move(relative); + stepper.moveTo(newPosition); } +void stepperMove(long newRelPosition) +{ + stepper.enableOutputs(); + stepper.setAcceleration(STEPPER_NORMAL_ACCELERATION); + stepper.move(newRelPosition); +} void stopStepper(void) { stepper.setAcceleration(STEPPER_EMERGENCY_STOP_ACCELERATION); @@ -81,6 +230,7 @@ int lastSpeed = 0; int newSpeed = 0; bool wasRunning = false; bool configMode = false; +bool homing = false; elapsedMillis lastSpeedChange = 0; void loop() @@ -89,7 +239,7 @@ void loop() homeSensor.tick(); if(homeSensor.state()) { - if(stepper.isRunning() && (lastSpeed <= 0)) + if((configMode || homing) && stepper.isRunning() && (lastSpeed <= 0)) { stopStepper(); @@ -100,14 +250,27 @@ void loop() newSpeed = 0; lastSpeed = newSpeed; - stepper.setCurrentPosition(0); + + persistentValues.lastLiftLevel = 0; + persistentValues.lastStepperPosition = 0; + stepper.setCurrentPosition(persistentValues.lastStepperPosition); + + EEPROM.put(EEPROM_BASE_ADDR, persistentValues); + + if(homing) + { + long newPos = persistentValues.levelPositions[persistentValues.lastLiftLevel]; + stepperMoveTo(newPos); + Serial.print("Home Sensor Hit: Move To: "); Serial.print(persistentValues.lastLiftLevel); Serial.print(" Pos: "); Serial.println(newPos); + homing = false; + } } } // Make sure we haven't gone beyond the end point of the traverser. if(stepper.currentPosition() >= STEPPER_MAX_POSITION) { - if(stepper.isRunning() && (lastSpeed >= 0)) + if(configMode && stepper.isRunning() && (lastSpeed >= 0)) { stopStepper(); @@ -118,13 +281,16 @@ void loop() newSpeed = 0; lastSpeed = newSpeed; + + displayMessage("At Max"); } } - btnHome.tick(); - if(btnHome.click()) + btnStopHome.tick(); + if(btnStopHome.press()) { - Serial.print("Home Click - Current Pos: "); Serial.println(stepper.currentPosition()); + Serial.print("StopHome Click - Current Pos: "); Serial.println(stepper.currentPosition()); + displayMessage("Stop"); if(stepper.isRunning()) { newSpeed = 0; @@ -132,39 +298,80 @@ void loop() } } - if(btnHome.held()) + if(btnStopHome.held()) { - Serial.println("Home Held: Moving to Home Position"); + Serial.println("StopHome Held: Moving to Home Position"); + displayMessage("Homing"); + homing = true; newSpeed = -STEPPER_MAX_SPEED; } - btnOk.tick(); - if(btnOk.click()) + btnManual.tick(); + if(btnManual.press()) { - Serial.print("Ok Click - Current Pos: "); Serial.println(stepper.currentPosition()); + Serial.print("Manual Press - Current Pos: "); Serial.println(stepper.currentPosition()); + if(configMode) + { + configMode = false; + Serial.println("Home Click - Exit Manual Mode"); + } } - if(btnOk.held()) + if(btnManual.held()) { - Serial.print("Ok Held - Current Pos: "); Serial.println(stepper.currentPosition()); + Serial.print("Manual Held - Enter Manual Mode Pos: "); Serial.println(stepper.currentPosition()); + configMode = true; } btnDown.tick(); - if(btnDown.click() && (stepper.currentPosition() < STEPPER_MAX_POSITION) && (lastSpeed <= (STEPPER_MAX_SPEED - STEPPER_INC_SPEED))) + if(configMode) { - newSpeed = lastSpeed + STEPPER_INC_SPEED; - lastSpeedChange = STEPPER_MAN_SPEED_CHANGE_MILLIS; - Serial.print("Down Click - Current Pos: "); Serial.print(stepper.currentPosition()); Serial.print(" New Speed: "); Serial.println(newSpeed); + if((btnDown.press() || btnDown.step()) && (stepper.currentPosition() < STEPPER_MAX_POSITION) && (lastSpeed <= (STEPPER_MAX_SPEED - STEPPER_INC_SPEED))) + { + newSpeed = lastSpeed + STEPPER_INC_SPEED; + lastSpeedChange = STEPPER_MAN_SPEED_CHANGE_MILLIS; + Serial.print("Down Press - Current Pos: "); Serial.print(stepper.currentPosition()); Serial.print(" New Speed: "); Serial.println(newSpeed); + + displayMessage("Down"); + } } + + else if((btnDown.press() || btnDown.step()) && persistentValues.lastLiftLevel > 0) + { + Serial.print("Down Press - Current Level: "); Serial.print(persistentValues.lastLiftLevel); + persistentValues.lastLiftLevel--; + long newPos = persistentValues.levelPositions[persistentValues.lastLiftLevel]; + stepperMoveTo(newPos); + Serial.print(" Move To: "); Serial.print(persistentValues.lastLiftLevel); Serial.print(" Pos: "); Serial.println(newPos); + displayMessageNumber("Dn To: ", persistentValues.lastLiftLevel + 1); + } + btnUp.tick(); - if(btnUp.click() && (homeSensor.state() == 0) && (lastSpeed >= -(STEPPER_MAX_SPEED - STEPPER_INC_SPEED))) + if(configMode) { - newSpeed = lastSpeed - STEPPER_INC_SPEED; - lastSpeedChange = STEPPER_MAN_SPEED_CHANGE_MILLIS; - Serial.print("Up Click - Current Pos: "); Serial.print(stepper.currentPosition()); Serial.print(" New Speed: "); Serial.println(newSpeed); + if((btnUp.press() || btnDown.step()) && (homeSensor.state() == 0) && (lastSpeed >= -(STEPPER_MAX_SPEED - STEPPER_INC_SPEED))) + { + newSpeed = lastSpeed - STEPPER_INC_SPEED; + lastSpeedChange = STEPPER_MAN_SPEED_CHANGE_MILLIS; + Serial.print("Up Press - Current Pos: "); Serial.print(stepper.currentPosition()); Serial.print(" New Speed: "); Serial.println(newSpeed); + + displayMessage("Up"); + } } + else if((btnUp.press() || btnDown.step()) && (persistentValues.lastLiftLevel < (persistentValues.numLiftLevels - 1))) + { + Serial.print("Up Press - Current Level: "); Serial.print(persistentValues.lastLiftLevel); + persistentValues.lastLiftLevel++; + long newPos = persistentValues.levelPositions[persistentValues.lastLiftLevel]; + stepperMoveTo(newPos); + Serial.print(" Move To: "); Serial.print(persistentValues.lastLiftLevel); Serial.print(" Pos: "); Serial.println(newPos); + + displayMessageNumber("Up To: ", persistentValues.lastLiftLevel + 1); + } + + if(lastSpeed != newSpeed) { // Serial.print("Speed Change: Last: "); Serial.print(lastSpeed); Serial.print(" New: "); Serial.print(newSpeed); @@ -192,7 +399,7 @@ void loop() // Serial.print(" Set New Speed: "); Serial.println(newSpeed); } } - + if(lastSpeed) stepper.runSpeed(); @@ -203,6 +410,12 @@ void loop() { Serial.println("Disable Outputs"); stepper.disableOutputs(); + + displayLevel(persistentValues.lastLiftLevel + 1); + displayMessage(""); + persistentValues.lastStepperPosition = stepper.currentPosition(); + displayPosition(persistentValues.lastStepperPosition); + EEPROM.put(EEPROM_BASE_ADDR, persistentValues); } wasRunning = stepper.isRunning(); } diff --git a/examples/NmraDccAccessoryDecoder_1/NmraDccAccessoryDecoder_1.ino b/examples/NmraDccAccessoryDecoder_1/NmraDccAccessoryDecoder_1.ino index 21d7a43..d9d3dcb 100644 --- a/examples/NmraDccAccessoryDecoder_1/NmraDccAccessoryDecoder_1.ino +++ b/examples/NmraDccAccessoryDecoder_1/NmraDccAccessoryDecoder_1.ino @@ -95,7 +95,10 @@ void notifyDccSigOutputState( uint16_t Addr, uint8_t State) void setup() { Serial.begin(115200); - + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) + delay(20); + // Configure the DCC CV Programing ACK pin for an output pinMode( DccAckPin, OUTPUT ); diff --git a/examples/NmraDccAccessoryDecoder_Pulsed_8/NmraDccAccessoryDecoder_Pulsed_8.ino b/examples/NmraDccAccessoryDecoder_Pulsed_8/NmraDccAccessoryDecoder_Pulsed_8.ino index cc78237..811b394 100644 --- a/examples/NmraDccAccessoryDecoder_Pulsed_8/NmraDccAccessoryDecoder_Pulsed_8.ino +++ b/examples/NmraDccAccessoryDecoder_Pulsed_8/NmraDccAccessoryDecoder_Pulsed_8.ino @@ -120,7 +120,10 @@ void initPinPulser(void) void setup() { Serial.begin(115200); - + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) + delay(20); + // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up // Many Arduino Cores now support the digitalPinToInterrupt() function that makes it easier to figure out the // Interrupt Number for the Arduino Pin number, which reduces confusion. diff --git a/examples/NmraDccMultiFunctionDecoder_1/NmraDccMultiFunctionDecoder_1.ino b/examples/NmraDccMultiFunctionDecoder_1/NmraDccMultiFunctionDecoder_1.ino index 4046b60..883583b 100644 --- a/examples/NmraDccMultiFunctionDecoder_1/NmraDccMultiFunctionDecoder_1.ino +++ b/examples/NmraDccMultiFunctionDecoder_1/NmraDccMultiFunctionDecoder_1.ino @@ -164,6 +164,10 @@ void notifyCVAck(void) void setup() { Serial.begin(115200); + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) + delay(20); + Serial.println("NMRA Dcc Multifunction Decoder Demo 1"); // Configure the DCC CV Programing ACK pin for an output @@ -199,4 +203,3 @@ void loop() Dcc.setCV( FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value); } } - diff --git a/examples/NmraDccMultiFunctionMotorDecoder/NmraDccMultiFunctionMotorDecoder.ino b/examples/NmraDccMultiFunctionMotorDecoder/NmraDccMultiFunctionMotorDecoder.ino index 20b18f0..9e681c4 100644 --- a/examples/NmraDccMultiFunctionMotorDecoder/NmraDccMultiFunctionMotorDecoder.ino +++ b/examples/NmraDccMultiFunctionMotorDecoder/NmraDccMultiFunctionMotorDecoder.ino @@ -207,6 +207,10 @@ void setup() { #ifdef DEBUG_PRINT Serial.begin(115200); + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) + delay(20); + Serial.println("NMRA Dcc Multifunction Motor Decoder Demo"); #endif diff --git a/examples/NmraDcc_ARD_DCCSHIELD/NmraDcc_ARD_DCCSHIELD.ino b/examples/NmraDcc_ARD_DCCSHIELD/NmraDcc_ARD_DCCSHIELD.ino index dfa372d..5e4e719 100644 --- a/examples/NmraDcc_ARD_DCCSHIELD/NmraDcc_ARD_DCCSHIELD.ino +++ b/examples/NmraDcc_ARD_DCCSHIELD/NmraDcc_ARD_DCCSHIELD.ino @@ -101,6 +101,9 @@ void notifyCVChange(uint16_t CV, uint8_t Value) void setup() { Serial.begin(115200); + uint8_t maxWaitLoops = 255; + while(!Serial && maxWaitLoops--) + delay(20); Serial.println("NMRA DCC Iowa Scaled Engineering ARD-DCCSHIELD Example"); @@ -108,7 +111,7 @@ void setup() // Many Arduino Cores now support the digitalPinToInterrupt() function that makes it easier to figure out the // Interrupt Number for the Arduino Pin number, which reduces confusion. #ifdef digitalPinToInterrupt - Dcc.pin(DCC_PIN, 0); + Dcc.pin(DCC_PIN, 1); #else Dcc.pin(0, DCC_PIN, 1); #endif diff --git a/library.properties b/library.properties index 92870a7..ce301cc 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=NmraDcc -version=2.0.11 +version=2.0.12 author=Alex Shepherd, Wolfgang Kuffer, Geoff Bunza, Martin Pischky, Franz-Peter Müller, Sven (littleyoda), Hans Tanner, bugfixes by Jueff maintainer=Alex Shepherd sentence=Enables NMRA DCC Communication