【问题标题】:MSP430G2553: continuous ADC10 sampling (with interrupt)MSP430G2553:连续 ADC10 采样(带中断)
【发布时间】:2018-09-18 23:11:29
【问题描述】:

我写了一个小程序,根据ADC10中断对MSP430G2553的内部温度传感器进行连续采样。但是,我的代码并没有这样做。它(仅)触发一次中断,填充数组的第一个索引,然后停止。我错过了什么?

    #include <msp430g2553.h>

/**
 * main.c
 * Use ADC module to read the value of the MCU's internal temperature sensor
 * and dump those values into an array.
 */

volatile unsigned counter = 0;
volatile unsigned temparr[20];

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                                           // Stop WDT

    ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + MSC;  // Set ADC module
    ADC10CTL1 = CONSEQ_0 + INCH_10 + ADC10DIV_7;                        // Set ADC module
    ADC10DTC0 = ADC10CT;                                                // Set ADC module

    ADC10CTL0 |= ENC + ADC10SC;                                         // Start ADC + sampling

    __enable_interrupt();

}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_IRS(void)
{
    while (ADC10CTL1 & BUSY);                                           // Give time to the ADC to settle

    if (counter < 20) {
        temparr[counter] = ADC10MEM;
        counter++;
    }

    else {
        counter = 0;
    }
}

【问题讨论】:

  • @HeadCode 22.2.10:“处理中断请求时,ADC10IFG 标志会自动复位。”
  • 从逻辑上讲,您的程序在从main 返回时停止。永远不要在嵌入式程序中这样做。
  • @CL。如果 ADC10CTL(0 & 1) 注册表不设置为连续采样,就会出现这种情况。我想我成功了,我在下面发布代码

标签: msp430 texas-instruments


【解决方案1】:
    #include <msp430g2553.h>

/**
 * main.c
 * Use ADC module to read the value of the MCU's internal temperature sensor
 * and dump those values into an array.
 */

volatile unsigned counter = 0;
volatile unsigned temparr[20];

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                                           // Stop WDT

    ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + MSC;  // Set ADC module
    ADC10CTL1 = CONSEQ_2 + INCH_10 + ADC10DIV_7;                        // Set ADC module
    ADC10DTC0 = ADC10CT;                                                // Set ADC module

    ADC10CTL0 |= ENC + ADC10SC;

    __enable_interrupt();

}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_IRS(void)
{
    //while (ADC10CTL1 & BUSY);                                           // Give time to the ADC to settle

    if (counter < 20) {
        temparr[counter] = ADC10MEM;
        counter++;
    }

    else {
        counter = 0;
        ADC10CTL0 &= ~(ENC + ADC10SC);
    }
}

这似乎是调试器的问题。运行代码几次后,它才开始工作:S。我正在使用通过 Spy-By-Wire 直接连接到 MSP430G2553 芯片的 MSP-FET 闪存工具。我知道一些 TI 用户在最新固件更新 (CCS8) 后报告了此设备的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2021-06-03
    • 2018-12-16
    相关资源
    最近更新 更多