工具/软件:Code Composer Studio
大家好,
我正在编写一个程序,其中MSP430大部分时间都在LPM3上,并且它每隔4秒就会通过WDT中断被WDT唤醒。
从WDT的ISR转到LMP0,然后必须读取模拟输入,然后再次转到LMP3。 当我使用具有VCC的ADC作为参考时,该程序正在工作,配置如下:
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE;// ADC10ON,中断已启用
ADC10CTL1 = inch_7;//输入A7
ADC10AE0 |= 0x80;// PA.ADC 1.7 选项选择
然后在无限时:
ADC10CTL0 |= ENC + ADC10SC;//开始采样和转换
__bis_sr_register (CPUOFF + GIE);// LPM0,ADC10_ISR将强制退出
ADC_Result = ADC10MEM;
我的问题是,现在我想使用ADC,但在内部Vref=2.5V的情况下,它不工作(看起来WDT不工作,它不再唤醒系统)。 使用WDT作为计时器来唤醒系统与使用内部电压发生器作为ADC内部参考是否存在不相容性?
BES
下面是我正在尝试的代码:
#include <MSP4S.h>
#define clock 4. //wake up interval in seconds-1
int wake up sec=clock; //初始唤醒时钟。
内部主菜单(void)
{
BCSCTL1|= DIVA_0; // ACLK/1
BCSCTL3 |= XCAP_3; //12.5pF CAP- 3.2768万Hz晶振
WDTCTL的设置= WDT_ADLY_1000; // WDT 1S/4间隔计时器
IE1 |= WTIE; //启用WDT中断
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + Ref2_5V+ ADC10ON + ADC10IE;// ADC10ON,Vref在2.5V时打开,启用中断
__enable_interrupt (); //启用中断。
TCCR0 = 30; //延迟以允许Ref结算
TACTL0 |= CCIE; //比较模式中断。
TACTL = Tassel_2 | MC_1; // TALCK = SMCLK,向上模式。
LPM0; //等待延迟。
TACTL0 &=~CCIE; //禁用计时器中断
__disable_interrupit();
ADC10CTL1 = inch_7; //输入A7
ADC10AE0 |= 0x80; // pa.adc 1.7 选项选择
P1DIR = 0xFB; //除WFP 1.2 输入
P1OUT = 0外的所有P1.x输出; //所有P1.x重置
P1REN = 1; //所有P1.x电阻器拉出U/D启用
P2DIR = 0xF7; //除WFP 2.3 (日信号)之外的所有P2.x输出,因为输入
P2OUT = 0; //所有P2.x重置
P2REN = 1; //所有P2.x电阻器拉取U/D启用
P1IE=0; //所有P1端口中断在
(1)
{
如果(P2IN=0x08) //如果日信号打开
{
//不执行任何操作
}
否则
{
//读取ADC
ADC10CTL0 |= ENC + ADC10SC; //开始采样和转换
__bis_sr_register (CPUOFF + GIE); // LPM0,ADC10_ISR将强制退出
如果(ADC10MEM < 0x88)//
P1OUT =~0x01;//清除WFP 1.0 LED熄灭
否则
P1OUT |= 0x01;//将WFP 1.0 LED设置为打开
}
__bis_sr_register(LPM3_bits + GIE); //输入LPM3
}
}
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=WDT_vector
__interrupt void watchdog timer (void){
静态int c=0;
如果(c<wake Up秒)
{
C++;
}
否则
{
__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);//从0 (SR)清除LPM3位
C=0;
}
}//
ADC10中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_ICC__)
#pragma vector=ADC10_vector
__interrupt void ADC10_ISR(void)
{__BIC_SR_register_on_exit(CPUOFF);
//从0(SR)
}清除CPUOFF位