1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-02-27 21:54:30 +01:00

Re-enabling timer 2 pwm after tone() ends.

Factored out common code to disable timers.
This commit is contained in:
David A. Mellis 2010-06-12 19:47:41 +00:00
parent 9fe672fc63
commit e2169fa0a4

View File

@ -349,39 +349,27 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
} }
void noTone(uint8_t _pin) // XXX: this function only works properly for timer 2 (the only one we use
// currently). for the others, it should end the tone, but won't restore
// proper PWM functionality for the timer.
void disableTimer(uint8_t _timer)
{ {
int8_t _timer = -1;
for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
if (tone_pins[i] == _pin) {
_timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
tone_pins[i] = 255;
}
}
switch (_timer) switch (_timer)
{ {
#if defined(__AVR_ATmega8__) #if !defined(__AVR_ATmega8__)
case 0:
TIMSK0 = 0;
break;
#endif
case 1: case 1:
bitWrite(TIMSK1, OCIE1A, 0); bitWrite(TIMSK1, OCIE1A, 0);
break; break;
case 2: case 2:
bitWrite(TIMSK2, OCIE2A, 0); bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt
TCCR2A = (1 << WGM20);
TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22);
OCR2A = 0;
break; break;
#else
case 0:
TIMSK0 = 0;
break;
case 1:
TIMSK1 = 0;
break;
case 2:
TIMSK2 = 0;
break;
#endif
#if defined(__AVR_ATmega1280__) #if defined(__AVR_ATmega1280__)
case 3: case 3:
TIMSK3 = 0; TIMSK3 = 0;
@ -394,6 +382,21 @@ void noTone(uint8_t _pin)
break; break;
#endif #endif
} }
}
void noTone(uint8_t _pin)
{
int8_t _timer = -1;
for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
if (tone_pins[i] == _pin) {
_timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
tone_pins[i] = 255;
}
}
disableTimer(_timer);
digitalWrite(_pin, 0); digitalWrite(_pin, 0);
} }
@ -412,7 +415,7 @@ ISR(TIMER0_COMPA_vect)
} }
else else
{ {
TIMSK0 = 0; // disable the interrupt disableTimer(0);
*timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop *timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop
} }
} }
@ -431,7 +434,7 @@ ISR(TIMER1_COMPA_vect)
} }
else else
{ {
TIMSK1 = 0; // disable the interrupt disableTimer(1);
*timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop *timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop
} }
} }
@ -451,7 +454,7 @@ ISR(TIMER2_COMPA_vect)
} }
else else
{ {
TIMSK2 = 0; // disable the interrupt disableTimer(2);
*timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop
} }
} }
@ -473,7 +476,7 @@ ISR(TIMER3_COMPA_vect)
} }
else else
{ {
TIMSK3 = 0; // disable the interrupt disableTimer(3);
*timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop
} }
} }
@ -490,7 +493,7 @@ ISR(TIMER4_COMPA_vect)
} }
else else
{ {
TIMSK4 = 0; // disable the interrupt disableTimer(4);
*timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop
} }
} }
@ -507,7 +510,7 @@ ISR(TIMER5_COMPA_vect)
} }
else else
{ {
TIMSK5 = 0; // disable the interrupt disableTimer(5);
*timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop
} }
} }