打印

数字电位器AD5254使用问题

[复制链接]
3791|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 tianyazhix 于 2013-4-18 11:58 编辑

最近在使用AD5254数字电位器,数据一直写不进去,下面是程序的代码

#include"1.h"

#define nop()                 asm("nop")
#define Nop()                 asm("nop")                                        //空操作
#define ClrWdt()         asm("clrwdt")                                //喂狗

#define         SCL                 RA4
#define         SDA                 RC0
#define         SCLIO                 TRISA4
#define         SDAIO                 TRISC0
#define                Delay5us()        {nop();nop();nop();nop();nop();}

#define                ERITE_RDAC0                0x00                                //AD5254写入内容
#define                ERITE_RDAC1                0x01
#define                ERITE_RDAC2                0x02
#define                ERITE_RDAC3                0x03

void port_init(void)
{
        OSCCON=0x73;        //IRCF2-0:101=2M 110=4M  111=8M  SCS=1 由内部时钟作为震荡器
        LCDREF=0x0e;
        T0CS=0;
        CM1CON0=0X00;        //关闭比较寄存器
        CM2CON0=0X00;        //关闭比较寄存器        
        WDTCON=0x12;        //1024分平  2*10/2*5=2*5=32ms
        PSA=0;                        //将欲分频 分配给定时器0
        SWDTEN=0;                //启动WDT        ???
        
        TRISA=0x00;
        PORTA=0x00;
        
        TRISB=0x40;
        PORTB=0x38;
        
        TRISC=0x00;
        PORTC=0x00;
        
        TRISD=0x1f;
        PORTD=0xe0;
        
        TRISE=0xff;
        PORTE=0x00;
        
        TRISF=0xff;
        PORTF=0x00;
        
        TRISG=0xfe;
        PORTG=0x00;        
}
/**************************************
延时函数
**************************************/
void delay()
{
        int i;
        for(i=0;i<10000;i++);
}

void start()
{
        SDA=1;
        nop();
        SCL=1;
        nop();nop();nop();nop();nop();
        SDA=0;
        nop();nop();nop();nop();nop();
        SCL=0;
        nop();nop();  
}

void stop()
{
        SDA=0;
        nop();
        SCL=1;
        nop();nop();nop();nop();nop();
        SDA=1;
        nop();nop();nop();nop();nop();
}

void init()
{  
        SDA=1;
        delay();
        SCL=1;
        delay();
}

void send_ack(unsigned char ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}

/**************************************
接收应答信号
**************************************/
unsigned char recv_ack()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CARRY = SDA;                //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CARRY;
}

unsigned char sendbyte(unsigned char write_data)//写一字节
{
        unsigned char i;
        
        for(i=0;i<8;i++)
        {
                 if(write_data&0x80)        SDA=1;
                  else                                SDA=0;
                nop();
                SCL=1;
                nop();nop();nop();nop();nop();
                SCL=0;
                nop();
                write_data<<=1;
          }
                recv_ack();                //代码不可以取消
}

unsigned char recbyte()  //读一字节
{      
        unsigned char i,read_data;
        SDAIO=1;
        SCL=0;
        delay();
        SDA=1;
        delay();
        for(i=0;i<8;i++)
        {        
                 nop();nop();nop();
                 SCL=1;
                 nop();nop();
                 read_data=(read_data<<1)|SDA;
                 nop();
                 SCL=0;
        }
        SDAIO=0;             //sda转换为输出
//以下三条语句可以取消,不影响功能
        SDA=1;                                       
        SCL=1;
        SCL=0;
        return(read_data);
}

void write_byte(unsigned char addr,unsigned char instruction,unsigned char dat)//向字节内写入数据
{
        start();
        sendbyte(addr);
        sendbyte(instruction);
        SDAIO=0;                     //写数据前SDA为输出状态
        sendbyte(dat);
        stop();
        delay();
}

void main(void)
{
        port_init();                //IC初始化
        init();
        write_byte(0x58,ERITE_RDAC0,200);
        write_byte(0x58,ERITE_RDAC1,200);
        write_byte(0x58,ERITE_RDAC2,200);
        write_byte(0x58,ERITE_RDAC3,200);
        
        while(1)
        {
        }
}

AD5254.jpg (66.44 KB )

部分电路图

部分电路图
沙发
ocon| | 2013-4-22 01:03 | 只看该作者
既然能写出格式正确的代码,调个数字电位器肯定没什么难度,建议楼主先说一下自己的判断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

56

帖子

0

粉丝