打印

msp430实现两路捕获出错,用过的朋友们帮忙看看

[复制链接]
3014|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leonlhf|  楼主 | 2010-11-11 17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
msp430实现两路捕获出错,用过的朋友们帮忙看看。MSP430

本帖最后由 leonlhf 于 2010年11月11日 16:51 编辑

为了实现两路捕获,写了个简单的实验程序,可是老是出错,不知道原因。

程序大意是,一共有3个LED灯,其中一个不断的闪烁,表示主程序在运行。另两个分别表示代表两路捕获,捕获成功后,LED就会取反。问题是,只有CCI0A路捕获能正常工作,而CCI1A一旦捕获后,所有的LED都不再变化,就好像死机了一样。


大家帮我检查下吧。程序如下,感觉是很简单的程序,可就是找不到原因,头疼中。。。


  • #include  <msp430x14x.h>
  • 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闪烁
  • }



相关帖子

沙发
易达口香糖| | 2010-11-11 19:12 | 只看该作者
捕获是谁的上升沿,是不是你捕获的那一路就变化一次呢。

使用特权

评论回复
板凳
3B1105| | 2010-11-11 20:52 | 只看该作者
看不出来哪有错啊

使用特权

评论回复
地板
3B1105| | 2010-11-11 20:54 | 只看该作者
楼上说的就算那一路就变化一次,主程序也应该还在运行啊

使用特权

评论回复
5
leonlhf|  楼主 | 2010-11-12 15:30 | 只看该作者
按照说明书,p1.1和p1.2是复用的io,我在这两路接了传感器,用来检验程序

使用特权

评论回复
6
leonlhf|  楼主 | 2010-11-12 15:30 | 只看该作者
2# 易达口香糖
按照说明书,p1.1和p1.2是复用的io,我在这两路接了传感器,用来检验程序

使用特权

评论回复
7
川无停流| | 2010-11-12 21:19 | 只看该作者
仔细的研究一下端口数据手册,也许会发现问题。

使用特权

评论回复
8
黑发尤物| | 2010-11-13 23:07 | 只看该作者
就两个管脚捕捉,不用把P4SEL都选上吧

使用特权

评论回复
9
dl_shuang| | 2010-11-14 06:45 | 只看该作者
Timer_A0 中断能够自动清中断标志,Timer_A1 中断不自动清中断标志。你在Timer_A1 的中断程序中没有清中断标志,一旦中断标志有效,以后就不停的执行中断程序了。

使用特权

评论回复
10
爱在2012| | 2010-12-14 14:38 | 只看该作者
学习

使用特权

评论回复
11
yoyowodeai| | 2011-1-2 21:09 | 只看该作者
还用过timerA1,楼主再好好看看数据手册吧

使用特权

评论回复
12
wc261034| | 2011-1-24 10:50 | 只看该作者
9楼说的对,TAIV 中断标志没清,好好看看中断吧 多中断源共用一个中断向量的时候,读他就清了

使用特权

评论回复
13
米其林r| | 2011-1-25 12:57 | 只看该作者
你的管脚配置成外设模式了吗都?

使用特权

评论回复
14
pidoo| | 2011-2-10 18:34 | 只看该作者
9楼和12楼讲的没错,CCR1的中断函数内只有一个LED取反的指令,没有去访问TAIV,这样的话CCR1的中断标志就不会被清除。这一点与CCR0不同,CCR0的中断只要得到响应,其对应的中断标志就会被自动清除;而CCR1中断标志必须在TAIV被访问后(因为CCR1中断向量是由多个中断请求共用的),它的标志才能被自动清除。不访问TAIV的话,CCR1的中断函数中做再多的事情也于事无补。
因此,在你的应用中如果不需要区分到底是那个中断导致了进入CCR1的中断函数的话,只需要简单的对TAIV进行一次访问即可,比如读取一下TAIV的值,这样就不会出现你现在所说的问题了。
再仔细看看芯片的UM,肯定会有更多的收获。

使用特权

评论回复
15
我爸是李刚| | 2011-2-10 20:12 | 只看该作者
收获颇多!

使用特权

评论回复
16
leonlhf|  楼主 | 2011-10-28 16:24 | 只看该作者
谢谢大家啦。

使用特权

评论回复
17
lingjun1015| | 2012-7-29 10:28 | 只看该作者
高手呀!!!!!!这一个帖子,我的问题也解决了,哈哈!!!!!!!!

使用特权

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

本版积分规则

0

主题

4

帖子

1

粉丝