打印
[应用相关]

两路捕获老是出错

[复制链接]
694|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiqi1|  楼主 | 2017-3-4 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为了实现两路捕获,写了个简单的实验程序,可是老是出错,不知道原因。

程序大意是,一共有3个LED灯,其中一个不断的闪烁,表示主程序在运行。另两个分别表示代表两路捕获,捕获成功后,LED就会取反。问题是,只有CCI0A路捕获能正常工作,而CCI1A一旦捕获后,所有的LED都不再变化,就好像死机了一样。
沙发
feiqi1|  楼主 | 2017-3-4 22:38 | 只看该作者
void delay(int x)
{
   while(x--);
}

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // 停止看门狗
  P4DIR = 0XFF;                  // P4 为输出
  P4OUT = 0XFF;                //初始值为1,使LED灯灭
  P1SEL = 0xff;                    //P1 为外部功能,用于捕捉

  TACTL = TASSEL_1 + MC_2;                  // ACLK为时钟源,连续模式
  TACCTL0 |= 0x4000;            //上升沿捕获
  TACCTL0 |= CAP;                   //捕获模式
  TACCTL0 |= CCIE;                         //捕获中断使能
  TACCTL0 &= 0XCFFF;               //输入为CCI0A路

  TACCTL1 |= 0x4000;                  //上升沿捕获
  TACCTL1 |= CAP;                     //捕获模式
  TACCTL1 |= CCIE;                       //捕获中断使能
  TACCTL1 &= 0XCFFF;                  //输入为CCI1A路

  _EINT();                                  //开总中断

  while(1)
  {
    P4OUT ^=BIT3;             //取反P4.3,LED灯闪烁,示意主程序运行中
    delay(10000);
  }
}

//***********************************************************************
// Timer A0 中断服务程序, A0是指CCR0
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
  P4OUT ^= BIT0;                            // CCI0A路捕获后,LED闪烁
}

//***********************************************************************
// Timer A3 中断服务程序, A3是指CCR1,CCR2,TAR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
  P4OUT ^= BIT1;                            // CCI1A路捕获后,LED闪烁
}

使用特权

评论回复
板凳
androidbus| | 2017-3-4 22:46 | 只看该作者
捕获是谁的上升沿,是不是你捕获的那一路就变化一次呢。

使用特权

评论回复
地板
litengg| | 2017-3-4 22:46 | 只看该作者
楼上说的就算那一路就变化一次,主程序也应该还在运行啊

使用特权

评论回复
5
qiangweii| | 2017-3-4 22:55 | 只看该作者
p1.1和p1.2是复用的io吧

使用特权

评论回复
6
shashaa| | 2017-3-4 22:56 | 只看该作者
仔细的研究一下端口数据手册,也许会发现问题。

使用特权

评论回复
7
xia00| | 2017-3-4 23:08 | 只看该作者
就两个管脚捕捉,不用把P4SEL都选上吧

使用特权

评论回复
8
hfdy01| | 2017-3-4 23:09 | 只看该作者

Timer_A0 中断能够自动清中断标志,Timer_A1 中断不自动清中断标志

使用特权

评论回复
9
CallReceiver| | 2017-3-4 23:17 | 只看该作者
你在Timer_A1 的中断程序中没有清中断标志,一旦中断标志有效,以后就不停的执行中断程序了。

使用特权

评论回复
10
boy1990| | 2017-3-4 23:18 | 只看该作者
在你的应用中如果不需要区分到底是那个中断导致了进入CCR1的中断函数的话,只需要简单的对TAIV进行一次访问就可以了。。

使用特权

评论回复
11
sourceInsight| | 2017-3-4 23:23 | 只看该作者
你的管脚配置成外设模式了吗都?

使用特权

评论回复
12
Listate| | 2017-3-4 23:28 | 只看该作者
比如读取一下TAIV的值,这样就不会出现你现在所说的问题了。

使用特权

评论回复
13
htmlme| | 2017-3-4 23:32 | 只看该作者
上传代码看看。

使用特权

评论回复
14
htmlme| | 2017-3-4 23:33 | 只看该作者
程序在捕获中断有优先级。

使用特权

评论回复
15
soodesyt| | 2017-3-5 20:45 | 只看该作者
feiqi1 发表于 2017-3-4 22:38
void delay(int x)
{
   while(x--);

这个是哪个ST的芯片?

使用特权

评论回复
16
soodesyt| | 2017-3-5 20:45 | 只看该作者
feiqi1 发表于 2017-3-4 22:38
void delay(int x)
{
   while(x--);

这个没有见过这些寄存器,是msp430么?

使用特权

评论回复
17
android2| | 2017-3-9 21:51 | 只看该作者
Timer_A1 中断不自动清中断标志

使用特权

评论回复
18
sanxingnote7| | 2017-3-9 22:44 | 只看该作者
为什么不使用中断捕获恩

使用特权

评论回复
19
sanxingnote7| | 2017-3-9 22:46 | 只看该作者
可以通过上升沿或者下降沿采样。

使用特权

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

本版积分规则

424

主题

1616

帖子

1

粉丝