diff options
Diffstat (limited to 'libraries/SoftwareSerial')
| -rw-r--r-- | libraries/SoftwareSerial/SoftwareSerial.cpp | 9 | ||||
| -rw-r--r-- | libraries/SoftwareSerial/SoftwareSerial.h | 2 | 
2 files changed, 9 insertions, 2 deletions
| diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp index 42f796b..bee1107 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/SoftwareSerial.cpp @@ -403,6 +403,11 @@ void SoftwareSerial::begin(long speed)      // (others might also need it, so we disable the interrupt by using
      // the per-pin PCMSK register).
      *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
 +    // Precalculate the pcint mask register and value, so setRxIntMask
 +    // can be used inside the ISR without costing too much time.
 +    _pcint_maskreg = digitalPinToPCMSK(_receivePin);
 +    _pcint_maskvalue = _BV(digitalPinToPCMSKbit(_receivePin));
 +
      tunedDelay(_tx_delay); // if we were low this establishes the end
    }
 @@ -417,9 +422,9 @@ void SoftwareSerial::begin(long speed)  void SoftwareSerial::setRxIntMsk(bool enable)
  {
      if (enable)
 -      *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
 +      *_pcint_maskreg |= _pcint_maskvalue;
      else
 -      *digitalPinToPCMSK(_receivePin) &= ~_BV(digitalPinToPCMSKbit(_receivePin));
 +      *_pcint_maskreg &= ~_pcint_maskvalue;
  }
  void SoftwareSerial::end()
 diff --git a/libraries/SoftwareSerial/SoftwareSerial.h b/libraries/SoftwareSerial/SoftwareSerial.h index aa9bbf3..302a23b 100644 --- a/libraries/SoftwareSerial/SoftwareSerial.h +++ b/libraries/SoftwareSerial/SoftwareSerial.h @@ -53,6 +53,8 @@ private:    volatile uint8_t *_receivePortRegister;
    uint8_t _transmitBitMask;
    volatile uint8_t *_transmitPortRegister;
 +  volatile uint8_t *_pcint_maskreg;
 +  uint8_t _pcint_maskvalue;
    uint16_t _rx_delay_centering;
    uint16_t _rx_delay_intrabit;
 | 
