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.

[参考译文] MSP430G2553:ADC 在 ADC 的 ISR 中更改 INCH_x

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/764964/msp430g2553-adc-change-inch_x-in-isr-of-adc

器件型号:MSP430G2553

我编写一个程序、该程序应将来自 A6 (引脚1.6)的信号数字化。 在进行90次采样后、我想检查电池状态。 为此、我将 INCH_x 更改为 A7 (引脚1.7)。

我的问题:在 ADC 停止后(复位 ENC 和 ADC10SC)、INCH_x 更改为 A7并重新启动(设置 ENC 和 ADC10SC)、ADC 不再被触发。 我调试了程序、引脚1.7的第一次转换工作正常。 但之后再也不会进入 ISR。

以下是我的代码:

#pragma vector=ADC10_vector
__interrupt void ADC10_ISR (void){
反 ISR++;
//标准转换
if (counterISR < 90){
tempRaw = ADC10MEM;
serial_write_int (tempRaw);
}
//发送数据并更改 ADC 的输入通道
否则、如果(counterISR = 90){
tempRaw = ADC10MEM;
serial_write_int (tempRaw);
stoppadc ();
ADC10CTL1 = INCH_7;
startadc ();
}
//不发送数据,只需添加值
否则、如果(90 <反 ISR &&反 ISR < 100){
tempRaw = ADC10MEM;
batteryLevel += tempRaw;
}
否则、如果(counterISR =100){
tempRaw = ADC10MEM;
batteryLevel += tempRaw;
int batAmage = batteryLevel / 10;
serialWrite ('!');
serialWrite ('!');
serial_write_int (batAseage);
stoppadc ();
ADC10CTL1 = INCH_6;
startadc ();
反 ISR = 0;
}
}

void startADC (void){
ADC10CTL0 |= ENC + ADC10SC;
}

void stoppADC (void){
ADC10CTL0 &=~ENC;
ADC10CTL0 &=~ADC10SC;
}

void configADC (void){
P1SEL = BIT6 + BIT7;
ADC10CTL0 = 0;
ADC10CTL0 = ADC10SHT_3 + SREF_1 + REFON + ADC10ON + ADC10IE;
ADC10CTL1 = INCH_6 + SHS1 + CONSEQ1;
ADC10AE0 = BIT6 + BIT7;
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Markus、您好!

    如果停止 ADC 并更改通道、还必须像在 configADC 中那样设置序列。

    ADC10CTL1 = INCH_6 + SHS1 + CONSEQ1;

    ADC10CTL1 = INCH_7 + SHS1 + CONSEQ1;

    请尝试相应地更改您的 ISR。

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

    我刚才找到了一种不同的解决方案来解决我的问题:

    当我分配新通道时、我的代码覆盖了整个寄存器:

    ADC10CTL1 = INCH_7;

    相反、我必须重置通道并仅设置存储通道的位:

    ADC10CTL1 &=~INCH_15;

    ADC10CTL1 |= INCH_7;

    我也尝试过您的建议、但仍然会遇到相同的错误。