Disabling interrupts while digitalWrite() and pinMode() modify registers (issue #146).

Updating revisions.
This commit is contained in:
David A. Mellis 2010-06-12 20:32:58 +00:00
parent a771267f69
commit 3b6611ae2d
1 changed files with 22 additions and 4 deletions

View File

@ -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)