智能车制作

标题: xs128ad [打印本页]

作者: 李宁407177725    时间: 2013-8-9 20:49
标题: xs128ad
跪求大神。帮我看一下这个程序为什么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 */
}


作者: 刘小涛    时间: 2013-8-9 21:14
你的循环条件只能满足一次啊,一次之后while就不能执行了
作者: 李宁407177725    时间: 2013-8-9 21:21
刘小涛 发表于 2013-8-9 21:14
你的循环条件只能满足一次啊,一次之后while就不能执行了

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

作者: 穆旦阿斗    时间: 2013-8-9 21:57
当发生以下情况时,标志位CCFn被清零:
① ATDCTL5寄存器写操作(启动新的转换序列);
② AFFC=0时,CCFn位写1操作;
③ AFFC=1且CMPEn=0时,读取结果寄存器ATDDRn;
④ AFFC=1且CMPEn=1时,写入结果寄存器ATDDRn。

请看第二条,你的ATD0CTL2=0X40;就把AFFC置1了,所以你的清除标志是无效的
作者: 李宁407177725    时间: 2013-8-9 22:18
穆旦阿斗 发表于 2013-8-9 21:57
当发生以下情况时,标志位CCFn被清零:
① ATDCTL5寄存器写操作(启动新的转换序列);
② AFFC=0时,CCF ...

但是如果我把写1的那个注销。程序运行的时候在读结果寄存器的时候为什么没有立即清零呢?
作者: 穆旦阿斗    时间: 2013-8-11 10:22
李宁407177725 发表于 2013-8-9 22:18
但是如果我把写1的那个注销。程序运行的时候在读结果寄存器的时候为什么没有立即清零呢?

我的意思是你清除标志是不对,根本不能清除通道标志位,自然就只能有一次转换了
作者: 李宁407177725    时间: 2013-8-11 11:11
穆旦阿斗 发表于 2013-8-11 10:22
我的意思是你清除标志是不对,根本不能清除通道标志位,自然就只能有一次转换了

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

作者: 穆旦阿斗    时间: 2013-8-11 14:13
李宁407177725 发表于 2013-8-11 11:11
那麻烦问一下。这个程序应该怎么改才可以连续的转换

你把你清除标志的那一位的那句话改为“ATD0CTL5=0X20;”应该就可以了,主要是你原来清除的方法不对呀!
作者: 穆旦阿斗    时间: 2013-8-11 16:20
穆旦阿斗 发表于 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只要访问结果寄存器就会清除的





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2