I am trying to integrate tone() with the open source program for the Amped heart rate monitor. The error:
Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':
(.text+0x0): multiple definition of `__vector_7'
sketch\PulseSensorAmped_Arduino_1dot4.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
The program comes in three files. PulseSensorAmped_Arduino_1dot4.cpp I don't think references any timers but references a function in another file with this code:
// Initializes Timer2 to throw an interrupt every 2mS.
TCCR2A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
TCCR2B = 0x06; // DON'T FORCE COMPARE, 256 PRESCALER
OCR2A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
TIMSK2 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED
This uses timer 2; but isn't the error for timer 1? The tone() reference page says that tone interferes with pins 3 and 11. Is there any way to fix this?
references:
https://www.arduino.cc/en/Reference/Tone
https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino
-
In my case, IR library was conflicting with Tone. Nick's solution works perfectly.brasofilo– brasofilo2019年09月19日 03:44:44 +00:00Commented Sep 19, 2019 at 3:44
1 Answer 1
It looks like the Tone library uses Timer 2, and it looks like your other code also uses Timer 2, hence the error message. Vector 7 would be the TIMER2_COMPA_vect (Timer 2 compare "a").
Pins 3 and 11 are from Timer 2.
I wrote a small library that generates tones using the hardware PWM and not interrupts. You can read about it here.
Example code:
#include <TonePlayer.h>
TonePlayer tone1 (TCCR1A, TCCR1B, OCR1AH, OCR1AL, TCNT1H, TCNT1L); // pin D9 (Uno), D11 (Mega)
void setup()
{
pinMode (9, OUTPUT); // output pin is fixed (OC1A)
tone1.tone (220); // 220 Hz
delay (500);
tone1.noTone ();
tone1.tone (440);
delay (500);
tone1.noTone ();
tone1.tone (880);
delay (500);
tone1.noTone ();
}
void loop() { }
Library can be downloaded from http://www.gammon.com.au/Arduino/TonePlayer.zip
This uses Timer 1 (so that won't interfere with Timer 2) and no interrupts.
-
For anyone wondering, when defining a tone, all those codes seem to be the address of the single workable pin on Uno/Mega (pin 9). For Mega 2560 there are 3 different pins and
TonePlayer.cpp
file has the examples.brasofilo– brasofilo2019年09月19日 03:44:17 +00:00Commented Sep 19, 2019 at 3:44 -
1That's true, thanks for the clarification. In the source are examples of choosing between 3 pins (which are the outputs of the three hardware timers).2019年09月19日 07:32:22 +00:00Commented Sep 19, 2019 at 7:32