From 7366268025c04aa15a94d88191c0a510302236b0 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 4 Jun 2013 11:22:19 +0200 Subject: Add SoftwareSerial::setRxIntMsk() This moves the interrupt mask enabling / disabling code into a separate method, so we can call it from multiple spots next. --- libraries/SoftwareSerial/SoftwareSerial.cpp | 15 +++++++++++++-- libraries/SoftwareSerial/SoftwareSerial.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) (limited to 'libraries/SoftwareSerial') diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp index ac9e30b..8bf56e5 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -403,8 +403,11 @@ void SoftwareSerial::begin(long speed) // Set up RX interrupts, but only if we have a valid RX baud rate if (_rx_delay_stopbit) { + // Enable the PCINT for the entire port here, but never disable it + // (others might also need it, so we disable the interrupt by using + // the per-pin PCMSK register). *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin)); - *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin)); + setRxIntMsk(true); tunedDelay(_tx_delay); // if we were low this establishes the end } @@ -416,10 +419,18 @@ void SoftwareSerial::begin(long speed) listen(); } +void SoftwareSerial::setRxIntMsk(bool enable) +{ + if (enable) + *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin)); + else + *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin)); +} + void SoftwareSerial::end() { if (_rx_delay_stopbit) - *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin)); + setRxIntMsk(false); } diff --git a/libraries/SoftwareSerial/SoftwareSerial.h b/libraries/SoftwareSerial/SoftwareSerial.h index a6a60b5..31bd229 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.h +++ b/libraries/SoftwareSerial/SoftwareSerial.h @@ -74,6 +74,7 @@ private: void tx_pin_write(uint8_t pin_state); void setTX(uint8_t transmitPin); void setRX(uint8_t receivePin); + void setRxIntMsk(bool enable); // private static method for timing static inline void tunedDelay(uint16_t delay); -- cgit v1.2.3-18-g5258