孤独将一 发表于 2013-7-5 17:55:03

急求助,在线等,PCF8591的问题

本帖最后由 孤独将一 于 2013-7-5 18:05 编辑

1://TWI通用操作
#defineWait()                        while(!(TWCR & _BV(TWINT)))
#defineSTART()                {TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);Wait();}
#defineSTOP()                        {TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);}
#defineWriteByte(x)        {TWDR =(x);TWCR = _BV(TWINT) | _BV(TWEN);Wait();}
#defineACK()                        (TWCR |= _BV(TWEA))
#define       NACK()                        (TWCR &= ~_BV(TWEA))
#defineTWI()                        {TWCR = _BV(TWINT) | _BV(TWEN) ;Wait();}
#defineTWI1()                        {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR |= _BV(TWEA);_delay_us(1);Wait();}
#defineTWI2()                        {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR &= ~_BV(TWEA);_delay_us(1);Wait();}


extern unsigned char DA_pcf8591(unsigned char);                          //DA转换
extern unsigned int AD_pcf8591(unsigned char );                                //AD转换unsigned int AD_pcf8591(unsigned char channel)
{
        unsigned int AD_value;               
        init_twi_pcf8591();
        START();                                        if(TW_STATUS != TW_START)                return 1;
        WriteByte(0x94);                        if(TW_STATUS !=TW_MT_SLA_ACK)        return 2;
        WriteByte(channel & 0x03);                        if(TW_STATUS != TW_MT_DATA_ACK)        return 3;
       
        START()                                                if(TW_STATUS != TW_REP_START)        return 4;
        WriteByte(0x95);                        if(TW_STATUS != TW_MR_SLA_ACK)        return 5;


        //======这里的53是因为接的参考电压实测4.771V,255/4.771大致是53,如果是5V,改为除以255/5=51.
        TWI1();                                                if( (TW_STATUS != TW_MR_DATA_ACK) ) return 7;       
        AD_value = TWDR * 100.0 /53.45;
        STOP();
        return AD_value;       
}======================================================
1:如代码所示,我随便选择一个通道测电压,能测,还挺准,但是给这个通道测电断开的时候,就单片机死机了,为何啊啊。。。。。。。。。。。。
2: 我测量GND的时候也是死机

machao 发表于 2013-7-6 00:25:27

刚毕业的学生?现在着急啦,手头有任务。没办法,等“高手”帮你吧。
这几天LZ连发3个帖子,“高手”忽然都不见啦。
不过好像与AVR本身也无关,为什么要发到这里?

millwood0 发表于 2013-7-6 00:34:36

但是给这个通道测电断开的时候,就单片机死机了

What does that mean?

You probably want to figure out where the code hung. I suspect that it has a lot to do with this:#defineWait()                        while(!(TWCR & _BV(TWINT)))and wherever Wait() is used.

millwood0 发表于 2013-7-6 00:36:20

Just to help you a little bit, here is what I use for the same device:
unsigned char pcf8591_read(unsigned char ch) {
        unsigned char tmp;
        i2c_start();                                                        //send the i2c start condition
        i2c_write(_pcf8591_addr | I2C_CMD_WRITE);        //write
        i2c_write(ch);                                                        //send the control byte
        i2c_restart();                                                        //send the restart condition
        i2c_write(_pcf8591_addr | I2C_CMD_READ);
        tmp=i2c_read(I2C_NOACK);
        i2c_stop();                                                                //send the stop condition
        return tmp;
}
You obviously will have to supply those i2c routines for your target chip.

machao 发表于 2013-7-6 00:56:10

楼上的,省省力气吧。

就从2天前,LZ连c语言的~和!都还分不清楚,还要发帖问(查一下手上的C语言教科书就能知道的问题)分析,这段代码非常可能是LZ从那里搬的一段。如果他连基本的I2C通信规程都不了解,能明白你给他的参考吗?

你要帮忙,就帮到底:联系他,帮他把项目做掉,让他把一个月的薪水给你。

孤独将一 发表于 2013-7-7 15:28:55

本帖最后由 孤独将一 于 2013-7-8 09:57 编辑

machao 发表于 2013-7-6 00:56 static/image/common/back.gif
楼上的,省省力气吧。

就从2天前,LZ连c语言的~和!都还分不清楚,还要发帖问(查一下手上的C语言教科书就 ...

好吧,都是我写的,代码都是我敲的,不是搬运工,有datasheet。我才上班半年,硬件搞,软件搞,被骂很正常,习惯了,起码我问了,我知道答案就行。
谢谢回答的。
不要把我的经理掺和进来。
还有,我就不信你们写程序的时候不会被一个基本的小问题卡住,卡在那也许停1天时间。
之前PCF8591的程序我写出来过,这次不知道为什么哪不对了

孤独将一 发表于 2013-7-9 22:03:03

IIC总线速率问题,已经解决,150kh以下z的IIC速率没问题,原先400khz
页: [1]
查看完整版本: 急求助,在线等,PCF8591的问题