急求助,在线等,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的时候也是死机
刚毕业的学生?现在着急啦,手头有任务。没办法,等“高手”帮你吧。
这几天LZ连发3个帖子,“高手”忽然都不见啦。
不过好像与AVR本身也无关,为什么要发到这里? 但是给这个通道测电断开的时候,就单片机死机了
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.
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.
楼上的,省省力气吧。
就从2天前,LZ连c语言的~和!都还分不清楚,还要发帖问(查一下手上的C语言教科书就能知道的问题)分析,这段代码非常可能是LZ从那里搬的一段。如果他连基本的I2C通信规程都不了解,能明白你给他的参考吗?
你要帮忙,就帮到底:联系他,帮他把项目做掉,让他把一个月的薪水给你。 本帖最后由 孤独将一 于 2013-7-8 09:57 编辑
machao 发表于 2013-7-6 00:56 static/image/common/back.gif
楼上的,省省力气吧。
就从2天前,LZ连c语言的~和!都还分不清楚,还要发帖问(查一下手上的C语言教科书就 ...
好吧,都是我写的,代码都是我敲的,不是搬运工,有datasheet。我才上班半年,硬件搞,软件搞,被骂很正常,习惯了,起码我问了,我知道答案就行。
谢谢回答的。
不要把我的经理掺和进来。
还有,我就不信你们写程序的时候不会被一个基本的小问题卡住,卡在那也许停1天时间。
之前PCF8591的程序我写出来过,这次不知道为什么哪不对了 IIC总线速率问题,已经解决,150kh以下z的IIC速率没问题,原先400khz
页:
[1]