aboutsummaryrefslogtreecommitdiff
path: root/cores/arduino/Tone.cpp
diff options
context:
space:
mode:
authorJan <Jan.reucker@gmail.com>2015-04-11 00:15:58 +0200
committerJan <Jan.reucker@gmail.com>2015-04-11 00:15:58 +0200
commit331f5c832eb40da524e40dc08c6ff83aae79b954 (patch)
tree7a3ec60ea98b0899fe185592c0b52617c58af6ee /cores/arduino/Tone.cpp
parentcf6b1559cfde263fe4cff93a1f26a944fda91677 (diff)
Update Tone.cpp
Rebased the bugfix from the original Google Code issue #292 to work with Arduino 1.6.x Description of original fix provided by Pete62: The later 8 bit AVR's use two registers (TCCRxA, TCCRxB) whereas the ATmega8 only uses a single register (TCCR2) to house the control bits for Timer 2. Bits were inadvertently being cleared.
Diffstat (limited to 'cores/arduino/Tone.cpp')
-rw-r--r--cores/arduino/Tone.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp
index 9bb6fe7..eda8cbb 100644
--- a/cores/arduino/Tone.cpp
+++ b/cores/arduino/Tone.cpp
@@ -30,6 +30,7 @@ Version Modified By Date Comments
0006 D Mellis 09/12/29 Replaced objects with functions
0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register
0008 S Kanemoto 12/06/22 Fixed for Leonardo by @maris_HY
+0009 J Reucker 15/04/10 Issue #292 Fixed problems with ATmega8 (thanks to Pete62)
*************************************************/
#include <avr/interrupt.h>
@@ -296,13 +297,13 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
#if defined(TCCR0B)
if (_timer == 0)
{
- TCCR0B = prescalarbits;
+ TCCR0B = (TCCR0B & 0b11111000) | prescalarbits;
}
else
#endif
#if defined(TCCR2B)
{
- TCCR2B = prescalarbits;
+ TCCR2B = (TCCR2B & 0b11111000) | prescalarbits;
}
#else
{
@@ -456,19 +457,19 @@ void disableTimer(uint8_t _timer)
#if defined(TIMSK3)
case 3:
- TIMSK3 = 0;
+ TIMSK3 &= ~(1 << OCIE3A);
break;
#endif
#if defined(TIMSK4)
case 4:
- TIMSK4 = 0;
+ TIMSK4 &= ~(1 << OCIE4A);
break;
#endif
#if defined(TIMSK5)
case 5:
- TIMSK5 = 0;
+ TIMSK5 &= ~(1 << OCIE5A);
break;
#endif
}