本帖最后由 zhaohualiang 于 2011-10-10 10:56 编辑
新手刚开始学习avr,现在用atmega64做了一个检测力值的东西,利用AD7705做模数转换。
之前用51的单片机没问题,现在的电路照搬的之前电路(测试过电路没问题),程序用原来的修改的,但是一直没有调好,DRDY一直没有低电平。
下面是修改后的程序。请前辈们帮小弟看看,指点一下。
#include <avr/io.h>
#define AD7705_DATE(x) if(x==0){PORTE&=~_BV(PE3);}else{PORTE|=_BV(PE3);}
#define AD7705_SCLK(x) if(x==0){PORTE&=~_BV(PE2);}else{PORTE|=_BV(PE2);}
//****************************************************************************
//功能: DIN端口连续写40个周期的高电平,保证复位
//参数:
//返回:无
//备注:无
//****************************************************************************
void AD7705_Reset(void)
{
uchar i;
AD7705_SCLK(1);
DDRE|=_BV(PE3);//DATA输出
AD7705_DATE(1);
for(i=0;i<40;i++)
{
AD7705_SCLK(0);
asm("nop");asm("nop");
AD7705_DATE(1);
asm("nop");asm("nop");
AD7705_SCLK(1);
asm("nop");asm("nop");
}
}
//****************************************************************************
//功能:往AD7705写1个字节数据
//参数:要写入AD7705的数据
//返回:无
//备注:无
//****************************************************************************
void AD7705_WriteByte(uchar d)
{
uchar i;
AD7705_SCLK(1);
asm("nop");asm("nop");
for(i=0;i<8;i++)
{
AD7705_SCLK(0);
if(d&0x80)
{
DDRE|=_BV(PE3);//DATA输出
AD7705_DATE(1);
}
else
{
DDRE|=_BV(PE3);//DATA输出
AD7705_DATE(0);
}
asm("nop");asm("nop");
AD7705_SCLK(1);
asm("nop");asm("nop");
d<<=1;
}
AD7705_SCLK(1);
AD7705_DATE(1);
}
//****************************************************************************
//功能:从AD7705读一个字
//****************************************************************************
uint AD7705_Read(void)
{
uchar i,temp;
uint d=0xff;
AD7705_WriteByte(0x38);
for(i=0;i<16;i++) // 读16位数据,高位在前
{
d<<=1;
AD7705_SCLK(0);
asm("nop");asm("nop");
DDRE&=~_BV(PE3);//DATA输入
PORTE&=~_BV(PE3);//弱上拉
temp=PINE&0X08;
if(temp)
{
d++; }
AD7705_SCLK(1);
asm("nop");asm("nop");
}
AD7705_SCLK(1);
DDRE|=_BV(PE3);//DATA输出
AD7705_DATE(1);
return d;
}
//****************************************************************************
//功能:AD7705初始化
//****************************************************************************
void AD7705_Init(void)
{
AD7705_Reset(); // 复位,防止接口迷失
AD7705_WriteByte(0x20);//通讯寄存器
AD7705_WriteByte(0x04); //时钟寄存器50HZ 04
AD7705_WriteByte(0x10);//通讯寄存器
AD7705_WriteByte(0x46);//设置寄存器46
}
/*******************************************************************************************/
//力值检测
/*******************************************************************************************/
long int strength(void)
{
long int Update_AD;
Update_AD=AD7705_Read();
void AD7705_Init(void);//初始化AD7705
return Update_AD;
}
/*******************************************************************************************/
//主函数
/*******************************************************************************************/
void main(void)
{
DDRE|=_BV(PE2);//SCLK为输出
DDRE&=~_BV(PE6);//DRDY引脚为输入
PORTE|=_BV(PE6);
void AD7705_Init(void);
while(1)
{
temp=PINE;
temp=temp&0X40;
if(temp==0)
{
Display=strength();
LCM(Display);
}
}
}
} }} |