求助!再看蜂鸣器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5927|回复: 0

求助!再看蜂鸣器

[复制链接]
发表于 2013-5-15 15:49 | 显示全部楼层 |阅读模式
本帖最后由 雪山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);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 15:32 , Processed in 0.077863 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表