智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2467|回复: 8
打印 上一主题 下一主题

[软件类] xs128ad

[复制链接]

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
163
威望
83
贡献
46
兑换币
54
注册时间
2013-6-22
在线时间
17 小时
跳转到指定楼层
1#
发表于 2013-8-9 20:49:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
跪求大神。帮我看一下这个程序为什么xs128中的ad只能转换一次。第二次就不可以了#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
void ad_init()
{ ATD0DIEN=0X00;
  ATD0CTL1=0X00;
  ATD0CTL2=0X40;
  ATD0CTL3=0X88;
  ATD0CTL4=0X03;
  ATD0CTL5=0X20;
  
}

void main(void) {
  /* put your own code here */
   int jieguo;
   ad_init();
   DDRB=0XFF;

        EnableInterrupts;              

for(;;) {
  
  while(!ATD0STAT2_CCF0);
  ATD0STAT2=1;
  jieguo=ATD0DR0L;
  PORTB=ATD0DR0L;
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

20

主题

259

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5644
威望
2695
贡献
1597
兑换币
1729
注册时间
2013-1-5
在线时间
677 小时
2#
发表于 2013-8-9 21:14:58 | 只看该作者
你的循环条件只能满足一次啊,一次之后while就不能执行了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
163
威望
83
贡献
46
兑换币
54
注册时间
2013-6-22
在线时间
17 小时
3#
 楼主| 发表于 2013-8-9 21:21:21 | 只看该作者
刘小涛 发表于 2013-8-9 21:14
你的循环条件只能满足一次啊,一次之后while就不能执行了

这个不是用的快速清除啊,我在对ATD0STAT2写1.不是就将ccf0清除了吗?不是写1清零
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
4#
发表于 2013-8-9 21:57:37 | 只看该作者
当发生以下情况时,标志位CCFn被清零:
① ATDCTL5寄存器写操作(启动新的转换序列);
② AFFC=0时,CCFn位写1操作;
③ AFFC=1且CMPEn=0时,读取结果寄存器ATDDRn;
④ AFFC=1且CMPEn=1时,写入结果寄存器ATDDRn。

请看第二条,你的ATD0CTL2=0X40;就把AFFC置1了,所以你的清除标志是无效的
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
163
威望
83
贡献
46
兑换币
54
注册时间
2013-6-22
在线时间
17 小时
5#
 楼主| 发表于 2013-8-9 22:18:56 | 只看该作者
穆旦阿斗 发表于 2013-8-9 21:57
当发生以下情况时,标志位CCFn被清零:
① ATDCTL5寄存器写操作(启动新的转换序列);
② AFFC=0时,CCF ...

但是如果我把写1的那个注销。程序运行的时候在读结果寄存器的时候为什么没有立即清零呢?
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
6#
发表于 2013-8-11 10:22:03 | 只看该作者
李宁407177725 发表于 2013-8-9 22:18
但是如果我把写1的那个注销。程序运行的时候在读结果寄存器的时候为什么没有立即清零呢?

我的意思是你清除标志是不对,根本不能清除通道标志位,自然就只能有一次转换了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
163
威望
83
贡献
46
兑换币
54
注册时间
2013-6-22
在线时间
17 小时
7#
 楼主| 发表于 2013-8-11 11:11:55 | 只看该作者
穆旦阿斗 发表于 2013-8-11 10:22
我的意思是你清除标志是不对,根本不能清除通道标志位,自然就只能有一次转换了

那麻烦问一下。这个程序应该怎么改才可以连续的转换
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
8#
发表于 2013-8-11 14:13:21 | 只看该作者
李宁407177725 发表于 2013-8-11 11:11
那麻烦问一下。这个程序应该怎么改才可以连续的转换

你把你清除标志的那一位的那句话改为“ATD0CTL5=0X20;”应该就可以了,主要是你原来清除的方法不对呀!
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
9#
发表于 2013-8-11 16:20:08 | 只看该作者
穆旦阿斗 发表于 2013-8-11 14:13
你把你清除标志的那一位的那句话改为“ATD0CTL5=0X20;”应该就可以了,主要是你原来清除的方法不对呀!

void AD_init (void)
{   
    ATD0CTL1 = 0x40;   //00为转换精度  无外部触发  40=12位  20=10位 00=8位
    ATD0CTL2 = 0x40;   //禁止外部触发, 中断禁止
    ATD0CTL3 = 0x90;   //右对齐无符号,2序列转换, No FIFO, Freeze模式下继续转
    ATD0CTL4 = 0x02;////采样时间为4个 ATDCloc==[BusClock*0.5]/[PRS+1]==40k
    ATD0CTL5 = 0x30;   //多通道10/30---单次/连续转换序列  0通道开始
    ATD0DIEN = 0x00;   //禁止数字信号输入
}

这是我的AD连续转换的,你的我没有仔细看,开始以为是清除标志的问题,但从我回复的那个图(4楼)来看,你AFFC==1&&CMPEn==0只要访问结果寄存器就会清除的
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 13:15 , Processed in 0.057463 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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