[技术问题解答] 定时器和AD问题

[复制链接]
1020|7
 楼主| 小帅哥哥 发表于 2015-7-24 20:22 | 显示全部楼层 |阅读模式
本帖最后由 小帅哥哥 于 2015-7-26 10:21 编辑

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

  3. #define ATD_CLOCK 2000000
  4. #define BUS_CLOCK 8000000
  5. #define OSC_CLOCK 16000000
  6. #define baud 9600

  7. #define led1 PORTAB_PB0
  8. #define led2 PORTB_PB1
  9. #define led1_dir DDRAB
  10. #define led2_dir DDRB
  11. #define on 0

  12. unsigned int num = 0;
  13. unsigned char  AD0_DATA,AD1_DATA;


  14. void gpio_init(void)
  15. {
  16.         PORTB = 0XFF;
  17.         led1_dir = 0xff;
  18.         led2_dir = 0xff;
  19. }

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


  30. }


  31. void SCI_INIT(void)
  32. {
  33.         SCI0BD = BUS_CLOCK/16/baud;
  34.         SCI0CR1 = 0X00;
  35.         SCI0CR2 = 0X08;        //串口使能,发送使能
  36. }


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

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

  48. void sci_send(void)
  49. {
  50.     while(!SCI0SR1_TC);
  51.         SCI0DRL = AD0_DATA;
  52. }



  53. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  54. interrupt void ECT_interrupt(void)
  55. {
  56.         num++;
  57.         TC0 = TCNT + 1000;        //周期1ms
  58. }


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

  65. #pragma CODE_SEG DEFAULT

  66. void main(void) {
  67.   /* put your own code here */
  68.         SCI_INIT();
  69.         ECT_INIT();
  70.         AD_INIT();                                                                                                                                                                     
  71.         gpio_init();
  72.        
  73.         EnableInterrupts;


  74.   for(;;) {
  75.   if(num ==5000)
  76.   {
  77.         TSCR1_TEN = 0;        //延时五秒,关闭定时器
  78.     AD_START();                //开始AD采集
  79.     led1 = on;
  80.         led2 = on;
  81.   }
  82.   
  83.         
  84. //   _FEED_COP(); /* feeds the dog */
  85.   } /* loop forever */
  86.   /* please make sure that you never leave main */
  87. }

quray1985 发表于 2015-7-25 16:25 | 显示全部楼层
你用的是定时器中断采集吧,看看你的ad初始化那里是如何设置的
ccw1986 发表于 2015-7-25 17:05 | 显示全部楼层
把代码贴出来看看?
仙女山 发表于 2015-7-26 09:56 | 显示全部楼层
楼主现在问题解决了吗
 楼主| 小帅哥哥 发表于 2015-7-26 10:13 | 显示全部楼层
仙女山 发表于 2015-7-26 09:56
楼主现在问题解决了吗

没有解决
 楼主| 小帅哥哥 发表于 2015-7-26 10:23 | 显示全部楼层
quray1985 发表于 2015-7-25 16:25
你用的是定时器中断采集吧,看看你的ad初始化那里是如何设置的

代码贴出来了 你帮我看看
就是在for(;;)循环里,我关掉了定时器,下面的AD转换就不行 ,打开定时器就是可以的
 楼主| 小帅哥哥 发表于 2015-7-26 10:23 | 显示全部楼层
ccw1986 发表于 2015-7-25 17:05
把代码贴出来看看?

代码贴出来了 你帮我看看
就是在for(;;)循环里,我关掉了定时器,下面的AD转换就不行 ,打开定时器就可以
FSL_TICS_ZJJ 发表于 2015-7-27 09:30 | 显示全部楼层
小帅哥哥 发表于 2015-7-26 10:23
代码贴出来了 你帮我看看
就是在for(;;)循环里,我关掉了定时器,下面的AD转换就不行 ,打开定时器 ...

如果你关闭定时器,那么你下面的灯能点亮吗?
还是ADC启动单次转换就没有转换?
你这边的ADC转换应该是软件触发的吧?
如果不加定时器,直接单次转换是否能够转换?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

71

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部