我使用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循环中不应该有额外的延迟或暂停.目标是它只是一次又一次地运行,等待一些事情要做.如果程序需要以不同的速率执行其他操作,则可以添加另一个标志,该标志完全独立触发,并且两个任务的时间不会相互干扰.
当我进行嵌入式编程时,我发现添加注释非常有用,这些注释在我设置配置寄存器时准确地解释了我的意图.这样我就不必回到数据表来弄清楚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循环中不应该有额外的延迟或暂停.目标是它只是一次又一次地运行,等待一些事情要做.如果程序需要以不同的速率执行其他操作,则可以添加另一个标志,该标志完全独立触发,并且两个任务的时间不会相互干扰.