aboutsummaryrefslogtreecommitdiff
path: root/cores
diff options
context:
space:
mode:
authorZach Eveland <zeveland@blacklabel-development.com>2012-04-19 15:52:16 -0400
committerZach Eveland <zeveland@blacklabel-development.com>2012-04-19 15:52:16 -0400
commit6ae1a1723561266767ed1ba39ae61c35ea263162 (patch)
tree1a3789e14a2bc246fb0d57b6d0b473c5951ffc0b /cores
parent56ddc4637de1b8b0e21840519ed0b94966395ff5 (diff)
bugfix for configuring PWM on D6 and D13 too early. (thanks to Limor Fried)
was starting PWM on these pins too soon - in init() instead of when analogWrite() was called. as a result doing output on port registers directly failed.
Diffstat (limited to 'cores')
-rw-r--r--cores/arduino/wiring.c4
-rw-r--r--cores/arduino/wiring_analog.c6
2 files changed, 6 insertions, 4 deletions
diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c
index fb447eb..ac8bb6f 100644
--- a/cores/arduino/wiring.c
+++ b/cores/arduino/wiring.c
@@ -280,10 +280,6 @@ void init()
#endif
#if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */
- sbi(TCCR4A, COM4A1); // clear channel A on output compare match
- cbi(TCCR4A, COM4A0);
- sbi(TCCR4C, COM4D1); // clear channel D on output compare match
- cbi(TCCR4C, COM4D0);
sbi(TCCR4B, CS42); // set timer4 prescale factor to 64
sbi(TCCR4B, CS41);
sbi(TCCR4B, CS40);
diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c
index c06cad4..0e9881f 100644
--- a/cores/arduino/wiring_analog.c
+++ b/cores/arduino/wiring_analog.c
@@ -210,6 +210,9 @@ void analogWrite(uint8_t pin, int val)
case TIMER4A:
//connect pwm to pin on timer 4, channel A
sbi(TCCR4A, COM4A1);
+ #if defined(COM4A0) // only used on 32U4
+ cbi(TCCR4A, COM4A0);
+ #endif
OCR4A = val; // set pwm duty
break;
#endif
@@ -234,6 +237,9 @@ void analogWrite(uint8_t pin, int val)
case TIMER4D:
// connect pwm to pin on timer 4, channel D
sbi(TCCR4C, COM4D1);
+ #if defined(COM4D0) // only used on 32U4
+ cbi(TCCR4C, COM4D0);
+ #endif
OCR4D = val; // set pwm duty
break;
#endif