This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2333:访问 TA0和 TA1的独立计时器中断、CCR0 &CCR1 &CCR2 &溢出

Guru**** 2384970 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1245447/msp430g2333-access-independent-timer-interrupts-for-ta0-and-ta1-ccr0-ccr1-ccr2-overflow

器件型号:MSP430G2333

您好!

我正在尝试为 TA0 CCR0、1、2和溢出创建独立的计时器中断。  我的目标是学习 timer0_A3和 Timer1_A3的全部8个计时器中断。 我已经尝试  使用 timer0获得4个中断(ccr0、ccr1、ccr2、溢出),并且没有接收到 TA0CCR2中断。 我使用了单独的引脚排列进行验证、并将其用于教学目的。 代码如下。

#include <msp430.h>

volatile int k=0;


void main(void){

	WDTCTL = WDTPW | WDTHOLD;		// stop watchdog timer
	P1DIR |= 0xEF;					// configure P1.7 as input
	P2DIR |= 0x01;

    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;

//Timer0...................................................................................
	TA0CCTL2 |= CCIE;                //Timer 1 CCR2 interrupt enabled
	TA0CCR2 = 30000;
    TA0CCTL1 |= CCIE;                // CCR1 interrupt enabled
    TA0CCR1 = 40000;
    TA0CCTL0 |= CCIE;                // CCR0 interrupt enabled
    TA0CCR0 = 5000;
	TA0CTL = TASSEL_2 + MC_2 + ID_3 + TAIE; //overflow enabled
	
//Timer1...................................................................................
    TA1CCTL0 = CCIE;                // timer 2 CCR0 interrupt enabled
    TA1CCR0 = 60000;
    TA1CTL = TASSEL_2 + MC_2 + ID_3;
    
//Port_Interrupt...................................................................................
	P2IES &= (~0x80);               // rising Edge
	P2IFG &= (~0x80);               // Clear interrupt flag for P1.1 and P1.2
	P2IE  |= (0x80);                 //Enable interrupt for P1.3

    _enable_interrupt();


	while(1);
	}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0(void){ //TA0CCR0

    P1OUT ^= 0x01;

}


#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1(void){  //TA0CCR1 + TA0CCR2 + OVERFLOW

    switch( TA0IV )
    {
    case  0X0002:
      {
          P1OUT ^= 0x08;
          break;}

    case  0X0004:
    {
          P1OUT ^= 0x10;
          break;}

    case 0x000A:
    {
          P1OUT ^= 0x40;
          break;}

   }

}

#pragma vector = TIMER1_A0_VECTOR  // TA1CCR0
__interrupt void Timer_A1 (void){

    P2OUT ^= 0x01;

}

我想知道没有发生 ccr2中断的原因。 不要介意端口中断。 任何类型的帮助都将非常感谢。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如何确定未发生 CCR2中断?

    我没有 G2333、但此代码在 G2553上按预期运行(包括 P1.4 wimging)。

    ----------------

    主动提供:如果您没有 PORT2_VECTOR、您不应设置 P2IE。 当引脚悬空时、您可能会以默认 ISR 结束、这会妨碍您的实验。

    另外、请注意 P2.7 (和 P2.6)、因为它在复位时设置为备用功能。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    我已经为 LED 连接了端口1 0x10引脚。 发生 TA0CCR2时、0x10引脚应切换。 其他3个中断(Overflow、TA0CCR0、TA0CCR1)的表现完全符合预期。 我不知道没有发生 CCR2的原因。  

    -------------------------------------------------------

    P2.6和 P2.7被用来连接32kHz 时钟晶振。 但我不打算使用 ACLK。 一个重要的任务被分配给我,因此,我在一个艰难的时间表。  此外、我使用了端口2中断进行边沿检测、它不是悬空的。 我按如下方式更新了代码。

    #include <msp430.h>
    
    void Set_DCO(unsigned int Delta);
    #define DELTA_1MHZ    244                   // 244 x 4096Hz = 999.4Hz
    
    volatile int edgedetect=0;
    volatile unsigned int turnoff=0;
    
    void main(void){
    
    	WDTCTL = WDTPW | WDTHOLD;		// stop watchdog timer
    	P1DIR |= 0xEF;					// configure P1.0 as output
    	P2DIR |= 0x01;
    
        BCSCTL1 = CALBC1_1MHZ;
        DCOCTL = CALDCO_1MHZ;
    
    //Timer0...................................................................................
    	TA0CCTL2 |= CCIE;                //Timer 1 CCR2 interrupt enabled
    	TA0CCR2 = 30000;
        TA0CCTL1 |= CCIE;                // CCR1 interrupt enabled
        TA0CCR1 = 40000;
        TA0CCTL0 |= CCIE;                // CCR0 interrupt enabled
        TA0CCR0 = 5000;
    	TA0CTL = TASSEL_2 + MC_2 + ID_3 + TAIE;
    
    //Timer1...................................................................................
       // TA1CCTL0 = CCIE;                // timer 2 CCR0 interrupt enabled
    	TA1CCTL0 = (~CCIE);
    	TA1CCR0 = 62500;
    	TA1CTL = TASSEL_2 + MC_1 + ID_3;
    
    //Port_Interrupt...................................................................................
    	P2IES &= (~0x80);               // rising Edge
    	P2IFG &= (~0x80);               // Clear interrupt flag for P1.1 and P1.2
    	P2IE  |= (0x80);                 //Enable interrupt for P1.3
    
        _enable_interrupt();
    
    
    	while(1);
    	}
    
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0(void){ //TA0CCR0
    
        P1OUT ^= 0x01;
    
    }
    
    
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void Timer0_A1(void){  //TA0CCR1 + TA0CCR2 + OVERFLOW
    
        switch( TA0IV )
        {
        case  0X0002:
          {
              P1OUT ^= 0x08;
              //CCTL1 &= ~CCIFG;
              break;}
    
        case  0X0004:
        {
              P1OUT ^= 0x10;
              //CCTL2 &= ~CCIFG;
              break;}
    
        case  0x000A:
        {
              P1OUT ^= 0x40;
              break;}
    
       }
    
    }
    
    #pragma vector = TIMER1_A0_VECTOR  // TA1CCR0
    __interrupt void Timer_A1 (void){
    
        turnoff++;
        if(turnoff==6){
            P2OUT |= 0x01;
        turnoff = 0;}
    
    }
    
    
    
    #pragma vector=PORT2_VECTOR
    __interrupt void Port_2(void)
    {
    	    if(edgedetect % 2 == 0){
    	       
    	        TA1CCTL0 = CCIE;           //RISING EDGE DETECTION.
    	        TA1CCR0 = 62500;
    	        TA1CTL = TASSEL_2 + MC_1 + ID_3;
    	        TA1R = 0;
    
    	    }else{
    	        TA1R = 0;
    	        P2OUT = 0x00;
    	        turnoff = 0;
    	        TA1CCTL0 = (~CCIE);       //FALLING EDGE DETECTION.
    
    	    }
    	    P2IES ^= 0x80;      // edge detection toggle
    	    P2IFG &= ~(0x80);
    	    edgedetect++;
    	}
    
    
    
    
    

    您需要了解 CCR2问题。  谢谢你的答复。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    覆盖输出引脚非常简单、但我不会直接解释为什么不发生中断。 首先、我要在 ISR 中设置一个断点、以查看是否发生了断点、但引脚未切换、或者如果由于某种原因调试器不可用、则交换引脚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于 P1DIR |= 0xEF;它似乎没有启用 P1OUT 的输出^= 0x10;。