急!!PCF8591 AD转换的问题,DA正常,但是AD读的数据一直都是0x80

qqtuming   2009-12-22 16:16 楼主
不知道是怎么回事,请大家帮帮小妹。谢谢了!
不会是芯片的问题吧,DA是正常的。
主控芯片是AVR的单片机,我用IIC协议读取AD转换的结果。

回复评论 (6)

引用: 引用 2 楼 lijuan1215_2009 的回复:
我用示波器看了,前面的地址,控制字发的都是对的,就是到读TWDR的时候,四个通道出来的全是0x80


首先确保硬件没有任何问题,比如I2C总线一定需要上拉;
另外用示波器 或者万用表测试下,AD的入门电压,从而对AD转换的结果有个预知,便看下程序,知道是AD转换出了问题,还是AD转换后,其它的处理程序有问题、
点赞  2009-12-22 17:03
我用示波器看了,前面的地址,控制字发的都是对的,就是到读TWDR的时候,四个通道出来的全是0x80
点赞  2009-12-22 16:32
引用: 引用 2 楼 lijuan1215_2009 的回复:
我用示波器看了,前面的地址,控制字发的都是对的,就是到读TWDR的时候,四个通道出来的全是0x80

采集出来的就是0X80???这要看你的采集程序了
点赞  2009-12-22 17:25
给我例子 你参考一下
void DELAY5()
{
;
}
//******************************
void PCF8591_START()          //PCF8591 起始信号
{
PCF8591_DATA=1;
PCF8591_CLK=1;
while(PCF8591_CLK==0)
   {;}
DELAY5();
PCF8591_DATA=0;
DELAY5();
PCF8591_CLK=0;
}
//**********************************
void PCF8591_STOP()          //pcf8591停止信号
{

PCF8591_DATA=0;
PCF8591_CLK=1;
while(SCL==0)
  {;}
  DELAY5();
PCF8591_DATA=1;
DELAY5();
PCF8591_CLK=0;
DELAY5();
}
//****************************
void cack()
{F0=0;
PCF8591_DATA=1;
PCF8591_CLK=1;
DELAY5();
  if(PCF8591_DATA==0)
  { PCF8591_CLK=0; DELAY5(); }
else
  {F0=1;PCF8591_CLK=0;DELAY5();}

}
/*
void mack() //应答子程序
{ PCF8591_DATA=0;PCF8591_CLK=1;DELAY5();PCF8591_CLK=0;PCF8591_DATA=1;
}
void mnack()//非应答子程序
{ PCF8591_DATA=1;PCF8591_CLK=1;DELAY5();PCF8591_CLK=0;PCF8591_DATA=0;
}
*/
void wrbyt0()        //写入0这个1BIT的数据
{PCF8591_DATA=0;
PCF8591_CLK=1;
DELAY5();
PCF8591_CLK=0;
}
void wrbyt1()        //写入1这个1BIT的数据
{PCF8591_DATA=1;
PCF8591_CLK=1;
DELAY5();
PCF8591_CLK=0;
PCF8591_DATA=0;
}
//***************************
void DATA_WRITE(unsigned  j)   //写入8BIT数据.
{unsigned i=0;
  for(i=0;i<8;i++)
  {if((j&0x80)>0)
    wrbyt1();
   else
    wrbyt0();
   j<<=1;
  }  
}
//************************************
unsigned  DATA_READ()
{unsigned  j=0xff;
unsigned  i=0;
for(i=0;i<8;i++)
  {PCF8591_DATA=1;PCF8591_CLK=1;
   if(PCF8591_DATA==0)
     {j<<=1;j=(j&0xfe);PCF8591_CLK=0;}
    else
     {j<<=1;j=(j|0x01);PCF8591_CLK=0;}      
  }
return(j);
}

//************************************
unsigned  READ_AD(void)
{unsigned j=0, k=0;

//duad1:
//do
      {  PCF8591_START() ;
             DATA_WRITE(0x90);   //ad寻址字
         cack();
      }
//while (F0==1);
//{
        PCF8591_START() ;
         DATA_WRITE(0x91);   //写器件地址和读命令
         cack();
      
       j=DATA_READ();        //读出AD转换后的数据
      PCF8591_STOP();
      return(0xa0);
//}
}
点赞  2009-12-23 09:00
单步调试  看读出来的AD结果是什么?看看是不是 IIC那的问题,如果出来的就是0X80 就要看采集那的程序了
点赞  2009-12-22 16:29
采集程序?AD是8591做的啊,我只是用协议读它寄存器的值。采集程序不用写的啊
点赞  2009-12-22 17:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复