2949|10

29

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用定时器A测方波周期成功,改用定时B却出不来,求助哪里有问题。。 [复制链接]

这是A成功了的
  1. /****************POWSOS__430************************
  2. 程序功能:动态显示文字“welcome”
  3. ----------------------------------------------------
  4. 测试说明:观察液晶显示

  5. //算方波的周期  多少秒
  6. ****************************************************/
  7. #include  <msp430x14x.h>
  8. #include  "paly.h"
  9. #include  <stdio.h>

  10. unsigned char buf[];
  11. unsigned char x[];
  12. float pwm;
  13. float cha;
  14. unsigned int pwm_start1,pwm_end1,pwm_wide1;
  15. unsigned int over;
  16. unsigned int pwm_start2,pwm_end2,pwm_wide2;

  17. void main(void)
  18. {
  19.     WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  20.    
  21.     P1SEL|=BIT2;                              //P1.2 CCI1A
  22.     P1SEL|=BIT3;                              //P1.3 CCI2A   
  23.     P3DIR|=BIT0;
  24.     P4DIR&=~BIT0;
  25.   
  26.     TACCTL1 =CAP+CM_3+CCIS_0+SCS+CCIE;  //捕获模式,上升和下降都捕获,选择CCI1A,同步,捕获中断开  Capture input select: 0 - CCI1A   
  27.     TACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE;  //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开  Capture input select: 0 - CCI2A
  28.     TACTL = TASSEL_1 + MC_2;    //ACLK,L连续计数模式
  29.     _EINT();                 //开总中断
  30.     _NOP();

  31.     while(1)
  32.     {
  33.         if(pwm_end1>=pwm_start1)
  34.         {
  35.             pwm_wide1=(pwm_end1-pwm_start1)*2;
  36.         }
  37.         else if(pwm_end1<pwm_start1)
  38.         {
  39.             pwm_wide1=(pwm_start1-pwm_end1)*2;
  40.         }      
  41.         //pwm_cha=pwm_start1-pwm_start2;
  42.         pwm=pwm_wide1;
  43.         cha=pwm/32768;
  44.         //显示程序      
  45.         WDTCTL = WDT_ADLY_1000;              //间隔定时器,定时1000ms
  46.         P6DIR |= BIT2;P6OUT |= BIT2;          //关闭电平转换
  47.         LcdReset();
  48.         sprintf(buf,"%f",cha);
  49.         DispNChar(1,0,8,buf);
  50.         sprintf(x,"%f",over);
  51.         DispNChar(3,1,4,x);
  52.     }
  53.   
  54. }

  55. // Timer_A3 Interrupt Vector (TAIV) handler
  56. #pragma vector=TIMERA1_VECTOR
  57. __interrupt void Timer_A(void)
  58. {
  59.   
  60.   switch(TAIV)
  61. {case 2:
  62.      if(TACCTL1 & CM0)
  63.      {
  64.         pwm_start1=CCR1;
  65.         TACCTL1=(TACCTL1&(~CM0))|CM1; //更变设置为下降沿触发
  66.         over=0;
  67.      }
  68.      else if(TACCTL1 & CM1)
  69.      {
  70.        TACCTL1=(TACCTL1&(~CM1))|CM0; //更变设置为上升沿触发
  71.        pwm_end1=CCR1;
  72.      }
  73.      break;   
  74.   case 4:
  75.      if(TACCTL2 & CCI)
  76.         pwm_start2=CCR2;   
  77.      else
  78.         pwm_end2=CCR2;
  79.      break;
  80.   case 10:
  81.     over++;
  82.     break;
  83.   }         
  84.   LPM0_EXIT;
  85.   return;
  86. }
复制代码



这是我依照定时器A改的定时器B的。。。
  1. /****************POWSOS__430************************
  2. 程序功能:动态显示文字“welcome”
  3. ----------------------------------------------------
  4. 测试说明:观察液晶显示

  5. //算方波的周期  多少秒
  6. ****************************************************/
  7. #include  <msp430x14x.h>
  8. #include  "paly.h"
  9. #include  <stdio.h>

  10. unsigned char buf[];
  11. unsigned char x[];
  12. float pwm;
  13. float cha;
  14. unsigned int pwm_start1,pwm_end1,pwm_wide1;
  15. unsigned int over;
  16. unsigned int pwm_start2,pwm_end2,pwm_wide2;

  17. void main(void)
  18. {
  19.     WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  20.    
  21.     P4SEL|=BIT1;  //P4.1
  22.     P3DIR|=BIT0;
  23.     P4DIR&=~BIT0;
  24.   
  25.     TBCCTL1 =CAP+CM_3+CCIS_1+SCS+CCIE;  //捕获模式,上升和下降都捕获,选择CCI1A,同步,捕获中断开  Capture input select: 0 - CCI1A   
  26.     TBCTL = TBSSEL_1 + MC_2;    //ACLK,L连续计数模式
  27.     _EINT();                 //开总中断
  28.     _NOP();

  29.     while(1)
  30.     {
  31.         if(pwm_end1>=pwm_start1)
  32.         {
  33.             pwm_wide1=(pwm_end1-pwm_start1)*2;
  34.         }
  35.         else if(pwm_end1<pwm_start1)
  36.         {
  37.             pwm_wide1=(pwm_start1-pwm_end1)*2;
  38.         }      
  39.         //pwm_cha=pwm_start1-pwm_start2;
  40.         pwm=pwm_wide1;
  41.         cha=pwm/32768;
  42.         //显示程序      
  43.         WDTCTL = WDT_ADLY_1000;              //间隔定时器,定时1000ms
  44.         P6DIR |= BIT2;P6OUT |= BIT2;          //关闭电平转换
  45.         LcdReset();
  46.         sprintf(buf,"%f",cha);
  47.         DispNChar(1,0,8,buf);
  48.         sprintf(x,"%f",over);
  49.         DispNChar(3,1,4,x);
  50.     }
  51.   
  52. }

  53. // Timer_B7 Interrupt Vector (TAIV) handler
  54. #pragma vector=TIMERB0_VECTOR
  55. __interrupt void Timer_B(void)
  56. {
  57.   
  58.   switch(TBIV)
  59. {case 2:
  60.      if(TBCCTL1 & CM0)
  61.      {
  62.         pwm_start1=CCR1;
  63.         TBCCTL1=(TBCCTL1&(~CM0))|CM1; //更变设置为下降沿触发
  64.         over=0;
  65.      }
  66.      else if(TBCCTL1 & CM1)
  67.      {
  68.        TBCCTL1=(TBCCTL1&(~CM1))|CM0; //更变设置为上升沿触发
  69.        pwm_end1=CCR1;
  70.      }
  71.      break;   
  72.   case 4:
  73.      if(TBCCTL2 & CCI)
  74.         pwm_start2=CCR2;   
  75.      else
  76.         pwm_end2=CCR2;
  77.      break;
  78.   case 10:
  79.     over++;
  80.     break;
  81.   }         
  82.   LPM0_EXIT;
  83.   return;
  84. }
