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.

[参考译文] msp430f5659:ADC ISR 例程不工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/602390/msp430f5659-adc-isr-routine-not-working

器件型号:MSP430F5659

您好!

我正在尝试在引脚 p6.2上连接 ADC。 我已初始化 ADC、但它不会转换模拟电压。 我在 p6.2上的最大电压为3.3。 我有4MHz smclk。 它不会进入 ISR。 请帮助我找到问题。

我的代码是:

void adc_configure()

   P6SEL |= BIT2;                            //选择 bit0作为模拟输入引脚
   ADC12CTL0 &=~ ADC12ENC;
    REFCTL0 &=~REFMSTR;                     //重置 REFMSTR 以将控制权交给
                                              // ADC12_A 参考控制寄存器
   ADC12CTL0 |= ADC12ON + ADC12SHT0_12 + ADC12MSC + ADC12REFON + ADC12REF2_5V;   //至 ADC10、基准打开、1024个 ADC12CLK 周期
   ADC12CTL1 |= ADC12DIV_7 + ADC12SSEL_3;   // ADC12SC 采样保持源、stright 二进制格式、/8时钟分频器、clk SOURCE = SMCLK、单通道信号转换、无操作被激活
   ADC12CTL2 |= ADC12RES_1 + ADC12PDIV;         //ADC12_A 分辨率10位(11个时钟周期转换时间)、ADC12_A 预分频器/4
   ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_2;       //选择的 ref = VCC 和 VSS、选择的通道= A2
   ADC12IE |= ADC12IE0;                          // conv result-ADCMEMO 上的 ADC_IFG
   ADC12CTL0 |= ADC12ENC;                        //开始采样和转换、启用 ADC12
   _bis_SR_register (GIE);

#pragma vector= ADC12_vector
_interrupt void ADC12_ISR (void)

  while (!(ADC12IFG & BIT0));
   _BIC_SR_REGISTER_ON_EXIT (CPUOFF);

这在我的主函数中:

ADC12CTL0 |= ADC12SC + ADC12ENC;          //开始采样和转换,启用 ADC10

ADC12_value =(浮点) ADC12MEM0;
sprintf (字符串、"%3.2f"、ADC12_value);

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

    P6.2是通道 A2。 因此、您需要启用 ADC12IE2并读取 ADC12MEM2。 和检查(ADC12IFG 和 BIT2)。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也尝试过这种方法、但它不起作用。 我发现它没有进入中断服务例程。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include 
    
    volatile unsigned int 结果; //在本示例
    
    中需要为全局 int main (void)
    {
    WDTCTL = WDTPW+WDTHOLD; //停止看门狗计时器
    P6SEL = BIT2; //启用 A/D 通道输入
    REFCTL0 &=~REFMSTR; //将 REFMSTR 重置为将控制权移交给
    // ADC12_A 参考控制寄存器
    ADC12CTL0 = ADC12ON+ADC12SHT02+ADC12REFON+ADC12REF2_5V;
    ADC12CTL1 = ADC12SHP; //使用采样计时器
    ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_2;// VR+=Vref+和 VR-=AVss、通道= A2
    ADC12IE = BIT0; //启用 ADC12IFG.0
    ADC12CTL0 |= ADC12ENC; //启用转换
    
    while (1)
    {
    ADC12CTL0 |= ADC12SC;
    _bis_SR_register (LPM0_bits + GIE); //输入 LPM0、启用中断
    __no_operation(); //对于调试器
    }
    }
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector=ADC12_vector
    __interrupt void ADC12ISR (void)
    #elif defined (__GNU__)
    void __attribute__((interrupt (ADC12_vector)))) ADC12ISR (void
    
    编译器#error!
    #endif
    {
    switch (__evo_in_range (ADC12IV、34))
    {
    case 0:break; //向量0:无中断
    情况2:中断; //向量2:ADC 溢出
    情况4:中断; //向量4:ADC 时序溢出
    情况6: //向量6:ADC12IFG0
    结果= ADC12MEM0; //移动结果,IFG 被清除
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU,在此处设置断点
    中断;
    情形8:中断; //向量8:ADC12IFG1
    大小写10:break; //向量10:ADC12IFG2
    大小写12:break; //向量12:ADC12IFG3
    
    case 14:break; //向量14:ADC12IFG4
    情况16:中断; //向量16:ADC12IFG5
    情况18:中断; //向量18:ADC12IFG6
    案例20:中断; //向量20:ADC12IFG7
    case 22:break; //向量22:ADC12IFG8
    case 24:break; //向量24:ADC12IFG9
    大小写26:break; //向量26:ADC12IFG10
    case 28:break; //向量28:ADC12IFG11
    case 30:break; //向量30:ADC12IFG12
    大小写32:break; //向量32:ADC12IFG13
    case 34:break; //向量34:ADC12IFG14
    默认值:break;
    }
    }
    
    

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

    您是否已解决问题?

    此致、