打印
[技术问题解答]

定时器和AD问题

[复制链接]
787|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小帅哥哥|  楼主 | 2015-7-24 20:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小帅哥哥 于 2015-7-26 10:21 编辑

我用定时器输出比较,做了一个5s的延时。想让AD延迟5秒转换,5秒的时候,我关闭了定时器,可是AD转换不了啊,我把定时器打开,AD转换又能用了  这是为什么啊
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define ATD_CLOCK 2000000
#define BUS_CLOCK 8000000
#define OSC_CLOCK 16000000
#define baud 9600

#define led1 PORTAB_PB0
#define led2 PORTB_PB1
#define led1_dir DDRAB
#define led2_dir DDRB
#define on 0

unsigned int num = 0;
unsigned char  AD0_DATA,AD1_DATA;


void gpio_init(void)
{
        PORTB = 0XFF;
        led1_dir = 0xff;
        led2_dir = 0xff;
}

void ECT_INIT(void)
{
        TIOS_IOS0 = 1;        //定时器0用作输出比较
        TSCR1_TEN = 1;        //定时器使能
        TSCR1_TFFCA = 1;        //快速清除标志位
        TCTL2 = 0X00;        //定时器与输出引脚断开
        TIE = 1;        //开定时器0中断
     T标志寄存器1 = 0XFF;
        T标志寄存器2 = 0XFF;        //清除中断标志
        TSCR2 = 0X03;


}


void SCI_INIT(void)
{
        SCI0BD = BUS_CLOCK/16/baud;
        SCI0CR1 = 0X00;
        SCI0CR2 = 0X08;        //串口使能,发送使能
}


void AD_INIT(void)
{
        ATD0CTL1_SRES = 0 ;        //8位精度选择
        ATD0CTL2 = 0X42;        //启动AD 快速清除,转换完成中断
        ATD0CTL3 = 0X90;        //每次转换两个通道,右对齐模式
        ATD0CTL4 = BUS_CLOCK / ATD_CLOCK / 2 - 1;        //AD时钟频率2M
}

void AD_START(void)
{
    ATD0CTL5 = 0X30;          //转换AD00和AD01   单次转换 转换完成,产生中断
}

void sci_send(void)
{
    while(!SCI0SR1_TC);
        SCI0DRL = AD0_DATA;
}



#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt void ECT_interrupt(void)
{
        num++;
        TC0 = TCNT + 1000;        //周期1ms
}


interrupt void AD_interrupt(void)
{
        AD0_DATA = ATD0DR0L;                  //"L"表示第八位,,不表示左右对其  “H”表示高八位,
        AD1_DATA = ATD0DR1L;
        sci_send();
}

#pragma CODE_SEG DEFAULT

void main(void) {
  /* put your own code here */
        SCI_INIT();
        ECT_INIT();
        AD_INIT();                                                                                                                                                                     
        gpio_init();
       
        EnableInterrupts;


  for(;;) {
  if(num ==5000)
  {
        TSCR1_TEN = 0;        //延时五秒,关闭定时器
    AD_START();                //开始AD采集
    led1 = on;
        led2 = on;
  }
  
        
//   _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

相关帖子

沙发
quray1985| | 2015-7-25 16:25 | 只看该作者
你用的是定时器中断采集吧,看看你的ad初始化那里是如何设置的

使用特权

评论回复
板凳
ccw1986| | 2015-7-25 17:05 | 只看该作者
把代码贴出来看看?

使用特权

评论回复
地板
仙女山| | 2015-7-26 09:56 | 只看该作者
楼主现在问题解决了吗

使用特权

评论回复
5
小帅哥哥|  楼主 | 2015-7-26 10:13 | 只看该作者
仙女山 发表于 2015-7-26 09:56
楼主现在问题解决了吗

没有解决

使用特权

评论回复
6
小帅哥哥|  楼主 | 2015-7-26 10:23 | 只看该作者
quray1985 发表于 2015-7-25 16:25
你用的是定时器中断采集吧,看看你的ad初始化那里是如何设置的

代码贴出来了 你帮我看看
就是在for(;;)循环里,我关掉了定时器,下面的AD转换就不行 ,打开定时器就是可以的

使用特权

评论回复
7
小帅哥哥|  楼主 | 2015-7-26 10:23 | 只看该作者
ccw1986 发表于 2015-7-25 17:05
把代码贴出来看看?

代码贴出来了 你帮我看看
就是在for(;;)循环里,我关掉了定时器,下面的AD转换就不行 ,打开定时器就可以

使用特权

评论回复
8
FSL_TICS_ZJJ| | 2015-7-27 09:30 | 只看该作者
小帅哥哥 发表于 2015-7-26 10:23
代码贴出来了 你帮我看看
就是在for(;;)循环里,我关掉了定时器,下面的AD转换就不行 ,打开定时器 ...

如果你关闭定时器,那么你下面的灯能点亮吗?
还是ADC启动单次转换就没有转换?
你这边的ADC转换应该是软件触发的吧?
如果不加定时器,直接单次转换是否能够转换?

使用特权

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

本版积分规则

22

主题

71

帖子

0

粉丝