打印

关于STC的PCA高速模式输出40kHz方波的程序的问题

[复制链接]
7338|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuankunli|  楼主 | 2010-4-17 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
高手们帮忙看下哪里错了(关于STC的PCA高速模式输入40kHz方波的程序)
    主程序的意图是发送40kHz方波的10个脉冲之后停止,在PCA中断程序中采用了整型count变量来计数,在主程序中判断是否到达20后,停止PCA发送脉冲。运行时发现在主程序判断count变量时到达20,也不执行PCA停止命令,这该怎么修改?请各位大侠们指教指教啊,谢谢。

void pca_init(void)  //PWM初始化 高速模式 fosc=32MHz
{
CMOD =0x02;  //设置PCA定时器,空闲模式下停止PCA计数, 时钟源f/2,禁止PCA计数器溢出中断
CCON= 0x00;  //禁止PCA计数器工作,清除中断标志-溢出标志CCON=PCA模块中断标志
CL = 0x00;  //PCA计数器低8位,清计数器
CH = 0x00;  //PCA计数器高8位
CCAPM0 = 0x4D; /* PWM 高速方波输出 7  6 5 4  3 2 1  0 //禁止引脚翻转
      ECOMn,CAPPn,CAPNn,MATn,TOGn,PWMn,ECCFn
      ECOMn 比较器使能   CAPPn 正捕获 CAPNn 负捕获
      MATn 匹配,=1置位CCFn  TOGn=1翻转引脚  PWMn=1脉冲调节输出 ECCFn=1使能CCFn中断*/
CCAP0L=0xC8; //输出为40K方波
CCAP0H=0x00; //
IP  = 0x40;  //PCA中断唯一优先
IPH = 0x40;
EPCA_LVD=1; //开PCA中断
CR = 1;  //PCA计数器
EA = 1;
}
void pca_fast()  interrupt 6      //超声波发射40KHz方波
{
count++;     
CCF1=0;
if(CCAP0L<=(255-CCAP0L_Value))
   CCAP0L= CCAP0L+CCAP0L_Value;   
else   
   CCAP0L=CCAP0L_Value-(256-CCAP0L);
   if (CCAP0H<255)
     CCAP0H++;
   else CCAP0H=0;
   
   
}

void main(void)
{
     pca_init();        //PCA初始化
        
while(1)
{
   if(count==20)
   {CR=0;
        }
}
}

相关帖子

沙发
yuankunli|  楼主 | 2010-4-17 10:59 | 只看该作者
等高手回复。。。。。。

使用特权

评论回复
板凳
yuankunli|  楼主 | 2010-4-29 16:44 | 只看该作者
CCF1=0; 应该是CCF0=0;才对

使用特权

评论回复
地板
yuankunli|  楼主 | 2010-4-29 16:45 | 只看该作者
可是现在的问题是 在中断里 跑了几个回合后就不对了

使用特权

评论回复
5
ayb_ice| | 2010-4-29 16:59 | 只看该作者
本帖最后由 ayb_ice 于 2010-4-29 17:12 编辑

这样程序死得快,隐患多

中断与主程序同步出错(根本问题就是逻辑不对,也就是原子操作问题)
<if(count==20)>
改成
if(count>=20)//这也不是最好的办法

使用特权

评论回复
6
liaojihua2010| | 2010-6-1 16:27 | 只看该作者
EPCA_LVD=1; //开PCA中断////////////////////////////////////这句好像不对,
CR = 1;  //PCA计数器
EA = 1;////////////////////////////////////这两句换一下顺序比较好}
void pca_fast()  interrupt 6     //超声波发射40KHz方波////////////////////中断查询号为7
{
count++;     
CCF1=0;//////////////////////////////////应该是CCF0=0;
if(CCAP0L<=(255-CCAP0L_Value))
   CCAP0L= CCAP0L+CCAP0L_Value;   
else   
   CCAP0L=CCAP0L_Value-(256-CCAP0L);
   if (CCAP0H<255)
     CCAP0H++;
   else CCAP0H=0;
}

还有就是STC的汇编范例是可以的,就是C语言就不行了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

29

帖子

1

粉丝