2936|6

173

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

为什么进入不了定时器的中断啊!!!! [复制链接]

  1. #include<msp430g2553.h>

  2. /*
  3. *  the OSC is not work, run this function
  4. */
  5. void FaultRoutine()
  6. {
  7.    P1OUT = 0x01;                        // P1.0 on (red LED)
  8.    while(1);                                         // TRAP
  9. }
  10. /*
  11. * initialize Clock Module
  12. * use DCO clock as MCLK and SMCLK
  13. * the frequency of DCO is 1MHZ; MCLK and SMCLK is 1MHZ
  14. */
  15. void init_CLOCK()
  16. {
  17.         if(CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
  18.         {
  19.                 FaultRoutine();                            // If calibration data is erased then run FaultRoutine
  20.         }
  21.         BCSCTL1=CALBC1_1MHZ;                                 //Set range
  22.         DCOCTL=CALDCO_1MHZ;                                        //Set DCO step + modulation
  23.         BCSCTL3 |= LFXT1S_0;                // LFXT1 =Normal operation
  24.         IFG1 &= ~OFIFG;                     // Clear OSCFault flag
  25.         BCSCTL2|=SELM_0+DIVM_0+DIVS_0;                //MCLK and SMCLK(use DCO) Divider:1 [internal resistor]
  26. }
  27. /*
  28. * initialize digital IO port
  29. */
  30. void init_IO()
  31. {
  32.         P1DIR&=~BIT3;                                                //set P1DIR is input(Reset with PUC)[P1.3 is input]
  33.         P1DIR|=BIT6+BIT0;                                        //set P1.0 and P1.6 are output
  34.         P1OUT=0;
  35. }

  36. /*
  37. * initialize Timer A
  38. * SMCLK is 1MHZ
  39. */
  40. void init_TA()
  41. {
  42.         TACTL|=TASSEL_2+ID_0+MC_1+TAIE;                //use SMCLK[1M]/up mode/interrupt enable/No interrupt pending
  43.         TAR=0;
  44.         TACCR0=500;                                                //0.05s
  45.         TACCTL0|=CAP+CCIE;                                                //use Compare mode
  46.         TACCTL0&=~CCIFG;
  47. }
  48. /*
  49. * main function
  50. */
  51. void main()
  52. {
  53.         WDTCTL=WDTHOLD+WDTPW;                        //watch dog timer is stopped
  54.         init_CLOCK();                                        //initialize basic clock
  55.         init_IO();                                                //initialize digtal IO port
  56.         init_TA();
  57.         _EINT();
  58.         while(1)
  59.         {
  60. //                P1OUT|=BIT6;
  61. //                _delay_cycles(100000);
  62. //                P1OUT&=~BIT6;
  63. //                _delay_cycles(100000);
  64.         }
  65. }

  66. #pragma vector=TIMER0_A0_VECTOR
  67. __interrupt void Timer_A (void)
  68. {
  69.         //P1OUT=0;                                                //close green led
  70.         P1OUT|=BIT6;                                        //open red led
  71.         _delay_cycles(100000);
  72.         //TACCTL0&=~CCIFG;                                        //clear interrupt flag
  73. }
复制代码


调试程序时中断的flag位显示为1了,但就是进入不了中断程序啊……
硬件为msp430g2553launchpad,刚开始学习,求指教

最新回复

如果进入LPM3别忘了配置时钟,  例如   BCSCTL3 |= LFXT1S_2;                                                        // LFXT1 = VLO   详情 回复 发表于 2015-1-6 14:54
 
点赞 关注

回复
举报

1794

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
千万不要在中断服务程序里添加任何延时

点评

[attachimg]184904[/attachimg] 仿真时,暂停后,程序就停止在上图中,按程序的字面意思应该是跳转的中断服务程序出现了问题,中断向量是TIMER0_A0_VECTOR[/backcolor] 连中断程序都没进去,中断程序里的延时  详情 回复 发表于 2015-1-6 09:13
 
 

回复

173

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
sint27 发表于 2015-1-6 08:18
千万不要在中断服务程序里添加任何延时


仿真时,暂停后,程序就停止在上图中,按程序的字面意思应该是跳转的中断服务程序出现了问题,中断向量是TIMER0_A0_VECTOR
  1. #pragma vector=TIMER0_A0_VECTOR
  2. __interrupt void Timer_A (void)
  3. {
  4.         //P1OUT=0;                                                //close green led
  5.         P1OUT|=BIT6;                                        //open red led
  6.         _delay_cycles(100000);
  7.         //TACCTL0&=~CCIFG;                                        //clear interrupt flag
  8. }
复制代码


连中断程序都没进去,中断程序里的延时应该不是影响这个问题的原因……


 
 
 

回复

9744

帖子

24

TA的资源

版主

4
 

        __bis_SR_register( GIE);                                        //interrupts enabled

点评

我把TAIE删掉就好了,可以进入中断了。我发现同时开启TACCTL0和TACTL的中断使能后就进入不了中断 不知道为什么??  详情 回复 发表于 2015-1-6 13:21
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

173

帖子

1

TA的资源

一粒金砂(中级)

5
 
littleshrimp 发表于 2015-1-6 12:55
__bis_SR_register( GIE);                                        //interrupts enabled
  1. void init_TA()
  2. {
  3.         TACTL|=TASSEL_2+ID_0+MC_1;                //use SMCLK[1M]/up mode/interrupt enable/No interrupt pending
  4.         TAR=0;
  5.         TACCR0=500;                                                //0.05s
  6.         TACCTL0|=CAP+CCIE;                                                //use Compare mode
  7.         TACCTL0&=~CCIFG;
  8. }
复制代码
我把TAIE删掉就好了,可以进入中断了。我发现同时开启TACCTL0和TACTL的中断使能后就进入不了中断
不知道为什么??




点评

我在使用TIMER时习惯使用TA0CCTL0而不是TACCTL0,之前曾遇到过其它问题,不知道和你的有没有直接联系。 https://bbs.eeworld.com.cn/thread-449213-1-1.html 下边是我使用TA0延时的函数,希望你能用上。  详情 回复 发表于 2015-1-6 14:51
 
 
 

回复

9744

帖子

24

TA的资源

版主

6
 
涛声依旧00 发表于 2015-1-6 13:21
我把TAIE删掉就好了,可以进入中断了。我发现同时开启TACCTL0和TACTL的中断使能后就进入不了中断
不知道为什么??

我在使用TIMER时习惯使用TA0CCTL0而不是TACCTL0,之前曾遇到过其它问题,不知道和你的有没有直接联系。
https://bbs.eeworld.com.cn/thread-449213-1-1.html
下边是我使用TA0延时的函数,希望你能用上。
  1. void delay_ms_lpm3(uint16_t ms)
  2. {
  3.     ta_lpm = LPM3_bits;                                                         //低功耗LPM3_bits   
  4.     if(ms > 5957)while(1);
  5.     TA0CCTL0 = CCIE;                                                            // CCR0 interrupt enabled
  6.     TA0CCR0 = 11*ms;
  7.     TA0CTL = TASSEL_1 + MC_1;                                                   // ACLK = 11KHz, Up to CCR0  
  8.     if(ta_lpm)
  9.     {
  10.         __bis_SR_register(ta_lpm + GIE);                                        // CPU off, interrupts enabled
  11.     }
  12.     else
  13.     {
  14.         while((TA0CTL & TAIFG) == 0);
  15.     }
  16. }
复制代码
  1. // Timer A0 interrupt service routine
  2. #pragma vector=TIMER0_A0_VECTOR
  3. __interrupt void Timer_A (void)
  4. {
  5.     TA0CTL &= ~(MC_1);
  6.     TA0CCTL0 &= ~(CCIE);
  7.     if(ta_lpm)
  8.     {
  9.         __bic_SR_register_on_exit(ta_lpm);        // Exit LPMx
  10.     }
  11. }
复制代码





 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

9744

帖子

24

TA的资源

版主

7
 
如果进入LPM3别忘了配置时钟,  例如  
BCSCTL3 |= LFXT1S_2;                                                        // LFXT1 = VLO
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

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

随便看看
查找数据手册?

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-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表