From e2f5f0c9d6a7db3de5b6bceb1f719665da5912b6 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Sat, 12 Jun 2010 20:32:58 +0000 Subject: [PATCH] Disabling interrupts while digitalWrite() and pinMode() modify registers (issue #146). Updating revisions. --- build/shared/revisions.txt | 1 + .../arduino/cores/arduino/wiring_digital.c | 26 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 0582dfd31..441f609de 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -3,6 +3,7 @@ ARDUINO 0019 [core / libraries] * More accurate delay() function from BenF. +* Re-enabling PWM after tone() ends. [environment] diff --git a/hardware/arduino/cores/arduino/wiring_digital.c b/hardware/arduino/cores/arduino/wiring_digital.c index 1cdbf6c4a..352992360 100755 --- a/hardware/arduino/cores/arduino/wiring_digital.c +++ b/hardware/arduino/cores/arduino/wiring_digital.c @@ -36,8 +36,17 @@ void pinMode(uint8_t pin, uint8_t mode) // JWS: can I let the optimizer do this? reg = portModeRegister(port); - if (mode == INPUT) *reg &= ~bit; - else *reg |= bit; + if (mode == INPUT) { + uint8_t oldSREG = SREG; + cli(); + *reg &= ~bit; + SREG = oldSREG; + } else { + uint8_t oldSREG = SREG; + cli(); + *reg |= bit; + SREG = oldSREG; + } } // Forcing this inline keeps the callers from having to push their own stuff @@ -90,8 +99,17 @@ void digitalWrite(uint8_t pin, uint8_t val) out = portOutputRegister(port); - if (val == LOW) *out &= ~bit; - else *out |= bit; + if (val == LOW) { + uint8_t oldSREG = SREG; + cli(); + *out &= ~bit; + SREG = oldSREG; + } else { + uint8_t oldSREG = SREG; + cli(); + *out |= bit; + SREG = oldSREG; + } } int digitalRead(uint8_t pin)