3477|4

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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;  
}

最新回复

ADC转换结束后才置 ADC 中断标志位,不需要while(AD0INT==0); //等待转换结束   详情 回复 发表于 2010-3-20 16:25
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主好像使用的是silabs的东西 上官网下载例子看看吧,安装目录也有例子  
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
LZ你算一下你ISR里的时间

看着这么多的程序,这个花销可观
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
没用过这个
不过可能是AD输出速率没设置好,好多ADC速率都是可以调的

另外AD0INT是ADC的中断标志位?
如果是的话,在中断里就不能while(AD0INT==0);
有了while(AD0INT==0);你得到的AD速率就减半了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
ADC转换结束后才置 ADC 中断标志位,不需要while(AD0INT==0); //等待转换结束
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表