MSP430G2553: непрерывная выборка ADC10 (с прерыванием) - PullRequest
0 голосов
/ 19 сентября 2018

Я написал небольшую программу для непрерывной выборки внутреннего датчика температуры MSP430G2553 на основе прерывания ADC10.Мой код, однако, этого не делает.Он запускает прерывание (только) один раз, заполняет первый индекс массива и затем останавливается.Чего мне не хватает?

    #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;
    }
}

1 Ответ

0 голосов
/ 19 сентября 2018
    #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.Я использую MSP-FET Flash Tool, подключенный напрямую к микросхеме MSP430G2553 через Spy-By-Wire.Я знаю, что некоторые пользователи TI сообщали о проблемах с этим устройством после последнего обновления прошивки (CCS8).

...