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.

请问定时中断的几个向量TIMER0_A0,TIMER0_A1等的区别以及ADC电压采样问题

Other Parts Discussed in Thread: MSP430G2553

1、请问定时中断的几个向量TIMER0_A0,TIMER0_A1,TIMER1_A0,TIMER1_A1的区别?它们分别是起什么作用?对应的是哪个中断?什么时候该用哪个?我读了很多次文档,没搞懂,请老师指点一下。

2、我刚用MSP430G2553,学习一个月了,今天用ADC10做电压采样,  初始化如下:

ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled

   ADC10CTL1 = INCH_1;            

   ADC10AE0 |= 0x02;      

为什么我P1,1口什么信号都没加,显示的值却不是0?(ADCMEM不是0)但我加上所测电压后,能正常工作?

  • Jordge Micheal, 你好!

    1. 关于定时器的中断,TIMER0_A0,TIMER0_A1是对应Timer0的中断,TIMER1_A0,TIMER1_A1是对应Timer1的中断,这个和你具体用的Device有多少个Timer是有关的。下面具体说一下 TIMER0_A0和TIMER0_A1的区别,首先先清楚一点,一个Timer会有多个Capture/Compare Registers, 我们暂且称其为通道,说白了就是有多少个CCRx, 以G2553为例,它有两个Timer,分别为Timer0和Timer1,Timer0和Timer1又分别有3个通道,分别为CCR0,CCR1和CCR2.

    1)TIMER0_A0 对应的是TACCR0 interrupt vector for TACCR0 CCIFG,它是一个单中断源中断向量,也是优先级最高的中断向量。在不同的工作模式下,Capture/CompareTACCR0 CCIFG被置的原因是不同的,在Capture捕获模式下时,CCR0若捕获了一个时间值,那么对应的CCIFG就会被置;而在Compare比较模式下时,当TAR计数到CCR0值时,对应的CCIFG就会被置。

    2)而TIMER0_A1是一个复合中断源中断向量,对G2553而言,它包含了TACCR1 CCIFG, TACCR2 CCIFG, and TAIFG flags。关于TACCR1 CCIFG, TACCR2 CCIFG,它是1)中所说的TACCR0 CCIFG工作原理一样,只是他们是CCR1和CCR2分别对应的,而TACCR0 CCIFG是CCR0对应的。下面具体介绍一下TAIFG, TAIFG是CCR0的溢出标志。当Timer counts from TACCR0 to zero时,TAIFG被置。故TACCR0 CCIFG要比TAIFG早置1个Timer Clock.看了下面这个图,会有助于你的理解。

    Timer中断的具体解释详见“MSP430x2xx Family User's Guide”的12.2.6,讲的更具体。

  • Jordge Micheal, 你好!

    关于你的第二个问题,有关ADC10,当P1.1什么都不加时,说明此时ADC10的Channel1的输入管脚是浮动的,状态并不稳定,受周围环境和电平的影响,故读回的值不为0,只要加上电压之后可以正常工作即可,再者,你试试把它接地,看看读出来的是不是0。

  • 1.TIMER0_A0,A1都是定时器A模块下面的两个子模块,他们共用TimeA的时钟计数器,时钟计数器根据CLK计数从0-0xffff,我们可以设置A0中CCR0作为计数器上限,TA计数到CCR0产生定时中断,计数器重新计数,而A1的CCR1一般用作PWM比较输出使用了。

    2.你用的是launchpad吗?Launchpad GPIO是悬空的,所以你去读数值不为0,你可以尝试把该引脚接地后再测量,ADC采样值就为0了。如果真正作为ADC采样引脚,我们需要对该引脚下拉一个电阻接地,保证没有信号源时,ADC采样的数据为0。

  • 1.就是TIMER-A的IP内核,在这款MCU上有两个,寄存器名字区别TAX-TA0,TA1

    2.注意GPIO的几个寄存器配置,P1SEL.x=1, P1MAP.x=31,INCHx = 0,X为模拟通道号

  • 这是一个P1.1ADC采样的例程,也许对你有帮助

    //******************************************************************************

    //  MSP430G2x33/G2x53 Demo - ADC10, Sample A1, 1.5V Ref, Set P1.0 if > 0.2V

    //

    //  Description: A single sample is made on A1 with reference to internal

    //  1.5V Vref. Software sets ADC10SC to start sample and conversion - ADC10SC

    //  automatically cleared at EOC. ADC10 internal oscillator times sample (16x)

    //  and conversion. In Mainloop MSP430 waits in LPM0 to save power until ADC10

    //  conversion complete, ADC10_ISR will force exit from any LPMx in Mainloop on

    //  reti. If A1 > 0.2V, P1.0 set, else reset.

    //

    //                MSP430G2x33/G2x53

    //             -----------------

    //         /|\|              XIN|-

    //          | |                 |

    //          --|RST          XOUT|-

    //            |                 |

    //        >---|P1.1/A1      P1.0|-->LED

    //

    //  D. Dang

    //  Texas Instruments Inc.

    //  December 2010

    //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10

    //******************************************************************************

    #include "msp430g2553.h"

    void main(void)

    {

     WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

     ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;

     __enable_interrupt();                     // Enable interrupts.

     TACCR0 = 30;                              // Delay to allow Ref to settle

     TACCTL0 |= CCIE;                          // Compare-mode interrupt.

     TACTL = TASSEL_2 | MC_1;                  // TACLK = SMCLK, Up mode.

     LPM0;                                     // Wait for delay.

     TACCTL0 &= ~CCIE;                         // Disable timer Interrupt

     __disable_interrupt();

     ADC10CTL1 = INCH_1;                       // input A1

     ADC10AE0 |= 0x02;                         // PA.1 ADC option select

     P1DIR |= 0x01;                            // Set P1.0 to output direction

     for (;;)

     {

       ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start

       __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exi

       if (ADC10MEM < 0x88)                    // ADC10MEM = A1 > 0.2V?

         P1OUT &= ~0x01;                       // Clear P1.0 LED off

       else

         P1OUT |= 0x01;                        // Set P1.0 LED on

     }

    }

    // ADC10 interrupt service routine

    #pragma vector=ADC10_VECTOR

    __interrupt void ADC10_ISR (void)

    {

     __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)

    }

    #pragma vector=TIMER0_A0_VECTOR

    __interrupt void ta0_isr(void)

    {

     TACTL = 0;

     LPM0_EXIT;                                // Exit LPM0 on return

    }