单片机/MCUwilliam hill官网
直播中

武旭东

12年用户 217经验值
擅长:嵌入式技术 控制/MCU
私信 关注
[问答]

STC12C5A60S2的PCA捕获功能问题

这几天正在学习STC12C5A60S2的PCA捕获功能,我按着芯片资料的例程写的捕获程序,但是呢,没反应,进入不了PCA中断,而且捕获输入口P1.3一直为高电平,不止为何,求帮助。

回帖(11)

Aidaohuakai

2015-5-6 23:00:43
把程序贴出来看看
举报

武旭东

2015-5-7 08:30:07
本帖最后由 xinghuayu 于 2015-5-7 08:46 编辑
引用: Aidaohuakai 发表于 2015-5-6 23:00
把程序贴出来看看

这个是PCA初始化的程序
  1. void pca_init()         //捕获模块初始化
  2. {
  3. CCON=0;
  4. CMOD = 0x00; //初始化PCA模式寄存器,晶振12分频 为2MHZ
  5. CCAPM0=0x11; //CCAPM0下降沿捕获,        允许中断
  6. CL=0;                  //清空PCA基本计数器
  7. CH=0;
  8. CR=1; //启动PCA
  9. }

这个是中断程序只用到一个模块
  1. void PCA_interrupt (void) interrupt 7 //检测输入脉冲频率中断           
  2. {
  3. if(CCF0==1)
  4. {
  5.         CCF0=0;
  6.         if(start_check==0)   //如果是开机检测
  7.         {
  8.           CL=0;                  //清空PCA基本计数器
  9.           CH=0;
  10.           start_fre_num=start_fre_num+1;        //脉冲计数标志位加1;
  11.     }
  12.    else  //正常运行
  13.         {
  14.           in_f_H=CCAP0H;
  15.           in_f_L=CCAP0L;  
  16.         }
  17.   }
  18.   if(CCF1==1)
  19.   {
  20.      CCF1=0;
  21.   }
  22.   if(CF==1)          //计数溢出的话,清除标志位
  23.   {
  24.    CF = 0;
  25.   }
  26. }         

这个是主程序使用PCA的部分
  1.   pca_init();      //开始捕获输入脉冲
  2.   //IT1=1;
  3.   //EX1=1;
  4.   Delay_1ms(5000);        //等待采集输入脉冲数
  5.   if(start_fre_num>3)        //收到的脉冲数大于3,开机正常
  6.   {
  7.            start_check=1;   //开始正常运行
  8.         f_led=0;        //输入脉冲指示灯亮
  9.         //EX1=0;
  10.   }
  11.   else   //采集脉冲数不够3个
  12.   {
  13.    f_led=1;          //脉冲输入指示灯不亮
  14.    TR0=0;     //停止输出脉冲(与PCA无关)
  15.   }

有个指示灯,亮的话表示采集到的脉冲数大于3,没亮的话采集到的数小于3,用外部中断采集是了,可行的,但是这个PCA捕获不好使,求指点。
举报

武旭东

2015-5-7 08:33:37
刚测了测,P1.3为低电平,原先产生脉冲的输出口接上去,脉冲就没有了,变为了低电平,断开,脉冲就又有了。
举报

武旭东

2015-5-7 08:41:39
刚又想了想,看了下数据手册,在初始化的时候将P1.3配置成输入口,加了两行代码,我昨天也用此方法试来,不过没好,今天又试,竟然好使了,嘿嘿。
  1. P1M1=P1M1|0x08;  //配置P1.3仅为输入口
  2. P1M0=P1M0&0xf7;
举报

Aidaohuakai

2015-5-7 09:44:41
不知道楼主为什么使用捕获模式来计数?楼主初学单片机的吧!
举报

武旭东

2015-5-7 11:01:14
引用: Aidaohuakai 发表于 2015-5-7 09:44
不知道楼主为什么使用捕获模式来计数?楼主初学单片机的吧!

这是系统上电之后开机检测脉冲数,后面进入主循环后还要用他测输入脉冲频率的,那儿的延时就是让单片机在那儿等着的,等待脉冲数大于一个值。不愧是大神,被你发现了,确实是新手小白,求赐教。
举报

Aidaohuakai

2015-5-7 13:09:02
引用: xinghuayu 发表于 2015-5-7 11:01
这是系统上电之后开机检测脉冲数,后面进入主循环后还要用他测输入脉冲频率的,那儿的延时就是让单片机在那儿等着的,等待脉冲数大于一个值。不愧是大神,被你发现了,确实是新手小白,求赐教。

2个下降沿之间的时间就是周期T,频率F=1/T,你这程序测不了频率吧!
举报

武旭东

2015-5-7 17:33:01
引用: Aidaohuakai 发表于 2015-5-7 13:09
2个下降沿之间的时间就是周期T,频率F=1/T,你这程序测不了频率吧!

啥意思,求出周期不就能算出频率了吗?
举报

武旭东

2015-5-7 17:33:13
引用: Aidaohuakai 发表于 2015-5-7 13:09
2个下降沿之间的时间就是周期T,频率F=1/T,你这程序测不了频率吧!

啥意思,求出周期不就能算出频率了吗?
举报

Aidaohuakai

2015-5-7 17:46:53
引用: xinghuayu 发表于 2015-5-7 17:33
啥意思,求出周期不就能算出频率了吗?

中断里没处理啊!中断里一直读CCAP0H,CCAP0L,好像没意义吧!CCAP0H,CCAP0L也没清零,早就溢出了
举报

武旭东

2015-5-7 18:36:08
引用: Aidaohuakai 发表于 2015-5-7 17:46
中断里没处理啊!中断里一直读CCAP0H,CCAP0L,好像没意义吧!CCAP0H,CCAP0L也没清零,早就溢出了

嗯,测频率的还没加呢。CCAP0H,CCAP0L是捕获的CH,CL的值,还是说将CH,CL的值加进去啊?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分