8042|29

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

有人用过icl7135这个芯片么? [复制链接]

#include"reg51.h"
#include"absacc.h"
#define ad_run   XBYTE[0x7fff]
#define ad_read  XBYTE[0xbfff]
#define uchar unsigned char
uchar ad[5];
uchar A;
uchar i;
bit error;
main()
{
   IT0=1;            // interrupt edge trigger
   IE=0x82;          //interrupt 0 enable
   ad_run=0x20;        //ad start
   }

void   ad_result() interrupt 0
{
  uchar i;
  A=ad_read;

  if(A&0x80==0x80)
  {
    i=0x04;
    if(A&0x04==0x04)
    error=1;                   //过量程处理
    else if(A&0x01==0x01)
    error=1;                   //欠量程处理
    else if((A&0x04!=0x04)|(A&0x01!=0x01))
    ad=A;
    i--;
   }
  else
  {
    if((i>0|i==0)&i<0x04)
    {
     ad=A;
     i--;
    }
    else
    ad_run=0x00;
  }
}
这是我编的程序,目的是实现将ad转换的结果存到数组ad中,可是ad转换不进行,我用示波器看了,给clk in 脚的驱动方波约125khz,幅值约为5伏,V+电压约5伏,V-电压越-5V,设置断点,运行ad_run=0x20;        //ad start之后,ad启动信号约5V,电阻电容都按照datasheet所给电路进行连接,而且硬件没有坏!ad转换怎么不进行呢?我用strobe接中断零,可就是中断始终不产生!换了两个7135都不好使,唉!郁闷ing,望高人指点迷津!

最新回复

上面是好用的程序  详情 回复 发表于 2007-4-27 09:09
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
main()
{
   IT0=1;            // interrupt edge trigger
   IE=0x82;          //interrupt 0 enable
   ad_run=0x20;        //ad start

    while (1);      //在这里加一句,让单片机停在这,不再向下执行,这样试试
}


会不会是你的程序执行完了?过短的时候又从头开始了?
另外一个,没看到你的ADC的配置,呵呵
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
还是不行!ADC配置是什么?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼上的,我加你qq!我把电路图发给你看看,帮我分析一下!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
我的qq174717183
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
7135是4位半双斜率A/D转换器,转换时间在几十到几百毫秒。
它用B1-B4输出一个BCD数字,用D1-D5指示当前输出的数字是哪一位(个/十/百/千/万).
D1-D5每200个CLK会轮流变化。
每当一次转换完成,在一个数字输出后100个CLK, 会给出一个nSTROBE,且每次转换,
每个数字只会STROBE一次。

如果和51连接,且不用其它的元件,在nSTROBE中断收到后,B1-B4,D1-D5,POL,
OVERRANGE,UNDERRANGE都应当读取,12个信号。
需要根据D1-D5的值确定B1-B4所代表的是哪一位。

可以不控制RUN/HOLD, 让它始终RUN是没有问题的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
不知道你的电路是怎么接的,不过只读8-bit好像不够确定一个数字。

且你定义了一个全局的 i, 又定义了一个局部的 i, 不知道有没有问题。
lbing7 已经说过,你的 main()不是循环,也不知改了没有。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

8
 
我已经把程序修改了,i设为了全局变量,ad启动之后,用电压表量busy保持在0-0.24V(好像昨天还是0到5伏之间变化),strobe 一直保持5V,int out脚(四脚在0到0.5V之间变化),buf out脚(6脚在0到1.8V之间变化),不知道是不时硬件坏了 !
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

9
 
#include"reg51.h"
#include"absacc.h"
#define ad_run   XBYTE[0x7fff]
#define ad_read  XBYTE[0xbfff]
#define uchar unsigned char
uchar ad[5];
uchar A;
uchar i;
bit overrun;
bit underrun;
main()
{
   IT0=1;            // interrupt edge trigger
   IE=0x81;          //interrupt 0 enable
   ad_run=0x20;        //ad start
   }

