|
AD转换软件写入方式怎么有延迟,谁能帮我看看到底错在哪里
[复制链接]
没有错误,AD转换是500Hz,转换出来才200Hz左右,错在哪里啊,感觉是while(AD0INT==0);
浪费时间了,高手来帮帮忙
//-----------------------------------------------------------------------------
void PORTb_Init (void)
{
// XBR0 = 0x01; // 使能 UART P0.4(TX) and P0.5(RX)
XBR1 = 0x40; // 使能交叉开关和弱上拉
P2MDIN=0x1F; // P2.1配置为模拟输入
P1MDIN=0x5F;
P2SKIP = 0xE0;
P1SKIP = 0xA0;
// P0MDOUT= 0x10; // enable TX0 as a push-pull output
}
//-----------------------------------------------------------------------------
// ADC0配置,T3定时启动ADC
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
ADC0CN = 0x45; // ADC0 T3定时采样
REF0CN = 0x0A; // 启用内部基准源
AMX0P=0x07; // 选择采样输入源P2.1作为正输入
AMX0N=0x1F; //选择采样输入源GND作为负输入ADC工作在单端方式
ADC0CF = 0x08;
EIE1 |= 0x08; // 启用 ADC 中断
}
//-----------------------------------------------------------------------------
// Timer3配置,T3定时启动ADC
//-----------------------------------------------------------------------------
void Timer3_Init (void)
{
CKCON |= 0x00;
TMR3RL = 0xF830;//当定时器时钟为系统时钟12M时采样频率为80Hz时计数值为CF2C
TMR3 = 0xffff;
// EIE1 &= ~0x80; //禁止定时器3中断
TMR3CN = 0x04; //定时器3允许
}
//-----------------------------------------------------------------------------
//延时程序
//-----------------------------------------------------------------------------
void delay(int i)
{
int j;
for(j=0;j
}
void ADC0_ISR (void) interrupt 10
{
ADC0CN &= ~0x20; // 清 ADC 中断标志位
if(key==1)
{ //AMX0P=0x0F;
if(aa<20)
{
ADC0H=0;
ADC0L=0;
AMX0P=0x07;
AD0BUSY=1;
while(AD0INT==0); //等待转换结束
AD0INT=0;
outbuff[2*aa+1]=ADC0L;
outbuff[2*aa+2]=ADC0H;
aa++;
ADC0H=0;
ADC0L=0;
AMX0P=0x0F;
AD0BUSY=1;
while(AD0INT==0); //等待转换结束
AD0INT=0;
// while (AD0BUSY);
// while(AD0INT==0)
// {;}
outbuff[2*aa+1]=ADC0L;
outbuff[2*aa+2]=ADC0H;
aa++;
// AMX0P=0x0E;
ADC0H=0;
ADC0L=0;
AD0BUSY=1;
while(AD0INT==0); //等待转换结束
AD0INT=0;
// while (AD0BUSY);
// while(AD0INT==0)
// {;}
outbuff[2*aa+1]=ADC0L;
outbuff[2*aa+2]=ADC0H;
aa++;
AMX0P=0x0D;
ADC0H=0;
ADC0L=0;
AD0BUSY=1;
while(AD0INT==0); //等待转换结束
AD0INT=0;
// while (AD0BUSY);
// while(AD0INT==0)
// {;}
outbuff[2*aa+1]=ADC0L;
outbuff[2*aa+2]=ADC0H;
aa++;
AMX0P=0x05;
ADC0H=0;
ADC0L=0;
AD0BUSY=1;
while(AD0INT==0); //等待转换结束
AD0INT=0;
// while (AD0BUSY);
// while(AD0INT==0)
// {;}
outbuff[2*aa+1]=ADC0L;
outbuff[2*aa+2]=ADC0H;
aa++;
AMX0P=0x07;
//ADC0CN=0x45;
}
if(aa==20)
{
Block_Write(outbuff, 41);
outbuff[0]=0x20;
aa=0;}
}
else
{
outbuff[0]=0x20;
outbuff[1]=0xFF;
outbuff[2]=0xFF;
Block_Write(outbuff, 3);
}
// ADC0CN = 0x05;
}
|
|