本帖最后由 雪山hu 于 2013-5-15 16:41 编辑
上次那个蜂鸣器帖子讲了也用到了tone()函数,但是这次。
当我用了IRremote.h再使用tone函数,就出现这个提示
core.a(Tone.cpp.o): In function `__vector_7':
E:\arduino-1.0.1\hardware\arduino\cores\arduino/Tone.cpp:523: multiple definition of `__vector_7'
IRremote\IRremote.cpp.o:E:\arduino-1.0.1\libraries\IRremote/IRremote.cpp:311: first defined here
经查发现原因如下:
这个错误提示表面上是说在红外库里定义过的函数在Tone里又重复定义了,实际原因是红外库和Tone都使用了相同的内部计时器TIMER2(在各自的ISR函数里),换名字是不解决根本问题的。如果你不熟悉avr的中断处理函数ISR,修改哪一方都不靠谱,考虑下面的Tone的替代 办法:
我们知道arduino的几个延时函数都是用的timer 0。这里有个不用timer2而用延时函数的发声函数,用它替代Tone应该可以避开与红外库的计时器冲突:
[mw_shl_code=c,true]void newtone(byte tonePin, int frequency, int duration) {
int period = 1000000L / frequency;
int pulse = period / 2;
for (long i = 0; i < duration * 1000L; i += period) {
digitalWrite(tonePin, HIGH);
delayMicroseconds(pulse);
digitalWrite(tonePin, LOW);
delayMicroseconds(pulse);
}
}[/mw_shl_code]
当然声明过这个以后,就可以使用newtone()控制蜂鸣器。
蜂鸣器不能在使用这个函数驱动了,经我测试有声音,但是十分微弱,谁能解释一下?
digitalWrite(speakerPin, HIGH);
|