与非常量整数分开时,压电蜂鸣器会播放奇怪的音符

问题描述 投票:0回答:1

所以这是一个比较复杂的问题。我目前正在使用带有 MPLAB X IDE 的 PIC16F1509 对小型开发人员测试板进行编程,并通过自定义 USB UART 桥将编译的十六进制文件闪存到板上。我的问题如下:压电未连接到 PWM 引脚之一(有原因)。由于我对 C 和编程 IC 还很陌生,所以我目前几乎对所有内容都进行了硬编码。我今天想创作一段旋律,效果很好:

void NOTE_A4 (void) { 
    for (int i = 0; i <= 440; i++)
    {
    sound1_SetHigh();
    __delay_us(1136);
    sound1_SetLow();
    __delay_us(1136);
    }   
}

所以如果我调用这个函数,我会得到一秒钟的音符。

因为我希望能够更改音符的时间长度,所以我尝试了以下操作:

for (int i = 0; i <= 440/5; i++) {}

这可以让我毫无问题地玩 200 毫秒。

我还希望能够在调用函数时更改长度,所以我这样做了:

void NOTE_A4 (int divider) { 
    for (int i = 0; i <= 440/divider; i++)
    {
    sound1_SetHigh();
    __delay_us(1136);
    sound1_SetLow();
    __delay_us(1136);
    }  
}

现在我的问题是它听起来很奇怪。 歌曲录制

我不知道为什么会发生这种情况,因为 for 循环正确计算了新数字。 感谢您的帮助。

c mplab
1个回答
0
投票

PIC16F1xxx指令集没有除法指令,所以除法的软件实现很可能很慢。

循环时序可能受运行时划分

440/divider
的影响,在软件中实现。

但是硬编码

440/5
是在编译期间计算的。

解决这个问题的一种方法是使用预先计算的查找表。

© www.soinside.com 2019 - 2024. All rights reserved.