打印
[AVR单片机]

AD转换下载到芯片后就工作不正常了。

[复制链接]
3174|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsb.siq|  楼主 | 2010-3-16 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hsb.siq 于 2010-3-17 22:03 编辑

仿真AD正常工作,下载到芯片后不撤电源也能正常工作,可是重上电后,AD就不正常了,有的始终显示一个数,有的会随AD端口的电压变化而变化,但数值相差甚远。芯片其他组件都能正常用工作,不知哪出错了。
芯片是M169,用JTAG线下载。


又发现一个现象:程序不优化时AD工作正常,优化后AD就不行了。

相关帖子

沙发
xiaomifan| | 2010-3-16 21:58 | 只看该作者
用了几个AD吗?

使用特权

评论回复
板凳
god_like| | 2010-3-16 21:59 | 只看该作者
可能是AD的硬件没有设计好吧

使用特权

评论回复
地板
午夜粪车| | 2010-3-16 22:01 | 只看该作者
AD不好弄啊

使用特权

评论回复
5
lpydidi| | 2010-3-16 22:19 | 只看该作者
用的什么AD芯片?

使用特权

评论回复
6
love_life| | 2010-3-16 22:22 | 只看该作者
仿真跟实际调试的相差挺远的

使用特权

评论回复
7
hsb.siq|  楼主 | 2010-3-17 01:35 | 只看该作者
用了4个AD0-3,用片内的AD,直接测基准脚电压和AD脚电压都跟仿真一样,
仿真都没问题,下载后运行就不行了,芯片的其他IO口,EEPROM,都没问题,就AD有问题。

使用特权

评论回复
8
hsb.siq|  楼主 | 2010-3-17 02:02 | 只看该作者
不知会不会下载的时候那里设置不好

使用特权

评论回复
9
liao_fangxing| | 2010-3-17 11:55 | 只看该作者
本帖最后由 liao_fangxing 于 2010-3-17 12:01 编辑

“……下载到芯片后不撤电源也能正常工作,可是重上电后,AD就不正常了,…………”
LZ测试下 下载==>掉电==>放电(放完)==>上电  看看情况怎么样?


PS:我曾经遇到过类似的问题 也是上电后有些程序跑的不正常。结果是因为复位电路有些问题,而且我软件里对没用的中断没处理(汇编)…………

使用特权

评论回复
10
peigang| | 2010-3-17 12:34 | 只看该作者
每次上电时重新初始化一次,试试。

使用特权

评论回复
11
hsb.siq|  楼主 | 2010-3-17 15:52 | 只看该作者
芯片MEGA169,电源基准为外接LM385-1.25,测量端口电压没问题。

使用特权

评论回复
12
宇航3000| | 2010-3-18 08:38 | 只看该作者
我的AD有一个怪问题:就是只有按一次复位键才转换一次或重新上电一次就得到一个新的数值,否则就不动.....不知道为什么?

使用特权

评论回复
13
hsb.siq|  楼主 | 2010-3-18 21:02 | 只看该作者
楼上会不会没有清AD转换完的标志。
呵呵,我的问题自己还没解决。

使用特权

评论回复
14
SHSLZHZ| | 2010-3-19 10:05 | 只看该作者
1# hsb.siq
照你的说法,掉下电是你的JTAG仿真口把芯片的RST拉低了,导致不运行.
你不在仿真时拔掉仿真器,上一下点看结果就明白了!!!!

使用特权

评论回复
15
SHSLZHZ| | 2010-3-19 10:07 | 只看该作者
13# 宇航3000
那就是你再次启动AD的ADC未置1引起的!

使用特权

评论回复
16
hsb.siq|  楼主 | 2010-3-20 00:00 | 只看该作者
本帖最后由 hsb.siq 于 2010-3-20 02:36 编辑

芯片是运行的,其它IO口、LCD显示都行,只是AD不对。

发现一个现象:0V时是个随机数,输出值刚好等于这个随机数+输入端口的AD值。
内部外部电压基准都度过。就不行,难道芯片的问题?

使用特权

评论回复
17
hsb.siq|  楼主 | 2010-3-21 14:53 | 只看该作者
问题找到了:AD转换后return ADC没有&0x3ff;还有我用积分形式滤波算法,初始化时参数都没有附初值0;
不过还是不明白:为什么要赋初始值?
  unsigned int temp=0;           //中间量
  unsigned int TSenTotl=0;         //总和
  unsigned int TSArr[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
        。
      。
      。


    ADMUX&= ~(1 <<MUX0);     //Ñ¡ADµÄ0ͨµÀ
    ADMUX&= ~(1 <<MUX1);
    temp=AD_GetData();         //¶ÁÈë´«¸ÐÆ÷ζÈÖµ   
    TSenTotl=TSenTotl+temp-TSArr[0];   //¼ÓÉÏ×îÐÂÒ»´Î£¬¼õÈ¥×îÇ°Ò»´Î
    temSen=TSenTotl>>4;     //除16
    data[3]=(unsigned char)(temSen/20);   //显示值
    if (data[3]>50)           //·Àֹζȳ¬50
   
    {
        data[3]=50;
    }
    for(unsigned char i=0;i<15;i++)
    {
        TSArr=TSArr[i+1];
    }
    TSArr[15]=temp;

使用特权

评论回复
18
笑苍天| | 2010-3-22 09:03 | 只看该作者
早把这段代码贴出来,大家就不用猜了。
而且这问题很明显:
TSenTotl=TSenTotl+temp-TSArr[0];
TSenTotl不赋初值怎么行呢,而且不赋初值引用编译器一般有警告的。

使用特权

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

本版积分规则

75

主题

232

帖子

2

粉丝