void   ad_result() interrupt 0
{
   A=ad_read;

  if(A&0x80==0x80)
  {
    i=0x04;
    if(A&0x04==0x04)
    overrun=1;                   //过量程处理
    else if(A&0x01==0x01)
    underrun=1;                   //欠量程处理
    else
    ad=A;
    i--;
   }
  else
  {
    if((i>0|i==0)&i<0x04)
    {
     ad=A;
     i--;
    }
    else
    ad_run=0x00;
  }
最后把程序改成这个样子了,还是不行!换了一种方法做还是不行,估计硬件不对!
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

10
 
郁闷!
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

11
 
if((i>0|i==0)&i<0x04)...
i是无符号的,上述的(i>0|i==0)一定得到TRUE. 怀疑你本来想要的是
if ((i>0||i==0)&i<0x04)...

我觉得
  if(A&0x80==0x80)
  {
    ...
  }
这一段有问题,每个nSTROBE脉冲来到时,POL/UNDERRANGE/OVERRANGE
这些信号是不会变的,else永走不到。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
你的main()仍不含有不终止的循环,它运行起来会怎样呢?它走完
   ad_run=0x20;        //ad start
这一行后,会执行一个子程序返回 - 从stack弹出地址,装入PC,这个值应是0,
因为Keil的初始化代码会把内部RAM全清0,于是它回到复位地址从头执行。


=============================
用电压表量busy保持在0-0.24V(好像昨天还是0到5伏之间变化,
-----------
busy脉冲宽度由输入电压决定,输入小则宽度小,最小为1个CLK.

strobe 一直保持5V ---- nSTROBE每次转换只给5个脉冲,且每个脉冲只CLK周期的一半,
用电压表应该测不到。

---- 你的7135应是好的。

=============================
你的中断可能已经被触发了,只是你的处理可能不对。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 

/* 看我的吧 */
#include"reg51.h"
#include"absacc.h"
#define ad_run   XBYTE[0x7fff]
#define ad_read  XBYTE[0xbfff]
#define uchar unsigned char
uchar ad[5];
uchar A;
uchar i;
bit overrun;
bit underrun;
bit data_ready;   /* 增加一个标志 */
main()
{
   IT0=1;            // interrupt edge trigger
   IE=0x81;          //interrupt 0 enable
   ad_run=0x20;        //ad start
   i = 4;          /* "i" 做全局变量的名字,实在是很不好 */

   while (1)
   {
       if (data_ready)
       {
          /* 处理采样的数据 */
           data_ready = 0;
           ad_run = 0x20;   /* 假定需要重复测量, 再次启动转换 */
       }
   }

}

void   ad_result() interrupt 0
{
    ad_run = 0;  /* 如果需要暂停它,在哪一个nSTROBE脉冲给出控制信号并无分别*/
                  /* 每个脉冲都重复给出给出同样的控制信号也没有问题 */
    A=ad_read;

    overrun = underrun = 0;   /* 先清0 */

    if(A&0x04==0x04)
    overrun=1;                   //过量程处理
    else if(A&0x01==0x01)
    underrun=1;                   //欠量程处理

    ad=A;  /* 我不知道 B1-B4 占 A 中的哪4个bit */
    i--;
    if (0 == i)
    {
        data_ready = 1;
        i = 4;
    }
}
 
 
 

回复

77

帖子

0

TA的资源

宇宙尘埃

14
 
我检查了一下电路,然后重新启动a/d,然后再量芯片各端电压,得出结果如下:在取参考电压为1.00V,Vinhi为2.00V,Vinlo为1.00v,参考电容两端电压1.00v,int out(4脚)电压为-0.34V-0V,Buff out(6脚)端电压为0-1.67幅,D0-D4为1.20V,V+,V- 分别为+6V和-6V,ST(26脚)为6V ,接地端为0V,Busy在2.8V到6.5V之间跳跃!clk in(22脚)为3.31V。顺便问一下电压表是测的瞬时值还是有效值?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
仿真器的电源和地是6.75v,唉!仿真器又不好用了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
从你的描述看,7135是好的。

这种情况是不太适合使用仿真器的,它和7135难于同步。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

17
 
用电压表测那些管脚的电压没有什么意义的。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

18
 
那用什么?老师说不调出来不给加工呢!那现在怎么办?这个不可以在线仿真啊!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

19
 
我最后把程序改成这个样子了,可是昨天产生了中断,只是不知道结果对不对,可是今天连中断都不产生!唉,郁闷。
#include
#include
#define ad_run   XBYTE[0x7fff]
#define ad_read  XBYTE[0xbfff]
#define uchar unsigned char
uchar bbb[5]=0;
uchar aaa;
uchar i;
bit overrun;
bit underrun;
bit data_ready;   /* 增加一个标志 */
main()
{
   IT0=1;            // interrupt edge trigger
   IE=0x81;          //interrupt 0 enable
   i = 5;            /* "i" 做全局变量的名字,实在是很不好 */
   ad_run=0x20;        //ad start
   while(1)
   {
      if (data_ready)
      {
       /* 处理采样的数据 */
       data_ready = 0;
       ad_run = 0x20;   /* 假定需要重复测量, 再次启动转换 */
       }
   }
}


void   ad_result() interrupt 0
{
    ad_run = 0;  /* 如果需要暂停它,在哪一个nSTROBE脉冲给出控制信号并无分别*/
                  /* 每个脉冲都重复给出给出同样的控制信号也没有问题 */
    aaa=ad_read;

    overrun = underrun = 0;   /* 先清0 */

    if(aaa&0x04==0x04)
    overrun=1;                   //过量程处理
    else if(aaa&0x01==0x01)
    underrun=1;                   //欠量程处理

    bbb=aaa;  /* 我不知道 B1-B4 占 A 中的哪4个bit */
    i--;
    if (i==0)
    {
        data_ready = 1;
        i = 5;
     }
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

20
 
老师说不调出来不给加工呢!
==========================
还要加工?做PCB么? 你的程序原来就这么长啊? 我还以为只是片段呢。

-----------------------------
数据采了之后,要么在LED或LCD上显示,要么送到串口给主机,哪能这样就不管了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表