搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2013-7-5 17:55:03 | 显示全部楼层 |阅读模式
本帖最后由 孤独将一 于 2013-7-5 18:05 编辑

1:
  1. //TWI通用操作
  2. #define  Wait()                        while(!(TWCR & _BV(TWINT)))
  3. #define  START()                {TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);Wait();}
  4. #define  STOP()                        {TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);}
  5. #define  WriteByte(x)        {TWDR =(x);TWCR = _BV(TWINT) | _BV(TWEN);Wait();}
  6. #define  ACK()                        (TWCR |= _BV(TWEA))
  7. #define         NACK()                        (TWCR &= ~_BV(TWEA))
  8. #define  TWI()                        {TWCR = _BV(TWINT) | _BV(TWEN) ;Wait();}
  9. #define  TWI1()                        {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR |= _BV(TWEA);_delay_us(1);Wait();}
  10. #define  TWI2()                        {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR &= ~_BV(TWEA);_delay_us(1);Wait();}


  11. extern unsigned char DA_pcf8591(unsigned char);                          //DA转换
  12. extern unsigned int AD_pcf8591(unsigned char );                                //AD转换
复制代码
  1. unsigned int AD_pcf8591(unsigned char channel)
  2. {
  3.         unsigned int AD_value;               
  4.         init_twi_pcf8591();
  5.         START();                                        if(TW_STATUS != TW_START)                return 1;
  6.         WriteByte(0x94);                        if(TW_STATUS !=TW_MT_SLA_ACK)        return 2;
  7.         WriteByte(channel & 0x03);                        if(TW_STATUS != TW_MT_DATA_ACK)        return 3;
  8.        
  9.         START()                                                if(TW_STATUS != TW_REP_START)        return 4;
  10.         WriteByte(0x95);                        if(TW_STATUS != TW_MR_SLA_ACK)        return 5;


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

出0入0汤圆

发表于 2013-7-6 00:25:27 | 显示全部楼层
刚毕业的学生?现在着急啦,手头有任务。没办法,等“高手”帮你吧。
这几天LZ连发3个帖子,“高手”忽然都不见啦。
不过好像与AVR本身也无关,为什么要发到这里?

出0入0汤圆

发表于 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:
  1. #define  Wait()                        while(!(TWCR & _BV(TWINT)))
复制代码
and wherever Wait() is used.

出0入0汤圆

发表于 2013-7-6 00:36:20 | 显示全部楼层
Just to help you a little bit, here is what I use for the same device:

  1. unsigned char pcf8591_read(unsigned char ch) {
  2.         unsigned char tmp;
  3.         i2c_start();                                                        //send the i2c start condition
  4.         i2c_write(_pcf8591_addr | I2C_CMD_WRITE);        //write
  5.         i2c_write(ch);                                                        //send the control byte
  6.         i2c_restart();                                                        //send the restart condition
  7.         i2c_write(_pcf8591_addr | I2C_CMD_READ);
  8.         tmp=i2c_read(I2C_NOACK);
  9.         i2c_stop();                                                                //send the stop condition
  10.         return tmp;
  11. }
复制代码
You obviously will have to supply those i2c routines for your target chip.

出0入0汤圆

发表于 2013-7-6 00:56:10 | 显示全部楼层
楼上的,省省力气吧。

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

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

出0入0汤圆

 楼主| 发表于 2013-7-7 15:28:55 | 显示全部楼层
本帖最后由 孤独将一 于 2013-7-8 09:57 编辑
machao 发表于 2013-7-6 00:56
楼上的,省省力气吧。

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


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

出0入0汤圆

 楼主| 发表于 2013-7-9 22:03:03 | 显示全部楼层
IIC总线速率问题,已经解决,150kh以下z的IIC速率没问题,原先400khz
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 11:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表