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.

[参考译文] MSP430G2452:MSP430G2452 ADC10从 TA0触发

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/760383/msp430g2452-msp430g2452-adc10-triggering-from-ta0

器件型号:MSP430G2452

我正在尝试使用 CCR0输出从 TA0触发 ADC10采样/转换、而无需执行 ISR。
如果我使用 OUTMOD_4使 CCR0输出切换、并且使用 ADC10CTL1 |= SHS_2、按照 SLAU144J 第535页的图表、触发应该会通过、而无需设置 ADC10SC。
尽管 ADC10CTL1寄存器描述第555页有一个很好的打印件、"如果器件上存在多个计时器模块、则计时器触发来自 Timer0_Ax。"、这使我认为 MSP430x2xx 系列器件中至少应有2个计时器。
嗯、它不起作用。 通过多个实验、每次需要完成采样/转换时、ADC10SC 看起来都必须置位、只有在 CCR0输出触发它时、ADC10SC 才会置位。

请确认或重新确认我的发现

下面是部分代码。


#include
#define LED                  BIT0
#define CCR0_OUT      BIT1

void TA0_init (void);
void adc_init (void);

void main (void){
   WDTCTL = WDTPW + WDTHOLD;
   if (CALBC1_16MHz=0xFF){WDTCTL=0xDEAD;}
   BCSCTL1 = CALBC1_16MHz;
   DCOCTL = CALDCO_16MHz;
   BCSCTL3 |= LFXT1S_2;    //为 ACLK 选择 VLOCLK、~15KHz
   BCSCTL1 |= DIV_0;        // ACLK/1、用于 LPM0中的 TA0
   BCSCTL2 |= DIVS_1;        // SMCLK/2 =8MHz、用于 ADC 实验

   P1SEL = CCR0_OUT;            // TA0.CCR0输出的范围测试点
   P1DIR = LED +CCR0_OUT; // ADC ISR 和 TA0.CCR0输出的示波器测试点

   TA0_INIT();
   adc_init();

   _EINT();                              //启用 ISR

   TA0CTL |= MC_1;              //启动 TIMER0直到 CCR0

   for (;;){
       _BIS_SR (CPUOFF);        //输入 LPM0
   }

 

void ADC_init (void){           //读取温度计、Trigg。 来自 TA0CCR0、为 ADC10OSC (或 SMCLK)计时
   ADC10CTL0 = SREF_0 + ADC10SHT_2 + REF2_5V + REFON + ADC10ON + ADC10IE;
   ADC10CTL1 = INCH_10 + SHS_2 + ADC10DIV_0 + ADC10SSEL_0 + CONSEQ_0; //尝试 ADC10SSEL_3
   ADC10DTC1 = 0;
   ADC10CTL0 |= ENC + ADC10SC;//为第一个采样/转换设置 ADC10SC


void TA0_init (void){              //计时器 A 用于去抖和其他操作
   TA0CTL = TACLR;                     //清除 TAR
   TA0CTL = tassel_1 + ID_0;   // ACLK (11.5KHz)、/1、(+ MC_1到 CCR0模式)
   TA0CCR0 = 2944;             // TA0CCR0=ACLK*T (sec)=256msec
   TA0CCTL0 = OUTMOD_4;          //切换 CCR0输出


#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void){
   _nop();
   P1OUT μ^= LED;                        //每个 ADC10 ISR 上的可视/示波器输出
   易失性 int ADC_MEM =(ADC10MEM & 0x03FF); //需要访问 ADC10MEM 以清除 ISR
   ADC_MEM ^= 0xFFFF;           //使用 ADC_MEM 执行一些愚蠢的操作来使编译器满意
   ADC10CTL0 |= ADC10SC;     //将 ADC10SC 设置为下一个采样/转换被触发为 TA0 CCR0 OUT






  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您无需在 ADC ISR 中重新发布 SC、但您确实需要切换 ENC 两次(从低到高)以允许下一次触发。 [参考 UG (SLAU144J)第22.2.6.1节和图22-5。]

    另一种方法是使用 CONSEQ=2、MSC=0、这不需要 ENC fiddling。 [参考 UG 图22-7]

    关于 Timer_A 与 Timer_A0的脚注的重要性低于它的声音。 最初只有一个 TimerA、称为"TimerA"。 当他们决定添加第二个名称约定有点不同的名称约定时、他们会切换到 Timer_A0、但仍然存在痕迹。 G2452只有 TA0、但其兄弟姐妹有更多。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢、Bruce。

    我更喜欢第二个选项。 我希望尽可能减少代码行。 我已经过测试、工作正常。

    ADC10CTL0 = SREF_1 + ADC10SHT_3 + REF2_5V + REFON + ADC10ON + ADC10IE;
    ADC10CTL1 = INCH_10 + SHS_2 + ADC10DIV_0 + ADC10SSEL_3 + CONSEQ_2

    对于脚注、我想只要器件有计时器、任何 CCRx 输出都可以用作 ADC 的触发器。

    阿尔森。