|
各位大侠,帮小弟看看这个问题:
我想用430做数据采集,双通道数据采集,每个通道采集64个点之后,通过IO口来发送,现在是ADC这块都有问题。采样频率为20KHz以上,使用TIMERA.OUT1为触发源。
问题是:我单步运行运行到ADCTL0 |= ADC12SC;这条语句是,就不能再单步运行了,我整体运行程序,会产生ADCMEM0和ADCMEM1中有数据,缓冲区result1和result2只有result[0]result1[0]中有数据,其他为0。
这到底怎么回事啊,我的程序有问题吗?谢谢大家我的程序如下:
/名字:ADC12_DATA
//实现功能:使用MSP430内部的ADC模块,并且通过IO口将数据送到DSP的SDRAM
//时间:2009、5、1
#include <MSP430x14x.h>
#define Num_result 64
#define ADCOK 0x01 //ADC转换结束标志
#define Sample_fre 200
void init(void); //系统初始化
void ADC_init (void); //初始化ADC12
void timer_A_init(void); //初始化TIMERA
void clk_init (void); //初始化时钟
//全局变量
unsigned char gbit;
int results1[Num_result] = {0};
int results2[Num_result] = {0};
unsigned char results1_buff[Num_result] = {0}; //缓冲区1
unsigned char results2_buff[Num_result] = {0}; //缓冲区2
//****************************************************************************
//主程序
void main(void)
{
init();
for (;;)
{
LPM0;
ADC12CTL0 |= ADC12SC; //sampling open,AD转换完成后(ADC12BUSY=0),ADC12SC自动复位;
while((gbit & ADCOK) == ADCOK )
{
gbit &= ~ADCOK; //清转换完成标志
}
}
}
//****************************************************************************
//系统初始化
void init(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P1OUT |= BIT0;
P1DIR |= BIT0;
clk_init(); //初始化时钟
timer_A_init(); //初始化TIMERA
ADC_init(); //初始化ADC
// hpi_init(); //初始化HPI
gbit=0x00;
_EINT();
}
//****************************************************************************
//时钟初始化
void clk_init(void)
{
unsigned int i;
BCSCTL1 = 0x00; //将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0x00; //将寄存器的内容清零
BCSCTL2 += SELM_2; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK
BCSCTL2 += DIVS_1; //分频因子为1
}
//****************************************************************************
//初始化定时器A
void timer_A_init(void)
{
// TACTL = TASSEL1 + TACLR; //选择SMCLK,分频因子为1
//CCTL0 = CCIE; //CCR0允许中断
TACTL = TASSEL_1 + MC_1; //增计数模式
TACCTL1 |= OUTMOD_2; //PWM置位/复位
TACCR0 = 1666;
TACCR1 = 833; //时间间隔为20KHz
}
//****************************************************************************
//初始化ADC
void ADC_init(void)
{
//ADC12设置**************************
P6SEL |= 0x03; //使用A/D通道 A0,A1
ADC12CTL0 = ADC12ON+MSC+SHT0_2 ; //开ADC12内核,设SHT0=2 (N=4)
ADC12CTL1 = SHP+CONSEQ_1+SHS_1 ; //SAMPCON信号选为采样定时器输出,序列单次,Timer_A.OUT1采样时钟源
//ADC12内部参考电压设置
ADC12CTL0 |= REF2_5V; //选用内部参考电压为2.5V
ADC12CTL0 |= REFON; //内部参考电压打开
ADC12MCTL0 |= SREF_1+INCH_0; //R+=2.5V R-=VSS,A6输入
ADC12MCTL1 |= SREF_1+INCH_1+EOS; //R+=2.5V R-=VSS,A7输入,结束位
ADC12IE =0x0002; //使能中断ADC12IFG A1
ADC12CTL0 |= ENC;
}
//****************************************************************************
//ADC中断程序
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
int i;
static unsigned int index = 0;
_NOP();
results1[index] = ADC12MEM0; //转移数据
results2[index] = ADC12MEM1;
index = index+1;
P1OUT ^= BIT0;
if (index == Num_result)
{
ADC12CTL0 &= ~ENC; //停止ADC工作
index = 0;
_NOP();
for(i = 0 ;i<Num_result;i++)
{
results1_buff[i] = results1[i];
results2_buff[i] = results2[i];
}
ADC12CTL0 |= ENC + ADC12SC; //开启转换
gbit |= ADCOK;
LPM3; //进入低功耗模式3,次处可设置断点
}
}
|
|