我使用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);
}
Run Code Online (Sandbox Code Playgroud)
当我进行嵌入式编程时,我发现添加注释非常有用,这些注释在我设置配置寄存器时准确地解释了我的意图.这样我就不必回到数据表来弄清楚0x01001010当我下次需要更改它时我正在尝试修改代码时会发生什么.(请务必保持评论与更改保持同步).
从我可以解码的情况来看,看起来你已经设置了PWM寄存器,但无法按照你想要的间隔改变频率.有几种方法可以做到这一点,这里有两个想法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里 flag设置?在中断处理程序中:
void InterruptHandler()
{
flag = 1;
acknowledge_interupt_reg = 0;
}
Run Code Online (Sandbox Code Playgroud)
你已经得到了你的例子中的所有部分,你只需要将它们放在正确的位置.在你的情况下,update_something()将更新PWM.逻辑看起来像是:"如果它打开,请将其关闭;否则将其打开.如果需要,更新音调(占空比)"
主while循环中不应该有额外的延迟或暂停.目标是它只是一次又一次地运行,等待一些事情要做.如果程序需要以不同的速率执行其他操作,则可以添加另一个标志,该标志完全独立触发,并且两个任务的时间不会相互干扰.
| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |