小弟写了一个小程序用来实现温度采集。但是出了问题;
在SD16一直工作时温度是正常的,但是在SD16断续工作时,
温度会从小慢慢升到正常值(断点加在Point 1),或者从大的值慢慢降回正常值(Point 2),
我想用在一个大的系统中,不能让SD16一直开着。所以请高手帮忙。
代码如下:
#include "WCG12864/12864.h"
//#include "Low_Power_Delay/Time.h" //中断式只在MAIN函数中加入就OK了。
#define CON_cishu 16
unsigned char CON_TIME=CON_cishu;
unsigned long AdMem[2]; //转换结果缓冲区
/****************************************************************************
初始化
Fandy
SD16转换控制寄存器
SD16_LP: 0~1,Low power mode 0-Off; 1-On;
SD16_DIV: 0~3,SD16_A clock divider 0-1分频; 1-2分频; 2-4分频; 3-8分频;
SD16_SSEL: 0~3,SD16_A clock source select 0-MCLK; 1-SMCLK; 2-ACLK; 3-External TACLK;
VMID_ON: 0~1,VMID buffer on 0-Off; 1-On;
REF_ON: 0~1,Reference generator on 0-Off; 1-On;
SD16OV_IE: 0~1,SD16_A overflow interrupt 0-Off; 1-On;
****************************************************************************/
void SD16A_Init(unsigned char SD16_LP, unsigned char SD16_DIV,
unsigned char SD16_SSEL,unsigned char VMID_ON,
unsigned char REF_ON, unsigned char SD16OV_IE)
{
unsigned int ADC_LP,ADC_DIV,ADC_SSEL,ADC_VMID_ON,ADC_REF_ON,ADC_OV_IE;
ADC_LP =SD16_LP<<8;
ADC_DIV =SD16_DIV<<6;
ADC_SSEL =SD16_SSEL<<4;
ADC_VMID_ON =VMID_ON<<3;
ADC_REF_ON =REF_ON<<2;
ADC_OV_IE =SD16OV_IE<<1;
SD16CTL |= ADC_LP +ADC_DIV +ADC_SSEL +ADC_VMID_ON +ADC_REF_ON +ADC_OV_IE;
}
/****************************************************************************
SD16各个通道控制寄存器:输入控制寄存器SD16INCTL_x和各个通道转换控制寄存器SD16CCTL_x
Fandy
SD16INCTL_x:
Channel 转换通道: 0-转换通道0; 1-转换通道1; 2-转换通道2; 3-转换通道3;
SD16INT_DLY 中断延时:0-第四次采样引发中断; 1-第三次; 2-第二次; 3-第一次;
SD16_GAIN 输入增益:0-X1; 1-X2; 2-X4; 3-X8; 4-X16; 5-X32; 6、7-Reserved;
SD16_IN_CH 输入通道:0-Ax.0; 1-Ax.1;2-Ax.2;3-Ax.3;4-Ax.4;5-××CC;6-TEMP;7-
SD16CCTL_x:
SD16_SNGL 转换次数:0-多次; 1-单次;
SD16_OSR 过采样率: 0-256; 1-128; 2-64; 3-32;
SD16_IE 中断控制:0-不引发中断;1-引发中断;
SD16_GRP 组 队 :0-Off; 1-On;
****************************************************************************/
void SD16A_SetTongDao(unsigned char Channel, unsigned char SD16INT_DLY,
unsigned char SD16_GAIN,unsigned char SD16_IN_CH,
unsigned char SD16_SNGL,unsigned char SD16_OSR,
unsigned char SD16_IE, unsigned char SD16_GRP)
{
char *In_Ctl = SD16INCTL;
unsigned int *Con_Ctl = SD16CCTL;
unsigned char ADCINT_DLY,ADC_GAIN;
unsigned int ADC_SNGL, ADC_OSR, ADC_IE;
/*SD16INCTL_x*/
ADCINT_DLY = SD16INT_DLY<<6;
ADC_GAIN = SD16_GAIN<<3;
/*SD16CCTL_x*/
ADC_SNGL = SD16_SNGL<<10;
ADC_OSR = SD16_OSR<<8;
ADC_IE = SD16_IE<<3;
In_Ctl += Channel; //SD16INCTL为 8位寄存器
Con_Ctl += Channel; // SD16CCTL为16位寄存器
*In_Ctl = ADCINT_DLY+ADC_GAIN+SD16_IN_CH;
*Con_Ctl = ADC_SNGL+ADC_OSR+ADC_IE+SD16_GRP;
}
/****************************************************************************
软件引发转换开始
****************************************************************************/
void SD16A_Go()
{
AdMem[0] =0;
AdMem[1] =0; Point 2
SD16CCTL1 |= SD16SC; // 开始转换
LPM0; Point 1
}
/****************************************************************************
设置转换成员和转换方式
****************************************************************************/
void SD16A_Set_Member()
{
SD16A_SetTongDao(0,0,0,5,0,0,0,1);
SD16A_SetTongDao(1,0,0,6,0,0,1,0);
}
/*****************************************************************************
AD转换器中断函数
******************************************************************************/
#pragma vector=SD16A_VECTOR
__interrupt void SD16A()
{
if(SD16IV==6)
{
AdMem[0] += SD16MEM0;
AdMem[1] += SD16MEM1;
CON_TIME--;
if(CON_TIME==0)
{
AdMem[0]>>=4;
AdMem[1]>>=4;
LPM0_EXIT;
SD16CCTL1 &= ~SD16SC; //转换结束
CON_TIME=CON_cishu;
}
}
}
void AD_RECEIVE(unsigned int *TEMP,unsigned int *V_POWER)
{
SD16A_Go();
*TEMP=AdMem[1];
*V_POWER=AdMem[0];
*TEMP=((unsigned long)*TEMP * 9090)/65536 - 7270;
*V_POWER>>=3;
*V_POWER=(int)(*V_POWER*125);
*V_POWER>>=7;
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
volatile unsigned int i;
FLL_CTL0 |= XCAP18PF; // Set load capacitance
FLL_CTL1 &= ~XT2OFF; // Turn on XT2
do
{
IFG1 &= ~OFIFG; // Clear oscillator fault flag
for (i = 50000; i; i--); // Delay
}
while (IFG1 & OFIFG); // Test osc fault flag
FLL_CTL1 = SELS+SELM_XT2; // Select SMCLK source as XT2
CLK,MCLK source as DCO
FLL_CTL2|= XT2S_2;
Init_LCD();
SD16A_Init(1,0,2,0,1,0); //必须在DAC之后,不然无法工作。
for (i = 50000; i; i--); // Delay for 1.2V ref startup
SD16A_Set_Member();
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
/*------------------------------------------------------------------------------
作:Fandy
温度测试,电源电压测试。
------------------------------------------------------------------------------*/
void Display_TEMP(unsigned int DIS_DA,unsigned int DIS_VOL)
{
unsigned char i;
i=DIS_DA/100+'0'; LCD_Printf( 9,1,0,1,&i);
DIS_DA=DIS_DA%100;
i=DIS_DA/10+'0'; LCD_Printf(10,1,0,1,&i);
i=DIS_DA%10+'0'; LCD_Printf(12,1,0,1,&i);
i=DIS_VOL/100+'0'; LCD_Printf( 9,2,0,1,&i);
DIS_VOL=DIS_VOL%100;
i=DIS_VOL/10+'0'; LCD_Printf(11,2,0,1,&i);
i=DIS_VOL%10+'0'; LCD_Printf(12,2,0,1,&i);
}
void Temp_Init(void)
{
static unsigned int TEMP,V_POWER;
LCD_Printf(11,1,0,4,". 'C");
LCD_Printf(10,2,0,5,". V");
while(1)
{
AD_RECEIVE(&TEMP,&V_POWER);
Display_TEMP(TEMP,V_POWER);
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys();
Temp_Init();
}
说明一下
char *In_Ctl = SD16INCTL;
unsigned int *Con_Ctl = SD16CCTL;
我将头文件加了一点东西:
#define SD16INCTL_ (0x00B0)
#define SD16INCTL ((char*) SD16INCTL_)
#define SD16CCTL_ (0x0102)
#define SD16CCTL ((unsigned int*) SD16CCTL_)
MSP430F4794
MSP430F4794 有人用过么? 有中文资料么?