复制代码



不明白为什么A能出来改成B就不行了。。

最新回复

没有,我以前只写过使用测量频率的程序,并且我用的G2553没有定时器B,所以在这方面不帮不了你了   详情 回复 发表于 2014-8-12 13:13
 
点赞 关注

回复
举报

29

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
没人帮助咩。。
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
你看一下定时器的中断优先级对不对

点评

改了之后也是只针对一个波的啊,没有同时使用定时器A和定时器B,应该不存在中断优先级的问题吧。。。  详情 回复 发表于 2014-8-10 10:11
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

4
 
bobde163 发表于 2014-8-10 10:00
你看一下定时器的中断优先级对不对

改了之后也是只针对一个波的啊,没有同时使用定时器A和定时器B,应该不存在中断优先级的问题吧。。。

点评

你调试的时候能进中断吗?  详情 回复 发表于 2014-8-10 14:20
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

5
 
Jiaoeeer 发表于 2014-8-10 10:11
改了之后也是只针对一个波的啊,没有同时使用定时器A和定时器B,应该不存在中断优先级的问题吧。。。

你调试的时候能进中断吗?

点评

不知道怎么进中断。。定时器A那个都是烧进板子算数据才知道是对的。  详情 回复 发表于 2014-8-10 15:46
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

6
 
bobde163 发表于 2014-8-10 14:20
你调试的时候能进中断吗?

不知道怎么进中断。。定时器A那个都是烧进板子算数据才知道是对的。

点评

如果不能在线调试的话,比较难发现问题,只有再好好地检查代码,看一下是不是哪里在替换的时候给漏掉的,还可以在中断里加一些操作比较让某个LED灯亮以表明能正常进入中断,还有引脚有没有选择正确,配置正不正确等  详情 回复 发表于 2014-8-10 17:40
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

7
 
Jiaoeeer 发表于 2014-8-10 15:46
不知道怎么进中断。。定时器A那个都是烧进板子算数据才知道是对的。

如果不能在线调试的话,比较难发现问题,只有再好好地检查代码,看一下是不是哪里在替换的时候给漏掉的,还可以在中断里加一些操作比较让某个LED灯亮以表明能正常进入中断,还有引脚有没有选择正确,配置正不正确等

点评

就是不知道引脚和配置对不对。。不清楚B是怎么配置的,看大多数的例程是这样配置的,不知道为何就是出不来  详情 回复 发表于 2014-8-11 19:36
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

8
 
bobde163 发表于 2014-8-10 17:40
如果不能在线调试的话,比较难发现问题,只有再好好地检查代码,看一下是不是哪里在替换的时候给漏掉的, ...

就是不知道引脚和配置对不对。。不清楚B是怎么配置的,看大多数的例程是这样配置的,不知道为何就是出不来

点评

这还得从程序入手,怀疑引脚配置就看看那部分的代码,对照数据手册里的引脚配置说明再进行检查  详情 回复 发表于 2014-8-11 20:41
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

9
 
Jiaoeeer 发表于 2014-8-11 19:36
就是不知道引脚和配置对不对。。不清楚B是怎么配置的,看大多数的例程是这样配置的,不知道为何就是出不 ...

这还得从程序入手,怀疑引脚配置就看看那部分的代码,对照数据手册里的引脚配置说明再进行检查

点评

你有木有B调试成功的例程呐?  详情 回复 发表于 2014-8-12 09:44
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

10
 
bobde163 发表于 2014-8-11 20:41
这还得从程序入手,怀疑引脚配置就看看那部分的代码,对照数据手册里的引脚配置说明再进行检查

你有木有B调试成功的例程呐?

点评

没有,我以前只写过使用测量频率的程序,并且我用的G2553没有定时器B,所以在这方面不帮不了你了  详情 回复 发表于 2014-8-12 13:13
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

11
 
Jiaoeeer 发表于 2014-8-12 09:44
你有木有B调试成功的例程呐?

没有,我以前只写过使用测量频率的程序,并且我用的G2553没有定时器B,所以在这方面不帮不了你了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表