c - 使用C编程以一定的时间间隔产生音调

标签 c embedded pic18

我使用 C 语言为 PIC18F 生成音调,以便每个音调以特定的时间间隔播放。我使用 PWM 来产生音调。但我不知道如何创建间隔。这是我的尝试。

#pragma code                                    // 
void main (void)
{

 int i=0;
    // set internal oscillator to 1MHz  
    //OSCCON = 0b10110110;                    // IRCFx = 101
    //OSCTUNEbits.PLLEN = 0;                //PLL disabled

    TRISDbits.TRISD7 = 0;

    T2CON  = 0b00000101;                    //timer2 on
    PR2    = 240;
    CCPR1L = 0x78;
    CCP1CON= 0b01001100;



LATDbits.LATD7=0;
Delay1KTCYx(1000);

while(1);
}

最佳答案

当我进行嵌入式编程时,我发现添加注释来准确解释我在设置配置寄存器时的意图非常有用。这样,当我下次必须更改代码时,我不必返回数据表来弄清楚 0x01001010 的作用。 (请确保评论与更改保持同步)。

根据我可以解码的内容,您似乎已经设置了 PWM 寄存器,但无法按照所需的时间间隔更改频率。有几种方法可以做到这一点,这里有两个想法:

  • 您可以在启动时读取计时器,添加所需的间隔以获取目标时间,并在 while 循环中轮询计时器。当计时器达到目标时,设置新的 PWM 占空比,并将下一个间隔添加到目标时间。这将工作得很好,直到您需要开始在后台循环中执行其他操作。
  • 您可以将timer0的计数设置为0xFFFF-interval,并将其设置为在翻转时中断。在ISR中,设置新的PWM占空比,并将timer0计数重置为下一个间隔。

控制嵌入式进程时序的一种常见方法如下所示:

int flag=0;
void main()
{
  setup_interrupt(); //schedule interrupt for desired time.
  while (1)
  {  
     if (flag)
     {  
        update_something();
        flag = 0;
     }
  }

flag 在哪里设置?在中断处理程序中:

void InterruptHandler()
{
  flag = 1;
  acknowledge_interupt_reg = 0;
}

您已经拥有示例中的所有部分,只需将它们放在正确的位置即可。在您的情况下,update_something() 将更新 PWM。逻辑如下:“如果它已打开,则将其关闭;否则将其打开。如果需要,请更新音调(占空比)”

主 while 循环中不需要额外的延迟或暂停。目标是它一遍又一遍地运行,等待执行某些操作。如果程序需要以不同的速率做其他事情,可以添加另一个标志,该标志完全独立触发,两个任务的时间不会互相干扰。

关于c - 使用C编程以一定的时间间隔产生音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603313/

相关文章:

c - realloc 如何增加内存块的大小?

c - 使用 pthread 创建多个线程时出现问题

embedded - AT91SAM7X512复位类型问题

tcp - 当以太网接收缓冲区已满时会发生什么

memory-management - 嵌入式系统的内存错误检测器?

c - PIC 上的 Bit-banged 串行停止与 C 中的嵌套循环一起工作

c - 如何使用 TCP/IP 堆栈对 PIC18 上的引导加载程序进行单元测试?

c - C 中的死编码

c - 当 int 和 long 在 C 中具有相同的宽度时,排名有时会失败

embedded - 在 PIC18 上写入 UART