当前位置:  开发笔记 > 编程语言 > 正文

使用C编程以特定时间间隔产生音调

如何解决《使用C编程以特定时间间隔产生音调》经验,为你挑选了1个好方法。

我使用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);
}

AShelly.. 6

当我进行嵌入式编程时,我发现添加注释非常有用,这些注释在我设置配置寄存器时准确地解释了我的意图.这样我就不必回到数据表来弄清楚0x01001010当我下次需要更改它时我正在尝试修改代码时会发生什么.(请务必保持评论与更改保持同步).

从我可以解码的情况来看,看起来你已经设置了PWM寄存器,但无法按照你想要的间隔改变频率.有几种方法可以做到这一点,这里有两个想法:

您可以在启动时读取计时器,添加所需的间隔以获取目标时间,并在while循环中轮询计时器.当定时器到达目标时,设置新的PWM占空比,并将下一个间隔添加到目标时间.这将工作正常,直到你需要开始在后台循环中做其他事情.

您可以将timer0的计数设置为0xFFFF-interval,并将其设置为在翻转时中断.在ISR中,设置新的PWM占空比,并将timer0 count重置为下一个间隔.

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

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循环中不应该有额外的延迟或暂停.目标是它只是一次又一次地运行,等待一些事情要做.如果程序需要以不同的速率执行其他操作,则可以添加另一个标志,该标志完全独立触发,并且两个任务的时间不会相互干扰.



1> AShelly..:

当我进行嵌入式编程时,我发现添加注释非常有用,这些注释在我设置配置寄存器时准确地解释了我的意图.这样我就不必回到数据表来弄清楚0x01001010当我下次需要更改它时我正在尝试修改代码时会发生什么.(请务必保持评论与更改保持同步).

从我可以解码的情况来看,看起来你已经设置了PWM寄存器,但无法按照你想要的间隔改变频率.有几种方法可以做到这一点,这里有两个想法:

您可以在启动时读取计时器,添加所需的间隔以获取目标时间,并在while循环中轮询计时器.当定时器到达目标时,设置新的PWM占空比,并将下一个间隔添加到目标时间.这将工作正常,直到你需要开始在后台循环中做其他事情.

您可以将timer0的计数设置为0xFFFF-interval,并将其设置为在翻转时中断.在ISR中,设置新的PWM占空比,并将timer0 count重置为下一个间隔.

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

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循环中不应该有额外的延迟或暂停.目标是它只是一次又一次地运行,等待一些事情要做.如果程序需要以不同的速率执行其他操作,则可以添加另一个标志,该标志完全独立触发,并且两个任务的时间不会相互干扰.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有