求助15系列单片机大佬,关于PCA测脉宽的问题

Sanada_Hellson 2017-10-31 01:25:49
大神好,我是STC15的一只菜鸟 。 头文件什么的我都省了,u16是什么不必多说了吧。以下是我程序的主体:
接下去我说说我的问题,进过测试好像中断进不去,根据官网架子改的进不去什么原因?其次求大佬没我看看逻辑上有没有问题,不胜感激!!


u16 length; //编码器输出脉宽
u16 sum_length; //占空比之和
u16 count1_tmp; //记录上升沿的上一时刻
u16 count0_tmp; //记录下降沿的上一时刻
u16 count1; //当前上升沿时刻
u16 count0; //当前下降沿时刻
u16 cnt; //进入中断的次数
bit CatchMode = 1; //CatchMode为1表示上升沿捕获,为2表示下降沿捕获

长沙-贪吃蛇-单片机 2017/10/31 12:31:32
//PCA模块0测量脉宽
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0
ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
P_SW1 = ACC; //模块0外部接入引脚P3.5
CMOD = 0X08; //空闲时计数,1T模式,禁止定时器溢出中断。
CCON = 0X00; //CF = 0;清除溢出中断标志位,CR = 0;关闭PCA计数
//CFF0中断标志清零
CCAPM0 = 0X21; //上升沿触发捕捉
CH = 0; //复位PCA寄存器
CL = 0;
CCAP0H = 0;
CCAP0L = 0;
CR = 1; //PCA开始计数

长沙-贪吃蛇-单片机 2017/10/31 12:31:38
void PCA_isr() interrupt 7
{
if(CCF0)
{
CR = 0; //暂停PCA计数,此时开始读取捕获时刻
EA = 0; //此过程不允许其他中断打扰
if(CatchMode == 1) //如果是一进来就是上升沿模式那么先改为下降沿捕捉
{
count1 =CCAP0H; //如果上升沿进入记录下时刻
count1 = count1 << 8;
count1_tmp = count1 +CCAP0L;
CCAPM0 = 0X11; //改为下降沿捕捉,CH/CL不清零就继续累计
// CH = 0; //复位PCA寄存器
// CL = 0;
// CCAP0H = 0;
// CCAP0L = 0;
}
else if(CatchMode == 2) //如果是以下降沿捕获时进来中断的话
{

count0 = CCAP0H;
count0 = count0 << 8;
length = count0 + CCAP0L - count1_tmp; //记录当前脉宽
CCAPM0 = 0X21; //记录完后改为上升沿触发捕捉
CH = 0; //复位PCA寄存器
CL = 0;
CCAP0H = 0;
CCAP0L = 0;
CatchMode = 1; //模式标记发生改变
CCF0 = 0; //清理中断标志
cnt++; //累计以上升沿的方式进入中断的次数
}
sum_length += length; //每次产生占空比加一次
if(CatchMode == 1)
{
CatchMode = 2; //在最后如果是上升沿模式就把该模式变为下降沿
}
else if(CatchMode == 2)
{
CatchMode = 1; //如果是下降沿模式就把该模式还原为上升沿
}
EA = 1; //开中断
CR = 1; //PCA开始计数
}
}
...全文
438 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