[LaunchPad] 为什么进入不了定时器的中断啊!!!!

涛声依旧00   2015-1-6 00:02 楼主
  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,刚开始学习,求指教

回复评论 (6)

千万不要在中断服务程序里添加任何延时
点赞  2015-1-6 08:18
引用: sint27 发表于 2015-1-6 08:18
千万不要在中断服务程序里添加任何延时
QQ截图20150106091101.png


仿真时,暂停后,程序就停止在上图中,按程序的字面意思应该是跳转的中断服务程序出现了问题,中断向量是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. }


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


点赞  2015-1-6 09:13

        __bis_SR_register( GIE);                                        //interrupts enabled
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-1-6 12:55
引用: 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的中断使能后就进入不了中断
不知道为什么??




点赞  2015-1-6 13:21
引用: 涛声依旧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. }





虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-1-6 14:51
如果进入LPM3别忘了配置时钟,  例如  
BCSCTL3 |= LFXT1S_2;                                                        // LFXT1 = VLO
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-1-6 14:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复