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.

[参考译文] MSP430F133:ADC和端口中断未按预期工作

Guru**** 2511415 points
Other Parts Discussed in Thread: MSP430F133

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/573137/msp430f133-adc-and-port-interrupts-not-working-as-expected

部件号:MSP430F133

您好,  

似乎我把头打在墙上,试图让一个简单的程序正常工作。  我开始使用简单的FET140_ADC12_01.C程序,并为连接到2.0 ,2.1 ,2.2 ,2.4 ,2.5 和2.6 的交换机添加了port2中断处理程序。

我正在使用的主板上有连接到{\f2 3.0 },{\f2 3.1 },{\f2 3.2 },{\f2 3.4 }的LED。

我希望ADC中断能以某种频率切换WFP 3.4。  (我不知道使用SHT0_2时ADC需要多长时间)。

当3.0 2.0 ,WFP 3.1 2.1 和2.2 通过键盘短接至地面时,我期待着WFP,WFP,WFP,WFP,3.2 之间的切换。  这在端口2 ISR中完成。

当节目开始时,我预计只有WFP 3.4 的刷新率会被转换为ADC,而WFP 3.0 ,3.1 和3.2 的刷新率会被取消。

意外地,当程序首次启动时,所有P3 GPIO都很高...  目前,WFP 3.4 不能以ADC的速率进行切换。

如果我将WFP 2.0 缩短到地面,我将获得多个WFP 3.0 ,WFP 3.1 和WFP 3.2 ,它们都从高到低。  有时,这会终止程序,但有时P2中断会继续触发,再按几次键。

任何想法都非常感谢…

- Dave


#include <MSP4S.h>

内部主(无效)

WDTCTL = WDTPW + WDTHOLD;//停止WDT
ADC12CTL0 = SHT0_2 + ADC12ON;//设置采样时间,打开ADC12
ADC12CTL1 = SHP;//使用采样计时器
P6SEL |= 0x01;// WFP 6.0 ADC选项选择

//诊断
P1DIR |= 0x01;// WFP 1.0 输出
P3DIR |= 0xff;// WFP 3.0 .. WFP 3.3 输出到LED
P3OUT = 0;//所有调试引脚均为低电平

P2DIR &=~0xff;// P2上的所有输入输入
P2IFG &=~0xff;//清除所有标志
P2IES |= 0x77;//设置从高到低的过渡
P2IE |=0x77;//启用中断WFP 2.0 ,1,2,4,5,6


(;;)

如果(P2IE和0x77)== 0) // int已触发并在ISR中清除启用,则重新启用

P2IFG &=~0xff;//清除int标志。
P2IE |= 0x77;//启用中断
}

如果(ADC12IE & 0x01)// int被触发并在ISR中清除,则重新启用

ADC12IFG &=~0xff;//清除所有标志
ADC12IE |= 0x01;//启用中断
ADC12CTL0 || ENC;//已启用转换
ADC12CTL0 |= ADC12SC;//开始采样
}

__bis_sr_register(CPUOFF + GIE);// LPM0,ADC12_ISR或端口2 int将强制退出
}
}


// ADC12中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=port2_vector
__interrupt void port2_isr (void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (port2_vector)) port2_isr (void)
#否则
错误编译器不受支持!
#endif

开关(P2IFG){//中断的原因是什么?
案例0x01://已触发了WFP 2.0
P3OUT ^= 0x01;//将WFP 3.2 LED设置为ON
中断;
案例0x02://已触发了WFP 2.1
P3OUT ^= 0x02;//将WFP 3.2 LED设置为ON
中断;
案例0x04://已触发了WFP 2.2
P3OUT ^= 0x04;//将WFP 3.2 LED设置为ON
中断;
默认值://尚未处理的任何其他中断原因?
;//然后不执行任何操作
}


P2IFG &=~0x77;//清除int标志
P2IE &=~0x77;//禁用中断
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除CPUOFF位
}


// ADC12中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=ADC12_vector
__interrupt void ADC12_ISR (void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (ADC12_vector))) ADC12_ISR (void)
#否则
错误编译器不受支持!
#endif

P3OUT ^=~0x08;//扳钮引脚


ADC12CTL0 &=~ENC;//转换已禁用
ADC12IFG &=~0xff;//清除所有标志
ADC12IE &=~0x01;//禁用中断
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除CPUOFF位
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在与硬件工程师交谈后,我了解到电路反转GPIO输出引脚的逻辑。 这说明了为什么所有LED在启动时都亮起,而不是熄灭。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dave,您好!

    由于您使用的是单通道,单转换模式(CONSEQx位),并且没有计时器采样保持源选择(SHSx位),因此每次ADC12SC位设置为1时,都将开始转换。 16个ADC12CLK周期的采样和保持时间(SHTx = 10b)将导致30个ADC12CLK周期的采样和转换时间(转换需要13个ADC12CLK周期,请参见图17-3&4),外加额外的中断服务时间并返回到main函数。 经常启用/禁用中断启用寄存器并不常见,我建议使用状态标志变量。 由于MSP430F133没有用于GPIO的内部上拉/下拉电阻器,因此所有开关都应从外部上拉,以避免意外触发ISR的浮动引脚。 如果没有适当的跳闸(通过硬件或软件),交换机可能会导致多个中断。 您很可能应该将代码分成ADC和GPIO功能,并且在尝试组合它们之前都能很好地工作。

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

    谢谢Ryan。  我就是这样做的。  为了简化操作,我删除了ADC代码,只需使port2中断处理工作即可。 它现在按预期工作。 下面是代码。


    #include <MSP4S.h>

    静态int ADC_COMPLETE;

    内部主(无效)

    易失性int i,j;
    WDTCTL = WDTPW + WDTHOLD;//停止WDT

    //诊断

    P3DIR |= 0x0F;// WFP 3.0 . WFP 3.3 输出到LED
    P3OUT || 0x0F;//所有调试引脚电压过高-电路反转!

    P2DIR &=~0x77;// P2上的所有输入输入
    P2IES = 0x77;//设置从高到低的过渡
    P2IFG = 0;//清除所有标志
    P2IE = 0x77;//启用中断WFP 2.0 ,1,2,4,5,6


    (;;)

    如果(P2IE == 0)//在ISR中触发且清除P2IE

    对于(i=1万;i>0;i--)//去毛刺延迟

    J=I;
    }

    P2IFG = 0;//清除int标志。
    P2IE = 0x77;//启用中断
    }

    __bis_sr_register(CPUOFF + GIE);// LPM0,ADC12_ISR或端口2 int将强制退出
    }
    }


    // port2中断服务例程
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=port2_vector
    __interrupt void port2_isr (void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (port2_vector)) port2_isr (void)
    #否则
    错误编译器不受支持!
    #endif

    P2IE = 0;//禁用中断

    开关(P2IFG){//中断的原因是什么?
    案例0x10://已触发了WFP 2.4
    案例0x01://已触发了WFP 2.0
    P3OUT ^= 0x01;//将WFP 3.2 LED设置为ON
    中断;
    案例0x20://已触发P25
    案例0x02://已触发了WFP 2.1
    P3OUT ^= 0x02;//将WFP 3.2 LED设置为ON
    中断;
    案例0x40://已触发了WFP 2.6
    案例0x04://已触发了WFP 2.2
    P3OUT ^= 0x04;//将WFP 3.2 LED设置为ON
    中断;
    默认值://尚未处理的任何其他中断原因?
    ;//然后不执行任何操作
    }

    __BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除CPUOFF位
    }