aboutsummaryrefslogtreecommitdiff
path: root/libraries/SoftwareSerial
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2013-06-04 11:04:30 +0200
committerMatthijs Kooijman <matthijs@stdin.nl>2015-01-26 17:03:24 +0100
commit4d3ccb411801214d713bb93c1297c074c14e9ab4 (patch)
tree62a5099d166c4bc826bb6f75981cd87830cd5f76 /libraries/SoftwareSerial
parent073ff135cedd131672256a1bd20e698ce6e8a60e (diff)
Clear SoftwareSerial rx delay if no interrupt register is found
Before enabling interupts, begin would see if the given receive pin actually has an associated PCINT register. If not, the interrupts would not be enabled. Now, the same check is done, but when no register is available, the rx parameters are not loaded at all (which in turn prevents the interrupt from being enabled). This allows all code to use the same "is rx enabled" (which will be added next).
Diffstat (limited to 'libraries/SoftwareSerial')
-rw-r--r--libraries/SoftwareSerial/SoftwareSerial.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp
index d1f6c92..8476deb 100644
--- a/libraries/SoftwareSerial/SoftwareSerial.cpp
+++ b/libraries/SoftwareSerial/SoftwareSerial.cpp
@@ -385,9 +385,13 @@ void SoftwareSerial::begin(long speed)
long baud = pgm_read_dword(&table[i].baud);
if (baud == speed)
{
- _rx_delay_centering = pgm_read_word(&table[i].rx_delay_centering);
- _rx_delay_intrabit = pgm_read_word(&table[i].rx_delay_intrabit);
- _rx_delay_stopbit = pgm_read_word(&table[i].rx_delay_stopbit);
+ if (digitalPinToPCICR(_receivePin))
+ {
+ // Only setup rx when we have a valid PCINT for this pin
+ _rx_delay_centering = pgm_read_word(&table[i].rx_delay_centering);
+ _rx_delay_intrabit = pgm_read_word(&table[i].rx_delay_intrabit);
+ _rx_delay_stopbit = pgm_read_word(&table[i].rx_delay_stopbit);
+ }
_tx_delay = pgm_read_word(&table[i].tx_delay);
break;
}
@@ -396,11 +400,8 @@ void SoftwareSerial::begin(long speed)
// Set up RX interrupts, but only if we have a valid RX baud rate
if (_rx_delay_stopbit)
{
- if (digitalPinToPCICR(_receivePin))
- {
- *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
- *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
- }
+ *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
+ *digitalPinToPCMSK(_receivePin) |= _BV(digitalPinToPCMSKbit(_receivePin));
tunedDelay(_tx_delay); // if we were low this establishes the end
}